From 2b2e50916ca1b943ac86f4fced49dd9b9e20eb05 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 13 Oct 2023 15:25:41 +0200 Subject: [PATCH 01/38] dev: jf sync: stopping master gives idle (#824) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * jf sync mode master could return idle when stopped and so not all modules return the same value and must check for 'stopped or idle', Also must throw if any of the module gives an error * added contains_only to sls::Result (#827) * added variadic template for checking if a result contains only specified values * fix for gcc4.8 * renamed to Result::contains_only * updated condition in Detector.cpp * stop on only the positions --------- Co-authored-by: Erik Fröjdh --- slsDetectorSoftware/include/sls/Result.h | 20 ++++++++++++++++ slsDetectorSoftware/src/Detector.cpp | 28 +++++++++++++++-------- slsDetectorSoftware/tests/test-Result.cpp | 20 ++++++++++++++++ slsSupportLib/include/sls/TypeTraits.h | 10 ++++++++ 4 files changed, 68 insertions(+), 10 deletions(-) diff --git a/slsDetectorSoftware/include/sls/Result.h b/slsDetectorSoftware/include/sls/Result.h index 2578ad2ba..73e5fc332 100644 --- a/slsDetectorSoftware/include/sls/Result.h +++ b/slsDetectorSoftware/include/sls/Result.h @@ -16,6 +16,7 @@ #include #include "sls/ToString.h" +#include "sls/TypeTraits.h" #include "sls/container_utils.h" namespace sls { @@ -128,6 +129,25 @@ template > class Result { /** Test whether all elements of the result are equal */ bool equal() const noexcept { return allEqual(vec); } + /** Test whether any element of the result are equal to a value */ + bool any(const T &value) const noexcept { return anyEqualTo(vec, value); } + + template > + typename std::enable_if::value, bool>::type + contains_only(const V &a, const Args &...args) const noexcept { + auto values = {a, args...}; + for (const auto &element : vec) { + int found = 0; + for (const auto &value : values) { + if (value == element) + found++; + } + if (!found) + return false; + } + return true; + } + /** Convert Result to std::vector */ operator std::vector() { return vec; } }; diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 344bde73c..4124110d3 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -18,6 +18,7 @@ #include #include +#include #include namespace sls { @@ -873,18 +874,25 @@ void Detector::startDetectorReadout() { void Detector::stopDetector(Positions pos) { - // stop and check status X times int retries{0}; - // avoid default construction of runStatus::IDLE on squash - auto status = getDetectorStatus().squash(defs::runStatus::RUNNING); - while (status != defs::runStatus::IDLE && - status != defs::runStatus::STOPPED) { - if (status == defs::runStatus::ERROR) { - throw RuntimeError( - "Could not stop detector. Returned error status."); + auto status = getDetectorStatus(pos); + + // jf sync fix: status [stopped or idle] = [stopped] + // sync issue: (master idle sometimes, slaves stopped) + + // eiger fix: stop multiple times from multi client till all modules stopped + // issue: asynchronous start and stop scripts with a module being started + // (stop before) and waiting for the other to be done. So a module that was + // idle before stopping will return running (after async start script) when + // getting status after, which will then be stopped again. + + while (!status.contains_only(defs::runStatus::IDLE, defs::runStatus::STOPPED)){ + if (status.any(defs::runStatus::ERROR)) { + throw RuntimeError("Could not stop detector. At least one module " + "returned error status."); } pimpl->stopDetector(pos); - status = getDetectorStatus().squash(defs::runStatus::RUNNING); + status = getDetectorStatus(pos); ++retries; if (retries == 10) @@ -903,7 +911,7 @@ void Detector::stopDetector(Positions pos) { for (auto it : res) { maxVal = std::max(maxVal, it); } - setNextFrameNumber(maxVal + 1); + setNextFrameNumber(maxVal + 1, pos); } } break; default: diff --git a/slsDetectorSoftware/tests/test-Result.cpp b/slsDetectorSoftware/tests/test-Result.cpp index 6763a43d0..30a735f28 100644 --- a/slsDetectorSoftware/tests/test-Result.cpp +++ b/slsDetectorSoftware/tests/test-Result.cpp @@ -196,4 +196,24 @@ TEST_CASE("String conversions") { "[{one: 1}, {one: 1, three: 3, two: 2}, {one: 1}]"); } +TEST_CASE("Any element is equal"){ + Result r{1,2,3,4,5}; + REQUIRE(r.any(3)); + REQUIRE_FALSE(r.any(9)); +} + +TEST_CASE("Result contains only the specified elements"){ + Result r{1,1,1}; + REQUIRE(r.contains_only(1)); + REQUIRE(r.contains_only(1,1)); +} + +TEST_CASE("Only with multiple values"){ + Result r{1,1,2,1,2,1,1}; + REQUIRE_FALSE(r.contains_only(1)); + REQUIRE_FALSE(r.contains_only(2)); + REQUIRE(r.contains_only(1,2)); + REQUIRE(r.contains_only(2,1)); +} + } // namespace sls diff --git a/slsSupportLib/include/sls/TypeTraits.h b/slsSupportLib/include/sls/TypeTraits.h index cbbeb7bea..80bee0b44 100644 --- a/slsSupportLib/include/sls/TypeTraits.h +++ b/slsSupportLib/include/sls/TypeTraits.h @@ -103,4 +103,14 @@ template struct is_vector : public std::false_type {}; template struct is_vector> : public std::true_type {}; + + +template struct Conjunction : std::true_type {}; +template struct Conjunction : B1 {}; +template +struct Conjunction + : std::conditional, B1>::type {}; + +template +using AllSame = typename std::enable_if...>::value>::type; } // namespace sls \ No newline at end of file From 82ac45873cbd5ec8631b7ffc6c6d67f2cd094198 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 18 Oct 2023 10:47:52 +0200 Subject: [PATCH 02/38] dev jf: change status reg bits (#829) * jf: rewrite of status reg bits, waiting state includes both wati for trigger and start frame, blocking trigger only waits if its not in waiting for trigger and run busy enabled, error state connected in firmware --- .../jungfrauDetectorServer/RegisterDefs.h | 18 +++++----- .../bin/jungfrauDetectorServer_developer | Bin 312272 -> 312232 bytes .../slsDetectorFunctionList.c | 32 ++++++++++-------- slsSupportLib/include/sls/versionAPI.h | 2 +- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h index e00358c91..5aea7924d 100644 --- a/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/jungfrauDetectorServer/RegisterDefs.h @@ -24,16 +24,18 @@ #define RUN_BUSY_OFST (0) #define RUN_BUSY_MSK (0x00000001 << RUN_BUSY_OFST) -#define WAITING_FOR_TRIGGER_OFST (3) +#define WAITING_FOR_TRIGGER_OFST (1) #define WAITING_FOR_TRIGGER_MSK (0x00000001 << WAITING_FOR_TRIGGER_OFST) -#define DELAYBEFORE_OFST (4) // Not used in software -#define DELAYBEFORE_MSK (0x00000001 << DELAYBEFORE_OFST) // Not used in software -#define DELAYAFTER_OFST (5) // Not used in software -#define DELAYAFTER_MSK (0x00000001 << DELAYAFTER_OFST) // Not used in software -#define STOPPED_OFST (15) +#define WAITING_FOR_START_FRAME_OFST (2) +#define WAITING_FOR_START_FRAME_MSK (0x00000001 << WAITING_FOR_START_FRAME_OFST) +#define ACQUIRING_FRAME_OFST (3) // Not used in software +#define ACQUIRING_FRAME_MSK (0x00000001 << ACQUIRING_FRAME_OFST) +#define WAITING_FOR_PERIOD_TO_ELAPSE_OFST (4) // Not used in software +#define WAITING_FOR_PERIOD_TO_ELAPSE_MSK (0x00000001 << WAITING_FOR_PERIOD_TO_ELAPSE_OFST) +#define STOPPED_OFST (8) #define STOPPED_MSK (0x00000001 << STOPPED_OFST) -#define RUNMACHINE_BUSY_OFST (17) -#define RUNMACHINE_BUSY_MSK (0x00000001 << RUNMACHINE_BUSY_OFST) +#define INTERNAL_STOP_OFST (9) +#define INTERNAL_STOP_MSK (0x00000001 << INTERNAL_STOP_OFST) /* Look at me register */ #define LOOK_AT_ME_REG (0x03 << MEM_MAP_SHIFT) // Not used in firmware or software diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 93d1e3bc84a0a8f24efbe0fe552dc093b580ff48..9ca3cc2ff2fb142a8292cad01cb9977e6e7e50a4 100755 GIT binary patch delta 112605 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 delta 112345 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 Px`bbDWEl2-c8Ipe%N53QrsdwsWVrFeJI;NR5 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 N7&T}^7d%`r{(m76$mjq7 diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index a3972d215..5d5c83de9 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -2924,14 +2924,16 @@ int softwareTrigger(int block) { LOG(logINFO, ("Sending Software Trigger\n")); bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_SOFTWARE_TRIGGER_MSK); bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_SOFTWARE_TRIGGER_MSK); + // wait to make sure its out of this state and even 'wait for start frame' + usleep(100); #ifndef VIRTUAL - // block till frame is sent out + // block till frame sent out & back to wait for trigger (or not busy anymore) if (block) { - enum runStatus s = getRunStatus(); - while (s == RUNNING || s == TRANSMITTING) { + uint32_t retval = bus_r(STATUS_REG); + while ((retval & RUN_BUSY_MSK) && !(retval & WAITING_FOR_TRIGGER_MSK)) { usleep(5000); - s = getRunStatus(); + retval = bus_r(STATUS_REG); } } LOG(logINFO, ("Ready for Next Trigger...\n")); @@ -2964,9 +2966,17 @@ enum runStatus getRunStatus() { u_int32_t retval = bus_r(STATUS_REG); LOG(logINFO, ("Status Register: %08x\n", retval)); + // error + if (retval & INTERNAL_STOP_MSK) { + LOG(logINFOBLUE, ("Status: ERROR\n")); + s = ERROR; + } + // running - if (retval & RUN_BUSY_MSK) { - if (retval & WAITING_FOR_TRIGGER_MSK) { + else if (retval & RUN_BUSY_MSK) { + if ((retval & + WAITING_FOR_TRIGGER_MSK) || + (retval & WAITING_FOR_START_FRAME_MSK)) { LOG(logINFOBLUE, ("Status: WAITING\n")); s = WAITING; } else { @@ -2977,19 +2987,13 @@ enum runStatus getRunStatus() { // not running else { - // stopped or error + // stopped or idle if (retval & STOPPED_MSK) { LOG(logINFOBLUE, ("Status: STOPPED\n")); s = STOPPED; - } else if (retval & RUNMACHINE_BUSY_MSK) { - LOG(logINFOBLUE, ("Status: READ MACHINE BUSY\n")); - s = TRANSMITTING; - } else if (!retval) { + } else { LOG(logINFOBLUE, ("Status: IDLE\n")); s = IDLE; - } else { - LOG(logERROR, ("Status: Unknown status %08x\n", retval)); - s = ERROR; } } diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index d830030bf..60d0309c3 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -10,4 +10,4 @@ #define APIMYTHEN3 "developer 0x230922" #define APIMOENCH "developer 0x230922" #define APIEIGER "developer 0x230922" -#define APIJUNGFRAU "developer 0x230928" +#define APIJUNGFRAU "developer 0x231013" From 62f45b15d24c505c97413133ac7cf2f6640cb32c Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 18 Oct 2023 10:52:22 +0200 Subject: [PATCH 03/38] dev jf: reconfigure chip when touching electron collection mode bit (#831) * jf: if bit 14 in reg 0x5d (electron mode collection bit) is changed, configure chip if v1.1 and powered on. so touch writeregister (setbit/clearbit also calls write register in the end). replace when electroncollectionmode command introduced --- .../bin/jungfrauDetectorServer_developer | Bin 312232 -> 312296 bytes .../slsDetectorServer/src/blackfin.c | 19 ++++++++++++++++++ slsSupportLib/include/sls/versionAPI.h | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 9ca3cc2ff2fb142a8292cad01cb9977e6e7e50a4..3f89b9499e275f14a043a08bbccccac64143bdcf 100755 GIT binary patch delta 98581 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 delta 98536 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�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 Date: Wed, 18 Oct 2023 17:04:39 +0200 Subject: [PATCH 04/38] eiger required fw version to 32: fix for blocking trigger in quad (#834) --- .../bin/eigerDetectorServer_developer | Bin 444127 -> 444195 bytes .../slsDetectorServer_defs.h | 2 +- slsSupportLib/include/sls/versionAPI.h | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index dc23c098422625203c1a1d7fbf350afec6480d83..3489643542cab4fc36e0e4cf9ccb2842e315c1b6 100755 GIT binary patch delta 81759 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�Fk>DKGSns8|7)VOW0h3K@%K=DbB&fwI;Iv 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
  • q zxWM$?4DzOw_uWrWe9qMm__praGjxhkD!#TEQK{$JcObNV{~q#R#}6y$RI}9nLmcLn zX9q(Rs_vKp^R{;^MOE|lfB4-&loYw}G=maCrg=){zyF3#OMK%WtFVvA`Nw1Uzxf{w zX?IrVG^F)qosVIS>g=3J&E8V{jitCKzOi7cIk}Hlg3)Y+#m&Ov;*i&z)kin!%sEPO zY|fM1|M|+OB+tQ1T9Rjd%|BQ169><(XqZ2-Ya;2Y&*?&b?~rnDzT;QxVwcpUh@Nyt z3i`L?*QTOe6_ift%)eiw)BUB)|NNOwPm|)i7s87RyC>rasjfR3-hQb&4w1re>mZ$B zkg9Jjpfh5m?pq5n__QCRaVV7cV;ugk`0-VQn#iAKL%+E{JwTKFrCR=zD0Tf5jm@)v z&sxkSN6&0*xX$!^<#*8~OLDs+OLC{waCQuc0aC`mFyxKt|mT80bz``n#j` zb^lvM!Pd8T1)XM)w)95B;FY}}KrLy`_aIM)^JgHuSxrEA^Bid;9jus;m*`Ai=1Iw~ z=&T@q0`Sqj3_a7%%JhVhQWj$%Zx5&;?_FlrvP%ZC*-JHuneD91MndS!PFCPXUS)rz zWFnh1ge)7-US5r6#jvU&=pl=lhu*t~S%s`)C|P>19%j|BJa_UR($4H2+68ypd!wA$6?Em;4$!&haCU z(g%#J*^m5!K44~!QDiO2Y3vw<(V|O-Klwd5!_or??kcg10g$SPr3HeR$=U+RizJ`f z$AEt+D;Yx~(4ck9Y1du0w>eR5;$TR9b1xsXkh=jvr*E6|?pbVk7IY z@{M5+g_6qF|Lj5a=(EeH=vsq@r&FSbG#1 zO-`|%D42CW3mS``t;~X-;QrJK3@liq({@DR*!@8qyVH|Xm}4vn5BWpCP^e=?ope{7 zpF?e9$t-ewUo?2`m8GL!q%aG=T!cdCFq#ad=f^9gKV4?Y7y$kCF4i0ke>uUcc$i^> zWGg-Qrl^$4D~%yHc%4A@bPU-*jwf*&hpX9Ju`Ds3d_wZr)p$&l8kRYpJVaVp<#-Z@ z+0!zf)RS&jID!0(KA6nR6Ul6n)mS(YQ;QTZLjsw$c!!)YA&*UVJmj#_Ltd`y8Ps0v zamY%mGyz^yWYgZ2+oOhM+9;)SJk+-u_DV6sSC*AkgD5>nr;q1Q2#6<2e%VhE= z`jDCVCX(+kz8?P5#M-7H5_YrJspQk5xru{UOHroT09wtwBY2Ug)$l1!H~Kb!R@cpV z!>20|PQ?b$>e@aTKAnqlu>rI?RD2SwMg1FLYq^RLfCgd%XsuC|W9Qko0kocUl^^3f zPq6{CwyMhc&Qojvtyfj$*m)`&z(kYI+M^=you}9U&h=E4^PQ*I0M0eC1~d5T8vOdmQgxpB*E1Q@ty zOB$wHNn>Xkd5j`vTOT4Hz)iaz!mP|@CM(&Dg`wI?=8dqaju>r0e8CJQF)U~<`6bC^ zZFAAAoE6U_GikavZ#R|wcOD{66EoZXkH+n+&PJZ6=|Rktj=7nh$codkpsF&e^c-a^ zOwVVD^RXtOO80z7RKao=V4Ifp!@ht*l_S~6?#9@n(x z)BVZiuIs+({^VR&SzkbTI@MLir~Ae!eb-j{>}6)jMI_5*-MLUtE-PC{KEhA(lURfc zS;>B0>M*)RGnzfrkPSo0hbx%K0Hwx#H?ex>V)MP%dKAQiG~I73Cr}E%jHG$D%x4 z<}+EhG+ssEhfpFmEw#AHpS+E75u27~va}+^rV9CV>Ra4?V%ZM3#3g3gNdiY?`J<{l zMNPUaBWrb#r)XBp|3wR7FYP3UNyh(4Z+!X%tmpTx(Af1Nd6KAloZO5ab9cc#wlr4k zA`=GDF1|!&d6dh6XLlBytPYx^KKY6TbH!_GVjpufg z6?BwVld{n39t&!;l#(}w+?!}(9dD2Y_on5tbcrmvH?4{_No38vY3+@P<>a4)X2-C| zedHCIZDw`*Fmde6%<$u2&HM+8O9g(KSu6i(V_EwVBbVz~yZjr(a^E7a(dA~=^A@%p z8O;7R_B(m(%-du;Caa|qd!ZUuRf%cYz>EjLp`Fzn0EZO@W;)1!V_4Hc6sI%GJNUuM z#(yx)tMJpnE>)3**o?#+BKzp$?yUI`)c1HKGro%umCefECC{RX=X(fWg^f+`k*CN# zhx&LqOFoPs-QH+;pZrLuUB~WxfECqlVE#4ON8mc62Bx-qvVt1&MA6E790G_kwdd&U z-mZz18s-WecGokBhExyC8WB3|u480_zh*fWV=1fQKQ*kK|FkmyI{b97j5@5-c@Wf}Y@mld8M z)4aA=4HH+&tAc%9A!|NCepR$Sd9e0HnM(U6-IJ=tVj^6pZ+U!D<+BsH>j)oza*NBC zCvwjbKK^8hs$8AAKUt|F1fYTN@h9t4fO6sEPj;%x zPoTWd$JgsrghL<*A7AgQD&LKA;p6LLSi{e;Jm$$RK5?%XtNVfsVShMD{02P@?Pk)w z)*>rdqs;XiDbEW67Rt;^1a1}O>Bu#F z&WH;;2u%WS0T#;4D+aC-<(0rfnRyMs$_*x6UNf*zX5KmAd{Mt0SST~E3s~G-*`NcK zm1!!{ZNNUm$D%aY5Cbffxgi-iMwDj&3uSJ|0T#LahC*P2s8eRudG`p6heN$P1;$~U zce}t4&ikUk5XifwNV#~*7Z)c5HUZZO3>A4-3!DpFAuzP!T`F)nutQ+p@fLxhA@5v) z&j4o&46S%)2wZdr7ir4HMsHxVz>&c50-J%20&{_U1?B>|3k-qoyCZM~aF@Wfz*hx^ zneMwJ@I~Nr$+{wb`+H+IE}9iWz9(>lz%a*sH3D0JD+SI3E)zHpxL9BZaDl+3za4Y*0*PT*PvKdl3<5*TJ0Q7$kvG@?Xc2sENl;B?@8 zf$hLK0>fcPWC_d#DoPg@O}MZKd@9E>utDHltIn%O-~!-I zflGkf1uh4^sNkZ_HMnRIgeKsV0=EFy2@I`xRSVn=T%q7C?!cu22LU?-js)H!Fa-6= z6&PCa$`&{WI3pR4s=xuaKrLQrf=~u*7PuNXUf^b6qrmVLFJFOSCNFmdZ#7tTo_7R> znLN7$hH#!&1%^PLmjuo%!o@jpkqg``Fa+{!5V#b$Mqmi!St;;I;4*>O4kZ8C?U@lOiz+9jhfir-E1kM5W7MKfU5Eudt z>k$|N4eJyb0u5^y7y=EuDB^!X2QFF^!Zz4!*hztXf$Id00j?I<0$d?5G&HPK;9Ovb zz{S8@1g-+k6}SO7Ti~J=Tx5ugHsCaYyMWCKe$D_KFR(wbQD76WufSGdcY(95I*&U7 z=L2^M41qkZ3JihxyE=0Ge-3K#I420_fSUz|KpqVOcLLWacsn%YQ7JGqq!W;ADZTflUHKbsmudp8@t4m<#GDa5u0{ z!G-WA_ilkBfja~?1GjOE_+OZgi&jB^bna&aE&y&4xD>cn;7Z^sfgzB4xxf&}y+q)P zz=Z;L0_Q7uhdXeNz%ZqIQI@!f!9}{jTsn)uT)0Gmxo|N8ZvhSx7}|387Pt!7AaIja zH?&9KbHJSfw*$8;xM&B|HT0r#@w@@JMPOgxlLE&B*9n{kTrF@WaD~7*z@-AiltUc? zmjiDRxCS^^;FG}FBK|**xi~aK5Uv8J3Cx8vE4T=%8yYWg5U^2T%z~l50$YLI1%|eU z+z}Y29MUClDezT+s}TQ(ToM;h*N}4pUj%LzxC6LB;5)!Iz(~^_p1_p?`vaE=90^=3 za3XMlz|h=~Jb|--?Z8ExQ64Tb1;GJq6&R`;k}Pm7uu0%Ez>xyC0s9LKZ4L2M@J<7; zPGD%uty^FSfU|pK0>g<6Edu8NpA;CTG1LiM30y7k8Q=ef2_5Sz1x^Gm z6PR~aEHLk^Kw#cip1`$;|9ZQ)Xaylt;7(wxf?swAP8K*4*d#C?S){<3!2SZ~1A7Ww z3ak^j#;T*;0>fmqgJZ=1m)mjCCJ3+@ZB=lIKkylW&A?3pX93p=TmW1pa0PI=zzx79 z0%KsbP~a}$d2wQ+J3S0)jZ{RkZOT@fGZUIDn>?11&#rB z2+TX)A}}1E#mB6I^atJUj#lUa2Ig1g7+AJ8w552*9eS}=_&=b1D6Tx04^4| z61YHM3`~~?yc(n5gOTa%g3tk+so>XmXI6pZfs+O1qcI7*1vpaR5@3IUtAITPZjj10 zj+X9=^I&Oz#FHHtS@s{vJGd`@=a1xFx<9_Lsugz;ae5#BC!7ZEYRvo-?ph|mBz>Li z=c5pv>{oTNzs%Li{t797G|sucAft;q1{@G#jQf=`*O?YC<1&h|?ymtBW8KdUA;!AD z30RDEe+zJ*7?*&>SogOBi?QynDAY@DY#hbx7YTo4AMYOTjRQ9vl$dm*%_&B2niP8r zcakrXQGq`u3p#fb75yh2Yv#>61le0lzKv(JIJrTPxfrU}|I1>=FG21UWbT_P@|`@E zp(e*@$#<)ngOjg{)_m-$)^7f+j+2`N*{mgd;Dt&~-Xh2rE&2Wq=KW`oYXq4qT*W*z zlUX>qLXb1GWFyYcIXPF5v$W)}T2`fQ%{^MhJhGg%{uxS-GK=Q9TKd@heSZP-JA#_8 zrA9X}(_hd!#vO4GI@>jIBd5YFOTDt8Vv-9S5LFN%& z<#F?~Ss5p1DP&^Mk{6m-Gv}V+F6cajsG2V_urA(Qs9j!HROE*-&A&qPNBl+eAZ_zU zYFWltXkH@7JaDO+FRo(_P8PDutC@9OP@LWmBI`ina8o+gUSjUM-rJ zYROwlSr>1GkZIj zzh@HkJ6d{08Y|7bbhq2^F%HEXfo z1vy7cZc5(w9hjf+734fE`Deb&^c`9^2=W#!`D8h>bFv6Y@_tHX)n8VzGBvqa)fx%k zGg+*ecm8ajUQ1PUI7M?j>*Dm&ee`lI{d6TWUIqPECLvv=mj0_QmT?u*iHJz6wdAt} z%)y(VNfXU$we;WO`5E5aA;=8_$Y)qPC-*tcNiF$v6Z5_Xa-ZJMXvtr-GYcnI2vg-iy*gY$?Y&YZ+@k(`Bg3bZ=Uar%Rd^Jos;_pu3r8@?(AY^oP1GXE^qWzKJiaGYyKXh{Yz+F@2>5TyBM3A$zoP6*{u*ZdJ31ekDCiYh z`p8a}@pm*Y5acQ?*)NDWI9d3qd^D!=lyL0XIQIw|%D_yikyPv}6n3?c!vi7lTeqPHkn)oSdz+mQOtU zw2qiRERS{Z&S#4mX7JWFpN(Yh2AUU(=KfmpoEVnD$yPx&YRL~aGl#l$jFyaN;_EoM zQnWT}$qPJLJ11ufvSk1nx!XS>`oefYw`%E&FwOso<|1;*XU2UaM_gRo%<@4dCt1lq z$&>Ug1MB`LIY{3!v+{qDzr^wvSy9{R#QUV4FTSI5pJCVOmO4V8U;3=Sxp4H)3zk;+ zn_v7^=gy2K{b=^D*YpXVXyRSSzXyhD7qbHoQn~SWiF=|TCeC%< z%1xT3i)ZGWBs3~M#pvy3UiVf$f8E&T{M{bBN$cw`oFyhCw|pn zj_-r@1oKDdj5_@f7-i7TSvvXk-J;z(i{*eWh!2O?<3izuFJ6B+&XDW_%JJTE&m3OX zH*}1*NHyReZ=;brw5LM{-l*u#6(X4WV+iu=&HN2gyeOOJ2sH$mAW)JK3d6b7ew<73 zvO;%#L5Vv~!gNDsDs^>1g(L85C6885q%r+ zH6|wp$3HV?N82IjgK)lkW4EYrlx(8k?VH9Q>_;a|>) z6yIx!v^jt4hQ1;(7XASUGk6)}96GaG>H%Fm7t&;Z>yqOgLl7G7M8gp zCvYY@H=Fan+c-gH4q3T>nw#|vC3m3kR>unZ=i`q5nS5 zyywxeA#W3{2$$v8upk1A(nFZzN6hg3EMo{=Gwk0UvMF?LCo=b+$Yh^bZOcoySo%+7 zOh5p}>CcS<^$|rRox$d;J;oeA;n~qJW*MT78tL4>ctG#U*&ue!W#W#@X3mCRvvDRj-Ke;rRUI-N-trxULs zdhdN40iZX0F3Y`*mx$iR-eWg?I`H&ft=)h5wPN>w`LU`ZI*J~-CfoX{|B^XTi|=jg zf2PRxgoyFSCq@oYR0qnI6W$K9zX@3!4*C@$}B(9)p~trFtfzakV)n8D|fQ1$ZqsS6jv=2 zg%2U!Tm}Z*lT|&ue@pg(5&u}tCp01#JiqG#tGf$Zuj3^1zFrdHH}LfY#N4-wnYovI z=OsrUoAY0{xg}Ws{qWG~Q%}2gu@M%dxB`bLvkE-hPAWgij zcZJWJ{`8@Qi!g3~z(9nIx9b1C19CeMY%sl?y&~Aify$(-G`?9zBZB#7U@W4>T~WiN zxMrmtHNwYsoX4e@;y*hIQ>(r&*K`{q;0qre3Cy3+$^4BdLdPWSR<%e%3ttfwuzED@ zLJNHI;D=M_xCTCH60@?<*86A}t0FYot=-nU>=rvmXy_a_7pD`)!O356@&_lvjR8(c z;KV;n;)(Ss9s@VodKb?T*T74+G83hvNfNVCIxTjtJUIJ-7@PA%7&rzAjtGa18_)_1 z%lG)8DAr8xA#^nRC8cX0IFOs7)vc%FTXf~*(d~z$E)kpfN0w9{&id>K7#gkmYgbsV zo^JOLi|v6j`RjOWsDZ}#$ggU--0d7;76UZ7m~Ao88L&F$`5OA&P3G@LqkUvwbXES{ zO_t$Crtsp_3K`IIH7pS)-;5M&;wU^6k6-CNLGgKU?poFLMM;k zq>Un~JkkGaq7C&zPJuXz)z0n4P$d$9Czv8+E0mMX{k)C(-&SXbsSgFBs0589c< zorb3DRW(UP6O{)Y+k+cjqiQ9q~nbH}m>;y!&z_oAcOZwBa94 zbK~#S+MIP!XoF9WeY+fDBQaAVQlT4r%0k`gTjLRJBc%V$^kd1x=tOdWb$4(bqsCg@65=i>@B{|YKPGY^qqL@ZxKwLb^O~YDrgU*BNa!@=vYme)5Y z__ZAQdSBelDu;7kR?Z7w4)CPW0o%Y%WvQcQ!48&cyUWr&X~YzH(M0nYTki{fVny0| zU-S}e$WY&$BXbv0Wm^dMm~I7 zZz`YZS=vC(f|;)ujUbztng3KP1E}<(V;?wr9jsM>q82F#4-{W*fN1VqG<;yj6J@aE zSIbc5sVak|zJgDVpc~1XY|9859^$yGRp3{L#7I4Dy^bpbj8VH%Ym5(%q8}LJ@->!o zAB=H8%j>Vl1TS}6Z_&;{#uyv;(I%}mj+_ENSOXbHrZ)`_eEzmzfR*L>KEYs`A~#m% zO-Dxsb1h?tN{U~pGb+Qrv>U$|>ZP4F=P$RibKVr+U}8PqG$QJ-%SIpW(kilse~J@| zyyU?wK8PlpSe6f+96JS;vU5wxEgeWMduMLrUkt|e5T1DM9s51ji?s8s!H15cRR-4X zL&wCYyKQI)*AusPcfNv)Hk+2eP~Z2IRg z)^R^V?|=;J6f&%lRL-zQ(n+)`p5>3kSjW4@S~Fm(zb~fxmwQ>$NE$LE^`@=&fy1nA zBz=HZdGG^hG9(HFqk^`W2yDVI*3L6^;FI`!B|zz>4PKS#ZxY|9Nqw4s%iS( z3G|C;`lp+C@}=5rcRI0T&*45OrhIwwLY{vhAn`5Ti=Xp2F>DvFP;^k9cw4|+**(cm z4sg#Hwi=xv&)4<6gNN0)l;wh@IDkQ>=6}WtScb`90-g=Ei`qOAnhqAx=6AyyylS&#&4|Q-Uz>H@RA|HFt4b0*Nvv`~H&>}EH z;@7&HHT%;Uep_*wtqpUphB5B|`fkX(*diUeh2}gmb02^mtN3@b5expfjkN~Qz>s%M zsB;Q+xV;RhgS4y419f1pKc+JGK>Fagclq~1JmCxOTw>Jc{>Nh_=LxmH!~G9a{0|pc zK_FcH-5ho@5D5-pU4in9cOOG%jd$?n4orArjUxK+5w*m@n{X&9_>4ry2reaLOEtvB~` z);wGvK1_bW4NmcH6KfBmn*)}irOG&!htU$o`Tf@{FBr4^5_629MphF{N0KRg0Hf%+ z!|Y-(ok=%bX1@5woT|$G^xQV3&hM``mW9xv#BY<$Sv+3l+YPqfwewk-6+!IXPS=7n z;cY%iRB6I~K1r~+wA{q6zt*5Ho>ev=E%?5(jws9Uy16`Pgp!1PVYD8(WJ4H@CQ+;{ zjM|6?;)owh38znBe^M1rqm?B@o^6$U<9u`-mk4-XP9Z*qqPLXN6I8 zvfCbPShul;C^`)vKkAHv5n~m7{c3-Ikaf1W@eSK3y5oSt|5skhW>ERqf=e|={1nx2 zfBfy-!L}&8rtm(!*v0!dr}2>+IOsA~7DLzKgF)D4h9(S<{DVHp!T2|BgBfo>B)9hR zaq&I7Ly>vApCa=wcPTQjJ*`#B`+Hn6pE*64^>gA7;}_>y@;Ex-{xxy};2QJcv#f9& z9J_?oj-%ldesR;~0%d$%P`SYC!C(&;_{Cz_z~9yz63p(5gXek4OV`3*1~7XZjq}(6 z4oKpv@y>k)jbM#&G}33cR_N-*tTPTRk2BwR1Pi6_d8Zb;`hJ~%Ggq~a?AghOX4RkM zZ+(^mdt>tBv|`NX{fUD(T(k8Ct!54J2svdw)y9Ubl9OGRau1ys#yMkiZk@{<6KE)$ zx-Zk|U(d!I;)>>fF@RM~f(skjr3rLw($7`4DCJdDN&71|xDKrPpYb$!z?|E{ig0=~ z>cqN1f;-^_^2y4U)rwa&eaZ5t(Xo?OdT0%#e02z_hQt0sUJ|sr*?d@TKdQ-ZP#?X4 zHx=bfJQfL7oBQgH`z$L8F) zs9zrk$wgc5=uNC75$j$nYfq&0%T$}nm%Oy5FJ1=WVETG~zQCW=5NG3F)-@GTQ3=NM*nY*$mdW$MH9so$D+=Lm_St!K!xul*>XEljakIM1gS+@F zMRDczUy3?&2G==$MAX4qqZw2A9%qfm{q{|VphuMo!Gn1;?3616D7}2VdvJ~V8%i(h zcCm~Z=;hX+D!um~RvaW3Co{atqI*IsbP3Jx)kIy5e%O!oAx0{M^^DI_C3-eyB5q-ym_ge_tqj$U)+d z6kmRU-_~oG!!x=F`5iYTbcf}H?&-koC%}$xbNB?tHs?9MxMH7rB!zieXk6GO8C|coPuKg6;-@n ztf=DI{lYN(7z!K9t=AO891e!+VqhF>EZ;}s^(>DPs^hAyJW4?0)wfVb{>xH3<9=xC z!+Ya?;E#oa--`Wm8NXx6cBIh|oR-LEpVe;6Fb4;EE3h}7gVkastC<5|d{Zm=D=S(1 z9K@~V=h>Y($b9#(pa5Cp|i!z?y2YJ{GQBc zrEzn5QdGyqNOfnSq3RrRGe3t^`Q)ZOiiWDrLKEFwBwO#40A*Y7fl=8O+_BQ=WxLT% zwZ!LtiMojMRbIAUuT-Ir7944qFvJ#HuP4veVU-V(ZO*6Xqpj)?E}w79u+@9#0{Ys` z?=6h>^5>f`xk>v6g{*2W{N&(merGE>cDz>GyW|`Z(q?1ICqO^LEF4oJ^({=MD_O)_<*%hJ?p#@z7C`e4qxvcV(m6KcoM5xi2G=jJQYBs z`Jjv^laC}(n=@@dBJrX~B=}bF&|&V_=uuv~#SJw$-_jIj|CXk*Q+gUT>}`Ie51u%u zx7X81MJ4=B9ll!@H$|SLt~vg~Rz5b21>CES@OUJ+_uZ}o_a#_e=Hs~in8FvF>9_awJ^ym(WrCn@c~?WLC9=j+>Bk1v6ijAg|&(87!!8tRAey`AJImd&R6$ zx}P4BG+<9zut({i=xok(57xXC{rf2W-(8CS@hCFx3{O}!;D}(QI3g(H2QmZnYQuIG zcbw_#H(1qFeeg7=dBEEA%q=nIOE%{`mp%^a>JWoG7443`&GMJw+^vI|B)WLA{8++D ze&0|vemhad|N1@rbRLd|lk~V7{Mrs>zcy9&I+xm7y?0!f0BGYGWsaWd1O*e9czlR zt0*0u?e&fc;~8Nzo+*&SZK=n;l*=8CedTjZ1##Y)&3ET2TRzHn z9+3By@yhf`yQ^qo_XcPpWM0C6Se-9oHHlQI;-sRA$N0G{XDw9msE@*W_gtHE_E~1I zc` zV5c~et!QGIpH>q~S1PPu+HZ5F`YBEkc7f0Kar8(rGv>f6UQ*rU$=apW#gYq(E?)9b zbPBX@ z7x&E5+HpVPrAYU}9A(@oe&Ruxox5z#mu_>S*13}36c57e#FI`hZM#PW><8rsVH~@Z zhnZqdXqC5CUL!FWBs#lJDBaFjqy+7v)5;z4XgNl^V$T{VY#jzWo>i{H`3mkz;AdGG zW*`46SMpz2#Tc;?f2ex*^~2i1caR)B{}Dd0h^N6SA6UrKVE90h7d~o>*^Np z<|^}tE8_(*<;;GpJrBMo^cOimf2&mb+bQ%nZIRN;_S1^aBL?X233=UBbndvtGM++4 zD01uP?usS}S~IP@>ypfopqOdO=SnxvC9&40Fqi?m*OhWMr}R>^K{Robn}l!MYP$OuzLya4 zE4%}5X#IJaJdI!$@P78jVBX_*%Z@r?(`^^;XIC?O0j7$`1~$Q`Ww`?eW<#89qN+RuBp3a zzhd}t3HzRdb`G)J=a4>(`cm6s@gb#!zS!oB4Q92^;gPXgRvD=ei`GAN+~u8?H?{sg z^9mFRe}5`~nYQB`12<;2(^>f7Z`F1hT@>qTIP0?3t!GA|A>4Yya@?(tL_N0zW35qk z6&xkwPllHuM)v*5aQJAg6_)el^?>bzV8qM9IeOpq{ighnaUE zH{o+p1eKX{z({pRDtRv$;dE*J=ghGKhN)vGcOcxkxmu*~t%>TnqGY}`!M*bJd~0IH zgjAh$kM-h*OxT({xr3EHk2N*m|C=_}s}hamy%0$i8K-{@QQ#?0`av6c_t3_?B1Icn zMbO3^*VvMyz(^Gkr}HQT&sm4t!$p{z+r&;Q_c}8=Xz0o)t!FR1sdzTYNA&eiG4fqY ztw_~oqzV~Ds-Cn*kumqI%^A^m4u;50_<^p!9J%lQ9UD3ac4SBKDeA{)^1hukG>o6| zsU$RCRwT^z!BDr@?*1J!d?#|;qd_chC!T6mty9wj&{X9!=GABlpILhVzXLXK;hW?Q z+=w+-`h&>b>t~gRdcwX|ZV#@R&y^7J#E9KmEzDmmw24%54(hsGTIjgNl3&DXoy+X_8K2@ZmpNFgjH!ID26L_E-^ztD(6a7DtbFBM z7lG5)+;%mc#y4duWlZ6lGALv9_`%9B;+9`A_Bfk_E;4 zLj(r*KPi{`3SEH@%U8WZ!yjF7*Cm$eYwa*6#wx>Hu@aBf+wmL?|6`YULr4CVmpPNJ zu7bY-v@;HG_SkfWy|Z*NdvRCQcK54T7W67zpU~xcV%NmO13#$eQxnuxS84dT<)>ZZO+1A5su?w&=RKHF%cJoS$_Fo6$|y9t*8_d3S&A;L|vSDNvNJo<7oHP;oe?ovDww6f8% zhdxVigoxKkLfOV9IwaIdclF1RNxXbby4xXx5c7>U);wN#ohw zO#OWZ+ui@}V70GPn@1gb#Oe3!<@?HL;MhmMbPX_W7lc!V-q;JMifFS8yW%psJ+%{K z8Dd`dH-A1B{%o05|7e&jv;9~QeutPGf5Vu@aZliE2*!w;d$HUTz$R-xyHiG|&O65E z`2ar4j@*OKBJkn%;(RdF7#_x9ucdH8`O)D-R`nqDXXSfo_yfn%@4+-`Fw@xcV9Jfi znd06^OaPd|h)Wl-p1pK-YQbPOS%>byW-i!pJ90J{bM%{F13NA`&kEn5FVQcq@f$^< zUi=Z{O5Qxdc&vsWf3BTB7nfol#(02>YR-&Z3@*^>;yswx$)eY0aKD0jT%&qLqhomt zhej8#W>+N|7u<#_`%y)utSG+2fwC3{hf;vhjj@O&6|r}n}Byu@bx zVQkj-;jZQY&rQN<{yyHTN$E9`FZ^5?V&x3y3qO?cun%qo%>nk;1}0D3lV@187WFUS z&LyXmU4Z9eMUsrOyyuX>+eABQrkxj)rim54MMIM^6bT~w%poKQ6XwX+V{;Do=x1?I zm(f4&ixqhGL)nzmg*IFhrxksFUC!nV=CEbj_ztCEV)iwP* ziiL}Z92I`a7i>)8pxa;tzf8xwNeAe9Jiy_4&hY3@1a}JkSlJ;O%4UV=@q))e967t) zR&+TJ4@MrufDZHvP{}zatP{q}#DKgpAYVnOdSBOog7_M*@~uF=#>2PfO|dx_@|=pR zSC!Vgxv}PV@Vv*?BxC=3cH$+s1(%h(R)$TARMsn8slWpvGCN zaif3#U^)IfMUi9X;eI)sX?Q5=Lu@&5qglSWH#2~BeTXfmyt#6n=|+VqVvrJu;V;Ax z0o!|%R*Vs+6fsh6*?N06^$+JDN#t#nEoa4Ueh?jjzb1o6%byOvkMGx1Igc0LuOZZ> z#44$E1>EXIY&RQ9l`YoHoi0njagwSgT+9H=oK8|1QezW(d-O7G*hU-A=E?ccw z;>TM;1v6H26@)zT-JyQjWmAO9F&uYD)H-NZoXG2xRtKIQiVkL^+InxD>gS`;!M-;Y z9keMr@Vu$j!SEDC2h;i91-s0Bn}iPTC_0#-itnB~v^p5}xuS#VWUvmpzf^RPG^gJS z?!LK$>mZciyzvwHyixYW_8a|z%L)jUGZw8c9v8kie8AG_A(l=vmd=#HOK0zYmNWY? zJ zz*M9I^Jr9P?>7TNLU3P5z)A9qBP`=My1t3=f9iS`MR~?$`lPQv*XkkYO;_L3xuyrq z_pa6QJR6qCvwCF+c%~&Gw72b+meH8gf)Qj$!Xd%}yxQISFL4uNvV0Q*lD8#jTLt!= zDDzecisb+NT9sO_%9RaJm&yG1xcZ)Y50~gvvZ-Mv?$~OzT^itrqx<|2 zGEBK4)b@{EiUua$>Tlh3ijG@zDOjt4QP+hOd|m#3?Y)0oRMpl$K6B2T2?*_AfRHF4 zsHmu5nu9+A6>W6Tu&}T+$NU9~ilsL!3^Xk)ykVjX3kypN3vc*bZLl;^QL&4KsW&W5 zylG+Sy?DdIgqhEKopXkn0iWmje*gHq?mwS-z4mL*{=N3vYpuQZ+CPpjBod#w#I4f3 zZ7*+F90H3JH^Hi7kpjUwXs^XF{qX- zPaO=L+6FCd83)j*PlZ6gm7Wj>OrYjZv7p4(&}TwKY`9x0pVq>pGvEf6omaGe)uK^5%GWAS1CX%sb1#d_cCfY9TS)5^@tYo(DTcwf9yr?=QoALT;a5x2PA0IuD| z)c#i(X>I^x?&*Juk{%Nm-7WSHZyO^}RR6gX+z<)Pw@ZMAxb_59(q{Cqx6be&DEsZ5 zfC~iG?~=u#m}uH{>KmtmJ*&RQNk(q^#@-rblC$3)>e-81tJGdZ?Sl#BdPgvRP?w^e z`?zLX$AGyC82?b^Okkfy9d-L?9Pc{>v68Mr+WQ>E92WY-cJc(Y(>V?8kYv%Fw8mYF z2m7U+O7Xzn!5v%ZkMmTAAnz{)s7>@*%T4qid{PlCE{Wx+W=_s}dpt z)}lF+C%Iq5^~9r?p7^*d3P_&Edp*4KmMCLpUQ@1GCMMTWTX#&T=k*RYSJt%Nk*$++FHz2*VPn-XYnPU{g&1j_NggbNIr$?v?<&t&C;5EKusB^ zr0D0;`C4q@ZKLE<5CR}vWJmvE*wZ4nP$h@xJYzy+Re120+ z(gd|v6-I1;mV|ZBDP(CqL0MmenEa^tYgDO#(j%~SuG%v%e~^ND%%L@NCpCVJyR`>S zQtoNAcU{eLSFxq_jc~3slpiL6=ci0&_<&2Yy8E%^mXbuZJ&%fzU&fNw7qoJ9*~DT6~x)zAjKp^m$P-Tp2_ z@yF`V2tDZOzoY80e@BJ5?0^boa}c&k)g+ztLOFazM{%d=jG3bF9;D`{(6IZ;cDjJ z2WZU&p?9Es7EQ3!cboH$soSZ7&n1fbUKrH9lV{Nz&M6amv)qXi#*2Z%(H*Raj;52} zrF?e zb4tgLXx6*CE~&~$xk75LzW&pxtGg*9pCqWt$hUExQ$`(6n3yu|I$&}5viYE$N_BX> zGEd;8t;E5`*0^{KZ-*EEj8{;0T5gWm>^by@Zt`neJ&6nVF#b1hvKc2~PCvx&bMbv< ztMamzbOLds7%MjfY?)!-E8L)yLrOrDjTd5N) z_K&Vm$Q8U=v|Jq|n->*d5uR=L_J;juyuI-wc6xhx4*gYyitrtsCX4;RBAWiA@I;SK zQZ4o~Y;y(R-@@YvL;UC0t+7Ik=?r9qe-UW{njV*mOA zvJKI)4MDcP$TkGoW>G_fa3pvu`m5b-Yj9iF=+;uzRbgWee|f}Lqua_+*wR|nx4~Ck z(tT3J7{n6BKldV50S;Zr$|y?~S_nsrBefPsTI^pfLW?8Kf_;ak!RevFC2W|fOGJDE zpiH#1J~_qGii2aXMr85cHqz6Op0O&P{{FKN&A2iA0vuIbr^H``C9!vY%1vlh4;AQI zDw+PAk1Lvm)>bB)K%rtNRVIq_I=8qP=mZ$(u7NyuQb8juoGq}=T@ylQO!XY!AHq2d zRJd`9O?|P&{^e41*R`6p*Bn5%yv)Mwn-+(jk=>3{J~^s1)%o^N7sKkX)V~fW;#4U9 z*r_t?yH`BHxU~BYV2o55_N3kujK57%!T4h>7MM=u+RcKqcdF8s&#j~C=&Cn^U`5&1 zuF-mDqj(s}enm3}>{-c1iMe+R&DYi9PGinC$rI#@r!CTN%_BG+V!LIUtzrG8(OOFZ9mQi0hhhjeykS&@ihxKXLJOp zJa%)FFu&I}t@%QW{dhakeN+|QLel}V{tDbF&Gr6_cf>px$+ZCw;zHiHkQq z9(Z%B=U|*m*NA72#a`wj%eV2!La27{rghu^KG_|x$y@BaXpd%Qa61KPJL3{ycQ^$o z{L1oALwnUEZQL|X=I|Eu8sl~Y>z?+#FWaH?-gqNGS?PrB!UfQ>?rLuv@$koQdM@kP z+mE(VOemCrIGYf8x6s&088YWpzYtim8AB?TL)(^gun&C*BitxqZdc)7Gc=Lmi#bfa zchs8ZN0qlQs^^t^N1=T0$bM+9XGae1Ry*>~tExG3=RUT@&lCO$RqKzAs@B<9743r6 zVlUm*HY9HgCXL9NDCRbcV>}so8?O?jyHHpe?Ah|?bJdowZ>6%^p!IO7y^W2AifA`z z5At4*8_^xuhBBb`Yv(Al1wwHGm+|c2=UY+4wLN6te-%Y!6bYyN5n{g{wkGASi*9)w z;#p~O6MXL2CVz03OiznoE z9I<01B{)#?byv;*nx@pe9dwQq(0Qq&!v$h{Ew=9*!UK<0@KL*tchrTS54jNhnRB+$ zXmp=8+cew+T*a&6ffd*WopYb1b@f`R6~+G3O1NrGRLROP>MHmHS=!uQQQP5wtnhO$ zSF@iwm3nR#B)KnK9ixV6n;JztrJyK({q*8E?=5QOm`=(s3;vX^7Xy2|e#jG%U#`~( ztlnaO*PAN!;;;#RTrSpHQK#`R+dCCNW5X)=lWGc}_}`3l#k`2)@ptS9B?y3M3#AI; zz%l!DKu3qipK~uVTQ^K{^{=AUlb~!9RD$|(6;%u3U}2w`S_JXF2Yzy02C-MHLmAi3 znEex8GWeT?AMvoMo^=~91y`*vZc~oS(h^bhns(>MsD+^_SF>%wZDT&S`zu5s$vd%?SSX#f8jKRV~TCy2HLUF z+jy>sb+Lb(;4@*pd%W7}S^mTcm3pv8V*jaCm1tWxDP?^Ap-!>9t%d8g{rv`b7OlR; zmurK&+JEZavEAZ*N*$dq^>y*@kDHVp6%XKL9Mqk9o-R~7T=GOQkY4o?L%QU(>)`Qq zRN*D^i3UD2P7iyFUcI2pDtB?&3eNZBHPYSZ_D#GpE6KiMU~jiaJMGG&oo+OyJlY8w zySRZ0ELdN@Ig4t&#d$v8^I1>TXsK93UsjfOuBG15y_D}GMqv3+?jz2Ip+|YJB9jZn zTK8?IguBJAojSnM)$P$OdwDNUvi!?ZMxj}_fK%0Xi=i+kpw9l-a=vq2fy2K);iB=6 zS9lVd@-Qa|?R+aLHF*kb!g|re2 z0pDMo-+hC#QP7()#`Wv$zc^etjjP`uKsy-~Adc$t zLObU96wDJK_K&L`73OhtJJc+kb(^5wh1c{;T9-pz>@c2wHqDOg-p$(7EaCAGG`vj)=U~z1KAMjuT9;_}rBuG!e~bMc z<~&HpFL6NiK5^jiPg6UNSZ%CA4T_#zatY<5v=NI!`2i>&h4MIZdY>4tFQUk9Vnpl; zw-VD(!gZ+J{`L-(h%^f)@#L5G!ENiO4YsUq;sQw+cT_!R{h2Ri4-x5cqE7XOPpsbw|ZO$vu< ze+=&?^@KR?MTtG3zkFt;te#?MuW2p_wm6TJXyi)F#vs>Y>(wcBmGXYv+<4)rdSJl% zS-Hht)@n+`(T&|^2aKDvSdGD ze+b`5i-^;^y1kjl+)caM#AA+Wtcq7E?Uo8TalBNR*ZIg!r$n*XPXs8k=0#Nu2}ioC zVr=2Gw$2yxTH(W9E-_X;jhpZsrsuXq zvf(BQxh?q$Mxzjxd+wFM*bN&sMg7EK zd@{G6cwgYbv+7WYKjGsonpoR^esg~@VwBrrzhI>&+YYB1&IcxeW3?IR}krxmr@r7~_)R2=L*#c=*nVSEklz#Ika zZua~uXq1_h8wI()#-a#J`e{1V55%y;_%=|Cm^Q(aDYgZuOd*s5$H`ii>fvyEK1&v6 zXRZ;l{8g4LVCQ{TIWMm{m?mR#59FDJ&*svyLC|K4`Oa2EFV^`rYJ831a^vn-87^@5 zKEO3dJf7Z&%7%1Y1AXc?DZJWlQdp-=3Kb9#UhM?Lv-|;wATUW}T)ZyXIh~n>ic=)V ziqAaqx%$|N{nc=Q6^+jE-G*q3J#P`fiZ%;2exn2U1xyNlKUX%xG5Osq+x zQOF;I{Ma{$72g>Cc?$Bk-6G@rPiT{OE;KZ(>xJ@elH!%6C=aIm1iJcQP-h&;_lu$4 z+fV}Xqt@xIgjV*lVRZsV(bM*%s~E%xFW zboqX9fv^O(7lw#~g6sGm4K@hUR)wmkzR@PW$)0k97f7LG8zKgEs$*DUDmgwiK#jjW zL|iiPph4x7eLI0FFJMFmNK!qSZ?Pr_|GJxshN63VJRm6!6c*i5Rn7mxnfeEyj_h!Q z7BstMDb+q8j`2C@uQXk9FpNTmiM?InA(S)>)f`OZ={sUnxC=dN^q%-#JxRsy?zI|# zL7o6+Ox2`)`O%KjzW*+MIjEm-Fq2QJnrOdC?0Mg6r(n=#=T(|uD4(Lv&I_UI#$n;G zfh~AFdOUv8vu~S~k-?QM5Zi(P+7l;^(63=@U10C>tFC^m+Tz)doGWTSKJHG@!!gW$ zlssJQpHm46=ksQ6cGZJ!cGZJ*9XYCew5yd|re-%{%3*2-G5v*)-d@uX!tW_+r(_Bo3o$w+*IB)wW|_>74d8o$CdS+CMypEr?DX z!I-Nq-8z35>;mKCwF($>yQ^UAT(5#LrJc+#&}6;`7?COizQCfDWr_yI^DJ5+Q+9&k z|FX3s7<1xOY?QhwPk&LBr`ekFR0@MRVd2+{ww$JrEE6#3UWF1n$_y8L+ zyI54W8l5w89gN{Bar>AiED){cqPpYe1Vu)O-6{ zOhg^G-i7Upz+PU;<$#vDt?G8@Ol;0zJJk5zC1wOl=qL2O*PhgF&GstRY~%2@sj`Z+ z*mtf|zfJVfIMG)>l`6(zm6T7-$l>;_4g2!78gew@_3SAXIq!L^ry^#Y)68k_PEbTI zzlH~MS^!FMjZJ3Ng$Y^r{hyV4~Zit>>1@b9YVOgx5_1e zmc;@dH!IpR%)HPow(SMSEo0a)&H7qenlES;JBxVNz0RkmAy0|uIRd5-rh%J|>8!%tk{4iBGr$g3l8+YY#Z zduEYmk2CkFJ$?tDx^VCD@2A>&>@_Lz4t4SXX&qjA%d^9oq z^4kelzv7BJ*8L6-gx0Ujp`QI(yh`oY)_rVa?TS;K$|A7XbVz}4o&9q40ay8w8y(9(ww_`p!^+m`k|`zW zicEP7r=gI-E2GJ<0^qs<@AqxFpj^F~I40N=&fF_%J9^$F3IevE>L1#p3c3u&j+?w) zz}SJ<-?GnQPZ>(qN5nyRbFttN7_Q%PTNW-niehea{sKP~16yvHusIp_w!>a-y3WD? z&jCoEg}mUTqAgUO33i%K8C zMQ(jMtW9O<>7IR>uPo@y!shE1`xLw*`v^B`;!bt#<;DPM%m8kEn$HY?K5bq}HIG2S z%5vM(Ok)MwO*+hD1sZ+Y1O@t0psaw(9z~bZ`S2FL2bAH5)24w}Hm8VBg5IX5AV)By zdcej-$GbRFyHj-vmXra9I6b11SDQp{4Vc1tX+{Bd8)B~En?M_J8+oeO4Hm}^G&dQS zaHfj=1`of2@@$R?;&E0VqQJK-?ZZzZzO!4rpxPOS{7JmXlqe;tO>lVKo@#nSp%dYsG4O@^< zr6n}G5;m+te3=@5MA?tm8cs)ip%$+^x}e2RK|EWdxkE$T>fvSN94+4L79WoIq>*FQ z0@K|Rypb?OE0F1mFJSQ=qQ$Rqi$6#5G>EbZ8 zn<`(*cnV~{i;ABTUlpq6P}EF-woa+*h`x&at;&MLWEIB?mkoY|@#9m-Q?e*kYXPgC2l9%)%>cIZkc)sFkcwi~WR`v37V`oQanu zu00KN{ZML|C5F?4r$k>mgmnF7%9xG#y|%*H;9M*c%IAn(W0fwr8ha^SX-s)5-r3li z>#oL*$<#bYvCHCXn<~q0Ox}ABEu1Tk=y7a1zAws4G8QtdX5(Fg8&|*@Am*3WQpQ{{ z{2qR!+`FyjUK|;=(PWCCx84x$rZMxxDLKnJvdVEa&VyBsWw{9CB~Y4^RgM+7#WSI4 zta7Z(6~CGZO=Fc~m2UCp%(@&Ws~kJymT(9KG*&s*;1<6V@fxcfYjKO;fOw5nj>~TG zD-f@-%JE3I_*sZo%$70ny5lCdgb7H{Smk(=-CL{iTuO%6E!dBz z1I(`K8H{2LB5QRdWoC#ygly;<8Dc~ZuPRv2RTvL`v?t?b4`n&YHOJ&uC!2+pH<_{& zQLA3wfMBUkK_11n2dhgA@?1qnHR)KL>XycDu5&t8BzRaR92aXw(%?nntO3h&L-ppk zc-Ju!vydGZ7v{Wuqxau1Q?CFK8&++l%0=M7IBHx3q@|J9VwjO%Xr<`IAaZ6=d}u08&=64S@9;?aQz! zO0RX*YgS=jW@UeTI9m}-z>sH+*K>39Mfm1%UtrQ@0dxGe96g8HvSKQFs|Q9BxvdzT z?g;1SDbOtVtWbB+t<~ielnJo#;(n(1FwQaLAvCwj;`n`)aYt>ryWpVNP zNc?wrj$0OQ#wpYaAqrdFb8Ox5#rP_h;&75hHB(!w8_0JlgiAO@Ed^HBQR-5$U(XY& zA;9t53Y2m!V;oIK(K?nf&*3d+57=;s7@_$B*2;ifY++!2)AE}DG z6Wb~28D#krb`G8q-y2nnij?E5AektTMHq~A*wuROD2hd@h(FQ%-{irik!L}{%Td*{ z;$h*75K3Dn_UXijRW!Ey!mLDL@4R3cz}sRgM+QC4A(sD1TsSTtaxMvSZl7o88YQ)J z&s50y!)sY6jaKweo;h8&jHY-_@LTz z;zqsq<}5MLn5nG!so+lltgU!y7D71r122G0)gwJ=Eb{=hWQh^o`M6;;plrL^Y8ICA z8VvhhU*yxs71+>SqMQX|R3Pt275QH@Q6|!aCE)oL;>$UIgOtC1RU<6bxZ=3Rj1IzD z5`gCYSvr|@16tjfJyFHN-(rwYS({_zvdu!~dJdyL=Pbf2aMb^cHj6BV{ZS!?e87_z z$2?A(o)>%iWwfiOFI7JeB;b(v^O$GL$oB>Dg<0T$YfOWz*D|2EX7@AGAoSWrJ66T( zws#zw#jM-=qcP>aDk$Bo0e%_f6utxC#UQ!u=&Uz2ynsgWdB1EC-)?p5Vp~qLuy`jy zMd~4B;FEgU;s?+H8_y z@I=y2ihaf`ESLs#>`_5-r_==}ke}ZM4AF$PJ32~P45867pkoh!VKY*x#nHfJcng@v z61QJ|3P3zxB1p%ntQ@gV+yJfXObcywp!^K2d^*az_N*O0?nOMfJAD)F$pHdq(DYpK zo$x$u4jf_@(k`J!?FH6r%B+vLsT8tG9Oi*%x5n^&p^R0)^L*fW6+}Ni9Ww ziI3v`8?fF_0Jc+Ci#>eiu{{Wz-ShiW?rMm;3MyVLzT;P!nYLH3XXEgfqAniXpPt>XN!|jaL`KO{@AdS28=8Y z%n2s-bC1Hv+>3%a*C8bEcYVylJQy(qlg07FIv~rnZgX5Z3s6DdbM|VCqe<$Mxw-EM zX5^oS{H|>)$E6*)IbE2P=Bz~lMca(a5v&{Q;{)l(HRANivyWn14)42(4W3iP>|N?8 zo-9V6Olq3gz}Af1i(b(G=8jW4rR-{|B29O)j0)BQ%Q!*K9yU+m1t?Za&04Q$M6qFC z;x1+$j*HFNK_M@zqLHP5(5$p+{SrGJFN^mHPlKgi7B>rDCT)HNvhhpns(3FiN{$wS zMd9gnWO_yH(Ph>R6%l$x`$N@bl=cc*jq3>Bm;0$0N#MEt>@A}6oY83`;mrgMysz-Z z^E{{zTPP|IIrJK;uQ8vDQdS3Fjil*$;9KhnhB!9tD=X#YiGu^@DdO9+vtOmDot<@# z8c^MU(OPxUYG=Q~Bg@}k#i$L@*mj7;ae>7x2;Uk&nS^6~6W57rvAbBiPV6>r1~_@7 zQdIXWlV8W;Fz-mu{ z)m{@{h+|TWLhGzIMzIBzM%%ZCR%ze za$^Q<)~ID6*#;wk*g)2NjO}z*1zA-XqN1v{kP7m_c@Px&;xkV_c_}VlZ0Sh4Pbz~F zqpPg|>H2$;?p=+!j=Qdzg&8y4=)(yHP<2;>%J6qJAx}Extq0)SsB}H%&RG{U$eB`{ z{cfi7>p`j0Pf#pXv+5^qQVXiYd-EX$py6~k z*i#jnwVo=apB7CILnd-LNV1TX-pVmd6Yu_r_N9*it1O|Y6`?a z{lxbDN`*O;>-@Vn>U7f(&rC&~5Jry=Rq>=4!<5w&FXlO(qTc|%9@|IBZ-`x;8^Wic zp}Zk>>ov6Fn4N0z>~<=a!Ed13kUj7`WRKSEucOJZ5wL@~H@Y!*hO2j9r_l6`V$Uv9 zPiTsg*6Xh`sDMjuBJ_GV{d1$(t2>zY^mTO7Ws!7z9fwXrSDK2uafLXeoucSqSex** z;vgr-;)eN8X5lg3xb;QTs^Z7U;3 z7SBf!niRg*ovw3>=VuxfSs$Z2ea$T%o40K%{WHo$2lWIK)fBwX?Of@fQB+qgejMTp z)dtQ)xm7d(@!4AZNVoU^#Lv;*Rw+&zA72Bs;^Fm-Eq8tb2gf4-UKyI`(LsrY1tDf`Yo{Lq+9<>{$wqG3gy40 zuvz(A(313&TrBoB>Y=(Mb*IQ;sAPDBsTiwC%TcBWQy0=SxVL9JxstvgiGo#V7hYAJ22*yBFSAx%K1F)7FB0tag8O;oZKjjW@} zt>S9|D>b6$87^idX80KE-$Tgyws_yfiM&nEx=IzeIfh4%k5-rki*t5xF9VJI58jq@ z8R;FjydfPxmJ@NI^=+|FK)@ZE+Q0c7O!Nb^h9c3>5N-&KxNDLcVBhG_2%qP1le5i> zR5?50Dp}tV0|Qm`uwvlq&^Jkxk7jswdj~pdY)3f0*=}*%T7{b3W`*BRqGrqr6DDX9 zJOR*|ROlu;H9hxMuAz=msKaf+@cTN{0jt9VNgIq7Q)o}M5*3#d?|_uLA(UBynbr)2 zzC`R3+qS*p>QP-j>?~W+R+P3liLy9;yNb4=%z_z5XiLQS?zPA=8d;(>Wh)w4c#R5C zXU1;uHkem%*l`7uAQ92MOLioyH3+r+1YbG|hFT^!aKe^e!xbHMJq zjNOfuVYeW)t@Kd9c*>l znE4W(8{Pp;{KCfam%7oC4`9;&c!zkGF!mB6Vr&gN#07d`Osg|BO0ReR4fED`X3X*q zQKMH-SgB~yZ?$EVinc&Jnh|*rJ9jH7{~)YfSRNb{kLyQmEZG#X@ndr^RaWBuZXdi$ zbO@VjD04{sP%relVGBAU{@Pi;$L9OBc#otnwS{~metWO5tk%~2v$(`tKgX8VBp$g} zzn!AJ3=iSkPRqOuzrd7c^)_^qmdOV1C|j<#LDYL^J6e1S;mRo2#}H{N_c2&RF*ar} z**h7gN%^v&bD?c|XTwikqnl+zR~?)eoIhL`TohakoCz)g&J33fmkMWvOM}aR%Y@6O z=pBX-TS-?#s5GilHiXo`oq;7XN0Ke5hhej~Pdchu;13r~Wqk~hxa(s`u!Te!UeS9eJ6fJigUh9o zzUXspUqg=GJI~Rwx&*F*lKMNd@9%H8yHif7qvaE{>vVgYT>q80g#RV%R@Pa^|LB*G zU9vo5PT1ll%fjZ*U52+?b{IO@9*r}+B>BV}WJA0R=TG$y8vde&s}QcS6~!AK_x8?o zwEPo2`6u>m%+6j+pJ4b@?_)`n4Hn?bl0sn?!-q;ZNhceUyliJIhRJvP^saHV_Pz|) zLSc^sEy<4?{-w_;bF{`Jc)Ec@)bK!GN9&*}?f)9jJRQoMLEcD5>%f-(IbZv7Iqf6< zZ-xh5>i}GiXYc(xWbjOHhp9UOJ1FVDuVc`%_Gv+$5d){I;X%c=Gfx=)E%`ju=x8;2 z!G%$k)j8lpW*HteFcaHeoom=9PCzB*3PJ#h8-U*u>VU#Z4%JiGDDuJAb7^?!Vx zqxGR`q$fLC6Z35O>4t@R?=(m2!?|!p)U?3a=A4Cw(1?JM7-2J93Y--#11`&!`)9+i zLU)9RA$}O*hGoHlVulsK6~mQM!3M*9_a$&TD8%Fi=MNVK7Y%2ksttz4LP83~ykWSH zCck0G&f(1eL6`HNY#eRp{6~A=nvnCKMStu68~^_-0gn3rIQ}CN9jzlEJw`xujez7B zu?#NPmb=+dq_@Qs8J^V#8yu~}A#;X@z(v6gflGi(qWxP8`IPde!Otsf-mLVDxpRDI z+?$3lUoAAe*Rwu4N`KSvU!(mUt+OF1W}D#9;%rEc*=Th(TAhtnXQS2Gxo|~r+u`!z z%Hj6IRl|ANroUzQLEjycDQzU287>9R3I~amwg#@iHhrtXY_yfW$1|hO(fVeAr`ysl z?*DJNeSQB^*vN@nbheQ94PCnr*zT|w?uR=AcgUEHwP{ot`M%wW<6r~ zSR9b&u)k9RR{>WG*Wj?1;L}a98NEgKKoytGwXC z;7oAIaA|P4a7A$CaMfzT(ldsi3_1A@`>hg({SQEQ3sABD2P$!fIZa7NoRSWR|8P3= z#DQMe(TL(M!$(gQ*8<-e=Kmazumb?JxsljC_YZM6x>(^ZI~?~$X@0R=nA70yMI5K! z+u-J!9FCBBxLnosNOd^6H)^iM;b;rvKgV;pTb;{wuhr*t6GvblqyjF`aobb|zt&;D zo&g`w-q??Ij<3W1yA?iA`bQD`=??qtHSjYX_LfZeYtSR)*H<_kQW*Ri__^=_n6VN* zfV>O!2wo0{oCH6{;pmEVA0y5CpGrJbtKASAnki!f)UR{BZ6-SA)3A6ms5h|CBP+v`0x$vg`dF4iP=kS>56= zG$Las!7Xm2!(pgGxJ8Qtfcj)$r;JL@8~W(|srtO(AsC=^`VhBLXB>_|FSoc<{Kueo z^(WH>!;|`4D!gFm{a7Sdn&B!YfChR2OS($8xI%}cHwS@T<%hlsrHBJ+bj@yY`yGxx z`Dmuz=J&lJPrtd|(6tkmJ>L$2TL!m>BI^yqaNl-%y}^;gICuWAno2+K48Z>r!k6Le zwK%M@(yzIN=OOHDnX}B74GRofUiRi7?CTa@j?P@*F-bfvr-Ow<@64F$#jste7eY97CG3n zQfPzX#W$dudViY9!DW=g-X3~~y>dFpiNB1bi)x~Sy#flo3a^af*~_AtSCI#%j~ou> z(L3y!=^)2S2D-?>7ILt6oPTwog{WlDgB_)zxzG0Z}b6kfEc_8NFoZ%CJb~PCuH>$DZ zbJOsOcOEh{;U3pU&Tv|wMa_osk`hT3&4y>BCRwbu+6LV+bP?76G`7{a6{5qN9CFv9G?;n!XIIRGLDV@?s%i@NzBTIM5-^3IpVzh^Xo>5%%@wxkoHy@Ahft*Ckk`2|bybg{GaqBMu&=;?c; zU#FvnZwdkMuP%T;*6G3zFd*Nc^>6k7G+9mTkKS-%Ehp9i6LlF#9N_8#x*D!@p)Lc7 zYiPGDB}+xJc&>y#?jv=j?tan$9#qi%!+sbx^{-DC>0deLO{hj4w{KgxIc40wWjw0m z_I)+~RmSbRV*aa)+jq&FR~fhOl;Kv!?Ls1FP{!@M>3%Hs0q2AG;wOfLI{`R*F4Wx% zETq9@B9XH0m5O}o{Q=uDovueD?GBI*$V2rJEPU=~h&hFR@|RvR){n&hM9K`1Ot3YH zm-f)E0I5d%`(mK91oGgYfl>$)dwl`j(^Y!Jdyg#sqgYUq<7=@F)O2!~F=(%0%=+vQ-XtNw{A zCX`oEc)60RQc!rgh+`GfzZ%4U6%<}J@LvUmKV)-W1%*Fw4JzsXc#ShCDEuLhrgoEd z`}~4_{~Orpb)7qL*w43IMb9jNlfX%~A3~%Mg%E$qvl)6wtMpQ#EH*~dtD(|C#?P+> zG&u}VD}Qah!leiG-UYJQRHoDQ%V4sOr;mC{uS-gtEj~gTulEKG{sFS@e@SVSl6wJZ zK)@eawpqQnwMJRIsiW1srAlu!_Ioh~^A=NEH=5T+N|3fAu8cnFBQ=6643L*4Q2;>s zYkRJ*6s&)uH4+q}qV0AH{;FuZ9nGHgJi%C*kKhZ*9QS9N*vh-Nmq>$>}XPp?RtzfOz#Zz8!X{-@GY|8 zF3hpRR@xxG`s(FL`behm$2dPH*2yTc{{b8f^5A;;gpXIO+RveWUH;C#92uKGnAJ zDXCV#G-`Wzmh?A4pJ(efhy5noPxIKf+Wwj@J)zf^+d40lhKl+WYIsI6*|HY{wfcNp zOr|tj&v!5~rQx-7b;L2IPBdhc@VgFPiaAGV$Tl_T}AeYRE_ zBBEWubQ_ zl_nZ{^yC>%pQ^@7QR+0VyQbD7#mK@4e`-iHzK-F^8V69UR5Z@Wmv^e!E5pS{V`wg$IAsPK~f@b`JMIf2R8z1(|bwO~~BeE!$QPFr*l26s+jq&<9#x`&KU zb-BdFFRSt1nCBPfli3W&t!~k;%0e#_s$*%7R=nSmg||y6&x{e80;!_o$%Erh%fen? zsxSjsZmmg;_US7N-Uezm8)y1efGCo*=zX#}rwNk@Gz+*}ToI}*Ae2>WbTPYM|L2i(S z1-U9IjlDD~;>bBvVL_SCN22+1wM?gXWuf#MHE?nkc_krpBbkyADx_5Q@+gbFGgOph zTmo|Ungk^70;xEWd(Tc;+*V3ilaOl-6>;*Dkw{Kf8;~us@IwN5O-9XyWSXoJiB5-9 z@S6OAEUX26ibYy(n=JgYhq5LcdkDWp;lds&t)vR}im7h0aVF@^^e}LgNm=m1fk-23 z1sIJkV`Op492Z<&CdtCWN~(KUfvfppK%Yu!$zYodsz?Sj1=PSEB*+wGxlE=h#+l)T zK<65@LVwKJPb8zlGg|m@S-4nD6;q7yewD~pqeX9*g|s!~^$38gp|nRZM#VA}Jpv#b zsO}Mrb~Vr)t!57NVuh4~9yRtD{BR8FuG8WH{MZD9^R@6}vhZ6e8cEW^8M1KPL}`zr z*6mdKsPW-gD{^aG-*uEMG-o56tLE+so+`y4>k_r_B3WE6Q&b9&UxnxrExKG5(#-%a zOA8;6g)w22hHQR&kWGW7D`dn!wo?(JV`~syq2>lq4~W_(KUF;Uhu z5`j??BGuYM zSIMHEiK3naDw-(mNq`1^deS(sr->;=Ltj{;tiR3D#u)~sI6|o5NemjsQnz0njj%Ul zac3k2O*i&<lsvoknK%swi(3a;+Z%z%_2}(@Pd7W12zo6s9(9;QOq>NbCnX%hdk$DU^kT zdK630!o{*MsKhNlsBmX4!k4x5W3piJCG*pO7z_w6ya}m!YHE~O77p`uSeWno(Z70prPOT!!#E~cQl;F&69(lFY8f-D+Z$UGNZUk>FW zU#+Wu4z%@Ul!s`X0IQgbY3G_-p(a^;pak%3SGyH$kcDUJDQF(l9OfGh+tHb_&?TR; z<^kTu5GtLAUjLFn4G4Gn)F1gYSutP?Mx}4~!xFo|VzA)&|`x3rE%0n>J( zmiv2Iu+KqQ8`(kEke*4VbO5mox|c?mF|o360?J7`sQb-C%0n`cTAFTLEZk+Fpar1j zWt6(W_*Bn(nGCebV!x5aC7>WDcgI2ibxNVS1rQ+H$+S=zpuB}B+(^~zRg+f+YR;o5 zc;Tfe*`$Jb|ND^Pj5@96`#+V1YmJn~xeF;T17(Y-I>UHBL{UqIaky~5j!cWt2S$uG zK0+-nWQzeJpkeNaTNtE2AW5XB=cf$W<9rPRVm{ENTLG`l*REE zB0&QN6|x7g{`Re=Qp5`-QB=Jc5am+CV$3q@fC{}?%{FX-EbNfUv;+!86KXx9MMIQ4 z;6-_e4sSv3dbKgr09p7~BC^$~*-Rs4{U0EWCBRAnqP4*@t&_#O>Jio$*Yu_=rZiJj zrtx)V5Pg(dIu4riOD2RhWX8P$Eyh4~ndquLhP;*<2R^+t2hl9e# zVK9VZwZ7q){pT?lT7AQzJXKpkEXgYL!@*mdvXH+(%MW?-K9;~sL6K&vUJ4AR#GrVB zmb^n2pRJ|lrRZEaph(i9FUZ0`$Qb<`EezuM0Ji#PfZzg3h3CgG)~Kl?l4K!c4dp$9 z%GZKB3?*884rF-(Rd9A5ZB4R__(T@ItH(kbAXQV)vmlB6l=mzMat_r!3x3__PeIGj z(ls(IGrlNH#RkVR<3UX2S<8(%(4L!@BhgAhe*#bM!8kidD*gvq_@J0l{{(XQZ6syE zf8>4O)~O;V0M5o{^h&3~moP&X_7@_YqJ^Qpb@oU8LM{9f0JS2VtA#hn!fq%(e*(p4 zP}FmPVhx#}14A`Y>2r|l7$@gAjxNQ54^-u3n$ag@p=S{_Bb&P@9Am(ogEd4JNY)IZ zb1J)IV7IKq%$|kp#jaY$ye*3fR$LOql4lR1HCh}yN)`(9$+Q9;FG{4;6(FwMFv>%C z@J1Q6W~&_-`;9D&4MDg;3j<*zDp1dME&PWpwANAG3dmFzy&7pJLdf@nCiy%%+(fC* zW27pm^m%{=Wa>1+9XCQ29ypJydl=O+3VH!v9hqOi5V3(s*Q}D~xL>h&Xr{auz=~yv z)~Iy+SjBu<_X1kL_`U#?W>RW4@LWPg@J3^loTKtkmMm;-Lbyx?`k~ik(JRA+x`(ie xd@&zkZ4@8cEekiADQKnf#V#{Y%(-|qkCMfQqp5Ty+RUVC_L^)BD~%&2{2#Gz?8^WE delta 68134 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 delta 67591 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∨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 E0sO?_zW@LL diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer index 9aaaff86b69da747ccfbd60c14c68ec024ddc724..55ad7cae4e1170ca570944736a8cf00336285fda 100755 GIT binary patch delta 123560 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

    &px}0F5LUa@B7EXyq-C8=FFKhXU@!n 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 delta 118608 zcma&Pdq5QR{{KG`HmWJKIIm_K63pYK#-xC;~pBy=B z*MLBE*MOf(r>KWGIy7MPR)<=;P{J(7$K3o|`X@EDn1%m$N;A}|0l}DZt!0cet!GCy zt*4xCsn=7--}2J!B@VSYLBeDuMNP#;YO4!rNqecjSAd~Q8N!V(6me|$v}8o8^??@c z?HLZ$W|M?z{R5U%EOpBnk~Sq^iQA$*GuPqtM=KA6r9gvf(ySO}AOFuNGOf6cXXfkfa^6{+3o(-%eK^3Vfu!6cMOO%89`1of$;bnuofUJct~9OYuyPq_IR&5K?KyR(G^0 z2umpmOir`8W8K!9q>!L+hkLGm6k#gPWsw$jS>$$#bIA18;&e+@6+888ekWBCN`%$O zr?R!(-0PbYI#3!@)sn~{EXjR?+rD+_)+UWsE4HLiv4;}id0QdhvxW8 zOqtex?!87xO9lq1O9n=|NB>VqBTOL;lxizfJ*4SUEg}8G2&t#2;;uG_+AvTOrgf1T zE6(bLFj{KF6|;k0dIsi>YP0x4lakw zbzU~X4)25a>6|qo+D3n=MX1$<%n3FeG{H?eFPsn#TS=gGkVsJa1R3rN_tiOdf)%#I zcAb+aq^Q|)M~v>T-8{t@0)iybJ6_#cHM_Q=)*T+wJ=~!#!`HGws#|%aLwD!fv#lA` z6@fO1zf_cO6Y*P>Y^Qh#!9KXF-K%Z6>}y0`ZQo^)lCH|<*4{VosmgOpAu|0U9hd2Yx4OOB zn#;aM$SK}!u1BFC^)QZ0r3?Kc2zjkbsVizKEnMH<)`3&mYGWDj=lO#u5uVv zsK@Em>b*OY7z+k7o+*hPdt0KETRX-$H*^ZON7!v@u$(uiu{0nf&>liZ{K67yx03&j zguRgxEdAZc)4|_Gp2BA}yKc^~T0>-;x?PgAh8~<1cZnEFcC6l= z6S!)QkN&;G_rHi3%UxATi8uN9DLq!=tZz?yNEOpwPh(I{QX2*bU{Z+IcXwljF}f6W zig#{KmNG0Eah_~%yyr=;LzRX|SfXklViBel$JbU2RhutAf6H-ql08E8N)~NQqG%TJ z@jjh77Pn)DFfwafrZrZ`HuT@0zvV3MEn01|ah`az=Q-a78SCdu^q7Rl^0tx=iMxrehN+3=Z%&%7b??UDD2O!aX1 z+PP7~#%w8OnvTpn#>zno36v%6A<0-Lh(Xw2`+7Z@{iR*uZw9UHWoK0M9EI-$WCa z2qo;2D59HYniJT~CTY(GT0^X|(=2zenW;4wooQ|LB(I+2efXO(_MQB#nt+GSlrm~7 zy4Y$N^_KT!6zD0>5i^KbFV(uOnPQlgJD=^7q86~)DCjA4TSjB4Bg4M6c~OpXuuGrz z6Awz-3gwqBBZtgAN@kCVF(XKpab?AoOAIQJ8oBCW>K`Qq*;>B}w_Y>)|Qs(JY~&Eq2HD4z@IP zVYG~`88u@&^Blf2q7%!#+P^M}1(ops&cz)3|2m`GC51fBq%j6JW0cOJlY>eEEGh%{ zyiiBbJ`VQ5EJu_^H>H%a5Oagvxt_8p4(NzI*XI+EuYq!De7f`+nl%j57J@g}gNz3`PYx0t-?CmzdVo^?Ydo=ROpvJ#J zo6Oi+aV@f*@vHfF0)jbKXT%HB*BZ$CIJRNQW9X zRKgNPK$us%<-AyniZvZO+>g?Cq0_bRmHDg(kdS$ZiShmWvG%Fp3H zI5$q5=8kYzyI0M%;o+%CRy)V@e5=YO6K(EC^!(>f9O9npcHrWXNwVE{cG1L+8Rxct zSN?N(r;w$x-S09RKZ$DEPz!boC3kL;6mpYHx2cF=t(l}Q92$U4vrG3hmRjr`ZT2um zz`}Srq;q&A>l34xG6?|FK2x5&rgv}O#Q=qd=klStN8R7s%3Ig;;DSQJU!vM~m<5Ye z|1DWG%fx;*i8aON=Z!4%pV--Ej-dqCn6@U?YO}eQy6+@&W${wT{%#o@{mq_2m>sdS z_0kk6FhJW*?qXAb|3E5M(M7^a%;Zs>V;&R`jRARkGyBKFJ+M+j&FL;_kXd_n9_xo z`d;e*+KvI#PIz|0>(~<>7=pV00?^M~8Ktu>(*)+^<%Rjh@S!oK$Q3kZ6F zvcGQ+OMr5+?}!OGaL(|Z?ysoCzqCa6LX#-HZ>Q{c+tg>s`Aen%J1{H@?Z3*LeowY{ z;oqg~@7JTx>M1!aPH)|2wdc93rX;2dnzT*)ovT>-_qJTC^yxpsGD4Zr|K*@6d{qrs ze(c{f;O8VIXh8pf_-*2!EoK`tIqNX778R@HK&iRZrcRe4)D)t;_^y&UAm#cxeAf+k zyDqxCTJ+CG5zYEpq&Y9irhY0llI07oNOcdM*1u~MZ6GP%Lr|ZhW+^`p7=3-a5t7<& zgfFCqb4Ey^dPwPnw7VswUHG}}ijZ~@(r#3{@_;R7STrF;kBBdNyvVD)d(LR1N6v{h z+AqnPQCjf??KBxz$;u8}ui%bJaYZYNNU!p}tzS^*i>w$VB_JX>psq}r9ua9t5qkUi zzgo1nlz&D{?2%I@+k4vs>~dyEV26NC_7!OsP1fD?!_8k5OJq#@3_{OPMn?7;IWJMf zcr!6(qh*h{;2KZ54xcr0cZA!YKwA;SuYx4<87>RF>a zmYx;mQRXmGSBa}iC4XSA;39`F>>+wuHa1JzTCXoH$6L};OInn7u1rgya33TS?_#e~ z8);WkqpU#_aP+lT`5>~dqqa%X;=G~-=u3Nj`CjhI35jBssU!9}YTv89*JzZ?u|`oc z1022{fBtP{TU7t<``4gKuAq`h-_`BpbYewk38Rq_W#bi4CyNxN1rZlB}+y5si4 z$jMX6i9zGKOnIA2i>CwFd6BdqE{l++H~%bYX_s5G87O5eTDnNmt}{}uUt>8I%|#pD zq9t1-3M6MyK57K9x-W||YrmVo`YUe@?hzD-_@XYx6(dSl#9&jC=>k(pcimQh`AEJH zrA48H_{~;HTj~pOC7x*)LwX0f5$F2E+Yz@Z&LO>ekDLTI|Si1GL28PN*G3P0pW(F*4%vxW|E_9@M&D0fA7*(aB~#6|#@iFPg%?Z&3g zD#qwjUs}?0DweocG1{Ja%a=9pTcTiWBiUjY>D5Zkh?SHm+Wlwp2)p~lcWkXbbKDsz zhX2p~{=e7#r#T5AjR4l35$hunz}7P^0%%H5OaX|XB)jD%BaqkqfxNE=l0z6dgmM2F z-yWV<`}dhr!uTp-sVR&cx3wh^|M2_Y@Rn2LqLcti2_WT+QN0hJ5!L&4!dz1TtK9aC z)+F5T4UVA;stac5R^^fJC87?6U-)G1}<0 zXGDcBO_22l5zYB%&R=LSDzX0=QHhHZjIl#zCcaQQerq$s&&>=!nfS<5rVSrGIhUhc z{O;2IiZVXcAp8zb5L45HqG|Rj-!hKXn53QfObUslG2F=l(0Bdd9^S9F=grl-U4e_{ zTy)t~Z`XiyvBOYK3*V*uG`x@hI-~1|9>cD@&X{9Y@0GOqdmG*2s?O-e`j)*mSeY{- zBKYWN8awGLQC5ujB=)j3)aT_&VQ+l7}>{p ziMTFND!2V$49=^65T)|*cy<9YC2jJ)a#xC)&c#N0Pq7K_KQitOFye_4=gKjbE63O+ zq$7%>sMs8ihI2GLHjj>F9hH*IHpxTt@>43zUM9!M;EB(WBIT15v& z_5?g7#9Bw)OaRFoC&wnb=h1IF{~%hWSapv2L9|L{WBZ7Ku^zg+GvKKpB9BCE1%gT0*;m_KiX}UPnE8*1Dtha4zt&ixkR-Q z!XSrwi9jyJs$^}U9*oG^Dm|E8@#1PZB;2MJlEC#PR(k|l6vt1Nh+Q>t^e>^31#$dH zNo$+xKy66c#84?@Cat$hc_TK|$*zJbkMe4fr;Tno?Q}KC{d>I6|DA*-Mtl+0)RGu7 z7=@20d<5%7Ao|L+dJ!!3`vWfV$xJvZ~a#T%Woo#cyT zs4{2N*sOHCq!Y=GQ=*(j_UlfGavl<2P4ktAVpWPbI`MihBFMsZ7Oso+;DzhYPw8c@ zyFT?gu2Y5UFJ5mg3=!W8Wa`N4O5><#%g0LZ(F2^h1eB|%G*b^sh7rZXp%U!NHoL}UcV@Xe96cA16k=K3eYO&KOmcc?> z`Fi#2*6h<$oN6%%DAp4Y)slc2dIHwQ`8;L%qxJ?GQD5(mdOl~$UDb2Mz$1c>H*#Aa zM8%8TR@2?2kZ{?d?joLDl-SvNqkMZ(zBjV1A14ZG6hS?!7g;a8fE#e$fb%2uqW(ky zd+S93C+V*H2-kXbNJf#N5jN0zGc6P8Yr)_tr4%|6Li@m0eCzotrS}wxbdvXabL&l|*OCiAwEa{`!sTysu$9XEe zR(jt;7}J@VfeOVR63g>D~=ai~(*97@vs%<%ZF0MtiwH`X+dM5obC27UWJ&oS~O^J1mHB;78D*tD> z=bY)hvMz4;tTS7Nstdf&-(q(sxfN@aVJJwHRzRP-$Lt>sC~mxGIks?(wUIt_rv zKr-7gW`vXSgj)$xb-J*nwd`HxYpj(t7gxZ3C*Ls zyRdm@QpOdbHKOFSg!Z-W%ClLiNr;?QMOjph@oKqsVp0+v{k6Jk%AsL&1Z&0T*gmVr zMLjMatuw~2b#U3Hx~yVYk|YPk!Z5EqIB`Jx1l%Pk z`4f8#du6mWBd6j?8$*sq3hBmNzkqWK#(K3ubz*fPt_o7>s)*yC%KnK%+81-SSowWo zFXscqAZf{)t#;|o#B^~Sy;=O7uvxa}yPFq@NkDMF&E>8LRSK|L#Ry!D|7t=%rWti@ z(Q}Zjht`kK;!}mMfX$*!HsQJn*B@(Q02TwA#zld`+w>LmwtLmMQtQ$qO6}DWm78&`8MJb6TUc3+$3q^qyeP(6230sD?pD( z_!^=|bidzMlJLdCLiifI>55w!x;AQ)b+*-R&9Erb99`S%H#(GC9Rr>6IBJ#w|HI=( z+c*~wDkH|9Hj45QM+Y|A)NTCt=!!V{ z48<4HL(I9QC^h;yarA!FM(*Jg_;dnab=;T@Hy;<3aVplI4J9IRfO8?P7UF7AOA?;Z zldw0|cU@3KpkjF{t`VNz*qb6-j*sQ|n68H_D)~V@+)}@fHNpo)CVXU(Nb!H=#^t_Z zN;j4^Vh12tYF2h64jHzN5Z8_KZ9awQ=@890R!_&W*kJBo+(^8YxT;h_lX?X&iWQqc zl6F#An$&M#<|(#Z8^tEj1(!{&A+}B%&6_`x_K9#8bl?Pg8jWoJT%)|1bWPBiS0!!l zPhwYO+GfsN{z;_FxB1hamCt3useaWl%Q5Fd#`K$f{PwF{y$-0Y@MU7Dvy{2XclFNV zY!+v?)EXD@`)czz%RT<&Mb5RHT^lFXxA)Z=_b~od>*D1l4UOcU#)r(f~?f1b14PbaL6#FSiXT&dqzTS`bJBSYObH5c~};$HlB>h7!JB&S-1 zhvBuxmHFJ-Dm)a7jKIU&IJ^-L;{Uz6hhs!=4ENn@jRk*vZ8h$*N5*oWCm@3eByLaO zsyQx}3lOQ+=s|;OMGsm$GLaEkxVss5-Qy)SwtIXc4jaBVY9h3@5r^p`xuH}c8G~=V zxcczrbf9wE)G2-Jc(uoiYn)Qur)Zf6zZX8km5Qmc?Wc2ox^i}EkNM}W6{UF8=1`ZQ zEs1wj@PG+N%i_~GTF%k(_>7h-$<8`_=57@v_ZXVIa|xwu(s5i=qJYF|;(X4v{HBiLnnu+v+DeNYd! zRQbn@*!C{YyOf zC{BJWGBk7q3DfeG4JrNPYZ)AZerTpqd_e0w^Rn`3O5fglUiRUUm&E`rHZ*)|lv2f; z(yOzCm!4egS25GQBqFq|R3^-f87NJlzfTb5F}o$gNA(D|4flojFXeAD2LvznhyJ+o z*35y-lZn<_7*K@TNNplF-jOgMx z3U|l(f1O_w$Je0M@qf5abLt=?dJrT14#ja0n(wyMYs^<7xG-^+p(Az}SG;QWfG(Doe4Buxfu7i) zyg7S}vvz}Q7q{_*(CfF*TuLh#?{S7{gsodtvo7fXXj9{-nnp>q^;f{Ry^Y9 zNshLY{eN!|J0!m2M>nuGC6H>BfI?<~&9+4|T^$E7eQJHitAYCF2 zcGB=HRVj|UZxF3!F+LXKbEWp@>NV zzso0jQ#JPydqu47`MV=_JV*FFUnn&1;D|_%6#61>D3tBZMO5SJ)*T#i{!>Lud(T-w zzy%~~%n@ULzWGQg;TFb-3lCASzPt93`r`7{!sV~{vcCs^d+-;2#F(Zh9;w1#PK>Vw zE+9SY{jD*fP-OoYK91qT`;AfGQAeu7@p7-<%Vgn&5)%!0pb|T8NM-|G8t`)P8&UaU zQn>hysQZaAeF!jm5*y@`yxQ(>jE45ZH;tUVmheOdg9vYxzXndf$aM9qXn;0u1pBtE zgqx-pmCAY71bSXvqlCtWDGl?wSPm$^%^PPaS4Q6uVX07VykY;aNiVjJjqRBAFEGTv z$%C_vw0irCIkUHy$S(>-(qfdk>G9VkldxnGR#{_Q!K*c*OrxUH@bUW#zM7KsRgcxw_nen>q=6WPYS>qOJlFu8es2a@6I0ijWtHS zK3*g0^?haOje~-Gfh&bKE@)pise@XkT)1(N$}6v^C9*~Rovme z^MzZfsX7Xzjsp4Su&76I?R5FDsK>-1BK_BhoTQ2)?|KKj*-1PBOv zrheD=8e+JT$%B}sefQ~oaql7S@E6Rv^tllC-&<4HL9xv5VcD(pn%~cvFqtdo$zJVV zJ&mGwuGQ1{)=!N)Lh>zKajrRBGVbT7!`F;FL_@Mm>ACIiR za=TP$E7$MgQl~k?A})25cjku;%qGO_$zrhXci8A8Nr$Tm^J#yWw<)LQ4{(lK-!gaM zqmVQ-AMy{6_!K3Z;ddWL8g|kRMSOkrR9E4n3LoDeGE&`6PxUmvj{(AmKh=S)six0} z2TJSkUFXDml^&s}$`gk~gwZ@RyHfRCY+qjIyMTU)NRO}cX-z^SAwsKJXUpKq9)-(l z0=z_c>spfY{vlC_(%{wt6A^cJu#@Uw3x#-{%v41DnjUe(AW2*JNsNAx#j;wv{}W#% zl>{G5K175r5|PQnMajc`{H8ePPt0?AVm4ion0YOUc}!2t_Cc+Qu}bAm?m9dm$@-?s zaMCrLbj2SM{l!YMZa*aYOA%g5D{i2fOvlA^Ttpu-s&v*NQKfl=_rus|k zcA@zbnB-5qXP92;;kJw(-0xpkTM^7<*qShlc4U|+&g+%lxAb#n5?LmZc@7%2+ey#C zY&|)pEf+6cD3xuyt@?642R}LZ*>})*kn!xn91=KYkToN%qR=L3MY~1$ilu)6ZVPa` z?Vz}D6xDz9U>=e-NvhTqrL?;>x_u?5E0x$=!<=77$r%|H@f2z`S~Xs7IVcKMq{Deo z6zYdj(YT1VEpbQi0G-tzK^?B^a6RRqG5#z*C>rhSQFdI5yIjq^HMfqRX-(ucgGAqBPQM-y!HOo?M-TS)C|*0@eBVTN z@DGTJ2gGe3g;d{<%s)>s)&*V8brpIaVT&Jw0w2KOi= z(i`7S+@pva$li4~?i+Lysgihf{KRD`!@hlVM0`<_df@s1jA9L-SOXeMhpGi6XVm-6 zE{pbXj9q!}_Ce0v8Ejh4FdjPaB{)&7yPkW9*C*MDqTH%eARVYEwV}#zk5$D-VHM%6WKUDi1GAm9!0k zIfJq{_A%$H38q50f)!LdVGbw}8U*CV&mM$%zSTOR1*PKEHh zA<%{2Lf!9qDt#?3)+#&i2y^~}r&fIxA}Z$}_%7ufrp*hi+P;%DrldUci9fpSKQU2N_A)EF1il@?t_fS8saAXd>L<=X=61o&=*5iN=6+?QuYea%45 zU!{7z*5ELfB!*(mlsb1Zxv*xg#*G|2s733R-?PkPCXUeD zVGYy8dlTWErHs6a>9#z#c>E}?h&Pc&iGJIJ3rxGck3?DI@ics1#VDI1XNL2NPfTW? z5%YWBXb(u^S!^6$n%<4PC54*<3C(Xw8qXju&FnWYwIv~PzHIN9IaJMHAWBrF85T?= zW~;I_GtBuSS@30wP2gW5ZAR6IaiA{)6{a1O#55*a;YG6vET%mriFJrbWU*8wYHWa%;n*HVhWt_H^PG#a_3j?m zZ+_NM9-+p0tybQ5ERR%|T$ZgT!p!d8f0jqSQ| z+M$iO7f7|lJ)Z(L#I$z5a7oKCriHh>f;drX#8-my=shDW&niXt^bXkG zNxXg-R84JF&roIu4R(giWE`7m%o^MnOX2oOig?{`L8k?jLo^(%b6O|y{$Vnltn>6v z;{C$~@B*D3oy7ZxS#Xxlah>Ae95_d3E`;C$xIpLVPP~73i&~6OtP3`tPvK?*T&Z(- zr*OC$uGU%ZBpw#2gX?s*b`p0_o8e}irB3GJ>7g9Fcc62@LnQAZBYTNz!c6X|&a~JY zE2QJ0of6el7}Gfz&VVtUEpRrB>3pGMqPh;obUq80z?jab;9W4Lv)VDysUAbXbm1Eu zG{Tt9`{8z}7GXN?g}cL;&O71ZFs8E`PKGg^x58;Krt@p?LKxGzsG~DcU4nq=!g?I! zz?jbYa2|~5{4DH(F`ZYzAV!Kg)yD)gPUMX=S5D0kXaUCx^OdWgE5`w z!ed}e=Na&H7}GfsUI=44$HO@=rgJR35yo_mfvaFlXJ-V$F$7E(dc(~yrgJFVeKtit z+sDCh6pZQTE$|o^)A>R$RRCi;pM}$5Oy^VZ5*QQgJgy?FMZk0i-@q;y(|JE!24gz! zh4;Xi&O6~_Fs8E`X7@yx&RgN`bI8CPAHN23lT#Syozn3lgaiak_plyLgE5`+;Y=9Q z`B^v@#&li<7s8m%E8ub%(|IXe4P!dr2iL)vz0pZGTZC{40n;7a49jU2VLH!+`@)#c zGvH_#(>W22gE5`s;WQZ2ITp@@F`Z-J<7LvtdlK3k z>AVwm!I;i&xE#iG-U{!5F`Zw7kHN?0I(OzF^uWF0$u}SIxmHbVNB=y;63mjr(alvP>+D=4sM2*A(VNB;3cmeF>k1j+YWFcTW_l9#}Oy^K|9gOK5441%|&K9@~ z#&o{WfgHk^&S&9cFsAb4j#xE2hl;8l<9ju4+*bLvADk zH~M%5+!x05^Gji#;}fRyeQ>H1A=NJ|Ldb+M-NDUpHjL>!7tVt*ooB!sVNB;lxDv*6 zj)xDxn9i|qJ&frb13NDvV7d^2Am7BmbCZvI!%;A%pAUuOU`*#=I2Fcpw!j%M245JQ zs4jyr=p3{L!k{0ZLa5NGV;xuqVx0UI+6Q6KA*c?*pf90I5C-jmINl47}N<`0AWx&C=0@%-v_Y_ zfiUP-r~tyCpP*t06Z2m^SOsF7RG}IOgN{HA5C(k>Nw;trb&H^VPq$205Wd2!obG z(yb)>RzXXl5D0_r7f!=L47>{(17XlYC>g?_8=-UvgJwfn5C%z3{hA7tm>p%=V!O3C>gT8~xAq+YU?SU|;8af7H&|at!!k`bKcDHfOaGRhC zC>+9|GRO{L&>N6*I*5Ur!G#b8y$mgZFlZf=3t><`Q~+Vn-=U2V20aB;LKu_{9e^nh4wL|4&~zvr!k|QG8H7RO zp#lhlMnh##*&?UF;ot!fg9bsh5C-*!8Xyen1zmzLNQOf0q{-eXC>XLq7!&}FfiUQ| zNLm7fK~2y?2ov+)8E_ehK^`a%?T2b04Ehvmf-vYKNWO~+_bx$| z&~ONY-i6X3Ow508f=fV*lUty*5C*xRQV4_ALkA!XdJbxUFz6ppyG(|iOhLI2`@+JY zC!quggZ>IFgfKDxJq+f67$+A)8zBr@1XV&9bPH4sVbBdwErda-&?N|iu7|?!X4Jb| z&?IOKghAt=Gzf#7b}$RXz!+!^gh7$eMhJuYK)WCe>JHUH7}OcM1YuAR6n+oU-y_Hy zLGB?8YKAf(3_9xsvq20z4XuMPNQ25C3_1o?Ll|@rs)I1-3rM<`DfV7LpFn*f461_S zAPjOt=@16J9pR+zK@5DIlWQRi+6Wax7_0L3cw{5C+{2)j}9FA8L0WjqN@`X;2h|K{KFa2!oQK zObCM}K)DbGje(qnAO?;A%ODII3{^uIGytlHFen^qcR$hJFDMkUK^W8#N`NpZ5Ly6X z&?Osf4Z@&bpfyf#jgCKpE(qh~NvIscpjxOJ!k}-U1_*<`fEuEwGT27$=LNG6;i;pgj-%a;tXyfIuiuL3WaU0!3X+iJe6RM;Ch=Tf@+|hz zXHjI!DYE5~R_HY}V+UW{i1O{=U+gAjh!182XNY@m4=C-O0|KUX6Q2|ew=7pCJ9`9G z5lYo^eMA4!3LXGiVeEK2R0)<=TyXJVtXFL4hr{7Ickzl1{W0(uorAn$Lw`CvUFXY} z#fJVuc%ja}UKShrOW-9s|9Dw!=;y+@I(sg&q0fpJVVy2~cUf%cm%t@DAG$0y^sC@1 zoxiv&HuMj`2Xx+jS#0Rn!}U6UaM`?}|8Aq z-0euajvMHP!$2I?>CY;N`}R@?i*|iSo^o<@#CV2hrTly=&HX5^EJfW#HSO|04B)#p zqkNGQ>1?e@rpTU5k$j^_)JP=t@!pf-flsM(J6U|i@FrVpUFU>!Og(u@kJl9=qJgmYK5dkf3lw+&LOw4|qapG~K{pUcKzx}U)Fn{~cgD`*l zUk9yIX00CRtS2M&j~lIyp^h^c?nK`!hA>F^t85Z(YH;w9@#%;zzZZj5&GBA__CEH2`i z)}lOdt(^kTYyvFr&oY29BVzpu%jZYHhzO>WD*DSN_n&Dl{e@;byi#O@}C%iiLhfwyE& z50h4oR*u%wr0ql7ht|ua#g+2fL#gZuH)#j9Qi)q-Pj8cEbH2@UC~wQ2YfNJFJKVW^ zNA~nFX<2AlXnjrE#xmZhDU&_@Oj=|Ja8{el%qFrm!5tC&8rUpyi-VG-=Xq-0hYJyEqo$-942iY+B&pElh$qzZ$a#lJxL~Q3EC30DJHERtsX7eq^0hq z5$=^e*GqiT(imh55DO5enjAKxHKR>4X^u~M8thZqGu@<>qm`r0Fln~W=-Qvjo)nX| z25k-6Oha>0{Edi>h^dB%mbQa71#_RKShnbp)&wd}dUq}8F-p{1L&=>7Ef{j%pqlU9sYjCPYrYd~v2 zn{U#hzrycVvS)#mBKp5?2)2DqaeXa&ZZ{)2i z9EYf;L$c>KlU9#bk9K>D=Hx@vhv_kvg^8g9Fslwn6!GddbE2@TJg6O z^|!KTu}Nz{Ye2itq@{nyql(|jp8HK&C0Zrg18DSrU-6GoSxu|5C(Gn;%yG2ivgbjQ zR)$uFCO%?o_-#gOMtj(#E!TLcN0U8EOj;#cCEC(f&8hA?!Ss1T_B_%ms%fVwuG6yT zQIlqCqJ1>Uo@FL&`7cEBi|qM}N!y3E5ACleZO^YPMShh%kD0VJKT*X$Ic3jslbF@W zq|+#SR+zLZv?{d6P1?q@%o}HA&l4uC?|H`g^Rg$~q&1>7qCIKSlA9U6n`O^Rp*j7< zAAW&Z>;m(#$zd~*G!sdVNh?3cKyyy^tTJgKKXVE9v+P-I()OY4Lwm}kWf4afapamb zr~M*b?4s;>+9c+n<)A%d(vp88)xXJ}znQcGv;wp>CavT$lh|e1^Q=j0L~BI*yGg6_ z(o4Lu)AJ9L7%ed{NU~?GNh?MxM*F8pYd~v2`A05TjP zd-8S7zy4c>xD4?*lfxRc8Z^bEIRY6}0%cEuNlWWMW9=Y&{$tXHTe--y%AWr-X-#NN zXwRFp1XQv<$Qj zCT(#D%k>c2+e;=ft~0CF&a&ralh(Hjt-6csahbGA+*RVP$fPARNF_5!y<*ZfqHRQb z)ud$*UIyW9^l85JUoB!S;wF>BsIII7y2_r-CM^ps3vG)@t46CvD>iB2GNmBPp4Uv; z+AvnUVY27HCM{cbGJfOmb(5Iao%x`<>?tv6b~HQM8z$`l+5xmTO!}_l-M)tgK5>tn=HXAB?J}_x{XnANmOqx85_53i|Q)SXh&`QvD znl#%8=8X}u=R=dW7HuusN9Ofk6JitME|bIDYbma4WzWYZEqo-6YozSiZPMz|>d`(i zX@z#4S+~ocJtnOVtqyIkp^5dMEtV9<%AQXR5v>8O0qrxBwt!+?K(X#KX~Rb`(2SBj zpPRJBXp7OlFll9IWoTbYggu6^$M~ji>Rd+3E*MG_57(m9!p2H@GC1@pRH6|@Qj^dA#J>QtL zg=h=Wj+nIUc)E7H>^W-Eq9-tlPLMsvS~S*wrHG}7-?oSjwIqRv6J*bKCe1OCv45iM z`QD^uPGYq@N%qv5v?jDBG}WZ}-mH>6$4#1?NCS2z${x)m+LCAsNwTNTq~)OHpq(&j zyU=!_c}!Z=6h_P`vgf2pTa30Ct=^Uy9g`+|erna6>PEzkh>fkHx^N!# zIZyVSHEF|dprzj+d(N4(#b}Gsel}@Y3z;Jp%AO{ZR*qJV_KQhN9!+~2&HC?GlUREj z6VYw5=e$Xax}9RZUG_Aav|O}Yvq~)D+_;0W9onHOx;-I8`{JV`8Df#w`5)mGzl&>GpM^eO5&uutKAmv zEZp)t@Aq-zf)7G!>AWS>#H%)f#A}F>Hq)>0Xf7FF{6vy{JE`1uHm)eTOPK6Xmpnl$ zc*5r^g*VWLovY%jH#>QMH0_*tlcjU}*1Ibd+6AA>#Chskf?G>)k~aKYUPV9gsTl3I z-^KgjCj+hXs`>m8w-P#b2w&=Mc74TL<|8k6vx(!?9LHQX5`XEE_}cMvXfG=dz8K-m zBhJ4e1pwJ|X8&3rTXJKgkzeBGDhUe3`sn|1$Zec40P= zLGgo0Ww=gRx;*K`ulfhEc@5Ob>(=F0RQCVY z%>P|#ZCb4jVHXWy*Ar9JrY8b1;};kBXiB5u->WUvKie)E+5hR$-_Xu?zpl4_zi!uG zM3Zy+UPZk?W4T)MNWU~x4Zn0nHKW*@%}SErO}KswD#h+=AnL<8Awe=2x{L z#t-EDMG6U(MR_!xdV(^1w@Ng;(@ajHOBW?4>@=T}Pyl2=1!2-lH>WhI_}^+&j*WRBw^^X|~@C z-K!05H14;})Ia-f4K)0VmnJ*QwKSy#dxLHKnvUI}W@R(gWb?-H?_RBFZ#8%O!tK>= zZgO?vCRevkNsJf)7(cM1F30I|<*}E?`bVs`imK*f^IaGC2$M?oj+BZ2``yRg{E!$w zm1mQUgoyFTNH9+lkdZan0gL#){zXIeYOnufWTW~gar5(^0rTyz-0KkSLK)`j(MC1Q zbq%qsP*%8xv~g~$s|P>R^NB0wDrvv&qE}nOEhJxIx87hBuiJ@l{}{Kmi%D;B_H*?1 z^A`-&t95Nj?-)J3XD#L%+jlK3i1;7P9dl*e8jWSZ|< zhoa&q1JvRt#hheQcLm$GitlcSA%E7H))L;Ue?46cML+6aPk&uXV7!z1 zT&t`xSF|xceT#0i;VEkUlYwgeOg)-d{p%$nioT{O*6H6@7g4;ge_#D^sT2Lx_YJ}D zT~+RQKK!$MS80XONR)dv4xZaufCX>`8@D_N7Q`$_-5P9zRUxm$}fb7i2Kx$-cs_#BL0 zp1sJ_M?bV?YI4i>=rfg{H;-r|;jvp{qDva8D*7`X@h$jA7&7=d7>DX28!ocZ-17bP zehtd%EkoM~;{7fC?ka3H_qK>7t$F8{&cf%|BkmCo9c+Cd=TAqW%9Zq}mB;B(tAB0H zzzcfxqCxCXCKgAGHHyc03PXJ2$B3(~@o?F%Ud^E>#iNJSkf9nfG`qQVl@{E#Z{=)p zjAftF=e3AQMto98JG}-U+u_xESJm=dKwL=g@J0sfT4S(o>2adB)e~F&O6Bp_MqQ8@yJqEaYqO{EY7JD{PXs<|Xl26H|Jx2!12MZzQ=6l6#@4HMyZJpUS_E z@5D>m&zHnkUdq@GF6&?n`5k@{PeWxX55FGltaWg4=}1y@Uk|_%Gv?S6GtZWa74iKw zf4&l^BlbEyb8b`I`&+&@|0^F+XQH?i#`od)Z2^j?m`8z%^&d$SKcQC3LqoL=e%Mqw z|9Y&m^<2kr@#zV5LyB60`x4yeREW3nABixBAeO5kIow~!;iBb~(JnTh67AxyOHzcS z@sx@F!)n8EH5^wDof7TCMhPpYMEgi%(JX0iY)B#8Dko7@=}Ajx;3b0{A?ISKD&YoP*)yz!!N~8-B!x5@={xlDdvW ztjjS9%|IofAmk}i<;VAFWT>8zloYUP`H#lmyzePp33cSUgI2g zuq91O%Ms-}#k6WFqbSRAPUAi4=hhB#i~g~D(b=4Q>|W9mD1_DqIJ%7%V6L76gn1xG z>ZZMW@_*__34W_z_~VCs--XDhNpDTM%5c|sj-Novl0u>xq`o@PlAkMb zW?m20lZyHrF>}0OTt?60Yt<)>wb<#CB4=AJnrEnR<+ry&uQD_jpW`7s)?N-}Wa-%C z))j_Pa>n41eNL>mYb(yOBxx--ajo>_dqV9tQmwEMy zHBOW)QpLG#eBoE*KC0ps_dD)sEa*F6Q%PJ9R_i{i{~R_;(p6$fI_~YU(SKgR%g-7G z%+d7pBH$HydAku3VDFM4S!us;t@2J))rypg6HX1^F00P52?F_ro1gX zVbtCF6Qb^JYMx3PnE0;MUgch89e71p>}b7f+WnfRItbFSTGFcPjA*=Cs{TU(qA@Jx zhXUxb&HY)cvtoRYUvw$wJ(52zjPwhUC9ByxQaZgGdzC_w{e^Nwx#Qio3MK#DLBT7D zUtC80SK0CI)h?qx_{mqmYm~rkZG|;<+o0g#{;(D(ceUx}KifvkZLTZj3pcea{38FP z)2ySE)~$|IXVR?t{nT1gW9y8e=$1M$6!kjao^)p`VebuVqr&IB7i(Fsta{H_5ng$* zZjR%fA6w)2Of$N8qb9oe8^4aT`MTpnWkxfR6@EGAU9l<9qA*Del&8@vJ781Qy469L z=(W{uRT)?w7G|u<3N#}RZe>RKupximW0(Ed+G8`67t7na;Q6{d#(7k8RZO8#ueetV z8Rzd>TdqiJ|2ER<>vBeVZBGTMwx>v|KB5HL8%xE{rt)3$mR%|({7!`)Uc&bwnQGn9z!VRyW9MY@On|E4>gbf>qG?w{4xbU%FD zDDeVC*&cJ1F*41R*6^Q{y6v_$npKaAnBeWltMxA9QKnTyTqW}t8(K5}q4MvFwz|zu z!proBm#6$(5pk6neWMOCn z^pn27)w(OCRQ7Ho-|tt(%<-r>6))4&a_^Qx6vod(oB!X^5M)Y2e^o4+#c(%88T*Uqu z>Uq1en?C1$mD$GM^zEvY8-)F_?T;}Yw+Bpa3zefguGacX zO>UPf1FNp)cCE?nL&^hHZSDCLRrRo>EALfZEiVpJIH^kD&bGpd-x*^mR_@w4(pmgQ zOUwA5Rk7H*G4@FvxlG!*d=~6GL*v(d^q&C`t@zw`V$y!=Y)eS2a8l%H_MCgY+L}KJ zzmM;FB9$n3yNKX3bHxS4)2CV^*wFIv{tx+hKfe@l)@J+KUG>McK&eB`&E*!Ya@&W! zg4c1hE|(u}R-XKDU>luy>xU8dHGWrGF~KGh$S=%gw!S0NxG;z9HSr4vr4_^c=Mzom zYyIb|Ip4>Bev#>Xwf}q-=f!%WL7DJT#C3l@ze%U)tf$Qv6Lar03Q>9PqjZ0Z<#L`| zGu)Y}@A4&kr`?c)Q%* zcTC4dKH)E_w(lwB*zT(hKlYQYLrSwU@RPPCz8gP@4}R`go_@FK1LgTo+UlyGe=;_B z!7-QaCRgdSr!6;$dqxCD9;?#b%vK(2)6E-uMs#dA>T?rbuhi{{Y9oie_r?d89`z;Y zm~!jhwj#^l8xx$($NNPo6e}O?z1o;od7`xtNc^X56~e?%V}b|!!<(l(+@_nNPkZpY z-|w|~?$oC-mTD#Jvx#lwXVGUd!39Trt)NO#K5HvKdp{cyd^?}B7y0?S;{B|xG{){5 z5j@oI<|gIdeQmi}zi&`SzEiJB7F4;5~c^UqsfV4Ey|Qg=ej6Exc;w z(a+n8bkpa9oXfr`t+>Osli|9W{#Q-^`?yA2po#u>x~7``x8(;(3%pGVNtVS`Rpl;Y zjJfj0n14vtN8~0(;kpDrA==D$h(8uPD)c(Hf&o9yXKFwo^ z$^&1-`d>3`YiB(}Yi8er8~(e*D~fSf+@XtmnwQ3(76}<*O336IV=C}vF7OjbaC^?CMchDdUHZ`^tFpM}I71>oZ*CKO+({)|8N0`uFWc zWj~@Eu5PQ0JMSMfq>9qG#->unW1itb)n~j~Xv=r;uj32zY?L#}eXHEOf8bRv(i>IZ zh4psj<^63n^ZmqhdrM3UiD@A*y>-Z#W)ASRb3X4&Oiw8NzPegW|MJJg<@r|;v;KU7 z$x_Q*78WGC9Idr$%))#NzSK}n?OECXRS#$Dhf;@z^Rn;r5-;0Mv%8ow7x5k6epl>` z?5EUxD=bNqOeNo6|H!_6eZaTwId>|ECNOP7Ab&I1!uO^6|D)~O1EMUt|92i)Sa6X= zQ5HpAP!te#Ma@M?0r8q7C@QAbsw8BVWTs>mXqISL;G*LNb3s&8%+zkn5EJE>+(O3xLD-I{CNuR=x0V14y3k z)o;apC)eX=g zTiuK{y0+Ks&9m@p0UIA0MwN{sYIh_NYGrElkkuxHj0% z`2Gl(6_vIyU$wwo+zQNiz>L>D_nkeMncoG3EN=$W(*pC_;g<1S4w%bzf7pc?QWcQm zUs;ML7TC(b`hIE}ld@1j@d3RWJNCvAJ8bNY7IWk6D^|97;i@=VDOcHOh29lL>%&~T zqvgW8%wz${EZxslt+~u}yNz$EWl7|Lid18lW9o_U#;b2K^+!re2G)YrFdwh>HAYAz zrt7z?DE@XuTm?E^Wg_6}50*(2X`c6@Tye=_ABqyQ8SmQ4l|42)wy&><{jS%UuG`}@ zuN!_TL$8(=&&ECi-M|ikca}<4WDaQM$g}~SXh0{Xq7&0>I=2z#|%y035g%x-x>I9@Fxt730v24 zE~pS0@3PM8cJEdcfsbzrJ>H_5d)pqC8*T@<{97T6YOhwb&S%Yqe%JNC zV~;%&?gWrbUFMxGHaeh)FkXTH)8(fv1JfC9h^bAcvP+`f?w3mj@blj9jb@A6_U$5J zY&aQ=+z<0ooIx@i*W;}SK*mq4;9rMmNWcI(@AT3Nizn_5BS^tUr%ZW+B&u6=63vYEx}Y0`+4 zF*Ku$;VH@-Lhsw!AhP#pb)n(WQG9Ft$~ zC6<;-&{7Fn`uYN+H*2Z>0&8hc4ZJ{fzqH!Yt}3CWB;CMTdo8_O>&JOq)TP&|Z04nP zXI8z2GghyGYdStI!vsx)7AMfaA8`<`&)U#pilv=py07p0#S}QfQ^`q@sgW~N zr2#PmA8SdMQUj{`qZ@$A*+A`F&OUX*SYm|k*?V15{Y}nRZ43DyBVUdD=;D~7IT(xuAHm=HqbAes^Xvm!Y#y{JPX*yiZ)3v;8633t$sq(k zgy2RMGkIqL*{qM+1KFHwBAYasiq5m|YcXVRpU(iOt+x~5NF}@krBl=eg%zS&;YSSy zcJ0CSJS;xIq2i-JV__40fn7xS;5?fE441v<*#t%G?|-CQUN^y8fX5b$ z48vsu`(T+Lv^{|_Sv0KbOS$AcZmew5~@K1X1>%lAT02aF8*hKXcOyx?rtNs*#2+Xd8_Q2 zkj@z=qziJ3IV+DoXC3#G=fo*??_2|DlV?#jtqP^91iR?sbe}iiwp$y<;YZZUiLyz` zi5xzpv+^~zBlk%G#&Cng56<}MaK=wx1aR(Xsu2AsOcxy`AsEgvu9bmPK0C*__SI^c zR$H9V0{934ybbgcKri8;e_v*Wo+9{R;tOr(7$-CEDd!j`hw|VxPl1=k3;4TdPSOi^ z3w&%EsY4@md?N;%M#MJ!&oO3aZA6`8%f z9iz&7c0m4B#w0rf+2x!8WvXs6s#L0QVI@}~Kc%ow{5eliClakh@~u24w35<{_@~O4 z*k{eum6f8IoqRJnxSwQiY;&Iip9JtpJa}(AoyaOd<+S;;A1%8ea%R~zUFuTYes^D zH$+EeX8!94;VHN+vt3b`QH^S9)H?jN*r)4Xvq`=2hV}TVB@^O+2EY0Jz#J3U2HdoJ zHA5@R7!Qc?fcOrNhd=Pp^LWg<0rT^75_w;XoPx>m5s1Lw;u1w+W-czm$+{@9V=ZnE z5qZ_ZWV+IZ$X3qggRU@TO$4J0`pw=!+bh5MrL6y2#JH^)<5j?T6)?VYmQjvj?7(Au z;yV19p1}Cl!zVGm+#<%dtTyMh4v@jJ_y(Qp@BLfpM#kl4-H89)UN>@n_nY(A*^1(! zuroS;^e$&5 zTQtlIrT-uPtzhcd9Mj}K>|uK355GAJESUcAfq-clFf9Y7MQ21zZ=Ye9Zmq)Irg6#MIMxHlerH5YVDcHp z<_h4r064yE!^T0taTXS1Gu=Y})Wll%hT_Dr{B1!d z{cn4_+B1I#jGuEl6)te>h92It0y1ep<`52z1g`z=6yt@gYZ6n#7zu3dqFRGHssBji z-7Uyu2=^Fqt}9OC8n~`j6PO+r8P?MHAZ}{RU-B|BmZr{IT=wF!O2{d45lULFgD?4 zUva`43X4Zqum?_c#s9hnwoKRY7aHd#-+gR>qx=2eUUv8*;6d+{gC}h}(uj^Uq9YPZ zNBsDXd|xRs4S%8|kNuKUTI)z@`4b&+d}wdTMm+TE z+WVxTINpaHSb1mQ#5e=K(I-SHu}!z)VOJZ?n#mGzjStI!XHo_>)um!ulWF1!aq=%d z!6xB=${s$}5sXI1ySO)*dTwR@%0$-DiyexawlMJ^^(n=d$X`(WW?3RF3ywRKY>77d zur*89?@=f4BGbfm;~#ZSu~o`t6J_xVUNLW8#{v$}a$jTGgB6}_9)~=F+!(_yNGy9w zp~|@RJzH!DeQiAP)cyNN0i4<}oD`3{O%i0x)m(cJ*!pRI!z5zj#5NWS+Uq78tT^aW zAG5BypoPgh?19bY!P?8Q)eSp>#^O9_pF25M+^g9(&ArB&=9hSAA%aTio{6~5tEo>b zMr8SU!N^pnOK7rZWZK;1*L7KGDTFsuu9CrT$>6v1Uooy>q8m4Eo4RVP%Z;rk+$Qkb zCh%LYudMu*`xTQLY_a+JD<(HqUGaeSDCz|}{*=h&&{#*|d-qHcb5t_Jy2F+YainJ} z9!^Q$2%YG>WrLpBaV6PsnfUd-{gr6`D@QNN(Tn~(F02=^JTC56noJL9S3+8||Ftu> zRYm6#VuxaM13_cUEsfQou{tz%;Y(3q{{AKF_<_q!rp?sYdSeCWgpMtty*ay$P3O>9 zXG>!anRr_U50bxXX)J?pEDDVcp*uO!qZKNSH#g>Sp4M~r$Vj`kApy=uzZ6_@zNZu0 z*u`lDE42!x*uww@`gt2-$0AFAY(x5z=c%Uyd2X-@Xsa@3W2jTUv20avB#`G7X4D`L zKNylj5em&zAQXmB*fHurfIveUZhNFDjyvK3>9LtO|H^bf9%xL1AqCfI5RawBQsNb` zGe@RQViFAN(*jgqkSP>eRK!d{$4f+0&>i|nN_<9I8QN-;Se}XdZ02f7W&sb6)ZDcrt^8$i^V0GZHy(Ew7`)lpA}>_cIzdg z(Q{ErDcGj}rA4ZYqBroINRz3%zTtR7p$ykatw>7No24A6=fnpm^r2+j_8d@jn?Zi!osL0Sw=lo z9Cf-)M(mtX(QjoWfZU)>GSX*QBAQ5C55L1^4S4WA0E6@u7VxYgfvF4@@Gm>t1;5Q1 zJiVk?;QU;A$=NRF6Bm?iR zUsG9IV(0vhKHHWA1nfewE@p*x6*|8Po&O7OZ3qf&m*Wi>^{VnF(@FYCTf2>&XiGYh zPw98|bDia&Z5SOWCxbb^<8;291P8V~o?6@+k~<&G<*#RZmL}5-OOv?ri6);#lfBQ< zvvM-@X_bt+yOO@D<3)zz;UE^?k+V4?e)U1SwFJG-*e*$tBVWTChQIp`p%aWSZa1t$%U)1TkK5J0E6wYmoVeo|N#O6XQM;?s(+ zegz5&_avK4o2Ute?F>Xm1-N!7Fk?NPN5?2y1-Z-yWCZ;Lh3$Ym0gx`W#{`gy)AYW= zE=~O0$zW1IXSkCt;J&5q#P(GvQK;fuEjoOwMdxcAg^lac6JmOk>EcmlmSwucA4eg^ zOonqmsG=dxdMmUzP;pQs;crXN$Rq-0qK+Math0f*v-eT)P~n@S834KZTnRwREj6Sx5iHW&_|+^ucSssTk2MRRdV-C$^g z1-IL$V94zaPd%G5Sq{m;yy5&e;C(pyM+Y*%4tovuAUP~CwCQlNi zSjwlawx(8k5`V=EKJ`^=s$2;OVSH+|H8nyB2)=x3ur>8PCGq!n#h#tm&@)Nz|O@@(j+NCQLt|N3D`v<|w{;j4vyQ1bB^fLQ5gFfm?`je5gZ#Vqw zLucV1*Wn=jxEtw59?&mXs)_!>{+*{?yOTa{M+~gHXRzc)VroXxY2C>{%cB`82uAA& zK7+$f;dKT@rW!fITN9Hq6`A~TGL8({+ZNV4^oJzR?1qNOk&5) z!UGJ7%ox3aI;%hvbV5aXlm2vy3N-OD(3L6@*u4#pZwKHT2Yll;Fx_(U0Z{=+rsq|} zM~ug-2(j||62DetQ!IAtspxnr9npjI;N->hp>M0g zOoa-YP+=2afna;vqt#B;7Ydy^N_V56olafv0fpy<&qRgC0N92Nc;IZmI0hB_8?a`q zE5-dY>ethLpL>$-B#OR`e|B2fgJhbg+5@UDAt8@M$cFK7Pd~(3ppa>nyM zLXCmK#lAXf>P32_9NyUSa}^C6;LN%q0!mcVQBecJg^mK|^}*D#&;n=xrhmQ^(PI0& z6n6<0ZT3WpawDDs-PmMm+Q-y512XcqO~h)0(;ext>Pz@`_U z?h`e^Q~NT2RqB^hRf-}XoSw*JJ%N2Bu#W`xYxgnJ0mJ^lK0V4U0QRL2ai#d47!&7a zL0F{FWfbP56j}xu=E{Bm2tDHqTk*`dt7XTJr=ZTBc6WR z*rQ0zv_F2_IQ8s8_F&M-y-Z**8r<8<1V-K$j0;MOFBg{HK_ASxmKUWPhXtRp1q)+Zd5EMA1g_gCY?rnk zw$97X`6k)CtlGl}xuL|CNtm8qol#RfjrI;AUF}e1N)Yku>b+NAyn(+arlvT#r%k5U z_Amn#Gor4i6g6$87`ucO83pGKTuq6l9DeNju;}!BD&LCQh&|#iBz{i?Q1dC7sKP5m zud{Bp^!Qjd#kVi1&`o0P=1V58J>srp_#U<^c~BgnGJsKLWmx(P))xh6a}WAj0Ij9W z+pg+!D|!w2Y_J&RI_{zC`w}}RO!Qn|EYB~37|iywmNxaZYx^1852gH3itR9B>8t&S z_}HC2k)8NCn{2`+Lw&?{IXDs|_JDrVkAyz8!*R0jQBV8!hbiYXI;}s@p!vf7{1jc+ z-|p&rqCe@F;;;#ZicL7v+AW&=f85Qey6d>rY=8EaL_QGwqrW41cd)4+*v#N5QWKxw z+=S0>Zt4sgFF#~W6(6PJZ0NprcZ1AK_ycs7y4AVyI$(tY*HGZ9wcz>zk81=(jrFm- z|Bjch9lY{cT6^9jvB{*~Ei%Lu>OO$h=Z)QdYqta(qI6xMwdV?^64GON(zRhyWf(-~M9L?iaC zonntUzQ?X5B zl|tF+sbnXm%`H*3=d$_0DSs2L9q+Val(JKlh4wodUIJ>|mm9Wj9lQz_QsGY=5&c7#p$|&><#Q zKcr62w7PfMVg?sapF=@A1N-hXFo`;12$(PrrU#y}E6jgjrLN=&QuHzP9MWo|?GFfo z96|sE?KHY>2>OtkC-k9!7TYiN%MdjBJQ`)FEu-Bvc2S$6Ap!24^9;pq;F=oq!`s+2 zYFb5c>SqF(>*!S!w1c8Fg!JuJx&ywic;%`T*7yo2VNIs}xUeX4A&m|pO0yEc6w5FO zsmn#v)V|=Uh6Q4&<`cA^;`^dSK+?xp2JPBO8DXs7#NoHH*b)18;e;>MMr=toNgbT5H+1Vl=Kj-gv*CE!+8bna|uTp zCtAR`zv4=fFZ%x^#=$lit8Fmu35u-`hKeH*s>Zom zkmDf8b`s9*E2S(KjZ+~-h}IFb9RiQ?~Jg! z)NdPsr9K&F(>b7TC(w5Tmip)|ILqDwbM&`tsWUWQv{dL_qQ{d6n3Z^wotuc(ZN#^K_9mKz6MVbdM}I&Xl0`K z?iB{|aC~d~JMXQy2f0;v*3q;_#27p0PsM4X+RldZ)OO0}YgRpblcw$M8$IPj^p)nY#Xj4z1y?Azi!`?jJP0K-HFM%u;W6vyc8l;rZQ4Gw?xVe0Lb7;S-ZtbO6^u=&}7Dr z54P$7E8??oUtFHc#^t$eywY)5BImp{zR5q-H=b{t=mxp&j|#*tnV1Xu5;-5l921x{Ow6>;%ga6?+NRiDDzi~UC-*jqHBg*0p%XAIkBwU3V9WbMq^O+d_%pOin-AEGRNGB)zUB6{<8gc&o? zp$v3r%O-Yyz>KqBZ32s%mhXdM(_12c8_J6TWeg~@>7qpb2I940`1WKNdtqJTgvTX! z$S@jgbN3zcisqD;Hi>G;s!bJWHhf?Bf2IAXO>Ddv z?dNY|mFnG*y zWGH=SqTRJ=|3v71Nt;TG=R)^u2l7qB{xDVUtYptXimujaPkb>(%)x1&`riaAx1RY-D^^ zxX02PSRUSEkmD8YWJ-2bq5-6705!kdF+Rn-DP!h|1t`>H`aaoGvDwi;7lo~z&S5(? z7u)e^l#L>B@Gj3rap;b3WJ9-f&qy01T2H&=o!s0cX{B$BP2XPGDAM=ijf}p}?PazOfTjOkW}LL=jegSq+=`A;c`75F$H_|lvqZ=@``Jl z77jApW680oO~7Z<_LZm_r1!uZvyypujs|J@+ZQ3tSMOp@D@0l$pQZ%fWuRBtcD&6B z(@MV$+Tz)~)R{~>P9Xt)$2Vy1{`TmUPfg)(h3rcY(0ow50#ExmZD5ZhFj*Qz=T0Gm z{nqhCH~NGb>rkW)^ee~L9GN@$jVyMe&5AbBFQ$-TezW+Z^H8)AMH^AH_HUu+-YllM zv7(n~*QuBr8op?_Peq{w5@wuHu6M?7x_a2%-yg{!6%=|2ev06s_kMqbYqyAb=tF9M z$9L@B$`YN}w`A$TG1GPn&4e2@dOQrNXYU|v-7a}rn44vJG)hHx)B74HNpKIyW`jB| zOLSd)o!*&B{upA_x0L_NAMHOK{_JK{aJ-#rwPn6Io%DM_T%ct+oKcoDEZ4e3zqsDo z&l~GSA~mfy0G*PZVx!FV!ykR*IP(|VdV7jF^zL*rl?SJc%gGU zsWPlkf$w=uRAoZn6TZ0kAZJ8wBS<{pVDgS6_HnfoHT$~SNSh%X0Y)$n?v4nf9t6_o z;L(Htk!VAAj09S3@WcKSDC%ucoZHKaq9p|O>u8aNAv+|dpL{KOIyaf>9{?%@phD2@ zRk~p&>0$mLT63#jSq?Flq8ww~DDvri=`cEJtX} zi==leMu$aP1^q0PZhg_Nes=y3R9i7gpzr-eN4#Vg-WxB$ zCi1Zv-f_AerCLGn;uZlt_}AM9*HH@(kkAa#17uY$W??SAHayb_H4Adv0(a#{l@&}62DG|KQ1kfQ%Ovd+DqgUARz9e$@{rfJC}4y zv~s%bjYruIybcTjlCaLo>85p}jFx@OWb_$*H{Ql~3+l&(c`fVm=GJb{wd zHFq5T**P{@5fA?k4(PK(!hZBvyxl{>U*h2ma*=wzO#I9b?>84{VdzcRj$GipD&5*2 z$vSbN^IJz3y-YNAh2e74UC!5yvZ;G6U7Yp5(mOBPJ)QHK2c$G~c{B#kiPw2LJWSHHm6{uRlS3PP|HQ0jFH0qjQmz<*#NZ-l&^wi?fmSa!00c4`I zHTzmU+NvSI73up9uF=WW5xAZ~*dWYSu3I5yDC`J{uFy?u2C`jSDvm~Xe= zlV0iS|xZ}KWHHjo^^&36@*5UPERXw0AP6WydG5-kkw z9VCVJ9Hr^0*T{gbFRh6#9^f-k9g@I*i#^8$KxaD%9?>z>{dLl%<46?g=mS4xId*97 z*pYz%3L5@8@wAaTxi*J>J$K^pf2YLs*J>-B7o~{;i_&$k6TdOm1*PzZdrc!pCjam| z4D6y#8(~b^$>C>Jwo7e*g{Fxoh_mTGuj62=d=VbCTT}r%eg*D4hc!Ef*2B~-Q-&K$ zfE9jfExg0<;uAV?dZ$7?2Yv?njTF8E=zWdm{CX?x5#56mtG%nc184Gp^H0IE)vJb@p!;8v9I2OUJKBA{TCy_4C z*>6C2tyXM6(X4@bG*EADpgkH`CpJK1-XJqt04O{*D*{wC1L(1vGkWY6F!lw&p%#FD zzd`&wswdIH9H0#z>}K`Eyv;2Xdb6cY)o_3bk=iyF1zu`+F1*vhGR_Kwe6 zdA36;p9_na2uBug2_v-z&}%y38?`!(mG~C>8M93XV^3h0O3$d(&Bj69Vy}YHtNkCC z$AP-PNnUc)?1njGx9)kzUMY+7;h>Sv(43SxNrDF|cEbR=`yV~L**=H^TW27i!N>hS zh(^2s@d7@s`d}>LrHGgEapebLh*u(B$;TBRXb`VMypE5{K2Rh65b=k6T=IdxDlFEh z00N49)?ni*6$q4Ssb{11I375JSF11tSn1Tx@z_F7fU$snyO<0aYo)p~ z40zeQ;FGwE8IA5V$uK5)yD(99jaP@gI3kjM^cJoh@j(mY{8lJ3PU*;%v6xAG!K-hPKK-m1G@E|71Aw=}fKMLqaX}Y^ z)@jfZqHK2>ZJy4LFy7DS@S~HKkjRdQ_ehL~_gIJ61910~xfnWO5J}|YZk*h{-&&TTG0etSb$7-bo_%hKm@G;%rm80beMH+oMK9l4ZvO5+fTqc1HbUQ#WBTKX;vCL)+fw<4Ib z7{SGWRs2XiSgm;kA#6If@pHgRMQ$o`3m%CJ!sSN>~}UUMRp#t^Y+l_ zWU@A;suNz??!*j)OJ${n{?9AbBIAh?;)G?O?Mn!O5#2LO3!P5OpnjMcQ-}8{;v1e| z)P_Rh+_`;eq2})GCQa?_CPJsbO?(^$u|reeCQ32<>D#1NU;B(y(@cKUU}>7L4^xZ& z_BQD*R%f943SjL?v&IBlX|`P9VqAV~#xin?YoW=oW=)2nNiCYx(wE;Qe$A?g6Hca% zK^2kRSq$?RRW{LM?~;HPW{9>~D_T^kK$VJpwB36oxP@lkXx7Xd#V`mJz#v3ldynLV zRY6QwVG*!=R}3P$3~Ba0a#n%#3jXGj6U2lNqtB<1UedS%#^!IQkQiwqf{FA}3YjR) zKrn;$NF@^;4G0~U1HG*pTH49Ea za02bJk~}9(L@<%Qx{?f$rXrY1cdsPF9J3M3-cRdR5{=_&gir6Mz1}Bk$0~%Y_S2c~ zlktwV2-ohX1@EI7#b-<-YkD8B2O&6!PF{sz9D;FlHw!LDa5;T|pkp?I*`Lwq4}j`v zgin7)^H{hR;o8q=;|C;A>TrOmxV=9_-!%wo=(`^R!B_-iY0-z|S!p_g>GZ*eWQ>UG z*wyeh5VRDUyqW~}7e>K7lX+K5O!p+BW)W^IH~`K5z%=z7q>p~M%7xNIp?dz6SP`S_xxwucX^Q^euq z9}VOOOx(RCNh67*&P9@Zkk0#r^pnm!gzGKGHh+Q}?~dsRryt^JQ}#Jf``k*Kax_)W zH}&2UMw?p1Yx($+C5$!_l$U(YP5=I+;#QpjBi%S@7LJ<$;<5QO~ z+C(EB&Bvc#0@}nHq&k-fsz`&0)k3 z^YLCwM3wL=Ub6CPL^LHv!sy-M$!#B(pNeG!3p$h9oa68MlhPbnne<%i3ldr z@3J7>vd~5r_1ZvU9P<&(KTMN0kkO9i2$vtGB^$_0$9jb857TZNiAJhCg0ZDDHUe}c zf{}FHMiL-RLokgNZzQvO9X`St4<9Mc(coYvIY({z+7*3Mq54N3VXQ`e^${9D$ug`}b#b@YZ-Vp6>qW=uLNF(%PJHW8nQWMm{C#i7xn zRP*yz$Kk`S(1jV7qtJ4EN8a#&DO)mZQNMj)fav-6gErc$$4f!{Qj{n?N~dln6*djL z`>xnP$QI()zX}ah9mN+oan@N1=h|+{;|0ugI;W^nA8xEhZZ(?!&l_T;bz6v!)cY9T zYNVfUft_R!f`jOfTS#wd+%cSv(2iTlFliQoS#-))GSIOS1uBoxkGI0{tRCU|W3*%| zQF@6zGbJSzCqW)|#xTnZ@vJNTWh)se06R7~8xK5~p}o9~jFV0%WPPq zgQzNBDDtb59(@x!G*C~5I2NKzVIfV@lSyWDzSiR`xCY5Jg|tymhC9}wA9aN^G>61X zdltcBLU-nX`GOD(qW5x0h+}>cn6HTT$|doRr;9k_=^~nu3n5vFB9%q-vs@DDI{zK^ z<+uo=|8WjZ5r5~Bfzp}BA-rk-9pvYZi;=n*FFVxyC6jxBcIn3eQA;MU}wCe z{;UA>`6&YIaAQ5{*Ox@712J)?Ev1G$;?ZuS8PI(Ix?e)|yRhd|eF3L9`rR(_>=1th z{l923eQ{r8mGAE}R&h!x%n3J6_yY3d3yEpat6{}qU=>E#Xrx8c=XR46GkfHqxX-I1 zd)(ShUUSSxnfxzkbUs<&*obiB7xZL4G)>i)tl?ks$?V>dUt&Z1C6g14dbMR(-kLAC zrYJEi(OGDE-H}7U1a-5$5Rq zMC+4^BB@_lVNOW2!b}6qH2U>^GE8y%Ee4aFco(8V;a9Z%XJn{<4S?2sH57+es^8dd zjUTz+YS_rV3mNSL=UzuD3tO<*?(*(=wOekf5|O7|Wh7ai*mt}CVQ z8Ay;%rWPOzixt*^`E9h3|o`3a`WpE8hesTx7`G3SG%ZJU%jtl4#)3iZqmUypEo zr$#>9fN(=6O%6-HkMR9Y$$YpG;l@sd2n#DebBS()4Wt0a6RMIBQe@)U@SkOB5vn3H zeCl{WWKe}L50!MHS%-;lz(Zs_>@+F!MzIE3tQh+V-@s6{>#i^sxlar;E(Y3*>7B!n z5n~Y?OFfT}*^X)GYuX83l{kG8I_*iTDp7_~Wha=b5ERc;i5kRf_;}BFrb;|S{2?Fr zj%TWb0`(OqS$U6mrb_fgyeA)*$1_zzgSdu|JH#_pVglk5`1r%QyegqZf|gIXKbNTz zixFSU$Lr@ZRU!@XG(KKCm#Grjh-dTh>bXpnFd%N=y$ua`YT{M z)*`+36zx_>I`6aq$ zbTLXi1rB#W*uhiaa2difPl3bb2+KVM4p$0v)Obg zMZA=cYi9G)p%Mv|e1dv5n+|n|*YR=x*=#yIMEoHiSIuVAK>>snXBmRZ*=#!WM7$>- zSIictLsKyxIY>lC;#oWp)g*c@BsVe2u3l`PO4IH!$_fK62%qLu9&k^f^0&+E*B{cX zeyPjI@L2Oe(QPF-HWb)L0oS4A9CjKbG6+i<4~An*r^pP!YVpfmp`}bqOKdI)tmU5B zs8^~#3Tq2o1;zueu^hPIin-PjORZ*HK*PTvUT#mY6n*6j2+DL&DxKzh0kx9nQ~IAT zaI%w+)cmtl`6XH8SbCNiOV84bFG*5LPhi^9JXQP=_BT(JAcTX=Q$>xi+B{VTAw0-D zRWt}|%u^*4;ZXBb2}3xHpDNbr!4?dmE!Gbqgc;D&RP+NID4}U#poFG{FyA!Y@fCT= zO=y8hBpyC>FC~4=iHx8^VpJ&^(^r7bAtO{7NX;mdsWW-wY8GNyd<;8wg!N@K`wWS2JY9w(i!xe!hJ>cnA{{@|5MDql zwD>{;FQ8XoUla+pjWkb%u?UYfPlX8xPcTn~XoRE9Qy~`NSo2hfLpaVn6=otllb;F# z`%CJaB>xzO9xODd==QT@u%qN0F36qZ$20UB2#xoA_I6l5) z1{=@Ch%e^jug_rPnTB{8AD=gajb}FE*?j!P8EiZah#UC$)ER6%Pa}Ssk3T;H35J1N?0lyNJRs`{s4DQ1zz~# za|Js`HuAE+p{eJvI~LOErw9+woX3PdPr#T>6Y-%HoD4=ICHj1zv5t3L9}0En_XJ^6 znRFfw2lO5qcFabh?DJIh4Zs~n`0#l;{2S7#dnLk^%_V>fsSsE3@!U8z@dhD2h>vfHV-s&I;$!*v z`ZzZ6W+Fb5kFSlx#EUg1At8xRSQ*DA-YUdb@$qGGY~tb47k;e4MR9E66(C-~$LGhf ziC2nvDIcE`CkoOT7f3*Nhf6TzUJ5ieTKL6dp1?2aOU$~z;{ud~L=;M-H!qN`{j5Wv z!4RY)BfVMet1k<+3sJl9676-71UuHFRQ)CT;zh8SyaJS|ux&5fTw_oL8zS9Bw6_?A z7Sr<=pK31;8F|fW&oI|6NA2q)!!$9V%ER;;-PjrYrCT^2F5i#JM8M=3Sw2m&s67C$!WX)(->V z7yu{96CB{l94@jta|1#|84p;fptt+I@5EX)|tAR!b-k89; zzkjYw{;Wbs2{#V93KR2Hc22x+E-VI+A7Q8wM%P@yPAmE2h-aKv%fr;;wHBpp34A43qon>8{d*qy;Xpr`Zmxgw{-u(Y*=?eRsU~cPW)DcaO+$0R@dln zVR`yCLcIl^?ekuet3(>DLi#GY@EYmbaWiWBvN1tzgQa%PH8Rq*22IrfT^Gbkq(evl@6fC7tUN1ZIbSCuTxTL{rkF*i zTqk`yRwJoeOaeMWX?mRmIM!A{xvHXPuamG4@9X#u#dWdg*2$urWSuNMufv9X{mF($ z+#tic=e{J&l|+C^1Q_dF5!%~)gA8`fyN=0qU8LX58>DMgDax0kd^xhpud}(um-kd3 z3^P_Dt@3)3#Ynj!#)?WcP^o?jl~Ff=N_R6VsvDe9b>nGNw%-IQ+8Yw1_J)Xx@h1FB zmLq97ZMsSNI_4voe}e{BlQ7p3fGGhOp&u#L#M8Cn21e|L$Ur-)Nl3>xUKIG!;U;Hv zxG8e=Z`H74Yi>eApnYzU7}v2kamad8thnYD@sqAX?kf8EE%J(MHgdBqxdFGy+Z`Sv z_uUQzgh%3@D73|y2qf7KHOu}2!)Da16-khEaX{(Gd#-czh zU06dxq?>LrS-ro8^tJgoCUZ!tLQVYCsl2;IHDdT72CE*b)ZAKuZmhBB6rb@rh1;Ab z-PuGa8O@+%KuKH$J$;quq|El2xHtfa_hWBm0;EcO%>Wo|0JP5yGkT-CH*GTFEKq$LAA_c|zlY+o;11NU zJ66Rd38j*5^NLFpQ(V#zPvhfXX#S|Ac;%Yv=D2gdAk%&j~ z@%d3qafw4bj*riY5_xcji3BJLpdJ_S?$APrW|>If)2SCtc=sV2K(g=9pG@#EsYJN) z4pr5XpgvE+V5+#60>(67!ENrX8SKKSLk;8hrL~wZ{s{WhoLVyKRgoW5Mkhu7cxLkx zQWTl0c%}d^!t;Ucv7knyN_0(=Y1LzQsNmnU$f6yF?0L@RN z1g?3G7HXxKYxU)8#i3{%b-IUINeCvmx}B0e4^b8+>6!-xh>El8EQIC|qXQ*d)>TQ6`! zoo1ri1%LlZV0o_C2-c%yy``ky)y1fHbx=u6(H$`owH+h^8Q`M#bX%kTzchw-mATme zu`AeWw8d7Vt@6Ki1!fmljI3)Lbmg>%IF|KNjap@FYU30OAEp@9M0hpCtca1+`O~g_ zxESdwH&-lJZ}#C%_0Yt?o*1LZ45&?%$fkykb@d*rg}pAu|L%NA-+Qlu=xRDWi1X=~ z>gHlhb@R*|rPj!Lfu5@nUqwF&;%2*BTL?31`mmLf^yR)oE3Cw=zT8Xw^sX8Vhu$?K zhYh5Yb0=>ZCif)OYFQg^Cv_W@lUf!Zh5UwMSNx^(`*EG0OY;Q2Xg>`$U5UJnH_|!ESEl95=m-`$iB@y>W|LYw0q6x97c^<^RyWCk#HD`R5NTwLD~>QTl!3YPVFc#4PAgwT677Dkr{(x!ZS}fNa_M5{=wn$c3`VW&?u7b>CcUD z6!?bz+MiSQ4?}VoNGFl^LZJ-wHp2}u*X~Mx?Q=W=@lDU(yAC97G_?g1gVo%#mKIK< zg*H#Luujbl?2_s>3gmwdon)kvgXZyCDN@=(H@&ImLZtkNQLh2qY-y^SvoV#X4B*D4 z1YvaFlsE(Xv6;z-!sP8>&Z`5<*Rd(18wZn#I042Q;Q8i?V*-8(VB_Pexa%&#?i+m6 zfN%#1_LYyP%@_sMp`Qj6N5|6L+%fPHlY?fIIshXlLAtg3ZN0}k3jL>1!CZHs1y-SN z1ao6tBV&f%(=~qRdEp4&=H@(=eE6G-M#xSDIW4p+R3A$h|deP>d=U z2JaZ>#2DQ;%*TLWXZ#(X88P`==TJ~uobw+z5B6|f5T$#xZ~z!1dzcFzzV0%J>od_> zdkzTmg1y4Bns^=AJ^dqi{f6LnNl2Ml&|hyDo<B1Cpw{0ukWuR+5YzCokVJ^RDvCL9%Fknd|WwOgAM zI&h8Kf=tFKZH90|Itp{eHE{|aCMtXZktnql1}7~HE}otTryZPTpa#$rF^Q>d$MMEOlq>YSJ{KlRV^fOE*}+4F z(cx5{{86Ar%A7at3T``c+eWhX{x7S9C|c?K5H77<7TzbQ(?E{^GIg4xLpc|YPpcm) zq}30l%23W5ox)VJq|K28WGb~JRwh?^)ZnnW(38Zn&cMY{<_2-)uaiSPE5J52%M*T1 z*mSc_x9P~Kx@!Y6Ls0Lx?nK^3>7-?sMg&4&LXY>?L95|0V%RVY=15Z1s}sUgjOn4{ zjmg?6Y9}?ev!R$(+BuSV&?i=l6tGS#;zH&6p;!`mROd((K*bFs(7c;-Bu;WCZ-$_N z*yIjug^_4WK=VgZ|KKqw@5I*u9E_ur+LwWxgChQzK6M%=eidd77I^Yi@&8!tv)nTz z&dx&H`gj3cYm2&NxV|6G=}u{k{U(Fm?9F^BhuaZ$v)C^dz1ey+`zhyfAYv;TKE zosHl|JC=ZTN<8W7Be`x=J(APdB>478bCcBd!h!&a=r$?SD|o1SifjgixF8uOWloXB zBF3*Ww0I;J?xv5xx*s7`LEA?N3tJ@Dx3kd1-WL^_p1}&;NPGqiFD?nqPKxBz)6?B> zDAZ35sH4?=^Lxu>s;f60j$r>}X?o_`B-1i4KU%5qCtqcYJd0a}Z!Z_LIo{ zy~hDVXZ*%zPL}!LEtYh|ur@_<$DGWX0Np%_+dm`?;wBC4xTBqF$Qav&FanB^K zuF6qr=2_3zpzn_6LjLbYqTLuy?^vpYqNt>Y$8bR|rAlS6lh%R7e;UK(iFsLLxv3GQ z8h$c^v!RVK1rn^y>s2mt?6^ynFnlOip6#B>MazO^Of~g@d_f&HC0Y484GkK{Da~9r zZX7p;2Wib_Glk6yL5Tf{DJ1}?A36XtN0?L$)Er4TnsUwOf7>H~ig;|jv@LVuZ!S*Uu$vH7B$Wz(GFfSbIz-+9+Q>|W z3tVr8#BvjzM40PhxxT&+(a(qI1WID~1gLCX6Vg~7t&Zg)rNSifo5F1{2fv!a^>Bvx zFwJz8L!J703K!6J6{Ly3M6G6ee)p-|xIu#YuE=zfbwWo4HTK`R(a>A|orrHnLOZC} zNVH%%C>A0k(d?<5GGUdQDj4dkn-bf4Z)Ft7=8B&`CiOFT5XD-{U#HBBGDaeOr85-m zOjhDu=f=56*FgX{Yq2dCu)rQSBvvQEUlp%;I)pIOK$mIU;QoTls43Rmz15`1j8e0U z1#SF9*&(L<+f$T;Dbu*#7OAs;8ux}J;uptFG|#)YwHkLM z*YLU-cB#53rY~t-jX`wcbgqAj$1EJF&6*pmxtrb8b3r6T=_@@Y+9(J-SNt@0zi8sL z{+Ud~8hgMWdnT-yGg;YyOjfoxx+@4z1AR z0{S~xg^hrJrY1ZhnlYLz(_Od1*~J?#&xtDiO6N8n&hgGVcJm#Vi=8!cXAF~NA7kq6 zw+K^lY$hB9GTFw<3G+!9ImO)s$vA|a@sriE0UnM#QB!v|YwCl%ZBE){Sr`uA@qxw{9eWUVu30M2U$xM%u8<%f0D zQKKFqS6I-dr879?ORL-(im)4YV>FD!2{$&Byl@jBtBgdZfZ}VrsbU*X>z>jHSDWtL z$3wOc;GF-^-@L(%=l7OugF9pEeRC!^${A9?^qVu=d!Crd&4|#u$}sc8 zWl|5OiWk%|AJ7JL9GeNyvLhN4=I5l$7@3pDzjMRP(jnm=ahpM3oW(8Z7a4zEd9aYcel*be=Lg(w4JuLBHpl-flui-~S;K82` z?mfshZ8KitcK@F(_{Uz*a*muuEF{d~5(L&ic6AOn_y2IA`#7HaP%4jS{N(jA_lB%a z6N!<5MzH>6E>>1Ql*O=V__bMV{5-CkH7{u%_lz0DzInDFdL}^Quz*;eU|T6Sfs1%S zP_7v(v~Dw-fWedF_up-16EMJX{EiJzIF{7Pj3u@7_+oB&*OFRi zgmYd{Y?cIbGt&BNu=!C1k24Pc!Pz*Rc6?fumsCO8@E+vC0gc3O zo6ER?Zb=H5R26QjaYii`aVtPPwdWYNJO+YF&fuX|?^8_Lc zDYp5+270!P(pB8>S8hCD05Au3|?CGIV1(^?Q#i9?1GA3t@fKCJ4Qhp>d&) zEM4rQEMyL3wJO9J-ufLw+eSf1)Ip1#c}8yk>Mc+u}x~4Qf4mV1gB8(1Azr%Xc_!urMXP#IGsO{UN9FAN^Fkdbth zKvHeIBo$AcX5M#l?WLSv#F`w%bJr(^`9))Z21CVDJ-&n?B6P+&v~wiWi{Mtu5MUHO z=DLD=hoqD$Ht9DVtU9PX7zgoI3Ux50Lk|C*!Mn-1Fx~%KEWYm(dM8>*AK&}s&xnyK$h^Qo>WT-^MlA@WBu?h&} z8nUdJk&^y@2XM2t@7wqKu7B5c`kk3GbI(2ZJu_#{%sfbn{>ccXcyGJk@~=JM!IuXz z^(b%*eoo))T;)Efxys!U@|>P9E2fRD<+i=OlS^s&*e=q+hC>$n=`n4VPy3!)a#>8a zTMe`K3G9DzqTGJDyolz+J7;CPvS|0W=kyKN#k4KnW+`WhmlL`6TZ`^-{Raya{WGOB z{rG?DCK+kkpO%o)*Ahzir0LDdDTVHtQu_N9dXRFmvy^LhJpY2e%_%gkcbDV^R(0Kp zb$5LIg5Khk(8k_=>Be+DS$j2j)bDEA_15c;W=otc);YHAF?R-<)qmDG&P~W{YIEfN zS+BS;o%{4Qkzc(M`HHgJSRQopafy$7MO@FZ&(0HOOOrG7&E7SPUo{+?72#iWu?O*b zuOVwqn6F?HP_oGWD=K|L?=jd~s$X_@oLBaB_9?ytj7@?6<9BbEdxi7ym80Q-CX7Urux& z!kKy44@F%2k{)~4e-rU_g(YMrLdNT#67n2E=KSx4B>t2TMo`)vlh%9&rmvZ_Ch;9M zfSE~>!zoMO-rwr1UX${~)%`>6_dVD#GfR*9zSTLBv-H);-*?cI{&DQb9n|WaRwuQ( z-@nId*QvCM%fqbZ%r;pZ9l-(q~ucC!C#J+pV8}{$q_E z>(=C9eN#)I;tks5;qZA?2Rr#s9Kfg9!>{V=Jbw6CyI$>WB^mD6@Twl|6g$y6-ge+s zeZ6x}=b+}EPRH3-nUb;Z+w5L?+gkmJa`I_s^e-K_PEU3k5RpBY1&s*Dj5qZAccl;c z{*9MD#Ii-&kOu;qpAcyMZ8jFso2@j~@=W>=Yi4Mzw%$b>>iaC6m9K9N`zaw;2e?s6 zpO7C4ZDX$UW1)_!e4RS|dpWnYUb+DvcZ6M36FFfjX% z0|&97)u*J@vMwv?SoNm%yE6@?(}q|rvj2{ch{2whzX<)Z!vb6$z#b=3WN_f3>=`k? zqOJB-?VC6C^;6S^Y>Bdp9z>G)667*;L{QY6N9`^HE?WR4Ry=5_Skjx0N}rgH6@O^6 z(wGf;zZ&-aoBxXUzT>U}{YSS35AT5TZGi#4Y$G*zl4G`ZRL5=Ye> z|0KtdzGSm@&%)=u_m0~(_X@IV^4MlQc39j*6=|szxz)+_iEA#WdVMo5>b?wr->l!d zyLXD|-c`XlK2~`+$#=!9O~wFf~tc&uUZr19^iy%ZhxmyNdbg?Ik-xBQ9x#uKL1_pZF(TihQN3*e5$+ zt3A8Ch(CDPTi}Yz1v-AdMgRQ9LMmE#>5r_PTa)0fVrCx9sw~as{5xUx7JbWrxQWhI zB^~>==zAaQQ=zQw!X>-i6&22*z~Np64)-cxM}ec|?_$Wa$Uobw$avK7L+<%@%R(HN zzGT^qBh!~6xAsl?B{r)#%%|TSj^7mPpHJ>H{(UG_&##}Xdb^A$EBc1wJjJT7r|9f~ zKHn5uHJscWz+^5!EakWK7Gmk!R;;hThH}V^Fi(lCDGuWMra#7U-Bx|=4Jq#5^i~`z zishOJr1B>U+g$@KRV^uVw(1)vkf*oBMsB_RZte5!W0n+4Dw7=#d$!fwt#P3)yC%V*z67_(QqI+j?bcAFJo&O-y{l zs+zT58!_~%{<>TB{$xAbQa_9uP{Maj>{yrP*s)=*PE^G`ux|@Q1HI*h2Um^b-W~c*pFTT;@teoKYO2`hOGI^!v|S7hZtY zi*9mr?mfPY0+*)S2a1*xSBtf{GAQ7l-o+Ju8QNq`Kl_(fsFG8!!8bd(JDxAsgL@~^ z9Uj(O)|yrFM;<-;7D=qhkQIOVE!)9cHnjPZ(_&pG&Wvymy!=x0#7BoYPnY^A=M5Q% zYEJX>H;w@`oaUS=>061*>3sHvgOA$nHt%VHHlJyM1LGz3k-!W+#j4ORPYYe*%hMclUGOL8^Z`?v+fEy<(SeTy zI+Jr&tY`eAkA}Zux8E>yVEl~0`>hv`^M(`Wf1p{!d<$;_4CsM<1M)^mfVC2 zy>!;$><5@yq5Q(sM=zbYw&T9$R;t{ZJrJ^CkUj0?z46m3!hW08<}G%8UvpxJXwJ}u z*k5*U?O{7EiM{)zkRMI)9TVTx6NkEXdSy3l^=V$_mOf2IjtaPnx$d9d)&CqkqLUv| zcUtROH*O#1vq+`;c5^akKtQKEe^4aA@sE9+#F^4*XWw{YmA-@9fz4A& zpRCf4Xs4f%{%4NQs`Z>3L%9v@EGT|Fenx=Hf>ic5eVU8K_vNg+Lw@Q|HLcJ;0TMt}JI%HOD3-P6AcSUUP|I$mAzk@iX* zwaP%XjM7i)^fk&U3+=NUUwx!sa$3dhD#r`^+2B}3idBw{`}Ivz3p!ueKCro=4v%Ot?6`l9?;P~ z4V{%+*eLD1CNOnw@E0Fn`b*oTOX03#-PsxA6X9g1BjbP`?tGHmCp$|ExmTC#!LMun z9dL9U)FJL&35&% zt!hx;9Eu+_Fe^`R?D~xF55vpTl&YipC4FN?4x92hjL|vv>^s{IvQhANCK*{d*5qbY zj{Rlcb*0-I^tuJ88`KgF-OP6ceeH=yYWJ{Zm~+3Ldo-Lq%p6>t65R*r!+mzaA3u8HMu z#~8=rCLQOTPv-pdrHxH`34eR!Jij(NUmDfID)m(vIZFf5o_KsA2Odh_Y1O|T;8zl2 zy`M@#atep|+!L^Ivv<(`1J$j;smB);DGOtStU^-p~N)tu2G zf&ZCzNu>2@^-h$P^U{gt&wl)2H4#J zjp9l9w)5M%cKP&vWjUsu(^c+r;aiW^{kdyo8vZ*RHa!fMt--{`+6&$1AX zoP=1f(BObU&1E4RI0Z}o)a3R+x6NbmbAyTa*G%ehaiGnoVU^y*t@==*rH?3(g~ z=9BHRZGZgn#s&v%*pgg{#IleZ*f&hKUp?Y~kbV`{>kDppz?+vyRF7}qJ+1?otz4Ju z9vJI*_gg)9R7|(^?Z=M@yRGj(cTOXgg>ZBkffXSGnKhwo=eOGHilJ%Hd3{|#9VOL; zxM$A~RGc5R{<3U6G4;JM)+@h?P!)f!hBZX)YC=lqp4Us&e;X}NUC^mll=NhezNsg3x_RP%TW)g-U`61B2M+msoZIN>wqg0(ZJZ(1q;2`&{ z;+SN!jdvQM_#uPiX`Ag?Cx6<7zvF_ijO8_6Sl|w-0jM=w$oN$cB(X%?;KlN6TdL?kOh< zoqS*Bj0*m02yqlS*}VGA@S&6K7N-zY4=MfD$#$n25TU+e?;*l*=K$MNyxa!FUKM+l zHTT##z;^iIlfl_@`Acpg_xFwqjUf)+9hTqt>)ymXPLFTw9dWJEmXk4zw(Pu8=2_a# zxBRmnQ~to;tQg8WeyDGNJO3osF6IgUo_{&MwA-HV9nSj(p4f$!XlwYn+&O+c@C0wU zvu)?4f_YKddt4`cQGUtCn za!%QGU%wb$+ojnqwr|w~mK@7G-Yhxx)vOWI^u4J5Pi7m2(?$$UY>VgRH)5!}+ z@tLdbjw_VAY%EK`0Rcay+-2j;x^kR$JTS=i^cA{Y*6jQ3z5k}$vMY2ONYPA699O&9 zZhq|hcgW>Ms{gYqFTX?h9v*axNppgl+?-D5O2C2X>e7jf(g41x_VFa6|4D}R#PPbD z?dr?Bt-IZ9!Q9jIJsdr5wvm_beFob`Cg&^5>iLMecOU;Eq31okm|WwW`2P@}x8}LG zeuLjGiW8Hi5~dy{Ij->q^W0y)hlBn0mmBSN_sa^-%APgoZ z)$S?}+jTy@Y9^{_-W2}E9cJ0vqw7n4785aVbx0I2=}m!>d)v-MjIJl_q1Ji z^MA`|tu3*#?HS3cS)W+P`JuL% zPJK#0=xO`e50pMx(x>#H^6$&}?@Ax@v<-I(XV46HeCKJq_PUd5iq)glEQ1w@T?&1N&nlNo&PKIt~uAjqR`DrD3+${ypi7 z)7GRfuJmm$+k5(!G~L^!tXD#F8bw;&%43@^C!DNfpILoRq1CPaa*b`z#T3-y0NyY1O8hgeY*{VSu&SRwXM0s z;h$u?&P=%J_b#Qgl5DrAR_CYZ}+w-z&$}8*SH>hHtdFtK^Jj{8i+qes~4;$9cke{m&NvM7k^U zZQ^-5SIvJ(cV!;#lmDaeA0_zz^?A~dDq8kb@(*ji=06hr@cI8nIrD#!G3v+9ynhrC z*>Aqk($jC-PB;&3e^JRfF6T@oUR+}`mE*uR+jTp(+v3&GI$*!A*z=ZL*Ef$*YZ)@m$NfLY(?Irk_^WdS+c#oE0`# zTq}q_Ggyl^R~px;ejd6aY(29sE6#eJf5nwGSWl8bFD<#=eODsP?7v39%VF!@inqek zuec_ZUUR}`(_SrsT3p6!iQp>WI>gmDzBI7SRy!;??Nc&y6>zQMTF14UD}gJKYdP0m zt_H3yF6Ra)S=gi{ifcC4T&{Us^SP}5Mz?5DFr-<_CI0J;6d5CR zofOO!^iRykRdt%exP-V87z0N;UcX?wHaSIXQpuIYmB&@g^IE2e9s{g+@7&fG`nSDuavYi~%`;4FX@Vj17*3)~F zE#a0geUNzr*C;NZS@Z<1nKS$RzT{zA^*kCdOyTO{YT)vI1ebGFabL(anly&1U_NQN zMn6V+7|#{QeaGWknjX}$_Es(SU-ImidcLImTuU@p#{?Sdom%)FlR6S5JcL)#E1z&ARJ{s0Sw3@j{C%jo zSxs>`d74{Pf#Y_dJDeQzJk3ZI<9OE7T(3eMuX&oA_1Qs=YER?m)HPH~i{nKvbG5^D zn6c}_o(`{J#!r`A;|LpO#;A11uZEG!IR0cI$+2;mxlxU9d}M_R9H$BCiW?msUS#RG z$uY^xjB&~sfyS1|Yn^g2|7gdbyvV~Jbn!9=oi}xfY&u(-cC~4+xf*#fN94uTuGq3P z?pkw~NiGn*z0m0Gt6;9t{_&#yml%Bq;XBsAX)x00hde|-!bF$^GvR8Z7n~RUxEP(hFhlgh9HW;tiC%Wf z=s)lv$!>H~7@Q8vV6D;1BSkNtM+Ov2UTbs;&r`yUPW2X@ItHR>YP8YM9TWXrhtV&# zihl8o(V5dlXU4!1xYy{HMu>jN4{m@(CRt}Wi_Y>iIx7m2Fx!XiWPi8-#zQh@?=<=i zYWBtsqx1bl=Lf=bqTkd;zquEp;Kn7QH}Z-rTPwP(!02*nUhZymO`PbOWkw$(-LZP3 zyJAImVc|35M4uU-%ncdN z6_yD}j^btwHz*K351%cW%Ls+qMx9K%do_< z^SH_#S9!tta3LgpQX{UzGRqTi-6mW|!6~$r6fBz>OgJ?J4bP$>0$#-TnKX*b1rS9t zu}Ee;z6!)w!LS12!z>ic8i#8TkWKzKR^pmWh$3$wCx0g{+Ko%HaLFoMLIuijT{#vl z_r)bxq9zTOv`Df(Moqd>@CgxTXbWdtU?NPyC8uynCoZ9FT%d9FOu!|fxCD!Rmxn7x z;|gC~A-KXoTr;p0R}9A$BjGx@9#=%;iWs;b9x}SbPjm?t2pOG>=>v?OgyxgbJk(os z=m?{yc!{1utG;`g=)0eRbj!P!kWrJ7-cd3a(i=(&Atrr?8ofgWwjZJ!(}qguRV7)( zcM*Tq=sA(1=gfpO<~g`>&IssZbaZm3=;$*>Z%Y-ujmEJI-!AK-8(zeB1|Lp?)I6yY z?#GwW_!8eH=iMl;WAP=uCY2gJ*Mcig;>weBKP;Dt*OQd^=ioLW6 z;*#VnH+)Hrvpw)7jb~#bK0^`yg&AE|h|gT{*>HS@1!|V!vs$`Q11_UmbuGh1)VR9| z7lq=Yskq1&7oo^^>9{Bp7uj*qaCj1)!$mc?s2)$aSRw&SEH^rha2nxEPijsD zGqG^yN_Yxl@t3g7OLOV}FST=nsj{|V34D{)2wSnpOe})wa*XI4S1iNxjhL*g3Cm#O ziuIx^HW|&jwXUO091jqEJQ&O1nyx&fzeSO6lduf(E+DUmM%%L<%k021yRk?V7D=9q zN#Q%gg~m`%gRtvxTY_M(x`Dnvf3G;%yiMb<5YWv~Laz;+{lT_p0? z#YXbhi{x!E^17eM>*I{9Uo5hIDfEW{ko48V0xY8s`{zy*#jxzEl6W2Ev z8QCyiWCPQd4aZ=Mk+(8L-pVq3R)`c3U(gEq!x|eAuyG~KhXt?`o-wkCifp1Ho7TcS zBX1-BZREdQ2kYS(c+SXX@@+0iHc}WYQWyfMK_N9LWGSbxg9KP&GnOcF6)AFuv2cNr zEhw@DMT$E_io1+#rNFHexRv}{HyCwuu&A3uj2gQ})Yx@KXaGV3kZtGSc_Z7g=yoj1 zFefF+n5w}|q``xTWkftBJa*NvWNV8$iIjDd&s|s^m|CZ2Mg}Of>l8x$yLGJ%oeGdYviLT zA|HjrOi0K2=my&o)u#YPVD{2h`rp-8ov+oxVm*m@aBU6g&ivAb=Vjr$$W_+(g06+YqpW@N&YbgwGQ0 zCVY}`hmn>fk(LxACqhL|Ofk}mf~_dnx)3gcDAbBVt;u9)B}3bIk+umCU$)`Pb}y0k z;V=Vc8TkT}eSyiom=2>L3Vne>{~+BzNcTkr;Yx^!zre)*h$Ma{#3ld0C8vr-PL&w> zXOBpi82J~z{}--LJ`*o;W{HunQbfK=Gjevd$k{bU&Y}4^H2;RS@C|LDdxuE(P9xtQ z6Zy8q$oVrO=g%4GL7^TLx>O)?snDp~IKqD0LL*;}7x{7m+yFPh5?E%WgNk%ek&b2X z8Tx<6QErYIIZc75DeyGDIlbOk-{#Wk3^7?JCc{Y5VTW-r9@fEn(g%`$JjB4MRsG6{aECXkqcPp0v2M1Dm}hfCK$_vK-$WsRKuzk zpK1w4sUT4*IhdPnZhDNe(b#N9U?)6d)PS?126P)`uMlOgB%X9O(lOOlc1?UWtTl>7 zAZ45h+X=hEdU%-D?M34r4#z-07zt;>^^k$endiyQByf%w<-7z^fU{M=ehNN>AVx6z zI-^`#M7gvZ5jAEtq^4u2>CI^jx#^H}HjT z*}Ev`F3L#`jS>|)n}`G=5+NqM3loMK;_a{o))_T9Rn+7a@GxvJYRYm^Q&Nq(ca5lf z*BM3UQQ-#q!vLcqriqG}4zXkemYhCC)bwzp?jI-W{y<2+``4Ldbw4J#ACpYiByfgl zFx{vJFzExB^nnss2HW8&qaqh_a&wVUGw3BV=p{2ep*Nfj=R#aG0~bY6P!t74Rl+KG z5_T9hGg#Ej5QqzBMkaHENoQixnTz34NQRkYn1#t^VX|3E;WD@vR>MQ^2yB9_M$N|8 zv+?z8YCfBq{}M%hi6X!3fL%sKyNQbSFlr7Kor6W^5}r$VF0PoHj4xO{P^=!PhYDda zTn*PiYW@&4f2c=Pj2IPzuVe7_!xZ>11wM>PAI78)$HOHs0!G3FmMu7{k!~!hwIHr6YQ$9|O9;ZeN zV?-^CHR=gW{{*K06$8t!7+8Ll1y?~V^D8W~$XC=Nf7l978ujbZqJHfQQSjF&`0EP# z|F0{J`VBSz4K@GGG1y|%Vp`{7TIXU+v=|F5E`t>iMHi#!;v?`V#HWk#>2GPAzol_5 z!L&;-?UFQ@Zq)DmME!1@QA@GZQY@9QQdB~wQBNj`dNReRr^D#~Pg4;8fSyX)Y1FfJ zQO~-;rS)Y6_q+{f@@8G>QUdQvj_xf!^>W1wBbYPh**< zu}o4G@@tUig}mVqmpzNio_)BEn|cc1K{^kX1R{7mEP#a+Fr5OTC?Jjk;vuG8ifMn3 zBELtG-}}P=7y?6K1dN0+FxGK0+)PY%<<=eDs7nHMd6MSvB+cQ;3Rr2>GKyYC(aVBh zFr+TasLQe?Fac)599Rg8Ax>C^6PBHX9Y#Gxb9{>C_!QoK3hzFJ^Pa+{PsPFo3^7kF z=O&eiwJ;Ad#5~0ivy6<($oMq6J{^mZ>M_z`j4}$FjDfV*XKAm`Ho!)smbZ#peiDHb zXt$FfiY231atmxXDrLN=lnD^yr(pb)W3YuG=8qWlj~MljE8t3a1Rgai)k9RO7o^6i z)Of`E&Yz3xTfvHxIaRnJ)!1OO*`gCfZPR-M?L^_uElaHuBjfSak z1;llK!gYVbl7GUIf7%ZZ8I?gZ%%B-&%!JW!FO~ZLu^aXnm1!51=?cB!2h&2**P_`7)kd6((xcRG0?S;ZbJ6y&4T;P=xfa zk^VL0zm`k^d6+N{6TXJ&U&HjTWx^Z;EkID5QE$=9-lCWN6;u8dQ|8f_^A^GlaFbE5 zyNi0=6Gp+=Fbl4N=ix=8)_aRuKLV0(J^9wJf$NN7IZ`FF9;x0S;tea}5Ih3Uz;j0B zhlt7#h0EYGkaYQ^%ddhput(IJV$_>Ha5Nm;Mbrj2NE_Ke z8`+S?TW144+OVF84R8nCNsV_>tm2^PUxxF4Q^ zoko?quxa83{opv_@!Af&R!XHysdSkZRptyw!ci~`PK68MBA5ZQAVy@7LzOkcCMK-q zBC6aNRZdSTrzh=PB5G#>B)roKW3-(ZZD$>RV{#&U)2SXU4`uTokhLx0_kt>)8F2wzr0U>smAuz*uFXi zra|JXt@u2c4>3qJ2C1%uRgROCm0XPts;dKlp37!;TTaL z`oUlr0_m$C(pNuR2{T~}Sc{Ie^Wc1j&sv7T z+BHO!z%oe2S}S80JZse7TtxlN4dUg$;pM-@LX7gaI*60%Fk~HutizCX7_tsS*7-ve ztwYhea2NrjVGN9e@h}l4IeZ>8qmuvDjjSHx&Jx#c)JJZjKJtK5;WWtj@zFC7gMNfT zKdOOsuoa$!7e(#YM(rODCqP=_ep=%G6o@1Cm%$374v44&2GYw8(8~^B!~?T2!U0;( z0b0)iTGs(u*MY;Z!Kiw>sCrkJ33DLEs>fLM+u#nk7gif}aD=FXJ`k%OoDVVDL5y~A zHk=D{;A%+vgI4+$*bb@i!EW9mhrDt32uO1{L~}Sqvpqz!{TS70` z0*@N?X^^N-gW&=gM?5wDm>PddjX$NvALkNY3u#s#)2u$B8GS-C`Xm%ifhhDzG8%ny zl$&El9WkPg*x^hV4OhUG5X&6FGDl9r4tNfpr=SoD3WcQql=PoA!X~2{s89nHYCy3D z6l*}C1{7*I1J4=tS%9d|g5WaVA)h_N%^D)sK@xmMf}@i}9SwtVFdkx=qgdu>8cc_I zFdufq9-}^=BI@&SxCkzWDEv7Je~zg?$JC9^q8eQwiZ-HX<7&7DcJK~qq<8;)q^Q4- zf*CN&sAC?Yj(I@}K1RXE$Z(7d$9hB^7o(1c!KpA6u7DJHoC1$m!5WA~k7Lm$EYXA| znxbJ0TnE>~E_l}P=fHV~G^2SFt+t6)+l23%@O{%o;x!4P;B3N6iC+dOpos#S5!{U6 zW@_9_jXBiMuRV=wq0zR`Xj^#R!t)ki=nsQo2n>f25QSP$sKv2swz)02xtr`gMxDSw zCos^7l`s=xz!Mm-)m2ohJ6sM^VFj!-s*NVqMw4oL1}=x#p$$8B@UD0jyyO`wN4tNHhGkW(p(YphU-iPV; zp#X0>&6`g1CeziJ^aH!-4_qPP4+vMYWmk>M_H7_NTX*}KU@KdAp={wzG5RAE`v}E8 zLjFg{-|xu=^?q+|&~!fu_EXdS6tq7UE`UqnGPoS3LNwlw!u!v`^F|+Fi|zn5I+!c^ z;97_R2T|Z)4Xndr6!DV{=*{Hm5ja z^NbUlCt=SukezbRN>~NiruF29GDDIVi;Wdm+mKwi79NG|#^zzf=E124k4%^g*{t-~ zX>3E?#5U9m2EkwiIU~p&j)Q^Z&m(_6>0L=rya$__9(ze2Li$kBjVIj%qn`~H{cH#u z)X#=-GnEK7pr6Im$rnYZ;M2EgY;R%86dGj;-SVwxTbTMSy4Q*>(JRif zD~f4fz_f2K6#X`)E}Sd6kS+Yp$SX2N7tu(Il8oN6Tl5x8UzAQbm;PULj2nEqg>JNk zZPqQAeoKL?2$`4<>*64YlEo-ljC+c4&u3#qf97X&$7<0X_?@i>eR`^~X|{58DlCA7 zuoa%fEg86lO>pP+VskEFD;R4H#9D(+CA0T?hMP{v_PLu~Y;Ks%`=hF~*d5}IA=@xJd%qqdG507~4>`OtbUJ2_!tCLgJ%V@?^hhKA9PvGb z@8`zjJP|aQp;m)QCn5X#!^Vhh*f_$CgqsNC&taU785RujqZbX&Yd8whUc6~9-rXoF zrH5k-fBtN>NGCf$7um14$dDbu%Qk{{Z3M5Z2wqtcXW%)brjKKxHV{sLlUSgg%L45@ zm;e*mfMvgAlaG;qMu_|~63&G@zYTe}Auqs>wexYLn@PH8BVVo)`I3#FMP zg1DqJ63&E+;Zk@J1vL}9+ltU|8ye0>!-YoLV?^3xAzMc6jgTFo_8udr_KKXUCcKF7 zV#p3qJ3Bz_o$w6L37;aosg@eL2ULdkL4yM2~c9^5tVUBU{EEVjg<}r^9D4|Y z36SAodljrPQsU032Tw>1OQ<1-wuD1lQql#_8hHoHyn|)lSp{?9S=eo4M<|B}c1+=h z-n4_>RO-nw32#W_Dy4CiE`bRU6PIG*vOtlt@h}ah!_{z&k#f68xhtg6mDA|T3t%DK z33nUW=`XS~046{b-`M~gjqLJC7TJaASXB^K6=YWlEaM!;2+m>nKoqDzfeL(CfiK@3 zBl4~v#5M2Yns=$`yVUgEZrEdF_Y{%c;V=VcK?>SULGO(gdCwQd!zGY%-lLpK%9l#R zO$3aDxp1wKJvLJ_vw$FyBax zt4NJIOoU0W3!XLd;Y^Vaqv2YZXQY;j)l#wAa2NqAVU>};`HK9_A7;T-^nca>gf#$R zoj_P8kUAP&9gXfI!^sspTnv{&3jBxyKiUf!vG=3MeiYeH1@=>c{byk}Cs{%`$r1`9 zAr?C@7tVwEumGa)0Tix}=Y-1=`hR@~H(eZc3E-$p5G;lz5P=5~cxX7o_DIO{Lp(o( zB8O1q5RK~)jq6YYY~*MRHT#&F@yRZHvdhOga5bbtA5)>j!6Ju4AeKCgB@g#-geF-y zLxYb#!AGC);1eEv!h<8kAHj4-Fx?R}KZ52*x*(c=8o|+;NSF)PLKOWJMH{AY#3meO z!BwyZ)^X&<&XF5eNaJPBB%h(+XDIkt9sU2adLu_ia2Cf0lHe!_j;6tMh-Hpqna`s| zK97OR;4_e#eNN3jFMx$c8Y!TW0vb`Q5yct{VKGGEMil=0G|u=;hsCf2qVV5Q_*e}6 z|5z+H)gs4gIirIj$5G_?0vHGJ{c(JM{0KY>$#|TM$1ie5M{`yu4#q=j(nLj?LpZ|| z3Kzk}Faah)2C!xZuoj-T@Vuo0R&ut7^5q1r^h63wgH^DGLp>LURm!(0 za6VY%d5qJ@SmvG4?Tym)cc5zfDfTJ=& zkjaTKIgzuln-eokF;yZnHC4t8><#J!ZyNAnH+t| zfh=1%u}Ux?nv*Uuun{(K;)Pj~omrB71Kb3AL=6<92FAh#um;v~A_m1=f>?rcS<6kH zQCInhx@t6xgYg`dS;A471V{!~G7MrpV-V{ZgF@jH$a2gemSfzAcO%}7d~W1(I|)0C z8tgA>Z~&yHgA-u`Y&6Q9a@;A$Jq;$ObJoUuF?_#_ zseqLn4)Wn}5T?5s*W8S2e4RNY&muUL6bWfVKcfu=84f4eA#E&( zHWm~EW8p%$h>iE4LT-wQpr9ZMx&zJbK(jk?;ab=Tn~WMiMb!9kSO5zl3XezOpHtw^ zDe&hdu*|4nY8*_B`TN)^I1cWFyI})tgnW7i^XVCkvq;pJ)n%qfECZO>I zG@dX5`oJ;J59YyqNE?|z8<`lu@u?s<56*{Wu!3V#STF<&hQz^mh+-iq7Sak&a-3=! z$El{nb( zDh#H>3`l{Y6gb(NV^$*|@+Kp1GHq!xZ7B=|!%#4c^kKLqIGa2N>3bB?Qnb6j0~-P4UD=*AKC@G$4J zNOwQ!?oWa#uoIr)tA7Fge|j7@i~0Ot3K2XV!4J6d`R@+nU_3kok8o}amqg-{$fm}=d>DZbXTU6Y5_T9h&tKHM07(2i;^*PxdHDE|01k)+K?-<;0vGc06 zFxeBBEDjUJVWPNnm;vixJtxuJIf>>8pMlF^C9HzAa6c#0JUN->4P)T~NI{Dz=+|zX zQ1gH@VKkfv=feV6XjD8Fh)<#a$0H~nLBFwca?KTvf@5F}tmA|l;l+d(=fbs|R72oz z5%}9i*u-*;FUvLlMy+V!Bv89iFRT>xLMB9!7f|E{6n+7P(`ifTw58vkA>TRjjU=CS zj3WV!642<$)vWWZVe6L+HDsuv71z*;KSZ$)QLGkU*W&As;zWHEZ`A&1QTt~@nHf)6c-)6XRVdusTVu>~^(Y{wyJ1ex~ z@GWvgtME}n=qaSo*_5VQ+qob#aj%E>l?h?^+6JQcdG5X<2 zq8}#y5tgDKVc+Ai{h}W`Wb_luML&^>0^ukS0ZSmO!hW$R!V>hYY{cA30k}{~WnL4@1$zto{d+U{VB{MxrS@H(@L{PfbKq)~f%f0Zkjxl*RG~ zLyVr)E_&7}6vQ%fvCQ1Fu-oW|DEJ`?j>!-mlZE1uC_WR#t5CcK#k*0w2gM6eybwhe zp~zC0{0ukznCcd`f^O+FIsgR%LLuP*!nd>EaeI@|fvKVcR~Q|1UUbk!qsQ+QJ$^R| zq2MeOoQ>sXW4Rbi8$-?gj$sL0bqnclA^ojb>Q*c@E)W+@!Xm4%2o*@4j3$#Y$z&oX z=kXg!Oc{}T{ZTSfo!BsE3QL(}0JxB;TTLlndar(*()zFS1!?PBy4 zEH(v;-LpgVJv-q^*kSa{EYUMpA>R-A<5>Nl6~)b53aX@_Dx>GnSmq#LP6ABA0y$V< zHH~iqjStQ5K(Ra0u>ji@<1yjg-V`_jo`L5nn6@-!8UPaKK7+t92=qgs8v;inkk)+1aAYjf^ zEU+94&=?_J~@{@ z`TL`s^gPB|FX5*NXKvus-X^26CyB}q<0#isj&d#Ipi?*pogz5q!=UpHgU+r+9E(}Z zaTe0E@uof?{RgD4LrxuXj`@f>Hkz@4a0^y>7A2p>4KHEEmlANpv-E&x=>eP1ir!3% z=BHAcpGxT>YRh7y-a>7*EN25|1RF4DUt9o-*oYa)M$9OqI}q4Gtxx0k(;>#@!S;oR zpRopkAgyeLPO|$AJi%j-V(w56*`@$Z;dzZ1TlI+>^D4 z{1lkI1SUe-SJG5|=4ky&IEjo&BuJ`&G{mICkgk_XjZbt!$<3Y{LTEu)ub2(c7u$c4vm+?Jn%p6O3)p60r?RG`een=&pF9r*|cBlTN}`60#l1s)cQ!-Pi_J!8*t;;J}jzNJRjO zy0V?@x&c9KI}WOZweX0sT~9@>&vaBhV@8eJ+Jeb(%~q7(+KHKIKije5_E0zlE`nHh z`%<{9)bkJKT0Lkz3sxJLpfVSUS>p(K)?Aw$$+pBywkLAoTDTkTWgB8V+Yo%M6&1ij zwjIv1?QoIph77hFn3{Ssxf{jteCOUoB514^O@`6_3$QNQ8)P`s2f2&2+BYZ z3ixh=J0J!5QqWlDLt~i_FHxacAI@zqTY-J zHe-RJDbzHaf~nc{)a-f$UXQ@*nb}>>%rEr!D9B)Z6NB+hq`Qf9 zz8Ke+iJmVrL|CX@fT=cPs?Ag3G%|XU(VKjRe0K8jmbjU>gfEKthLO*Ue8Y)9Li|zU1BoAxWpL40 z7b7W2A}J|G_7#ilOD^H2otsl^AK=?6O#4D2bJ`^0X$$*k3;S4R+{ZFw)hM2ife5HV zKo#*-6tFypbN{PJN6q%t5xQ`cq!p!M(yVLZl3RMgiWv=o-(SEaY$9#xuKv+3aZ2vmAGQhdQp2A zFn1$pH-dJbgXekf#&ZvdDfeK?J+zTMw2|G^WH%LgPm6lbndjc58v*I-l}ky7$=Uc* zZ0spE_S9}Fx|@o==f+aSdzQdaBpd@1VG;@5N$3eHVHFwh)oxr>>Cf{3m_< zpc28A2;Os+^xZ~Pg^8+~3Zvj`i0i6w-R?5dS5PpPc@N9Hmt4fnHXc;*poR!){2n!a zkA&}$@O=t+p8`IJX6hLO=fj13#>Vg&8_RRjy-&Ii5cmNCYZei|n0Vy9kGv0-6Q4?a z0`ZB&*Asu3_?5(GvQ$w+f*KOM-^ha|5@O04O!@vv!W|?;&<6-&|3=l=iKm9|Q^OBh zh;N64KOkI#Yih9MVdNY}&JhYaLP1Ap)JJI4N9awT(wjalh9$5AcG3SEB1APra+Vbh z8_@7GE$TC8h+?0i*k_wykx>kU>L>~voeHPHXW(*(z@rHK+(p#qZV-8&Bk%K5u+yk| zdO1+q=7cVUrARDbhFRaqwoeu_%p&s@%>SJ|GA)$;fySnYQ$2F$ZJeS zU?V1M#Dsre#aY>0J}cJoS+U-zCVbn3Z=0!EGc{|T2j?5rI$KohTo?!AA&s+@#@R|+ zYNai;@w|=a?58RA(^Oj{#3gNXyEeLAdlV}XvpFj|p8o&E1a64MV#IbZahi;SMgXU{~Yyc6@8BTp>krjdvyqeI+8hYW|);A}{S5Hf`1Kt5N4 zry^)3=^IGjN_-;mNpL6J%kvnX$MSqH&ufTBfe;i3VLGf{D5LLXGJUVbNEi(-iVoLChf`2E1>HA6^nIa_Ddv4~#Lp#uA!M!`j)M15 z;C*&D3I;)@s`oLay>BICEAR0l@%<7}J@gYuzIV~*4c(EA6huI^{XCHZn zMVAdMx)ibKGLuD@c_`wJB23Q5V&buw*v}V*{83~HiX^~lSc^hy|G$dvKe+4a&iDBF ze!m~-R~jLv5i@Sa$=a;tM=l18m}Rq=%ck5IBBq$jq!=+`sua0g=;ZdMY#1rd z$vBKKn9__QB4iO`z{o~6#*|I76tiqfQ#QrGMmDRdO%W-CNbiF`UOYcP&X4zbpYw_5 zbI$wol|ii*h0+<6!5|I)?^E89mld+8h()a|+Uw1p3m?;G70xU6F~HziZSXv~odI4; zp6+HqF9THYtP19+aE=zu*@3$mP{@E~Rvt>NJd|0M%C;;un*kjRIL3e+1}rod7`}9t zcjRRi4A7G0oeVh6fD8s`vG14TzF&^7V!$c}taiTI`RbLp$`Zv~OB5=8axcRUFl>ln z=NQ(+u$LHQtjt-0JT}Mux$@1GZ-FthU=70-GOT_P%eW}NpJhu}wv=TC&(eDtww_@d z8P?CRQw&q#V=DZg`gB!bm@%@dm_c_jNDEhM;p$F?O=s8)h8YV_YVp&bG3*P5?Pk~> zkLL=HXSvm-))23+-241ja2}yZ|3@D1~m_O%U|X#p8<6j-T%yW1~u#J=59RUjZy=4Yrw0E zL;O{)e`}9->er(9wZag;##0B=y)$QE2^t#*S9$&qu6FPm?#DxD^dIa&1s)v4AsofA zDBfmlv}K~MYFmoMSc)&<%gDtd8RKoI@H9?Y_=#HpO2Jf={vV`2G{XW=8rB;Ghm3(k z3^=q8Wq4cPzMX>$@fh}?!S(jA6(TJ-tObX;@Guu1uE8y+3l49`UhKnhyo5KrrZV82 z(|E=zLAzCgqgE4EhWLS1Jl{Ux!l3unS$NPw&;IbB&1!W8!iY zUt>_M>5t;;r-k_X>DEEG{&kPz-Vy5_qfz{gWg-4X39iLwP{ZEPuy%&F*J3KBt4{;p zUFi95S7Cd$8w_Y?K>He$v4dw!tK;vUl~BPQD(Ju?TzP~mkK|(ks_2OHNA}?Xs|YVx zMc|39S8#U}7X}kQr-A3r;YIucHRKar@JX8I{}Tp$a&Hv>yg9@_f5pN}m4%m$s4K2T z2G0sy>Ac$YAK@WvcU?=aY00%!Sn2vz)OCLMB<^=l;@5P=HC=Jdn7C$4Tx-L_g59k; z#Ka!Q1x3fdpC+n3h-w%0d`kvqTBe9BSBQ#ET3AV1Q2FK!%M#90W}ztP+X^g86k|Dh z+>+Kml8fB80Fxs9Z5Ci|TfcMg|3&>X4vd9xVBGuv8t?yWcecG0{k_%k@Socvzt|bV zm|&E#73jTptPz`VA0EJVJc<|aVif+%D#m~9!%pnNFVF(jXQ@^<(lHaWqVW0iA$4DLV*)=aX!9+ zyQA>O;t>8=ifi#1JcXyDaH%1LOO5z4dLO=Y0WU`3%N-$nxeGPuOAY$+3Qk&jxa`7Z z7rt5;!dHvX`B%=bSdzG6N#Y7mT;Yi;GF+LA!k_kp@Tb?1p?_lN)w@HudJmq!e!PTN zqHt|l2-ix``8DU0DIrXzVkK5Z;rg`T{}CfP?s}GkY}|x3QJC5m!qoF9?DuX*n4T+G8#EJI!TwJ!adp;2eT90*`ZM%xOt>*U zgc~z39W#*YZ!E->xC+;xsphPcAvS9uirr~aey2(Kol9^j{usAl8y-e)3wL^3C~{up zyhy$x`HIGI!tQ#~?s^Jln{s}4wu2%UilbQZiV!PaiM3dVE!c|3u?H1gtl)>!L+s%U zWWd7=cz89g!58r*Jch^d44#c*dLdSl#MzjG3vm&adgUxBbKr%l#0yo4Id6$MZ;8ow ziOF}#9()Z=zDrELOH7_iOrA>^Qo@ksDIvBz6=&gHn2UK>fQ6{s<;q>ILCZC0`SbV! zYS?lOTi%`Nz@&OP7cJ+a<(KeE6no@Uh&^)py{?y|kCOE&sZmKyAr|2koV1ylWivAy zdEx)?!e$fo%_i!bm9<$}n;E&8ku|(k!&|j$EV``4Ew~N66V-Yr`bpBFO$s((BWm_Ve0B&w&q2@e&ppRKuf;m-LTdu8{*biZTq11U;9!#r zyKxU5#tyuUS4FSiBYOQ_%*O((!v-A25z*`(pVvG-uV;u}&%^>OM339+9=F#$F0X6$ z-dUp8@505n1Z%L?bNWUkirt^%H;&>l(d!e^2Xint3T+H+W9UCLS+m@3aa98jX~3bo@NU$yL$!Dnrz|gPkZDGE zy9kR>zPIIj+u!c`w?{1xudqD45=U`NRJ#J-QQ$i)e20PWFz_7)zVkA^f@3%yg?9Jb z-EUW5y8_!=aW86VyOzGIE8f)=?>1l~4&WfVZScm4gF*JXTP#$yUTrr={*c1+8T z@!T<<`^Own@VVHGJFpvj@eH074L@5nd=A!O1J-kC7ngRO!wbUUwd?~e`=A6@puzKj z!Sex+e83|b7mn+i<7HTmyRZcraGU}Elq)S|LJK_9<^ApmYknRLSPB7%3^F#RO0&K&>p8viKVepy4;Ty3D_4zOL`7f)m8gS$ihQqJ= z9h?#d&yZ6LIkgy@3xA)6JoYhIKaRGo*3YXfvY$bg?}vw;a}?u9dtS977ibT!$;`GY1dD)^fXIP8zZNUk<%B^ zV{`fvUJ)Lz;D1x_zwO37cn&Y%B;F7vUnE?<7#TLmuwPFXB|igmFc;T&{(rsJfds#n z;0)KD;W}Tk2Vb&>Gp?Vxd0mTsqeZ@055IB!H+ylvF!^c1*3$^?Z2zpB}<+23BAtc48MY{C5oho$J4I{dYgcE!c(KqUUc$v7h7ebNcd}zC5Q7&T+#h zvxUp&;1XPlTKtI?e{u|uM`474BMkJRSn#1(7*X(uf=6D$mvIC~qi|lAo>%_)Vl2f2 zcnG_(7wfs^JlE*9a3P5j`qDgH=);py_>Ytj{v#E)V>1rmVB~+86T&D1N2MQ?ew2qs zdC2l$usj$>88FI#Q63xRu}|lR@aaNaip#JL8$AD?8a$sGJfF(&sSFoqh{I3AY@Cga z*o4wul@6*Fh>4hjQk-DXJHGr zn(sH5?>Bn>Ck7o1nds}YKkBnfT6{^1FP+2z6Z$L@`fOz2mkhj|Z(d)3#>!=5<*TH5 zeG2l>S3LC91-xipKWttD9 z#$eJIy0BaPeh{`Fp?O)X-oz}{>!45EzUgw@bUEIH+i@HxqFACl#1a+a_DuwDF%i7w zIQIC(${BvK(i-!$Jj};xT!->clYg2Dr>St-1YV9}-^d8DZ)Bo$-;gd@Xr7)d64-C1 zc&nM>ts8I?4&spbewI&X`SktRCcZyMe19(1V6FK6I`RDt;`vL(^OxZO4vOP9U7lgO zJVUw}(#^PxSH~v_-fWy=bI)(Ma2d&*Lk&8%I$+X;b3+gE;>(EXP(`L*Lpf zu)j!Pe=+XG{iuR;72KgEcWB8SJaY%nWUULatPLn#mUMp^h1g#vu^3CS7yF{vJ@VZn z-#xpqC5nBUq2Ffcw~MeCrTeyY**AY-C_BS}3bIv@y&v1`KYLO5tJ8Moz53ki)#u(; zWaxKh+jq`EuKy0#f9GX0!TjZcv9RF%ugZesGU*{gi4%DJtEn1+$1u9&i zMGLfOfr1t&Xkie)A7LRDAg*=hR6L~dQi(H$>wRs)b8O0t@;R7msfZ-1?`~e0%z@P`la6F1F;=x5cxJdd% z(l640MH=v+iXT+*gWcF0#qxP5zn+WoH#w+@Vt+k9#Qu6A7Go(k98Ly)Z8J!uU4@A@(LRybvqM#}ZtD>MKxR0YmBwSW+lJYsMYn@l3J`on_)|AhAq)0OLWOY#==9!!b1l2 zLk9Ij40?z`54Gb_?8j3$<@qlR0{_!OtZ)`CL)(6ZJ8&1OxKPD~Lpbb1fNUQE%*HLa z4R>J+p2Pth#WCLnXz@}lUaFj>%CRLBvn3S!yL{gR6kr`T;BL?V-|cZQfP<}x;PuLHfOm_!&-x*h-$SU&*B_xpd_w ztU(2>RM5&197Tg{r9t*sVTe6ege-rI<*VddCEuz7EcD^P3Lg%v#Ak4Q6sxETv5IQk zjXYeT!tbl_`*-2pz6Y2lY;(Hjf3<>aY{VXS;qmDxqk!PpcgvHp4eLe^<+MhDopVHS)>FcK$@)SeXmii8$ z40XX;U9eV#Yp?naK>DYpe_HuZ*Q?-ZEqz)`pB~2v9|lzTFrX4Uu?tV(X&(mM>%#zp z>jyIaK)xR|ViS(y7#d_hFvy-M_rX8~uE&jd7(0A8km7rRR5Ui8H8!4QSpBmsdv?%; zAs-Ip`EY=1*X_VvIE2GK7|8U&Ko)A@54G@zE!c|g|M2GhFYuBN2&7vt-TDo<301sa z#m~9^oa@i!VjjBxocqr`@A-euD1T1E=Oo;qf(k zMu1b50Hvb$&FW6^~u{`jU4f4nA&&us|txi3WV z9QzzO&oET_`O@EKYw13Q-De-;zA0Nn3ulM;!n`Q{-FS$9Hz`_umT2`%d33$%R(ji#>QEiXYh(;zwGd_|asDADt1!{nBpy z|6(UYI)|e8`?mMqw`0?_D#W`gov(JT;x6TN@xYM``8A|tTzL#Q;`$NwcrAzz+wmD? zz-V@Tl!(m@iI|^@xy8={-I6bX3WsN5CUW_aA{mRL_=GN*I1nXfbce(Y22SwM#LH3Q zHd{Tn+3J}wWB>#~rzwIoW+v|}^Vj?K&^xD=~#o%>nt*JnqGl(vvav1c^1 z$&KyF#9tLrF_lsol~V;(QWaIxI@&;+l8IdDa;3|aE?2r->2jre_#}1Ec50?Z>Z5Mj zMf;P9`iFZR?4TxUp;p>UZFHDAsVkXSo%(l&YcQ!bU z4edO9B>EpauOEpDVpTiyjz+6?UiinT@V)+{(Wcn6&AXC`A7$-qIvOo~@A=NCDpCKF zsbpeHpoo&BJzKPAi}q~EAnnjY^%z)s%)#uw&qYSmNj!JOAQ% zR8gJ*d=!N^Ez%-Su|Y+g)#Wy7ppT^aNScqN`AC|Nq&bmK1yo2yR7|B*M&(pNmC5?Vi7E%x$wXfs$0u3``0BCrv_<=hG~RG zX{_EqT5)QEF4I+-N+v!I$;2lcXcN^?E!9y2HBu98r)JtgyON3XU8I8ZDmdRweKbJI zJ>N-Vq^|SoI)9QFalXFSKZC@Y^D4fOL7BvW3rR|)Jeo~8luId;MG>V_w!Bv{pUS9` zYG@s8piNXnKGcP9-qqS5=4b(_Yv^^Q6MieNOQYcAzluJ33 zF8>6z&<@%~*0p9%C8KW@;9fdRZ6ua+W-oOn>!X<+4hHBX?WZp4R$wWWQzm7&HcBHj zM1wR;W9}8FLL0Obdvni7bsJ_TQ zg;Y)zR83XHy6eSMN@Y|@>qx7vYt{8ys-p&Kq$b*)Ow0-X8>@^t5lTNNiOQOjg7VHu zMfvBXqcZB}uq;4vl+(iLgCCT)y# zQ(7PC&NSWnOUqal<@X!axWz!eVeMl zR28PGFja-ABcy`c-Mc-VGANU>$T;|>G`Dr>#%j9Rr8kdV`_@!4N>_Gz8P(+YrNtlaluswMMXth5Pwr{Muuh`pqUaW8Yvl9t8!&!MV;N(I`0#XxS za4fN`*3Qz3y0yFxT*Y#@i9(hJr{+4gLB-VlIs4H*0B*{^it+wnDWaIx_X^Oh=WE`ekV$1Nz zd*fAkuUu|x)Z@qBD&OYHEOmoT!ek{^b>PAgaUqp-k{XkuOkHvdH-<0bvw5e@ovJoQ z+cd}JS!&HmNtl)q<@V31mfezeQh(o-B&FUpB_;q#OJc{ zrssA&RRyHHfRsy)EIC&#gbMd6Wl_UC8*I_|aIKnosxublYW5|#qFvoxHtmOD=ZCYw zR_b4(2lF3WDZw1Q(i)7CB5AKiOOC-wk$8Jg*;MbThlux>3&gv$udU2qu6y{Rtqc!8 z2z#jHNB2$~moY-!@#Cu5IWDshF3nILiXNBPlM4-}tQX=llk#$ivA5j=|rSe2f?@XiCWUE=HZP;cKu;4N? zS(3I{s_}2t}q> z*eg*Bx;wMfsvjg_T6d}0e@stwhSZG98^hyz6-Sva= zQ0!1oo21HZwtRW?jPe;0S@$DZ_v2}=O{*VLh_C5zy3Tb&^5MzwWSwh=Ooof#BAvGn z$%0GZ5}j*?WWr0~r8-v)alsXEh0eYq!(dM(LZvQj7~({zfopX34oQM{!Mk*>7$U=s zaHGy;L+o%H+@|xgA-U@K&*L#V3hmiT%+4ZK5{)POwVJ8*{`%_SZo55^TAW3~v)WYU z`OdvOe;I3c*ZQNKHup|H{6Dx2v>{Rf|@HRN^+PxsNEP8CHb4NlDoz)I*G2Y z`TV}>Y;|9yO-*##?FsV6>MV5`_bubT#GoiPao^aWD7M*SdppH-AJ=_tIouVcCMuWN zd%7kOhZ;W>P7i$%-B&!}H{q@ce-51$l~VZAEhsAGsIkg#?3eU=wsL2+%_UE>=Rf>` z{IES=o|ftIR!iFYO647UKhNq)*+mZFM_XHWS5RAj)~G~5ZO2&=n{PAi?lMwrFBYlu zRWFHqx4*aAMyhVBEUT6rGHuCuM#45$2eoBqjfxf2UOOu)*2kG;dTcX0F=R-h$FK5b zs}s-IuqyAT6>?J{H|4l(n(C6YOQo8e zda}31pG3iAscs_SKI7$6F`tUhD9!k>=~5**K6%WcS4*ebU9EF$1!loTOI||y>eZ|X zAw`c|P-_fs&B;~gpNYqmd*XY0-g`B2OO@}m&#AUal2-Lxj>~Gui4cvJKO+2G{#X zsI6yL&E8*~<4RG3l1Eo3_YhUMC#w zUtDjd^uOyV+{~Jt-Amoa&HK)bP@B0W+ckq*Mx`sqyUg+skp@ddK1&l3X=oRbTlI(( z6A__jtHaLPFcItm0=md4vhkBl*=1f&=X$z+T~52!m36zJ=iN~n%D}6Pv$I^Oy8hZoqrRH8)f_Cvs1eT?Voo6>N3<+yb0u@aAUfDc zMe2lZ46@wkaa_~x#;awg`h423X*O->Rat80SqTejziJcBPE?x5+eD$fI)-lJRl8$o z_+Al&Ic#LB1w^~x?7NIhEti;TP|Il(RZqf~+uKB*EgO@oPBo@9;`YwY3&gjv3-xR{ z(O6D2QrpZv?Ao?kJeWU5a@YI2IqT`YGWXgrC9zvZ?8vQ>cJo$cYPU;1i9<1a=iPPSnr2SPd-#GkyG=GkMcAz z%*o~T^muA@6p{QswwAOfk@lp$#?^#!3do+4bgnL!XRB#J8>Xz02SzzASGLIG%plt2 z!JUYkH>eCrxT+JbYJ$rAgk;D1j4E$7anR#YmT-{=M-9QCmi2?#k^brjksps{IMwIq zcm{5;yY9<1K1XdZ{wE48&-mQBK2i;1$X_~LET|=g{kux{@0O5%C)e9u(?kC4S?^Rm zB9JB_hCHlAjJwK3b$xSOq{qurX(3opYdUR4G(q=xbjah6@Z+YC$FJju@V7>2A%E9d zB5I=tt@18m)QwSI>*4a?^)N|vr5jG0L*su=i&k-zIoORiN|+exs=T&B(evlyK402e z{VB!%mvD48ofi4_`DHt+o$8|mKGPCltYm0&*NgiNA4N#D)waTBzf#n5&|Lg1k?gLW zRIw~|F|=4GnhKwnOFIcGHyqZzdRS$biOO2<7Zoi&sh%-*5DB*Bicj|SaWo=H>nD^v z@hPaNJ^M!4*DGy3`-&8MrPJPVYlB*su&*xN*Xfu2;JtEfl&kf2M|9_?F0RwJKbW7Y zejy$ArK-C~*R1tFfBo9^^n^?p#1Jf|4AD|6gVY2!o%{SRnUx`$yxfj&AE7?+l9JSGr0}UB|-xoRl29`>>>KJ*EuoJuxc&C8fA`YE*CI z!k~ka_S<91E4|0}e(6P#B~dQ9*vRk)^CfNHG5z*K0Vavu-basFmdz-!`%jrMTXjmr ztm;w`vzv%n5iu(Yxw`d~nWsxni9CJr(pK+SVpgtuo!*U@oosIPjivYem<$pZQ`H@0 z#jF=4?P4A{cKVGQ?l$7`5OMjmS!wH&85>+DX;&F)F6s--N>S3#k%YZ46!xx@W(-fC z6fx`)Mo&SdbI-YNj-*Xo7pgY8mNjQO+PHN}P2a>$qqzBQ zaq~qFar39&nKw_gNsTd*bIzqWO~B1G;bveFZZ?J8hya}GM4~Z?XdM5mlHV_})4{(= z+F(7ZqjCKBcgpg9Nu54K>?Fi7JrM7-_|SNav^n=PolbVB5tm{R}y zgvht1QA%6C+}JfA#;a>SRPy>?PRP@8l@JW-2L>aG)|xLZETsoLa4)AId~;>w9DC$26#As&;3tHKjy zxOxy*QdE6zzTfj}oMquG3un#~UjJI%*)=D;IJ<3>No56!dgfd$ZI!+|}XkpDm)1hzU$X zOEc~|jXFIq+n?$b9jn{#rrWG|!OrtaFd(U(-(?p#h4kPH;_q@UloqB%(10+NLcPPZ4C)@HGRPh# z(L0KTpfyAF2!$7@XaRDl%C&k+9XZTQlA|Sz8G=(;IbKLulSYm7dhj9F@$F+B2gTz+;-82o%pmon#>wq=pS4&r_5hQMt|%TRnDmfJKGAx zGp?jfX%an^&?LL9Kyo;eeAT5B>bWNV*5jh_h;WgmPRo*1DXZBR<*un_1w>nRK-uCP zkrA~&!DV+%Q1harvB;8CP~|WY@Wa7*YccLD;^H)N#nBBrf8cmms_7Sv~W{Pw0-m)c+ke@w&>~AbD1_= zeB5kYGmeYK_3L!yXiBn2^4eVwh9*o6&tL13D4u+&wA${thN|I=p(}_9YSG6AChAbeq`cDCVr^L%+VnBxM+++)9vn( zi~NbS*L!VuFZxxCOb{=J=cc-(r}%I>s`$vYeklvZWdYFPj~&MaGfVyS3DPKj3T_J z$%b{$#krSEv(ubnl6c5s8OqLIr7kTo>MzeJN7F8vfal{oiP)Fv-is9fUHATr5mnyS z+pC!Ji3)NT!L-iHQoFa&cj`*sbH@K$o>TG%_x6l`&X_G4gSK&L@^iIQBRL@2h@0Tt zdT{yS;2zL}duoJn&n2ONg3)F`-9rJTaHYyyJ54Njh$uyy>1~Xas+0qR<-72FF&Q-= zoUJ*{qU`345ZTlAtljmPo>A(vB3swtdL6D~!`V7gk4T>G`hak)7s5x+MzU2*7DTpw z@vPz=QjqjEm4OAWsp9djUUY`;9G1QEU1m=tS0w3hb^fbc zbF$POguH{0Cx2&lOLu=K3iOHLO4ZQUMCEAU>Vc!~&2y?mamRn>uCi$(hm*3iS({mE zI-9>aOKrtnYp3ig+T78S&G%J_k~?v<1ed*s=T}LNxTI{=5o;6X$_)5}cG_AZjOom% z5zD9%JH2XLgP#Y-*N&EMUV<-0LG9C{rFirGuv`*gBqB@Az;Q-wP<#4l+2(RRuzwyc z!&Ut-$?e@dGIecLj=Hi_6lQZJO|#EPnijminvylVx95Ck596%X;>_yB z3tX!|@0z{X2tY2M?rq*|^GAZP-uv(Zab5POSg+q~iQl`r1D8MB>cDb6iomCP^Zj#v z;=26gqQKE$ByhzwqIay3J|%BNKl9^)5$R+8@$?9_Ft}>At2(n7~-)F|74N!9la{I5Fv~Ry+golxN3`4u1@dW;}?X} zOgJrsWA7Y=DYvC(M)e!|rZ+vu=E>R{uVyihmsRKTUwqE@xx=5!d?n$}wRC;0JU-RX zd7NHddVT4%`>OwyGkK=qy{pCFqpP>(l(3`|on&`=b$16)%BoB0qr~;?x~sjbS-yRw z%y4%d4xQ=`A#Xp{y`2;G)~Da_9-g?{dAk{O zKT=C>pB$XxTvEM)-2g8xytsJ&h&kA7J3?2b9T+^P`hKo&=lXW8|K*4|ylgts%=OO) zdn2V2DNLxl^i_?DIK@z_MkSL z>7dw4V|YIzD%ib)m6M|ecjD?|yW({9_Dm%Ol6J7d?vmza7l_aQt`L8}u8>{j)nZXU zXQtqqiYjl4T4uA`lV~LC@L(O@tA|B?iDbm;`88Dctp?x5=83yrtPrEfc3f}A^+$)z zzWlqxBKPFM-tIVhSvb!X&Y!4Iwz-BRmLZ5I7+XOt^uaY8#kktLB9g!2skF+Q>9{;eOq}|W zZxuX;Rm26gQF_9}z*2BnRD=i8oaz=L(v_%*sg3x2Y*k+pSIHff+|m1DJyznDEA?0v zg>GqCWz3(%Ep@AmTMw^NGDlzDms@MNRXrr0XGI~!9xfrUp=rvaqeu0P=P5QmsJ(qi zJjIGU-hZf+tI=u7$D{j-t7%+acSt@1BAG^@embN z`*e`vx~!LntMlVedxP4-LuNf%eMr=!&4cW2r+=x_7{I3yaWS3wBq(MXVn}xpeepks zD|FG!F$4_`saK$8sipW{O4ySQnO)mmheXX=KFF!Qf$OwYd7^axqI)WYSZ){plf>=1 zr-FWb%22!Np02^uHF%nQ$eg2QAF9RExq}orqt^tkR>h0`wU|R@eH?yB6kG0~>D6|( zSS!DomRX0py7=kLoSPfXn%L`5Gw#L=Qs!qQN4@uy@@U3{{y1xm7ZdC^bZ4SqzHAiE zT2qyVjFDG$p&fP+?eH&+B7ep8O^qUdKToy0CI4<}MJ8@CyJRt4AJ3=pUGn*q#iy(; zO5Wvt`?E;icGl^SWzd-1#fGK$v(<6KpJhQ`FmS z_BheJ7va^SEzMzeVrHHu9BU8=I@^1*$%x`C@njppObRgEIIZb?;=#*FADRg7kJ zH@xMLKc?4}+)&RA2M(Iq7vCtdZ)7Sv3I0)}M{@8u>0o|+(Ch$D9~3##FIDl5N$s}n z^(yaZ9+fj$$!8a%cFgeWxFOLYGU;jk7LiH+)NiRzX`NT=AMR`w&nj{xBF6gvjPgDH z{!Xzk61k#Gyuvx|-c__@Kgpnz)n|&0M(edZdXgdI32wX|+>PPj9@2w*CPjJfisAja zK3~6nS@?RPe*M7|W&agpqI#`T`ehD`>ah*J*eL3o}Povbfm!n+{W-Ci~OIp!4Vp;ed>h-fL z^%WKm+1a|J;540nkf-|`nv%G>Xr=N0aa?g_6qk&#HMZUeBJx;ocs>))7kp#5Y57Kv zbkwfTm5F1A46d8VBCxAhDrI8_#wUfs9I;ZV8at>Hw>3GG`mu?g zdqeIz6PeR_Jm~0872?iD#qi+=r8WHQBBuTIHYR5Zu5*pgyKuK3EfCVg=a0}D_`fft ziO)4?0sem)(!}St?nX5BMph3oyn9bv=1Eipvp(c?bx0FlKO6G;Zy`;1t%SUOF{BBv zA2W9o^@UB*g*~Mx_2W`JT_rWCYfxKtz-%{L4v2R1)kT?3F@%SP37H8PE{k#b@By>I ztUn+c%=U|nF40YB$B3!$d!izSiDlfej63c)VAh}~4u~4`x6mEea!2wp@=e?_^1KLU zD$1HG2Z#t(;>nfaVBLDKOG2LX4JA_eab|@Gb_aLt;EvRAu-EFr&JW!oi914}Hmqp> zbSivlUa?*5?YoV=eI;{z&rbN*)K$qJpBR5d$dgZ2DEEvX=y`dCK8lh(j&3}=cVls_ z!OWgx4I+Dbgl>3ch26C^&q(VNdOTg+;o^=r8_evfYY^FUdZ6K|T-*_g=L3;=GUXB* z`32lv;NkX_dVpdKuGRzGGcc%4JZud7C3qo*?&nBW!3w8a(r!m#cFxTUxc4{Vpr6r$ z-ZC(f9U_pWxLb<5xq28*!uX>e#)g5C_FTTrPb^Z=I*RCZj|*F!LC2xf4D=-TZBliMJ=_PdCV&;JX`vV$_7iE%|Bxyt0JG0ZGm-S?`F-_7gf{nvCC;Qh|r?5SEyg%Ew-RPNi z;dwwa3!;l2xpX~vpV|GgoX2)sjos0M;%+8F&D^s?GuP#hX(gh#2io0P{z@mC0_2a~ zF5Jd+XI9fasJ*3`Yx8@xQrxx;7>3)YoK6opxT4(6cxe>O9L8a!t#``~NVq_K-p;Gg5$A1RM?tK5R$UPS>T)6m+W+ZSJ)DU1i8#Mi6U8AsT&juUcyWLW=U1^r9_M~cUpx}Q7vj1Q z*ON6-G{W`WS}m@h7~sV95L^>Ya$zCv7UC{L6AeVTyGg6Z-9rPU2{`OQJeT5RX?KzO zRJ|y~0D7&~jHCGj?6{d;o$b#G6^Gb)>@0PnbX#mZrw&rmvaY<2``2|h_H6_EMKGeu zcF}`LA3!bQdKFQq+b;?_iEC%}3*QG05F@O9q)4pDQ5qY|lvlD!J&WQZL$5e##GLA# z)_FE<$VKnRNR6wb#O~VF2N#@~#N*~eXUyeWaWcX@D<}?rnrAnR&r4Z4S-M@g8Ns16 zmVP-5$_WwA@kkiSDREWgsRjE~yCdas0En-TeT^=J=i=vWq)x}@NVNBxxI>#nRIQ z{a>RpHFFj7XbYpgEE5T@R!4iee4FmoR_epBUYrZ)C28}beVaE{i6fiKqJ6lyv41W_ zB#KEC*&p#N50{uWHM(Z=R^8>Vqib-Pg-hd5sL0OyaXBBCm^L=LcJoeLdL-?Z=vthP z#Hn$HM>zc@PRnqLX=%~*n^oP@Dbe+~?2SufBR~W%4m@taC8l+cZr*%MPfA8~GcIj< zQi@2*E?i*R*(k|xV|va}foO@U-R$WnGVVH@B=%-{+MC0@QL;ZlchVzT#>qFji*W-) z_D{sk#NIaT<<6qeT)H+HZ8F;PorOq=} zyyDkUP6B$hpYr=_26{&I9l<%!RkLMxu1g$<8FV<)(Vc2r%zckoGC>OUq z($Dmru(~EEMQDi{4BF#*a-zwo6mq$}SnArv;=*41FmB|y!C|e(obrhCBv+T>Y_+Vn z4J*ZAv(M&=clBfjJ1r{9pRGq?VN@28$nN*!yek90K66ECibW_R=B@M9P}3Dv)ksz-BCTAGsYZA`-iOrKbH0tM{yT&71JKEiBV>T$aaobbNPY3 zS08wgb97B7tmm7LCQu5eO+}&)J&<4~tw*_WEn8jFhb@^t;(%LTtm2y7Ck|fM$EKwx zD*2Psa{DHVji9n>scX+95x}gQ!@+2O>T#nhDnDDT$gX{QsEcP1x$O2aXb%Vk%5@d(vT_mi#q@WQ9Z;y@=onAxE#E^$Kd6H;P$#3S_4 zRQ5?DUBnJD1=Bv4jImMDevrK6$%o5%jFEx!e|@#+G$>ms$_NvEXk>}G8oGGk;t(ZIA7k}&{Na*|J!T#_ic zHm+it=Mk3w#DGi5Nj0M6k|cN5=ANV|6lA%i{ijqs5lUU{Nn-QjsjgX@#s7>)vZ_+l z%%I&Ko0L_Rs+OFU?FV{V@4N01mZtRTY9ulnUn9GXam~awC1>sSWNI&y zDPh`WOrXS|%1I8Xo(PI&6*>Lftt;D#xWu%~qjax)#B|_<*BoLvosB;=N#c0;@|Z&Ms}8Qyd1;I|9^L}C z=)5>a^pO3(Rx06)r`+E6N@p zohhUa9{R-``TR1erbO~mu$5S#&nK@<$g9{I@{oM7}NQ5 zJc}(brt>kl2*z|i1TTa!omF_b2Vr?g*p1+YG2OvVcoU52{4aPLjOn};-UnkkSHmqZ zrt?Nv>TeUK^UJUU#&li_dz=WEF04jy!I;kFa2AZ|{1}`MV>&N^=fjxJ55kLKOy~RH zG8ohO4tO1m={zSs+oNtlz;xjz9Mr;?&eP!r7}I$Q+zMklXTy$UQj~1)Sl9()`t?iU z0vOYII9vi_I;X^YC<6pc7y9C01B~gM0B?gao#WtLFs8E&Zh$eJPsdRNFsAb{IA(xN zn9he_CyeQ=dJx7VV7jmy&WACbcf!Rmrt`nxMKGrGR(Ls#>0AwOfH9pn!rNd>=a=C+ z7}MFa7NH3N(}mTrG>}R&(BN`75ytfEkHHx*rt=aw55{zU5S|ZXI^PGE!kEr?z$;-) zuxI}qgh~WVcW@J217kW*hj+l3&Qstz7}Gf$ZiF$N$HLM@B;X>0FNG6fOus%H9tLBu zN7|o)FcAUM9rT3@VNB-)coB^090#w2F`aF2C5-8O+D?|kn9j%GIvCUW5ZnY~u4WG% zjfxQCq>?xd2fN{97}Iaq38%xD&i{h5U`*$&a6XLbTn*2MF`YNUi(pLWm*M3w=JJT1 zZY_cr0n;6W5>2MW{={yDA4r4lJ!@FQi=do}jjOlzS+zMkl4~OlkHq2uPDG133 znC_r2oB?AxC%}_oOy@Yb2*z}_!NoA9^Xbl{5XN*q1}}#(oe#n5;B}smpdxHRz;p+@ z;aV8ec_-WeV>)kyC&HM{FT?q;hd;Wo7NH0M(|I+# z2*z|ShgZUw&X2(xU`*#F@D>=;`9XLGjOlzI+yG-b-vPG`vU$WGU6_NAm_`cH4893Y zhcW&7bT|vfbe;kiz?jb2@B$dqc`UpX#&o_Eu7EL}hr^X=9@=e4NI|H<0j4|X3-5w4 zofF_j7}GfpZi6wMZLmC;`N3epr-$%;0tkbSLzxf;9f9&7Ow|7duo%Rkub{;c27Ljo zgfQq6s1m}U?NAMbL0h3+5C(0A8X*jN6KaDns1lNg5YZue`+pHk12HZ>2W3JSvAUkY^~k0mMKjv<GEsLrw^TDxeGq zgUX?a5C%OC6+jsD2($pgpvBNq2!kGgRzetb540|w{+~bK?cf$JVvrl!1!2%lP$Psv zGoUsIgRX<*i|HXQ7Bmq`gD~hSCx|R5C)Y(MGyu(2rYy#=zeH9go*L*F0c~Bpkk;B!k}M5+aL^@ z3DrUvG!1HkFlaIq<07IiLD^6mghAt=i4X=|1{Fh?nE$4OOF@i_gP}4Ag9butAPnjQ zRYDjfLt7vWii2t)42pspAPo93m6`xyPz&U^l$LfWI2`z&#=p$$yghB5?H4p}Ef%ZWd^miy`H2E}Ikmq&K31Z-SXgq{LUdRn$&}wKY zgh4ByH4p~<3EBi<&{C)t!l2(lO%MkC269|R>Ms*?uLpF27&sp)fG}tdv;e}O*-$Bj zK{r5U5C-Kzl@JD918s*e=xV3|!k{Z4DT8@)h9Fle<6km}fy23&31LtwQ~+U6e`q0u zL5WZqgh5@QN(h5uq3sX`1ye{pgh8#4d^z3K<${i-F#e^37jLKyTcvsGXCZ1crjSaMU0C>pi&5fE`ll` z3`&AFK^T+()j}8)4>ds;6b;$OGDjRMsLe@TgD~g>lsT61k3Zm1FrSMUbP$>kVNg9( z3SrQ0XbprxpF&$84Ei@z2Vu}Qs0G5Hw;{(k8s0cTZ$ashhde(2VbC9-W(b3R4<%knQCunL{~#CS^5|FsP6RP7-T}EG44Mm- zLKt*21Bv#!gjZoJp56&GKyPQ3a z<$IM^=DKDXn;dqwB6E?1ESCqhKeve2e6%F6^qxRAUQ0G!D`~Z@re-eti>)qW*?)T% z$t}L|8|N0gey5d7=Uo)ltIMieCfkytDqHnUfD*hZxmMoDqu zB`vpAYyxbDx9gnKDmDQc;0B$?wTexER=8E?(XC<=z=3~`$>RPItzr|v2|IO8Z55jU z8E}Tq{aW=+fXN7xb)iSA*aRqoi*$}}6`KGhaEZ=Qtzr{kDZEtYA5Mu)fC{)m=i{fW zn*g09a}yv&Vh_t8wm+BU|h-bYhR8lQ<73 z(Ya7O##y1?%c~+Z{k^hHY_(HPi}y-;nMHPaVv~Z}xQ~O{(a)ltL9O#H)Bny?fLu1R z#AcQ#XQo1)z08I7@}(dOES2KA=KsXe8L6u{?o;cZ$>xz+6-xPPdW2Hc-kjGQ5LU!K zy*!1(qf>&KroYQYq|vUYQHkfEj&>V6Y@vNL{mYTYj;CAfE5~t0Ij9w#wL6Sp`&)vg z2{>p14)X{l-&>R-9+{uS(aKu0qH}U8D(ptF-Dp;rS2-iNF^@7$gE; z24Rp0ybQviNZ^8~D4tLiv5~Nq4l0C${jyT_%SuIaHIV6tbyQp;Rp?vnbAo zX%G+BT9lP2D<76OM(&#b2!|UU$+sw;Hl(&k$}CdRQX0zAT8mPNQn^%qBjQoUA82iV z$hRn4P`3P`%%UVe%C_C3wH9U5GQI}5Onx)s&qU8-?A<+$d+6yLn}i|uxLepCMkcG13fI-wiTR>Ss@2{>Y68B&+bba!}$uC zrO1I^7OfJk60NsIt3j(l>toTLE%)$0guxnE=F98m}1c~ zRujl-Igo167Cg;<>eF&ykVUIPt3pe&Xl2ikkZ0t;V2id7Z6DeYL-Xj_ziAB>V~rdb zYH`?x)`m9BqPd^tYlhFtf#DWy1KI|(5f;ty9D~Jka$uxID?lqiOSfoM&#_rsg?O<= zjCr2pe$UH+ODtMGT0Yt+i&lYFf#$Mk4QLH$ms&KJm&)pu1EVe4BD6(lmw7B=4Pp&q zhDCF%B_(U+z~vUL5Umhxj73|AwhrwIirO=wMMg;K6)|3(+w@Fq>?O*wFr#bL`P#)3_9V75go`a6C4-{ru~R_!gcx8y*P zMT_|dx%v+|@JowUiB^erOIY)8IHro)S|tZ=4U1XoVzk9*Zi`l2O_5Z~fjJhfWHSTv zW;r0{E@ndN(CX0US+t3MhB?0+D7I)T(N=m8e`OI{5L?i0vuOLa&}D9s1GihWHE&aq z-j)ONEm}QVJ=z@>ZSp(Jg5Qw?cUm+bnh)(RG}^zB{lm6W?px)+0*k|8@1ngc2ky3L z8_+hO-DA<3(3;ThwP*|8qb|HB2TClO56y>mUqqw*zfZ6Cz8tteBB~QVBD+441HZOt ziMuGKU29QZ$rw)hi@_!EyDSY#31wR8-% za^OLWwh3($+CvttVkdq7PC4*fiza_bQ~Xj6EVgJ3Xbot;vuK%hbZ~WY;P*oFgtFhU zn~r8T!S~O4E z9=?>fM-KeKA}&N*i1w&O%iK$>_sW4kTC`RFU!o6F#cb%ab^S|-m@m09*6WW^=tre{mZIeY?7$n6(Iq-Lj zR*zPX_LfDPEYTt)Iq;8=rqBO;h(5$Bi^CSQ7PM-Mw$Mf(HaW1_qHROlhUT!$>k6aD z!6-T4x42szO?MkD2ew$W;?B(fiaX1Jw=Lq1&P=7y-mz%1ovzg`2mWc%%FxQtYAo6= zv|VUhEm}bwxf&-2-nD2oXfS?7Pl;u-DY<-j(J!z#2YwD&DqUKiSN7dh~OMN4+j zaXI9`hZe0Ctrl&&MN8^Rxp$QV|1vc(|0_T&K>WxQ(VX3=G~MLDzb#ra*_uqY?yzWX z+_`c0AB(mIZ4KJT7OfGj5$zKRzZ38~!I-d6{&Jw!;;@*D#R+m?r$yU_whir5i)Qb^ zG1ne);4_O>f>wgI%cAW<+lBVIMN8^QF7%WGUs&gVix3wfera)7k5-RXXVLN!$^Jw+ zu-l@Qp_QTSv1qcc#-j~v(+)|mf!5xt0Cg+-?1Nem`Qa^P!=mWP&y z_KijJq5072Em~Gz2CTkvK(%N)`cbL-$$|YAP3}*n_Vkwnnnf%@EJ16qXmTPrnIVmr1D!0I{VH+PT@J)rwE1ZB(K=hS^el$xEIDAeXuEK? z>ni4daTZbf1vA-S$boo^=Ex@CY&p=?qUEFIqjj@rat^H|M-FtiXg=Kea3@=|0^Akg zEHg-*eT*3YBMbMDb@-sRD$#k)4Mh`-w6t*XB-Pk0-v zds}{1x$}3)X+|u?mV_At<6Dkw1)X%Nl1;q-PpQdHRNnbr=BgF<*bl7oZM_8GOj!i1fP_|8d7s$0FE68Mx; zJ$N-wt9J#TC!8`9-1{VN>?^N+0kQhHa<#|lDI$cT+!ul zP`BqsW07y;ojGJ?a8UDH6MmiEoqAMGv>E$~ef53CA@@cq@o8IRU+Y2@ujs@GHK{G~ z6xT#je(eO(IZ4&F~92elWEWd^#O9pIF-+Iz&iJ%op|W*eSl z^Yye5G=sip4R&&;*iY;078T>ud&HfY4PAaB*De&{7;0H{YJbH@;2s}mv{cx@IKJmYEGSK>3Bca;{Db4D6WSSlYhEnxW7elKiu1MXUM-D z&9(jCvdy{bOJmgxEESle4# z=bfHc>sLwg2k(miJFE9s^K$u_lEWE}s@P{WD>dhTuH*dAby0J8tLXQp%1>wLF9H-j z=?-25$cvkQoaK7q_AF829&Z92z#s262ZFO56wN!|8&%!>ZaLp<3@iLtz`MrP_BFK7 z^quh__8k8`W-QGH{lxbo)%E^kqy0@F>$u{Y^Gz2XUbqdfWHx z{BAW}h|NqR$HkW|`^kJsuO&gkI4MTfIj>tmZVa_#U6*jyx%8~_{~(1Lia31Gv>?({ z#4B}7&o2~_R3dWAc@d%fLoo?QB!h@#T=zKMYsbyp32Gl6H8=K~j*2q;zjhJXV2Q}N zS#0`Y=J40Y#fx{vYj)X|zdN)qUw2!m34d4b?;@J;kJfZPxIpaMn{}k4l)kP9z}rKp zX4Z~n<^rYp55r;$u4CeJoigyz@o|&+IQhDuc8N0Y(NUqMAhIJy_EmfRJ9%?ViaK4g z+Xu+4Uf!#*!{nZE-HW*^2qd?*eA-1-19T6)&a`t?2N#wUodEr^oBwkD}*W`)}U# z;$31N-mYB+wI|Wdu3>^&kQa@KP%hmVNGF3Pu?1mw-95z>fB>W$+CfiX8y{kH&x%3`Ug0@yk^QrKV3sVE&A6^ z^sjrBjms{w9Z+^I>-jU@^*grWvEFe#LcT3jE_&>;TenfB+wypo*l9CaqF?T$_sbO@ z)zT%rU>ODee5aVc74fdh!YSY^4NI}<9(6xDA;>s-QK8)1gH$<}g$|gO# zJruRON#ysDQ?pz-dU9Gh*(7QG?-UbRksSSfB6OYh4my~r&8_sC;ss&TTw6uk4mIsb zp(JkL1=s`i-+EB*Vl?4bDY8_L<9eQIt`BN0;g>4*)uXeH=vZ@i*Bv$FOr*E#*+FFN z%@XH(#JkAEt9K-K4c&P~tF=#g^$tqMQyWi%6it3;(ll4fZQ>x$l~jVC8sCOp&&jsy z_me+wd>6^gr}W5+X5;6Lkdij(6pe>B5{o93b&9siXZ~vAI6!6g{zg*9h*$Xke80W! zyP!6{UCgK5p`86w(wK>4-9)l3zcrFA;uoRJFfLT-7JjGCL>A05YTd_2YB|1Vwv17G67 zW262ipMM|rQA{&Winkdo=IUaut~zYKJ!s3}8m?Y@lGiMdQ?Jm~F6ZSc%eRZ_GqPRB zYgP>ocTr(hUO$2f(PKx$sz)u`&Pk~4ya?qxQ{;W1ht2+d*&{{3eM04op!a=kg9r-j#CV29i{|gRO)eHn%5LpZni_R2*t- zS|$Fzw<=35>%{6|ryO!U$1l(^J^j5`i;^ z%^swmL2Eo2x`$(No!FfnlX*w^)%m#cbI+lR5Ro7LZZ2FZ=dq>y-O(PP1aL+ zll4@kx->LEbmwI;yma!AsDUENSMiEYN!#9{`_mPVdW1bvUN7rynJT3dVI!=bVJGb~ zhZ;w%%TaxV>6>b1kfijE6{1dsr zgGe|Rq-i|DO%p?0S4%D&3%`1^x1I}YzqgL1pHBK!qz~?BdTuAxq8~5%{M;x1zbRKK zgMKC{`;M5;X4d==%NMuTh-b8TDuUTB@NUHG℘aHxy6t3%5O_%#CKHu#6O463hpc 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

    {*04iXJR<5*DAtc!OAsIE3*f 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�o7hrgTWV}efwmNQ%^IOy;|6K*HMIDe zAvla@l{=nQo-h=K!6cXh(VQKcvzvow@wlQP*V2${sqnQ__}XGv3b(>4JhL!`J*Kc< z4UJ9&SU}jx!&*2EXYd8H#TU#TIznfd1#=*M z;s^8zcQz#5*^hKbGwx`{JqU(C`hYuqz`Y7?hjnb*yEhOZV|OzCp#k49D)d8a`a^8` z!_6>TX&ypo9tyfbcZh~O(2yr4^TcEZYh1r@ALaRz zr9WBvH^CO%%^YwybA(wi2hyK^PJa$SNdYJ+pbj?RerAXJnFB<*x1iix2H>F50waVL z7zJr_AZ-q$je)fB)+nLf8p{Iv)=C1^M2y05{M175S6c^*VJT!p1~DRo#^DLv);w@q zGe8Quje>3)fn&I@Ipe;z1~LN#GXn%~f>}zto&J0~{rL_ma0eBL569t${hatS@Emj7 z12!!A?O6Jg@dIT10M>W_Yuui|g-Kjk#DyhnCD^f*;DGNGz2HuI!Rwv8s_cTt;E2+; zqrvTH@Qr@nBn~L8Hc@D`$-HO#zbd-_sI0C#-{bo^&(S_L#8S%`V$o8=7^-N9Wh~2~ z4z-Li)>>m7$J^ytYf-sb)^V&!s6&N11W}P-fW{iow7Z_r2Akw2!8>yIhqVF4D#(Ssj^XtL`CrZ5W@ z#8F{Qhzd8yQIUzeqNx(*nL(ZzZ|ZD434LvJy(FOJ6V3DI~{kq_|9 z13dFU3%15lzPZ+X32Whz79LGbnUb8G#_|f5SFya6<%d~rF0`nWA!8Xb9w+0JI11)I z!+wS`AU35q#Q6~CLrpmjHRbq;sn%4c#nC5U4$&u%$iNyIc$`5D9M8ZBJU4;o9^}~v zALR)H?8L`rgM$Zx2O@KxQH(e60}0KRkQ|I;$VeU;>D-RtX!Obujb1I{A`#EPZoI09 znnIMfS5C!~KNRQTVq`$Rbn<)fdK}%;7NUDj#QqyPF3aSyQL92UY7Oqi<~aJo%n*HH zHeSVR5*Q|d5pqy22NgcRS63#AU{YR)CKd3&EFPF6=eOmY;lmgFxM(8RPE@v&SUzb%98FONrl}WQI>PKYEBn+<5|?-{lugYJ~25CvveP4={|n#QV3tWZ02vOnLm>)>vx5)-iz#u zPkZa{Fa_yF_OKV(HztR~H>TK#=OzAKFY)D%hs5%A_F(z>S$jzPuc)#msoK7nQTE07 z8ENpsY4F0?wI?KYJr^gMri4V3X7p3B{M8edAmn78qAKO;Qk83- zRx(d3`H`~zQLmK(b!Nj{yo56JFUzeIXm!=85LH*EJCNgQIetNa7cR%quSNLlS*ULO zy3YhX7hmJz>yMjoUuPm+WxT7@==ws}mu?8r(waD0 zruHvm;Ic!g4lLJNDwk_6Whz~nO84_oA^Q0k5eyZYwWWi1B7w=i^|L;|r(i2>F4lkns z%QUBDJt*KZ0VhgmqMR*g_26*{E|lORY{6C$EoR_Sf5@ZSAM&U}o_oS`2Xxk6QY`4f50R5 z2R!7oM!1>};%Jtlnl&Phz9u7In_-cb!9GllDzZXUA?I6Hg=njyscd3#6N{f^$g?i& zSr?)`a@;&NM9m)9CxU$ixfcM6P=sjirp78Gp z|NiUgA1PPYb@ zreS6r9a3h8Sl<0%h`I;ksOLtAdTuj7t-hKcM{mg48#!2j#n#K3td||c!`Kl=SHyco zyjL1=Zyf!R0e_s4?O>jR#UgrCMCG^v>*J_TPWoo-teqNT++jS}Cu0KbKcap|jFQ{&$xDwkSvSZ*@rs>zsZdXG!>9-V(>RR~{MWB%KCx89UP zeJ@@&4?fI1_;B;y8_a*#U?29I)}CQndlq(KcO3r5c=>;fmj}}P`SWzlMDL@-hlaz0 zhQC7%e~0PXB@Y_41fo-NLwwbCJm@MHbSd8XE29{tcif}+*GsoyTB#-$9I$B+f6>o=s-t9{6N2OF>+pO#RDgfc}~CBkYC%1I5ImDJm)7O=K6S0Miu!}%boiTiYxsH#qT?~ zEnQ7olJ6Z!5xYAH+j=5xZ>s*UG-52)@&+YxkY&4iv$66v5Il zA+dBUN^q$Jzx#pyz=v_7wml?jJL1HqI3zZua5#>zJ+{a8*k1QfxqrrW&s#T3)X8C; z9M(#(R)U+xyFSTvF0bS9TF=#bZquEw%{D2cI%Tvqa>Kx*RvB-VqpfnZX|elDQMY`P zZh2jU2pZ!=z4LnK_1Ezx-o_8W)>6puY+yz-Pv*wCS$(ut?>Y@FB@LSkEt!*ICv zzwL1c>s)BTR#ZmYl+m^>?8d9;#Z+G|fePmg+Qy*zYUi~gzAR!xyKOo~+jNZT8CcK2 zZJOD(18uvyc#DO2SQ?dh!fiv;S%Kf?OeZOcS!8mBivfy%25$NqlmYA^KBo7 zieh`e_P?W9zyktE=$ShSX{XP4MQ%?QAOls(?JDJVMYKZ^?Kp%l3s)yx0|P|Zcqc+0 z*vl2~pK|?->l<9JaozoA z-QRuDbw%?mPd>|&yL+7X3MZbXJMj#-9$c5f-7?s8S^ICg;=qL_7oO$HXSwnhBKn1h zo|n+`5_(=`d|qXI{sa6lPP7~diIx`Z#p`k6g_4kXVJ0&01qQzGAr8igLkv5_utU$` zeq_Ll40v%GPDfq4#EV`uFN*L*5w@zOt!inj2wO$idKIt5iG44J#J(eOV*jv^*gu?s zF#}VWfth$3&)SVzY*%UtL*0Mg{pY#(c^-bg3HLJCd5iOwZtP)bWhqO`9H=BOs3b3F z$1i-q(%mfHgU$~*e^J@LsO(?t$ALKU5>LIvQ!k0|B@w>FgD>&m%XJ~~azmVWWk*Q7 zvfGvjMf*!ddql>L$k>qu_$~7lbIe!F)Bayu;-J(8wevN#^EH*}HI?b807nHlx*Q+H zi`a#l-BHc%-)5QEm=h=3Cxt}&WOUws=UfrAD}r{-xP1r8Si6k1d#+uVE^0AoK8!j_ zQJ1dWCl(owFLB|73nz^sb<2lD#*Ryk9haLiX)|Ne9!F_6LzH$aj)sr&$05hYQTpT% zrB6lArf%u`jKPwHOI_~ zqt9iB=yN);pVxi=yzcwwTaio0NN9|NJ|_d8lY#6HT_5WHI2@19p;qvb_smBs^WZ4$ ze{igWljeMMUQ;8vItz8fQ)_u*Do;!|_w=&4ClQa_VPa#C;rkWC_iGZEW=dyDlg;2PHiNS~j*8L@?TSXSNIU;XJ0C1y zNFjQ04E8caw>@Prnp%$=7&MjyQn!9f!lv5Ab7%Gj+k_Ap>2 z1J*F0mjO2zaEbwP{MmG6K9T{e8Spp*&M`oa#~(K%a{?JKo&l4bPjddiFq2)wvGS?| zt}IZC3zo91fn_^bR?M&&4AcHU(*6e*Gia&FC@-LoJvdaI87jfMZZPb9hVjtdJT&41 zhJDB|b!X%ihK*&|IEHOtSPjFZcfa(;E7I|8hIYRCjwS?_ooAUGJ|Kq=ti}^~l40sX zfgBe;$FThjo5!#P5*{jH&FDccevr%WQg`ke<-E#ywfL&VS7-Vz)4XGrnHve`N;p?~ zUx-ZoJQObp0eB?RmLdc$|7WtKYJ5Z)?*{? z#yxllU&apXM0KL_VjNY)A*xcRs7fBv!#ci?QwK=sJb)Ed6si^>aFGYC{~_wa7KXP0%W+r^>4K~XTaIVu>z}b9%^=H zOR+4DE;WYe(k@iFE-~Ppwh+A|p?6fWcT}=&MbfR(bu+BH*F?w>6Cuuf&f;bB8GYt2 zcyP>BuDhBkpfc`O#yvd(c;G76T^+kK=j-vV408x^9O_Le)SFVMKZu8Rp80zG-O6#zZLMxCocns$xKS`eYm`f0J#$ZH|4n>v02$;5Q;TGsnK#d1!LsjLC(! zhS`#8r23X=mABT|%Ob-65aEA3imUJv8tI;^4dGlJK8O45Z5eKB%LweiPBe7>?Il}W z#@gaC&g{kciw?S6kfZZ*bitVWg0c7o=NFt`Tw|}x`;Q|$bBXSM_LG4Gfrd1tRZFf;6d znT1QR6kGAIJu%1ai8+B?*o}SIABS$U9o=R-x<%M6fo`7b=DF_GxE2*{x1#MpJY0aAu^zd;kL&veOg!nkk1n@%UV%ESm811ob(a#O^)N^4p^nx=9eoS? zET*ShRL_VLpV!U#{1_}jefrOr;Y!?$^>`TDum_D+#`=jJI~>R1c+_PctIIsL1~;R@ z#8};^vFD6l#$I&L=R!XYhQxhQoVYI&voHs9u^0^s?puPo+V?$*tFRht(ct4ggOB?d zavwwP>%wj{__$A} zDVh&jQTe!obq+L}6`IWo?SF*?R%muBG`kfl-3pa%#W}o)n&%45bA`&cLggzP8bX=c zT{a5Gpajb#ST-GJ-~#*>K8mYwJ#IjCs7xJtb@2DehG^%WE6M-8^PxW^vv+>t56RE% zT>gjT=Xc(J=cwin$v=+X5W@Fs;_&?)xEl}RA!OV4PwZUVllQ6Nj~naVf6B z$FT-C@9gYJ&fJ;)$K?2()Bl*<^p|XYg3V8``3W{ZF$Je0o1b9w6KsCsTd&^wV{$@b z$ea+?&D)vzUh=!99m78_*jfHw^1jL=4v)s+pHJgiynl zpFs!lC>}={@%?`IVY+?u87S{RT;O%>U1YOpWvD#k;G7G$urCgJKtT^ERNcf|anQpF zdN|=nUTQzu8;1=d+90A03S`4(yog=)%@4P4egx)VE|%d+JcVcCP@Ne|0lZ`enlZ6AFO%5m-CIBZ%P!lvbT87r?i@HX2VY@nZsvr&#V%h8tn5VjN`i?^_N z3lD7Jfi1$<317Dk*W)QX6Njxlu$2e4ZonGcg-xghZq)*}_Fyk+;#)QGdWKZiv&4K} zFrOD1q7WK}A_E#2ux+l{@AAtryH;lJ@>Tdp2@RLkdM1@ zkM#l>X_S#h@imICkztJtYrJK@Y-67d_0w#qpN?*9cVqi4bbUub2s;X~5qDu1cH2*1 zXg_@sR$vu&V^8cqPYYpJ9u{K>?m+E)7mxjz$9|lFnfNVSj2m>|f6P@sRtbN6E)Kg# zg|K@JR%0z5z!qfCZU+5?p+8}$@9Tr_>%&hx_Y==GiMUC`O^a{|@>CN~J)5$>J`Gpm zYCMc>_SI+FSD%HIr4Gs*wBljx#{nDcx%gkX_+J~a5#{_}yW_AoJA}PCD8juW+}noj z_R+`o(WkHqtC7ck%45Dj48A}NKkdW*I6OBdgy+U0&ppR;l|L)Ap}xq*dI|hY0{e0- z6y)MsEJqLS^Wc8x`ZohCpXUNYP^7CET6o&(8Ask4@a;(5!ydH;N@W?NCvbM%B-an%ditq**~9a|9l><#Im8gNXTj`QIK;z;c=(VE9g?9J-G8w{`+u?C!PD4|9dT%t zlU6xtorIII1ZQF`*2Uo^Ie1A9UYd<_@eH1`k3QW#`V4gaW!GO;`CeA}UVaYu;|KU* z9A44NUeU^45$`LNB7WtdgG2Z}-j2iJVIdqIj`MLLGR#NW;g>4sFICQ87GW{2!Zql= zZ>qzQj1Z1wB99&6u_LY@as5>pdR2yAU5n+|jXn0)3t!phfwsI5+VW9=HUZjHqBfPN zjmz7({IyIQ?Xxf+3sAV%gnMl>*5f(67>A>UAsj8jW;}p>*l(ZxeEaMd;x25$ejJEH zdy)3vE+_47w7b#n$E4klN&7$u$3h&A6=Mk=z!n?rN7!gT63cKUuE!17i`Vf(9JJq_ zfxlwluNe3%2L4LCzY_1S&f@tvbf~-?DsM-z_TM3a4rSY+Y&&k?`!?PO8}MV~nP2nF zuS;+y3ioT_PNYIOk%r3pgt9(y2G7Oeb#>r%b>MXdzRtkcg@0Z6*Lmo59(r97zpjWo z8PLgq&Pp!p*{Li$H=q|%r?Tr*cAb~;N*vzsz#ATTV-C*4QY^zxJcYu&A>7Ft zqpi)@gnNyWnvIeU7$u4SwD?c+$Y~xqn`4JamzV-X3eP zGtM9<%OEFP`@gi>!CIr75~Cb0{++t;J9VLJrP0l5WJni7-l;aIsl|)fWiTV$W#KL> zvdfC>_lpc-mZ124FFr56a3x0ZUJ>sVb>NCRaOE_fwb8%OM*kx1{|^-os!&9K5K)f@ zdpy`P6{q1sT!eeE8GG@%F91q?0Z@hqu*DYuTzZvDuQL29!>=mytIGU63B6Zj{x)nXmCV+Tt3nuPyTxc?OHKl^dO zmjW%m6lnEjK)NpjGO!#gP)`0&uP+2<`$AwYGUx__{%@u)1+sh)kgfgS%yH1?%Yc4g z1bFbjJosN-*zHRIW%PbFHsM|r;rk-|vz-1}PXAno4X8-|tVnJZ`XZnRC3H(d|8Jp< z|BJ8<+i}3g|KI}vMRHq_+^*98Z&%y#Uv9^L1s=vWJN+~4^v^^Q42ob-0)rCxxY&;W z66Erajgo?4T`;T*I$j3fHZ+7aBFi zy1}tgQ*6{UbcP)Xv+yvs+0mb6XMZ*tu6@FA?GruN8z)i{NJ${oj0bG!XUHcR@=4wB zPwIvbGdvq+cs8sF_u9}OZ0L`1B#y%II0-9PI#}&Mf_F*qF5U0DbieOn>0K;M%eK=$ z2My=a4Cm4$m?l9B6A23wiMvH~w}|dujcc(L52J4S-MZ<+_49|z;P6$r2CK0aPvIH; z|4-%F>7Q@Me=(L|9X6nm?Wc@vKh=xZ@k6wXmY(AafLxSdx&+f1p3d-3Gw9O{`t(9v zgdN!F0|4Pi2tPswM##Vj36GHQXYzdjP+-mXGhFl;F8WLl_S*5k$BzH!P?=@4+uWl@4#P}n4%B;!wGY*v5cx5)B$d>`dD541>nxIT4DANfi@T4yU z(tIJ1jx5h(_$1Fw^4tTdka!@?mjR=E888MXYv)#J+_ z_!7W#(>ynAF3!hRJdCQzG}Yv9vV9SdgHv!SR$!G^#@}=~=ypNz{*B@-R=mZEw|Fl$ z$BD0mkoZcBORyB1@c>@On{i^g`Z!&EoL+`2(f#S}Pd|#sQMl>CeYMb+0!1j{uS)o< zu7CBWSH@QdLZT$Zi4p-y1SnBYOVra60ZRn@+Z`eCx4Th2``aV76s6fxl#aQWhpx}K zbNwuyHyLuq9LPD8z(W#Vv@0YQH6f2I;*o!t<_m-AD4lmd>?VTFyS^k&mav zk+)rx7{gExB!y2}>_{>!wxkeS%^BL``I~WcuVtlsJ1n?a3YcK2Aa91%nb}tEZdA?hv;#gp|AR-{%T1a zReSJB4{p2?qK#LrwhRqXt;LVpg}4aoumMF}`*Iv@st(bnTC^sy>BBhs+VK#5?WE0} z)-dWiZSI_6naCd>j2f)8HE_vR7H^&BT!alvJQ#a0B|?iGwcXBL-z1^dwh*;i6lpsj zqBhsxz8a#puf@?jisqeL?svF<7B3=~Z_4*vf!(2t?G9BW@0Hu8y59K=%S3O?vMADM zQN*gtdkt%rBOO%P-ZGQvVuxU*pbClK;^WWX3|1h zOC?lDvuQ5Pr$w}c%4lUOc~3iaP-iMxdCw^aXXqSVq%P{F9_pp*spM40Qyoveb9|F- zQ6KfwKq~pyfnrKg8l_VPWl|PpQx4@)9_3R36{aeae_iCDm`Z3S&8E3DpBB<0T0*5% zMk{GGt)+6Rpem}STB@T4YNTD%M0=^34p0lV(qU?=^iMl=P$!+DGjxtFQWteo5B1V@ zx=FXFkNRmKl`IMrQ;O0koiZqsvM8H!D3|gmp9)C%CyR=xm`Z3S&8E3DpBB<0T0*5% zMk{GGt)+6Rpem}STB@T4YNTD%M0=^34p0lV(&1EcPEnhKcIu!`Iz?yb99^U?>ZTs* zrR#K)Zc!ig(?BZu~jEHSxy8xt)36k9WMf?y1iDP!-ANL-P6XE~+CDJ={clDMj-6@BvDr49cV|lJ>(nluLP(PX$y+MN~{BG?Ql2 zT-Ed8`3@G+B3eSFR7NX_aSt=@;c}{=DypVhYM@4Hq1IG#WjbXLV^%U|C1X}HW+h`* zGG=8y6%b=qGUj{Y|6Zx;xvJZN1im+ycF|sHavfK-Q?K*Y=%H1M9M7kPbmw>pG4^|F zse-DAf!|}`_v)yD8mXBM5M#gBN{6Y9D%<_jL7jAp&d@o!NL|!TJ#@#2>vWTDQ6Kfw z0HXrMl%h0Brwq!ZEXt-F%B4KYrvfTWB}c6)c2GhyX*SKJ`Lu9n#=3Y?<*GWz4b(`x zsEL~C0JTsn9i}$wpiVkPXXqSVq%P`7B_DJBG1nh+{V~@cbNw+HeC*D>Ub;><=@#{+ zl24SXA5WAySV^mCEtOLRRZ%t7QXMsJhIYQ$3`o*MDg zh^Iz8HR7oePmOps3bRp|jlyg!S3foiw5f+!xam6Gq+8TS{WOqDZVnVviqcZaE#2gq zEuPupnJu2#;+ZX;+2WZko~iRpooDJivsJjQ!fh39t8iO|+bZ1FN&)KytQW9ezBxnS5OsIQ!Uj|12xhvYNEZ=Ob1fQpJh-cWl=WeP%h-SN{9sRC0e7rBeoFx^a^R9H-$e>T?_@<+zuwr;_K_rjkF;rX0$pJj$m6_o}Ii z8mNwH=`giY3pLVe%2NL4Gf1N6%c&xje4CZ$MS5Oj=S6ycCY4Yj-HCiI%_fPSFQQ^P zLl>!uc2OxUp@lS`7Eu{>(n@L6Q3F-7>}?Mm%cLxlqho<$N~3g25hIV~kVKE=5#x?A z=2)TU8>!kc!;VSpm_(0B@E8M*&8F2P@neiT)we-$|RXOo=rKFOL>$}I&UBCRsKf*(MQcX zX?l1c9YDRjk6KVq@1s`K+xzG+>hXQlhIbxp$HG+djdH4`UF6v}+<)T~bAV z_Dz6fD`UsP|Ky|}#N7vvs7EBOvcn{f?!QeM;SOzcB6%c$&dHNsG?md{)8?gtnUsFs zc=H#*MFi*a+=?GFx?@PG$sS~ql385v_W;ASRXl~^1}b(i+)~9`f=yD*Dk^@D;jSwF zkl}$UzHTx}DJ=f%FAz9Dg(iksjPX~2VdRCKom65cJmJV1hJzW46f#^<#WsdRR9u7M zP!-2BTuH?>8Lq72S`3G&xHiM#Dz3vY@}K=R2sGKHl&b1UBX)u1DgN$a*rMVBhND#6 zieamY+c9iY@!bqpQ*l>@qgC9K;p!^x%Ww@94`euoVWfX3JBd{|r!ZVo#g8$ZtYQblDJm{xI90`S7`E3^Po7~XX)0d8aJq^YGn}E~ z=NT6I@e;#OSN6Ap;Vc!eVmMpHuQOan#Tyu|tKv-z*Hf{53p=T=p1j9!Llu9>aE^+d z4CktN2g8k2{5ivoRs1Exc`Dw`a1#~pVfZc;?_;>BiVrf}Ow~WBn4RRS7k*{9K*fJB z++4*c8E&EC(+sy#@p*<@tN1d*ZB%@n;kGK4P=Zq0so2DDdlgp*vg4$KdQyp9=%`{d z!*{DVlHpD&wlUmU#Wfi2qT+alyQ#P)!`)R}i{TzBuFY^y71v?77ceV-4cJL<^+F?t z`>6OXhWo0xfZ_fsZpH8b6}Mw}kc#hSc(97QGCV}ZJsBRV;=T;uqheEO+2L@Dr=K>jA8A$4xp92EHsvCkM|ZPt8D-Y98Q1L6#@=5L<{JcZ)|9d53}Ep)i0 z4!6?b);ioqhui9KJ7Bx^u=ctO9dx*(4&SZAopiXf4tLSvt~%UJhr7G6-P*%_V(qEJ zy>z&@4)@XFzB=4bhx_aB039Bv!-F`st64o*cVUPQ57ps&ba1VP zb$FCrcXGcDkJjNaI{bhRkJaIEIy_#7C+P4*9ez+?J5#!cbQdP+@WVR%hz?KI;VC-& zs18rn;b}Vjm<~U_eVW~+?bCG^^ts~D@iTPz2_2rP!-YEhqz=#0;n^;153tU0odj5) z(&49dc&-jVqr=bY@H`!!ufq#;c%cq2Vz`$m>$2{`VjW(h!_TRB5`nSO=#?My<^=9D z-6%V3p^kkPBK@S+Fb>J|+1v7wYLf#=f~m<2c|dfMKr^G8kmhnxbdsgWZ2C06Fz@qM z9NTs$I8fJ^Oxw20m!eDUKZGR|%nOi$&=6V6>_^YThBF-y99lCM_p{*8I=Z;u1&7ww z#hnx!nr|0(MsP3(T--&Kvj@SzaFN%9APg24CxxpKgr(!+0tE-l$;E{T4(6AO3sF_(m+YhtpW0p*P`VmF^$Pg`J0$NtpgII z=L003CpE(p9J>P~%ejw=t>+#;T8MmtyktGs^r*8ROu_e(rM?I{)*_jay^^WYC${qv z9$9z3JSH}d1jut^Gis`jk44$Af`%)!PEdm zz5uvo8kZUtzBxZGi_j6_^7#0qcoD{YOQmmY7Q8%yLO$cbaLI=TDB2hbC2E7e*%~(Yj!g za%dB?e4;Q>KAzNob}-9vH9O@>_GHO=rKq@OH7U}1E&r%$1IoC>`jL*P%?sPHF-kvT`V4NCO@eDbWx56 z2bh&Z&1kSZC#7H5y$j5i8%4$Z_1w2WE=hTr$<0fBBml8dNNm z%SA87$O~$jqFH25mKCvxnVAHOjF5b@R&)SP<^1kxQ3#lr#xJO=y*1O!_;01Na!8sz zWKvi49X@Q9<+Ln1qpSQ$S_=C)fuAS3$`R>niU}Ph@A; z((~x^UFF=2Trxu*pOH)*|5Z*+rs=XXBM8jSj70hZk8_$!DQ%Lu6_n93bH#2CxLYmZy6(Ibcm!R73cTFoS#Cd3nWHLDj=RWS5W|AmzT#*N7 z$5Ll)d3ttKRrUsY@)C?UP>0|R$g8uRRYVzpPH=ts#4LAtIVKcF88g6GDUz4hnOE)W z1?C`h;P`vr%~Bq!ihnD&shd&hw*_WXNm((g8%#>K&Ll!!P&b`8Hh)mpPVm#DeltS% zL;J_XY<|AMI8btMPIuaVp*$exZE`^l%YBHFD)P+S2Wh1$@_a{(9NB0gwN;VVG)jW( zu12kyl2vWoIfQFXbHem%bmMeQYh-8RN=)MG#!*>Z$;;Hj5gE_wt5CBQ=X&1FDPgbS z<=>STT~Ugb0>pk=>VFVm|t zL=_a;0ag%2zuyWAV=GScA;i+^6F(Ey#;J z$WkrHW#kDzAZvPl^qP^Bn~q&F^$Bt`$DB&!K}_Q7X;Opi+asy>nN-*SuPb7TQAv` zANS$SnKHg3O}DlZs- zgsD0`b|BL^dEP)SH*OG@>)ggBe?904RffUv&5sV=M@a|y)I)Ld#CvMd&Wq%w_w zs-zue3w{}nC6d`OT|PWwHhsCOJo4UVoTlsMI<;k)lx0qP|@nvmH#YERHlrg zG4fwatn%fF38ayn^<-QSTCRe~6gmIFrcB$XKe&eGN5Ei=?Z6AHXeo+xwK907nx>)d zmPB7`GoEXFS5ZNAL~su!+y*5pl)_29cncd3my0%sRkR+*gcS7#CrWxxE!K=pM9 zUS=l4phs%Z84;|s1VS?$o#bVYw2YpkQ(h>tOL6BiO-UpJ<=Dx6d-$wtuW3)iM}(LzYKTC`L*iN8^|d1JmRODTmkCaK0|tbp(V|q<$ zij>z(PZHe$mkw2oln+c#r!h~;!S-18ldAr-wWqMN@%EJ1m?zEFgJs1v!^0LBcGkcj#j=!KiCbQhG zFo8CWM9;hhZ5s(|a}n(p$%AX0@fg zBjstc64SL_?x4s7=P3A02yz2QYz1x}5!0Z>b$J(WSWkK9tYIPA>BOFL{nX21(;!_!Q-&|~FmfU$}vAqS1m&WlHV7Mqa-U^I7=Xjeu{i*C^^c-Ei$d7PU za_qB~mK{Y`hBdcv`k=#EB!Bl*NAh1e_US&b10H#LaJZvQ3eP*P38!bsT^2{lSDua} zhvl%jv%(7s(>$)OoZFuq!+UH1HOL-sk=s2JEzp!_YM5A9%I+U%HRVPWx~V&!vCz|z ztU0&B-jjkb8t1$(jT@=_X%}DtJ)6Q)tEGgc7WS$uwXk1Zsnt9q+vNM6?Lx0b!thI! ze*$#0k<;g;v!CAc`p}9Nbog>(pwnfn)4UVqh8>>@2V1CFdak~l|6Q6~XO2m(GrtOr zWH%(r_s+Kl6bw&ON-ENnfP2y;dBU^F@>laK@%U-E&f=%VmAwruuIz1Saor||ET~W8 zEpq;XsWjcfI_C1e1$B8izl-#+aQ@Jx^SCaZe+s-!&RbXuxjTGe7R|B9^1`*WV2Rvp zQFYqFA`e*fJ1(`9*U?TExkOIIiFGmayL4HcLVH={$&0fa&VUX`s(0ixFzm%36cq8I z%@(S=hN@gsfCGyc(ZLpZ{F2r50iH7aSwwye8nhJo?2%3g^kZ z7qh8ifrBeKm6fiZnq{N<3E+&;nt5SIzKp2m!9-kI4R(IG+;wRnSt<8k8k=8GmM-;W ztre1s#)}jLWVj07;#&?ildfeC5Kaq|upQLM$jk3a3*x0~lU(|8tn7HH0*`Yf^$_zO z=a(9CtLhoVB=%~)Y7@UBcSbO^mR3tBflJ-&JYor#j+k)pv@l7{vV9+tDG{zDYV^k} z<6`1kp+^}sAC3=6^&VKxBKOaV${iW@$;)|U2cq1B{ul3(b;*}m$hY#iWl7{GdC{`0 zSeEma^SB8|B_tYy{brX@epo)dtO@+ENkUw6&l?F!1 zlUF3tkSKZSiuSD5KenPp0Q#$&GhP|V8WPt3sS<_$PbQTz8Y;@S7Hl%cL&x11fiuF#|fWx4ieY`>FG| z++uaRv>8x(otJc{u1+h#dy8BD1@XIf4%(H5G=1Zxv$!UJlB$-WfK0@^?isvG$9Je+@ z*gvL+SA5Hx*`+IndF-dvkX*2+Jw%^+K4x~`^KjZP58#Ch>@$~o(5 zM!HiJ)InU>DUb8KfC&ivj&J4F?qIS7xmVu5E`$6m2d&S5&emIBKc>{m)dohALl zVRdZk^L1I{%N;eNQ`CNGoamRP+vKHh%txkZuZYLFxlL~JW(w_KlZU_ApZ4r47rj}J z_U(TBhGbTfWO)+9O*p~= z9g_7)3^ifGk7X3&njS59BT2FX$A4YKI|&TiUIP9rUyTSNrHytu-%FC5M^HtxYE6q& zvS@I$2n9-JCpj)Z_f`^}Xp=v9D@nW$9vKXm6$DmM-}fY&eCe$(>s{uuD`f6aA z;PlnNO2O%?f!776uLj-_oW2@(Tje~ffvrMNUk!XHIDIv+U2ytp;4{JLtASlAcav&> z?3SBtX+o}Sp1Ngl02wO(v~@QA-}Byld!rMQ)C$MY)Blsh{=a&#crIq({Et$uKG*)g z$#z$w?f=u%pT-QR|7`^R*Y7{`w%-5dWgo61_I9|ZCl1~fDt_J^g!Yx=UxA+x_&6}8 zw{iY7@M8jB0)ABB>%fl)jIr3DhXk$wJVD^fz+(lj3OpKHa2tU;1Gf~oCvbtl z{eYVaJQz4n;Nifz0*?Z2An-)sx&luH&JuVAa0alQ^~2}jq?WiaA2?ay=YSIhei1lM z;AOxy1b!8`n!u}pqXd2fI6~kpz-EEp2d*se$1j-eK_TMg6I{T|U;a8i2SzuD<8Oe8 zz&`?Gk~8NI0ACZh82GZlzX4wm_)p-o0-psg5%@CjNsjH3sSGE_#f88Z%|XWm4gvl} zU^8&Bz!u;`0^5N13tSy|ufTD@djw7f{#M|0;I9SF2Hs^CCpkFzT;L|ap92qQJiZj}!R!7wzVtG2-MTF2HfdBXkz{UV$$G z4-@!0@DPDZfd>j4u+$vXPv8o`y#)>f?jdj_a94q=0e529j_iuXNe6Ku8Mv*$>AwG{|lV_DK6{={$1c7fPWQu zKk!k3j{qMQ_*dWq0v`w7C-5oY9|S%J{GGs;fxi*B)Q*!c#fj-9bI^YUt_b{@z+u3j z2y6j%3LFjmk-%}l+XSu&yj9>d;4K1Y1HUD3L*O@odHtVT0b^;#*ZY}Uh;1&X( z1#SAfa?of8MuzX_6VH7Ma9dm4LDuk8o;RnCj!?LI0ZOC z;B;VgZ27%)fH8%H<6K~yz)gVRj^%tla8-d@0*AvJ$}hCTNhNWi6L3X=y92}T&t>`m z2M9a}SQ2vAWz_$t#EAnJP6#{;_z!`f2L4Up zdB8slycqb1z%K$H6nHuCPXez3{!!qyz~2k}Ch%^CS^fVuPQDTswgP`4@Q1)V1>O$4 zL*Sjj+Xem#_+x>;2mV0deZcPtd(kMz?Xqn3w#ZD zrNE`YD+H#?%t0>;90dHLz@fm3z-HjZ0$YF=s@QId#>qT!As%?Hz$w6(Ld@TNZQv&b zt_S>tz&XHnf$su-OyCy4j|$ul_z{7-0zV{h58w$z)c?J4GFDvZ2RvHfp}->rz7KeW zz~g}L5%>|{!2(YQ9w6{6;JyMs1>8&EXMnp4yugl=F5+Y{@ZAEx0Nh^SWx#C&UJ2Y% z;Mai*1b!2^slaao=Lx(GI9FgNFs5em9Nh_A7ns-oU*jZ8T=)SvL*RqJwFEu}oGkEP zz=;B%2aXf?25=35gO;OTAaEt%D1oa2M+jVPIqHA2IElxF$^zE{4iUI6aInC6z$SqU zfH4=9r=~S@%p}@z0-xv5V;CBT+54>4m`!$?w5sW_$h%$1J4rp zLExDJPXTraJRSIPfu97PD)3z3$pS9|o+R)KE9~ePh?5n#Fizk#z+(j706a?I&A|5x z{66q7fs25L2>dB9T+cjVUjp|Ncn>fppK$&FFxJvFAguoX87E!Eg+G8h349tD!vOq- z%fM{~E(OMLALj#JLBBxY5a4D4R{?G!unib9uDE;xa6^I9f$i`a^9yxxf>8vHbAW3L z+!Q!X;MTw?0(Sz2&zQ^i0>*SKjt2tA2s{ipTHsN@R)NO@!)46mJDMKB3048~n;pPm z0zVBLD)1uU3IZ#@@ELRYmw_?4oa0wtk-O|pCm+jGcX!1A#jf4iP2HmpTw<@=H7~WP zjB$j@aM@!%)|z|NbsvX<#JUemCO8x%=YE@MDyWexJ$Hdk$y*&RFZec)?2(`Qwntt} zAYY@xL&YqX!qrEl%GyW-&Rgv{EmbCBWa4|>z|)o)a?*Dl5xeoRcp%g zzpLIrjaw9k1N3p--5Ns&k)9kIq2V*^kIIL?OAIf#YIYBayn}(q?=7j0;BeQdLo0ZA z*n|ytup(kXg>uL5llZupVBVRb6b&KKO3Z3%rU+`y_c?X{(7lG^y4P?*_Zt4vy@nDw zY)_N$8XsXc*^@Rt5;96M%R~1>4*UGPB<;b$BXS0}2o*4$1J*R)04}hbt98vGx1P&v9JffQ1 zL!a6#82$6$-Ub(F;Ou8W1{uh(&uo@p16L1R1p{{z?}ov#K2YEW3$|4;MRa^YT$kV*UZ3O*<-U?LbrRC zS<4SLOTIyHD!2jzcN|=E16Th?o27+;dmLO#1Gg7kE6%~7*0Mi&ug%ihAlMpQ8v`eU zYir;(gKKBt4uWfM;K)9krGuWcBdb$EcGQ#LI)S^}z>Npj$-v3rIvco+;JO&NgW$Rv zxQpQI-3;XTpKO-y2JRJbJq+B};CdRkKfv`eaF+cxOK$_04X%&M*A z4BQTI{SDl4a03in*a4empnmMI3oMn`RyM-5y*a8nK3)8M8V zxH@>qV+L*#xW_dP_8))n5|Gn1QgEMw)9DA7TZM->406AMn_=Jrk>V!|Tn@OI2F`vI z4=FT|@xR(EPa3$U;AR=PG2mt!xF^BQF>t%UJ!RmIfqPnK|MApC{ARPvH3(*cd&a;m z0{5(edjs4&1GgXCd;@nL+yWP8SF=Cin9Z`#MXFpAaElDw5OA`ATLW&ff!p%C&9cP6 znf|a@o-=TF+d(P@(stZtdEUSc0{4P}n+fhk1Gf&`QUiAo+)D=TGPsw)Y4#t_{(*nm zEXxdnE5R){a2LU?FmOMBd&SL7V#U*n`r}mt*9hE7H)rP$4nJYDta6i_n+xtW1GgI7 zY6JHlaBB?QF>tRNIC|1%S!>`1pM?Fl&OoL>aJ_+h8{7s1w-DSL25uL)Hx1nH;5Hh# zGH{z1C+t6-;ytHrmbVOor@*~!;F8YRESn8nGjLlBTrs$J3|y_VHp{y@j@y3^g50Vj z*}Gc{?mYwd3ApzS+-Y#z3|zrE^zGbc9Z%c>a32`tiqFCR`_Mp|FW4*}8Mth49~-## z;ED{~BjB6{ZUMOM2JRzp|KXf!|M3|93i1YxWN=3eTzhcE25vaGqXzCt za6cQ{_vIjeF$iu4_p5>X1>A22?gqGH1}^S~&GNf}YYgrW!7=-fXMbOi#|?s&N^O=u z4P1oNW;tQtI)giD;I@PN%fKB3cgmBqo9b-0SxP)fQwMOT4cr6Z&KS72!JRd5Uw}Jj z;8J(kEawee3vd^V_Fo5R@I`~*G6-HWaPNV;Y~c2TyJFxjg1c(q27PL?T+=ws{+j~w zx<-muas%8A184ipW+^pr3&52bxb@&9Llqpn6aGX4XHNu4-Q*-z_s9Jg4n;S|^0cexT)a6 z4O~BPW)~;yzr`S{xJb1`Yy?-;z$JbGKcRtZ3NF&Xod#zyaH+fCC){qflwp&J0JfN< zsJN9RFZ(kD6U5j4S@%}m{{h3iy8o>wdSto>5U}9xC|lgm2Mo;K?>O>ZjNITvwcaJA zSlP54E1Sp>OIY(mmdfN1TJM9F&>06UAxE`V3kD## zO9&3fKCFg~jVd3c70D6NO^`6jPK}ZS!zr`aQV~P}Ny$u?WM0gP0n>s_yhu;2Cc%ucnn`24L()&Tf_*AYnZuTdVw6Ni~c2oUMMk zbq2;^q%ewQSk=O%pvqV|VoR1{1MwCDp;dSyi@qte*-=d2Yad_+nvsAZ9xp7oI&rHqieN$zlw zo>x&iu!Pfcfh|$Q@5Q2Gq)#q7Yt=2HvR)AC-Pilm%g#2@6^I?gNnCe$kFS#b8i|#k zJeTI}A;Y{rM2XvmTP~cdf>kh@p7PDJ4t-|hW#ge&<+$^)6vK1*=Tr6Jq7ZTAf5vOL z^8EAlk++|m&q-SHDoU4QAGU{yhxQ{>l$b+p)GFW|lHm9*MUu^DBf0wIf9LDK(iu*|T6yVS7JvDiwg3}5b(QBmR>C*dAf zX?ZCz!TFw9Vig=KltD!Ob#|&KU%OE4W-9hgQxYXlyx7oJb}oNaF1pCG^T@@zF5OZx zONlS#8h}gkgiAbsl%mxnL4N&Gl=m{AbcrMu`HxFAd0vKJ&h6v1`0+yStY<>{f?buA zYwQjc7Rx8Th6?%Vp$uzY#VBJ%bD>fAD2YvuiE zKC)oGjl`sSC`ynd6>MTdw&6G`ORcaK8yg4Ks*^n5dBhgA@!gnky9ve5g!V{xyM$_? zmc09Fg8lbd9;2`EF+}x(#_PT)PJD^!G7Dv=GNjI9|uG1&0&I zmpJy}h(x5WW!R)Eox<8y`*d1Jt_lv`VCeoFTW8R^}g4dMXlt{+(>BXuCWRtD`N9L_Z9`bj`^?G z+vT#evGTp8nRtd=+7jy}S<4?3B}U0H2LF3$Y}5how;nlz#mQw=acjr2F+TK<7s2AP zn!0voNf=3w(waBx6>O|=)qd29t$PagF6m67d6j~K?W5*fvXLa~13OGIs{W?dQLbfs zm`6~ZkR(*kw^WS(cokbpRg*Ve4rKNEk&Cg)YlKAbc+8LY6%XFZ<$IJYw$zceamN!^=Ov#ceL_J|9n zy0AE~>PdP_nHoT<)6zsGZXAhGRuQ7sp7v2RK{**f!hF2Da1&|itKtq^sf;lZR&y(J zO(Yv>_`pPRyvQBhV}DJsf|Cc-Pqj6iS)l#MQu$Zjw=FDq*owQQP4^rbfB#5*`JoyZhkAi$QFee~(3#lF% ztfe|uc_)}uyXB-KyAqYO3ZydPl3Rgf(t=gWeHBP-eQx=6#CtnkRNSr-n&z9OEq$fZ zv9p>sWRtdVH#T0h{;?u!4$V>`Dw5%N+~kU+DOaU$B1nevb46keY?6d(N-3>K?((4o zT|!7goQG;*S{G9-ZfP)s)t0Qx4`Ur;*(Et8b&N+gB0Pg43+A~E%OfgO(m`{;_@ zyv>ifiGp=mseDtJRIdgru6cp0Bj>n}?cXc0d0fi;RwTAT7qq(CZW*?l1ldn52z*0Q zR$AmEXJVCmE0ZeyC{F+iwZyjC;J??>CA7mR=;4^;;=nF6b6HPEefW1I!HJba__Tw| zuJKw(?&oRXg}J0M!A>ViY8Xjyn`3M1lL%!}7^#s|fX7+o6}y=QZ@Gk450g)=i&pH$ zwt{MYK9rijv^m4o z9IS|hVojBYZ48d(DkdHhgtMQ8GhcmaN*yz+ANE#p1vbP?a+*DNtAV9UL4)vm3^D%R ztj74FnP9)Eu=;X%bBj{D3aMJlN3)W~QVVB`R-e7BTumo&?EOtEL9JVbq@}%ft5H%e zRv{hu<|9Lyk&a>}UN&|uO;h6A5tHJmN-6{td|s8?n*Dqi8LrXLVrfe#H0Cxf+;#5i z)5Es)QCX~sAjw(W78aF6%UCbxjv${ zJeEW$+YydhR^mt3REnpN5FgTUaU`v#M;dC1e!i}fVVwuUo>I_+>*%|^%Um3E7L`8k;U6Jk8NjG<`e7w3( z8-^E|1*?eO>{dQrMG^y8Yi+N=ZDXw|u$~dFi=Vwe6<(Ca8En^FW9?x*gPj~-3*wuO zSuU3qYmIq!3=I79-UAySLt0}0FlLuqPm9~J1Cr%}`}S|x?ExcPZK>K4sBLL@tZFA< zlQAFt0|jNWF|Shm*zT+(de$acYHbppfVyTv90|jlu*VTAemW+QdQoQY(K!;Q_V@iq z$D)jiC)^34++m!UZO5|AxguC%d!$*exwDJMFXr#WFDi<4=&6&Ku$>*R`P6#FPpa~p zlVrbcgl}>4Dcxor(*)(GD(ay8pxM!DXLisLJSsLkKSo<&}okT}vdN0ZI(@9c$)fE|= zgMJM+`LXZluE28DvZ#jLZp%o6VVbi_xt7lRjl5^kID@WegfkswJ*{2CHz_ArlZ5_XC_6RB?{``0GXek&fG zLy{Sv+5LT6#y;GjS}%fUAUD6!5jV!(5mr-;v56rT%K!jnNNr*XWsKGqa&H56?DXZ% z{veaY4Dm=b>{>X*ildscx8{&cSii$;!jw>PzK5MV)oVY9YbJ*}I>E1@zmSOz>=n^O zd=EE67D-B0Z!=+6P4o}>rfGcBTJ>D*r?suA*t5_XzPqNf2Dc>Wo`jHD1H^oo1>wRG zgOE>Tkr@8+nGM;{cUJS1h}bdz7wdyF-;^V?zFc-%9nA7$FvZm)$(|)DrF@ABufv=v zX-cy?Brd7j&Gp$e%2G5fO>x#CiMrvO9pMhbd!K#07st@Lr2ehC7w=i6xu9f>&?>9y zk}9dA)aY5Sm!T{O^GnwiVS_--l_(c{m*u09VOdh$LvhS%mP84k%#eB*Bt#E;Nf*M0 zY5X)E|6prw^=?YAu>p$$KZ37v&~Ytks8nh|JPLby1JZ+zYlSoY*xkL$d!XtMKjNJ#MHiKl^n&>*M-#BVpHXY(!#N zTnhGknc*yVvyZbbU9--z~G!7!`5JEX0 zp2AgSLt{@>`Jyq&<1Z{Yk7RXVnee*DbM$fH^(pgMvCL-~Z@p-DO&f45^0-f7Ds(H| zi7bz@h?T6|?@|jDF&<(qE#uW4t9czGYfFxC%Bi~uHXv4pG=bmZQSX%udKbxxqbYOq z__Yz4bwbD0R^pOL!ao{S=^?Dbo$3+Q*?%vp%$yC7rt0GAr`GS%jHKmyWGmah5!uPM zhGs1Y+ZNhKBkrfRV>M@_N3g-_kf_!mD1PQl#1)XtTed&`sc`-w2aTURxoHcatDF1; zb7wt+{1zl8*5id>HLhwQh$%bIDTCXRIM!3t9CW()a0lq$@H_eGle3t4+8uBdd&F#c zO=bQC5>uU*_Kqm+DCrFf98wfUIJNr!o0b^eTkE~xFuNYrKx!)z=gY5bG~eG<#zC5m zykTS^Cuh6cl<+m5#7n06d5QV0NlHb{iTz*q!&5JU+FTTjX6|uwrV#E{- zx4~(Dj09o+l9v`u4C;hp1|intPmcHOJXAhLs@3&OOnERLQw)jne$a%j#LTS~ zKdoe!E+j#3>Q3!K;_>ZM?GYZaig-<(V_=b&UABr*({^$00T#!{p*L4v;|#AfHBijC z8ptOuc*Okg=ot8S4Q3#;^Ib$u%X&YWl=xxuh9=TC?ROro-@A1~7hb|Cm9fH@-Bcd@_jCvtYv}D|N(M1Dx@^ z4P@tkDW&%ltCBF7See^0Z!jtFQDe>@Ok($iT60*6t*tF^c&6SDojo&xNhYO z2Y5$$>WbaGqdaZJZpT)ux84)9FiojFgyc1Jw+n3MgQF#z34u?TYVOH7_j(qBILAJ-MucP%qx%ZsUCiO72 zih0ctgOAN&1wgbg#x=dr*32OHKNt>u$M1pRB-2`uX7i>TyduClCSRQvtpICf!5X4| zz*3EnhkO4fwVh`g@jP7+<eW1g&-f|4+Rf%qjIT_HtWEzS+yU@^8Kz#XidCY^+_QNJ5H7S?P|q!+eF; znfo;q{R6h%2IY?`SLc#gwTLt`yp%k4&R>es<$lt{S9c?1HScchh|dQ2zX( z#z>5N0Fg-Jkq}i7?@}SpwJIpwoxeLDASsDx3N1m7cr5J> z%JZwlK7g0Gspmij4KTNV-K=JFC5f8FTvMs&JXSqryv=M-hYRje;KJ(1v3n@Z?|n19jd zK5u4@N59{ndA#vKbq1`TTq++gqj5i~e3rFx_k(UF%UC_nvdqgeEq^0?<)g-CBOokR zd-9rdLJIeHH{rUP%lzH!B3k;rf$EN*H=Aodd9^nAginlDDn3kN;NH|+I%;?@JFkgR zal6;|p?Hjq`FkO|9{vYj$TR=u3;A2BBL9zKHhv08uH~-Cu*TQ76GxJ7GBLVripN4^ zp0p=~!NStpY}y&+!^yj1h9Y4j5yH z9KW$zDSA|!8o(AaSF9URonL`>%!{$B#7!l2JtvHw7sZ_7e#zjT13%oIb9@ATa=|VoJJZXzq{JK(d^dMX4BcSVzG?47R;J> zK3Qd(GH)7Y!#kD#Oe3vyh04S}PI|NqwYb=Ec!&2w6@COJOs~fXRs$+CAHyu%JwD|2 zGgId=(je+L?*bW*lin545n_F1$9KxpkCXhUlio#-JT8{ZhEMl7<$6H2ttpJuH#Po2N6PXU zq)k-ik=~k9<=PCA1apK)m0UbTcdVpPGO$|4EX0$Fm^V%nW^j96SqFe|l=Uu7}QQ@zcr~y|=o%{7slQM&h~I zq(fESB$?1eT*Xi-zKG?hrktIPsX^eC>^a0@<*O{K!K%4Zghj_<-cNls>SU8Lbq=Y= zUxA-_Dd*;pG*5p;Ep-BkzX6esPm#0?HZv5K4ly}q5bJeRQn1cFI59VtO(k9a6v3Cr z)#a*(I{BP9XUqluD)Rll3V-I(ZM%2jHuTb9@*!=uEZ&z9$`@+-nL}OP5*=!=L_4G^ z*XEL#hTIbEtXiV6H?uywt>L})R`SHzt|i87eWvo{GsL2w|B0oPyh$DGwf^GsrjI^D z(pazIS@aqvc^4}?8?$5+RfjqK3`K2x_NF$fv5XYD`vZPT)=j7N+*&Yq{&2r0qVC~0 zH4&>XAdNk0oCPF0-^2dI0HqbSp5+p39X3Y{J1(%!1hWx+&5`gk*YVl{k`n8E*hkW; z`TT_>hEM-i3alj3W7_vWIsAENCCraj7+Z zz(*1JYs3H!_jR26xY&e))!>CF`>emqM?u6*N&F^!08zWi%ABd^u^SZ*F_B$az64W6 zwa0|>J2J$a2e|ZpS%N~YT~#B2?-Xj`&1DXkTZ#m}NvPdqt$dS6MDa+JP}~6z92<11 zfI+B=%AZRNSr(;`?yktOJe;NI@-T=8vqAaddEIU5i^8Y(JYN*MxpR3rd?~NI+-J}0 z-b*Nd$Pg+OBw=QoqRTAx@ppSZUM27HB-J?8_V%o>7t6&R+iiKqNxi*{c%@GpX_nH` z7s)t}e0zE+sS(YZM5pRSMt{<^eGrk%p3e*6NnVM~WjZOPi?Q{IrXDQloR_e!MkCai z;j?3&0R-~^9wJKIt2)(F*%1bog_-p-nJ*5!(-NsH1z9n2}im+Tlz z15dgBPDbP{)4fbJzSJ0BCim_#SXf#dD)9syVO!@&L~$-7wG5YbNhpuTODvex%gY6` zQUtSUdAVTbi(ou1sTwy;lAO(hlrq#ku4l6c{J4U=?IP6l-CF`t>LjC_^!@iVD~TQpD>$8@${Kv!Q1U#=h1luelO^iyCB z6~a@-uOuls&#r-DVq2ga+!f$;>oIT7^JBS$uOi9r+57+aisVIJ%__E_zpb{27;BIV zF8Nr4ywdyaScBY9sj!-aX<=X?G7rPsLS!FdXbX}3IiPR4%=<0x@xwCjG-b;gQtOtM zu3$Mtj?(XSGL&vlWy`l>lzp$0+Pn|rXJ#|*TEb=6%k`s++6b=?JKm3#QQm?#y1Bnd z^*g(!Y@JVsP|NkCo4Vgo5Db44hD|XE!)kJM`QBVlqSYM;y7&`jj|0SEr}QP3W)m+-3pY0 zo^k2;hFF0z@(t3Kw=Lz?#PIHx5%OuGJgSwD44AgBVdB|MkSu4e!QdVyy>9O2c5zSz1F_H>5Qf!JC<=U+r-bjY0 zeVUYjX*55v$_XFH+GjnBzWKQ_)RzSwdm~E4%IHm`fv-tCd)B!2q}scQ)FTI!khe&i zShoL~MUKD`+e0Ao@mrqFn{?xXO9VA9bZ@HeXtqf z7C*awY1<{S77`1oefh|ETzaYzQ|5d`s`{Mjcn8n*QLP*M|2jVmH)pt6{CP zzTW1**R`bqe8QX3tB6>9rD&|0B0jg?UruuW+z&;hN+<8zpE-Bj!NmSYUU#(>9z)4~ z44U$`b*fs1t~p5@bhi3-5}oz<>+Y5VLw2qaH@jC|E1 zLl=v5E83o!CKG>h}a4xr?M4cDz}-3j?Lg zja6nit2R~d#44}VCf^g+?RN09tpr<2B^Q@fPzt{!ku5#CDP!T2!8{SZCp{ZCz>b!D z+yLVTyviJk6kI?G#O}=^rOJUX4O^X-eMyWTG0y(#Cdqokd$RZx(pSDBX@+dtd$aJo zXA?G^k5SrvEtc6a<-fCX<6GYq)+Txmh2kU0eAop;Fg}J|`~>I6GVycQ?Tm8$-Gbt$ z3c2kD=gvEM|7g4CqmBMQH93DXSN#+b%?dEOC7d%%S_7%f-{aG1_5B{ww4+BAv;buV z6Kv{KK!wShf6ViJ$KCJP5iACw-}PQygtKW_kN!X^v1J^ye^8fmtP#IE#qaOpH~2@k ztm#Q5`$v-8AKNZT7EIx>V(N|LWBvC zL-&iA0t`GJT*!EnC$H7c+@tmIUZ1liR_^uO=jYU35^eW*CqH5M13AGTu6ei+DG!<5 zkns``51F0#fQ>PCF*(YW+rT_$PZc%s%-Z9(o!!AKyU}JTzw9HO$!AKvpGYJ9Tn0^z z_Ip<&`6trS=GHoo-tM2ush`xnCZKF7fu-m+Tvzh;W3~@esn33Oz12)yV(06{@Av!J zjI2N<{}72*k`Iu0cGC6$R^vfv%mKE-0s4A?)MLLN93WZj_rw8Je?t$deEva_7>3bV zYl!G0KxX_wcx%fqrBjw3RPX%&znSbFESljO!SIp%qcy{%1bpGBiir){YJCoVP3dqC ziHoiz#k&Sbu@u3Ir3m7jr6DDciH7)Qa%SlT+Chj&cI| z6U?JgR;<+dkwhx-he;KlKt4?C4yEN`HIp7XOosdFdIzsnN)F>;=&E5JXAZ5JrnEgm zVmwx%=tuhfxXg-ZVYJ z{6?bF$FHqxx>|tQT2LG|k~1A^aj&95<%{c_?(Nv8td+~+dGYwT7UUt^P&21qykqQuK>OTT0i7n?vs;zLgk5* zq(#&j?;d6vVNMs@{z9`Y=KiJib=ZL2pW0v}vvNGuGibVNuMFkDUnG$Y zFgi0+^>Rx1DQpy~4?X)7>72;)cW;_rkhfPsEkuBU>y+iENc4TuXji4|s9395|yMAMSHfdJ2l;<>=zsz@-7hwlnHhOtmZc%*ghBb)O&XJ6f zYLm@AeaPklIp&pLh+j^HQdAW(E)n9}P#N8+>1uYH^zPKyKJ6V>0G_VSY^?l%;h2I+hOUQ=#J^}*oPJ=szU zs%KWVZu+5@CTb>ld}4`x0Zd7_C^i`r)~P7iJSW-bt61QC17cl++Hsv?f1Fl}2*R$6 z9-W5%>$K57X0yO&-Or29dYGEs)_=!mja+ee$$fvrt9*73G-UTkHM?_pc6X4>EG@U3 z-DB5jqhUOgU%5=G-KzJ0y85OHUFv$|DoN~scU{i;|Kz`#kgK62|t<&1@Q!8)brs<2DAMm_2!BcA_PGr}?UpUjAt)r{!G)hbIZVB9q@ zy?nK&wIZ&0q{iHNP1Thh3dvBvuEt9pB3xcs-njET`uF+@eisR7_BXSYxE<~P+o0;_ zH~sW&zbPeYUWaHDb3+p89#puMoru|p%@_~kf-RS3ix1df0$Y5b4JKfd2`g|E`X=nx z?8D=SYwDz@w{^w{{}2}M+_1?MOR7<8tn?Q1uLYZ}SmcnmX@{AAa_|b)6Tu%RZCTQp z*3jF}TAqw8Z*C~|pCKTc`?Z|Ie`tgZH z3{6?DmKF2-!SxhAsO;H)apm=o-XEx6yW@X&%%V6cwdu#mex|gJ{taNQnQBk?dQ@yh zwtNNOz{JNIhXv4P|6el%eHh@kGiv%zjJ(`}p(Sldyt9_SkD;wPskZ!9UPZT7tLQL% zSy@!a%JLu@6?Mkz3srYEI37epbDeJ{@{+1m;x6~2-oi3g=w!W;5loq{f|dBrVK7oR zBueV8*JbWu|Dg4%B3eCikXfBoxdGkb>ZMb#b)?S5L>)7hI;w*|{&V zksz_Q*L8DK!Lg66YY%B5xL6(6R&Z>cu_kx7;39QgH^CvFTyniL8mX~no84Hq((Idv{`v3Tz4lUu33j=-#$Ua21*t z_HagF5EK?lWHL?8P`Xs1DVCQq)VwT4FvYH5o~}Z3>0ZRH3LVCNQ>)U>?00fi+QJyj z&Z@Lt%qo!)8$@tN5!_K%a8VI7)jsiAkFs+;7v-a|=TRuQf%uIS*Y}X{7pFJByHlIWwyq0-Syh&_mVf{;c zlZle`FV(#qw1X=WF?}TDFgR~LrIR})KF0-Ph{ zb_qE)P<~t|cU;JECp)@DUkN!(q_F;G*9rb61Sg3AcMCymbz=QhC-{qmaYCB-WFfoE`7(q!8>a1osI+HsJ#6PDJG_S$`LDcMG}wLJo5x ztjBb6$Alao1we`q3ORfy+<$d24n(gyRq_$cmBWhM`yCI(RNIY#~%ogkAvZJiG=z3ZeajR$< znZMe(ck8iuI-FRN#5M79tgM{uRR$+gbusVkMB2uZDrC;#(dS^vsWLw&QgxMja1vzd z3K^_Pw4Qg#3`-I+vzbg|AtM?mEgVfIxF%$p3mN8-VA~?8&l*-!3x~+g zGSyRQv}LT25sD&YI;7H$mPz6gjBU2APFz}-N_$wQi%X)`N){_%HMQ`V+y)`1sfH$ZK{=+$1!q8R zi;&aQLzBCx+?T9{$K*a1a+->0a+j22np|*gyxz}*oTesRP8n94W?Q}%m&9uk1#We1 zs_xG73xMT-kkK?qy}e#0ZDRRZT=Fd9Ph^VQi!z}Ur-h8BIO^@EGHD-|QfT_3Uh1Dk z`{(iRAcA*|W?z25TW8dxx=_o!aw?0qsK7pmXnlOeZrM34Ss9c~Gpwxp#TY(*5+{5H zhh{0uvuR>`tR1voSG#CIY)R~6D|V;AFUW04LmlU;aZ0@=KBNwfuAn`OJ4dksJ5;&5 z4!uIFj8)p!rORlwvC8jtVP4i4t8}bKF$HU^GQJ*s3pk&T^N_f)e0l(OG*?O{)7DCz zP#S0-zQn_b{ID05cH{UJ$7LLqdQ&MLM*|$~a16vT0Y@Q@=W)2YE%BMh|1jks!QPgO>&F`sf zYmB!3;Y?+3W13}|B1H6^p`J=~9^GuQi%X(j;)T1X@^cCHwJa2u zM4c-xecgo4x4*A=s9+>E2C0SPE*xEPjKDDk$1^xq;MjuWa~ub8oW|i&!R6w`>3smN z2~Mwq8wBT}f^P{@uY&IiPOpL=2u`npPQmF_@KeF*RqzYJ=~eI>Zz{M)25vsO?x zHlz339c}O#QrLj3Vsu@+D#8(UEPH2o4%Skr?Id?6l#Nv@Pz3B86`&47p@NOA%&IxK z8?5cr>r$3SoS4?|ux{|M6eXWV(XesK#(dh}zUp}og>Vj|(jFXt;JA*%Je*23aWukl zH;$n=CgGTa<0Txf_=jheuahi-(&~LSzU|uMl+vr&oxEg3~KR zp5XKfk)P$IPHH6t^$O8m<@5@{okE?*ai@@!oWh+#XPVQ;q6TLrIGaKvbPgU|-#W7e z>X&+>ad8Y@9luyq9ENE`tSi8KKI6oVnhHRbaHG<)HEomg=(sfNRa7=?x*6Mip;Qcg zOa+ftk2!bMc^qX&tyjghY2&sQwWjY9`uI3ya$EXzy_s*~T~{=lLLCy*Jv4*yIJY?` z2H-tHH(0D+f*!x5+U@M&_1n>`YV$Xo39?8YYDXms^X8(ov0SV`sGB|NC$jZ}58{mE{$RZ0&L`|qK6->cpL9{car z+|b@-NjI9z5_00maGTV`!HZ31!4Ck(?KouO6Ts>n#dAu3}Qcm z*zXELncba!8-PSBUAoh#M3z|N4L{+ApWHXdJ!to+F(MuNaBZI}9m=&HG`iZux{SDh zj9^`Egjw*0lGT$=PMIcd{T8==>$+94e(RY9yL!^Z#G7Y<65fkeYr@|)+l%Box#ZcLA725cSPi*_Jkh1t9*<2?s>|3BzWGn;T#@D{4KToO5<)eT8~PzB8rN!^R2 z?sX+q8QF(U?WpCT$X%Bn|DmpebJ?PWxNvCkKWg7r5E`JA^)IDUa~%@(>b;q7Zo#L|07a65%LpVsg+UeZ2cZe8S4V9juHf1gcY4|mqV?>)!f)au z{A&o~nk#(RpSt|xGZN9Zw-L|7RCViB*YhOnRaF*if+XvuvSa879h2kVPQ$mj@G*{d z;wDj%yOdnG+Ie-?ZGtj$Fv@!O32AIIdfs^8muH@ErD%m}=V1D-v82u&LRTk_@^Y`P zXT@H0kD;`G;$vRqJeyeMo1ru|YL!y2)KtXYcXHVM8wJFS|GtDZI_8EXAz!Z zY-s+U&dvrt=W>7i-|uzbm>F&C3G*~h!!QiQiXqF2<6Lmcx zqI(hD>xjN1Q+@vbE&7KO)g<$XU-V;tF8a(#w&>4HLiE%BH_=Z_Li97$i{5xLJ#s<9 zJXFi$RBQNTR=hR4_(v$;02y=93EMPTby9bCvW`wxjiMV!9EHtP*i2b?U6rM}bkL8^ z+skYBinp~SFiBuK3GT^KlX}#`cx#iWw~6*87~4dhHn0@yBxzj-3tFpd-KE}(PLVJ< zSqSvqiMvz}m3pt$_--mYK;m3BVus(X#zqg7u**iwuDjK2U-k=^Y&R<(SB95kmsngP zE)|!K%fijWEy1n9ZNcru1y}ncx?H*494UV8?dBcgcgc2hym-2|o0G-Qz1^H5e(vq& zz2fKIZq61z_jYrx__?>6d0nd6Zayp#-P_Ga{eD+$H=nrIzui2PU~e~DKdl;DeW$93 z!Ozj;l?iepAe)#&34RO0%G!Q-a_#DUfp1B(SK|@2{l^o($?80!wzYJsdeFo1g#Kx& zHdeoBs)JV_R@i5t4^C4ub)_5!+s)-#PBMAcbw0jLwtM`CvwCr>o)Z-pe-l5q3VOQw zb>FRmA>!v&!Mft-R>AsRt5LxiiRf0rIKST&D%fI%t%9jN+u5hEQ8QJX8P%n03u8n( z`9VSdaxb-~H8@AL4^5rTFCCxfCU2rO?RwS0dND^O_3J6|<Tz$Lj)X&Meh9YLG;gBRYR+ z*7{j$bkr~jI*SQC8x*|JY_-r9+@686to5_irl`@?$!tx#Pfe?@>u4VgWFde)Ajr19 zzfWE7E7sps;g;am;I`oQ;)0qsLHft7X?KaAThp?| z?-EU$C7y0gnrWHy=x2CQ1`(2@F&-*pa zSZ8aR)nbl{jC#Fmi}G?5Z3q3eL+so-Yv>%+w)WQ7{U11c+nO^+-5kVn>%bf}s=4P< zTUQI_S40CF^SnyyhPfR3r#5PDO`ofxRBE!da4yqb`E}OzxhgSoSFhljuGTgFd#0(@ zZ*$ePO?GLCWRGJ1Tx_}Nt+mVlnZS2T$InxZP4g3L{sXErtGrhqP_ZErc*Oen0hJtg zjsM8@Td7!W%vNnNTkEW*^GVJ(1I$-(2@Cwy`*lV;t>gC6SnIlOjSv!r1QX4lubS8O z*Vo=HdKOq4=Bu6wo)&qN^p~8c^7Ri=YTa)B=9D$5y(V90h5FQxG*652b={0Ze1N(s zzpTRtkw_(y*Ah`0%)C+*_i4yFYlTlG_#}4oYGTX5jlIHH$JmjB8+)_H53<_RRI12$ zlrBH&AEKy)p}&AY9~#;9xqha<6+KAJipPG2|016g;7bW&tbTbaBIz>GhgBnt>!~ke zoi#sC#YBykvgP?QX`l6Z+?$S<~qBX#+D~}&UI^H%xoWA zAZjg0y}f;KfoL0wl0VKXX7jOqF-E!m7^giO+oRL>t7Pn+Ty@5J8nlNe=T-lgjB8z% zu}by}?0Qzp7Fg!@fWU+QsP?wRA(v%bOEShjXm#?pgtcm++SD#gg1A%D3sr5F+>K-p zs{wqk{V8kqBGoLakwljvpf_x(w_EEM@vKanOQrYcWQ8tPE&F$tpx;n0KcWSZYx3v7;7E3#}yvizCtXfC)sn|-wM2LPwb&I-Ff-b42HTDsf z&od+_P$yeYtY;ok_qDsfy0YkL=@DDlcv@$_)%#J^zu$w^72?)7!}LBWajs|!tKI_D z$vXL{>KA269O*Bq$NT~n({Sab5(Sm|H-GYFkExDPFZ_P;m;X3$mX|liKPvE^Beaa2dE9++ti2t{Ar)cL;YHXT0t*soRpTG^y{1 zpWCGF5x+}J>PO<~HmRSApWCD!6hF5~JuH51llqnTxlQUf;^#K0-z8ULQY$5*+ob;N z_q)QRp3m`{)H)q7sfpI)B`Ts`>c~W{#jZ8=bXuNoEnK4Ri4UE1$rYf{szcD0+8SA> zgLRd~!qMnwwSQ90QRR!QwNI*<@eN7mnlkNlu1kkh()D>tHK}LZN{0XHe@xp=@|g4# z58NlrvfeLLO|0UlR9%(yhP8u;itj}~@|2pdQkPm|m#SNPb^lYrf<``IPV5nzWqrR? zjZDzb!R)=bD7+@unBIT0O$#uM=RNJP75=OmW*u9h>c$VMrbO3Wl&;dhm#MDtw^S4F z@~SUa4MWTGJNS)AmNj-c)y|q_J+@qRRQ$r_*5xXNuOGR%N;QhVw|fh_^{^GT@!#m5 zt@IL}9thXPc3z>nH`34L)YP|#3@=?XJq7BT@o3Nd6+HOBt8TdX`PGQ$Hi&^9EickN z+S&T3wi#nhu~eMy+ea(}R11XaKGY1JlvjZ_`+E~&bIj<|0+ZOzOEF?DSlgGYQN)v-`DAJ}U4m8vOIyqK@xlSa0c@V609&2e9grlz(_ zT>4z!_EtyQA=+;uTy1pHR)uM+Im5mp?35k0s@kyc?J(N*p7`$7$mhC6)q{KV-_+m% zgR6-rH>$yU9Q3a|?Rv0U(;N3-Jw{r`|EAh_sSiInRH$03+h$wco>yJ8l1+M^j}6^9 z+j>qIGkfV+yy^wjH2yB>h(8#M!(UK?w3%7)0vCb2Zs#@7F-xc38*4ROqr#%+Iz6gw zn7w$Rntj%&hAQ=CtKN&ML+xFurgtZ;w2B88I|q|?Sx{}#;F{a}E?dLhd8W4WdWq}L zt*er3nj~Ch<-MqCbT5!>WQm=x*ROSC2(ondw$T04+KA*g)NCUPQ=6?Xszzl9#N~B(J5LR>xaS)~aw-=TWQkTGbp$4z1bI+m9>Rk1E+a{yIbbJN}hD>{Uz9EdI)Zi*Z|?$aMNk|6?@=p#Tic ze3fe2v&0kD`L*gBl{&~e{*wC5lV>JcC)TN#mC@7s>&t4aO8vt6UcVaI)(z`Sqv6 z%Jt$#Mgt$mu}=@amV@;-M8d7a-|9a_(4*)2&5X`c2`eV7c)tHx#X22I=WbSaAa!Et z7bR-A;+U#^sp@0yw5DxS*IKWX^1&CHtL7Fi>)*55Y*9VAx*xkmJs(fw1-B}CVO8@y zjlFsMvEAIy+wy;8#lOWvx}R8gzs1F@(etwCZ~CKq`94rP`e#J@)v1h}j$6~pIQReBda8_(NLOwxQ}=bM zbXv`}5rKn}U!-;3qIKR1wvILKZ8gmowdImUcK$K$1aKR1<+%O03fu);_*XnJiA%u^ z!)4&~D71%(r{|T6?AqezUSx-h-zAIeDDiYJvKxt?dy(Bt{F>5Mfr49!pL>zrPW;@9 z>`vn6USxOcS>sP9H9Fl<>YTS^l-hRE?&t}U$bEcacCyADP>rmP`_;VPO*r`v68`W<38(x) z!Z$wugA(uk-Gtvn-zQ=2wF1=`eNfG4xJbg>i)OQvUbu`ssG3^dL#ktRp~R7gH*9-J z+g*D|-R5t0-*MH?w2pnDyt)^x>0h#J()~ZYQuQ)R`yN(F{yy{v(80lgMAND~>Q7c` z=TggC)2}-&A^|kOpU18fs)e2T6%l%vrFVX#O3dh$BCi}>+S3#D?NGtJrdBUf_Aspn zPpOu+xG$aZ`)j$QYNcr%M0Pt;X~XZ-T=jd!SrL`0kDVj+xxvvfxregXGL*ad2h~2P ze{wD>VWmI)z_VJ>n?zvughT`1Q>7k`RL1?*k0GA*yq2!2?Wt+%H)}&Z1MN58*6~-qq?5>*;Uyx9*Ac+@!L*mhOo4+*;Gq zrAtz2!)BhPo`Lyk9-{!a47VD$5w`_bj@yIVhdYEji93y}!Wn}+MhGq(7dxo*`*_c{ z$!!OZyLM3exDkWW2Hl)KVA#073{M+m3?6s$<$k3HZ}oJom(YCDop(){n2Gf_2IWqi zFe~S-X_K2zn3_4d^~^gYtas~~p+;%lNuH~2tyhROSGPw;pwToUdy+`)5FZS-rV8&tMBlgR6zc+cs=Q2 z<~QRstc%ir*|;hfPtu;_o%EBzFc)XSkuIJE$GMpAy=!SC;t?odDiM-hoCBwfFa4(6 zQ^#vwEd6n}XPVjcUq?JfN)N+G;099vW%Qz(F4=|0`oN z_L+bDZ6TbQEBNORpQO(nY`EdcdsYLYkmHq zXPnARvU=?GbWvN9O7Gh1neXL|b!s0T$C66p{^2?6)twS`z%yBm=~6oXfah=xMTTPz zdomOi*nZg4R_*C!{rj+|jmqd{UG*i5f6A9|Rf?7IrDsrFUn(8Sp;?GI((GawHSS{S zGkdbbFovX9?+_!UD8(P+D2*Fp-s1gylul5(1l6iYv93PiiAA2$ zQAa!nz3N{_O1qr!bPb_Wr4zsNyrXoj62ABFbx73a+e%LzQ%64ggQuORmNbX;$je)u*%21&r2u~(BiepF8RQt7 zOKN$oJ`KDdM@Ysd1-Bz4{G!z;(%ZkjMCbeEjnQ~l)bv{SM0#)N;)?z}{@x&m8*jjS zd;9Cb10+VV&aRL3ZKQWPt9Wa4l=m<7=kYBo1$4R&KSOv(XKQPew`u)heBjURe`uuj zt@dBT-ox#mlwmcB#(xAK#&P=}o?s2t{&_q><@OJI!kVM~b9ki1?Qbl%*4y!U2*K?i zR%Csl{nxyBsejT-R%i_VCB>Ker@n6W*8Y(!b=~=_{>r*L#yeJzst;nkH~6&4&_>2I z>KSo*)JVG-G`s%d8Erz6X%F2le0zhj%*6xXK=+z-FP{oA0{UPY4UC&$cYYJ$fW8^V zRYtDD$hk8Z7jGD4-6+j2Fx22lGUHgjwKdk;Y+x;~ZD1nkcaFo2Eo7dG-1U)b4_sV> z2R4NN1uv$*wW8_p@8A;jq;W%UKNa?vb$df^(-zBmnTEFNI)XO5>0j}i!;(QRTxC7o z(A&&cu$*&wiB^nv{$SHK_Bz=+nosci)e`;%e5i`Ed*KQ=?OxMZCVU!RbCqf9pHBa? zj?acHAcj`$goO?_^wK_A?M>TW>jWK$Fl-C=tdijXxS+Rndn0dCHKl_!hgV-NJJTgn zkEMhcZgK=(1CQXWV~V8T2q!KzgS-P?f)u>a{n5rhc#~h~2y`4yZRDi?8BQDGBuQwB*OVgtOqdFt2S- zB8*rg2VU}Dr&S+aBR5O7-Mye^EMt|^r|w}NzluUcq5ZubELbAs24WVSr}4X&j;Z| zhR869|2XWW=s<6;f{TyyFq?#zz>&$;`Zzjs)Q#2$yvFCzlQ|OJoJscrN*mC|o^aeZ zR%jFAmn^W_^Xki<;N<@-;jukUBTv$Agx91v;UB?;bbg71ABD?1ILh?{yyT#1@R=pM zK1K+<$TaeW!{M+n!qH+~-)13(&nU|>jSPwK1#5=PclnYXY3oE1vWBV!bPqc+yf8EWMwG=%!Ai4{wUWTf6L*j1fDXJ@YV2c zq#0rt7-npNlU)M&{((pKE@f0nf*;{xz7Qo<68s96VE_Ud)?itkJ(d8m*u^N0bhV+)%nG%Frzu)dxx9GJb!wh(G8FMS0E8!C>-f(qA~F4_Re6R05^9P zFb&S#NuiQHAI?KTlKll37JQ+TX|%nH)0aAwZJ~z$9Tk{)qw(U zfy=#4hLho>&B|CU1?0i|FawdSue6S=g!e?7#svv~9lj7od{NpD;O4Ft{SvM^;8#+g z&fqj2iLMB>!kER^n89J#5YA_ZpDhI>!RgrNeBu6ZU{My%Brq60_YODH5=y z`{9g#+xFgP*I*GIY1d)wqz_lX#kUy&B{9~*m4CrFNsUTijPVVgRFe93kEvrUMG2>qkyLNbFHFCy%KR9DQ1;+WC_!hX;=Z+y759i*2 zCQF7h;J#;^8b1hc8ACTp_>*v&OTbq&4`l}OVZwD6Y{R1j2~#D(0l3vKJR8--AO0Ws z+`Eij3I7RR=2Ak|Vn&rKePejPE4&%p%B6(K@CXE={{AK#ibtj^!U%YbOX3M|mWyY@ zDI+m1$}eC(JZc85AObFh0~^2kjQb+^0(0(a2``4j=bFCYuqoFGoCI6e?q$NJbc7IJx0(+nOs;+Sl z5fToW2FA|rqIqzRs|A+AiPx}FkqnFAQFp@<|0Ov59@d!BLT|&B!7hn0K7{jqe4evH zGB}Axq`;PN9>)SXQebyD@oj8{@IZL~ zDbpyB{BMDMUNg{yk;WuEidc_iNQ4LAf;rAOe;i)c4`U+XE8)XfzQw|C!QKpK{(l$V z^AYPAnV$E-d9D^b5sv<4dw4=nYH)@K`7e^GWOx-8Zp|dtRubL_uDHbva(8%H3!bf( z@cwXttAHDI{H8oABl%5&V|O|gxGw_z&*$=n^`70wONo%4&f-pZ4ZMuaLMzFj6i#y) zl2717R+a&!`V!82%NYe{;mSvp5hwYDV4X4$D9~bY*k5C}&)E{QTajKL$#@i3;t>AB9h&xP0g z4Z|T#_y}yAbxiF_ILDQ~1fIg|m?i?f4QIdPOkVrof+sM~c7DDv;~*Y!EzF=29)-qm7 zJm%Hnj>+p+!l&S3SCg-USMQMo#NQ5=xxzn#FYI7!ON~##d!wB7z%TF~SA6}OSow*j z-b@?z{2zsfw~ixmB3%4Dnk^Fdg7>>J7!L29;`H(DaK^W$u|@=#3Rlf^_6-lhiSIcr zxExNqlk)*?o$X=wH#`bmeYg`&zT4SYd9qU14JHBBwftSrdZ^VxDhO-Lk|2#WFm~lNGML+Y$cr9bf0kgXzEO_H;v0ElToQZ=CqL@! zTu#8=o_2Iv%rMTt8H+f%kQ$k>4BHKkWebIq{>Gt!tQq6r!|ynzxjUS^k@-Jh`>(}g zZ%~P%jho>V2Kh-5Xf&KYgzcH|WH@`AGYam5_tD{5(ghF0LzvlUG`owJ!^N)rUx0Ib zi&-Q}giUzN8^x!Dq=0R3xU0q=!@2J{O7tb1_^Q*y-@`dgu>H~^23NvycRAB}9nG%% zn!>)-XeE`hB}~F2hu`zekR}@dXJl~+E&|>RS2c4?@o4zaYz&vgp9vSyWq~eSs5y}Z zisWAiFFxle^{WjTfBP)Q*6$!f;3h)%@ju{_WGDO>oOaUblJDRQ*JSf6JZ3cedl9%E z2QE3&oh8|h5R`g5-_0fhHEx9dCA*rWBMHjxbPj*6hKJqDo?bE>3GZG-f@PZ z51!)E^2Kl}CnSkd;8U7i<-Md6px638Bb+0l61Z#=iU?~vup3^t73(N`04`tTta87G zM+|UIM1F;{o<<1KfzZZmHlK7XUlVwkO8{SIJeE~DH68?KW4rUEz}w(tcC%ZAC&K$u zo%#F$xS)@-!dVO_yv34C;;(@dA7sW8fnJ4&tOzQt&nU-ZluM$|;KhUJH_6}|IJXkh zEL~v4(d73#HL4BId)f?!H-Qs4+GSwbE!Y_jd(5fOKsY5hc`^SF$7A0Dnph+p4JUD0 z5IB;V0;fGmrjp@YIMXHYSzqd1rw!vAMOm@sac7~tfadHUOObR>>>w7QV zXu6AjfQQU-wAg5dFs|_0a0NypPtrGmx3J>bFWdo6XC?|5qHE!7Mv<>XB8VW*MF!=~uu7>z$3p%Q~DvA6SsQ376OB7*6JjPvFHp z_4>=sz%Y*EF=QysCc~%_&L89$8aH!9X~YBbk7J!*%*% zGdLNIhx2>0^~y5*HJpP-t2quo2`_Ug)eCT8kuyrl;DR@u&E==?Fb*uT4S#+o;MK15 zXW>lOFpO-$OsV((bi3W;ZSgo)g|&+Ia}PLh7q4f-q4222rhVzAm2f1S#q1fVKo*=a z+F3*9!Z~9RQu2Qo-r^GI8Q52K8yT4X0*mn&Q{l`7JK*%29Xc4hD_oc9TaNk+v_ z@FB)^U=?h{Gpw(1(nrAguhOa_P}6w&f0)7fy?7)MVF>r>8#S}e?*(spif&PU0k46R zhnhxT;alK6TrZYO`iXEDraK(AFMi-rI~`N}1iW{Yvy++^hyLwz)#ybcMBd>nAhyC4 ztdMMhX!7^rA+B-%8GP84z5<@YT#+LJ{TEKBc>`V4okOb%SNt$vOA4IK1S47<16R2s zbcD0#p~cd~1K?x%jvcre4tb6ySN;|n1KS5gwg84P8$NlTqm%`3-usSW@;!@3ER#o= zG}(H%IKo-A?t;To2;@&I;Q_e(LuZ|T98P6{7_gkbz=^IFs@V!9?amFR=@&2xF6THu z(atZ-XT;$V>nb1#u5xXy{?2IV%au!@2@|MkWTIEgLqEqFc@Y?zZQROB0Ru^Y$TjZM z;gdf(r)E>(B?uTodd~m36v89pXC@bE!a_KAF4M8cFY#tLf1uNZyWn}Q8h#FMbn!po zq6}xY{2nfRg2zfJP!HQzSfZ8n(&EE<{`a)j^R*M91>DNjBHdxbRX`dX$?O*}G$Y}( z7nFfw+XdVSH|I`wlrDh$pJWBKmnGR2;rj_+{a04Pu)Y6ZfJgdrXY*JH&uhhWDJ}8> zoa7SdO*r;p_6-vL9vp@x4HR$~ZvL3F2t5I3tfkf>;4>Uv_x0ze=YPZanFzVuSmcX@ z_1hqjBH=?^EmWq{M{z|XE%Y&bj-4ta+3u2)IzP7a zse1m?ee@$9RdbxVz|)o%L4bhP*MZYr1+;`O%;bbbGVBeX4%RrvNQ3u3i;$B4jd131 zXD^t_sL3EdUB2A~V{`&)7zu0BIT=12%rM%R15a@Y@Hp(;`NSAc!%40ddI8R(hF%#( z8{jfme%oMU9OVzO1>lhkJQ6oMef&>2BtovqXrWW^2v-4T;N8r2Oqg~H)=XgfeUDb5 zYjlg&fk&KjEM;SOH3Ed#6^u5L;J9_vf4^kV8;>dRj_tn=KE&<#NzvL#a2S@aMB-1^ z@qeTrCEN!W{(uk?zD)D&&UE}7TyzaLtrETo&h@#P^j$piU3?JsrZMA50Y~8_uJ9k> zkWJ3?YPKW80UTC~PSk@Bxtcr*F5}q{Y?IwW@vtxZWfm0T(G`z1A2_pBAGpX>;LY$l z7ia45aOdHU95~rE4D;c%*PSj{0UOLUvAk#`$AG+5xR!jU7aEVKxGjQ2U3^S=v?e@$O_c%v1(eMRVmo#rr|L3zp37FC@M5x&2 z^w|LT@G_cJ3cMaJa4BIXJg>@WvDvUOO$9fj55l`S)C%kJA`Q zQ=A1zFP(rT7+&@gY#%^Y0@PN z;Sd%BB2X>E!ehx}*4_QRje2b0eF|+=E}3nE6FJLI72c`C2QjXNKhu1JwUxBKqr5lr zh%W`5f>%#=hHK44)`}=&rlgI9`*PZrDm*-l`DUkc=G>I<5GoQvxZY*AhAUk?F$As( zj;&4AVF#d_SBrpAjQm0Pl8PWIP8a-|3twuh;QgvPYB(y$+{7 z!U?SKyPDC}b#{InWE{XF=^Vouk+lV^fb++qj8fnQ_*hWlXhU_RrB^t!Yy-IR4d-|+ z86L(#MV_R;PRC~!4(!lwhYKD@-?Tt_A(Mqi8XJxzNstSB+13X#cvOdT%o51pB{-Ai zeY(UihA+^)Il}M3`yO}f$3gfc`;lx3{~lf=!`oiS+!D!p{~Z;y55MXRU40hUiFH9x zIb)5^aKR5wllOx|0!uRr+1{Djxp)%chg~Nt)8OX*aQ{MPAs$tzx@fnt5-uKyjSz`n zg6I9{6j%ly%W-sOKb+_)@D!Zl;@{xiG0qcS5eT^PT3S_4;t?CHVT{oUt~lZ} z+12nGmsXF2bIBlC1e^|!YD*u>v^@t-a|!Uc4!<5J@t=eBDMhMYNJOxDD8^%08MTrK zZ^I*88SI10cJL)^68=4W+Utc#uOf}}a5)0fllC0pL7A%Vqf*#3UBOt`yMc=k83jr3 z-sv1<Rya^6lNv+9HXK*(hc+y<&F>~R-Uvu6(1uu?s)*Wl%xCyptvD3c+ zr$5aGM#}rA4$q|h8C`aSukkqasI!zi2cIrwm`Q?KT_~U!A!_*JcYueCbGGTd;jmtg zj*N!KG8eJoA-cQ}(r zzJ}T9!;JlK0Xwij`mc3*SBsv};dPv0UArqv==;g3K_nh2eDX42sS@BN3lUc&PJt_3 z1zruu(d1J^fScgVhn-98iEvp^sbh^?xD~@TAmBpS7x|R4zJD5z$Q6#|+XnBcsf-LM z;O}sX=?M5Q_$1SKV3?kQTU9!v<|15>$cI&ARMhRp((g@lLMjy3jsD+H9}bZMIuM}{ zQyT*7Dsz5yr6ZUo3nKUe}k|j*+HE!6`ViwX=cI2B5%|VFaB1fK#DX+CY?|BT|7u zu$Lz{0s@Zm=>#RtJ-`gO??%(073~5Sz`Kt-huDR1#yRJBZX;Z_-)WJz;G&zHJ>>`R zn7=qjxSzst8IE1>9mb=A8U>p4Cpd>KSU|!W-7&4K{Q}$)KJ>X$U{APeiBsTEIOIn3 zM*92?xX{%?yCX1kL8WB=pGAb`(|K4$5-fsCxala7E_fP_8$!PezX*>y%2G~RXfwQ@ z^+BTWHaL~X^aANWfh$s-2OAE-Yk~q%?bCRiE_5azqX&~uFoIz;fcL~Yr|7L=uTuk~ z3p|XYpG*<(8u&EFfdRf5K6i6z`|G^jO|wU7#!&C(nh}#H=8Vgpm^pD~&Ye@nO`V=O zv9$h;-W3rMGq3P}X}mY0xhKo?Slb@*HmRu}wQAMaI`WV=zPA2|NqS?CvB;{uz}u{* ze&YY|4y)4wZ_5xqT$1~-$5>*0^^muLHD!UfZVf(f5W*Ml=}_K=e**eL%Oo`R6YFC_ zYZxf|KI@Er%M4Sw-)fpq8iwWK10J5wwsRblPmXw<vLt4X?H6VQ(A7rv^6Z*D$YjkXN(0 j^&7$77G7hu)ovl8q~GS{*!D*Kw(JS7G0ZX-dK>&d5Z_!T delta 85297 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 daclist = { defs::VREF_PRECH, defs::VREF_DS, defs::VREF_COMP}; for (auto it : daclist) { @@ -2417,10 +2417,13 @@ TEST_CASE("scan", "[.cmd]") { notImplementedInd = defs::VCASCP_PB; break; case defs::JUNGFRAU: - case defs::MOENCH: ind = defs::VB_COMP; notImplementedInd = defs::VSVP; break; + case defs::MOENCH: + ind = defs::VIN_CM; + notImplementedInd = defs::VSVP; + break; case defs::GOTTHARD: ind = defs::VREF_DS; notImplementedInd = defs::VSVP; @@ -3472,7 +3475,7 @@ TEST_CASE("lock", "[.cmd]") { TEST_CASE("execcommand", "[.cmd]") { Detector det; CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("execcommand", {"ls"}, -1, PUT)); + REQUIRE_NOTHROW(proxy.Call("execcommand", {"ls *.txt"}, -1, PUT)); } TEST_CASE("framecounter", "[.cmd]") { diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index ec57de4e3..e8bf60789 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -4,10 +4,10 @@ #define RELEASE "developer" #define APILIB "developer 0x230224" #define APIRECEIVER "developer 0x230224" -#define APICTB "developer 0x230922" -#define APIGOTTHARD "developer 0x230922" -#define APIGOTTHARD2 "developer 0x230922" -#define APIMYTHEN3 "developer 0x230922" -#define APIMOENCH "developer 0x230922" -#define APIJUNGFRAU "developer 0x231018" -#define APIEIGER "developer 0x231018" +#define APICTB "developer 0x231102" +#define APIGOTTHARD "developer 0x231102" +#define APIGOTTHARD2 "developer 0x231102" +#define APIJUNGFRAU "developer 0x231102" +#define APIMYTHEN3 "developer 0x231102" +#define APIMOENCH "developer 0x231102" +#define APIEIGER "developer 0x231102" diff --git a/tests/scripts/test_simulators.py b/tests/scripts/test_simulators.py index 24ee6f4dd..2ae0ae2b8 100644 --- a/tests/scripts/test_simulators.py +++ b/tests/scripts/test_simulators.py @@ -21,29 +21,37 @@ class RuntimeException (Exception): def Log(color, message): print('\n' + color + message, flush=True) + def checkIfProcessRunning(processName): - ''' - Check if there is any running process that contains the given name processName. - https://gist.github.com/Sanix-Darker/8cbed2ff6f8eb108ce2c8c51acd2aa5a - ''' - # Iterate over the all the running process - for proc in psutil.process_iter(): - try: - # Check if process name contains the given name string. - if processName.lower() in proc.name().lower(): - return True - except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): - pass - return False; + cmd = "ps -ef | grep " + processName + print(cmd) + res=subprocess.getoutput(cmd) + print(res) + # eg. of output + #l_user 250506 243295 0 14:38 pts/5 00:00:00 /bin/sh -c ps -ef | grep slsReceiver + #l_user 250508 250506 0 14:38 pts/5 00:00:00 grep slsReceiver + + print('how many') + cmd = "ps -ef | grep " + processName + " | wc -l" + print(cmd) + res=subprocess.getoutput(cmd) + print(res) + + if res == '2': + return False + return True + def killProcess(name): if checkIfProcessRunning(name): Log(Fore.GREEN, 'killing ' + name) p = subprocess.run(['killall', name]) if p.returncode != 0: - raise RuntimeException('error in killall ' + name) + raise RuntimeException('killall failed for ' + name) + else: + print('process not running : ' + name) -def cleanup(name, d): +def cleanup(name): ''' kill both servers, receivers and clean shared memory ''' @@ -51,18 +59,27 @@ def cleanup(name, d): killProcess(name + 'DetectorServer_virtual') killProcess('slsReceiver') killProcess('slsMultiReceiver') - d.freeSharedMemory() + cleanSharedmemory() + +def cleanSharedmemory(): + Log(Fore.GREEN, 'Cleaning up shared memory...') + try: + p = subprocess.run(['sls_detector_get', 'free'], stdout=fp, stderr=fp) + except: + Log(Fore.RED, 'Could not free shared memory') + raise def startProcessInBackground(name): try: # in background and dont print output - p = subprocess.Popen(name.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + p = subprocess.Popen(name.split(), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, restore_signals=False) Log(Fore.GREEN, 'Starting up ' + name + ' ...') except: Log(Fore.RED, 'Could not start ' + name) raise def startServer(name): + startProcessInBackground(name + 'DetectorServer_virtual') # second half if name == 'eiger': @@ -79,6 +96,7 @@ def startReceiver(name): time.sleep(2) def loadConfig(name, rx_hostname, settingsdir): + Log(Fore.GREEN, 'Loading config') try: d = Detector() if name == 'eiger': @@ -106,25 +124,36 @@ def loadConfig(name, rx_hostname, settingsdir): Log(Fore.RED, 'Could not load config for ' + name) raise -def startCmdTests(name, fp): - try: - p = subprocess.run(['tests', '--abort', '[.cmd]'], stdout=fp, stderr=fp) - if p.returncode != 0: - raise Exception - except: - Log(Fore.RED, 'Cmd tests failed for ' + name) - raise +def startCmdTests(name, fp, fname): + Log(Fore.GREEN, 'Cmd Tests for ' + name) + cmd = 'tests --abort [.cmd] -s -o ' + fname + p = subprocess.run(cmd.split(), stdout=fp, stderr=fp, check=True, text=True) + p.check_returncode() + + with open (fname, 'r') as f: + for line in f: + if "FAILED" in line: + msg = 'Cmd tests failed for ' + name + '!!!' + Log(Fore.RED, msg) + raise Exception(msg) + + Log(Fore.GREEN, 'Cmd Tests successful for ' + name) + +def startGeneralTests(fp, fname): + Log(Fore.GREEN, 'General Tests') + cmd = 'tests --abort -s -o ' + fname + p = subprocess.run(cmd.split(), stdout=fp, stderr=fp, check=True, text=True) + p.check_returncode() + + with open (fname, 'r') as f: + for line in f: + if "FAILED" in line: + msg = 'General tests failed !!!' + Log(Fore.RED, msg) + raise Exception(msg) + + Log(Fore.GREEN, 'General Tests successful') -def startNormalTests(d, fp): - try: - Log(Fore.BLUE, '\nNormal tests') - p = subprocess.run(['tests', '--abort' ], stdout=fp, stderr=fp) - if p.returncode != 0: - raise Exception - d.freeSharedMemory() - except: - Log(Fore.RED, 'Normal tests failed') - raise # parse cmd line for rx_hostname and settingspath using the argparse library @@ -149,46 +178,51 @@ if args.servers is None: else: servers = args.servers -Log(Fore.WHITE, 'rx_hostname: ' + args.rx_hostname + '\settingspath: \'' + args.settingspath + '\'') - -# handle zombies (else killing slsReceivers will fail) -# dont care about child process success -signal.signal(signal.SIGCHLD, signal.SIG_IGN) +Log(Fore.WHITE, 'Arguments:\nrx_hostname: ' + args.rx_hostname + '\nsettingspath: \'' + args.settingspath + '\'') # redirect to file +prefix_fname = '/tmp/slsDetectorPackage_virtual_test' original_stdout = sys.stdout original_stderr = sys.stderr -fname = '/tmp/slsDetectorPackage_virtual_test.txt' -Log(Fore.BLUE, 'Tests -> ' + fname) +fname = prefix_fname + '_log.txt' +Log(Fore.BLUE, '\nLog File: ' + fname) + with open(fname, 'w') as fp: + + # general tests + file_results = prefix_fname + '_results_general.txt' + Log(Fore.BLUE, 'General tests (results: ' + file_results + ')') sys.stdout = fp sys.stderr = fp - - d = Detector() - # TODO: redirect Detector object print out also to file - startNormalTests(d, fp) + Log(Fore.BLUE, 'General tests (results: ' + file_results + ')') + startGeneralTests(fp, file_results) for server in servers: try: # print to terminal for progress sys.stdout = original_stdout sys.stderr = original_stderr - Log(Fore.BLUE, server + ' tests') + file_results = prefix_fname + '_results_cmd_' + server + '.txt' + Log(Fore.BLUE, 'Cmd tests for ' + server + ' (results: ' + file_results + ')') sys.stdout = fp sys.stderr = fp + Log(Fore.BLUE, 'Cmd tests for ' + server + ' (results: ' + file_results + ')') # cmd tests for det - Log(Fore.BLUE, 'Cmd Tests for ' + server) - cleanup(server, d) + cleanup(server) startServer(server) startReceiver(server) loadConfig(server, args.rx_hostname, args.settingspath) - startCmdTests(server, fp) - cleanup(server, d) + startCmdTests(server, fp, file_results) + cleanup(server) except: - cleanup(server, d) + Log(log.RED, 'Exception caught. Cleaning up.') + cleanup(server) + sys.stdout = original_stdout + sys.stderr = original_stderr + Log(Fore.RED, 'Cmd tests failed for ' + server + '!!!') raise From 01e4bcb47ec83f86d39ac84574edf7b62f9f0379 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 7 Nov 2023 14:52:14 +0100 Subject: [PATCH 09/38] formatting --- slsDetectorGui/src/qTabMeasurement.cpp | 4 +- .../slsDetectorFunctionList.c | 8 +- .../slsDetectorServer/src/blackfin.c | 2 +- .../src/slsDetectorServer_funcs.c | 78 +++++++++---------- slsDetectorSoftware/src/Detector.cpp | 3 +- slsDetectorSoftware/src/DetectorImpl.cpp | 8 +- slsDetectorSoftware/src/DetectorImpl.h | 4 +- .../tests/test-CmdProxy-gotthard2.cpp | 3 +- .../tests/test-CmdProxy-moench.cpp | 12 +-- slsDetectorSoftware/tests/test-Result.cpp | 18 ++--- slsSupportLib/include/sls/TypeTraits.h | 13 ++-- slsSupportLib/include/sls/versionAPI.h | 12 +-- 12 files changed, 81 insertions(+), 84 deletions(-) diff --git a/slsDetectorGui/src/qTabMeasurement.cpp b/slsDetectorGui/src/qTabMeasurement.cpp index 0bcfb7111..dc97903bb 100644 --- a/slsDetectorGui/src/qTabMeasurement.cpp +++ b/slsDetectorGui/src/qTabMeasurement.cpp @@ -804,8 +804,8 @@ void qTabMeasurement::GetNextFrameNumber() { spinNextFrameNumber->setValue(retval); } CATCH_HANDLE("Could not get starting frame number.", - "qTabMeasurement::GetNextFrameNumber", spinNextFrameNumber, - &QSpinBox::setValue, -1) + "qTabMeasurement::GetNextFrameNumber", spinNextFrameNumber, + &QSpinBox::setValue, -1) connect(spinNextFrameNumber, SIGNAL(valueChanged(int)), this, SLOT(SetNextFrameNumber(int))); } diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index 5d5c83de9..deabb002a 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -2928,7 +2928,8 @@ int softwareTrigger(int block) { usleep(100); #ifndef VIRTUAL - // block till frame sent out & back to wait for trigger (or not busy anymore) + // block till frame sent out & back to wait for trigger (or not busy + // anymore) if (block) { uint32_t retval = bus_r(STATUS_REG); while ((retval & RUN_BUSY_MSK) && !(retval & WAITING_FOR_TRIGGER_MSK)) { @@ -2971,11 +2972,10 @@ enum runStatus getRunStatus() { LOG(logINFOBLUE, ("Status: ERROR\n")); s = ERROR; } - + // running else if (retval & RUN_BUSY_MSK) { - if ((retval & - WAITING_FOR_TRIGGER_MSK) || + if ((retval & WAITING_FOR_TRIGGER_MSK) || (retval & WAITING_FOR_START_FRAME_MSK)) { LOG(logINFOBLUE, ("Status: WAITING\n")); s = WAITING; diff --git a/slsDetectorServers/slsDetectorServer/src/blackfin.c b/slsDetectorServers/slsDetectorServer/src/blackfin.c index 1b38be10a..dc9011b96 100644 --- a/slsDetectorServers/slsDetectorServer/src/blackfin.c +++ b/slsDetectorServers/slsDetectorServer/src/blackfin.c @@ -88,7 +88,7 @@ u_int32_t writeRegister(u_int32_t offset, u_int32_t data) { // if electron mode bit touched #ifdef JUNGFRAUD int electronCollectionModeChange = 0; - if ((offset << MEM_MAP_SHIFT) == DAQ_REG) { + if ((offset << MEM_MAP_SHIFT) == DAQ_REG) { if ((readRegister(offset) ^ data) & DAQ_ELCTRN_CLLCTN_MDE_MSK) { electronCollectionModeChange = 1; } diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 7175cd996..e15bdbc15 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -1950,59 +1950,57 @@ int acquire(int blocking, int file_des) { #ifdef EIGERD // check for hardware mac and hardware ip if (udpDetails[0].srcmac != getDetectorMAC()) { - ret = FAIL; - uint64_t sourcemac = getDetectorMAC(); - char src_mac[MAC_ADDRESS_SIZE]; - getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac); - sprintf( - mess, + ret = FAIL; + uint64_t sourcemac = getDetectorMAC(); + char src_mac[MAC_ADDRESS_SIZE]; + getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac); + sprintf(mess, "Invalid udp source mac address for this detector. Must be " "same as hardware detector mac address %s\n", src_mac); - LOG(logERROR, (mess)); - } else if (!enableTenGigabitEthernet(GET_FLAG) && - (udpDetails[0].srcip != getDetectorIP())) { - ret = FAIL; - uint32_t sourceip = getDetectorIP(); - char src_ip[INET_ADDRSTRLEN]; - getIpAddressinString(src_ip, sourceip); - sprintf( - mess, + LOG(logERROR, (mess)); + } else if (!enableTenGigabitEthernet(GET_FLAG) && + (udpDetails[0].srcip != getDetectorIP())) { + ret = FAIL; + uint32_t sourceip = getDetectorIP(); + char src_ip[INET_ADDRSTRLEN]; + getIpAddressinString(src_ip, sourceip); + sprintf(mess, "Invalid udp source ip address for this detector. Must be " "same as hardware detector ip address %s in 1G readout " "mode \n", src_ip); - LOG(logERROR, (mess)); - } else + LOG(logERROR, (mess)); + } else #endif - if (configured == FAIL) { + if (configured == FAIL) { + ret = FAIL; + strcpy(mess, "Could not start acquisition because "); + strcat(mess, configureMessage); + LOG(logERROR, (mess)); + } else if (sharedMemory_getScanStatus() == RUNNING) { + ret = FAIL; + strcpy(mess, "Could not start acquisition because a scan is " + "already running!\n"); + LOG(logERROR, (mess)); + } else { + memset(scanErrMessage, 0, MAX_STR_LENGTH); + sharedMemory_setScanStop(0); + sharedMemory_setScanStatus(IDLE); // if it was error + if (pthread_create(&pthread_tid, NULL, &start_state_machine, + &blocking)) { ret = FAIL; - strcpy(mess, "Could not start acquisition because "); - strcat(mess, configureMessage); - LOG(logERROR, (mess)); - } else if (sharedMemory_getScanStatus() == RUNNING) { - ret = FAIL; - strcpy(mess, "Could not start acquisition because a scan is " - "already running!\n"); + strcpy(mess, "Could not start acquisition thread!\n"); LOG(logERROR, (mess)); } else { - memset(scanErrMessage, 0, MAX_STR_LENGTH); - sharedMemory_setScanStop(0); - sharedMemory_setScanStatus(IDLE); // if it was error - if (pthread_create(&pthread_tid, NULL, &start_state_machine, - &blocking)) { - ret = FAIL; - strcpy(mess, "Could not start acquisition thread!\n"); - LOG(logERROR, (mess)); - } else { - // wait for blocking always (scan or not) - // non blocking-no scan also wait (for error message) - // non blcoking-scan dont wait (there is scanErrorMessage) - if (blocking || !scan) { - pthread_join(pthread_tid, NULL); - } + // wait for blocking always (scan or not) + // non blocking-no scan also wait (for error message) + // non blcoking-scan dont wait (there is scanErrorMessage) + if (blocking || !scan) { + pthread_join(pthread_tid, NULL); } } + } } return Server_SendResult(file_des, INT32, NULL, 0); } diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 4124110d3..4ac8f2d44 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -886,7 +886,8 @@ void Detector::stopDetector(Positions pos) { // idle before stopping will return running (after async start script) when // getting status after, which will then be stopped again. - while (!status.contains_only(defs::runStatus::IDLE, defs::runStatus::STOPPED)){ + while (!status.contains_only(defs::runStatus::IDLE, + defs::runStatus::STOPPED)) { if (status.any(defs::runStatus::ERROR)) { throw RuntimeError("Could not stop detector. At least one module " "returned error status."); diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index e22f58fc8..2db04f1f2 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -1229,17 +1229,17 @@ int DetectorImpl::acquire() { // handle jf sync issue (master idle, slaves stopped) if (statusList.contains_only(IDLE, STOPPED)) { status = STOPPED; - } - else + } else status = statusList.squash(RUNNING); } // progress auto a = Parallel(&Module::getReceiverProgress, {}); double progress = (*std::max_element(a.begin(), a.end())); - + // callback - acquisition_finished(progress, static_cast(status), acqFinished_p); + acquisition_finished(progress, static_cast(status), + acqFinished_p); } clock_gettime(CLOCK_REALTIME, &end); diff --git a/slsDetectorSoftware/src/DetectorImpl.h b/slsDetectorSoftware/src/DetectorImpl.h index 9baefe8b3..a4484c243 100644 --- a/slsDetectorSoftware/src/DetectorImpl.h +++ b/slsDetectorSoftware/src/DetectorImpl.h @@ -84,9 +84,7 @@ class DetectorImpl : public virtual slsDetectorDefs { */ virtual ~DetectorImpl(); - template struct NonDeduced { - using type = CT; - }; + template struct NonDeduced { using type = CT; }; template Result Parallel(RT (Module::*somefunc)(CT...), std::vector positions, diff --git a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp index ccc5c9410..4cc88d954 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp @@ -692,7 +692,8 @@ TEST_CASE("confadc", "[.cmd]") { const int ndet = det.size(); const int nchip = 10; const int nadc = 32; - std::vector>> prev_val(ndet, std::vector>(nchip, std::vector(nadc))); + std::vector>> prev_val( + ndet, std::vector>(nchip, std::vector(nadc))); for (int i = 0; i != ndet; ++i) { for (int j = 0; j != nchip; ++j) { for (int k = 0; k != nadc; ++k) { diff --git a/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp b/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp index fdcbaff24..e56e0d99f 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp @@ -19,17 +19,18 @@ using test::PUT; /* dacs */ TEST_CASE("Setting and reading back moench dacs", "[.cmd][.dacs]") { - // vbp_colbuf, vipre, vin_cm, vb_sda, vcasc_sfp, vout_cm, vipre_cds, ibias_sfp + // vbp_colbuf, vipre, vin_cm, vb_sda, vcasc_sfp, vout_cm, vipre_cds, + // ibias_sfp Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MOENCH) { - SECTION("vbp_colbuf") { test_dac(defs::VBP_COLBUF, "vbp_colbuf", 1300); } + SECTION("vbp_colbuf") { + test_dac(defs::VBP_COLBUF, "vbp_colbuf", 1300); + } SECTION("vipre") { test_dac(defs::VIPRE, "vipre", 1000); } SECTION("vin_cm") { test_dac(defs::VIN_CM, "vin_cm", 1400); } - SECTION("vb_sda") { - test_dac(defs::VB_SDA, "vb_sda", 680); - } + SECTION("vb_sda") { test_dac(defs::VB_SDA, "vb_sda", 680); } SECTION("vcasc_sfp") { test_dac(defs::VCASC_SFP, "vcasc_sfp", 1428); } SECTION("vout_cm") { test_dac(defs::VOUT_CM, "vout_cm", 1200); } SECTION("vipre_cds") { test_dac(defs::VIPRE_CDS, "vipre_cds", 800); } @@ -105,5 +106,4 @@ TEST_CASE("Setting and reading back moench dacs", "[.cmd][.dacs]") { } } - } // namespace sls diff --git a/slsDetectorSoftware/tests/test-Result.cpp b/slsDetectorSoftware/tests/test-Result.cpp index 30a735f28..c921dcfb1 100644 --- a/slsDetectorSoftware/tests/test-Result.cpp +++ b/slsDetectorSoftware/tests/test-Result.cpp @@ -196,24 +196,24 @@ TEST_CASE("String conversions") { "[{one: 1}, {one: 1, three: 3, two: 2}, {one: 1}]"); } -TEST_CASE("Any element is equal"){ - Result r{1,2,3,4,5}; +TEST_CASE("Any element is equal") { + Result r{1, 2, 3, 4, 5}; REQUIRE(r.any(3)); REQUIRE_FALSE(r.any(9)); } -TEST_CASE("Result contains only the specified elements"){ - Result r{1,1,1}; +TEST_CASE("Result contains only the specified elements") { + Result r{1, 1, 1}; REQUIRE(r.contains_only(1)); - REQUIRE(r.contains_only(1,1)); + REQUIRE(r.contains_only(1, 1)); } -TEST_CASE("Only with multiple values"){ - Result r{1,1,2,1,2,1,1}; +TEST_CASE("Only with multiple values") { + Result r{1, 1, 2, 1, 2, 1, 1}; REQUIRE_FALSE(r.contains_only(1)); REQUIRE_FALSE(r.contains_only(2)); - REQUIRE(r.contains_only(1,2)); - REQUIRE(r.contains_only(2,1)); + REQUIRE(r.contains_only(1, 2)); + REQUIRE(r.contains_only(2, 1)); } } // namespace sls diff --git a/slsSupportLib/include/sls/TypeTraits.h b/slsSupportLib/include/sls/TypeTraits.h index 80bee0b44..042d5d58e 100644 --- a/slsSupportLib/include/sls/TypeTraits.h +++ b/slsSupportLib/include/sls/TypeTraits.h @@ -103,14 +103,13 @@ template struct is_vector : public std::false_type {}; template struct is_vector> : public std::true_type {}; - - -template struct Conjunction : std::true_type {}; -template struct Conjunction : B1 {}; -template +template struct Conjunction : std::true_type {}; +template struct Conjunction : B1 {}; +template struct Conjunction : std::conditional, B1>::type {}; -template -using AllSame = typename std::enable_if...>::value>::type; +template +using AllSame = + typename std::enable_if...>::value>::type; } // namespace sls \ No newline at end of file diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index e8bf60789..2b55d8905 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -4,10 +4,10 @@ #define RELEASE "developer" #define APILIB "developer 0x230224" #define APIRECEIVER "developer 0x230224" -#define APICTB "developer 0x231102" -#define APIGOTTHARD "developer 0x231102" +#define APICTB "developer 0x231102" +#define APIGOTTHARD "developer 0x231102" #define APIGOTTHARD2 "developer 0x231102" -#define APIJUNGFRAU "developer 0x231102" -#define APIMYTHEN3 "developer 0x231102" -#define APIMOENCH "developer 0x231102" -#define APIEIGER "developer 0x231102" +#define APIJUNGFRAU "developer 0x231102" +#define APIMYTHEN3 "developer 0x231102" +#define APIMOENCH "developer 0x231102" +#define APIEIGER "developer 0x231102" From 1a7c74fe4eafc5a8e290ef19bd1840587461abda Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 19 Oct 2023 16:55:29 +0200 Subject: [PATCH 10/38] tests for jf (#835) --- .../tests/test-CmdProxy-chiptestboard.cpp | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp b/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp index ad3211888..314b48e60 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp @@ -356,15 +356,29 @@ TEST_CASE("powerindex", "[.cmd]") { TEST_CASE("powervalues", "[.cmd]") { Detector det; CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("powervalues", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("powervalues", {}, -1, PUT)); + + auto det_type = det.getDetectorType().squash(); + + if (det_type == defs::CHIPTESTBOARD) { + REQUIRE_NOTHROW(proxy.Call("powervalues", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("powervalues", {}, -1, PUT)); + } else { + REQUIRE_THROWS(proxy.Call("powervalues", {}, -1, GET)); + } } TEST_CASE("slowadcvalues", "[.cmd]") { Detector det; CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("slowadcvalues", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("slowadcvalues", {}, -1, PUT)); + + auto det_type = det.getDetectorType().squash(); + + if (det_type == defs::CHIPTESTBOARD) { + REQUIRE_NOTHROW(proxy.Call("slowadcvalues", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("slowadcvalues", {}, -1, PUT)); + } else { + REQUIRE_THROWS(proxy.Call("slowadcvalues", {}, -1, GET)); + } } TEST_CASE("slowadclist", "[.cmd]") { From 7d7ac26c30adbba41bf4d892013c0e4dee5ff693 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 8 Nov 2023 09:26:11 +0100 Subject: [PATCH 11/38] execute command inside server fixed (from fix simulator tests and exec command PR) (#857) --- .../bin/ctbDetectorServer_developer | Bin 328240 -> 328256 bytes .../bin/eigerDetectorServer_developer | Bin 444195 -> 444195 bytes .../bin/gotthard2DetectorServer_developer | Bin 286768 -> 286768 bytes .../bin/gotthardDetectorServer_developer | Bin 277180 -> 277196 bytes .../bin/jungfrauDetectorServer_developer | Bin 312432 -> 312448 bytes .../bin/moenchDetectorServer_developer | Bin 295260 -> 295308 bytes .../bin/mythen3DetectorServer_developer | Bin 300752 -> 300752 bytes .../include/slsDetectorServer_funcs.h | 2 +- .../src/slsDetectorServer_funcs.c | 5 +++-- slsSupportLib/include/sls/versionAPI.h | 14 +++++++------- 10 files changed, 11 insertions(+), 10 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index d669625a65f84406bb36c69e4643734e758f39d1..a3babe2adad62ed5987f257184d982d42334a7bc 100755 GIT binary patch delta 55178 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 delta 55136 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

    *`!rN3lAJy~IT?anVaf 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 xA*07$?eYa#`e)tb-$lsU!J2 diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index a7a6f7b997b8f2322f4e53632af93ded0676dcdd..6de67d735c62e1e3da94c741440947359a41eda8 100755 GIT binary patch delta 69134 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 T%iH?TrW0IvpZKCdZN2sXQ;JuD delta 47158 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 M`_zYRYWHpb1NA1OnE(I) diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer index 55ad7cae4e1170ca570944736a8cf00336285fda..82417accf864055106df317805f51d83f12f34c9 100755 GIT binary patch delta 44550 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 delta 44293 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 Y6QI$4z0rRCtvRmGd*fh!y!^HQ4>L7D^8f$< diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index b218884421e8a0c097ee0ef04779e46143a2904a..35c788fe2ee750daa8636cd70614099b1cfb6280 100755 GIT binary patch delta 55091 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 K#nx2Q_WuV9`Acm8 delta 54992 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 diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index bddb845fb7a90efdb48882f47f51b9e8b16a9041..5f5a1828cd5280a007530446291289d50b689c4d 100755 GIT binary patch delta 108512 zcma&P4_p-0{{KJAA6*c25L8IaMNv^P*Z*i*;Qx>m4VBD$?^;%NvwN}Y?PE9ZT{J2y zD{w5eOxL2aw8F9imkQGojS@`@(~5C$#XlLA8kV}h=b7Ev9c$(L^YM7&K3{X@{Qoy+ z&YnHIq}{TI+ojz;E<0C}qzG(`6!xnmg&)e6BJx1l_gU&y1X%8zIJW!B*&D+XipO-F zRCqpIEj<5A>1g#iK0SAS;N}c9B2&UFN3I+5d*nnl=1?mvVYSo{E=e(Ia<-aM8-r!2 zskIW8Yrk2Q56M$o^S5}*b&+YPX~oC-bxfD1@_WGa2rLp#Kdt19jlY0F*m<^T! z_hLPiFDwOwa`t+2C`z)VZ48%Ux+esqT}iYnfBg^99uXqi1qqfScd_o_E0!WWtTsGU zCWm*7%NW#Kt^R%G%u#lu2!<*ThF>3-h+hAzS(lZa;iDrPe+^d~m9`OMhmFObV3O;N zB9)f!YrkP-%EKaqT^6sg~?PM7cAITB7grtBT16BRjPDv z)8qVuRLMOp0&zYRF=cF(r6n0UPF;1O1vaYumU8>%`J2PZ*p~J-Wb5{xL7)C9)wuWS zKCO^y@X0;gpPkD5$SHRlKF#{Ag*xlEcIDmv;L}2rPbpHJTh)EKNvgxAe8Zk|Ph8T0B)E-+m|Ge!t+dXr3N<_?iu8>->F>9C$7~SLd&LOn?``i*)|7M+RI3 z7wP<2k94>MF46g;9(K44F4Ot_9;vXi8lhSj-s)jPsDtZtezived=@^d^V%LVY$d|h ziz0&0^{~Q8aFWhX_sCLb9f-#0A+(pTGkS>@l4v#K->jTe=dLU7<*-`gslN{Hb6ixF zbuHVEe0G@CQR5D`SsZ)a6qCPqu}T^0DqO9)=+*3AQIM$)uQtsq3Ubjf$x-PRy+fRG zre*u?8*sM)cky0POv2qTuP7$RunxA(T-n6&eVwWddbC!H2FR|vxlhf_4a!Gqr`Ow}>EtT65cheTipr%JndXwg z-5E-9RQtjE(~I=DrAN~LOQQQOE6r5rT(V$guIC*VExCU%?sV?>GhMkis*fduzsWlMWdj z@+h_RQWz#_zin=G8;!bqt6|PDcFAFJq5hk5?%%}{p``i@JP>RIvw)5dkLbN5!8 zF0Y(y4D*PjSM{jG3A7>P2q8c&WGA$Ss-nsoXMHIn!!}GvYGi^W|Vf4yK5R)L#*iJN1bC zornlMQ=M?xf{9@7C!j7i(VrYhm+i*&Y_4bP*E^()w`bh#)3b0NMl^kQi)h|5pwX$v zvyONQuP56x?-t(P8t^I?uW~QXuy@tQrxY{xiW_f`ZR)y|)X5gD@5l@_kKD<-?A7kPC>oDU1AOA5D3r}Z zXyO~KF+BtKiXe<0K2u#lv=?0dgc0Po>kQSajk+lMU^-mB)XP$)I{aOWS}Xf@|LR_|IrTt(7NXz7 zuV1sNQ6uft$nxRAE-XW})7Scz`f-*^-;W@ zW%90t0*UzN1(Dm&4HPx5&Mj(7 zbV41YS}&q*$r7L1ycR``mo%GDvc;#!*DQ{0fzi`9K8gENB67eo_eX=^_z=!(PU)u-X^_W46v!Y zrA9LCf~%`qMM&EeOZ)awD_->%k@9wYw|)^kfkaq*J}e0Muv+(_5+6Pb_^<;X9#`hK zZ*Q5UJl4Kfb}DzKT86Fv5Ahw@WQ^RmH;K;Y@c~vxsrw=FatyA<_+9l5_&-_q|A7JN z>mOWCFZi?aWkOQq4<{sTr_#B@SRRP(=+G@J$tU+ZCTWY6*E@`Czv&g(o@fuV%X4DF zTZXl=KbRwFN0j1@og;tpFi%oCckI>2L3j>}FBk9s)ri%~Uq!4w>Mvq-E3sOHt3}HE zjvb>m_HS|xBMvKtKYikf!o|j>(qWrz>X)QkT zgqzN{<7R8Xjqu;5jv*G~h((h!`I`2TKfWw!ee`&yEZEylwzUlr* z8ux|L;hW3XXQ=h$N4>?Xy?RdMn3z$1eoo}r&&u!DOpL798BK0Y?9|1X6wbUcJoo@$ z4P$;C=GA7N%XiP$`*Y{HeC~U-Uxq3rNUF3X$Gw`ePr+RZ?#7)HPmH49zxP}L?w0qn zsTO(Rb2T^|C>+L$z;fI@aCjJphjIATS&@&zUDH{Sk6lPX zfmE55UZIeOm|nC=%pNP2YuMum#oa!y&g$* z{x{Q>DL86Qb8t>iM-?Z&{a9Jn@lta*r^T71IY&en8CBZI(| zgTGun*{$0M-z935P4%|4W5I!UJPmO6+9nn8y|zWP5Ii&}IuZS}{NM*L|EFCu;y`E)Vd#ixh}hM9;`^2s_NYs|`- zUH>_?cqWe@OKW&2su7Dn*5L`6YD|PhnBAd|!|~h{A7LGE4<01(IVoaF`R$CveSbEZ z$kd-j6M0biF}d^IEnHUngZ|0HiFM=c64{?46_i_J#xj@7;QovVuNMBZXf>jir~WKj z&E&MGxevOBP|L;SqkbKJWcxl>`Te*KKctv$_>qSndCL5*aozf+SsnTAcv@LLT0Z{P zoH1I@xicbbla$xGCR<)pcJcQ)*=+XL3>6S9snZ_+?kzVa&qtPMBdLTpl)KGV8)>`e0v&5(O z)^;R-F}NOs>-~))V?~x+XcQT1(_NPf*V)4L+O@&9CBl22Yefh&TH9UL-Reh7vOt=Qrx}$z%{*ncMtOW>kT*jZSVKD zCs)c`HIv1oyYMYaIoQ3^y=(Ac4QcNj$f;3{qB!p9Em9oDJ&)^YKlY-?sU5i9f$J85 zoa&?J)KuN|$ro|0=WET2!JHBUw#cc&%HMiS>$sibWtnA?cyOr`y_I7W&xKDbpZ6#q zxS=Xq-B1-<+~itnjb|<)Nhiv4Hf|f0p`Ie#Q-nL=C!<%n?Ii%o(PB#3@Orn`tG#);VC&+t)LD45?{op) zTu99#0lq|JsJS@KC0fs)F4|hG2lnylB3yY=C5LNkpRVi6MyXpO!!V0IVX}2#n)QeD~{eR z{J36VLGOgYA3on(&GW9DX)n(#kG20?D%(fdiye}-8GRo5=CV;Not=j!KznuiN%^98 z$D3E8$!Iy{v#+@GN%R!-ZMxeUNP<+Ic0C^~LRZ;RYXu8`^C-x9O8-9XCsy~&D3fCn z5{%liklKM!J3iEFOCgNuoL>K-H{DZ#o}n(ohh;6S_F*s!rqC*-xKGE}7kVzNKka?6 z{%7wfwWLLuTB4Nq8J7LP6`?S4$-d&eA+TwH^idG$rvPI=t{4YM|lsW>R zi%RnYpKIv5ns_j&q-XH1F1Wd1^8E5$qb5ujtgaS+&#vA!Dxal@@C2*FrMo+cQdC|* zuOqI1sk>5Fv$XhdkKLBQLWbyx2z8?Wo; zTt%{1we)JGCyhDlfs-|K6&JfF+ZLBEXPvnc7nQhJchVRfcAOMl-pTH>%kSrU1J@h4 z{>({ZIM{Nsk?V)LyMmJ|rXZ5Uq?{E`$01XvtlZo$YFNCL5z8t@tb27oL`PGk`|&~d za+gglq&rMsePtIZv@yyv{gV6Jx!bPaeZxsHkry+FJ5H7ogD1LM9R==1Hm^4JM=7Qq z^Mq{NW-DsHILp74bN#wUu7TGmUF;pN&n33J5?f`pOSfm{iqCsjiNE!$WP5SBSUDaw zUGQhC%3R56k;Q6FpsMfS{vFDEd)$qE_4_~L{$bg|-Nsd70BGQPgVn3;K4EmkKb;VH z(?NIrws4&#T(3~J+k3`62a6{FOKuHiyp$9^rChR)O^o3oBPPnLJrMBa1>KiVl-v6E zclKN58=x{*iSlWh?V4=K6+=bM%{7yS;=7u(Dwu!bnXb&09y2&W%wet}U&;ufj1c;r zFv>Xhgec>OQfz7k@rWa4VwNF3|GF}flvQ&_HFtDK(<3EDk?ZwH-R{5Tx0SxBjJW0d zmA+dWm7xO$N7iv`oicwwoTabw$bf!{DbYOkMSHamkBi4XQTRuW7Z7-q^2LC}#4%hQ z!_|`G;&D%0-F3W(tBs0xK*z*6T%E(!Wyi&QTwL9JoNC9Tf4_n4olCj8H2Q+et1UQg zRE^cgMb)V6W_8%yg*M+<-g(+WIII&RDm zGmqEc>0G7lp!R)hxmp`7-pE887bPVU-0Qd~shn<8%B_xQhos#`J8QySlQLycd&>yr z?m?X`yOc);jqa4tiUGZqn9aV^AnK!NDc>}R`gmE<2K5Xot@waQ>_Jd01WTIKM`!6%0@ad2X%B-Tiiyf$|WrUG+YS+Hbxrkc;E ze8o99*|JVqKe$WcD%`JX<<*8Zh>R1V%xVxB_powsaQDP2u2yk1p}}|_7}+3lV2;vp zNT1d%Rt;b!(O9vbJf!{gQVfq;F-&KU895T&AabOCSJtQ9{fM&-7dBk%KW6k$7mkTk z+mv-fy0zZ@R+(!650ZJT5a%g-hV+^^2={|xL_R#P-yvf7v3`dqx#^A?cQ0F$nET6t zc=*?qrxt(f?qn0I>VYfD=%LBO{=Jgc$a?f2Tc9;2jy~)D|}S6Lez9G55vCU&WK0wG1%wFEd03t2cMhY{Gt6ZuHP!7hxLkVAf^q< z{9)~*Hql5$i1hZuxtyowX(^7qWSF&}Z)A#?y+= z18GH5;CVpIvg<6&gA`n6`96P(yCZ0){F?Y&gT}HKiF@v0oEjzwGz=J-;TrUhVgKqhAwVKV!Uo(%14tH?&6iVR-WF zbkd&Q+N-TRYP6GzqoSQ?UD9o3t^%WXmzfaZvJjU`jv6iGwWFeieA&g$Ke;xT8{%DZ3GPa8ce@^jjW8b5 z!+7gjNh_)B<;b*JBV;;p?VUx}_ySiPv04)RJQuBq5+kM)OpxLA})e1fF) z=!t%OnBnz8zPM#~q)eXZ4z;of9p<(vGmT7}yb+@|36ea%>bKBN`kHtgC| z+&*V(D+*>+v4cTRFBs*_4egz$I?pC2EV&t@rI^$NM|q}0tZ#_v<_NqSfp?E-VmK8A zze#i9-B+DuM~?eWQL}K7gNp|=V-5NRjbvz_bWX)ZuFX-tSd|J4|K{L&4zB;EiQE_d z6>61EoNw%G$N5N{M>!tXmsdpa3vs>>=Mywh6vFv^nkb4Doo%@8foq~ks#oA{1?~oE zqCp6Ew`!t66m%9#MbQn%=3N@c)7^hA z8LOG%MY*xZ%eQgQ_bT7_xrC*Nk}Bb*x4McQWMTs!8w%KK(6hZy5u|VHi`K4fpQSG1 z@o$mxZstMfoAKdg!{3yPlUbvfC5K^+rQz&FXdRWaHMuOO%n}t#K97i}I>b*Y>slsh za)g7$7iK8h;0Uq!Vol0Y*L)L=i3mvS_BeW3a@e=_OCGj*9-Wrs|5fV596}mrV*jY#|O?l-ovka&GBF z52CfbmT;#N?sW0?yB62A@uSqbonaV_Ru*#N=THFD6z-zY#uH#ZBlsU)@{1We}z}#avUxf zP&^9`iR`=|mrHSpX~V*6w(iBHlXrOGH8|~$Q(rX@PXB__Qk-I1N_gE?RrmC!@H$*3 z;nKG(E`k?Z)v9obX>G$Bx1Q0HGAO(emo4?A+)h%?;sVnyhe>V=b6rX67A{e-&$qco zWZV>-4C=siQ?ZPVyXUB`Wpox9J_mJ92aEQ0OHoWibZsu$T(nnOihI*K+so2pYT6l* z5^MEG6U_xN5BHc>9%geV)37D&`!E}UZ&v<0wu^IcVsCZ-Z!2fYjx4*_DADUgdQ4lY zX(4xET5*`&-CvLL`(bwOdi)y0Z$fIFln|uFs@H3cieo>EuM)_`);Ut^RwftLIZJRO zM|BTq?K%_(ohR5^&B;_tJ6P0GrT@4tea2t&`yJPN{&i_+*Pt6o`<6Ebk@AImhaLOZ zrQTfe?MQuSoaVH43{$NgCGGtpYfMLy5Z{p%1$c|a!H!#z>jy0klCUXJF3ZHF1)E70 zhP9K+#ICgo7p0gEL_b&$cz=K&n6}*F8#m~BEcy8HM55Rlxq_>h_OOMKVyd3EY;@)F zLy0#WeUQCUr_P!8nx2g%uP+#iM89}4)<{~rV&An)wStIMbQGJIrYij=bd1^oW7+^^ z@`Ua;b%_@*JBrGs)^Q2K{~5OhLeYxbO|ysPWUAHNQQff}Nm~?KR4%smrLSjm-+)-c z@W)8=Dj!bhJmb+o_;RsqkDk+8bFQ)J00rTSB{Qt)uZ)>9ESG#^CIusvih@ZH1(QTKh-nYAL?*^a zIv;(XS;*Qk!;>ya$S$)}n@?%zF*x3lh(IP(5l|Y}b zBv0(=Je)|cooI{+8EPG#)Fp_WuFE6x$gC!~N#`db#8%vR+{Y)1>q{a;|CS1;>inMw zu@!d&JVNLDBhuj+*oc4n#>2$(Lc#z78@>0Asu zU`*%7;d~g=c`>{c#&muVUISw~&xcE4Oy_&x9WbWzY$w8D1WXrhg&Sc^=P7VRl0}%# zH^B)orgJ8o24gx8gL7a^=l<{l7}L2ITm)k}JChMMAz-?Y2v@Oy|9DA&lv~3tk0d zI&XtF!I;kFa21T{ycw>CF`ZwBn_vufN=Mcs#9T|Qzt-nqHEe@1{f1(A5RB>kIGhV( zIxmLj!I;hu!b@RH=lQS;#&o_1-U4HG_TNfJW+PN1V7h}_;W`-8c?x_A#&o_3Zh|qL zGhu5N#^WwN9tPWBOuybA9t2}L_kt(DnB6Jbc{0Kr1Wb332rq;&onzruFs5@9yamQ| zw!qaert<|WSq@`5pMjfTOy}cpjEx+(S)96{BBUT-Iv<2bz?jZ^;cOVwc^B+}F`c); z`7ow)IlL6cblwcFf-#+6hd05SY)+rB9-$He(;cja55t(w#c&gh>HIjHkW4d7_VHpk z9me$Q55jpcrt^GwA&lvK54;Lq<@5`)5y}uS-NCJJ6^!XT1+IlLoo|90U`*#s_$-X+ zJPfvWrA~D9aep`g#`NpG;8fVjA6-aB7=eK4oCxQ_n9i~ATo}_i3SIHqPVq+&+w zpMo)+=fe>xBp}7d_rOU`ge1Q(8(|QP={MX8XTzAzQ(y;->3kEs0LFCAgqOjX&comm z7}L2wTn1x0_kx|(2$(J;Bh9GXmO!Nt20aArfG}tQ zR0mL0yRUpPi8&nTrP$DFyT7*IEpm+#_T0yB021P(4APl^N5C&C4^$-Sq3Q4_)XfHt@K}iq>eE_9F z7*q<4fH27UI+zV&;7gDL!k`zR1rP?UfR;fR^c1uK!k|Z?Ef5Adp-KpY7D6=;2F-^K zLm2dT;j{t7z&oIb-gFVY1R}Nv{lIU&@u>v7C|Kt2K^h_0%6cU zpdC(dhmLoHharrM4(Kd|LAOHIzVr}%1xF{MErdaTf$AX)nhrHW7&IA*u@h0dpb1b4gh83m7zl%gLvtVu z8VD6ag?4@XO9M+ljEmi&QV4^tg(@Hn>IhXs7$if7AqXa|Hr+o3uLgDRkl5C**m zr3@gS2I%A8TVMu=aq%^17KA}Ar~tyC)ldn9LCc{E2!o!4_Cpv{2sJ_&^j|1uAjLFL z&;w8!go*L*pI{D%ad9rR0K%Zz&@u>vWifsv!&-3pGF(bORJIh@u!I zXeeZZFvw{KM}QdE3(A8qs4KJp!k|vj3J8PZp;8EgT0_+k2DN}1APn**llsA=ez2e> z$PQu987G(xV&DmAE`&iER0v_vVaNqx&;e)*gh5|IH4p~vgib*iR0&y!(02|IR1T#; z81zmu<6j1dfg8Cv3&NlhXd#3_FG8yz40;YKgD~hBs20MYrBD-uL5rdIp^S|~1^oxI zLm2e0WX8W75Ci9NF(1O9JE0;7gZ>JYLKrjy+7Dq+4s;g6pqrrhbOKBlGzuC7VbJwZ zE`&jYAm=;~1N(x75C-*tTo49zfyy8ZN`Ur57!(UNLKqYc#SEjghY1RYQXvewXrrz{ z7<3NGbAov~o(A(FjEl#hr4R_l?}d`-)AI!|a4EBq0-kC-5?XEccw z{scHd=kzAA!k-4G>1=NjEBqO7hR&%?Vue2!&ehr0#0o!CV1&84kkBMn_!q&8be5aM z3V#t?q_ee2tnin>B|1w@Vuim9F4MW`SMv&gYsvqHpZET}QpVNA30^JNEA|J7?FSEf zDHUyUbSqwk2EO>g3xr5sAViAS^ioT{6BwQaMPqE#`JcQpNK>{KZQ;!~g}3IAq!*d~ z{zgf>vzs$mkW6$AG11{AvM7+Q6vxE>6B|>c)?zbFje9!peT)2qtWli< zig+(>ze&Qpns(VpgjG+(>S(sXX!Cd(ribjT@qNe6_cBtv)s14KE}JATTVs5|b}|J^ z{f?o2$N0Y5K9wCc;^+cj5=2e(eG*#}Ym8dVzND~#8}UuKy7FZGeOGdV_@oTKtLw<@ zo9J9_5|v*xnj8p&M5D=rFi12S2ZTYQ(aeSBDy#46<}4$%Wj7f$lm3w_816)aT?k>2 zXs`tk28jl{6v7}8_9_U2MA#c33=(0NLKqYXTPLc9(_bkpq;yLRRUn2<%LO!+0+B0* zvS=~2b#YEb? zak}P=*0a1Gu^utr~Y#m;!?z=h{+}`V>N-SmOWif+QR2~UHZK2>1NV)pzT0QF==aFAR#Zvp6({C z0j&Y8hfj0r*YeZ{A>u=IVxTvfy z*)zbT6`~cQ4Ro5sYQ$>9K_)F>Jtk-~v%Sg=^;c!j2$SYQbD@niX|~sJ_nPdv z!K4+U6{5AW1dFr!HOZ+~Bi?9oIA#Oiq}U*PGE7<-S{YiVNlSU1O^~n4o>3;P2(1Wh zv`MqRK|Ojy_KY!U^U&s@jg{ESVRW)v5Vs(XGdWDyNcL}(J>yN91I>Xp!KBrq)uP>G z(lR#DayH4HER(hYZ3EgwLvxb-@|#q+H)T(@A)@7@<)htf()Oe6N1J5QlHOt;$y>5# zvPnyMo1A%D_T-o}7n%!gib-QXqUtOwl|55U;-Jm!``9ddZZT?XT*%btIkG~0fPX}|1QVA2*IAdmyH=ier+8m$`b0h3nsHItLCWzYYaw559};yq5; zv(O~YtD$44kv$KZv`Vx}wEvj2lD+i(du7i4${#aWIQ%GY$A{*0x2+QW&5bX`()2zlNR$8UnclU_AD`J)o9gd51X`k zgfWjW3Qd~R{w=fpZ)MLTCb0mm0PRteHs%nqJ|ue{GifW(R-i34X`8<17>e&@&*LVo z5v>vJ36oa;1Fhr-+39)GB&OCeV%5o>WhO0K<;#$&?0L$h6`>WOJ#EtDBeeG;vga9- zmW!5)R%FulqwPm4);0h9FF_;wHQBS=TiCVQSWX(bKR zj|SQEoJq?&&Uey|%bt}ct-^^|fw;;frktSvJ|TNno3v$U%g~-TX-#NNXfK$wMJI{$ zN!hc;r0qc4f%c+Ft3E~jI7NM1YZ6^Q(j)ySd)Aq>!qbe~r)7`Jq@|#xpshD)W9X#D z&`G^y(n`=u&|WraRoq*}y(K=)H~*XP6T1d~l0C1O94Z&`zPfZ_+sNSk0AW&j)@@pa1dYSH3eVd&*1>B?|+QMfQ}Nv;wpOw5=ws z2CW7y#x$>+6Gje($sV`K-O_Nn+i=-aVbbzjGXKkODSJLNiM1`6N}+vZ(vqxntybCd zu}Rav6pdDC(&}(mhqle6IikqbDB1IgN%MUzSoUl;&;JHRGulPVo*gEKJJ5EZeQMHt z-z}9rpP97O7&@*P*|XE69Y#BhR%OysT2t<=WzQ}{6Z1a@q62ZaA)@)d{Uv)oH)*M4 zYbx1VZPMnop-*okd%iGf8_+hOeQDCpqMb$CBjI-}6*AU0VWIqGPmRf8J{R+2WzSxd zR)bc9w$G&bmI`IhS0-&yJDONK*|XoI)uGj)9WZGrapXdr?D^U}|0_f+MEu6&@D$o9 zv|5vv$JaLU;$_c4lePwJ4cfORt)e}Zy1ncOnaZbJMnATlLS zU@%FLJ>Q$OJhVKtA52;WS_N92Ny|=Tz)F-os!6N8hDv>n>^Wl6k~&eTotqOp-lEO_~GEf#xx3m1vb{$4pv8XZniHvZukM<)P)F9Y+hy|8{htrgxD& zCrl3K^q?L0kUb|&n%t9|=_z|onY3A{JRPUXo*zw`3(bXg+N72C;vuz{?D;9EIn|8b zJSO#)J&i$8ZR*3w)<^c7F=;~)=Vy}^(U;Wql|8?hH0uza_lC%xvnDMUEf?*a zNh@qieQWEKJ?Bm0qM>B}P}%dVNvlMwL~Al>wsa<=>9Xg7Nt=T<2kkeLwgYVk+V3XK zI*bSolRX!OX3YPVA}&R|WO7)IR*iPqq-77Mat)U~UXxaYR)i**x?uTwis^dUV=-yD zXt`)%Ce69vNmjX@ls(}laX$|C<1oUcC5&K(G(z@7nzZ*Z1!xPv(RRtwJ~W)qi7|gWKUa@ zR)M<;+{q@*fjbB8Vs-5{-_uVCVhLh9lf$#4=`u&NP-xQ9$B>dStP`3vc^p|ij&(wl zR)SWdoLtn?v`Qabb@ytEkC|V$>}P#=|4ov%`=s%@g){l|Bjv;^g#H{UCuyHt_P;;S zzpg7zJ2V!}#j6}%1GVEdP`gp8HH+^UWi`1POD*qRUNRVw@O_JrcRS}-=Hy$hQ6m1gb@Yn!O)f)!`aDN3o4$c4X^;37cIsxa zQ#WgreJkNNo=9Jx+9poUP&2Y<>x#wM=^mADI~rdjA>lv!eB#|O_s!xyNxSQ$%kAQ; zpTlG$ZX%&Z+*r`Zr6bFC-&EYcbHZ>pwRrfkik)T+7MG zvA-5@V2t=WRl@m#^5XKB(A-M7GugQa9~Wg!<;pjl!N@6KC&Za~=`r0y#z4HB`tW>) zx|B36^~YlrMG%H%arDJ%{U|h%(;sn487J>uinED)5QmO$;GPXx;>3?fIs7br{TaS* zy3xt$XOcF8j4@t@h-BPw^wQ<@dh!2xqXuxgbJ-Q8Z)A#5Fl)~R>sqj8lu7 zS>c$ke#DV+myY}HZyVpvtKAqljBSph6?AXsi;B5cDAz2`;)IMl7k9J7DUUDi*X_?v zjCe#4kJ@q3YOQi;ardOFyQ@2^*f({Et({xI7w7nb@0l8RjLoY#l+jB<#^66o(qb<+ zx;P)alEV>e%Gm&+^-w+t?fCSP)Vn@wtZ|Rx4Da-qPJB1%+?zpQ$0-yhzum4w=(0A?#+bL zm2mR@e}t1uIJpy_ARO&yBXqB}?X>X<)1&;n9?+K|j^GTlp&7qsh(G=eK?q zM|FBRCGoLGhea-+&=)A5J~}dLE}!O7QBsvwkM)bxGflbiu};Z#)urw~R+ryhrRAc^ z*s_^HC=Wf>-84c3+v=d~Fm+J2=*4a7jwt(Py)UQ3`L8FKxQ~An-BNs0tESk-eS% zxUsa9U;Yq@6CKgzqrt>w{AiTioeE$53RR`sJZ`tVquluT&7m%?eLU6j4`t`$13TA~ z(e>G!X>h@ajcDtUdRt$vbbO*`sM~X%NTYZA?-R-WeaR8G^pV$>^9@LAPu`aMRFSOp z<-z=HBtILKJx{cc^HqP&!#rgqW2W-!6MaJkHRQ?Eo-duMbYH6<_^sYc$H4gmJf+>t zQ`*g5?R4O=y_7h*K^kMRV$sEc;mGhwnl`7ZHN z|N1)%uG$4nxS7rHHy@#8z4MbOpLP;|^pns0TO8g~GM6O}HuA~X&bIipiA%U?d@aHXB1mrjpK zOt^Yqy@22rDD$5h*i1uj^OLWkuT^$FWo)zvm57t4#mOMz+rEYPT1X;X%o#T8hf{od zqLdah{k-_L?;5VI;cD>-<3x=2PgHVs{CQ3fm@CD+K{MUNi2<9cM7i|2qS3N>#pq18 zP!wBk?#*cM_-Ui5u)Cm&-33*AyZt())n# zhw=UJ&0WD(=($yLn*UbQi}-F;f@3_7(^{N27X zLoJQuQ7>|oTKG&Dmg(SUFXo&n6|=70d!?AN=Ub&M#elwCBX%F1U3JA-<3f;gICHoIyHaa)Mn0vbn= z`~GC}-C|lcW)f?dllUDO{g^g!!bmm8v~hO(IVoAv7Os@^ld$ICY7VYe=!do0a8=G> zZJbGTP9(nX$}Id{r!axq1fW0a(QxQPAotCz`kYDx@gk!@`o7?d_5os z3+iXIiGYhZqfOG1nLz#dUXFrkWi$>^UzU;ZKe}?ZD>jOVy(t8>YLcX#RfC%Ed4Z!A zeiX;;eDz!-o%IT$x#CdA;y-&ATg<7ZlQ`9Ml2TqkgvD^tmQLHNwbM_46Hy+@32>5D zbyoMsiAU{1dKAVf4jkzAn>ht(q`((=T!?!_Zc)>)QECm5sF`Hsn4~=!B1!)yNy8-V z@6SDE*Bx=mBCz6F_YQWIa!L++W#qC%3I5m zI=a3t;@6DC5rYMcM9bRw{Z`cFH#RdcJ`Y%^V|^%T3)7?7qbUnzq}`#SGXUFzYJ#w667Z!L)V>`E~; zji#LRcC1WX(I?b+x^zWqw+qJ{?j;m{9}@ilbt_l^V<`aN?O&}hKb)7AZ{svst3B9B zjHY7@$HuE8Cbz`wRC(hkluFH&e_D zh?Xek2<7+Zl0y~Gbt_Y%Hh6sV?fuGaE1R2dclCSrjt~WOB8Rjp4A-p z#f+!QRUtilU{y*~gx@o}@^WZLU$07=QggJ_J%HI-dQ8`=jAIovpo+;|)rpd%^*bJ{ zDXothO=tiI$T3njM%uhug>uX4kX5;8wcRpb*|yr4f?WA*Xb$AlhF~Bs*NaJp7_O^0 z^o)XU9BOlwZ>FH%`Y=%ZidVboBk>FxQ0U#d$>XVqEwOQ`HKzskQu({({6dj($MbQ4 zIqf|C$Ti`AvGVxyeVVDGk2VDBs7pEYe8@T)|3a$s-FlaMGxC z5m{d=G9o;N2#?7TKc{5=RYHE4!HKsVYc^ZsSdE zUs66^*Ic3+j|LNUSZV2ME)Kg*ZucvD94(0JImy@Q0ce6 zx%dt-x&6EHP_u4jliS;so$Euc!dzaTYPmt_`BFcptt`+ZT`}{zMivjn#*2{bcPZbz+$CyyU8&wY8P;Alo~}d9mufUl(>!IKi9Pfef4Y@vCDT%k$7JKV zyv@~~toN0q-1PMi`R>KGn(~5}e=@T9zIGsHF!7L!$+3%P7|yoiQwh&D;&gFC7p`uR zYs&q1DL1|{)M?z|`ze*D{=%Xcd10F}*>0gA)bB-ciKC%g{2+>Jd{%8_U_xT&s&(5SIf!Muclf)Q#!sjHdJZ<hyOm-O)A5p3sh3 zyq*?S_Fbj!s9w4L_3oXnK25hPZC~#c+hdxqqhI2`>n-KA*F%Q?{p;ybPK-N^|SUoXF~k(a z4&|YZA#?w&jj5u+ZX6k^tb1%qjp|Kk;$_BkWyYqEseXD>TGZJ?m3m{hDcd)N4CXwJ zD*cX5DSh4y>FBR-rbHDT@=dKPlqW+w`smHnsJ|Za<-illPj5Dt1GV1=Gx;uM=vyH} z{rg)f&ges>?!Vc#(Lqn3{Z63$-uA6{CKBzp;M*G7Z!AA**Edg!8N)M&SNq3jfv)+A zPTt=M>wWONDST6K$^h1arhFglgZq7Jbn?01ieBUB(M~pRS8c>+d>{GG9kIUBzJe&N zQ2M>yKd+hUOiJr`Yzg~Jd~YiKidPt=M5I)Y$gkf8BXZ!NF&O-IP$_#mB~BWq0okDQ4mo4`;rNI`irOJENqjd>wFV78$kF z6u-L;>KSFH1fD!7awKTC_tz`yTQZDsk_GtgYkTN$Hss2+BoJE`qu*5Y%!#sBQ!`Oeub+xu72P2h~COhVM9E zy=u)lT*e!7N$Wi_P?W|mp7FaIp_jRhRn>8aS)iLH#r%b;5j?oDcY;@oeNC+OkGH!R zNiV!=b;fiK)E@DaxR-qN&6Omr$@Cm?_#317SZYP3Sgy68Qmo$;&fl$@f)Nyp1L6gO zZ_c#qRclPr75y(71JNRLZ zPpmPqvd=G8KGTT&DE08vFf6#1=-Fc=idT7oblj}Oz8CW8eA0WVQO|wj>)k(5obQFK z+V8)YYPntc;XR{PN0P`m zPM)s3dgd&+g?AjcT#-47^Zn2fd_UE4MET+Uj>)~Z)wzG+4Ogh#F2chirQ-*KLv?e1 z{UCMN(_h!P)ATp&qCh{qMWVupx9M^-o^HU?4a&!%J#A5z8Z{hG#n{Q%Qx-Dv|G-fT zzayq-WyZ_YP(9cG4tllp5-Fy)T%dOPz&=^h{&tL?l0iuhRJ|(~SSoMfE8w?uRYysj z$9ynYH##0L8qtUYq7i*j7pQh)sJo)&7)>*}&tBV zuBlQ?FXr+5lt`$z?sis*%qzvS@O)NoG-J;bCa>oP((;s2yfx%<$?mPGQMLPh#midZ z){qGv;I>D(_Lu5YqiW?|cXMln*VOt8L3!KV@lQ`ZEw0khDyQ8kQ4`1s@%n#((y5}k zAU^rVH@Hky{#Frka9LiF5_SG7pJ!c_kDK)@-|v~Egnt;)vmqa*+)?sXrTcnHWVUkeN6qc?S@pHP&!;HMHxWOz&v#pb^3_Kn zD@n}9sm>4fN$xn_z8#+|#k7nS+qHZ;Ui6kcO?@ni5D_cD!kHBFEa42Phg zS*NulfPd^ZRDQH6G_N*Uzfn9WEvRWE@W{jbBC7JmC(TVg=kE74 z$|fald&ovPZhK14HG!aN2&#sle%vGCD1vII2letHUR^82+nWojg+Hk0ly5=@6}=hp+(CaJ$rB3II z4$8V69sTu0bZ&~Na~m-|OdT=3fMp(I>(JSqK|hD=G1~fVdrI;1)VB}NxxfCBbk)~2 z3#W6+!}PA|BJ*ECBJ9=!>nO>U_#7Ek9b!#o&BSx zNS*r9XoInPL>qkR+cYAz`n@_{<^H)RFY+h0ub8GblG?`UnyD-QpULCOFO7)EU(IN{Q0`le`kAV!3@5eG=mq9Uy9$v5tY2xmjz_>)`L7G-Nm-fcmG&qM%p;7 zgSc&&(T=!TOmX|+3-O*^#4X~>B7A!G;9Pcg_|9o5cI|Wd#-Z2b-fEe5rSj>{P8rqs zQ$2%UBx5t%eV=8h^~9-uhJJmf*b=<)3sKue+-klMwSD$Mac#y-297)ijy%OymEFk~ z0KcZ;C@S4sDt2;pr#I47<*};%{E#YJ)|C&dI>-84E_Z$98qf8Xs3)tswXS*7+WH-e z#OJQlu6|cUtL#&nS02qPueZ8}-$xbEI$v!pNObx_)Xhz`;+iR1PwX;BOWr(%r>;6v zw9f1@qSbS^5v_LXZ&~k;*2>uKY^JOEI!0NrJ0a8q#M<4dnWu?FZ>Bo7EGgz%hQ8pj zGUAsqa)>g<4=zdk_(vVf%>MePG>Ro>QTvpZpZDVTvipDD#ncmt2PM}R!T!jR7p6M$ zeEo*ln*QnzqZaUU!k-&0sdaTD*|7E-W0+p|`PF`{S3Eqh*{O=nPE{OKODV3&yPtdK z<8L)_uFf;|XEAmAT+~b}rN94kQ8Vx4H*_5CyOZa$gYeJ41w4wM+%@?=3h!(1zDDl`hqPh;zy-yE%ul!$i=kZ2VFXGol-7h(WUz0u;6;=54ug^tAjnMsS z5%g>2Qz@22r#bDZw{is8ts?E;Z~t@Jlh`D>S@$sW^HSXG`&y)Zzl{Z{jdIL(IdmS} zeq|nz1$l&$r-!m}I~(Kvn8n9;i~d@~yUpj71hY;LX1y)6_b>g)`$D`g)V*I6A`x46 zi*_P>|6#XiC(eA``}?or{gQdH#Z&#gggK|S5XcrikgO1aEZr?8BO;JDch?cf4SEDJ3q%mg;zydGR2GOgN5G2Pk!XuOz{XL1(X%y$^(?Oz5PhOybqW?I*X z&~sCCuf6o#+l!^DHnMNYw?$HnZSCn2edK#&AH!{9 zxa-?pMiRZdl(+VD2-Vwsy(h()OGU{RkI`Dohee^X>WB{u@nO9lZYtq^woByyj02MP zuklh$-#{aJ8%^jo9Y=pP|wx*{3M z;=S#CKh&+fuy<@T5p1kBN3i9-kP#fWFJ*Spt{V4nma8Of&tg%Y8EP33EF*&VREd%j z`TTU1sEl2R;PpgMOtyW!y;sX5f^k>mbL`7vvJ}MuU`FnIzOT965O-Y>(N155jOfg- zQf4o&G9o(GAJM}^^e_?qVW$z%2tA_De#NhpkG(RYAN>Buh)(%aM1T0IxriSA+?=ER z_V*7}bMN1uIyR!p!7JL$<)4t3(rtW4`!%r!0yN#WHw{=x-V+D_wz-~m~sqiCVqe2{m1zA`=(c@Z2$W=sbiOZR=^G=@r50Ba}&Qc z#IKfjDZVOv=~GdKpWe%ypI=w(X^LOz1u3RWAb#I`)6+kH3$N|fOw@Mo`eW2))P{`O z^4ip~XFm-_t&*r!616dbsNJJS?YA09>+pxDC0!9UZ>Kl_#=D z$vhP2&%LqV_Uv`_iuXoU(;W*vm%T={d-mIqt4m*g+hgK4JIoP`nZ?&nXYpOKKm;f1 z5j?zywxV+-U;UvJ=gm7x-E)$~%N9FP zvlF$o+l{8aeYDUN$gs4SOTU%9(pbQH$uoI8teNzLLRx5Ci8+P}9O zP5b%nqLua8(=FLw4q16@4kewPVwq5tSnZYcz3mgl3*0YW79(9`awWeXHd8+H|IzmK z0Z|s)|2vN?EV#&`D3BnlV1kOS_=ax@sEH_v_=az}3JNMFTKR6EQc_y7EjFmApp>Mj z;7g!jQBisO(v3>fu5@GXno?Pz*-Z`H-{(BfKD%Hm_x}F4e=N+*GcRY(oO9;PnKLsE zXFI&gdD`~H_(dH_4S0|nf3E9l4Y_~o+x@Sa@4@9X!`n-a|JL6@F0EIOD z{%#<1HtzpcGw`&s9qH6MpUIkd)nrwYW^y|`FE`~h$W5K*qfp$E=MUvq2dy);(e!O+ z>yql>wTr6_7#`Y_d579dPd(&lo*EHR!w~PLk zPF2OAj$%;9OXuv=ap8U9RnpRaexG>th0na8rO6ZYq2K9&aqOZTQt3zma>fgFII(2> z^ShpHbfWensS{4dG4&2RvARAe-RXn;id4*V5vF={q8^=?{yr)9q%o|2AH;5M{~2sa zqZR5Ya2UnwvAZ9=zHdUun&y%_*JLbzC1$XgL*FM>qOQfiPpo9FA(PC~-St?h)IW*d zw6?C7v@k&V%@a(1^IDo@-m`I;#msCtd)zqR6w(GJ{H&PhW;|+gh>3rif_lXP&d0=^ z@wj;kQ`|i0s8zB6{kVz-Wo8Ywu#F-AYRiy!u3AERjB&-k95!|EUqQWo!JeYjR4STE zMN^|~O(ls<{r-P=57+o}n@uHHn}UOl*;vZJ&g0O4IG>WfV1Y&+rRT`Y!+h}?hAc!<^|vIgC)2Sp~86@go+R>Oq{K3oIUT(g!+vzqhh+HJk06kj0 zmkjf|iZ&$dwUQMwUi@Z1ei-z0J5!MH>UG~yHWGhVwqM4-ODtpl+bY;ESDxL1(m%h| zc&@QrrS5^94S6>@lCJBC*nB?r=qEW+Uls|X4z9IwSv@;A~ zm7=vss>QhFMi1Y1MN;K~Eh^7M<(bCwH@e!K1uD+V!lmB$(+!8ZdGCh4>~Z7FhMuF# zpT@%BX*#d4^ivrVWFqOTX@t)=Y_f;*F|5*1r`d)&Lmp})UcqU@b2;sOW5o6@t|^11 zt*L5b*B^XG)S}7Sr!8iWRt24-N_TtsjD2m!6kMA2#(L z9P)?TkHN0t$V8-{WE}BhTY#5Ty?*R5&$k9ia0}-pN3wp#!#_H#`X4{`b^CjzHC6L&v2je+mxSgIry$8t+XY;wBLBV}&euJSrPO4f&sl4E$4DPGnA1WOkN>&+EqT zesTy_$D6@ykZ}Z_6Yw>zyg4w$Qjt;73loiIKAdOg(`pAhCAP+&!y!-Xl%R3!l-wNQ zNN0cS=e_~QD@rONfx>@$0%e6fLiGZsfZxJpv)-bg=k=91D&BAoH$BKMvXAo0G5+#% zaLAJtcCO$k_UmSLI)h|J=&K1%oF?<$&X=}$h<6Tm- z;6-6HJFcwDuR*;|pR);Vz>^Ails0&Ji||x@WHEnXT<~jK^Fud0OioR~h4a_8hO_Cs zyfm?x;Xn9mTaK4k&WnzhwF4yL>OxWZc{65RHFt40iqctW=?3 zv^dTbc5Bdp{b$oE0<@EL3z9V=6-0ps23aA>#y3xG2CB)%MH2aE2?3apZaHl6(_32a z9UrwMr8kGjq{MEA{P#Ww@wbCqyP!S7MU*l9c3TvXT`5rjJVS4Hw>IHubLW{#JC`+8 z8`ZyQ10>RRlsTr-Vy-hz{LSAH=dAzjX|~At&2N3!WTWyy9T zdgFtygXnzM;X8pIH_IsgUXZ-f`sPkAk1xcuLR*^0@1Y*2#I%=eX%l}B@!(?GQd`>A z-+Os%6w@Z#($1pn(_-2HTiWlxhxCdP(>f!~ezK2_2qx_;sd&G|5y5f)?$h2^%zHBs zYNK((zk4!fEckbS_Ji?@fA?Wu8JqF`Lw#9~eD4_N|IxGkPBFd^@h6Qt z|LDoq7|;CCA9rYckH6!Mo$vNx1B{XQ+ts)nf0f4Fcl)S+JwtVT(8FSG+H0)6+k;&( z{&sh0_ewE&XAj9;@4X$i=}R`F8YkZC)BX)H*Af&SZ`^z@kfj^nyw`^d(TB1MydDOl<1!qB>2$UNwHv+{swn)Y0SiDT;ptshb5kl4bm?X`t;CwHE6W zJF16Zdr3O3t1;;CMLK*OZ_pTM_f9^FY(GkQH(6sn_8e#Xj_16?dcZ<1=cm#vo_6=d zQ@A)@FeSglnBE*ny=d;mQjP!D+=tCD{?XhgAVP$+6Clk4qMwamWV;6rssH$cAlHVI5^s7LuRdstHy6GmiOk!^0E!KmV~#q3}tZ$5=nH|U?1|Im)bvLSq^6ANIE z^O;UeK2=Iebh@Vosyv-;AB4<<^tgQK1npMRx&9YVK+QLI0iY5>s2RDd6voRY*vng4 zp~u3)V!pWzd+k{n=M3jE$_?cYA0}RS_F4NGXTh|C|LMdAw(#qn{im3$ zyQ2&8a>R06-jfeHkqxNMoSUK5p6w2MwMrEP==FeJ514;CPRlWZUUMQJ`3lZq$M~un zezadCOE2wNjWNHxG`-w52F58R{ZOIBys}EhDxrs}UW=;N>bv9H`Qx-kqssqvyabg$ zYpYyBjU*bamA9(9Wt}Bh&q)a7eVtjiiB{SHaFPI}cFDEE7Bde-J2Hi7;J>=_tnI6j zHsm{DQ%uawcR90wbSbN+q5iB&b)%Eqf619G&Xld!;FlG)?i@L@C$XX(2WoI zdI7(IXCts!jT6UB(5)<|TOR_C6PFVTqK^}oe}ipBrYEm0=}39SOO~OQ#y4h4;+?Qp){Mb`l<;?)DKJ>_d$m?NKK{;mrPQi_*C@Ea~Hv<(}}*QJsq zTg->5980pLDo8T7s};Ce0Js-0aF6tv2~%ZphXT z*+|u#%_qAt`Q98yvZ4syCUkcYX~9Ea7_*C^$-S+V%a6ISQGd~NA9WIrcWlps*=ata zJqvZ+S1c*(f8#6L+hmU;FuIf|%*R7u(gxE70Xsp!&ZkFZ1Lm(s>oFD?Fqz0k$hW>z zs0Tv%%P`4%!bIb}TbWB_34)6W7vN&T1&{TEvrpv-d$N3qPE?7U29@F{4G9?t&+tff zn=l_oRdWIBT)?{62J3baR==|U54gxb$^lpnVp>N91R=)82G<<^JK$<#qjuT}`)ci9 ze6&03-iBhNJ7F<@z|-BCBh82(cV|H>QjS((Nv$yN309~F!w<(|{w71E*0sVl3>M|(GXeFxUBjh^f{ZZUV` zpLAgU)&;&JI(z2$-NafLCS>Ep{dc&=gK4d^k)smPC{Yi;)T(5xlV7$8bBJttVs7mn zUx@w{E+A(J<#Bue%x}y6Qyn3>vir;b_Pj+sLOiYC04dq5We)CG{)n1gnZUVK}&@*Uwb zHOxPKLzY~;wO4dYSJ*qK=#JRC)yM2rO?zA3PFnXiajM&yv08Fs8?Vy?Yrp*$^#W^S zt!RsBQE{*hZLx0?+WvXkNBiMfvdaJUK1LBMe5faDYcHkmF==9`h7f_m5tzZ~DiF;Sq=1N~*9{s)a5AWviT2Xqmqh>d80;(cN?b z`ks@x*>tMa*9gd@FV4=?^#HAvZ?ctZ#i9K)|2n%0w}wi!xcEew)C&dtwp2I|$C6Uo z4ajIArnC#;6tQs2+1n-L-nQ+4o!I~Omdwh(@XtFlNBg+ktqbc*dUqEVC|wQ7=XYVg zR+&vo-e&YjvT%<6E5!Uj7v`NV0T@={Y=ckN0=}_;Z|uS_z(=0{xA)uO8}ydUjI-V% zX8f@E;+dc(? zOp)0U^}Xc-;{WkYiRZfT%gENoM396!>9}y-+DAK;r(jf47D@*x9)H_DCQdeVguF>| z>|BWx`0Z47J?<`OF%6in^EJMXCxSh`EGT`|n^@ssA}H*kQ18M-aC#x$B8PIBDCa#7oWquzDem!R@mHS5PQ#7=2ub$;3RfBpJYY{k5C+O9}6wnmg8h z?k}=ewXsm1Qwj=eQB_z;6sq!n5pz>3bwMr>X^Ke1U9pMxF*mJmQBOjlOv9TBiH19r zbkmlc?FFc^VTR0ZtT^@8DFEvgD@M5au{I}x8AXy@y3U7obxavcyFz-t0w8D-c!$Ft z;*fwoMYf@{(PwgE-qD?$m`Oc4@G@LnU&cerj{q_w5pL_erypzUI?B_BB_K2S20zEG zANK>04TmHkz4%pRYh%h-Xsz!y5AbK*2TH=#k-`%pX2dG37JdY^@;;%(oW-9-L5FEBKE<~!C>bk-iK~9bg!HW&&q?ctk{2$n4|ykm$CD0^|9ca zyD_Wl2)TR6!S}l{t7{4W)*ifP&)^%t(ygL*UjUoXPwFpj2|uSRmn`6-JS|Q-@X#PztrLP+*AOX3Cx`AhTf|yq zB7*07fP8eK;49l1h4VPAWLO?@3+iqi z#!q^(q3JKAKU!#JfpoHxW?_sc@Fd_M`z2}k^391vLVO^pcMdJ>ErmcDjhYK zJr6D>38srl_5)pYZ`k>u8v*7lGQt?%vlo-^ZEVS26pbEw;Qa=yA-~jdM9Tfl^ zPY^7^69kJ^0r%e&*ugE^Cr^BJ`)bkb^0y=ZBkuR@qwyl#f3T0nYwFv$;vqv8N3GXj zk7@eIjp6xvfRMdtJwV890mABivKZaVpAT-+V3kuK%`G!{1un32B+`EghPrWKUsXjS zX14o}DbzEeux8-3XS(f4CZnu}uEmzW!0N5LpKOP>3h-7f!d=q4_-w-F=Mh!Og{7ISGIG>HM-WHDdg)L20WogZ5Ci8H=>F%0>Od1VOGwV}NIm~UUj z_j~bCIF`YSGzBll$(F_BJ$5)>PK8xGPe$>PJmQuSMXl5~zO1)nlU8eVHStdH!Ty zZ0lJ2+p2HbJ4Im*QrOUCyCbIEBX+QO zd?~L z^ZPxN^^NZE*+-U*$-PZAcn^mB;llRN_7P>B$(#GJ5k1d{Sr;Sg4rJYdtk?dKvI=`h zWumOT_`LqCXL`1nHL`ncxdKvVf+;`Q6~9@!5!Y`ws~{N)Q9)s{CT#eP+s$y~L#!xy z*tOeurQ@^RvKQX%-T9!It#3-rM4D>Q|C(evm>IhN(KmivL#}Jxl6#oq6}X(W<+^CM z?3VX2574pS93GwsPl0JUWu{I5i+qZSRo=8x@0PiA0G}{`^|9)r>jtpF)9sAd5#;z> z3hr%5k;dhdTw*Lb0Ch8$7;96ZC;Fa^9NE?!@8rrHay6GYB(=~=J-l5Q3-y&^}2wX4^X% zmMdduW^M_9X*eXeNd`!9Goe6o!0OaR2D9ftHj^3orh#nY9I1KAOBX82ZC*i}S6a2X ztVNs0xGa0VM``fy=elirbv@5aL=Wap7xyW+Y4oaVh zat$6Tn5;EG@0JGQ&w|kh?*hLAO4lArqX#+Cb>5)Z--p|)9t|3>4lH!tK}+yV$P%oH zgJqNrKQsnlwZjivxd3rc3lInQwAW(`VV)q5R=G~>ir|p5ObZ?=?LDX!lTgtlpzcF{ zX)p`4KJ`FDC6~jyO-pbQ%#z^+3Uk6vITc>9Z^#t-9uFPDyxZ8Rcy|x!A=Y!heAy7k z#>az0SWur|-l(crVZ%eDsSs@!0t=1dcF3(EerpKpnl5z?&b-K2xg^ST0cg8`0xpl+ z3k+&ep`5P{`Rb7GyC8c$Ep$0Mt;$`+S_T;-qKEg93IcsepV((F!Beb;wM^>yUmwOyZn zx1=dH^1xw^>zgqQTbnt%o5&BXD>pS%>o=JJqwiQDwJ|$LsZCSB0&|tkAwR2rFG z1$2D27x!1WE7Zxb%V#`f{%&cJuLS~YmnqCAvh3))wNq9eyJXj*uETrB!u+i;!{JYw zhep=6HV?GiqSd5=E>rhlCGewduEw(fJLM7inSU{cb@FwzmJUjV5rsF8amq; zPclF6v3o_`)_RCxp4vM4-0&nD_TM|?+y{x^I$wL?0hFfHcEd^3gxZ zM~`P+T?>(gSge*Oj<@ZEk;Zp7F&oysjEZ4z#+b5e-SC4qqG}*^bnN$&s(hf60nzyB z6r%G-F=F^37XGHJslpzc3hQ*Lq(Tco`!g@eqYTRklWgBOvd8jyyJ*&RlH&%X%h==w zG_4xAg9h$c8|a7z2HG0nOQYHBN7N`?uO`>1ZB?V+avc0yE`i(wHP*i^lg;teTdxE=fQg07aVp}h4haGOdG0o(I1RpVB zf2I~0`Xb&}jK7iTgLnku5n}wcObz1G5T7Q-U&q2V*G_n>%xz3o5(`ly)al_ zp4QRe?@wgDUJ}BwZqvCYVU6Y~;KzTN$cBu!BiR+!p+ZQ5!c;Oyd}mQ%2#QnP@Qcw6 zyZ#*xp-XJyjXSI!%+lcLFNOKZ*CS2E&wwTPvPo>9vlqr66&FroL2~%-lbDYjzB!5Y zo@#Hf6?egTGXhO1@Y963!Ff|^tP2|1hQ_GTt=2~W53gv|pwXIVqD)QC2&N{!B$kaE zSh)go)(ZQ8`XTPO0v_@YG!>qr%{}>n1~l=)8^d9{(c!C(n_`)-G91BhZlPc_g3;Xn zDFovXjN>B^Oiw^C0X6;6Oa>;}#`1fhCoX*BR{*WYS3SNqG|M-Dxj#t5*Pu7*X_W9a z1z*2uCNmP1ebAhNubtoc0$*|(^3lnhD|7Yx17rc{dIq$Y~w^UtTTkXA+PQ-{7)D|!^Uf+AOV z&*^Mnzm}-5x3aQTD=RA^O+Kp_e*C5BEPr$fvbyL@N@ zo9yiMECkK7d`AL%N*RuDIR6gG%4rBr;{#{0iOMtt)A-g|Y^X8|!7TpXEH*+}h+rYN z%mR7TAXvjk&4&6>k6=B2b~cLLMDQm6a5mcTc@9$YIqowDZHz>CBwscMZRioy^Y<{+5EJ3Y#Spr(;m%q{Bfi#guVlD< zSb|TPZ(G=sVQ#qft`V<}Zm@;L?N;Ej6nE$`k|9#klX}3MZ!veiAM~hM*6Qjis}8jw z*%~0GhJQXElp}(~|D4Y@Is2>@Og^jm3wjo#3`aPef2L>ilw()Jk&E|Vz&iU!BN)A! z-e#>_M>so+(9suhEJDn(09llA2*&XZ3m_vZL9La1_X4<>Nx}CQz$ZWo{$vZ5bzaC` zW}U=j5p~-%kQJ+m>`D`vcR&(?Nvpe?1Pz^&jbE6JQ<33nvP-Ao3n)F24fD5_2J6W6 zNLjLwC5w+rV*UZr2YSg-3V9k-`jW|;3xm#D`^*%+2E4L{RDoC4kg5@fc$^sDvW8TRRK!!o`1&=ZYGfdu zA;wp&Ayp#>@f6$zs`5*7K7~*b}`*uE*{czIWfOP`kk>AAxwp`t=2O(YJZex7UJ4 zkTRBgF9k=$>Yt-AlXY0 zEa6jAAvYc z>kSnJ;RTH)YYXgeT+e(~qrI0OWx9s%*Lcro*am0SM!dAQk-zl}>!BQk@F4!#GwhE} zb2q}GzVRP=g}HtcP9JT==_7s_NBjaZ@F8O(7SXFRtQRnxgA1_6h%H`Z%H-Z@a1FYE z-~~P`jeXIgqEWVr{8zG`{p(Rt{YJc)g#D_Fbt-i?pL4~u##@M&xg$;2@bwy+Ik8f1 zedS8R4v8JQq|T8+L*FnF)Qj8}y`Reb6iHq{Ew(KP_40jUlA>KZm$*@%8L@_@B$ zk+N?(c4qm@Ye89q5FEt+Z!HL?B%LVBbsbw2Sd%W8YSQTu^eCOQz{VfP2nn6yF@Bi^5LE zIlf>M>+Jp>j(AY}l_*fjM{PvScTnICe|{qi=Ui@e=Ic9cD;RpK!hB~bG*ApKbv^-U3B3OcEZsVu1sG4$Qh7Yze}OGmmLN|FADGUT zJ1a8rbWSFJE1f;A49=uRzDQ>al#?dTiEm-iWdcw;zc`39$yj&l=!&%043@d@xt$meC-xC+~b8! z!0`jThNCWg&uve85XAva7^oBz`|y zoR3Qs=qf}k^pW8LfAuByxv~+#M!sMh3w=zp4F<_=v`skY85LgBCSbg_K_A}6i?*={ zWjMm&Wj}9Y?c1eSL8+;_TAokl&1!_Juih2I7ZAR1HN1e*YY?uvx>gL=B3yg59ARlH zC8y4Im|&%P=v8Yeq%q)Z-%s?^uT(3Zm!1)W8mU$(EY`}`Y-fQX7msSJ_r&6FxL?^Q){+`jwZV#l39rqy}-#%LZ)z{P}=(D~JlUmJ(25?CP*I(6F8MuSZeV-bafEEXW@I6`2GJLfXcgw z85$oDnftG%OUg=+p@biL4YQ9pZv2baAgpg9^(JRKS=UgB9J+uoBtqznkVFP_mRlk% zdc#~KEIwf;3+=9b1@rzZxE1dKO*iDP_xytlw0Q7&bO_(VIp2v@_ap=-@d^qiA(+I! z+li?&3&AX|%tmS%Zs<=Gc zMB;-M5DTOro+8HkE+7`jL_AZB2Q45L$VEI?jQcGh7AQu%Sd4ouAQq@Xyh@C#7Z3|v zMEs%{cUk}zNH;Ygp+QV&(i00bA>Jg$@92pIGyqVuL*z+4u|N>wL1O%xo>(9p@o+I- zr?;}eC9>t+O0i2DLhMH5+qlDGo@$Y|YS&sC&!#KPKR@djZJTZos-$33Uo|Fjntk9XMngB4KW~IZP9hi$b^v2QP()N3!!S$}e%2-wwkC+|CDQRU z+|BpVZI5UVASJ>AkkbTI%B-cnU*{Mw7Xa3HR-&DsuA>v&J%_n?JVb6hFbAq+KCqV0 zXXQZ4u0*hsSLCo~l^1uAU;V&cY$dPHWAWJY(A2r%w-)5gU)axj2)}*L5AJ7udHfq} znnsO}>N?_GDI0(14c6D1N*%JM-hP8UIp7Yuf9ERk{#}IbUM1ddLa0f6;Z%W|6m?X_ z2_dJtPKG~t>`vy*GdS}JvX^~y30}!rKW7z6tLk_oXG5%|XjLq=NX+wac^;F?cKmla z@8{a<@3))jly`u)J3MhW%nRyQp<}!%F<$g*u+6?^XS_+Tf)QUOI`2J?7%vI&Br)D& z9x+}9;u&K6v3bOJIf&H660?3i18{BuN33LJYu|B#B0U){kdSgX{KvP zxF#mto=c2(7xBAd{KvV(cxnKsevJV7*IZ&eE#g`+{*SrDc!LlhB*wqQ^KPPXl7F{{ z@jwZ=o`&-LEY)K$0!eY%;dm{It>wG-vN7@~{A(|JBA^h-g|De}2GLSjgjkUn!%hXl zr}^kSHb!~nH3oykwmdd!$z7!4XC8{pKyr>(nCB`QA@Kji8o>*r>xI|-ND=Wt*r!fX zQ2Y?~tCJKIEyCJ5NkIuhIH-;klo(Sm!ohWtjP8qYUmm)TO?39!iFMFUY2@OvAtJNw zBR6d)X7!zfsHf-9$fY8lD#mBbp^?i%JWGr}HHStn5Ai%P{^T4Qxe~-n#P}0)XymF9 zuNLD&=FrGpLHvps?>7e{mu|X=gqvc*<8x@_6aYw(O#pP8LnG&fxR)63GKWSk81Y~+ z-eC@n+(^VnigD*TEk$P6M7zi&1x>;u@q-ki3FwTeJBdXJt&&)j&?<#RwDJ%4W9=eh zk~i;Xz5_%=)@cmPwY`rDR~f{Zd? zT{O6TMEokP*-P*ZKl4*8q9PLJPFyF#BGC9#%gOL8=H!w2=-ea&7}r2ANq&c?u!i}7 zb&--}=xu5ceQt+C8OeoGO)Irb1Fl-++w*a%tOS|xGe1z!E=(|r2QoeCe~?PgEnmRb z3*3~?ytNGoHngfO-dda2>)7~uo%MpbVsByxtO^ zj@ByjQAIxI1+?lzrds}a0StdP5xmKNMrEUAgsIeV8cfDUOvXm4x}CM^V59^aTUK4U zTEbW9O-x$ad36B)unr zc*+UiopLDtdIIs37ICc@e8_0!&ZSBS8oLWmO!D!CK+r~H+Q`!jnSZDq;o(4dK0f5PD!tBH zx(20d_}@@^gyIeG{~N?7vOe!5>hs?%1)}gx`$o&=qpTG~zd_?O^i4FMg-ls|#hZU= zz8oLQTa{+k()B1^&(ET?vmb}alJnbdvZ#P)grm8r+*DnYxYE%>XB5xM`3<*8c9+7;4Pq%KBBSR9Q?d(haR(rR0!l9oyzJHbY~r{PnY z{E6Q?!9qJXBB@bM0%TI|5hYl7-`x-Oi7zQ(k;8NcV7)vbBgAeTyE{cPdTM=eInM!{ zpg8bwyXF$GQuJbpl{TW9ji|=XN>X#9O2JCy2f%sA_vr>;#yQJ0cOX{2XPW+x&kxT@-d#+ zHxPvkAAgDs>+B744St1We;%TcXaPn~1<}Hg1rK{^$#s^rsg@D=Ia9NbnOA7RHiNqeEOL#%ITp zQZp9uv0^+vmXw+V#1q7LOe`risfeeF@u*mtzMcv%Hxi(CZ9olE8H@doJiC$UaOwj%y}1smPxpgT>CKLw40DP|fF8vOW{#dNqdb0Osu&mC6@yR@hshQ`^^&{n}eS@cl>( zE*l^dsOTpZELuR@&4&f+FzwV`s$?PEtq>TPcmwvhC*`Vaz2pJsfy9w0F_MoskA076 z2u|bk&O?Ta(D3c&v5S<7)Kq?yGGro{$v>kE(%AfY9{NTeQuBDgyU1`F!P7kQU0V$+ z-bEAE$|!>rJoYXuqf+oId+?quSQhXeTjQ(0tah)gQGb(4MG(OUK+3+p+vq*>A6q<}|IGbuD` zpUJpqU*+cR1y`tMH~iog;^yoJ4IZDXYj*LLI5I- z74C?9<|K5Tm{6x^2u3prSl=tu?fjVD6MxE1W+$SPM6GIIHc78UN_%X? zjdl@+IZFe>UvLrhO8rGw?82K}gbC?QofQqwDqI17v|;VZ2z3V-$jU*jRO#0}6mCfT$OgaN$eMbx#Ehc?j1c+)05|-GiBP#zFVJFf_)Lims(z^u+k$iOiwn zbRm$9dysBNKzqL!X9)wmR3!ueEKmf$q!Pw=@ai)BhS4(Y`s)@aLSk=MVUiW<4Xy%q zTQQsoe4ncjs@(B5G5qJQ!t*1Xx@Zr&nVj%C!xZBL@M}nzEB?k9qNZMQ9SLO1{Q9En zU@!O7SYz{w0U(W35KAggcN6+dwimhN3gB84aIzMNLG{!Gxj!)dIP87aGlhAh4z6WH z8gzCuiG-yd0K(6~P53=sMD|6MA*Cb+_W%bQV+`?z>6I~t>BjJD+=4q$(2&eEz9QFz zNB8z?D4@BdvAvAPjs~qs;jv`~_|^IMN^q=mEb#h_Z@4ZTgcM=pG2$=cv+2earSP@( zY2eG%LVIs%Fzl67Dyfo6zEdrXu~PMAwXm#bRWtELRkOx8>igYrkE;eLR5yoT+iTGn zCt^5L4ef!fWOrfc1c{~GQ>Gg&=E^2?nMUs--E|zJQ>g@>cS2!0_Ba(vg%##b%Hz1A z*gp1x<}JiU^5-|)1^;Xl|1;6}nTPPQdr}>|4m~jUqrIZCM2*m15Yvi1 zrLg0y-LPe4S z5^5+?Fx*~J{0I~gv;5gkLZ<;qbuMBy6vZ&O zKr$DjM+7yYg5pIeNQKCti-KikorIz6e>M)|Ity#U@D&1hj;|1Ij|cWixu|G(9FpD5lmZ^|4I8eT zu9^c`EHN%5hH4sO62AmICPZrVzS#EmRe~y<5OVV6X^#ngeZ>~)jy$a~c!z0>W7O?Y zNNV-WW5R%0sdzjyr=J?Nj?;CAu{X8fa$RpzBc%3N)IAAVpET|8*`#Zq;)J*wac9JP zC9OR;5z=OBKZQEjZvr56#V^J%Rn;B0E~Fxs%13t<%IsRfgRVmH&=d%S6f{Jya<2xn zx110%W#-2O!Q9<_#_7n4EtcRWKVjJaY#dhl3kAyTZ*d@rdv_B;U9-RS33JgqAsX8a zL?eCqqnj`@GP_x1P!KfM;t+#G(prFdREV)40tw7-iWisjF4D)r{x_Bh?S=h#E$^W{wF7DxF*Jo62DnFRpzJ$5$OAqaq zR3gAZU1nk^2Jy(=f^TH_B?Y7v#3lCcrH!Z<(@1ODNL$(je0QavfpTkf!_=MpD4!cv zNPBw=lU?LGZ}k>JyVszXHRuF#V&J4&X~ia`;Ts>_M;ND+7~$nU!Y*qtu&)s43K?OZ z>#l~eV{%_1qQ9@E#|*BQQsAi z_gIMl;i8tuEqw*w@T7~{FzA{WeXtMZ=M#%h?)U|RZ)*L@|uBXI9;I> z&){*Pf)`Xzn)smzHcvA`6>QduYT-o?+(n)qDh%!~34;2H@ax}NG=^9md5!PGRSA+n zkW+GyBFQ&%sL;zUOFH%w((JKU`Uy{2dFtDKLWplkGwFCAI)MWllJV&K=jgel(FODu zx(<{UWpSkh9l<84tRid(cLL_~F;e-LXpapA5l-dH`wP7SPB%wl0zTdBiR2PdDFV$I zW1%N2^zJbIpXx94Prf)1eH@q=7Jfa?5|la?BC=hOLLUn`=8j+Z_45`%A8a7exgjvZ zG!nT-4y3#x2Fm+>pdAGhfs|NuANK_Xy5m1^@9qI3!j<0GYvmJkLV!5>p9IqAuha?t z>8+$`V609hF4_CHhkdWF0zXn8i+T}-ZFSNpnv`%^0^RiiJzr>!hoe39w*=HEu~IuP zi@B2}7N~Q_Z(CxpVZ6zb9v%sE28PADAkcwk)wvM)CCxEfkOg5r*bp8W6-P9sGI$y{ zySjn+MLnB`4iJ3PZA%IB`$4O~U_LXj{XK(LKQ729jgIDevI3X))Z+4I z7W1X1VC%{>Nn91u%5-m-Fu*DRXd#TncbG8F6%xUG%avA*JqHSNA~U{Jp}|O%(u;h1 ziW|r?u?pyddXE9waQ{RZ=A1vnu}l{ei;rK3-i!BLO5ideMc91=%H5 zW5Ac$c#uJ1{wjp13zSthYmhL7bxu{Jl=e0*Ejd#1LrL$_A4`vv5?{SHSUCK@n%B$D z4-s4hyO^j67Zxi;7AYG#Oi29S&2zVg3)_@6!$Es|(+FXuOOeM|j0X&QBZTQL#hw&_ zL3(71$gzI zR;fv#6tyX%tl$Y@mY@_RXqhEK@O4wxzOBM0sQ*M^G=i=OE|@5EQpO)~HO2FF6NR4E z42LEPhn3}*RoI%GJV{t&O+7nF_{f^NHC7lGTXQ*B_foQpspfJdR2cY!4e`dJq{zb= zUAZ!3AsAI!g1G3gelV}@5oIczq1GvN*oVZdqfvxorJXX=S?7vrEQNP|N;vN^%xC&b-f)v~{#p}8*M;>kMJT}h=EpkdN+V59)&IsrD$_9n zPSpytkAh~4GfJFr1FuVG;O1UZp>K2f%hQC4fz;yOr-OH;hx?^Im^Up{LzBbv4d~RAYau`ZjDD>T1{}tFhCC9vQr} zrgQ}^&AziDY}^XM{x}KyLz5I4a5y&HadCg#XBO@eEAkj8(&5gMrDw+jI0DdH7gHJ2 z4e&{Qv{3=p0kh7+?U4X0TRu}rXX*Kua`SUbuax?fCP38XLpe-1>9Z>(`U$@^Aa|;s zNM;i1au%DR(N-gtB$7-lFb9nn>+Y;ei?C*Qv6e`?B$(1bT!bIWnFcaWLk_E=f>wM^ zLfIJVqS8$@x|1?m;28ay8EXcdFCX+M%63KxvJ3P` z)e)aC_=TffEy}$-d+O{+Q^}F&UD!-L;u@xzVVFH-mulJs)Y@1JN7YQMw+Z3B<@b^lk zPOY1UW`_vjI%l=(L(SemCI6w>(8Ypppp9H$vI6lzUKK)K{SNJRE>>nP&`{>`C5vrc zAkN81_HHq`NOHVvu@IR4*Sbjd-N9*)_6iA!GSg;Q#ofb9OAJelODt)V^Xex-Dzd0n zxR3Uc>jIBi>q)x=cGf)1&wNR;Fls`|Pz3~G%1~E5iNd?$f(=3+x})3z9*r}$8Z_X7 zFmW2to0Y*JIB6a8YqH>-er1Rfa;9^bWC@hy5J?}x3{A4c@{`a7wN?I*T~Ka_rYw># z5G>+cvq;f7Op;}3VtGkAQ5}+GqOxMsm!=wMZd#;p<}aoQ9$lq17Cdg%?tU9=Br0N+ zpGXmg`PwtM`nBp>8CxP;WlE9K%S=m!y-KC_C|=p%o7034_o~aZl2(K<%&1koEKL~J zzscfaYO;`M^U%ExpPpe>G6@HAs+~f@CYf3n3RnpPxK2R_=8{(m0nVD!?k3G?zGEfH z8MG8s_Q^`&5>pO33cEmA!Lvf7Qsp_RDDLpKy{sG~t7(mM6$bwX&Qqe{H#i8E^@tt=xiJ-4gk(LPaD3R!M~_;4|6Pu-VlewkrunA|xxEyw3)q&#)wb zob)x(pEZP~gNK*AQtWMr(z#6rI?NdgkFceNDRY-VoJbwpxj_gRm-O|Ccxu@lSr#e= zxpndz6hCW$%FRXYKVW!iDnWQ!%tx=fJp~-L!dTgF8-&kU7yCrta+>E?HVGN-<(GYQ zXHSOdg0bgQ&VT+?@GX1c1>rF^i%356GN~Cd7iV6Ul@>~um6puQ#BYOumO+YmLlkxn zi9IA@Bz`0TNjj;g6Bd87+|bCabm3)X3JRp~^bFxm|Gdj*PhxJlOa}|{(MJB|c!LlI z`w(_D!g=IoVL)KGg0@$}Vf=~3Uw8b14JjvsPrB%FSgRTSSLz*RZWv&PWBG-zppqkQC6yN_fCk!-$5zZcs*tG+2AjM`U8#PXcd#rVuh-5A|Gs zDf@edXM5be%8zRejU|yLeYFZ@_0$ zgnt8o1`&V;5rAg^z(3BO2fkDvG5iRSApoN{>eb&MMBwJ)YC;Vhi>u>GCCy)<&&IPR zR;+X7OTy4d3C9xvRBZw7FUEg2zw+aMpt<0WsK3D<2?kf~A0^a7oK;6-V?QF`JBy7F zyqjJU0;Z!K6h>uU3jKwWL0IF+DNcT$RjLdj+V#hy4RI>17daz(pb5gpA0jq@+K*^h z^k@n%JzrOc5&Ts3t(SzrVW>!?*0|CEV+8HJM5>ya!e-}Xm4Qf|#6sST3;76(=8eM3 zSqK;M*lk!!>45>gI5W|m8Ih*GS3u-faM<|@k-2x4(7kgS8cP$|P4FZ3dk*pEcx;w1 zZ0K5X72;-EOY0S!{gy0NlGwslsD_%pI}i(^fl+Fya00k8fuGM3`~#CvPm<#9A<87y zsVGOddsxS?-eJ)ucqV{no3n&~DMjGZB6J1}i8X~6c1uc-QgV5^QDs<%=_9}s5&|j3 zmlb%jf+j>kOH7fbSbK;-r(My$SK3?qM*TYQve4CA3Gv|`wm{+Fqkp;Tzan%UAwh}$_;~0v`0Q2ajaKl0hyiH1DNFPC3$uqa`DZug8QX2r8Rg=4P2p1haXPOmck%2#9y zySyzY6`)hgNqAf)z3iOjGS+nOq?73$?`jaby8m`EK36j)&=iaL@HaljAe?Xi>q*yC zs=y5uw0~WAc6#BA$38rfF;q(kw{0HOAh%tVU8dDjyBKvzEg-V!U zie?JI6@OJm&9x>=jA;^c!|x%rnSb@VFrt(8R2M^isn)c*Lskrn>!E88<+8g`_|-#q z%FU!ZMRuhT2#w$YIhflbPQkWbHYW$umdn^vnsT~8Wby76ZecKjuBL=C z_dUXVK{+1z$McnW!Yt)91gG)O^ROo*nZel$}cO< zrB#r*?brP_8{63fLbGIUE33#Cma`Viv;hYJem-ExFI#>PJAcYTfLX}59};#dix4d0 z0fq3aDMF4S9$6^#99Ma28`3LJDHOs9)oxELf(JlMR00{5r##2b(oHaZh3{XT60m4h z?QVxfZwz8?_<4?<0==gWU+ehMLSfeEo2RNy;H>c}->@yS!*6_L+4a4}60Hu=U_a#) zc2iD`fqnXu2e?_%FJ!k5?ul&gM=1xf``3gDo65$#DRgDljwQZj3-hgqg;5$OsO(Os zm9TudAmnnI*B%zM&aS83Os=QP{(V@`%j<_ZZwpMROnna=Ubf)4P|DmT{RC^EkFb>E z0VUAxuU&?}WZ9w;VW$u{cc!ap?o7;=GgXFR-+uw?`?rwO`kACrB+XPAG0Bv9pArrT z>BMevjI>Oxb&VGXl9NnhlupJSN-6flf{HB!si!a!sGe8{GkreZOsM#X9=}l~M4D0= z!w+h(8wuLUkYuThmJ^iL!%fmiwUW^UE5F9G5G8P@21OR3XGMJ0J3?$9)%$S0eP35P zURRGh+e+R`E5)q#p2jdGzohh5DO{pV&s`m-^VQQCm@nQDmMF_nw!Ca~nXr;6Yv03G zS=pI#Sc2Qnow-VvnY?JR+BCP!w?bIv;*!Z|PQa@MYqNg>3AlL%0)B1Tflq{)Y_NS5L@SwvigCJ>xL>By8UyPe{G}^f|GI$c^EYAC zfWH<^i=%>P;;Ep;yy2UNmL`1n--HdWDOP1Ah5LUhd}v*a^pF-KWmt@yVn{oC^8U%j z3az+6IaVWl=x3Bhme_(j3a&!k`gUGyyBT;$_8~( z#o4Gai*<+lR+h@!Zz5`MkH%bUgaF2M>-Tlv{SbR(O{E2gw)vrLeVy zO#9|bVYIb`WId)1x3<_1{z{mI5)oGWGyh63jrdQ-Dy5Em>pBAGe=$^*ow_J2Yu9To zsBkXCKtoAfesF1aeoE=|u!eli>%j#nB`F1QB~Wy$NEsY=McA$^1a=Ggr7J?O_J!(3-Q@Av*$ipx@%2do^MFCLEIHm>~MrRQGl_873+Qp*$ zB-sfs639+$PNKzX5YoMa7IV@DOcJ2)ChRO}c7Gbg#VtQ&7S^?ZO{%7t**C%d6Ktznz~-u_a@Y>L29vvepk!OkqXx=86<~Gf{v%Y? ztdAp2dElEY3|HRAc!s%5hlS0D_>yn^l5hQzE`E8(>r?106LvH88J}pAv~k(}dtn%~ z3^>2=`QHlxQ^nxrrG}8OBXc#of}?-)j?*($V*r`x1s{cC4R(&oKc>McM~mY>#Isyp z<1iJeQ6Pf&r?}biNrCDscVY+)m09ILI71gLB096El z?`p)98l-eVN*BMOT1{AAtX#8Zs_?tNVyQ73W(}P1{B)@S(ijzI@uAlRTpdFh_`K`T z26AUQ;q=z#>%xE*60_pE@P|@z%_+MfY<0Q$9!-fid1S-?$kRfA?F=9xOAtQzyGI9_Z$1!pkFA;f&h!6>pkV8mFL_`iDAp#m18X*}O zmmy=6j3HtO8RL2x7uPS@_e0a%+x@fFUF)}g>+4!ipLg$f|9STFJnuRC-FqL>H_fd- zI{QlL#)O1OvpqhhZ=7F$l;`d!XIGAKcI8<9ng^=vW9+=H!_1zyf}Q@{iX32Q4DM z)8eOSG5eQ4KKP2It!XZ&`MhE#d35%_r;e@)IQqbBYwN21qpcpTCG%45xcSGn)de{}P|s{GS)`i40Pd`2eN9^>-H znXYhbFw^xA9q(<9_qzAbH66p>HCWT}Q`^q3^bI%FP`ajrU-aFPDfQ5pWE7&Qj@mYoV|E&WEX&^M-jt0fc3K?;x(qzb7+np?m5 zRzGU_U&=gbvBY0PdwnjJW5L$8T#*wnt_RaS{s;{WsiEVZltp3Z}P z-`^kpKJUMl{YTo9a%+&#|DnBql=&ZM{coNB4~71JD>M1ul(YWlkx~%}>)dP0b||Sr>X1gHZHH=o*Uj=1wQwEp z8C#HSq!_72nvi2iA2N(wK=cbroNd={w|suh7?<{iN_>$>B&GGrd<(nQeY+@*TtIX& z#gPR_AhH};jjThqAla=i6<9u23rAm4auKmBSK^BJAi+ok5{D!sTajF(v~_o(<&0Xm z?PVo}NF~yM96?SZXOZ*BWn^9@20<3JzFcJajah8>D(xdaNH7wC#39MZRwNfGMQV|j zSC#GE-4?IbU+lKr@3heF5LFQ$Bp8W6;*exyE0T+pBDF|M>qoCy=4)%*8HRNlU%(k; zmZRTuHa&Z9R%Y{N)15z%2(Ft(l?;5TBpmKTW?B3_XVbIyW@R>SHl6eXi5XSPqLCCN7FmmILxPYHWEql;lp&2s7jhQ4h|H0{{|o(|KCN1u5m&?=@kACNv;Rig zv?w@3`dj{emnq^S1@F@_GKF*^Ih}NdbRcPn2YDm5J31^kSi?Tml7++|iAXB)Uv&r> z)Dn+GA`TP(AwlOD6Ed4O1mk~j{ljwq)Ajedwtm=Qx$6q+)YW`@e*cek1DW|jdMjz; z#Ic<3@25h?AEc8>yOI9KKMu=^_YcxZr2T)8{ypiSAEbXRvOvPg_(uo7r9jjV(rKh) zT3_q7++aVys@Ed3^6&r5zh8-qtC{_NzU8XkZ~k7O{~Jr|zjRyfQx>Ys-db<*{=ST* zyYIVu{PrfRkFIC${!CTbp6Rz-YaO~>%M9Xz%>D}q(vq|U`@%4!5h+6k$eTiPxZZ?} zAe~6cU6e&ekTAp_@m;E=K9os;pOyrprF$Xw79sPrxFPk|5Sva+7_QdQQb3`g5E}UL z-xc`B7z=KsBP0s>;Xk*#|DI;K>bvX|>fOv$7!qZB>=Vn6uB-XPA|r_RDU1B$y2kdx zCzg9|oWWc(myuciKxT_;+bf@1Zn(t>-+UM8v&FvszWD6*_cGh+-;3J9Pg%k&>7RaQ zU1w!${M6!T+w=#^RkK%a-UXc&`G-W-TjV?050Qx`i=0DjMf)sn*H^s7Sa={i-^30` z5@{#W>N}0*%sy|uwx0}GZq??LEqTD=r&4UY1}wL$dfPh#mifxV_8H*8wp|{u_^4*v zEq~%>qwRq|S#DM(w%^aD(pcKC+^QmNAN+|Lowl!L5o){gG(`q&3r~|uv8|d-W!j!N z{axEHpSIjOC+c6dl-mA!+H%93GPE4AeKlLA$2RwjrEkupNa0lL$QjFgduxU0?NyE} zRvW!NkLv=XE&ie{0Y*E|2c!E&;02@m!$tRFp|eLspGDEnvDD`c zMh|6)9x5?<7>f;Ku`ia1{$d5B;}JR@!4)H!SY`^#T*6h{caDH5Fcnu>G0nBkT&#g8 zFrSgl_k*Jl3xv9g4#gs&TVOgYgO#|f2AA!FCtxqG!vd=gRv<6jUfzreEAcr=Zl!Dr3*j0TbzNfI%!-WwmG$a*ZYz6f4`)3_=V zSK-5C6ihyktEj($`cH1dHRL}z4$04Gz%@;Dkb_I|a78UHLE)WlxP$>!GN8(IW7P-o z=|OHB55p(n_@oP$oWLa^xFi&p?87CPx{uiCBe?o5iTvGY;-=B&R<}~7c}5JY4mlN@H#BuIw0D0&}jEl zqTPvV_h7gb@>seD@R(lYF`c1-Xc{0U^64<24tFr39k^&a1K7?0^0Ua#A)oelpkM$` zPk;*~m;)%ccu@3W>kt>1YB8qb|1qKSGVo;$zHG#oNAM*hde8wMGV%v$@WDcS$w(f; zw{h|KG6`RL;7cza!y#OW>DOS6E{$#umqn~;WNQ!^YB?BK1=2?%Ex78xXc%q1>>S(TtvA(%Jtd7F^D4l zk+>)t7j@&J)3~S(7q#G`JX}Of4IktAAMV9R5%>sGj?lme9gSd#5lrXIV|cBBW4LGv z%ix+-SnR=NSRw)vv=6pp5rXm|%EwVIZj#3>h{tUimLR=`G`}#>NepoPaz?%a5>xB3 zc(OCkf3iClL}zjX7Qlxa@Xdw_Si=X83m-g~E~OLpU>V9;3D!ayETqBWQeG8!9AB9d z{mKlMnZz>FSO(V|Pc*tWNOW%~7NNa9+WR9x`$vMYp8@vciqEb1=5rJn;&~nNgKe+_ zi(rW_>>&lepx_829%00z+eDA%^4T3O`tC?R4^HuUfNAq`h@CtXq`tM?=to9GKQcxT z1`>oJMvvKv9&++W^W zF>Z0wj(ks9j9jx>}h6 zM%^4H>gMp)vCEb_m6bYH>R1Qhpph)fW>GdP3+BK)SYYH?)+(R%fXiV7JONJ{c}|Nw zX9x3Pp^@B^BDsCA02Uc}p7PIA{(0Jap7x#}h2uu@wu$6r(=Sh`@PtZ!sYrggksZrK zb}WYzaMDNt4HwYx3n3yegu>JCES!cjMhYokNcqAFSY>3Vr^wC)um|?S3-F?mT{R-R z>Wmc8P7&=CG4P^VW0fKnEQ=;6u!#bxMv5Ipik)C0OfvFfu*i!`jg+8J2@35_5ZRq* zlsP8KbQyJpx2P+8jg)Q_Dcx+Oj2T7Ql#!P@MPBMQQocZ>+{ehCD3LueMk<(*SEL!K zjufemvT{+&#Xg84)hP0+5qZ_#$ZN48uf;>A^si+YX-Hy*l>!@J6TAp78QH&1WPdWG z{(kB=hKV$W!#s%V8Y$OExwi<1x3Y{haleWC&CJxBt?68}aB0g*6SZKX zma}l!NNcW0Yrc`TL6Np0;%kWb8ZmM>ROE1&k$14vJ6P)70OBnO;<9&fS%*7u=SkcZ z5qBlzmyusVzAyRybfLR*QFTcS}4l3*r*>li~5l( z4b;;>BMs1T2OS@6qTv?O+el}Vo+3R>8cTFwiDQiT7$bg<5x>WXJ5jI`1v``BMp!0R z=|rPWDs)oe{a}&zm%<#FXQazjq{|%^z#=2ZokfnL$nj{n8luo~6#9U2A5iXiJLwKM z3dhNhAwL%SKtCfV8bwYt8{q+$UNQ2|K~|A}4l&ZVNu)2;$RD#r{+MH=AB*&t8##sM zr_lV3D=w^x=&v;GKfNhD8#3_d|q$VRn?-dsx|Uqu*io? zVJ+MTn_-)g9tP6GKzgiOxyayx$Et_N>LWV*hz>u(Hy`1elUn4Y9mHfOFV2Q188qQ!54=mz^MR?pk<#8J*#v-Ly(`K%t-%?LVre~;R=!ADkCFnd1Y7! zGvGG1$Tzc7zs1N`3q-#1A)i(x|H=L|whYD5rK&P93ECNS`8oS=2Qe z8uINS9XZj_b@6;oB=9+r&F2JPY(KK&bHaiAt>kBr_9pGi{VML)7ZH73J$~)NMYZZu5gNFcvbR z+ZYim3(60TZ^uQq<03y?F9Pk@<(xh6!*`8c}6Yl7qxHzj=>2y zBWjTtwa5X^gH|dmqQasE*ksgVe7+c;FJ24R!Od_B%!FC68rDKazL=2*phy6U+>s~h zjsmz3HW(FHB`Oe;-%0vT(m}X32-gPDPZ0eqi4?UY$|&oSKrVvGVB|{}`I0hN0STHV z1Whm<2Ge0MCJn}QhFwCgCXy-24S?VHcsT-u7rL=Q*g{Zr$ zj0#N_6}l0Qz%gT0yv3nF6O8&9uKgLV{Tc24Y{qI-B*73# zFx=lJ>i%}4Rub(|M0?aEoH8n=g|n%Ljf(XX6}t%1VJscS_Q6v|J%j}x!h(;I|0wxC zE27~N+O?xy2UrgqX}^p1PtYzdj>5%J^s`E7TjEv5&-!RSl?$m{OXYo3@}QCzJO;a{ zJV@msqgKRozbM!ljJ_QN4K0w>`VgA-9J4RnGo&S{Xz}7!0RE78P>PlF>ymx>det>klcnigK$^cohn-s)O~A(XC>1tMKcpF{7fj zsAxM#2hrYe8C(t%U?R+b+h7^2zzxxuIT|xZ^TUN-9C6`~%FhPf~wGUA6B@me2IYyFH`V??d7hfCoyh=tZ* zp*3gWuu;FnlE1`~zoh;zssGE<@T^e@49uFq$P$Rm1R^ux6g+MC)1RUqae$cY5lr?7 zrh23TQt=TguEq3gG5w>A{82`ph$RxSL}CdngBRf?qaMR`kKww}1M?szPQt|NX?Q&iuMdHtFcL;V zOuinIuTO!SARVozqxE^P0G7cDSO@E28y~~#+qvk5J#YXHLO1APR5Bw=W@H;sU;_$l z=zyJ&7}!7zY#4$ga1u@##pFn(7|4iI7;%ah^o9X22!_FM7z1OWHIa)XE>d9{4K>nG zvr)fJ67}m8qn;}i^;|J&M)K=S*bX~j5A22b_}BP&BMon);f-71R-=C7D(W}x5ZC?& z*Z!sxb{n(r7Pj zlIK5nnW)_56ksHeGZLm}D%DVN9u=LTKMa6t;W|jiPtfrb9k7!IhiGubsNYA5`h65> z>TjWbniCzk7`2slx64MQ{a-h8y8#3gT;4KU5)>D#TJdmy6mN0oTHHFdOE=TDTAPz+Q;ycVhY?4^c&4 zFbsx66fQzx>n?n`3t#RcV;32_7{M+^uxkoV8^w!^DrN-5F3=5nLthvKLtr?Jgt0Il zCczY#2Gd~<%%iz%FJXa~DEJZuUmAlG z5FfvUkIU^vl{-Q==mBwEIj$=YfuS%GM!|TP08`*5m<}^x9xQ-maQ69sX@G_YjoL#{ z?IEc4Ou$KqLVHlC!cJ6$1B`~NVG%4b>Sad$G9!OE3+6!bU!Kjcf;F%aHp33s3438b z9D*Zo5?ZH>;*DEX8t4RFpcnLp0WgSysT52zYHygRz2T4#q`iC~y@AQ!z~pv+E2?ls)ma|ns$rvEaTWE7JLH4r6+UQQVPvl`vR4SM zR|u|GN?|!{hHa3FugunC1g|iFY6nr(^B_T4O;A=R!X!u#RuhD;+KYPC5xPMS=nMT} z2+#kkX!>d-8Bs7ECcqT938uqLm7-qZ!guq^FIlnJ22o8AiYr za4XD!MX&^R!yY)o^ItQ@#br^iX`@~XhD%{G+z7K^4y2>k=%`ji)f(syJs~Ep#l*D) zaVo93u z99#p7VJW11-E8?`I0_kY9V33jjacx2#L64Q${RdAZ}9Z&ixjml3Z}zMSPg68DR`Ra zzadCeLx@o%uZ(mBB1y=f0)VLZ%*`4G#ziDlj#gA?!~yu|b05K2d3bV!8;Dl`njA*1#)qWz3$KZ@-~ zvHd8tABFZ`fESHw3=q{A1h>KrSPm;8_ZzwY)-q9VEr%&^6T~uaVVSpbU>>Z3H9Y@s zO>;40R8zR9rbxIEZiZ;wgvL#nx(QPsuoHE_0ix&u6g^N1@#O(NFAnf|(d;Rzc>yed zMMfQT7In}S((yq$K1lh4ls`Blszr=ySq>kF;3AugTu6s4blB1fyCEiR!KAHNq7_TD z#=`_y39I2GoHD8n#oJK4m7s0iXqyZ-?$*{VTyG_hwpwYcjW*h7qm99}F}OA!%{Cs* zLj>p{0`w5~4{`sHFZ72YFce0@C`jLj==%`XJcKn5rNc~^2Mb^stblc}9=9H9MTGTss z&>Q+f2Ko*IeWwJL!BIGlTaVa_I^t;5>0VK%`;GdN5r4^uCs1qx#ZIjgbt>7YPZLCa znrPGj?i#>d-{QV+*%!N#U8O6_jb6bf&I&ehR{Dxw$!6_JHf>h2X%m$tIx2^B80m1M zqbo&6SHn7JtvC9CA<++vu!CsN4kEig53_CcFxyrScffAQ-sr=_?2mb{Kjv-pTDG&+ z4j7$4LkTprj;+mg?8mKRBXC_RWLs<9MK}NlVJD=Wb;EEJmO(a+*0HZ@xi>MfC4B8C}SBRUtcy%sn)7553ce zokzCCcCLnTMi+6vXsOY=dPMI!1vQ*UK8h5fNKr34ibdQgW`xBPM!z^H`o$qQ3dfBu zSs=Q^$LNhCv;X!wvB1Z+=3`sG-VQsk7#%)AhYh}>8~oX?^J2da7q(=kVK1cf88pu}WIXXU<1M^@3JCI|G*lNT_WAQKnV!E+f*a-=muL!QMu*6qe zVFo-2vA|bTaN6kcF45z?@I1Ugy+rCIL3}<&{#R^)ew7Vz)i|yizX&g}89dEq@C+vk zVhM^^JELR$VX)D0M?}Z<82xmi=%+Dd+%eKL^mH+4d>TiGas8w*_0vTEBaQ5xHuF?q z+O?SW8Akd{qS4tXp3PJ7>;=)!qG%35nv-hub4{Y3J4_mj=M-?FAg7NDM)X`ZH}YT^ zbTMG#fg3oi**XFVgP@_RexFzQ{X081M6@}6fQxL z&(?|lEQMWUEcH2-8rjDtv9*bd1}<7)H)Nz=SBn06A0&vr?j#>qj9`&3H;eu<4Pv1$ z$^VjI{1U~-wqWY5@GKn0)J2%Q1XIt$)XwkAh!?lixyqJ88J$D@-v?u#7X( zbCDE`hK%qW(S5E0RzZAu4wIk5XA}5vf}oo?je^9=*Tl-#ZLp&?%+uVitfg$@lp8tA zF3MRxrhWLd^x@Oehc7)JzVv*U;P^1Xx%C7K+$Z5F$o#_hBJ13jSl4!9U7Nj$LJyHb zFSdcA*!_utYv5Y83R>7IILsCS-%pP0?i9vSE}nfWCdVIEvt9III~N^f%&_ky>_53f z_85B-VG=~Ko@|KUdb;5-9A!VskNv1ckWG}2*hKj#4;DbCav$x36L6A!DhCEQ55~Y) zxEXGNmr+pjg?80>G`xU@)o92rO;-Y2gNbke4nlTYx@OqwJH}RD7wL_p8A;bk*ay!; zc4y{IpBwqEhvliewM}}ZaN%?=UK!pViC85McjQX;x@3x%8X$pGlnR>e53gCjp5rm zrkg*Sr|4e)|UB87M-&(>a*I&vjH#&X2LAUIG#OhB*#f4 zhiJ)3g=w$@c0!z*gHv;GS`JQo4yQhcQ=h}u&tdE5(qKC5h5bfyX+M|tpSKfv-U0f< z0QUZ#$Cl5hlFqKf$`V1z=9unQyXx(F{3AEb*(zvwFRqC510-Vj}0M3)!) z;ee5n<(y}TfL-u}k=+Y8*Wd$DX*VkEE`t?DTz8LhF>a(3W7d8rXL!%Oh8k#a|oawmvE$}vbe(Oyop??IV8D6@y?*h6&eVcdHd_nr&zqLB(Z zub}gaIJm~ib##zUkA zQ}gmCH5s;vwdUeo*Ia!{r)2R17IDj=i~&VXk-+PXx)g`jec+u zB)%Gnuf`78X>&{@mYc>!n$8>HZym@11BuB4#N>f|SO{tJ0Bs(ahBF+x;C?gro7cf) zSOAMSgkjGi3`fW?d0mi$J+PO<7?`02GqjN3LVgSRE#&i7AiNb^A+0FYnr`b%Gz;RG z&I{9dIYgyHRAQPgOw;8Ml@3wqFg7`iO%8MaF!vAVz&tnsCyl%vFY8?W@xZ%y;N2-W4SBpfc)UAO;3i1#9rS)Qlw%rU za3kCd(flapJbD%m+Z@-KJJ)9mzgaTU*$)ZU_wm5{c;J1ydY`V|C;xr&yELDsc8~#f zF~H+XIe4**Pge$Tf&qNUKtE)lA11?%d_wl}3E2-%!?U)Db!N3K;#cOepUmTwfHU7~ z&3v!5!D%?dX#rIK9MwO^FrQpp-jd;;^Y#kRpDvu57Ebc_5; zkCA`52rt=!)*HWh|At@x4Zr@IGjz2jtT(^8FN#h37&h;DL9+0IWGRNFY~n|-iN6B! znQ!>aH<#dLHu3q)p2KJMoDn$2*9b3OS2)=w)}sYq8xDMJIPfLxaMSf6`4|P1UP;le)SH^38cQ z-<(e2?A}MhXt)~kO6SBYol`B`2Pfd9&2fWS6X$}~E@*w78$0?QFc1dAP#6X~VK+Pc z^yx~UuC(n++pfILx$-vWnhZC>Avgm0Msz)ItJq-fypK20>v~bNuuVb zz$VxNPr^QF3`qtfwLSJ80MHj7{>&{AyIn=QG3S;c#>lSj4+T92D(5u7zfut zMjXh91F={j77JuRfeh%*5{?&?@tS|^3UciQ@$>FaZ)s!40qpVu4^R5IhB^Id(vMKfaO%f9%VJ zzb$H``Q6-XP88%C6^b!J`)&Oj&CLr5vSkF>J&fxf#&u5`OotC z+)l^sC*Voef>89GE~Dr0@;WEUXb0XA9e5*idi*G42yOdHQKF9wA%@zZ{!v1Mqa@d@anc;i_y286n$GChsfMla*lZ5i*D!mFI{Dko`>lbKra)~mdY zHk(8nIxxks%xF6|(RLn2+xv*NUu5)L8lI<7v;;-Df1M-8=bcb=5=Ey_Gz3LMQM3$2 zD^PSAMQ4omuNCdjyXYNQ<_;`#M>A|QI*@*?fpmN)Z?|{G7#-w<<}PTSgXVc?-iGGw zXr6-Rybas?p-3QH3YQtJdHdB3D2f7C@J@LJ=_^Rv^Ui6{JLi?lSyhWL`l`dCuR6j2 zGDOeahC(RlkAe#WSUXyX>F&g|cQSHzN3^P@VJc`U7))g_mAL>f(@`uIVFYd{;)X@s zNV_E(JwHwKd@Si7PQ%e~1dbcMs7CZ6Uf%<0hYuVbxCSOe6bPiBz%ka2_=M5dcZk0J z1iv`IWbT;EW2$&_11xGHJMhhMQ=3l!nJ?m>_jOOM3*j2f@7%*DP$HJ?aP8 zG4f>$d^xW6^AYX0$Y{T4xEd~n-0)+i!w*x%;L8|H6*B}!;3;_8<`!&jx31&UHklXA zXkIi|8}-0aQ4cKRJjE#IDaMUT*(NF_o4s_t@V4@Ww=IvI^8 z9-3ekh;Yb>hi4(WKDU`wAi^q_xXyKhj3t+`?C1XeVWZ!p!S@*RdwBi585UnK-WbLk z-^N->Hftn=*#x$k=z+Z$5AQAxVKLX2#aw^Zy&j(6g78_xjWygz$`_qf$d4HU_%Q<- zZfJpcH-!fwg$H3H;k1!(dSij;H+*Pl9`&7}CtLvA;YsSbQqK$GoDF`|r^A#07y?6C zc(Y^S&6&@x2dVfV1s=?V#NmS_kSCA-xuuS0B=J);C^U@M9wr=;Phh$MI1IVJfd^&7 z7^GYZ z2KgD}KgDxnjOb_J^E~O#yYX|6F@EkrjBR)1w?+&!?-HL~c|6)t z_$tcX=v9nlRWu9mX#ChBqqljB-p0sxZe<}I*Hof$B?|9Fk-em=vPD-h;#xn^wUmFI z`ma;}M7`(}n7U_^=$>?z9C`3Q!$l(~FoFVK`mkb%%fDQ~XV;fhn9LPDnGfk;vc>3B zI!q;cQ_n(t{LyljougQwPhf!_U#==aQ7llHBbp@#UC2mx+M}oo^fI~;mo=jJ=bAN6 zJEMm$h#tO#0tEF)h|$Lx*l~ZjDwK;z3f54t3AV#-eo;fiLo_^80qczZ0tLQ6(J$7( zWE$E+Ls>8%V)~1W{9?2%Zz(gVQ&{{o7DxBzhp{%gY)6;vcy&8{Z(j@7!DP6xbzrIa z<99!9IZ?}GEs)6?s|`Qp?eV8uSW1auDJ2$`!3uZ;9%Jbwn5C1YunyLlFKZS z6tF~6WaMvCB7d9aWOWZGt9#)995jkACB>JL(tI3gKAy~0-nBBALe06rOBTx-JL~Cy zSH2S7+e%zvIjn@I;aMXW9YroWaa7xZquR_|^fV34&`>rFK zw!wCzuHf_Wish^gd9ya;3lm||?2lV=xyUDj_hrs`$S&T8ckw>F3k&SR0>$BsG?I~A zU?eE|4XYR57|8qfH{Ou<-EV?WXb6Qy;CXm~x6FCGWjaGoxBx}?K(^xp*^Vii9aA*B zC>X=M+%AEOL^|Ycb{B86--OX%I29>qq2QcMER+QY;2?^gK+%(w$5Okn)UF7)0tH7= zkZ%s%j{*af-$eOT*bQm7$d!6nh&i5Oj;H1@H=JW-a%fkC0wqS0P#}qdHN7G={YGB1 z6M4-6;+of({;uVXV(ldNS%jz=hP-yyT;l$6?nl51SOv*{?UGS(cB0~_Uo%Fz3G(^0 zc#W^Dhi1qZ?mLNck8|My6UAYoIDZ&GM`!71*cNt=xz|cOW^FO*=SM{S{1|l!mxnG= zq>v)T%&3JKwSk)<tjt^@csMPAROWV=0*-+ZiX1+SCjA}WUxs-qLTa|9VXG? z`pcY$)JElZipuXcYKNn!9Zrxq-GLVh$2gue!TnzD_mfZk9n>#mfQ1Y&pZ@ZPnBwmU zt)QgVL8M?x4FdH_* zHi(N}#6>R-!4WtP&(lE`9psQkp%+o8sDN}4?GDrKDEZ82USvj7gn~sV_~IJUYf0CT zw$`B$FDvYts$GnD7b7k{PsIxq#MCch>Y_#pHj^$VT}ir~G;#f69%+2IJ5|)~G>A!e z<3d(z6|1$%X87&BJxqcr5YyW*eOa}rGCmV`XL9OicNQ1;csD+_&7*)b#1&<@qO2Y^ za-WWN(^07wRcgn5H_CZHg3?A%mf@l@TvXNq4^zH`@@15#z0%qCuz(E<*wSGp<(w$z z0y{YMQ`Sj^Dk{`az@GvEFdOEQj{>_tpo7YIW|s+Y9Zcp$HGvn^L<&%_f`a@! zT2<2EUY?Ga@#8hVqC-lU^93C1@G#y2mE zYS5gSX@t#i0!|vWKT6d87>I)VQLs^qYP5qW)`()(#(i8g81)tkyoCa9MZgu151P05 zpm~c1-=e`Lg0zVsZKA;@8f39svDmF%KP>9?BSzIZi>h-)K}QsHf*#Nd_Q6v|)klh| zk3v!IzsdbKvGALTJpXUja8ZZGWHey%h7mZ1#+%SM6?Q;kWd9|28O^IvxE7LbB>fh? ze+%C?2?`mb4q&MRSn2@n9iY7fSnvQAY%USiT*iw-B`*%u>|Ej6)^?u%Hb&OQ$lBJz zbw<4%C+h7rFa>Uc1n1iX=i3C++XPcP_uIMOz8P+TgAkXr^VqfX*uArwwT3v3odk32 zWGN(lWHyZpj^KhL<**Vmup?GRc7%#Yn2VWaUS!)La~w0o8*&nF$SI^xkUq(49ny!BctT)Uc#IMxpASUYf`U>OB#$PXc(H;QXBAd|+cJ-E*#&^ep?c@PDhQQ-Pe z-Ydf(^{!{~=+3m-osQizVHWIzOxSK@;&vnSUD(s^m7vfxQPMWtjV7T7cot~IgpEekf-2VK4`u@!tx8I5iBE^Oqg~$cw%aA$n@DE z6H6?|5-V5^I?Qqq4ZBsc)==-X;V-`2od0~T0BJByjOFW$l% zJLLnaq4g9Oyn8V})xk?yRY_)5WizWP%(s_$q7cvdxBV!Bi3Jl26MdOL5$4+tK`<2g7K8$PQhm#aB$kfX7_CIKvSV$*k+lUUf^mdk97BOL6v#k<2^6@10=+1}h;MX5 z0Z$Z2M}ci9Fn|IK*uRTKk`ufp`=fwA3Ivc5aDoLWXBMDb;W(t@V4^s9BZ`%wSS5-@ zqF6MF@%(>#8O5-ea9>eRQO};3vG+u=3n+FG#jw!TSjgov3t}3@h#j|46!Sx|MZ6|2 z$Van6G^4}Y=+GaZ`ggD@LXa%9N3qi=#t83Vgm`r`(TjK$ynZ+jOjO^(S{;k zPYD2h{t3cyi#rgOvh{M)`0UComcb zjAo;k5Lip{jSlM)9d?4{j%JoS+F0J`XL)0Q<&C8*lMo+I#X%m)rx@8&j4TgD^EN>P zam98KeJH+D`73fq6ZnsLE1go2O04}EOjhK^szXjKSr^S7r}Nu z|3B^|c;*p2&SZFVgP{6&Gu#4uVL$g>x$i+5(|_DS8U=c{!5o+e*TA)K6HGOFfQTQc zg2dJU3Y_T>eTII{5MyVEv9q}3EHQU>h+sK8!7|1XmNCc}J_UzajhGQVf(b`3-G~=BVMUbE@IC+&`2*0_R?UlA6x`WVL89RkK`Bl zQE(khh9_a4k-jXEz8uIKZeJ-JhNJvKzl2}tmq7;fM+Wpq-i-gqQEurcqo0gV0!2Ov zhNM3seJX~Z?#DtbaSBVEqQWU&u|KWkr~K6rML$K+0Z)F?zW{c@6Yv7O$WQzu_=*1t zNcvBtPxE1P+6g8=))>y%@socCD;Hi|uzGPO6{Z;(+{W&HHY|gz_Y5|}HrNkY6&a+# zK^puF%YBCBJ_~?BFbc*%T>2R<{R~AvL($LbU_CqryC9bO3`>1B4z1@oKH$LdfqBpc zx zWsuIJ==}b9qV9KwVK5x>R&hUVuf*&tG5gQ^ME(2}JP$7z6~jwJ3@;HenJ^2YYz)di z;4JC^+`0}oufxqY&tICmtVFw&Xt$2SaU)qoaTZaWl@2pu1+0QYaKy+nMIz6XzyUaD zBs)wbI~)?s*#z^mAsm_ug?X?55}eNxoX=AJS<2^lh~#*|OqfN#IXztTl5q)M=Cqs> zr{!E=ER2WQFc+4=3OERdI87JIX}T~D%>{92E(E5-OjrS{;8{2fFN@@9BY9h41}uk_ zupbWaIk7!SWP1vyDF>Hj*a7JW@7}>#yb}*tHBXA6&@D3C%h~dy&ETnt^ z7|gzxsb=XFcBv4IZ;@`MH#GzjeLru$W9d5=??>p z6t##H9X7HH1$LnTx=FD;bcdcW4W`3sIKz4|3cQE{FNVWNNIlkQJYn(aoj-8HZd@`1FQ52VsH9JN~u8DS|SES-YW1W>GqEgs?;8?LdT zfDHx8a7`JmDZ>?IxT0(fPH-$wIF@H%99#q2iMf|LxacQiz(_eGDrZFH%V7j8fJN{$ zJZoeRBih4=_N2f~5QX-j&>nnTfsZT5uOPpIdKJ{Gpxp}Eec40gWiOZob6_{@F;eNz zU*4$<;37?gKRqXv18~sDUT=}TzAzQ0!8X`#guzG^ma2+@v5=8hG4d)*TZL&~!DX+| z-Ye-a6L!LGBh_Id)!`6}Rb#R0N>~k>tz5KmL9|vAt*>IbSHs{moMBy;4r=J&wGq~J z$Bfhl@#nomU^ArN>!e>N{W|4dr`+o(@;Zvt#f#J>z#iCZ_?IP#MFLb%DNvD@5jXZ8PR@5)JTCw3N#X>jYMf< zCd`72q>+&{o`)BVuvjE47Rg(YFbXn&w-`W^qeznzEPzF@7xo)DK>h*p4-k9@2)+aB zU^37D0UoadJYENQP7m;$Hq&r34L5Iun_&ZNf_zdo^GSKoMdY9xM6rV?c97saNO1B? zDrpfTEsJ0v{I>;(w1vP5SOuxjMuoNsILUEI z?jPd*A%f@-L39X{AHw8^2H+r^gi{=wq}*Z39bN&WVG%5W({P64lSv$(Oo7d?%}Be8 zNW0aIi+C;)U>j_QjN~0g@(%g$kpIqBm;u{ihmj*9a>T$CxC!>bQ%2tP6?xYmE`!Tq z4XlHQ;SnPpDA<959Vpm=f*rJL?V#a~LNbaW(c3}v9;Jh$bZ`{k9>upu_rV6(0Xrd< zIf`YD8Ifc5kaEW;cdQ%s78GynB?Rbv*QVViD1V;e+S4^>|?&O zKdyjP%#yR1CFj6?IKb=}m;Ey?>tn=yjJU4{_A(3hVixQTQSgr_*dM}VI1~~q{lv;A z_DqHyp%oK-f{8vEhNH}e2bm2IF$)f0797N^7ZVR);sIh|fLQpGKeOHdh$4SNk<;PK zdLv;8EMu}uxigeIgUim~vOy0fwO)|+25IkX2XoF&BcIdm=d^46oFMp|82CIN7Q$&b z!8XBUZAu0}0ap)4f%pb^d;}2wcz(kk?YhWFJFw2`inB@yo;3kMgd0mn( zQ2YxN|Dp)u@-OJ;3w|3Uqdpvv_2Zx{E*QlHqxftTpN-PtC>@SsvQbR-7Z(oDy1_^o z1v6n5q~pKP@n0zS7s`#baj>?XgSDGDSepuaVZV{_5RvgvSOshN!};VdVf|8r<` z4vo$Yz(FGuL;NMJ5su+Da}2l5$ayNBr{eiCSOIa-d0g~$0)JsE5z^q-H25_m{hEb#snGDUL%aM>KRqLq|Gvq(jGYSP2_o6P$!ooHu5^KbQIbTsoXfhjSSrE0Jn0 z?aZZ}c}&^og~KeE1KVK-hmh?#gzN~HvH5fLaxP+FJS>A1aE8;z!YO1Y=mHa9BHRME z!e-b8Pr#FK3Qik!4IN%Xhu5I^H7I@!3SEOj&c33Y{b3O-fs}Wq{Iym_!1}tnmX5Eb zV;AA5vw@h%1rxboT9;;yIB({N^A?x~3t%to=O{DvT&d@Z>s)c&k39HeXI_wp zgA1S!#B%Of&Yia>cix`di6wVp$(5XXWiDI58=7}jiG3ETzqUN79>ZTG=H-v%KmJ z!znn;aq4uAQ)j|sunThEhx@l;iCcZy{JFK1i*i^G8#zyn0=_8Vy9frtRG0>vVH?M& zJvm0b00zQfxD{qVEOi@}x(!R-h9&)+I9BZfV_`h3gZ1zTJjO9Ii4kHHDfX8ZH}hvI@zIt-=5P%4B{A(Re6>EI`f^e2q;CwZ^{PQhvZJX|a% zx#J;Gzl^9~b_{kw>Mf(*JzkvX_J&z72NGlV5M%dD!YQM|_=FAP6E@5m#YGGkb+8^1 z9AN~N4VpS{rodpRghf%_XhYioG^*V5ox8hkWD z)T1k49Au?=4(qXVj>_QXLl*t#vZOt?nj^6R9ElBLmnn>0rU;`gUZO2NC`$P`l%K=W`5Y9pV};s|%>jEB zitVR3y2~!b4c+YFu&}(4mFGp#to6sT8FXoO^9PMXibRK$vI%6zCXgd+fi$qtnF{W7 z%nEcMyn~V5L5JxLqSKp=+{--S-f(susP{bewvV!gKh7FHOX>M6rROKYBv=B=AnoQK zHhM>a=p99n6>e*R=EPqYC;m=y(yx;fe=LFTT*gU1Mp(?oO)(bPiN-tEkfy=n6e>E> zfD;W4(clPa@^{ctQ-|oLPNNT>7JZofPsc@ndfw_gRZ?It2$I7T>|2e9=2X zjXs_%`ZzxMGE4NAxuogv_-fYJD_CQ%BEO9M3fKsnjUHmeLk^@d@t3T{e|cH-C<7Vw zhQ6FMM6u6N;0rbbzDOlMlKd!pJrjTgAt6X85@zK;;YcJhTObCBMdFbJdyB;b@j|>2 zU&J2?K!T7Edy88Il7mpzEfI-D%8()?1xZIrkR&7?*@UDbX-Fn=R~G-tLkjFI*AF5? z$OtlqOdylU6f%v>*jwBMF^GL@-s9$+zRStp66S)qAs&bq;*Fqe7|MnPApuAT5{iT& z;Yg&dZi|_3`*4d%QoT0+-*Nr(-}`jhG%KtFT+{DL`dvxC zE9rM7{jQ|nmGrxEhWdiIAs+UY&9uLnb~e+_X4=_YfD|DmNEuRrR3SA;oxSC8+J7AV zo`{6B|9HE-CDkD4muhcsS@8rHPxvA++#Dp6N~zskcOad}>~#;)j|?GW$OM9dkE7t@ z)5r{U#MYBxo>F6${m1|^h@jb%BM90(iFQw--IG(uG%{mv zc|OzLYI#13iyR~mDX_QX^&m8qM?-lult)8(G?Yg}c{G$qLwPimM?-luw4E~BDYKn2 z+bOf1G6hjc3=)gPBMC?%l7yrnn~+o_&B}k$?Jb3o2$c${R7j;lDi!|Uis}%ijVO!* zIN3wIWEBX+1Y&|L69_~F0)apvCJ+b&0)apv5F|r1p#p&*&516nsHo`DTY^9!5F}TD zKp+}&w-!=?KvYy95D1d)SMlq6+m&vu*w?ie5K46zOzD! zAMA0+85OFWvduon?6AuLN8W$BX|okWp2zU_oP;_JnzY<|;h9&)jAAI}nWNU~aLf^=>+Z129*0yo#Zz_9NvPAHNh^Mu z7&iDMP7EB@tcDK0jFWq-uj8a=^@W_|R$s}FNTyPmfuSGkChqBjT*nHkzO|gcjEB5eU#SZ&S@2UGYi+jBn#;)mC$Sbbn z&rk>~x(FzyH{W>Y!=V}Lt3zrYn*O=gIb^zbZ7_`CQS--Twy0v@N5emkVt6XC#3mKm Ixc4;v51%5L5&!@I delta 108752 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 delta 72488 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 CCV!v+ diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 7d5cbd35c..4bf70907f 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -17,7 +17,7 @@ const char *getRetName(); void function_table(); void functionNotImplemented(); void modeNotImplemented(char *modename, int mode); -void executeCommand(char *command, char *result, enum TLogLevel level); +int executeCommand(char *command, char *result, enum TLogLevel level); int M_nofunc(int); #if defined(MYTHEN3D) || defined(GOTTHARD2D) void rebootNiosControllerAndFPGA(); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index e15bdbc15..aa4bb48a5 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -516,7 +516,7 @@ void modeNotImplemented(char *modename, int mode) { LOG(logERROR, (mess)); } -void executeCommand(char *command, char *result, enum TLogLevel level) { +int executeCommand(char *command, char *result, enum TLogLevel level) { ret = OK; memset(mess, 0, sizeof(mess)); @@ -535,7 +535,7 @@ void executeCommand(char *command, char *result, enum TLogLevel level) { if (sysFile == NULL) { ret = FAIL; sprintf(mess, "Executing cmd[%s] failed\n", cmd); - return; + return ret; } while (fgets(temp, tempsize, sysFile) != NULL) { // size left excludes terminating character @@ -560,6 +560,7 @@ void executeCommand(char *command, char *result, enum TLogLevel level) { } else { LOG(level, ("Result:\n[%s]\n", result)); } + return ret; } int M_nofunc(int file_des) { diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 2b55d8905..a1d345a42 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -4,10 +4,10 @@ #define RELEASE "developer" #define APILIB "developer 0x230224" #define APIRECEIVER "developer 0x230224" -#define APICTB "developer 0x231102" -#define APIGOTTHARD "developer 0x231102" -#define APIGOTTHARD2 "developer 0x231102" -#define APIJUNGFRAU "developer 0x231102" -#define APIMYTHEN3 "developer 0x231102" -#define APIMOENCH "developer 0x231102" -#define APIEIGER "developer 0x231102" +#define APICTB "developer 0x231108" +#define APIGOTTHARD "developer 0x231108" +#define APIGOTTHARD2 "developer 0x231108" +#define APIJUNGFRAU "developer 0x231108" +#define APIMYTHEN3 "developer 0x231108" +#define APIMOENCH "developer 0x231108" +#define APIEIGER "developer 0x231108" From 66baaf1ebdcde4c33c6a857cda00e967c5bddb0a Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 9 Nov 2023 15:07:34 +0100 Subject: [PATCH 12/38] dev: fix server logic in checking detector idle (#861) * fix buggy logic in checking detector idle and an argument check --- .../bin/ctbDetectorServer_developer | Bin 328256 -> 328256 bytes .../bin/eigerDetectorServer_developer | Bin 444195 -> 444195 bytes .../bin/gotthard2DetectorServer_developer | Bin 286768 -> 286768 bytes .../bin/gotthardDetectorServer_developer | Bin 277196 -> 277196 bytes .../bin/jungfrauDetectorServer_developer | Bin 312448 -> 312448 bytes .../bin/moenchDetectorServer_developer | Bin 295308 -> 295308 bytes .../bin/mythen3DetectorServer_developer | Bin 300752 -> 300752 bytes .../src/slsDetectorServer_funcs.c | 24 +++++++-------- .../tests/test-CmdProxy-jungfrau.cpp | 28 ++++++++++++++++++ slsSupportLib/include/sls/versionAPI.h | 14 ++++----- 10 files changed, 47 insertions(+), 19 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index a3babe2adad62ed5987f257184d982d42334a7bc..d236682c32a74be2c80ad4bf13f4a98218436c0c 100755 GIT binary patch delta 50 zcmX@mB66TbWP&EM&(rVIFN(8BG`h69Ft)ldZFOOO7|3Y3T`ha> GYZ?Ho84%L| diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 6de67d735c62e1e3da94c741440947359a41eda8..81848e47e9d049d1ef9d2b39b04bbcf4a85ba0f0 100755 GIT binary patch delta 52729 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 delta 52409 zcma&Pe_T{m{y#qFTu?>_9SRTxWE2n(j3F^WA;-iT8%*3lu`tK-XX1)w8*UiGhJ}S2 zdewu4hJ_n$SQzNwhJ_mz?&2bI-lJ^V^_zej8N!if4t!2AlwT0#2`=T^%>^1wlOUK~2%Au$T9jwIlrKa1PEnrg zQa%^u`J%kYr92+x%SCyaOL-v5(|CCTq^))#5D*eXg+^!j7uQf8EXvQy8UB|@fZQ%e z%Kfj8l=sci%In9}kt{hp-~&=xdp1BKq)BcIe3|NcWb4?MNTYmZ>{5~_rv^RhnPCgn zc(KNG$t+(9V#H6*4_-u8%V&e*v}X!uYP<@UYIMwa9|$Q00di8vFG;0b6*7Y~uud<@ zU;ZhinigM^tHy;9t=uxs;@M=D7W&DZUnR)tp=0<}=1DmxbUta78$x%F7}c#XZ5tgd zXB%ROK`u5-!T$}0ND?kzF?^tn9iW$ww~$=9V|*ytD0@wq0i25e^JUwFM~O{7J7FzZ zAe+Kwka9Uc>@oUMuiO@9A!p_4$O-a;;Yr#|*hINmdTE|q9R4nem5mY46P;WY@fESk zMH6R}Q*!gf8QT05gWfACdUzDGme4>sB62!;PPRs>4Lzb zCchtb#=9QniowNOeH!GF=%AFQff9pH3uG9UKLX}C;=ATJn?^HhpGL39rSUoIxX-BZ zxsYPgdn7*Xb49)qeU$oi*OpHjO-Qg@9rJ}}f?1jwEf>Xx;kpX{o8^|+Y1$H1J9j12 z>L!0cFcJ;-#E>evwoTzB)l**g zTkhoFF9*u=NL=H$QBF@-i#8e(g1p`6@|A>V{Tf_qG!E3rnYuQb&zxa=s@q0>7YscS z(}14bYwfu21=3ubf8SC%)lKtC{o$xT{JSPsJ;xh-+{Q!JCk6T4S@Wi(`>9`dtu1Ld z3DhQ9H5#*KbBbA7H%rA~=gd;hO}S!vB=MD-r(3jeDa3@bV{-6}Y0z`VjAs?Q_$#zm zmi!9Ikqs&TBgM4=_s0>>s-yyqPPS$F%TLaXqW)cS$;?-xH`@v{UW((=w4Bek2IXNk3`Fv4?P2C*8ET;*)MlK zw2Ew2N(;@8z#FuhBfWXY0njKKdGUa3dU)K}w^Q<84a>`46O^|(%#yb`_0c@D=I}wY z^u!(r9wslH>+2bUlEeJwN$({Mxmn6T?I_z0AGjSp5S9Jp#<>r>gb1TtDSSw_nvA08<` zW(gsIa-L;2IVm?-W(IC?R2yhYQ?t%2J$?e6`muEh#9yA7=IfJU)_icf6oXO9!=v>0 z2DBU_$2A9gdKj$%Epkm-WZ*H}GZ**hagVQAdh7;^j zG7OqVZaf|eMc(bd_^Mg+{&UXm9t$)}i_gf7^Cr^8H{_0aGkw;WHQ%Q=Z&u>P0NZy2l-j^{aT$qE9k81rGwh#_N*uTN8c3I&7GA|Ra&q{&R87Dr|Dt~ z@n*sINny}-pzQJ3CHT%OkIjUy4S)O-&v^*7dPQ&juWMy}_H4wwjBMtYIyB`8N!_s| zbm|7P=8H|dzfx2*OAj9aTV?oNY}TADbSdA4a+|`7Cb(42Si*xw-jX;3{i-Dokz;b_ zl2D%oj=>Z>H_L`6-t;-g&DgA2a-5HWS(=L&{zM$vCHFiLN|wvPOGC*XIeBU1GO>gNxvI%wdX3tlB%#wLQqNcwWT$BROkxQ4(CPnhur3FOKS}6&V*IQ$u z-*W4tdLu@PzEU>{+l{yex)Xl+*Z$ zC!SnEHmZ$YdNLMr>YkcO=E!MJg?g_MwHnM)>JmBcsb@)I?e(YD5@ZWmDV%Q275EBi^kY+e;dT59uFy-COw*>}w&bX+H^*hT|t^VdwHFp;{ovlZ6{ zHSHbb+Ge=8wi(BinLjhm7pUr=eoEG@ zn;$V%t-f!Ld-dsj-tp*w`8qvQwym4#ea5WWcRK?G)dseCnx$z;X6e40X3e%}Gz!--EgB}P zlN)Cz$TizN01Nsa@8uA_;W!t1ygj<*#Chr`-ChX+B%c8v8L-PsS5G;oVVW*ikw{ zNtG?nrz0UQfBproue?yQS5C}(j~tS(NnX*Np16{M+p+c;1`16X%b(UPmoo< zFb#=o;|q_&mjvfeBk6KR{(SFvRTP3i8WSPcT%H@ThB5+!NGh=F%qh`DztPW}kaHJxtF9~aO(9v>p ziWSM;+OXEz*53@5{AQV@@kh*>=Wp<_6rFa+*SEw#DFH7}fyYaGIg(_{8(*G3waC){ zI*&&N;XDkM{@(^d41?M8$-`#Ja1(7kCxllQJJ#?bv&7Y7B#f}`i42!pDK{vx%0M6#S)96BCz?-z?v5An5aol7qco;&3lw6slbEnWrZ znYcC7(-Xa^k@ABLV+61=q8FE76Hy_T zy&CCv%0&Yr3`Nw*XJ3sRzsszdI~CeS!@;K^iypF2XRwNBk%M1*kw$dM<*&s+_-6bc zEO)*3IGH7;4b5a-apmagyD$**OK;7s<p)Et)HbwaiTs(K^|*cT8ZoldUu^QkTkBv`NkdHN%C< zMG_kv(W~VOQ1e}=TqM3I!=6iYsoV-`r3;lyBsMRi>v!xM6WHQH^afF#2b$=1*|^W2 zMt8~PeV35VV_%|n{##MQNM3E;fxCy3%G#3Z^`xL~sE9FYnVX1{>YcqLV+J}ldM33x z%V+TI5Fzv=mqD0;_~;n@7>&#Q$bJhPdWi9LA?!y5VGuDuzsrf6dFTnN!12>r#BxRm>#JXjr)mgP`^BG;M}*t1Z?n>pzUqRt;RGe#j8*FMPO`T#(JR{QtVzr)g}r zY^aMw05jJuA_27(b$1hzP+NE8B|_3_6YYN{$f!Mztw*%jcEupZ{BjLHh^O%+ie8a_Z-6$DeWO8)Gw887pVMqmRg~pZiY;yy4#Qh=GpP zA@(?h?L$8~r1=pTbx!j~7@DY47N5h8ZdDx`i{zqHYoY7TQ`6u{qyAKjEyfFfT1br@ za>AeQ$4~9XKi3W;v9(cud!8ZD zOqDCzA_GrZ`hQ--vqi)!zAwf1@4U?PFSq3OwnxblR+A6i*O-IYU%lY2UpOC&owlm; z|3dCv_T^d_jmK9Xp^wI|WK6S+3vsxo=t2Po&EsMW_%L3ak6j`gaD`lb@ms{l(y!NI zUDES)7(%e&Ql!s0t{+SgFC|@&B2LR$m-zD1b}4TBbNTzQv9URb4=;u`Vuia_rnJkg zm!|lPcP~xwm3`aihn#SfIwyuHT%8yrF3Yy|NT282dk$YG*SCiu+qPW_(3$r2XDbZR z{;4}IFT#2(>+%%HQ*xQ_%{E`2k9Z&O%?wDM@y#ksnuc$lp%ZS%#&2hk!*b5I|D_2% z^71S1@+I5V=b`qZtIyD>-E#NUZ#d<`ckdv@s_3JaS9FM)RkY5ztm_Ie!(Nw%4aW%#|QH-_Nt4+kFk)x}`A~pR@ERntb`I=ws z(Abp}TU+(dr}#F4t}_w?pU@dc^tH=7vG-mfufF+~UyHM~q&AiDq$_gpzjyd2^*Bk> zJygA*WnE^{__v`f!MD3Fy8#GDcI+&>6%EVcgSsBF>nnYx88y=R^FPAxzdII zOXbx6Mv@je=f5%dzwE!S(izv~@c+$*a#!R3M7bLOXULuZi^Q@xpnDZ2kga<*7Ew*z zU-~C^IT=aOsEnlOkj(T?r)q0{eu|<|-@c{bXk%X_ zM!LN3T__~A{~hqs(f<(%-&ILazN>}Ui5Dv(dF3Cb_?bwRwF5baC?A~Ey@t`&o8=7fm z6~oX=9!ng4=U!%(vyS0p;hlSFW;tHuKSaZJE-Zpy+%i-Ah4_2vg<|>>|*Fy-e{;Tks0;m&&0}l z^yG6A&YFC`0G2uy)Q#-ISn?7nW!4}xU(JexNEm8V2a$zzb{F#qCev_h zaxi(8#Il-T^l4^Sf^n;r=|af=h>dxSBQwYvW*SGZHOj2xaEl+m8h202A&2>FpQ*{( zzElIZVk)z}Whyt*s`Cz7vWD+RrdG1{al}HlAj$=?heAmJS-`BJB#zXv(ok|AP3>gO zq39`!c^J^ea+YWSYe_8EK*l5uxIu@*vwZ@mdI>ul^iRhf9l6l5K+87Mvp%fRfG#ex zP6Gst=dqO)j3+z&hEy`s%YH0s0*Ul19NeCnwx4IEF~pbUO(2hwtDNnz?7InMI|*Uw zlgQuwKfXhqug|mO7;?Y=$CHP)_w^Ru-UIBXaFRkcFhdj>JNDch$9+&{E|j@Z2@Le> z6qXZ#@d$z9#j=wW|Ig|pThb67$w`GAzLE3udx z%`9Uwc@UWeE1ygz(K$V=c`~WR0O#LBJ|fvHF^+&3SvoTZgwfhTGFwkGhc9) zALeUGv7|G1x|H*^q*(sW^>8W2T5@1XH#fkAz}J#uNjEpvrJS!N#gY!sI_eV1CF~0D zhxhZ}@?)(@(CVjh_KZMwdOA5s=XTojW*|h6DEozE@`493*|TPmAWE|B8)suGz&4vx zF~h3t*Hg*k6h7Mg5cwT_xPx^*gxQ$SjApnnFIH(L7H^lGLQAq5A1!7UJQu;Cm|d7l z-i22!dKlG=yxM*2r-$Ka+E}9HPIW^O?P@HDI?2qK22L_qQ5qtrOVX59qz1jTQkF0e zePpn%d0?iVt$qZasfCq30@0IM?tGB0LTDOC4 z)XdYUIoUif)|HN!lVQKU0PzhP%6Jq}j})<*3`~th6uh>&MI4x)}(vq4N? zJF`Kwvg9R*#1+ir3GxtnOM8O6P1Ac=C%=qhiA&)?R9_10nU=F~6T);hf73 z5Aw_sXBnU0>lZk#&Gh+O%(NPwtC)4ICU4@WbPahAKgmxc)Rwd2r!h*6_MWFXa~JIT z9I}wmUv#t8>yT6Uve;jus)@D#64^)&D_f7Ba+aQp1g3>mnjDQr|W1l1cK#pSfcpgp_CbuyUelvj8=Yf}Omaz#cZeSNS!49vm;9o;; zb;?;2_S;{R$;8Xv@N3vRNn`CVkQlflT|R6u*Its3Y6ZnZJKU5 zBE3ubVw4LHv?$!Ad=|=u2U?WqQXY-+G^L#>nnh_Y1RoHD2U=uxmOp(P<-!9k+Q?E1 zFb(UOVT}|or<4q5**5YpUDVA?g(S#35w|My(WuEXu~r*K%=~{)#<7Yn4i}91l68VpbS^1Bd74x5TR>Oa?SR4OYzI!YF&t*~k zC!eMBpCXpWe@a-zR+!{Yd&^d`l=``;PT_UUeY36Y20k(SOnc98jZBo(tXnJl^^ zsgc#oWYwKW*&2JoPVz4TIl_0t$7Qja-IyabmdNl^!5aAw;zb#L+F5HERsq>PENc%g z4XmC2B(v3Tkk?VM`wckOTxNX}k*I_|_Boxb$M_HHf+atgHsN8dy^eB8!Q69flcXG2>y} z62Mj;1}&HEJPaDbKc`jf{t*Ayv#1Xdo*S6?LuEBy@gdBvjp=I<T}M6- z%r=vwmw7nFh7o@>r)u81dNpgWLp#~b>j)-F6U#Y5Ceqa%Z08Y7A3f_iLgu6Yw4<0X z2G(*EvnZUI?NFYHRoWrOwHxe$9g`!2Ew4vAxvZp~?5025V&TWY@^+Tae~MZDF*412 zr`aQJnd0=VYsy*UG4g3a_E6ogRm)s-Z`3^P5(?sAIF8`=w2Q^Yal;W7{`5}gjELiQ zBP{&sDwlHD%|P&by1|7Ihzi2OpKf(2Cny&d{`3`R`90TAE-d`%ZkO^iC>IvKR_9WF z4CM|BUu$q7><2+u_}T=Q@~tQr7QWWZ>OO*nmne@^WaD-ntNDTqV}EHNz6HPS7^F^5 zqehgusdFth_U;N$Mnbdp0=FZh@Q!3-?axh@+xN|fgU3w5q50v3t-x^iF-aZim|qwf|N2Q&581#Saw7Z}Xx z&#L&BU`SukEG`mo(I9X-aE-t@z?A|Q1D6R5t>{Yxt^>9S%sbvFFf^oJE$|iKY!$DE zR`lsAE?6Ioi&Q}{0w)Tb3LGnN7O+8J&XBLboFOlP!O-X)f$M=g1#SVpA~1$&beq6k zz%9uIeE&<6>x+v_?TqiJwV|10kR^W1hHv*RmTmoDqa0PIlz}3Jx0&|9}0yhI^ z2;5$P3$wW393`uGgBP$-;Beq@ffIoP1cp{d>jdTuX#@sCqq+o!Rz`IQ3?@ch5V!@n z6}SM>Z@7YsCPC-{u2=ChI^b%74ZsxwW0*$m6c`#BRV*+V8kH|_4sfo(HsIv~!(c~c z2@Hk`Mx}|1HV{k#cLOJ=_}Kv9D1j4!g9Xk4)(e~m>>+TmS>xR;a2fD*fvbSq1+D`= ztKb67v(30@7KAq727x<(YXpW?yen0_(HFQ(;3(h{fs=u40;d9R6c~(puND|u@y-^w z2sph!TtF?}sRGvkCkosI94l};ut8whinp(dpTjVDdkGwF*64Z!#xUtR1qO4vD*}Td zU7NrKFdSWrxF`m06c`NY>IAL^t`Zmw>BNzgmt9vmoRFCktExY!tWxI9%X5-~fR!d^(-LoFR?Coo3C*E)_rT0o);Q z0PqEYW8wctwu*~X5Sj$e2Cf$v8X8$GFc=zHAut#kxl>>;G_qJ=Ff=k>U@$Z?S76T2 zauw%shO#(@|Igzbr3peTut{LfP=dgmp(ufKfrAAu0@e%68S)Sq42|d(7z~ZLE-)Ax z(Jn9;8c}doz1ZZ1i)Mi_W+NH|P5`bE*bH1LuobvWU}$JWiNM9cHi0XFHwxScyjtM1 zz}YG;*wlfGbV29=PF3-*^}vY&hXcn7oCs_XI33tm;MKrh0_U4G+8%*Rfjb2TL)t3> zgCT93@c+MtTC^>Ka2>c&U@)YuQ}GKr;3|QkA#J(9(2%xN;56VOfx(dDpu-E$kTyq@ z+kmYCm%{&x(P!40#m`+y$Jk;>|kXT!Ev2 zmkW%cEbz(_7iJLB1m@hC1m?^o2+Wy_5_l(Yu)xrkmtNpTU=M-Y%$nid0$&HduHqLp z!0iey(7XtB4L>Ug;lRxTCjd7HoCaJY@N(cvfj0t|30wqRA~1$>xJ}?X;Ee(|1FshN z0&uqQ|1V-L4o_DJ1s=eu0(0gP1%~Q|#|oSbY!Dc;V7RZqtAV`)hPHrf48wBRk_zKL0@epSMgRoaIU~c z_HHCP<}?F9)iSUEF7)x;p~gn_qepar^ea(o_aZVOcbm8 zf{ZEf8oHVFhFa#_%!0ssICDbCJ( zaB__xUvMYytYWR494p9I+{wEy>~44I`no%{B9$3Axmr~2awor?#jKp1CdfVRZIXO$MO}TDd$nUhXPEHn#Q(t%Tffi=C403>|9qdkix1ObQvX>z9 z0dZ;kU^%mKvQ3a<-O2A^*OQYSeJ8k+4>huOPHq>qxfQrHUbB(uzX91HSgJeu@D*m_ zWQSVP+{v{YSuQ81i^enD$w#7C#W%!%?2+q&p6yOQTF+W}^?X5I?oO`H+Wjr4MnTPS zr~Uz_95}gEkT<%M8)}%9lRX4E-<|wP11kj?4+g5f#e)Ge>*O~(bhy*~<`a0ldIjV( z(N?)T`BNQB=i~}Ou5>4#+{tX5Y!&2cck<^MtcH`z1-Whzxt+ChvSaic+{vfXnEoor z4iz@JlfUX=CQhysjkmayFPc~`C#MSXS$Fa!J*(j4D}sE%o!pM$bFF>Fo%~JI?(a~! zQLXI3U5<<4eS3i!Ik`%--RVyLv6Wdl*&%kfJNbr=m3{}yy3wgtS8@@T*8iE$8hLf0 zbBTv57jkDJ>*QqROC{T5B)vQN-@eT7J;=fwlmy77c2^Ng=j0mEH;<7n7~1jwSycje1(+gUi)^lsFsX!Dc;cA#S9&I>Sbf54m6r5sNCBzjgy6iDrvimRwg8{8cr6DRjP5X9g)x4IoV4zUhhtx z*vRxhg6!bD(VaZ0jF~vuq10w~a_n-J%gN!Q@m6>8eTc$8V)FddBj|1J^h7Ib<<%X6 zx4V;*vvyy1>AS<7no`b;oE#nDbb@t0O#Rs-x5;rRUSCa9?dd;} zX&!!qkL(};eY294_bKN~ZT;lC5pQ;=Z9KDeS1$bpeY0y<6OALLU0rl0JXQjsFW>}A z4gb-wSV})Z9KKHJTM(s0qMwo)d%6dGo%l5m&3^Ybvo25iJf8OF45N1Zgb$~0(7he3 zaX4L%BWy-5`YaOfN-v5tgH5bmOD)7`j~zjAlr4>!M$&)bRG(2t|AEs#UfyV-$=>Kq zUlGKW?ETSnt9r*uwogxw5oxA`+i?Kj*y)=zEAlf{0={gxA<_1pT2_wGvQEo>wm8JV-*8HRC3zaHZ>O{L zv1scg+c*|VUd`&pqMssW2%?Yj!XQ+yz>5I%CFsl;OrHwDS1D+znY^kTbr!GCI2)@8 zMq?}3*-BZdh&Uul2aK)ofXq$Z4hq|Hk*@muC^wr>olUlDDodOdHC zJ!>Mhdyp!okD=f56JHx?7z>J}rE1Xx_Lo?iL*MDLCr_sR{1|C+9Gx%WRfv*%sf@## zhADIcrInp5bt;A<1s{D0k;svAtYj(;!q;Ea%RQ`lDu!pHJ?B39nwMX&VtDvOQDG$3 zPs)n=cfm|Ilg`IMDA<%gduArx;84jz6HOg^pj$P9d+`M;O)!qY>QfAQ&%`yq)7k4x z^dpH>vfNZCv)*2wN@r5c%nJ|Fx9RUXnC&5$!d%wz5S^ygsEtfI!=lWvN}Q;{5m1~n zG0es6$Yzam>1=JedQa31<&8GG@nQNV#e9cejI1Y({u#KUlZJb#e80($@6x~Ga7tr6 zjc2zW!J%}4PtON-Rt&R$o=(#x(qIqBz$DT(s{MqlQ2oH~Ga+#e3tmXy!>J+6q-5r? zh<=WumPPdU?6ZY*2HPA$M>05xd+a}CQ9nYwjy{GlVEv0}3Tu6wuGJ>0qdMl0JvE!+ zcyt=8S_0{Fnf?j-ytYj3(RU3ieS-2+%_yC~9$QMUkqa!<3U}eb8m+j|sNU#vjG30< z#&ljffsJ?)H|DdhC(&Xh%YF(swx~Cb4q+FbqQ9dDJ9zN~_Pgb{Q_o6Q;Lb#~^4OI$ zQ@dQfU02BRR-)Y^yI~cLl*ZTa;p9_9oM?u_`@PF{!0%hw>Zie+m>~<-($o>Z7v?ZL zlckTK{`NntrG*|uXHU+h_ySluyS@R6sj}OifuDoF!{E&r4x31OfgYvr^)Qcox(LIb zolk?jS3B3_)izd?kBWDsm^M?KRc7UzF~?i&h8O7=%!WHPVJ+Y{+8YY!NdA6OvyI}_ zuicMfK$jQ7X(ZcQ3(*IB$nuv!DP~PCK{y;7ETaFVhpw~4EwtZLW9bh$$1+}qn>Df0 zm+6?ygRnO*qjhAOrGM&TyoMRY=R6M5MOpf%9KeewcxU*@i|{$C#e2j?93WE;?OA${ z`|)o+p}z82vF$P6bR4 zCj(jOEA*l0n!=@;*unyh5hLd%oEy&;FmfMYOUtpx@j=?|Vj43w!rAbYb7(j~G#r42 z$D`o@v$Sk6YF$BVvHVPurT5A;95$t4G|R@$+$4VYJn6#Rloe5o5*Ht>}z zD?cQ)5p{c6GrG;R@#b(C-YaqK$h6JjmOQ-YWXK=J-}QZRmXoD>Z=$(y(Ofv1OF?tt zXzn@uCMM!6TVjPq!(Rxs^asslCNo8bx|POxAH&yu`td@l4qa+@ucBkv7h7onpH_(F z%=jve3p|9Ty+qSqmj1ZgXcDggFO65`JjFX@rLWRg=?7<7@M|<|)@3JG#uM&B#(Aqk zJ~0P7#8xrJ2FE+&s_JX%ne8>|PrveJWv|h-@p>+Fz9;nAAJ>cK_-BedVKVqk(LHm~ z99|q>QV26q&WBlgzdpk%UV<~PNn}|iu!jRqZsN9}x{EzbK7;D8hb3B8Q34N|&Gg%7 zWKtlvxfI1O*KFi(Rih&=2On_WF$R1xmjeTyJty%Kv0c_!Q^s<)!4Bux8@3_$AX8ad zHwk6`dV~%iN7p!lv8kLhK5Ht!#z5y=`h5?xyw?$Q8d=5b^dWMPrQar#*``csw1=hl zr)4avlv=c{=ntx&J&Wa+(x8ZAPN8D>+ssPn1Zz4=fAkUDijR$C-C(%~@QT>F&+n2y zF#E8cQaWRn4q^>UT=Pu;7mL3zhcAA4qAlbGhxwXun9=qP#GAxNT>18j+GZ3Vao%P; z%iB(;%`y#bX7RQ=G^2c~1X?5Na77iO84TB=W2|#Koy|VjPJO5HkB>}6DlCPcEv#X-?J(3aV)wz4(dC3%N<(c-?if7##@45k^H+>7`KIo zS@#Zv&Qr`LBiuH_uVpU9c?egzaMxtCD7;nV4YcGk2_`0?C8#fR1Nh;p<1)0Phm%5e zlB&9iKDZC6%bd%sJL#lxhkJ0(X57QgSm;IhcoOuINmyqOd4gsv!{_~cnJr2haaYe? zcgvZvh9&NTks4LQoXEcr#Yc)8CPqK}rrKRbw55O4fq|;~#BR8?rjeEHLTb8>RrHdT z^cNSI{tf8wo!!((j*GI%tg(!ayX&VxHk&k+b-sa~)775CHwcCBo?)63j;jh;aLdxa zC>l7x-RbB~D$S2tfI(Co4(cr2&rD^AKuK!P=?8hwp*~j!_%7#@W!hoZS%!{t)s81P zMnZHvUW`Qg221}4;W zeEo{LP(oWdeTIJ6#?tn}D;`F%uC?BeGavndAb-qog#(m#J5FxMP) z#wHJSnEdB1PBQfOCz<;D@$Regkw#1ZBga|m&rqR9rpkr+B|0pMz|8GVF`PUcyP0&-@=D;kY>m{rEC8= z$A@ahGM+WQgNbxZd*`%h33#-*A)W5KCYG z=7Bl5Pm?{Mg2qbZBVR&9sc{oM!MyZ5=Jc0X&frT60qW~)Lp(6Q<&8kDpZQi~~acM@v3d>+wf3uKQMa&iCG0WSJy-(nSqkXYT`#!U026_S+F z%M9<+aZi4ioo6Muhj(XSy>oYQM@z%6Us)cjiDl`$z(>tERzau$cFe zlGT;)r1DwARy5&~v3Q?D6YyOr{5w;~e9PFP4`>Xnt7fg$7>5_kRfplf=Y;}h;Dz<~Y3Q;o1ALeBc``w9$as$J zDu26bK;HY^LCBUK8(uw0P__sd*JYh3$Xh^9!h<4RP&E z(V73fU(Fd*-AD8Yr6uz4GKljVms!nG^u9pt{mVh~AW+N$-utvIO7Ay9gwo>Gd|%^G z+IdAdr!x!K;OzRoJ6OeaSVcX=;I=)Wvne5i>~M_34#C0HGhAh3@ZAxfx{ioDKTtF0 zV>)SN8*!K2|FmErqj0812WOPd z`~5ZUc4#an;&B=mKgg!;cGy%k_9(XSF5TVs_v2aaaXMvz5?T40CK-QX0^1hINxnG9 zZ|4%Yl(^!3hivz)%4x2b(kIw|%?28nfbm+EjQd9wCCI_}=T%^K9Fx9AfyHEz~W zwOmmX?@`hGqw4$vdssce2$Xn!WdSoaViuoJeR*rId()#GHsq34;LHWz*Xa8>&|Qq% zD^xL}_F|9Y%uqJIUB_xpz?VCNYX4+-Kb}>5178A?--4ted3)>;X8V-iqGqsk;_=;0 zbmF~#x#`ZR_i?8VVs47golAqh%i9zk`bYE*?ILCw?_vy=DayJwVhwtTj90ve(Y(m?3T88gkvww_`LLY8%oq4dC zk(&kYtFd{+CvYNHFqSo5uw82DYbkV>b>uv8ek2Prgrw?>nEQ zsoLjMn^pa7I5T`k@Al)tXwdBYdM-16hTH-B{`XKnsqasChVdEJZ|hXM`_rJDQ|rh% zVRwtZ938fpng4`swVUG7hn4cngZwg7E9QiLCrigAS*Da?kzx2V z4GWCG7+QG;>KIBL7(>a@_nD`1mv@9ZbfY^hy>H@?!58T4*~jZuFibNP0`}ujg@6 zBtG3#+6sy?pYcLWgQfR{y((q1N>L^vD61{K`TJE$v_c7)tF|`6SJ;;xy4S1AhMFx* z|0lSOPtNgM$I-r9tojT%brdUYkDJgZ8rM3W87NKg-8IF>^&Xxqnu$=F8Pz8Q&_aMc zH`Vd`7+>>37o&QG>-TEH*!l?CHnscSL#*p>FvD9c;0th}@ITJKR|w$c>tsB48#6wI zdHebo)PN0v8r<%EMwN4Txuti9CvP|u4^BD7M+uO4fg)XfoU!MkO7&By*hS7c3k{!E zdHDGTtK*mWSQyvH&j(l!zf2LAOIYeTJlDO*(*KV3VL9i(?;iE)80+9yc+$ja&#~CQ zV@39nk9vuXfxn}jQ>>j6ud#Z51(V}f`*;5XCKRt;EMV#U>au!8SOve@&TRj{jo9Mg zSF_ZsWz5uutDEW-W*@)W&vM&vC(N=99V}L_Hrb=j(+Pyy{Zujj3z@&fU1Hd8Vc5UK z-C`JSVHo)39OdSFZ>>-jD|X?nM-9q$WMBI+I2z{$S>Gj3I2t4Zqwwvtuju-~ZI=GK z3HLqjPNaD+v#mz<;_c0H_0qU|k0`@C5JLL8#AM^kkh|uh{-8Mj`Bl|l>M{owUHv{M znBgMa;bNW}&SDoQ(1;NuPpM9`Qaq~u^FYH-&fMY5VA#tn+L1y;bcyq@7OG-d4LlYG!He^x?6iLk2oPTEQQ* zz}*E{`kIcQlQ7nQ3BgA!(9|lHKrXn-l3R^Wkpi?MJ6Pb9-5ZiO;yk+$BTZmmenaQ*57*&V&v*p#12}>NhEJq$@`@nI^AHNh^B&#nHy+2A zY{OXS|Hy3WIoY0k1zN^L%(#l+dzsm;;_?(LyNbuli&cHwqgcRq^jV)IcgcV7WaZz{ zapT_8x|d%&r)tEb%hGpz0c-n?J|2RM?JVCr;2+zkuyX^FV$PbuEYZa{c1UMz2fAb2QGR4!r)uzMdkP+36-IaH)TP|f zE3ESe>Oc03C%Q-$T_juj{<;8N;A4Y*TbbcU8ss_E(wjXVXW|r{*!a&G*7zfmq9mL~ zgN2Mo^EgP=)0i|<brLXUly4_K?jBg*T(w$q(_-pRmUOFPUg?;y48>)%gEeZ#d z{&!0x4Z4Bkw6B-%;}6o@hqqYyO-xIi-?<5gx?#wYk^b+1x;%`#NoUjl-eMd7jfWf2 z?p$3&9QrpR=y}$PpLivpI~~|Xk%jO%`SY2fJRDx9@O=NRigfpTgn9t}SYB_Bu=7=Yw4DN!9hzuKn!7f1pu?lL^1* z;?e95tlV1TWaTry@$bS)(?yk)F202@Xu#gTrm*7wpP>(d`nr#+i^=yhS!p+2IriTt zvGJ^ILAv|rL+5xTUm?+d&ta|J(ztPNxG%x_&O4T1khA&}v;GfWe~u5!`yZX~OZ!=| zg}}c6B#wmGyPTe=+U9y9gU3uW{SWtKLhnuSVkEh*#j@v*n;|6T_D!r?1`AugRS}kU z;t^XnlDcXfr|71u0ykho`6{pGF4ud7On)0w=%zACeE-dMn??q54X9cS9SGvs<@r54 z9q#sPT88GGqtV^7R=XZ(|0D&zk=t!)1t+{<^) zSJHoav+SQ~=&ZT!Q{XU>X9uF);b>{=0zJ}ANu19rG=9Mf>qV@PFYA;R(9$@Lo2n|2_4Y=gK zPAq==l&GP2jiX`hmcIQrSTdESE#n^0Gu~R?EoQ6Z zk8yg&8;mB{^&;k@WjH&bI8g&=%jw<$6ZmepK=8XloNQ zdPrkwf#;wx{r}a(&@uha#d_@AdYp&W`i^kx2{zL!2#OxkOe`7op3*Aso6dNAZHa2N z`);XT?%NgWM$~Kj-G}#2>(t@p6QYB+I%q=dOHu28bBHwzlOjVdyH`JTNK{9%@%?4^ zsxjEfP|}pkYVhO_mx_l=lOA~0$Gv9rMNyNV0@U-JRs8xY2jcp^Cqo%2->bAc>aw?U zYJP`Z6TZqR_uG0%Jj-blhi|&uR}B_G+`cY7 z2baem6!6s>5oo-DPMb&W699I+S-Ai3e(XI}#5V#KlAEERpA^+WE&3b&sXsrhC&L zA9pr=;pWh$cZfyT-+M*96iGBh8eBj zi~0`S}+)J)I01mgod81u!Z2>X>h7$cf}kz&vBhuiVn3R4Wg`q$)G|62N9e~wj+ z0Y^7jGk*NIf#$i-gOXjWXN(jRm;|q)=VZPDLFfE|oyO9)35)Ik$$#u7t?)Vyx?X)K zl83$d0BJo8tvvwtmdCmSBuhb|yVmU@P4{X;BSv&m=H5x(f}iAggxR;R{FF0%ckN+8QBr}tRujV^CzLvhX_%wyD z{tM2ij+Nq)@`jFVtDj;w{1|;-#Yt3;5+fUh>OQC*h3YtP8ibHs&nkkXu=ph|HBwN+ zc~rb_-&WKJH`CK6@bMZW?!&X1kG$+%LDE`JJTI}1hxd+U-P5EA6Pq_Vn|Wg~nsLbm z$_}6zILyy4vX=2uWKx#8z3_$)ZgbhNDqDiv47hEVrGG;_aGASJ{bmJ=oq!2&j_sU) zOgj}1D<()&v^IEkB@imXZenwalaVsVffQlejL&)4_GcTEHA^8*8iYx!Qq+?M){j~( zePxbSj(RAuZ?{9o(GDt-^GUlW8ZWFtuImYw$Txi7h4oA z`Ld-i&`~pJ(^aSFyZPX|O3w!J1)7UP+OY+#V$e<;R|YK~8(C&Tb$r#w zQFD-*&2*EaF&c85M=LH1&C&?8f`#TMOIX?@oIqi!e?KTRhoan2Ou#G{MU!p_+8jg?fa%uY~&?KGk^_aPzNni@;PrcADSIO^nYE zqwRQ=nSL~vb)tE^go)Rv#z)d)d<`Sa_BGC`%anhWvx+HyY#z%tN}sRcPd^ieuHydS z5;9&L6f(AokWmk>;Wfx>JR5>Mm9L+}xh5Q;&P?l%u#$M`*#*j`Bc$;JSFwMq{nl}uE}+&#KY&K-w8NuKP>EK?*C4%nAWkwWKf;i`={eB8k0$k42~ z-&H?o-Kwtl?R*D9sJWO&WtVyVGLOozxg&_mQ!q5ovET$`KAT+(fd9=)@Ni_FrLTMz zvnEJu@lI_^f^?7n$KCv08(Y6-bzvy~{t##86CKk}m8OsSxSL-a8$Z#RHCf2UpTeo~ z=ch`!+Hh4<$KcPVN#?ma{J@U)WU{nr z(rj&l(nrN7CRR30iX6DiV9nFe$Z|Eff9UBH|D~($3jR&JD%@c_mPv%8N>crO&B3Am zK4!bizTzjPyOX5H106m=L};7v2{ls{XTKKbT==fy2hZ_c#c|^n9d?&ux1wci{lKu+ z+-An<(u|Z!4CNiR3~Nq1WhmV2Eyv16kOOqb^q@6bfKjE_1`-#h5 z?@t|3`8aYieR#%6eOV1BO)KI?ah-wnm5$Z-u#xi$h z%8JjztVAe3ybMhTxV!(Az3M9Fy>-qsq2|2W_DVciy&t(5&Whj-p(h?yQf;S)-F}UC zg{EB|;xg0Sb`AGh>(^QFSiyK#}Ka`6Ipp4@K;E`H6OC+6%y%-Qz~hjOtzL{&zWOU`sirtjkE&>`-P2Mx-Thj!0`GD4inz*7T78BgN8 zs)F2!;NQC+@lw~!8?gErhn z^Yz*8F4-$fxMXALV|YL|SDG<5YA7rF_d8j6W`Vn8xqDT~-a6+l+5e8Hk}bbOb6nv< zvJDsACCiOgC3}l2Y>;G+O?60?sy%=vRKc+S>d*hSl$QPYu;lA=(p|bO2vrv8p(NW- zHr~4GWFvQ%yHvlttV*>n5PxS49v&z1F-!{@?$8QXu@ELV&|R2cu26;9yB7w3hdtS> zb?SPp+C%`8mqp#$ zgQ(^bjMv;kHB7%flUaVcgg+&UbmXzIPv3SQiZyd^7iLV^W)`~u2~jf3UV!Nws0;vQ z*q>SeVYaAQ%I;gLG&AGfrP-`Vhqa@NG=CIvXU#l!X;vxgE;HSI#?rR{>*I8En#G0j zpIGK%|EszEyGXN&+drh)y^NV3g*0XAL)+CnS9Ng!D|xO8adshBeN>7IsZkS&aolVN z&6@Oi%B+dYlq$xCad6v;KhhV_`zvNeznKtxW$fm-a-IN2i<2-=-7las*9vh zA0=mTCK`FSSrv-o2ia4euqU3{?B*%vAcoTRFxx78_rRDXg%;Eg{cO;uYMI+dGynMi zmG}K|RaIHv_x!qC4DFz(*F-^uM8mjFl-Jb25%ngRSXh`S;IGh7QL!*lu89*hSg6#Z zh7uc`=nbFreayqmV{bNE-Ug$$MSnJN-iVA+$7kJmH6S=Z--ipD*fkg3ZPoP zr@p|5aB5A*`~2e)S!Oi{N_1{BXZkvDiKo9vn-v&C38|8A2X9uHnzwfT3i_+{)v0n6r3 z80$XM<{#eyyk+wzLjCAB0B_m+36~#!A@G*XpGfe-PY1r+=1-*hWsF0HW%DPp{qO^U zw`~4|w+Fwq)3o`mt4y2U`i*Jx-XWIFpTHLbS4gj;+v`@K+Yf5(E2L4P5J{og((WmL zG)y|f7Yhpr!h9F)f)#9Dg69pa&zpF}&EK&fN1pi^q4Ms}cKH&hH5;SoMG9I4yZw?} ztE8}bL)gJFQr&Rg9|h#(KPdm05)HqU!K!@(a7IV zu2L+R{VP6*kVE*SF1hx@!Vd9@T{Y-suV zy!#0QL%YZ>qQcdv_@`908e?T1)vw0H@g>Etk!~AU><$w`d+TB2UMgCH_O76+HPVvE zg;*b{+z%dcVb&^sa-#kZKGWdY zlusrxO1|ea4UCdJ<1s=OFtI>5u)8U45d9@b8aHJb0bx5R85~uJ8`#Px8OCsX&=(we?nO zuf6&QI`9~DkqjBewj8a@N1fMF6VSq|&ux-!8((})W?xQ&=k4q)dhF+`t-!;6R^z$q zP3ZetD%vDHR`3C=v~{CJ%F_c(?b16Y>8dBU#@Q+@gYfIHRlGdrM<|TfJz?=4lcrWi zIb)ZNdX~dwR6-nYHZizb2ck^Rv9x|E6L`E%Dz1ve*T`@k$QO`sNgr@qukt{7-kzZR zS8t$v&uyZ9NdO+ViP`T^bH4NnChOwO(zGEHEiSASKQ60QP|Id$4AbxySQ7Fl!=}ZIveUQidPT6;Q@jQyGs-x8S>UhPV6s zbX1-nl4m2BoTxYNgeoR`#E0fl%Hz^~I8B4jM*gZR+NfwoZGu_s^L;25ZxxGA)Ia+M z#o|5Uay~CX|2%}RuRV?fg4zahZj)Z>U)$s@5Z$IOL}vda`L>}l7}wiil?y4TP@0J^ z8>AFUw_xyuiBS{dY*F2#9DJu!X`wWF;O6ex3=cgSE@FK6$q1?|1glJH0|;yIm^4z4g)U(%`_IrrJ*)p(Z2;8YfXPUgJW|bUe0`wG{Lll>3gN8Q|Iu zV4!huhF)fWZ!8|hhkqDO-rr#F@+6gkVjMr?2DdA=oBH}NB~kyBZJ39oHO`vYhA|`; z!-jt&Q9(AeKHX{;Gq!5*A?~&vj?K5=y#sVJ*e3RNM~heCS_U&l(>q|#H|cz2h4+sx z27^5&mCUndRRm+%g^Jd)iB7~*OU%dZ#r0TZVxITna7Pfos^P(BJf36o3*-l7PX49Y892Je=-8Kit>mVpIiOY%C(si z&YSy>((pUW(x|@sS!d(JKk{Nkx+#9OG?Yd?DTNI5pJltn;T1`UyC?HaOWZ(+^Yil; zG9eCrJ|of+XW8#Zhfo!EyRlY(#3t$&*zICW;lT00lhW^Sy_WQpG<3*RjP}WucPU@hN9a4z(+aGle7nX!Gg; ztsZgVR6qOZ77Hx|w3y>M;0kDFb2?G~>jpH+Zw1uwHmZje(1Pt&eJWXwJ51`ZG+V$A z2n8f|WxnlaTb341Ihl|d_gHPf71L z)DU`7WCjIGYsV|nIzNaOfC*FW|vr!K0_7-fUhG(FCoSOh-&c*dIUM;!ydU?Jv z35^dwRg8XAG0r0V$C-JR_@HIV#t^eqc&e+ zKB_H2FOH`+rs#HgZWcVn7*eOMP{dB0*2I)bljzdZl8}6~ zYEK$`tl%xZPN#VdoJG5990})9woC3l_l!1op-!BI2*^vQD>9M=9EXV}WO-nIl}@ zJu=oxXV~BHS-tfw!c**TLOfy$mNm~xo2L6M4^kpQdfoQNm2oBo{u-X~^gI@9dCH(f zy>72*x%c5|@#o-VQ?(I1UIMe8d z=NtYjY%wm|nRY)se;Co2kzBU=AU`}la&+||pg!C$V=4+%n~dsX{qSReFSYOMv40@ zzn{gH@3IZL)hzdy5DI+>vRBdMm!#hg%(TV`&$+J2Y^@o8nM{o@Nki}EOLShz9fz+l z4wU#p9E`gsDE}gbiTaOk_8!JR1e(Km7FM2nuyXz3XCyUJ{vPS3v9p3LQ4tVjm^j4v zuXL@NeH>0l_n>AcO>&{Bo7}9KsWNsEJ&pMoi_0I*p=N%2u=YsQ47=vLw^Kxgbn~ED z1Fx^z$Hyt70$ZMOmZ*4$a`V{mh_jx*p1c8m>xU^2$oa_7}m}Zz=ixmtc&gqz8|(?v?Hm8``L1FSuOh55$k! zedGN@*gpH&g~Mp$YzlfA7HN3T-WEAy2e-qtigS2W^JQ2CK4kkcCXHxnco|P)zG@o8 zIq2|v)}h}T{yWwo%xuQ?-A8{tYWLR{hW7t^1?vZ0VdIA@J>v9}l>2*W?8xbc)%KP> zJS;xfRZa~}M029tyq8-z(X&NpTd!M(V z2Gf2<#nb#%+)Szaut6GsO$G4b+bi>XSKz<)Srt%r=WL6m_$ukfK-o0D1pKhXKAhFR zv-`j{m$vi|IAFq}t?m_|KIfcCG^a{(;Kh&bcz`%{A!x_b$tvk4VXM|sC2523LQ=(B zxPZ(g$5EWAVRLg-Iw6dB?rrHcoOxBhjXN|@a!NR>l^&D6?I)CJMW>}36`@!w`&c?Z zKsco3ekH956g*n<73tUjyiQ-`kY{4DZga?Ai&2FhVdi7E#s9PT4a0tMV4kCF9` z8K*Zp>qDGR?}%$aXrugL^1t;NhH?XP zRC&0AVu#BQ8tML(NM~zh!(|Gj+oFuBuWTk%Jzgu1lAjQ0^jHI#>(-LT$^`)=`()zoN>VKVTR=@FX`9FlfrK+3=#U$oZ zMWXx~CzH@WNl{u#l04@IdgTEw(>eN(R`-DXwNOy3ce=uRhg(C;^te{NGp5pv-@3Fn z&2?oCffjskZT#nS*On`|7V-Zw9aDQ<lP{eR{WlX7jIvp3?_ z$!0nxUrSjaf2&YprqNxV2D6I~Wy)>0v`yak zQiM>AP=f&Xu|z&xE`KHr%hfxx+z1H>@FH1h2w4bTgyO?5$rBs}sKN`yy+heGxc_eY zT7Lg5ZRgCg4(-SvSquxLsKdyzJl}9UBXLS8gu6O-t1N4~i$JU-S=Nb9H8Ton0>kclxOV7}|x{|EW z1lVGQcEIj5#~F{bUhNm$cxofWsq6jI5Sny-K!gR${L-9$7q5b@?dL9TpB1 z6q2EwDoVW|-z@f1$$LSbIR@E6s9!O3&>-0lmx_1`bf!|<1$hB}X)5UxdGx$?lz{e) zKU6^U>Uv}{Qb$b`S4u1ej)fob!&T|}%}|Yv%kv-89ntmCMUc{@P5qmkB|O(85AKUy zz+Y1kN)hTQqDh{B1JSf5xvOBs6|aVqZ}{CSy7+fF z48O^yGYF-yF90ejj)6+)4DzXfK`rfJkWFtfsG^GuN=avsPhl+vh-2WQbOt3G>=N}en{}nk^F_6^fJNb#gN>%c~7#zDf|BOhh+T|IFfux#t zd7YvnKVOUaLGCY^ahlNqbiOLp)@pBd$mbL@PQMeCMR-a0M^PzL@T0NsRca(DzZaBR zRXUwbaf))-ivFl5ZS$)kQ#mC>tI~&VMCC>!8o}6Fj-CqT=rN9-tm3F>MAMkI-H1kU zw3DMBl`z4-8`vzG7NGnoFk6+*V*G}@NZ+`Wm$B1UR0Z!8oUNia9m=;O%TT8Z7*h-L zI4z8YexaiwrM4T9QG;-lP6sOEM>eU_8JM{^33T={rW5yp?lY!4)1gZBAr#q1nWgv; zZK2#g%9Ow=Rr(7&!k|^OKS()958t2!DF#lVKkwk2$>ahP*swZL#lM{2)#a98BD{1m2upuO)i=fjBYcd zefleH1u5WScH4O;OEbFdyv$gm+dgULsL^fbYdC6j+xcv!HM;G*(c4D1UC3Ypqub8s z1+&9PHSg+g^a!^B)g1Y-Z2*)|h)|5o1+;O1QWoe!)k?tltLvH(G1ENsJL;aB7Is%`v)quR&>iCWeq&Re-2VY+0>h=>Bhmzy@7SA^tW1@ zE&S=LeXx#(I?;bd21PrStdR*^zb5p=b9vi+xRi4=ch22Ph04)Q@NK- z{i{^Mk^N~isx=Q$oWlGR6gTzP+{l~^{WTwAtf9XzV>xQ*uQ{BfhW_TSM%7MW>NAGC4gQVr)*Y-bQ>0G#WeIpwDLY2 zrYtXoxh?NaUIa@*2DxulF7dgK5{|o|KbtDK90QdYIO>W~E-5$?vOBfQF2yZa@v*;B zh6;f=&I`Z-^0r75`Is!Wu4;I@>fHz zLY3yqQSe)vrFf81xl{XatujOqyc#GD3MlzPu5yjNePjKG;MEzGFTEyv_C$sY!L9{sxgJiG9j=QS3irS$HFV=>jGuC_8;4o z7*QzIzIs9#Zk)~(Gv`VToEHkhQf<@I%DsXRu6_6n3JXpxcBe8+;@Q?)s_3YJ_gM%J zqT|mhw_(Z9{;V_COfM|owc4{(tIVZ#>pAVtR3HFip^L2>VX|)sVzmvxwLI>L<-03ky zXP}6Y?rWychgj);R=Q3rn`}pe%gJ|_J&dm|F`jI;8vvS7yi9Aq%YIRSk=uky6EBQa zrTLZA5)bmDz0p}q$vGA1h~DVueVS(~3vpB4G2``1{=R^4q+M_)T;0jZLkK@w%n0%bE5aVmjoW`TJIITAtHNLh(M z7E)OvNW4@75S$8qA222MeOVP>bx;fEmXae0v_a%fLh1meGN`1yB>Ql2UmKMrplS@nSR8%mt@LYM*OgEk4;oS@)u7G?m?J zUlZI6%|x5TgB-jJBIkYfm=S5JT2*|ijGU?V*A2AQ&d?9pT~k9U3c)bugGCDE&9^_@|8g4&TU5huSH;(Y z$oZiCBYfen#(h=6r4g)3!od7vKF9I+|;rF@|S|ek^Um9Bz%`Dy&6x> zH0W9G(Ls2NIVU?REwXP^5zp3VrJ;#Ssfa-oRi$BgmXK#51URT@Aq*v%S{5R&oE(e5 zuog3Ag~?!4uqqyd>2=%fsFB80ow~^AgQ`XLd&D0*sC|(+UIoiABL=JD|L~G09d$oI zzI4>R5In5rN1RcmUlme&I+WB%Q5ooyAgalL{3L2%kcQW5z`u|@nW$nD6=i}!GOWk4 zkI|8;bPvXMCWsoyu^4>H$-Nk~=whTss1R0UYBS2Cif?nrS;C{{t0L8tZ?Rz>&Lt=t zO`atv8%sr;%AgufB~d%4oD{Vblo-!TQL$<&QVPz;=s&kE3#rNR) zfJRG;7}QYJ3fO5lIah*n38k*YXoR-AIgS5VmDU_Z+VcJ5VPk!Bs9_~MYY_P!MxkbM zWP?*BMP(xuL|NHrPbj%pp&<#BwF>MV)UXP9P2^k+WGZ=9qhc;_%`kO#$78Dazhuf| zbUeCRHoNZ*tQ>=y@!AL2CyMYXa=-jtIO7 z0<;sQgBsSrP^v*~DbW3-Dg|^PZ5fLD1y!0CLQy#wEcnbtj(v+bwUs<; zQ7Rw$Og5R_dABM(TMGYIVpio&nAa;}IR0R;6i!!`Vz(}8TSQXEAV5NoJW^%5FE*q$5J#5NL4eOy&m`^U( zQLD*C3T~%;1Ni2X^ARxOerzxq#eIgV)lljq_PDvRKwDEze3B}D149yQCRzMKRXlP4 zY2I)^emtCSKNsk&nJa!9>H`gQJL~wJs(26%@)4MK1$iC?P^s!s)b=fjv6+BFO;$gIyypS`S!RGXkB+} qX6C8lODfXUW@~5uR+St@)Siz*A>`Z)--IsNj8w7a+iYKO_x}c#&R(hj diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index f7574accb30207d2f58ae1fecf6005ba6ea873f3..2d70b2e23a0bb36b459c3095fee26d7476891440 100755 GIT binary patch delta 40 vcmdmRKyU*P8D3}fX*RmP-RL@FwIXBg_H{oPfB#^#Y+v<}Y5S^=%x!r9gn|=S delta 40 vcmdmRKyU*P8D3}PX*RmP-RL@FwIZX`_H{oPfB#^#XkYb_Y5S^=%x!r9cFq#R diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer index 82417accf864055106df317805f51d83f12f34c9..03f2e951fbffd7e818b47191e5077e7aa875fa29 100755 GIT binary patch delta 47 zcmV+~0MP%;^$^VU5RfSYOy&5Ok#PeUfkcHw0kuQ|z0mhpOiSx2op@ FB2&bS5^(?k diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 35c788fe2ee750daa8636cd70614099b1cfb6280..2aa794e2da9ebaf6aee139500b0b7f1bbfa68180 100755 GIT binary patch delta 230 zcmZqZ6mIAgo}kI>^YqvBi_e%PHo7D{;dglG(8U14kBgWYc+O8={6y0vq>JfcNSDGx z2Br@i7!9}#oDvuw??2=4aEUJi5dVM7dv?L@g*zD%{y#Q4yI?27W7!7_6*dbz)$(VY zz1`Y`aXmL<@AlXBjP1%iE&>;JGVrKKT-eFMGlfyAeMU0l_8G}cg@+j}w{xj8XUhZW zGB;)}m+3pYn3bmYbunvAZ|G*0+y1JH`QTRGGzNwzSu6}s<^bsh+jlsy#H+J*0NFj; bWinVETk}o?W#Qe;xlH6jV=jKCU1G7;o{K6^w6P8;UNRlhYgGdTn0`F43CeW zad^1ImjQ_XKNdZ^VE4kE3<>`qTb*67li{)IgOv&n4=cJDK=`o>GXsx~z-ED`TK4h9?tP7@iyg(#N*%aA1j7XRQFTYqrZ| YuspWrZ2_`7fbvU#^os2~OIS)20P`?d{{R30 diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 5f5a1828cd5280a007530446291289d50b689c4d..2a4ab71340e3f5394cae5af15d756b2fb3339367 100755 GIT binary patch delta 221 zcmeBa7V2phnxM(-^YqX3#?{Oc8(mnA@H;&G5Xu0;kBgWYc+O9DKcZ>E62|n9B~0Pr z1jY{=7!9}#ni3cu%b##~C?doF#Qz^Bo?ozg;ZBBx|Bu_wFWAZOSp4=vh0R-zWO*~r z-Yze|c$|~5cl&cm#?wlSF72Cb7`Jb>VPZPSXt{mcUnXmDApJ>%+0Jo#Mi{fwbh|KS zt?3oK%zV@B!kGoO&kAGiT*J%7z;J|*h2e+;kapQ_z|68(l~o7GHrRecgQee+*8<44 Q0m?@J>6q;$Nh}ib07>dl$^ZZW delta 216 zcmeBa7V2phnxM(-?W#JxaW%8VMi-VNlOv93xO@m@diWt!;o$_v4;vT_xD1*S7#^#i zaCj&p!~n$qA7`FluzTT7hJ^o*`_3=e$?#bI_DThZhZcnSn<~VDpwES>BB5 z+vNoqk8=X)=aP)4l^E6AH`_37-)zIgbdb?v`?kMK*5W|=lL)h&<8+rWW{c?tVa!U? z?ZTM_w$BP MAX_ROWS_PER_READOUT) { ret = FAIL; sprintf(mess, @@ -4804,8 +4805,7 @@ int set_read_n_rows(int file_des) { LOG(logERROR, (mess)); } else #elif defined(JUNGFRAUD) || defined(MOENCHD) - if ((check_detector_idle("set number of rows") == OK) && - (arg % READ_N_ROWS_MULTIPLE != 0)) { + if (arg % READ_N_ROWS_MULTIPLE != 0) { ret = FAIL; sprintf(mess, "Could not set number of rows. %d must be a multiple " @@ -8472,9 +8472,9 @@ int set_master(int file_des) { functionNotImplemented(); #else // only set - if (Server_VerifyLock() == OK) { - if ((check_detector_idle("set master") == OK) && - (arg != 0 && arg != 1)) { + if ((Server_VerifyLock() == OK) && + (check_detector_idle("set master") == OK)) { + if (arg != 0 && arg != 1) { ret = FAIL; sprintf(mess, "Could not set master. Invalid argument %d.\n", arg); LOG(logERROR, (mess)); @@ -9028,9 +9028,9 @@ int set_flip_rows(int file_des) { functionNotImplemented(); #else // only set - if (Server_VerifyLock() == OK) { - if ((check_detector_idle("set flip rows") == OK) && - (arg != 0 && arg != 1)) { + if ((Server_VerifyLock() == OK) && + (check_detector_idle("set flip rows") == OK)) { + if (arg != 0 && arg != 1) { ret = FAIL; sprintf(mess, "Could not set flip rows. Invalid argument %d.\n", arg); @@ -10365,9 +10365,9 @@ int set_synchronization(int file_des) { functionNotImplemented(); #else // only set - if (Server_VerifyLock() == OK) { - if ((check_detector_idle("set synchronization") == OK) && - (arg != 0 && arg != 1)) { + if ((Server_VerifyLock() == OK) && + (check_detector_idle("set synchronization") == OK)) { + if (arg != 0 && arg != 1) { ret = FAIL; sprintf(mess, "Could not set synchronization. Invalid argument %d.\n", diff --git a/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp b/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp index ce1b75cdb..27b652f4d 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp @@ -705,6 +705,34 @@ TEST_CASE("sync", "[.cmd]") { proxy.Call("sync", {}, -1, GET, oss); REQUIRE(oss.str() == "sync 1\n"); } + // setting sync when running + { + auto prev_timing = + det.getTimingMode().tsquash("inconsistent timing mode in test"); + auto prev_frames = + det.getNumberOfFrames().tsquash("inconsistent #frames in test"); + auto prev_exptime = + det.getExptime().tsquash("inconsistent exptime in test"); + auto prev_period = + det.getPeriod().tsquash("inconsistent period in test"); + det.setTimingMode(defs::AUTO_TIMING); + det.setNumberOfFrames(10000); + det.setExptime(std::chrono::microseconds(200)); + det.setPeriod(std::chrono::milliseconds(1000)); + det.setSynchronization(1); + det.startDetector(); + REQUIRE_THROWS(proxy.Call("sync", {"0"}, -1, PUT)); + { + std::ostringstream oss; + proxy.Call("sync", {}, -1, GET, oss); + REQUIRE(oss.str() == "sync 1\n"); + } + det.stopDetector(); + det.setTimingMode(prev_timing); + det.setNumberOfFrames(prev_frames); + det.setExptime(prev_exptime); + det.setPeriod(prev_period); + } det.setSynchronization(prev_val); } else { REQUIRE_THROWS(proxy.Call("sync", {}, -1, GET)); diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index a1d345a42..04424011c 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -4,10 +4,10 @@ #define RELEASE "developer" #define APILIB "developer 0x230224" #define APIRECEIVER "developer 0x230224" -#define APICTB "developer 0x231108" -#define APIGOTTHARD "developer 0x231108" -#define APIGOTTHARD2 "developer 0x231108" -#define APIJUNGFRAU "developer 0x231108" -#define APIMYTHEN3 "developer 0x231108" -#define APIMOENCH "developer 0x231108" -#define APIEIGER "developer 0x231108" +#define APICTB "developer 0x231109" +#define APIGOTTHARD "developer 0x231109" +#define APIGOTTHARD2 "developer 0x231109" +#define APIJUNGFRAU "developer 0x231109" +#define APIMYTHEN3 "developer 0x231109" +#define APIMOENCH "developer 0x231109" +#define APIEIGER "developer 0x231109" From e57cf49c49ec0ff1587179565c726ae74e8e00c9 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 10 Nov 2023 11:38:06 +0100 Subject: [PATCH 13/38] Dev: trigger signal issues handled at acquire (#864) * if blocking and handling sync, only master gets blocking acq, slaves get non blocking as they are first and so dont get status or error caught when slaves dont get trigger (due to not connected etc) and acq returns with slaves still in waiting status. so check status of all in blocking acq * for all dets with sync, ensure atleast one master when starting acq * docs updated about sync --- docs/src/troubleshooting.rst | 19 +++++++++++++++++++ python/slsdet/detector.py | 5 +++++ slsDetectorSoftware/include/sls/Detector.h | 5 ++++- slsDetectorSoftware/src/CmdProxy.h | 4 +++- slsDetectorSoftware/src/DetectorImpl.cpp | 19 +++++++++++++++---- 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/docs/src/troubleshooting.rst b/docs/src/troubleshooting.rst index 164886f67..ee8904404 100644 --- a/docs/src/troubleshooting.rst +++ b/docs/src/troubleshooting.rst @@ -92,6 +92,9 @@ Common sls_detector_put rx_arping 1 +#. Only the slaves get no data + * Check trigger cabling and trigger configuration + * When you cannot stop Jungfrau slaves in sync mode, refer to :ref:`Cannot stop slaves`. .. _Receiver PC Tuning: @@ -421,3 +424,19 @@ Cannot get multi module data * Comment out this line in the config file: powerchip 1 * Powering on the chip increases the power consumption by a considerable amount. If commenting out this line aids in getting data (strange data due to powered off chip), then it could be the power supply current limit. Fix it (possibly to 8A current limit) and uncomment the powerchip line back in config file. + + +.. _Jungfrau Troubleshooting Sync Slaves Cannot Stop: + +Cannot stop slaves in sync mode +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +#. If cabling is accessible, ensure termination board and flatband cable between the masters and the slaves are connnected properly. Then try to stop. +#. If cabling is inaccessible, unsync first so that the slaves can get the stop directly from the client using the command. Then, don't use sync mode until the cabling is fixed. + .. code-block:: bash + + # unsync, slaves command will fail as it is still in waiting state + sls_detector_put sync 0 + + # stop should now be successful as master does not determine the stop anymore + sls_detector_put stop diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 95e3593cc..36c5ed0cd 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -1673,6 +1673,11 @@ class Detector(CppDetectorApi): def sync(self): """ [Jungfrau][Moench] Enables or disables synchronization between modules. + + Note + ---- + Sync mode requires at least one master configured. Also requires flatband cabling between master and slave with termination board. + """ return self.getSynchronization() diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 09c15f6cd..7467789aa 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -216,7 +216,10 @@ class Detector { /** [Jungfrau][Moench] **/ Result getSynchronization(Positions pos = {}) const; - /** [Jungfrau][Moench] */ + /** [Jungfrau][Moench] Sync mode requires at least one master configured. + Also requires flatband cabling between master and slave with + termination board. + */ void setSynchronization(bool value); /** [Gotthard2][Mythen3] */ diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index f53cd6407..60f3454c0 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1543,7 +1543,9 @@ class CmdProxy { INTEGER_COMMAND_SET_NOID_GET_ID( sync, getSynchronization, setSynchronization, StringTo, "[0, 1]\n\t[Jungfrau][Moench] Enables or disables " - "synchronization between modules."); + "synchronization between modules. Sync mode requires at least one " + "master configured. Also requires flatband cabling between master and " + "slave with termination board."); INTEGER_COMMAND_VEC_ID(row, getRow, setRow, StringTo, "[value]\n\tSet Detector row (udp header) to value. " diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index 2db04f1f2..c40c163fc 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -1309,13 +1309,24 @@ void DetectorImpl::startAcquisition(const bool blocking, Positions pos) { std::vector masters; std::vector slaves; getMasterSlaveList(pos, masters, slaves); + if (masters.empty()) { + throw RuntimeError("Cannot start acquisition in sync mode. No " + "master module found"); + } if (!slaves.empty()) { Parallel(&Module::startAcquisition, slaves); } - if (!masters.empty()) { - Parallel((blocking ? &Module::startAndReadAll - : &Module::startAcquisition), - masters); + if (blocking) { + Parallel(&Module::startAndReadAll, masters); + // ensure all status normal (slaves not blocking) + // to catch those slaves that are still 'waiting' + auto status = Parallel(&Module::getRunStatus, pos); + if (!status.contains_only(IDLE, STOPPED, RUN_FINISHED)) { + throw RuntimeError("Acquisition not successful. " + "Unexpected detector status"); + } + } else { + Parallel(&Module::startAcquisition, masters); } } // all in parallel From 7f0868f3440579ed9698f488f6de089c6fd537cb Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 10 Nov 2023 11:39:03 +0100 Subject: [PATCH 14/38] minor fix for test_simulator --- tests/scripts/test_simulators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/scripts/test_simulators.py b/tests/scripts/test_simulators.py index 2ae0ae2b8..1ee095d51 100644 --- a/tests/scripts/test_simulators.py +++ b/tests/scripts/test_simulators.py @@ -4,7 +4,7 @@ This file is used to start up simulators, receivers and run all the tests on them and finally kill the simulators and receivers. ''' import argparse -import os, sys, subprocess, time, colorama, signal, psutil +import os, sys, subprocess, time, colorama, signal from colorama import Fore from slsdet import Detector, detectorType, detectorSettings From aa4bf6e7f9086636046805f29938f2e25be97926 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 10 Nov 2023 16:02:21 +0100 Subject: [PATCH 15/38] updating docs --- docs/src/troubleshooting.rst | 1 + python/slsdet/detector.py | 131 +++++++++++++---------------------- 2 files changed, 48 insertions(+), 84 deletions(-) diff --git a/docs/src/troubleshooting.rst b/docs/src/troubleshooting.rst index ee8904404..72a3814f8 100644 --- a/docs/src/troubleshooting.rst +++ b/docs/src/troubleshooting.rst @@ -433,6 +433,7 @@ Cannot stop slaves in sync mode #. If cabling is accessible, ensure termination board and flatband cable between the masters and the slaves are connnected properly. Then try to stop. #. If cabling is inaccessible, unsync first so that the slaves can get the stop directly from the client using the command. Then, don't use sync mode until the cabling is fixed. + .. code-block:: bash # unsync, slaves command will fail as it is still in waiting state diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 36c5ed0cd..e53ab4295 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -360,7 +360,8 @@ class Detector(CppDetectorApi): @property def settings(self): """ - Detector settings. Enum: detectorSettings + Detector settings. + Enum: detectorSettings Note ----- @@ -400,6 +401,9 @@ class Detector(CppDetectorApi): def framesl(self): """ [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames left in acquisition.\n + + Note + ---- [Gotthard2] only in continuous auto mode. :setter: Not Implemented @@ -475,7 +479,8 @@ class Detector(CppDetectorApi): @element def gaincaps(self): """ - [Mythen3] Gain caps. Enum: M3_GainCaps \n + [Mythen3] Gain caps. + Enum: M3_GainCaps Note ---- @@ -573,8 +578,6 @@ class Detector(CppDetectorApi): """ Period between frames, accepts either a value in seconds or datetime.timedelta - Note - ----- :getter: always returns in seconds. To get in DurationWrapper, use getPeriod Example @@ -641,9 +644,6 @@ class Detector(CppDetectorApi): """ [Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Delay after trigger, accepts either a value in seconds, DurationWrapper or datetime.timedelta - Note - ----- - :getter: always returns in seconds. To get in DurationWrapper, use getDelayAfterTrigger Example @@ -895,7 +895,8 @@ class Detector(CppDetectorApi): @element def rx_discardpolicy(self): """ - Frame discard policy of receiver. Enum: frameDiscardPolicy + Frame discard policy of receiver. + Enum: frameDiscardPolicy Note ----- @@ -969,7 +970,8 @@ class Detector(CppDetectorApi): @property @element def fformat(self): - """ File format of data file in receiver. Enum: fileFormat + """ File format of data file in receiver. + Enum: fileFormat Note ----- @@ -1565,7 +1567,8 @@ class Detector(CppDetectorApi): @property @element def status(self): - """Gets detector status. Enum: runStatus + """Gets detector status. + Enum: runStatus Note ----- @@ -1579,7 +1582,8 @@ class Detector(CppDetectorApi): @property @element def rx_status(self): - """Gets receiver listener status. Enum: runStatus + """Gets receiver listener status. + Enum: runStatus Note ----- @@ -1808,6 +1812,7 @@ class Detector(CppDetectorApi): def daclist(self): """ List of enums/names for every dac for this detector + :setter: Only implemented for Chiptestboard """ @@ -1820,9 +1825,7 @@ class Detector(CppDetectorApi): @property def adclist(self): """ - List of names for every adc for this board. 32 adcs - :setter: Only implemented for Chiptestboard - + [Chiptestboard] List of names for every adc for this board. 32 adcs """ return self.getAdcNames() @@ -1833,9 +1836,7 @@ class Detector(CppDetectorApi): @property def signallist(self): """ - List of names for every io signal for this board. 64 signals - :setter: Only implemented for Chiptestboard - + [Chiptestboard] List of names for every io signal for this board. 64 signals """ return self.getSignalNames() @@ -1846,8 +1847,7 @@ class Detector(CppDetectorApi): @property def powerlist(self): """ - List of names for every power for this board. 5 power supply - :setter: Only implemented for Chiptestboard + [Chiptestboard] List of names for every power for this board. 5 power supply """ return self.getPowerNames() @@ -1859,8 +1859,7 @@ class Detector(CppDetectorApi): @property def slowadclist(self): """ - List of names for every slowadc for this board. 8 slowadc - :setter: Only implemented for Chiptestboard + [Chiptestboard] List of names for every slowadc for this board. 8 slowadc """ return self.getSlowADCNames() @@ -1879,7 +1878,7 @@ class Detector(CppDetectorApi): @property def powervalues(self): - """Gets the power values for every power for this detector.""" + """[Chiptestboard] Gets the power values for every power for this detector.""" return { power.name.lower(): element_if_equal(np.array(self.getPower(power))) for power in self.getPowerList() @@ -1887,7 +1886,7 @@ class Detector(CppDetectorApi): @property def slowadcvalues(self): - """Gets the slow adc values for every slow adc for this detector.""" + """[Chiptestboard] Gets the slow adc values for every slow adc for this detector.""" return { slowadc.name.lower(): element_if_equal(np.array(self.getSlowADC(slowadc))) for slowadc in self.getSlowADCList() @@ -2061,8 +2060,7 @@ class Detector(CppDetectorApi): ----- To set default rate correction from trimbit file, use setDefaultRateCorrection - Known Issue - ------------ + Known Issue: :getter: Always give 0 due to the microseconds precision. :setter: Use scientific notation to set custom rate correction, since timedelta resolution is 1 microseconds. \n @@ -2086,7 +2084,8 @@ class Detector(CppDetectorApi): @element def readoutspeed(self): """ - [Eiger][Jungfrau|Gotthard2] Readout speed of chip. Enum: speedLevel + [Eiger][Jungfrau|Gotthard2] Readout speed of chip. + Enum: speedLevel Note ----- @@ -2175,7 +2174,8 @@ class Detector(CppDetectorApi): @element def timing(self): """ - Set Timing Mode of detector. Enum: timingMode + Set Timing Mode of detector. + Enum: timingMode Note ----- @@ -2235,13 +2235,11 @@ class Detector(CppDetectorApi): @property @element def type(self): - """ Returns detector type. Enum: detectorType - - Note - ---- + """ Returns detector type. + Enum: detectorType + [EIGER, JUNGFRAU, GOTTHARD, MOENCH, MYTHEN3, GOTTHARD2, CHIPTESTBOARD] :setter: Not implemented - Values: EIGER, JUNGFRAU, GOTTHARD, MOENCH, MYTHEN3, GOTTHARD2, CHIPTESTBOARD """ return self.getDetectorType() @@ -2502,9 +2500,6 @@ class Detector(CppDetectorApi): """ [Eiger] Measured sub frame period between last sub frame and previous one. - Note - ----- - :setter: Not implemented """ return ut.reduce_time(self.getMeasuredSubFramePeriod()) @@ -2782,7 +2777,8 @@ class Detector(CppDetectorApi): @property def gainmode(self): """ - [Jungfrau] Detector gain mode. Enum: gainMode + [Jungfrau] Detector gain mode. + Enum: gainMode Note ----- @@ -2895,11 +2891,8 @@ class Detector(CppDetectorApi): @property def maxclkphaseshift(self): """ - [Gotthard2][Mythen3] Absolute maximum Phase shift of clocks. - - Note - ---- - + [Gotthard2][Mythen3] Absolute maximum Phase shift of clocks. + :setter: Not Implemented Example @@ -2917,7 +2910,8 @@ class Detector(CppDetectorApi): @element def timingsource(self): """ - [Gotthard2] Timing source. Enum: timingSourceType + [Gotthard2] Timing source. + Enum: timingSourceType Note ----- @@ -2961,7 +2955,8 @@ class Detector(CppDetectorApi): @property @element def burstmode(self): - """[Gotthard2] Burst mode of detector. Enum: burstMode + """[Gotthard2] Burst mode of detector. + Enum: burstMode Note ---- @@ -2979,9 +2974,6 @@ class Detector(CppDetectorApi): """ [Gotthard2] Period between 2 bursts. Only in burst mode and auto timing mode. - Note - ----- - :getter: always returns in seconds. To get in DurationWrapper, use getBurstPeriod :setter: Not Implemented @@ -3104,7 +3096,8 @@ class Detector(CppDetectorApi): @property def vetoalg(self): - """[Gotthard2] Algorithm used for veto. Enum: vetoAlgorithm, streamingInterface + """[Gotthard2] Algorithm used for veto. + Enum: vetoAlgorithm, streamingInterface Note ---- @@ -3278,7 +3271,8 @@ class Detector(CppDetectorApi): @element def romode(self): """ - [CTB] Readout mode of detector. Enum: readoutMode + [CTB] Readout mode of detector. + Enum: readoutMode Note ------ @@ -3384,9 +3378,6 @@ class Detector(CppDetectorApi): def maxdbitphaseshift(self): """[CTB][Jungfrau] Absolute maximum Phase shift of of the clock to latch digital bits. - Note - ----- - :setter: Not Implemented """ return self.getMaxDBITPhaseShift() @@ -3431,9 +3422,6 @@ class Detector(CppDetectorApi): def maxadcphaseshift(self): """[Jungfrau][Moench][CTB] Absolute maximum Phase shift of ADC clock. - Note - ----- - :setter: Not Implemented """ return self.getMaxADCPhaseShift() @@ -3483,9 +3471,6 @@ class Detector(CppDetectorApi): """ [Ctb] Sync clock in MHz. - Note - ----- - :setter: Not implemented """ return self.getSYNCClock() @@ -3493,10 +3478,7 @@ class Detector(CppDetectorApi): @property def pattern(self): """[Mythen3][Ctb] Loads ASCII pattern file directly to server (instead of executing line by line). - - Note - ---- - + :getter: Not Implemented Example @@ -3924,10 +3906,7 @@ class Detector(CppDetectorApi): @element def im_a(self): """[Ctb] Measured current of power supply a in mA. - - Note - ----- - + :setter: Not implemented """ return self.getMeasuredCurrent(dacIndex.I_POWER_A) @@ -3937,9 +3916,6 @@ class Detector(CppDetectorApi): def im_b(self): """[Ctb] Measured current of power supply b in mA. - Note - ----- - :setter: Not implemented """ return self.getMeasuredCurrent(dacIndex.I_POWER_B) @@ -3949,9 +3925,6 @@ class Detector(CppDetectorApi): def im_c(self): """[Ctb] Measured current of power supply c in mA. - Note - ----- - :setter: Not implemented """ return self.getMeasuredCurrent(dacIndex.I_POWER_C) @@ -3961,9 +3934,6 @@ class Detector(CppDetectorApi): def im_d(self): """[Ctb] Measured current of power supply d in mA. - Note - ----- - :setter: Not implemented """ return self.getMeasuredCurrent(dacIndex.I_POWER_D) @@ -3973,9 +3943,6 @@ class Detector(CppDetectorApi): def im_io(self): """[Ctb] Measured current of power supply io in mA. - Note - ----- - :setter: Not implemented """ return self.getMeasuredCurrent(dacIndex.I_POWER_IO) @@ -4025,9 +3992,6 @@ class Detector(CppDetectorApi): def exptimel(self): """[Gotthard] Exposure time left for current frame. - Note - ----- - :getter: always returns in seconds. To get in DurationWrapper, use getExptimeLeft :setter: Not Implemented @@ -4062,9 +4026,6 @@ class Detector(CppDetectorApi): """ [Gotthard2][Mythen3] Frequency of clock in Hz. - Note - ---- - :setter: Not implemented. Use clkdiv to set frequency Example @@ -4084,7 +4045,9 @@ class Detector(CppDetectorApi): @property @element def polarity(self): - """[Mythen3] Set positive or negative polarity. Enum: polarity""" + """[Mythen3] Set positive or negative polarity. + Enum: polarity + """ return self.getPolarity() @polarity.setter From 66d57c185218993152d219e778a2a3d25e54a6c0 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 10 Nov 2023 17:29:35 +0100 Subject: [PATCH 16/38] fixed doc --- cmk.sh | 2 +- docs/src/dependencies.rst | 36 +++++++++---- docs/src/installation.rst | 111 ++++++++++++++++++++++++++------------ 3 files changed, 104 insertions(+), 45 deletions(-) diff --git a/cmk.sh b/cmk.sh index 29f28f2d5..dd58a37e1 100755 --- a/cmk.sh +++ b/cmk.sh @@ -26,7 +26,7 @@ CMAKE_PRE="" CMAKE_POST="" usage() { echo -e " -Usage: $0 [-b] [-c] [-d ] [e] [g] [-h] [i] [-j ] [-k ] [-l ] [m] [n] [-p] [r] [s] [t] [u] [z] +Usage: $0 [-b] [-c] [-d ] [-e] [-g] [-h] [-i] [-j ] [-k ] [-l ] [-m] [-n] [-p] [-r] [-s] [-t] [-u] [-z] -[no option]: only make -b: Builds/Rebuilds CMake files normal mode -c: Clean diff --git a/docs/src/dependencies.rst b/docs/src/dependencies.rst index 7940809fc..248b533b3 100644 --- a/docs/src/dependencies.rst +++ b/docs/src/dependencies.rst @@ -13,24 +13,36 @@ To use the basic building blocks, meaning sls_detector_get/put and the shared libraries these are needed: * Linux, preferably recent kernel (currently no cross platform support) - * CMake > 3.12 + * CMake > 3.14 * C++11 compatible compiler. (We test with gcc and clang) - * ZeroMQ version 4 - ------------------------ -GUI ------------------------ - - * Qt 5.9 - * Qwt 6.1.5 (packaged in libs/) ----------------------- Python bindings ----------------------- * Python > 3.6 - * pybind11 (packaged in libs/) + * pybind11 2.11.0 (packaged in libs) +.. note :: + + Refer :ref:`pybind11 notes. ` + +----------------------- +ZeroMQ +----------------------- + + * Zeromq 4.3.4 (packaged in libs) + +.. note :: + + Refer :ref:`zeromq notes. ` + +----------------------- +GUI +----------------------- + + * Qt 5.9 + * Qwt 6.1.5 (packaged in libs) ----------------------- Moench executables @@ -54,4 +66,6 @@ Packaged in libs/ * catch2 (unit testing) * rapidjson (streaming from receiver) - * pybind11 (python bindings) \ No newline at end of file + * pybind11 (python bindings) + * qwt (gui plotting) + * libzmq (streaming to/from receiver) \ No newline at end of file diff --git a/docs/src/installation.rst b/docs/src/installation.rst index 1a2003192..d544c173d 100644 --- a/docs/src/installation.rst +++ b/docs/src/installation.rst @@ -57,7 +57,6 @@ We have three different packages available: Build from source ------------------- - 1. Download Source Code from github ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -65,23 +64,9 @@ Build from source git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 6.1.1 +.. note :: -| **Pybind for Python** -| v7.0.0+: -| pybind11 packaged into 'libs/pybind'. No longer a submodule. No need for "recursive" or "submodule update". -| -| Older versions: -| pybind11 is a submodule. Must be cloned using "recursive" and updated when switching between versions using the following commands. - -.. code-block:: bash - - # clone using recursive to get pybind11 submodule - git clone --recursive https://github.com/slsdetectorgroup/slsDetectorPackage.git - - # update submodule when switching between releases - cd slsDetectorPackage - git submodule update --init - + For v6.x.x of slsDetectorPackage and older, refer :ref:`pybind11 notes on cloning. ` .. _build from source using cmake: @@ -118,20 +103,21 @@ Instead of the cmake command, one can use ccmake to get a list of options to con ccmake .. # choose the options - # first press [c] - configure + # first press [c] - configure (maybe multiple times till you see [g]) # then press [g] - generate - -=============================== =========================================== +=============================== =============================== Example cmake options Comment -=============================== =========================================== +=============================== =============================== -DSLS_USE_PYTHON=ON Python --DPython_FIND_VIRTUALENV=ONLY Python from only the conda environment --DZeroMQ_HINT=/usr/lib64 Use system zmq instead +-DPython_FIND_VIRTUALENV=ONLY Python from the conda env -DSLS_USE_GUI=ON GUI -=============================== =========================================== +=============================== =============================== +.. note :: + + For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for cmake option to hint library location. ` Build using in-built cmk.sh script @@ -142,9 +128,9 @@ Build using in-built cmk.sh script The binaries are generated in slsDetectorPackage/build/bin directory. - Usage: ./cmk.sh [-b] [-c] [-d ] [e] [g] [-h] [i] [-j ] - [-k ] [-l ] [m] [n] [-p] [-q ] - [r] [s] [t] [u] [z] + Usage: $0 [-b] [-c] [-d ] [-e] [-g] [-h] [-i] + [-j ] [-k ] [-l ] + [-m] [-n] [-p] [-r] [-s] [-t] [-u] [-z] -[no option]: only make -b: Builds/Rebuilds CMake files normal mode -c: Clean @@ -159,7 +145,6 @@ Build using in-built cmk.sh script -m: Manuals -n: Manuals without compiling doxygen (only rst) -p: Builds/Rebuilds Python API - -q: Zmq hint directory -r: Build/Rebuilds only receiver -s: Simulator -t: Build/Rebuilds only text client @@ -176,9 +161,13 @@ Build using in-built cmk.sh script # new build, python and compile in parallel: ./cmk.sh -cbpj5 - #To use the system zmq (/usr/lib64) instead - ./cmk.sh -cbj5 -q /usr/lib64 + #For rebuilding only certain sections + ./cmk.sh -tg #only text client and gui + ./cmk.sh -r #only receiver +.. note :: + + For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for cmk script option to hint library location. ` Build on old distributions @@ -191,7 +180,7 @@ using this compiler .. code-block:: bash #Create an environment with the dependencies - conda create -n myenv gxx_linux-64 cmake zmq + conda create -n myenv gxx_linux-64 cmake conda activate myenv # outside slsDetecorPackage folder @@ -200,6 +189,11 @@ using this compiler make -j12 +.. note :: + + For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for dependencies for conda. ` + + Build slsDetectorGui (Qt5) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -228,9 +222,9 @@ Build slsDetectorGui (Qt5) # create environment to compile # on rhel7 - conda create -n slsgui zeromq gxx_linux-64 gxx_linux-64 mesa-libgl-devel-cos6-x86_64 qt + conda create -n slsgui gxx_linux-64 gxx_linux-64 mesa-libgl-devel-cos6-x86_64 qt # on fedora or newer systems - conda create -n slsgui zeromq qt + conda create -n slsgui qt # when using conda compilers, would also need libgl, but no need for it on fedora unless maybe using it with ROOT @@ -246,6 +240,9 @@ Build slsDetectorGui (Qt5) cd slsDetectorPackage ./cmk.sh -cbgj9 +.. note :: + + For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for dependencies for conda. ` @@ -270,3 +267,51 @@ is to use conda make docs # generate API docs and build Sphinx RST make rst # rst only, saves time in case the API did not change + + +Pybind and Zeromq +^^^^^^^^^^^^^^^^^^^ + +.. _pybind for different slsDetectorPackage versions: + + +| **Pybind for Python** +| v8.0.0+: +| pybind11 (v2.11.0) is built +| * by default from tar file in repo (libs/pybind/v2.11.0.tar.gz) +| * or use option SLS_FETCH_PYBIND11_FROM_GITHUB `[link] `__. +| +| v7.x.x: +| pybind11 packaged into 'libs/pybind'. No longer a submodule. No need for "recursive" or "submodule update". +| +| Older versions: +| pybind11 is a submodule. Must be cloned using "recursive" and updated when switching between versions using the following commands. + +.. code-block:: bash + + # Note: Only for v6.x.x versions and older + + # clone using recursive to get pybind11 submodule + git clone --recursive https://github.com/slsdetectorgroup/slsDetectorPackage.git + + # update submodule when switching between releases + cd slsDetectorPackage + git submodule update --init + + +.. _zeromq for different slsDetectorPackage versions: + + + +| **Zeromq** +| v8.0.0+: +| zeromq (v4.3.4) is built +| * by default from tar file in repo (libs/libzmq/libzmq-4.3.4.tar.gz) +| * or use option SLS_FETCH_ZMQ_FROM_GITHUB `[link] `__. +| +| v7.x.x and older: +| zeromq must be installed and one can hint its location using +| * cmake option:'-DZeroMQ_HINT=/usr/lib64' or +| * option '-q' in cmk.sh script: : ./cmk.sh -cbj5 -q /usr/lib64 +| * 'zeromq' dependencies when installing using conda + From e2d7af28dc0bc485a3ab3ec5d7f9f0b5b2a2b4b1 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 10 Nov 2023 14:17:40 +0100 Subject: [PATCH 17/38] added python 3.12 to the conda build variants --- conda-recepie/conda_build_config.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/conda-recepie/conda_build_config.yaml b/conda-recepie/conda_build_config.yaml index b49d8ca09..b1396f187 100644 --- a/conda-recepie/conda_build_config.yaml +++ b/conda-recepie/conda_build_config.yaml @@ -2,7 +2,6 @@ python: - 3.8 - 3.9 - 3.10 - - 3.11 + - 3.11 + - 3.12 -numpy: - - 1.17 From 4198db8365d301d3188b3f391560b07b19a5419b Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Sun, 12 Nov 2023 15:11:36 +0100 Subject: [PATCH 18/38] documentation and examples --- docs/src/consuming.rst | 4 +-- docs/src/dependencies.rst | 2 +- docs/src/detector.rst | 9 ++++-- docs/src/examples.rst | 8 ++++-- docs/src/firmware.rst | 10 +++---- docs/src/index.rst | 4 +-- docs/src/installation.rst | 10 ++++--- docs/src/quick_start_guide.rst | 12 ++++---- docs/src/result.rst | 2 ++ docs/src/slsreceiver.rst | 7 ++++- docs/src/virtualserver.rst | 15 ++++++---- examples/eiger_10Gb.config | 30 ++++++++++++-------- examples/eiger_1Gb.config | 19 ++++++++----- examples/jungfrau_two.config | 26 ++++++++--------- examples/virtual_eiger_2_half_modules.config | 6 ++-- examples/virtual_jungfrau_4.config | 26 +++++++++-------- slsDetectorSoftware/include/sls/Result.h | 2 +- 17 files changed, 111 insertions(+), 81 deletions(-) diff --git a/docs/src/consuming.rst b/docs/src/consuming.rst index b66a01b23..02d23608c 100644 --- a/docs/src/consuming.rst +++ b/docs/src/consuming.rst @@ -19,7 +19,7 @@ A minimal CMakeLists.txt could look like this: .. code-block:: cmake project(myDetectorIntegration) - cmake_minimum_required(VERSION 3.12) + cmake_minimum_required(VERSION 3.14) add_subdirectory(slsDetectorPackage) #Add your executable @@ -43,7 +43,7 @@ should be needed, otherwise specify cmake prefix path. .. code-block:: cmake - cmake_minimum_required(VERSION 3.12) + cmake_minimum_required(VERSION 3.14) project(myintegration) find_package(slsDetectorPackage 5.0 REQUIRED) diff --git a/docs/src/dependencies.rst b/docs/src/dependencies.rst index 248b533b3..846fc0ff1 100644 --- a/docs/src/dependencies.rst +++ b/docs/src/dependencies.rst @@ -13,7 +13,7 @@ To use the basic building blocks, meaning sls_detector_get/put and the shared libraries these are needed: * Linux, preferably recent kernel (currently no cross platform support) - * CMake > 3.14 + * CMake >= 3.14 * C++11 compatible compiler. (We test with gcc and clang) ----------------------- diff --git a/docs/src/detector.rst b/docs/src/detector.rst index a78447f99..9c8ec8be2 100644 --- a/docs/src/detector.rst +++ b/docs/src/detector.rst @@ -1,16 +1,19 @@ Detector ============================================== -The sls::Detector is the new public API to control +The sls::Detector is the public API to control detectors from C++. This API is also used internally for the Python bindings and the command line interface. -If a receiver has been configured this is also controlled +If a receiver has been configured, this is also controlled through this class. Most, if not all, functions are called in parallel and the return value is a thin std::vector wrapper -containing results from all modules. (Result) +containing results from all modules. (:ref:`Result class`) +Here are some :ref:`examples ` on how to use the API. + +.. _Cplusplus Api Examples: .. doxygenclass:: sls::Detector :members: :undoc-members: \ No newline at end of file diff --git a/docs/src/examples.rst b/docs/src/examples.rst index d22f3bc6d..65d734c8e 100644 --- a/docs/src/examples.rst +++ b/docs/src/examples.rst @@ -1,3 +1,4 @@ +.. _Cplusplus Api Examples: @@ -53,8 +54,8 @@ then set up the detector. jungfrauDetectorServer_virtual -This launches a virtual Jungfrau detector server. As default is uses port 1952 and 1953 -for communication over TCP. Most commands go on 1952 and only stop and status on 1953. +This launches a virtual Jungfrau detector server. As default it uses port 1952 and 1953 +for communication over TCP. Most commands go on 1952 and only a few such as stop and status on 1953. **Run example to configure** @@ -90,7 +91,10 @@ std::vector. sls::Result res1{1, 1, 1}; std::cout << "res1: " << res1 << '\n'; res1.squash(); + # return -1 if different res1.squash(-1); + # throw exception with custom message if different + res1.tsquash("Values are different); diff --git a/docs/src/firmware.rst b/docs/src/firmware.rst index ab97380ff..a372ecb04 100644 --- a/docs/src/firmware.rst +++ b/docs/src/firmware.rst @@ -120,7 +120,7 @@ Program from console # removes old server from respawn, sets up new lnked server to respawn # programs fpga, reboots - # v5.0.0 - 6.0.0 (copies server from tftp folder of the pc) + # older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc sls_detector_put update jungfrauDetectorServervxxx pcxxx xx.pof # v6.1.1 - present (copies server from the full path provided) @@ -190,7 +190,7 @@ Program from console # removes old server from respawn, sets up new lnked server to respawn # programs fpga, reboots - # v5.0.0 - 6.0.0 (copies server from tftp folder of the pc) + # older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc sls_detector_put update mythen3DetectorServervxxx pcxxx xxx.rbf # v6.1.1 - present (copies server from the full path provided) @@ -224,7 +224,7 @@ Program from console # removes old server from respawn, sets up new lnked server to respawn # programs fpga, reboots - # v5.0.0 - 6.0.0 (copies server from tftp folder of the pc) + # older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc sls_detector_put update gotthard2DetectorServervxxx pcxxx xxx.rbf # v6.1.1 - present (copies server from the full path provided) @@ -275,7 +275,7 @@ Program from console # removes old server from respawn, sets up new lnked server to respawn # programs fpga, reboots - # v5.0.0 - 6.0.0 (copies server from tftp folder of the pc) + # older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc sls_detector_put update moenchDetectorServervxxx pcxxx xx.pof # v6.1.1 - present (copies server from the full path provided) @@ -310,7 +310,7 @@ Program from console # removes old server from respawn, sets up new lnked server to respawn # programs fpga, reboots - # v5.0.0 - 6.0.0 (copies server from tftp folder of the pc) + # older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc sls_detector_put update ctbDetectorServervxxx pcxxx xx.pof # v6.1.1 - present (copies server from the full path provided) diff --git a/docs/src/index.rst b/docs/src/index.rst index d19592e4d..1bdca9dd1 100644 --- a/docs/src/index.rst +++ b/docs/src/index.rst @@ -8,8 +8,8 @@ Welcome to slsDetectorPackage's documentation! .. note :: - This is the documentation for the latest development version of slsDetectorPackage - For documentation on current and previous releases visit the official page: https://www.psi.ch/en/detectors/documentation + This is the documentation for the latest development version of slsDetectorPackage. + For further documentation, visit the official page: https://www.psi.ch/en/detectors/documentation .. toctree:: :maxdepth: 1 diff --git a/docs/src/installation.rst b/docs/src/installation.rst index d544c173d..c8717851f 100644 --- a/docs/src/installation.rst +++ b/docs/src/installation.rst @@ -113,6 +113,8 @@ Example cmake options Comment -DSLS_USE_PYTHON=ON Python -DPython_FIND_VIRTUALENV=ONLY Python from the conda env -DSLS_USE_GUI=ON GUI +-DSLS_USE_HDF5=ON HDF5 +-DSLS_USE_SIMULATOR=ON Simulator =============================== =============================== .. note :: @@ -255,7 +257,7 @@ is to use conda .. code-block:: bash - conda create -n myenv python sphinx_rtd_theme breathe + conda create -n myenv python=3.12 sphinx sphinx_rtd_theme breathe doxygen numpy .. code-block:: bash @@ -279,7 +281,7 @@ Pybind and Zeromq | v8.0.0+: | pybind11 (v2.11.0) is built | * by default from tar file in repo (libs/pybind/v2.11.0.tar.gz) -| * or use option SLS_FETCH_PYBIND11_FROM_GITHUB `[link] `__. +| * or use advanced option SLS_FETCH_PYBIND11_FROM_GITHUB [`link `__]. | | v7.x.x: | pybind11 packaged into 'libs/pybind'. No longer a submodule. No need for "recursive" or "submodule update". @@ -307,11 +309,11 @@ Pybind and Zeromq | v8.0.0+: | zeromq (v4.3.4) is built | * by default from tar file in repo (libs/libzmq/libzmq-4.3.4.tar.gz) -| * or use option SLS_FETCH_ZMQ_FROM_GITHUB `[link] `__. +| * or use advanced option SLS_FETCH_ZMQ_FROM_GITHUB [`link `__]. | | v7.x.x and older: | zeromq must be installed and one can hint its location using | * cmake option:'-DZeroMQ_HINT=/usr/lib64' or | * option '-q' in cmk.sh script: : ./cmk.sh -cbj5 -q /usr/lib64 -| * 'zeromq' dependencies when installing using conda +| * 'zeromq' dependency added when installing using conda diff --git a/docs/src/quick_start_guide.rst b/docs/src/quick_start_guide.rst index 428d77989..9ccd28506 100644 --- a/docs/src/quick_start_guide.rst +++ b/docs/src/quick_start_guide.rst @@ -109,12 +109,14 @@ For Multiple Modules # connects to mulitple modules hostname bchipxxx+bchipyyy+ - # connects to receivers at ports 2012 and 2014 - rx_hostname mpc1922:2012+mpc1922:2013+ + # tcp port increases for each module (multi detector command) + rx_tcpport 2012 - # sets differernt destination udp ports - 0:udp_dstport 50012 - 1:udp_dstport 50014 + # connects to receivers at ports 2012 and 2014 + rx_hostname mpc1922 + + # increasing udp ports (multi detector command) + udp_dstport 50012 # source udp ips must be same subnet at destintaion udp ips 0:udp_srcip 192.168.1.112 diff --git a/docs/src/result.rst b/docs/src/result.rst index 1abd1b4a3..c1af431cd 100644 --- a/docs/src/result.rst +++ b/docs/src/result.rst @@ -1,3 +1,5 @@ +.. _Result Class: + Result ============================================== diff --git a/docs/src/slsreceiver.rst b/docs/src/slsreceiver.rst index 6e794a30c..0cccaf012 100644 --- a/docs/src/slsreceiver.rst +++ b/docs/src/slsreceiver.rst @@ -52,8 +52,13 @@ Client Commands # multi modules with custom ports rx_hostname xxx:1955+xxx:1956+ + + + # multi modules using increasing tcp ports when using multi detector command + rx_tcpport 1955 + rx_hostname xxx - # multi modules with custom ports on same rxr pc + # or specify multi modules with custom ports on same rxr pc 0:rx_tcpport 1954 1:rx_tcpport 1955 2:rx_tcpport 1956 diff --git a/docs/src/virtualserver.rst b/docs/src/virtualserver.rst index 7a030347a..ae1073d8e 100644 --- a/docs/src/virtualserver.rst +++ b/docs/src/virtualserver.rst @@ -86,7 +86,8 @@ For a Single Module (With Options) udp_dstport 50012 # source udp ips must be same subnet at destintaion udp ips - udp_srcip 192.168.1.112 + # takes the same ip as hostname + udp_srcip auto # destination udp ip picked up from rx_hostname (if auto) udp_dstip auto @@ -101,12 +102,14 @@ For Multiple Modules virtual 2 1912 # or hostname localhost:1912+localhost:1914+ - # connects to receivers at ports 2012 and 2014 - rx_hostname mpc1922:2012+mpc1922:2013+ + # increasing receiver tcp ports (multi detector command) + rx_tcpport 2012 - # sets differernt destination udp ports - 0:udp_dstport 50012 - 1:udp_dstport 50014 + # connects to reciever at port 2012 and 2013 + rx_hostname mpc1922 + + # sets increasing destination udp ports + udp_dstport 50012 # source udp ips must be same subnet at destintaion udp ips 0:udp_srcip 192.168.1.112 diff --git a/examples/eiger_10Gb.config b/examples/eiger_10Gb.config index 30bb33213..97078974b 100755 --- a/examples/eiger_10Gb.config +++ b/examples/eiger_10Gb.config @@ -4,27 +4,33 @@ detsize 1024 512 # detector hostname for controls hostname beb059+beb058+ -# 1Gb receiver pc hostname with tcp port to configure receiver -rx_hostname x12sa-vcons:1991+x12sa-vcons:1992 +# increasing receiver tcp port (multi detector command) +rx_tcpport 1991 + +# 1Gb receiver pc hostname to configure receiver +rx_hostname x12sa-vcons + +# or 1Gb receiver pc hostname with tcp port to configure receiver +#rx_hostname x12sa-vcons:1991+x12sa-vcons:1992 + +# increasing udp destination ports for all half modules +udp_dstport 50011 # udp port first quadrant, first halfmodule -0:udp_dstport 50011 - +#0:udp_dstport 50011 # udp port second quadrant, first halfmodule -0:udp_dstport2 50012 - +#0:udp_dstport2 50012 +# udp port first quadrant, second halfmodule +#1:udp_dstport 50013 +# udp port second quadrant, second halfmodule +#1:udp_dstport2 50014 + # udp IP of the receiver over 10Gb 0:udp_dstip 10.0.30.210 # first half module 10 Gb IP (same subnet as 0:udp_dstip) 0:udp_srcip 10.0.30.100 -# udp port first quadrant, second halfmodule -1:udp_dstport 50013 - -# udp port second quadrant, second halfmodule -1:udp_dstport2 50014 - # udp IP of the receiver over 10Gb, 1:udp_dstip 10.0.40.210 diff --git a/examples/eiger_1Gb.config b/examples/eiger_1Gb.config index 936473f35..15322c94b 100755 --- a/examples/eiger_1Gb.config +++ b/examples/eiger_1Gb.config @@ -4,18 +4,23 @@ detsize 1024 512 # detector hostname for controls hostname beb059+beb058+ -# 1Gb receiver pc hostname with tcp port to configure receiver -rx_hostname x12sa-vcons:1991+x12sa-vcons:1992 +# increasing receiver tcp port (multi detector command) +rx_tcpport 1991 + +# 1Gb receiver pc hostname to configure receiver +rx_hostname x12sa-vcons + +# increasing udp destination ports for all half modules +udp_dstport 50011 # udp port first quadrant, first halfmodule -0:udp_dstport 50011 +#0:udp_dstport 50011 #udp port second quadrant, first halfmodule -0:udp_dstport2 50012 - +#0:udp_dstport2 50012 # udp port first quadrant, second halfmodule -1:udp_dstport 50013 +#1:udp_dstport 50013 # udp port second quadrant, second halfmodule -1:udp_dstport2 50014 +#1:udp_dstport2 50014 # output directory fpath /sls/X12SA/data/x12saop/Data10/Eiger0.5M diff --git a/examples/jungfrau_two.config b/examples/jungfrau_two.config index 4ee3f9d7f..2e6665f49 100755 --- a/examples/jungfrau_two.config +++ b/examples/jungfrau_two.config @@ -4,14 +4,18 @@ detsize 1024 1024 # detector hostname hostname bchip048+bchip052+ -# 1Gb receiver pc hostname (default tcpport: 1954) -rx_hostname pcmoench01:1954+pcmoench01:1955+ +# increasing receiver ports 1954 and 1955 (multi detector command) +rx_tcpport 1954 + +# 1Gb receiver pc hostname +rx_hostname pcmoench01 +# increasing udp ports 50004 and 50005 (multi detector command) +udp_dstport 50004 +# or custom udp destination port (receiver) for 1st module +#0:udp_dstport 50014 -# udp configurations for 1st module -# udp destination port (receiver) -0:udp_dstport 50004 # udp destination ip (receiver) 0:udp_dstip 10.1.1.100 @@ -19,17 +23,11 @@ rx_hostname pcmoench01:1954+pcmoench01:1955+ # udp source ip (same subnet as 0:udp_dstip) 0:udp_srcip 10.1.1.10 - - -# udp configurations for 2nd module -# udp destination port (receiver) -1:udp_dstport 50005 - # udp destination ip (receiver) -1:udp_dstip 10.1.1.100 +1:udp_dstip 10.1.2.100 # udp source ip (same subnet as 1:udp_dstip) -1:udp_srcip 10.1.1.11 +1:udp_srcip 10.1.2.11 @@ -45,5 +43,5 @@ timing trigger # output file directory fpath /external_pool/jungfrau_data/softwaretest -# disable file writing +# disable file writing (default) fwrite 0 \ No newline at end of file diff --git a/examples/virtual_eiger_2_half_modules.config b/examples/virtual_eiger_2_half_modules.config index e4d1f5ed8..0df877cf0 100644 --- a/examples/virtual_eiger_2_half_modules.config +++ b/examples/virtual_eiger_2_half_modules.config @@ -2,10 +2,8 @@ hostname localhost:1900+localhost:1902+ # udp destination ports -0:udp_dstport 50000 -0:udp_dstport2 50001 -1:udp_dstport 50002 -1:udp_dstport2 50003 +udp_dstport 50000 +udp_dstport2 50001 # receiver hostname rx_hostname mpc1922:2000+mpc1922:2001+ diff --git a/examples/virtual_jungfrau_4.config b/examples/virtual_jungfrau_4.config index 021c2c4ae..f688a5456 100644 --- a/examples/virtual_jungfrau_4.config +++ b/examples/virtual_jungfrau_4.config @@ -5,24 +5,26 @@ detsize 2048 1024 virtual 4 1952 # udp destination ports -0:udp_dstport2 50001 -0:udp_dstport2 50002 -1:udp_dstport 50003 -1:udp_dstport2 50004 -2:udp_dstport 50005 -2:udp_dstport2 50006 -3:udp_dstport 50007 -3:udp_dstport2 50008 +udp_dstport 50001 +#0:udp_dstport2 50001 +#0:udp_dstport2 50002 +#1:udp_dstport 50003 +#1:udp_dstport2 50004 +#2:udp_dstport 50005 +#2:udp_dstport2 50006 +#3:udp_dstport 50007 +#3:udp_dstport2 50008 # udp source ip (same subnet as udp_dstip) udp_srcip 192.168.1.100 udp_srcip2 192.168.1.100 # receiver hostname and tcpports -0:rx_tcpport 1970 -1:rx_tcpport 1971 -2:rx_tcpport 1972 -3:rx_tcpport 1973 +rx_tcpport 1970 +#0:rx_tcpport 1970 +#1:rx_tcpport 1971 +#2:rx_tcpport 1972 +#3:rx_tcpport 1973 rx_hostname mpc1922 # udp destination ip from rx_hostname diff --git a/slsDetectorSoftware/include/sls/Result.h b/slsDetectorSoftware/include/sls/Result.h index 73e5fc332..604dc4b52 100644 --- a/slsDetectorSoftware/include/sls/Result.h +++ b/slsDetectorSoftware/include/sls/Result.h @@ -8,7 +8,7 @@ * from the detector. Since every module could have a different value, we need * to return a vector instead of just a single value. * - * Easy conversions to single values are provided using the squash method. + * Easy conversions to single values are provided using the squash and tsquash method. */ #include From 96ed74c47c044d27a02c2acd9325524e9b74528d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Sun, 12 Nov 2023 15:29:34 +0100 Subject: [PATCH 19/38] formatting --- slsDetectorSoftware/include/sls/Result.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/slsDetectorSoftware/include/sls/Result.h b/slsDetectorSoftware/include/sls/Result.h index 604dc4b52..0cb937408 100644 --- a/slsDetectorSoftware/include/sls/Result.h +++ b/slsDetectorSoftware/include/sls/Result.h @@ -8,7 +8,8 @@ * from the detector. Since every module could have a different value, we need * to return a vector instead of just a single value. * - * Easy conversions to single values are provided using the squash and tsquash method. + * Easy conversions to single values are provided using the squash and tsquash + * method. */ #include From d7aa3305d10d669ebb820c17206b71a37db0bf83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Mon, 20 Nov 2023 11:43:30 +0100 Subject: [PATCH 20/38] forward declare zmq_msg_t and moved include (#869) * forward declare zmq_msg_t and moved include * removed zmq from pkg list --- .github/workflows/cmake.yml | 2 +- slsSupportLib/include/sls/ZmqSocket.h | 3 ++- slsSupportLib/src/ZmqSocket.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index ee5446272..107e1c436 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v3 - uses: awalsh128/cache-apt-pkgs-action@latest with: - packages: libzmq3-dev libhdf5-dev qtbase5-dev qt5-qmake libqt5svg5-dev + packages: libhdf5-dev qtbase5-dev qt5-qmake libqt5svg5-dev version: 1.0 - name: Configure CMake diff --git a/slsSupportLib/include/sls/ZmqSocket.h b/slsSupportLib/include/sls/ZmqSocket.h index 679cb7f20..772d6bc65 100644 --- a/slsSupportLib/include/sls/ZmqSocket.h +++ b/slsSupportLib/include/sls/ZmqSocket.h @@ -24,8 +24,9 @@ #include //json header in zmq stream #pragma GCC diagnostic pop -#include +//#include +class zmq_msg_t; namespace sls { #define MAX_STR_LENGTH 1000 diff --git a/slsSupportLib/src/ZmqSocket.cpp b/slsSupportLib/src/ZmqSocket.cpp index 2ab6e583f..d727d61dc 100644 --- a/slsSupportLib/src/ZmqSocket.cpp +++ b/slsSupportLib/src/ZmqSocket.cpp @@ -10,7 +10,7 @@ #include #include #include - +#include namespace sls { using namespace rapidjson; From 62dc0e1a348476e9443896035c47cbc13b1b1f1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Fri, 24 Nov 2023 09:09:29 +0100 Subject: [PATCH 21/38] removed zmq as dependency for slsdet (#870) --- conda-recepie/meta.yaml | 9 ++------- python/setup.py | 4 +--- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/conda-recepie/meta.yaml b/conda-recepie/meta.yaml index a06d2c4be..da620c859 100755 --- a/conda-recepie/meta.yaml +++ b/conda-recepie/meta.yaml @@ -18,7 +18,6 @@ requirements: - {{compiler('cxx')}} - cmake - qt 5.* - - zeromq - xorg-libx11 - xorg-libice - xorg-libxext @@ -37,7 +36,6 @@ requirements: host: - libstdcxx-ng - libgcc-ng - - zeromq - xorg-libx11 - xorg-libice - xorg-libxext @@ -48,7 +46,6 @@ requirements: - expat run: - - zeromq - libstdcxx-ng - libgcc-ng @@ -63,15 +60,11 @@ outputs: - {{compiler('cxx')}} - libstdcxx-ng - libgcc-ng - - zeromq - host: - - zeromq run: - libstdcxx-ng - libgcc-ng - - zeromq - name: slsdet @@ -84,10 +77,12 @@ outputs: - {{compiler('cxx')}} - {{ pin_subpackage('slsdetlib', exact=True) }} - setuptools + - pybind11=2.11 host: - python - {{ pin_subpackage('slsdetlib', exact=True) }} + - pybind11=2.11 run: diff --git a/python/setup.py b/python/setup.py index aee81b640..a467a4727 100755 --- a/python/setup.py +++ b/python/setup.py @@ -7,7 +7,6 @@ Build upon the pybind11 example found here: https://github.com/pybind/python_exa import os import sys -sys.path.append('../libs/pybind') from setuptools import setup, find_packages from pybind11.setup_helpers import Pybind11Extension, build_ext @@ -41,11 +40,10 @@ ext_modules = [ , include_dirs=[ - os.path.join('../libs/pybind/include'), os.path.join(get_conda_path(), 'include'), ], - libraries=['SlsDetector', 'SlsSupport', 'SlsReceiver', 'zmq'], + libraries=['SlsDetector', 'SlsSupport', 'SlsReceiver'], library_dirs=[ os.path.join(get_conda_path(), 'lib'), ], From d72c9e29a4c8b847bee09ef3d8123cf67a4af37b Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 27 Nov 2023 15:22:16 +0100 Subject: [PATCH 22/38] dev: moench: min exptime (#865) * moench: remove min clock cycles for setting exptime (had been ported from jf) --- .../bin/moenchDetectorServer_developer | Bin 295308 -> 295340 bytes .../slsDetectorFunctionList.c | 5 +---- .../slsDetectorServer_defs.h | 3 +-- .../src/slsDetectorServer_funcs.c | 2 +- slsSupportLib/include/sls/versionAPI.h | 2 +- 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 2a4ab71340e3f5394cae5af15d756b2fb3339367..e9951f2303ad84f45c98bb3a44000c74b017bdaf 100755 GIT binary patch delta 108795 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

    BS#Gbs>gpL{x*Cn+akPs-PmStu^UUY37K z)@OKGm-4airKV*Qvy5%`vf8z9&{9UzQe}CpU8*db$;gupdDT*7*(^g|X2{EzD$8aa z@;XCav{YF(xyZSOJZGu0Yz`qGGUVw?m1T1R`Gg@)T#99r?yA6{!f+U~R9QCF$km1% zyHr^=RtjicrV2E0sj_TBkV6c)&r)UCbVBZA$dOCy9+C}7_q3?`EtW@(rrQGBAYHra zt1UYq6KCmNYzvmL)ht{yOTSO|%7xEeW-6!Ramx01t#T^KtJ27;{}QE~8^|{dx#tq4 zoM6HSKd#E!Wr=vPICBM5>A3ml26Rl+uL@)?vSs~)u-7` ztl+)*GH4!$#nrIYvfDg;g)KOZ_e{zI^Yk{h7}yxaHk8-q>6aU(q;X`JcHXH~RX)K* z&@?WB%BuN#s{!lqSeK?%Sr%m+&0vOT6!^|Q^8hiMK-pYu;05}pb<*#5C;j#d^?SNrBmHY>;~lFw70-Cw?$;vZoqcLsIh|K) z^GR}itI7S%g`Pq^v5?X0ctY*UUtY)(H57KJ{A{6GJ)hvAp0q7uIm?I5mxC8!PG2R! zRr$msy}g&V5*4nL`xfaTp`LoZykNo61=Oo4jTyd@7yHZ47wHd}X%*h{sNPX`CpK=e zKFsDM1*d#@F)L6OY?l1%V*S2exv;q_YpSAu$~gL@@dm#sKcTCtidE6O2cSJugY)M* zjymqjY4Brra(eDD?glh0C85%l2Z(xdo~Kv-xP+>i^=Y$|rST+TPRfUt>SNudDO^fv zuH$-LezjD;-*%H)+>{-c=`(H7d__E3ZeB+Jih+%h=a#X+7pJTK)#z~ol&1^Um-NS( z2Cov}s(kTru3GiY5ZL-(J&yJkWT=NKEtl)xG|Iv?D}#6D|6u2HFMQoQgZV(VT%mWr z=NewuGR$|Y4|KF*q0_4NrM7W>WeM>K4dL7B1idMjt|0B9Px5*Zd29u@a?+ku)A}zf zxVw=1q>)w{%f<-;oRGuP^zMVTRkYWtnyM$iS6hGeX2dmGjw#fv$*E zY`|Bk7gw0sdZ)G~+dw1RgjKA2@>m+#<`XPm)_X$l?x-Nu3Q`UKUfKI9)xqDFq4Ls| zW|{+B+EYB|dTOAf1H+-oQklC#53V1^rOM`kY?q#5yY!UIenOA5MLoq9QGWP@-mh0* z*uGD3ar(Na3tYOcy1=xRMY{&LoFwRcN~^j)C+27jT|lWX8MkD4-%35*-R!#v?waFi z_P?yu=h})1Q!MXKhxNPRt!#_M38ItV1<2 z=R*&b94%pz4rY>0A!v&HpQlN-0JcE(TdfahW)40zJAW|C{HlkV&`%S9+aIg-Pi!|~ zZ_2sP=$%8up5b8d8THs?(mcCg!;qXKF|P1ulsWy@Gx`AAAlN~LKRu(@v!qvI0aaco z%2kj2FT-EHaKqrQ!e6}*y-T@YgTHoRnZZ}XS6?WCH`iHpO~}IPYo?>#KyGsCqwXYH&^;-tIjs%U0ab;2H zEcwZ^4CTqNlco1MmWLhGbcdX~PH&f9o`r>(RlAZ`5US!CwNhW3p;q$i$kz?|@(i_- z2NFIoOZivKP%C*`l8-Lc`0(KA#a-D89cL})1UIPui;g( zYh?9vdWS}r;V-YLtz{T;nC!Zq^>GmFAUR60sj#VXzG64QZj#R{wivcpzPX+i*3hy1 zd_5EH4P0+X|L65)oz13eOe30&)(FmQGWC-evm2;)#~YnMj(cA3Jh;*XSd252klSl`0!Wx7`Qh_SoeN+W z$Zwu!S=Nd{%(S^!%hdt@_RRKixuY0C8m><#&Jw%#@U2A$`Iy9eKdzv=G5T7|Dm zt1x@872aB5_Fy}_y+ZZiSeGBXU&RfB4}=e_h~8bdXIr%xm;G6^|EyMZzh*wL)vA)U zYHIP>;#l(aZO%W{?agASZvXIA)$Pq}WPFYu9B%sE9conFP?+qHjM`^SvovWP zYFSs?%#$g^de{5*@oP9n(EAX$a#hwHcfTrBIF`N4xXku z^GW2BhU_;@b>>RsN<+3zqchKQUB}_N;c(NbIWJ{4DYf&4(ry;vvgAKE=uO-WdAF9H_)6*0Y)W(5F!ic< zZ%0kl_^-lUf$g-a`<8oJ;O_WS?uuXXz<>l#%LL{qNu|-_D^;Xu`OHSW;e%#R3CvNy z)-rojU{3E{HC18mjI=u$sexejnV_5-xgm~cW9m^_R zn1%o3@qa12?79h)a39LqCueTL0zUzJLVmbOf7DjFPTjk_f3v<&UfZFM@r!ji=(>)I zWprJ+cBkH2{Lhzi|4zM=oVrC%2W&_;zY<_q~6ONM{R4(Y*dT= zDz+TARe$b33TWGQC-L6f^lo0-b68r>$pzc=G+W4XYN7w|LK)OcEeyugrKPf_D(9r8LuZaPJcr(EP*LvAodji*D%hYZWHp{bkV6dl(quKBIw5y5z;mN;A7m=?;!X=?&)_Z{80DwI|6=0o#|J*>aD4Bs-l8$ zIqF5dhgbOX>}j4ir^m_JOo!RE&FQ3o&gYdjr%qDMxeR%kAtz2!&AADAlOd0sq?$7y zIp2^UoTQqw7`fPx`%hBMS%zF@$UP^i=Ddu2*^s+TqB+xDH*mONINUo)HK!j1^2=5Q zXfa7OXE<`WAvd0+nllPH%8=_%Qq4IOd8i?KO{zORHk(m9Ju0)x)UFyKCa2byw_UB& zq-ZMJoD@xEo4lcH`N>Yb$0$?3fjLjwy?GU9<A=)@V2- zt;_N^0ynCwwPt)Z`Qv*xOEhLU3N{?7q>kZn5;EwJ$!ktr;ttf8KdJ)3DqoO zmQN*Qb_F%~jgBDy@)8H1xjb#n0GRP%^`d92+cj9-KhOfC*FUGG}cFkp* zXE@6^*ltNVjOHBmqUkS2@wK}U#xpJpayq!KvbBnJ^ugHJiY2VJJ=rTLpnC&=%gF4P}Reldd#CfSF~O$ zA@zq-J=#z=G2;VShBvYdZ&Z0%+<8Ue61A~zUd40GnkQ@&Y$8YPX4=jm5LDG#Q_q4_ z21B$;GH9I|KKu$2^@4r3nktLm%uBK5*gTpii$GcO**v{@XHR#v`$f|P`|#LzSM0~#vCD~F zF3+ggep}Q|(EkcQui)x?;ULpJ@0&S8jUip{YO7SSYE4J>AeT~@H zF&@urwL3%cuY9JhX#H?F}6x_&sXb<6w2vj8H9=&;&yX#hgN5x&S zA9csJZ{_r0tGu*_(}TWS)f3gwS6PWC!%miQuj)_sP9;R@R_0=ymTj%wil-);d-`y; z;+b1{rRvs!E@y>+*a8u@RC?#@4>TzwdKuB36-@0F>N9Aj=d^sihrfLr*623A=0W^Y z`Eouvx5cTgJeRL`>=gqWv#o>6YHYAooyX3x`}GSnU3iMHjnkBE>H+6HGk855(}j~5 zPTBi4wF}uM*o91aP4CspGZ77U*?Ebc8G9fG0M|8~u5H(jwgy6&%J?EGLP0loT&p?b8Rhiy?`a7dp87 z?o@tP3Wt%*d_!O0u;T?!3eWA+A8Wqg1y03Z80gr}y~76|@(cH9C=d5M+42qj9{)08 zmEDOo`VIX7e{Bag)(#GXRQ_@oq1p`H!D;dirP9AlE8vHL8u!FGQ^s|~4tMj)zrCTi z>u!{^LU*d`(O*t=m%M_rMS`x|agaGEek|)XIcy?_cyfrB5A4^w`Fr%akAVB+ll%3C zjS653Jjv60Ohvx7UmxOcX5-erytSVnR#X$Zx=v_QXWiapW7+9NhNPVGCf&$%&3TjL zhrURiUaak$rq_`-_51zP@JjP|Nn3&5xzSCWZhD+3j2U`J0jIUrmoT4Rl1mEonBIL~ z;zaT#PrYkL#f{OmqhioY+^>G=*BSq#fKib}^em#+jtVoMVFwr$rQ}okl1FRL9?+Y| zRT93E@YnFV_L3S!M)(THff(0y+^)a0;Lc&&V|9vflOo*wmm++BfFi`?ax*yhUyCs6 zAVtW?WntmC+ibX;gDkB(aM~f?JjfCM3D^_Tbxsxvg|LR;CDA&_l z#=b?Uw!3&fNdGpfD|fxcS!>cRbzpGeEq%0q$}W!jcX=Z8KE#=89=>^U#v%P-|6+WL z@A!UpNPoOx*lt$K-JjCQHjnbG05jj_;bU7o+RC@z)?4|$z!KK|9XphdY^OTSKG%u_BG_J#Xn`R4MW`Mms-Z9X) zgrAql)XR@$7ZYHyY+1+=b`hx*$ti{0q`Ld+%MD^ejtt}R{!JtZDaNJcG5qqLq!w%L z*a!O!`(VwqU*D4Qq>_DCD%se2i?O#CSB%L~U(O3A#o&az9FlZu=2@~<^|V%|1c^q-DMfl{@87Oj!CeUy)JdShZXTo&y{~+;h`n!oo|*-Mj$nkW zdj(7Cm0BYtn^4(#h7l5%6pmq!oNve*;*=3mid<^QYvYs=QjT11$gAR%5poUrnjtTb zi$>N+UwcKRw3$_QD8yv&dX#(BD6y?6BX0eM)td1Y!BWpMI=cl3_`;`qcn+!87#iDJ3!9S#Vt z!(Nx4yrXyS_^bGaH60qr4~<%zceDO6QGJ29?H<+9+Z|=7422ykM<3M(KjP^N;V$pM z{8&{6(&Jbt6%t46TDi! zSIjxP<5l$(%~h0C%L_V(hvg5l1D1j}J zaqsHwTX~WVPu8jqw>NiuT)Qw1(hWZ;RSc6o@-7FWCi_J#YkSY*TG;VDeQ6Wh)_h-# z_E*p9-@Dme=kx<6TR6U4KO$`9ull&k3maX~fAqD5-^Ots61T$Nr+aBGEV!t zGEO(i8SIF*--|XgkuznD5YvKcb70@2t0iQiMVuoS6(Y_m9_pNXDw@W~J(aynHKVsr z<1qEP*fHVH*ezk+4okSV!=4<6fAvv+9)5mi70re(tDv}KzpO&FxFt+?`k;(77K${( zMHl+;SbXhHBg{sf#Y}TXU%61@aE_pK9bBn3(N`*J{3yfyHqpx#)!3hfaD`3WW6P(P zWh~FIR(Q<1mglJY9ciK`dJ4KCsdGd4hi`@Jf&t3wBGjTH^{@DXwDLOuYMZxZoomyRU8I@ZFr}Hugyw zy>S>Lv3;Zu|6_9ojy>bk7fpLc`_n!>g8ftDHr|@wjb5>iezHzJ>nl2rs*Q5ShqBd) zV0A~}$e6}!+gM$P(4B*M=2@w0RcQ`hfu*{I`jv6AnxHc%V1~5S6W_awT~klAjPs0_ zP-DDA5A6_kb(dO|s`-?%sjUV%;Vvy;RU(F>*Z0ND-d=HNZ(eA$Bbv?d@K6$3pIfohm(0~ zPCc~nsK4md$Q&mADdYG^YVl3#VzkP8{-R}iZPSUsJ)P_JT@k#qGdGF6U+A3wWfwlt zu&K%RuD5K%=vJz`n%yhf@xOO3HHaC)r%a_>@x97p-%owigN^E&fssCunw(N!oa>y4 zZZqlR7A?eCR^aXAd1OVC1LF^jFOceE+emzzx)CixxO_P+K(reF8?*9nOv?YSCr3Ba%>zm&rHfuf!;+){%~w^aE|1JOKP1-s)EG+k?-6XMhp?0zA^l{_TP zuh0`HF2~<{cB&r~7*$m> zTWrL}7(%N8Q5d68)3tQRGqVSzyZjpRaHi)thqr@k3k`kYr)$X?y}TzbbdJ-=X5`c$ zUw2WbYk?Fc03F{|%Yf;cx1V>IDxg`gu?^Mgp*f3ff!ZxwMC1^{dmC}6GA-rpXr+>z zPLK$OM@oPHt{ z_<&zMBAJ;UYbv@;Sa+Hy*g0FhOOl5$9B2kbB@wJUv<1?hKRRE+Lf^x z978zO;mz(6z}*lAb4TBdWOq5(zNdxNoM@ipl%Epb1bQprfXcA z|D2o0lyN|~Xw%&&{pTvM@?JYJk;U4a1EyUL)CvRD~?_+5t zCIp=%?#Wvzep(Er|u{Jgc8*^NxmW;aJ`hne}_+wRP7#plHMS%R%8 z)^KN}mZMhHlN9Qte6)>N+VJEpf5gG84HG;O3U9R$f3wY2bG^=*{=ZxM+(a+qCVH8= z`F*#w9}rw?^4NXtVce=a#Z9HgjBT?kG09*{+>L8y{wjs>%L-9Pm%-B-+=@WCDrM91dl&Ki^3V>uy@& zfjQpx#?;f?$NW4a9y8?UQ8iT`-&A$iSPa@+Yz)bXb4Br`uvI?T%!w+*6FxU);Lc;33LhuCX|oVmj<*tc^iq8* z+^{3B)BUc?XFH1?UCmjd@@Vvx&uap6;vDMs`HTGa+?*{uE}L*M=e~b*7VYlLGtIk* zg?EI_UBoE&aQj;q(LS{7ma+-|Xk~C-osFIH30g2Mz>Zx-v+m{=FrG8TYD!am%d~Kf zlEF8m6-sEek~8WV9ueW!$;Z2jcHyUQ4PgB~eJcp(GQ-xQ|80y@_K(w_|FWd3=#svv zJEy_jXGBI{*-_Irbr7?srLE?SV~+EOqObg+MmQsK)U3Lq4L`Jt~nc;eMTrLSU~Zlh9D+8f)Z16JW&hwwJK$cJrI7kR>g zEp6yjzT^;%(zQ;U8Ff+?X?{D^@1C*-YByPiuF@Mj(#x;j8pFkXRr50Xs5!ta!F-*u zCJrU~L(j~J$Qk0QNsk`D4vpqpb{ zZ2BF8dzFtR*eBU%qk10=7aM${{d{PrJKK_~V{I2P5~CA&NS~os2IETDB74i((Qp5vURseY8P3%L-gjSFkfA-se1hvZg$^{aPL)7#a%-MWiO19DH<$#8((7OYI`eOJ{@#Y*bU<^WYTB13b0 zj>#Eq_YVGfMvQxMnEjJ`+aUkaUCiwg)!49?nY^h*V|Cz=UEn!T$mUJFTGe0MtFEKE z4cB>cdyA05j407lZ?sNJInZI_oPxate=F#4;Ohf>52#`E=N{tK|JDj$_@|!2Tilrx z&PB8E8U4QSf!<=qe{Y4m)ki#ITh~YRr8W04E2RVsqFGX;-dBwCP7P8*s+>|+IMP?N zyyNplUydHk=*{}oiN3L)7=0(uH~s3w23ePT_qlL$3;#Y+{6qJ4o{2f=&pByTyyzaV;0y=DX9B{9xtuK7PI=F0 z@r!N#Ub}0)yl0GP<7VT=h&P&>h02(%ilYkFgo3C-sjW?_Y%*4K9Gns`(3O8im0bnk zy89XBsY=fQKkjA?I9NTSq6XjQ*4l0J2w?M2pqFbG$%w$x8|30Y@k_vGr zrPQF3Qfjz0R@@irSL)@0!sA@^OZ}n8&{PIXS%w^)AeyxgEd7BOXpckLfu&kih;g*} zwz5YV>gMn5($3haMw;B5AdW_ zqJ1KIIcJ;2`e2;+pxupI-Xt`{F@Tz>uUBuqUe|&NCg9LkIV56*R(nN z;&b^t@%6bmgZ+MLqOJz1hk_xc{CcExpsQ`^cbtfXlyc{)lxJ{MDJMAGm9EuPy>)$l zcw<=3b#MQBLna(i1sQDgx#tV!@Eu*VfK42+#j!0ZpION}EzVA0 z!VxY~8U-s{K3?!Mf|4^^bGIHSKM-;ti8-zWgD~k}$mW!x{lk{hw^jP8e~ch8FC!n- zw0=m*M*oOIcm9y-A2Zp-d%I&~pW)&UJxM7@h0LbUW)s3~kdRBr!8q0EcE{L_KA0a7 zGJS$*XDdD9&mDu;Cy4tJ)AsV%ckla#b*WwYt6kHs*;GOUa8>PW`l@8Ls#3e^tcDNh z_Nh8z_hdK1bt7P0jvxPJ--#l;dD`B22UX!z`dZaid*}Uw{r=X(9a=sUX5!e1d{$`h(9JyA-Rlz> zn3ywh^k#d)Fp{c1O7e2}4AHxh{q=e-`|FQ5K1hDh75=)GVvF)}g%@s{A-d_dbu{`q z`AM>9^gG(rXNrck+LX;_if;Y>*Qtw+Y;*WA0ccg%^k|0{w$~72E_FAEe0HX2|2vs} zI#Yz!$@G7SG2!4W{&28(d3b1;*M4Qdo= z90Iy095u}-MX_|I8#B!a>gea5Y1EORCu?<>t!5IY5Mv3MsWpl;XRT}_0dpQwtC=|m zskp|b=*-w0wdBmyyqujQW0<2uHamv)3G-~9xYX-0J=3YX6<5bf(%o>Mz!EmCL6tUMh>RXJk zbs9^`D4(1sef&AkGRvrXpu3#1*9y_Gc_u~9JgYjcn`1K(5bWL<%JdbYiD@{>7gk`f zW}ba>3>opOL(!uF*yTyZm4Wa zvk$5vs)nDkHG`}?JDi}NK;23gYiwCW;67!Bc%^yqxg!UCUB&0rrQ{OwC^Xc z@dPAE#yu&zwMo*{gP0`FcH;Q&4@Kmp9E>>V?Tm3nm(D++@$1lCPl_Hx?gV5%m_!yy z+L$*6`dP!&ij+sEFx?vD#P1ID5n*EvdRzhxxq(NP%~uKDJEz$x!01(?RVy>z=yyku zf*&+9XW9P2_SRuX_789k#Y!3~HxeVr3^wlFaWtsG%fFflshW5{CE7Pi()4&$toQ>q zzuBRlP=lXhJeU!ld`i69(l9K~R2OrHu9Pz}{`+$CyXRGR?d6b69{icbdn8k|ACiID zopC1nOP$y8`v({856`JC7~o1RwG%hBR1o*)uj+>naP26K-&S1^p5r)R&pEQ6-_9B7 zUi-?E?uAUztIbL3bF%bF4!)IzTU~&Si*=+5@ZOz(J)RaFy^}OARTnw?X)$DmS%ji5 zf2pzC{V2i@6yUm1fa^v9=23w2NB)4mf>sFt^rRRaNZ0w5QUvEPrAjrN#gxV$ zFfDqGPqYsVcWYe+trooom^vOtp~`k?eyZNSVMY6YB)g~&RDGj95IH{KKNhGOaubcr z;y+M@Z)9Ym%DZN@XcQn|HSwCPP8qhrP&==OjJ|7nIwMWxECIL_H~RIgTJyEySgF1&GSQF<;5zEnX5L-GWbVeGM02<9nB87^h##%;9cJkHY4GKe!~Tuz?T{H!5r z@e|>y|7UB&qFECgGlhTTH0?J$o2OUSaI#V}(9cGd)n{B) zAs6Ge_%1iq7REfH)ps=Dux}dMlaoL5YlY^%5J%AHN7DxSaS*N9LIMrDeGDorNo0~q z408X3HP+Rs`7Ikil4`DOcr{rBrZZ!Cg?j?>!vu%sH-_0GumSt0263((1oP*=dPh~} z8nxTWTr*v>hjX6jXX9wEq{ePMvFk)ZIyEw?C>Jf>5nl^d8ha zB)}0!q$ah+*cb%wNzyAsttElZKiKZnNdB@`g!ZG-R9ClqvFO}L`%7QW6TVq5LPJXv{T+ji6ONjyBbCY| z^qg-re_k}3p%%Jp#zLp8J1)_mGfyX!t)bjK3*9vqx)|5@2Q@`iNzDTzJqt@PsxD3B zQu8#P9wzbZXl0vQFApDVg@wZ_KHG|RjoHd7xwFW&I^<={^< zEKa-Y7r7!^Y`(wVTN>T9-dkMtOkU%a&7jeIE5i+JOl!Ku@x4c%t9w`%B< zIyy4WRdaC6*1!kaxZ+qAYviaL@rQc99P~+5srr&?lMUk0aixi)Fiey%q+z{Du6HDBPw;2D0vp2DN zdB?vMSfnm?KDUi)D#>rz`E~yn+e8moA6If==yvgtu#F}BSoy>bF~R19b;=7nI9xVe zf7-!i4U--4qIk>W`l5LGceYtac8cCU<>$0_793TlX}|2ebAu9&OW z+57a{P4V|phJA&P@8H$p-sI}RTcMGwCPsht*P6{=*3=C3YmYf?$DFnwl8#qIQ!o1=e%XAeFdkla*JA!2 z(ag=u=U)~50s;vic*w>nRztXk^1`d4m8}sG8x`vLVwz{8F#9#3+ic6;!(1zzyI&m8 z{Y{G`#_cD*Zl)E~*Q7)-LJmS%()2*{~HL(V-` z?U0;#Sj2TaQNpeC632ldj!IteR{Y+A11#0=86W37@XrHWgmOh)80-jjs!QFU9~KYW zN{L%qIJ{6S)NK{-@e7&4V?~_s)=L||$dNgF<}5!~TH!rM#UtMB^K`W~cfJYN0C_s;nyn!)s9p5I#d z`iEk?-lKM(qxLG(wZV>*_;1ImT?RWG{`2XL-`FDc`jhC_?O&rVh*uHc9-|`GRIT{z zSDO?0%AdpvpDec}lO@}KB>w2$kF+-TBa;0{Xkmjti|sldM-Kjcu=;4Y+Nj7QC&dQ= z;Uz=Zi&FIxTZ%V7jDGGf+}aB-;qg=9pZ_8@>kadDE@SXAC<|rwcjfC`#gLDFBJNAy zMykJPy`sou?5f=h|vq88mlNQZPa`4+(y z75=GAJgWcBv^e3Ec&bi5U!LOWgn9a8o+c|r+y&%Hw`%j{)lW?Yo3u|+LN>2pi*IV6cZKL^n@qtc7d~7edh6b)$Nz^z_*D7Y z=VB=fmbbH>vmV{P{Y7zRN=iV^#DT7pdYm!tPwJ8-LA8( zM|loOj+f~pKkcrmN?yUQ?#uace|dx>aC7vPqb&2ahS8)i#M8z^ZB8ssKJ%eWqi`aa z6ZNkrmgqNofB8;L{?su!$Nc(yb)-gpwWNr4EgC;2=Tm!V@Bml#aX!d+ytPZWMqhrr zrl#uV@qWZ$+z={%ymH$+RXqmQt=PlImpW$o%^K=1k)3nvM=Hg*0p?UU)IHVNL9@zE zs{1b`x_qQYtLpESadenF86Q_fq3#kt>7!ISN z6_4j&mqk0n#x~w0$+)Ycm4DGOwb=~8L=nVX zaaA;LS#*p6aEu?9yw8tI-d{U$bgn(#E8K@GWtHf&QWjnnZQSt!iDw~R&^MxayWfd- zTpi0`Tgi@p6Jwj*Jg%Pb-aPKbwS>I4A0Wfyqg(U)7f))xQHr5PDF#pq^(K)sf8%`1 z`XMij{7~Ht`|z0hfA(0M{tmYV-NsGRJ)*n%PpADpTZK*yi>R2cZP}hvUfkr9(;K54Z|S zE*S|HlnjtB{EY*h0zwy*#JH+iVya72W1JXmp)tIj16(oGK1RB}5gmJs`0&yZHF=Nt zu%>Ftp}@#SlN$2^QgxaZf{)52kGBTF@!8XSz^mXC4c(e!l{C?9F77RTJ9>Ce?XhBO9N;g8i~qsJ+uSb3l%}fq0`VMs2aKr z`Hj=Grceab6B-1Kft=7hC=FT*ZH4wghoJYzY3W)S%th!L^fP2n)U?J>TPPBWfkr}; zp*hepXf?D6+6@&z??NY`^Uzi32go{J(;7hGP#35#6bmImv!GSb;_>O4mJPEL+6TP@ zoq*0lm!a<Hk-2KaKJKf42bte{O%j$&CM|{EL8k zLW7_&kQ15*r9o?@%K|e$GDNNZ=TPPBWfkr};p*hepXf?D6+6@&z z??NZ1(EjIPu0lUR)~U?dP&m{D>I=m}Nzg24F|-QGhIT^xpm(4X&{^m*^c|!<#FPz% zK^>rI=s_p}nhq_1Rzm9@N@u=?$%hU@rO+v;68aXp3Hdsiuc3RPC}yihCYJI zp)1o08xOJkpa)ExfnK5I(ApWAtT)WkO7R@E%tdr?P_*7^Sv=YjMRDre@P8ngbTMI+uEibnS7#XW;Q=xg# z%2-_u+(oc5UR{G|TNa6x`tU+x;8i>c+c>e^bKV{GD)h}l z^wR@cb55IKoLPsw;1^xdwXIxRu!3_Sg=5^PWaXzwxhc7A9SXdn_ty?y z)3uO)m~`V?U8@hTXa~GUR=jdk^2c@Pox(rmTP%8`={`bR>nF66P=vqG#z2z`U9VaG z+$i0;UugBA2q+k80riKjzag|6&~0cSauT!vS`F=l4nsE0{Ojw+D~E-43OWm&hb}^w zAoZ75Bs3i?E)-e~e}*Gdv^L@cGKLO8nb4q8GJ`UpD5wI;lcP&4&C<1VLW_X{p>W6n z{kjY{E(k58LTGmAqi<^I`q$J6Qf|3Wh}%!`b;JD@?=EZMHzk(d-sy(|EN%xD0ac?q z@)G1yWK~o3w*Wd>N1laTUMD<1MbR$Tk&}_H)sY`VzFtRun8ir52G(XUmjHfsRV=j>$fb0L4UFg)-6O)UNbF& z++i$NPZ@r3Ixj6Cf8{$wFOj=WTN$R#eE_<(3wr6=t zpIO@I339WNqU5p9EbVkVPa!NV^-Sq=o|rd(lpW4nTI)Mx93siiJx`3jGUvRJ`XA0) z+S&a6M`&B5{{;(QMMmd&(&qwU*2&HnEUnYMG;Odi9kUM_>u=R&eT=+H3nb$dGG1T6w)zlq2jnhbe{dkkC#F*pLB@H? z9B?_f5?l{%0C$6Xz{B7>Ao-?zY)#ivF2Y>GftsdJ(}&T>!)WB;reF)O3m6Fw1Rn$w z!HM7;a2~i4Tm^0bw}8~}VQTpBJK(z@8hsdzK70wh0{#I0Y}MxYVwcuWhiL)R8jJ*c zf)9eR;6!jLI1gL|t^!wsTfpt$UT{D7F8Drp3Ooy50lx-+25(!nN9t?ZBMrdT;Jsi^ zun!murjLY~3NsyC1TFzrgKNR<;7)Kqco2LaJPw`(&x2os--5Rpxx%WYHUJxg_ktb3 zK45=vBsd0~4$cCXfXl(PY^hS$!|cRiH+T>{3?2tR0?&gN!EeFutbCYK)8=}Cjlrg1 z2e1p+9~=md0TaPl;2dx{xDs3sZUA?Kd%(lsJK#rbspftRa}kG2;CJ8;R&AaadpcjR zDcAz+0!D%Z!3V)aa3VMdoCmH1SAiSAE#Mw-FZd4lu2p-KaE}u1QNlf{!hMYUDezJ{ z%oUg)z@M$!d|yqQUmt7%wgw}?p5TLEEI1LI3eE!;fvdpP;1+N@xEI_Hz6-u@)fTj7 zA-ost3HAYF!I9upa5|X&KFo2Lv*3B~Yw%m}wx%r{ z3?2tR0?&gN!EeFutlA>Me#i@K3^oNjfL*};;6QK;mmEd}C1LJ?uZkRnd z90uP3KLS4nFM^lA@4z2uJ1^SK7iDmdM$Eji8>`y=E<$V;QHF`-20)F<>G%3!DQk2UmjY zLDl|Ccf;(#;V}3P_!0OqcoDn=eh26Jf1>XVR1wRH)(f-RW!CV1<0Drb>kNaxcUso*?t z5x5Fm4Q>IqgL}dK;Je`a;3@Ddcm@0#{29EB=31k<^m}1?!t?=S!I9upa5}gMTmr5J z*Mi%@o#1}(AoxCb96Sr22fqft1#h#23zqVG!46;_us=8w90N`VXMt;(|5vPs*@?q$ za0$2^JO~~JkAok9--6$P=fR6sElqIT<^?ten}Qv{E?|FfAUFn01ZRPBtYXb%O{{T( zL%|V@1Ys58nkGcGHC^}xYr?OoRn+@P6ZOihqT2>dblU><1!Jrt;EE;!zO{-5xHrJP z0dfQ6hFvt#Fv==gHqb;%;{n^qBCUlZYtt>V7rnz%2+D*E|pqF)26h;wQp zjzW#WeN0w5%=<7OTgBLDO^l7Tii9#vBwVzLL<*LO`JIS=;t8ur+Nz19Js<^5Dz}P> zQ#CO$)hd#cHIcjs{1~jTikVTGm^l#K0q(VmS@&vURu^zJxCuN35^i>`CT6GagSiZI z%_>ren9|289-pp>$0_0C7r`r5v3##4mLIkXnn$cyX%*>hHIW`^73=v?&ict<5m;&! zJHs@wvx8N zqHi>q1Wu*Rl4-L!;94-7wnGDP%W1M~nrsVr2}DC<2|pH1BvjLM*J-j2G#MEu(pM7E zY!U@cDyGR6(`3X?rXtDoiR8=aFqC8_Dw!D%9t4YMqrS8eZ8&QWxSu8>0nBCbcz>D% zcgDD2jEm*-XqrVd$sklYl%|+PQ&8abNriS&p|@$$w{iba)5M2XnuNY^Vl9|{ z1Lh`eGKV%n)t}NiKBaS=dWR+{p-E8L>2R8aCc2nUlVs2&nKTJaQ<+RtY^Op^Nfdjm~L-%0O8 zll5Wz^T1fFcY-D0$Fx~EZFVnh7E7BYF^sM5>9;b=&X(9@8+D;SI zr-`y?qU|(M3Qe?xCK^f;(Wfr0qKUF;8ZVj#O;!=VihM4kiOcDzt^wn)K`EFI9zr#= zO&ls4a~n-~p%HrR*fgscN2eS|_(Z}b(w0fr(Zp>ufjkj8c@r9-hBE~<_XX)wGg0|W zG&A!&8lZE|nui7=(Ev>|domiBoeXmt2UM4m$po|x)etb9-nyOy*OTCeL``g9IPN;6 ziCx8LrU1vO|T%-VBTtYKnqnTxB zCIiisF#a!{KqUmMA|Tg;#ARxHrN1VwJjlFYWnQo|A8cVhK($$e=sZIyAPJT49=c`;53_1P^E54pWj^R#@O`V+fJLuCQx-9ctiEP>ARX^U zcsF8$-G~i#W7f>ZteK6kfz?(mgtan+wK9Yadk7o$rqea8DT{AYtbnGsty;6zn%3-I za40weB)w*&*DM>{1hP?Y#zwsv2LjDF5D2q#vf>9iz$gs3rmXr+zqM-3FKSxzOIED~ zA&VB-Dn4+AIOFF4~lX6;`b+ z8Mh_lw(G!bt9Fl{rri?=a*%h=GH^Gz$Evk!p=s?}gEULKt5z+7a1n%yKm!p`7;q6W zFoVF6;23Z@xYDY1*vA940`M$&-l}!nplKbqAYVcL8hI7+YUJCXKqldiB-}9yj0X3D z`$3wZBTdi|O?E_+UC5^k`E*$TrZ0xchS>y?Q5Q1mO3AuLfs;WexEgU78}w|GtKhKjpUpl%eX8{xVUE|P*oQjo}5;2dxZxE(A7Pgu3?tuf%b-wT6k zyQA9fsJ=U@?|u?2vuaUvswg^D)Ov6Oh+!9X7%T=$z~kUYU^RFhq*F%GDSM#N9%!`3 zN^lj3>U*I2o-|ocnylwCFwLrQbeOL7@`8C#(|W~PwP*rF6Cj!zL{o#_6E&^(RIAn} zgA=Yy5S8{prF|;EN~?BXw5HwH7n}pm13v;kwrYJF^E|aFNCo;*fxfH3wICYni^lpz zYFfXZR;_<38~FYU@c0^!Z}CXRBLyTvKO*$I1YRK^3HB$!{sX}W!CdhFq3Dj|yDIC& zfj{T?goKlbh&$ILA|j-Ph`39{CBlV>i}s_%B_g6p6S+i0Tz*K%CQe)v=bQ)==bUpQ z(Hs+TOq{rI646915fLKsBV2@pTz*_$ym;}$-7`ZgE^Gi`gU!7`vNXv71wY(cTlQtm+HLUe&X&+8OoEPJekas$-Lz(r3&P! zKuMnKInVW+=fFG%eoLqMmQM4nCbq;dQREXven&4AxcL?YX0o~Ea zjZ}dW;?;k_qKn~_`j^tR5=VVUdbk1Zk=W#KYawS)>idvwsjtx}NLKQ94B86I{ zP)vnlD%7HdTC`A1g<>ixJZIrT4CaA_??q~|?`g8{Wpf~haX3eFEGKd@3pt%dEapNk z<_fOlYF2SQ>$s6kY~^-#a<^~Z@9np6(1v3?K~4KTP5Zserb2}nrs;dr^gXvw!IMmw zre&sSnQ5aqniJ?^m{!0-&SDYgb0L>;1|iJNazBso7*FvG zHT5)2{qH?O`1fAy$4n055RTv|j^hO8vw$-=i*q@jOSp_>EGf58ZDB3z*~n&YVLLmx zhkJR5N7&6%JkN_UOixWg=)peh#{nF~9FE`^j^iZea~fxGj&I)Sb1f{gVF^oF#!6PR zmi64kX11}NySRr3c!*ZEKIdw8fSA3 z7jO}mvy>IAWDRS%ft$FMZQRLS+{Xhv%HurEv%JJBG0f;`?neguGmC?L^UfG*VI*@o zo_U?e3a()d8@Pcj+{zu?$u92WVIJj4p5_H!is1+PU-&^!3w_z2 z138$(Ig(>Jo|8F+(>asHoX5pn%9UKjDz0H28`#7aZs!i}W)~0guQ#`|qyd1-<9%dxM~NA-Ww zFNB|D@(7Rd6wmM?FZ)5ahaYr%(SF7DE7nts_0(eJ6f38A24`_D=TlcNUdA$(vzlvJ z&qiMYhN?pGc!RC223xnsaDN)Y{XJq>QEZahJPLn>@Kv84dOhKFwgAt@)1SwRwmMUiON(hgnF+9@5 zmKatmceQd?%iL<2dvtvWkJhn`?X-Voi32KUT9{2Wt5mbcR)_Fd6}PZ8hR5fG@c3No z3VKXIRYh0l8FC|=e4gX;5$xi=7^-!I>cP~(s&%k60$L-WC$mF%a$rp2%8dk|E32Yu>K>?c;;QXN_ zauV}t#}+%jtdG1rJ_ZR1TYSECl=-ovxrEDNc(oyfS2s|GUX`KNIx|cgV%Rn@gl&^! zXsb1UzTTx(@6u}IWm8#03~vndCGf`J7m9=H`cgo@6Hv)+JMOmQ@0Qz8$_>=Zf8QsB z-}j4Qcel?^#jt0gxv`65Fa#Ce?TBIDc~g@w#;`xfB;FA*{Be8;f6R;FfQ%fN5rbmG zL4p2xN(g_R8pEL_rcW)4;V+uzFPi4CwmjVG`adF~BO)^F82&mxCf5~(4N|s5<3Mr|SlIj@V zlcM*e=)Ds>8N<I9`JB}vbaBpESDCx;}R5|e8d zhUA*XzS**Tvkl;0?vKeQVn{yGle1Xl8;?D%I-d)YoTw8{ zrtA7T*L6mINHPl8n|)pH6|VP6HnAlppXw2kPxXpPpXDLxQ)<21`daHdtnakmX??eK z=jr1-pY>N*Kb!6Qp=5$D2>+-Xc1;YsCZEmq!5Hf&te@m;&WTCp&X8p8ipdQ#LUO~b zm}JchN!9}EtF2ej7tIYal$C9}@A%IN>~jLU@o-3PJQ|aM7eX@dQcS)uGbCS_&2p}e zNy(Qsgyc(`V)7+5|B{-2xjrOcZj8wgH5{UbLmW87fnS!|FH7y0rSQvA_~m0f5tE_a zAsKoqCO7p7$xZ#JLN}?^hrl7AK z;Gvj|QP3C#eSKy~zCJr9V~2!f>@YTRBb{)p6ONOKaWXMZCdbL-H&o~wD)fyuw#Q_= z)Q^|?3HrnYePY6Co{h=vGE;K9)ZAVclH1E;k~cmid3h{l8AX^Uz;9)SxkKCD zp>6L_@Er=Cq%Ta;7w%jdk~^2j1T_{K)nn*?vc{a_8{~k12oUC?{Cu1hr03ACt-b zLNYm%0+}q3$+J0!3%QswGr4SCX|Fh;Wb$~+d4kdp?ox^TlY%ugI*_`6Sm{Q})nW6_z zX|-V=5AY1nDae7}c3?r3?5vTEC>uRFjWehp7$8i(mmxcSVq$nLF}#*c)4`|d;3f>GQGbm$ICCtbm^SFojYRk{azvYes50XWUBG^)%b_q zA^G7c>z&qj^AfMbWQGjQkf9lMY@kfekjWo7{s)f#!FtwF#eSe-Gxfij`rpj8ELm@1 zmxVn}AZ0(4vL8y-52fmd4*a15J#QzTw-b-MiKpGfKZ?n0nV4P3>1^e8YP#8)&ckEk z;W7Df8j>IPh{@ffLvr_6+W&6*-z`IT%h25_GU0ADnG-@XM+ciTgu|G}NtEI_Qane& za}+%1A}`0}Cp|;*lMG7vPqNouA1CC_Ipm`wG4bzaQY^N66mgFt?$OomDWg`rM=Rb_ z&qlUz>$;_mEip?rF-tbNcW_AV9U7B|riA37sn*4Puek4B&Qh*s6(#y!iJm9ydBUDI zlDRy{!!h{}3H}cW{*N-2^DvLbWWMUnSH1b=Tupg5!LlTouU_-j>!)`3sU3dmL_c++ zpQ`^))qg=wNEVEs1TK)kpB04UXN56Ys09~lz@N>sUSz$|`bH{mq4ItvfS(CqQC>(E zO^V54Jhe{7((>pBm!lj{mvif3YtlztHlgjU}dyB|jI)&jqqb#TKd9qUoF|5c@B-ze#t= z;u0tL-%|L$rEsy-FP8enm8@3K90kpd$%-){SuxJKRGNR5{O=j5H|*y@p5uj>{BmqaemR~? zxQzDurTu={$=$phlI0;L%Lj5W?Z4dq%U7|2JGhg_cp@hEySVRnao?|x+^>(^U*^mE zerTD9g>NNUc+ zChupH}A6ySOJN zwY@`9+m{6_jL9=GB+vBZc;?aeXRdCa%{g4i#p_Bxk#UiB`o=fw7$ z*q+l!&kc${N}ii$VTKKhxs(ok&VkRhP%AyB#h=?7lLoEZpmiH0qhT<$W`ovjkhlhk zYmm5xBRt8|6llZcb@lyJvZ2kgBtNeOpVxxV@8$lOH1-HdV=v}%3?-^jq8iJ&nvLAZ z9o)$aycClchJ@sWVU*w(^0<`C*}+a8=FymJkfaU$ecx};8#d?-UQkXp%;p-_Q1BZB z|KgO8yf~GT@uFnBxQI)*lB=kzzIZGq8)a>yuKl87ym3`HfI z)OeE`H>+{88gH6zeI|9AO}fo*bd%rcCQTtEO_2g>DiKkWi?zwc+SJM23ht-iOituv z%FIhL^U_8(v6b6-*@=P^+P~TU&9$tj3N@?HW`S)M*k%E37SQG`Y~@*=k4a0eZ_So5 z7G{K`WftwwVuzM1A$d8C$;(5TLz#J5W?s(YB+lj>wy`}X9Wh|$Rw#sO$Oti|xw#<-h%jPT=v4vY>(q^zIX%qQ2y>^>k zyG`3~)ArkTaHk#m`n*D@%e*97$1x*uf5n@if-eB2(B?Gm(Ig0@fQ6iVQB3EbYreKC1`Tu5G@ zz~wBZF7>)D)jlR9?c*p9?efsRle>6=Cu8!4@ZS*r8-<+C4ctWGzR~3(JX{r$!)s#l zfqHzP9;cUvIhxC6nnsNBQc3Ut_?fd50 zecwF0@0YTiCUbtjfk${ErnAhyn^hCjnF^YzpdxcIi_9P_GIgRMX0Cn#lK9-;h4mpFV%=QcNFT9n#0w#@dNB~#CxH$(AaOrICn^8$Nb`Oho=c^QAci=LR%=k3s_rj1V2 z*pHbU!eJcAT#C3+#EqNS%so`27xP2M=b#&O&DnC^6f<{-V*1WRPLAoHyF&Ws zeKGw@cS!$oDyE0k@Nf-B(^SdBwjXw)_fCY=AZL2YiBDPoFe{`VntS=76MvY;Nz6Aj z@{FmGn&@OnW=KzFTadbw#Vn&v^ADZtA2RWeT#jKSW#AuM+2#bRoS=%$+~T-_jvGvE ze$w`Tn6vqh3Di{o&{U^d?YG_R)i$$N+o?}{cUMeHzI)ojg_urT5mK{C()*``^nR(F zw$i$S?w@L1n@)4WX=|)Y_5FJP4;Py3xtLP>L#cg0O&=H-)0F~W>8f~eOGqCSXqir0 zHX^1EEeh#F%dC&JE(2xNTx-VhLlb;3$qv)$@_0z+dq@f&y1+{@T~!>?Rr6!Id4oUi zyD6q`^$+P=GWJ#n)!>k(`b(;5hBAk9I9F3-XbOS6KPaT{4>jFYrv55ZC+3Cp#3C-> z64(EUatmtu(X5buG>%Q`klb%9hD zaxeEw`EDui^0@&25v?z=zTD^hhfMrKU-?Ignts?*r|3;J{7~=ya3*I{TYf0zA8NA? zwc%-MI}VD<3UosmZIm%sJf?L-xuLvR9dVYGnOJBkMQjvw$-=i*q@je!RGG z8OuT#bYr=NY8%$Fo{cnseWQO_Z)|7Bx{d+yi&v+2-QGWj+b42z40(q`$UACYTY-6P zhGf1qi$z?>#VlnR*RY0lY@nYFzI7~yJ8Zwhc7txgpj(*Kzzy8ZE}rH27$z(>ZEa}` zCF8I7v;C<6+{4`7V*Y6~|FmZeL!EG_6Am+aKdj#G8q@r)F~iRcWbAXX8u$ z+4z!w=f8B^2(Wv)A@1qETw%nwl54r%$ZxBW-|gJT12H@*&_@OOZie4Q`uNBC-7E_O z45BYFh`!9=xqp8%hR0CZFNDfWzsRV`AJpUz%c)iV(9RCZ)E{K3YoH%y22)^N6Da## zlHaA~U25KSif8;_)6)+&eqMNI67yNid4Ab>N6p_+^LO@eubTEz(|#Pzk=#Ky4%amc zaEkzo1X%3HvTQ$=4P*^#>1T*teumhiyX?_jb`7(xBD*SCO|8F6>+i9?$9iRj3YJvH zP^BML=|@!yxG09l2Z!+ZP>yF_4Aq$-RA)1XBVuyxf{!{k@iH-9Ci0vx z&k6IoxG#n~m2;%r#^<-+<~71FFXi6%IF4IFfFq3f)Q-x<@g0F!_<~ zKeByWFSk~`soZVK-KLyv%Gq|o&Ehsc8Qs}SguP=ZT4s{M3Xy8#IokLqxuz40;R>!~ zIagEL{zTg@cY!T;fh|A7b20dm4fjv=>;E3V{_o{EUeL=OU*hfx3@hh`uyQ{2ft5Sy@>zL4h6l%n@Zfk#;e#&u2lr9$E*lX- z*(kb9%gQLwGJ%%qV`VKdJk&FUhcc+C9@10~m5j15+CmlA&pkIR{8E(b(&{m zcsM77heuF=4-4>N`#o&Ga-FbzAQf1yz;YQXm!V(jGr!VjekDV{lA&M8$ggCi!hRL@ ztI)T+&=N{2S}bfeA3=>CQKLtevy^)EBYO2CQu~P1Dl@F^$vK?M4t7#!TCFoZI>L25 ziZb%3j68aZXY}$(dU-wt;JuSjHCiVh%Zt41`hQ$%9+#TOTe)2?w_a_%`XCSU7*E9T zgaDrq;1hcB6Pj#IYQ91bu3`m`v)lXyfj%kFC#Q2JH*gbW>`570>l=5iZ``#ivUaZP zf9*yKO);$N8N#{@=CgnTStpQn4qWHJnt~8&3R%ng7@q1C!c)Dukc+vUJJ`j2F|3#3 z^-{dPlGRj^^(wMnr(Ca7J}rQ!OQiDYEf!j1knK<_^4k8)Vmal#b{`MK@Ql9ljK1=W zCVEB_J)^*96j(Pjgt{EAW)%@9V|xr@5B1JdpYLj@FR&n`^-@}| zz4cq|43 z55d4gXmsL6=Y65ZFS{?O_6sLNc;R#m8|H?vVLq*Iu{j|XDdBvYGYYLiTDlBrE9wn@c)BU8VTso&JIF@~m|uK%VC3k$iJ zQrC1OhL=W%@X}an>zCx~r4u}9PKqy>W?wMPPT1^(&93ie*LSl(ngz011vaa|<}U7| z6K{6n&8~*cu7(zYwFs<51zJ>~rQ~u5FNYXj7U|0(eYu03zN5$cj?QBl%ejfo^!XN_ zztS^=R|NjbWKN+Izv9HNw6Q>v=uC^R0t8g!wGsZg!aiGr}C0QLg`2S6isEK^woS zjaz-t>VsC>TW$Be9XxM`Z6e<$@@*pDCh~13dD^6zf~$Xkl;vDaC-Ar&+LYI(yw_y% zHJN-(d9Nw&wIe)6pTBm>^}jvOESpI&Y;R&q46kQ~@On0Nme+Nb*QatC=W;%s;B_Zx z&+wOd`fxrMvV~h?c*AA+hRgDeg#_0RAX|KMMGd0zS}a&dNq}R@CTEYV;?W`;*Ka zbi#v9c<=;In#CIPRF^j@f?9_W#q*oR>^a=S&{r z5p!U&UH``iTBv0`MRr_df6Mb9zD=S6{-%HvIU$@FVGhe-b6Ad=yW;b1pZ{G3{w@P2 z`=bXe##*+qdLD$uh@_^`^P7pXp7 zLkFC8z(0NQ{L>fDKj(5jZU3k3XY$R3DWH^}k@AoFgz!;6I>ARy@R5prq+${i&PK}c zSs6at#1_~8e>?GiJMn*)b2VGJon71)!?_%Pzi|W?axta;oYbE?&x(c5y!s znv8SWWSp}xTp8*Q&*o6MSCo52c~_M8@g$RU^0}1;>yls`DhxDh$IWAK^B4?Z1>x+&8(gtX7%)(HE!n)vwPfp ze!|V?CmOlYte!5DdiEJCzIL?R>9MS5Bi+4T>+ZGZ9J74pawD6f|4Sz%pUmMJ*6?yj zdWD$ua`)WJ-E%JwFumMO_gYN@Zr2U;yfBz5cAbh{rvlfhK!)>WIA4Z9GD<{}aoWOJ z(}bMhdMCKvNZs{D>aIV}i!tf#1ihW0_d+gaJ3DBou(zSY-U{xm;7{e7K2$&tDxdP8 z(kGfm)RVp0moqt=#hk|`gT;MXEI3ggC;GI=J}t6O*RYmHcq}G;^Fq>h5@n*VO!O6S zUjcu{2|we6pV`W`nDkTQernur4(C$p`$>JjLp;KByg-@ztjvA3%>Dmo%PpwMXVs*? zi2IAUe>Mkl2!~PA^w%`~J)rdWfbuURLh>)8xR^`n1pnd$nF7cZKxP@0n<*2SGI2vc z^PV!PiEhwDHy8`P!6RLkfB%!L3=7jZgHDv?L|G?z(gdkI6Qm|lMm{GapR@gQwr6Xq zY)zG2&eiPVKAzz@6RHGqqd;!l#XT|k{NRv$ekd1l2`gD0lP{D^3dtApJw{i1j9%+8 zI>%%52-sK(o!o6=)o>H5Msg{a(<9eS z9=UF6VvC7YJx#32@H6W$onn|yF>F2SC^f^RX4rlnq&_fAANa~J6R?JJ6h~9RUs3Q^ z1oRaFeMOt*Xw#e??8PdsVJo*&hH_-+W=(dpCL2*_VpW6d|CV4vRWz~6b$pBK_?8M* zQVnlW!&?sUkO^1)O}NUU8jn=tkuo+?#zv~qNHw~(&_t~1+{9)Ruk?{o`p78TN7+7V zC09{JN2%y26&vN>|Kv6W-lo9Yr0g~+yKOS3u#Dy0#{)6R%{CKDr_5czMU(-rhbFmO z*+vEC%2e)2o{q`C=9#cHiRD~P+yB+}(VBR)CLX<-B~=!jV6+o_tso>{E94s1nAz3O z%&tsM=S&{r5i`96@^yiHy_WSn#uH|GO)%4IBCEKD0vaoze;XT;e;dz@Y%&9^rx{=w zbTyQWb2*GVV8bC(!A6-1HkysxXiAu-8Lw%^&*W@6(Re5Nri^`4#=a>--;|+mp5RGS z#)g{klEe92$b&p==2*6wV*}}OzTM?~`$8^eyX*hnw`5>qW=JMxa~fyR2`4(?9eoU7^fPcF;5!98OP`sg&&<-PXX(_l96!tP zUWiG&5R?4q>dej`=@fT}><*FLIn{yFjCdR|;&IG~hfbKU6FyrSl4r}P*FM|8-Rz3V zb5i}BR5z-5qnf`UuoncjK_)lI&}O@R|T#JHvCl$jdR=Ua~wS+eYow&UsB<+8apl(h|GL! zbT*6DHKLUlizNfle2w@$8%01lk_coZ^t?7+$_bW^R$0TNZOEo%j|fzSVg3t$nzU2Lzrc z@JRw+D)8mTsmB@M9%q32+EW5K$4k5t)6{@=x*(=K1kj_ycI($#?`ash=WIWerG6;u z5!36Ih4i`=DlkR`#tBG(IRea)xg43hRc3Eh^F&i6Mas2*YX57DV_#DuRdI`y>~Nxf zPNW9^B9MQPkxc8E17rI6Q6c@jRJxl=b9%Fpn>5iJO=Lv=76tjHOh;ygbmR~UV5Ad` z+{l)g-cTCS8!BR&C1Y7KmYpk;V>s9ERN3=m`jtK*{YpP>Vl(&ia7@2CKBQmG^H)uD zmYWrD^LbvDfxa@(U(L6xxxh07meG@^DT6oEIAN_5E^@+U)RzpTr`Z#oc(QT@_*EIY zxyA2PH)~seDj@Zz0@Bg?z-WD-hXQ*ju;*we8Y{I6q;`>lHz;_M0(H`?ItA+8*?RX^ zHO*HSDA4gY?~;)#YM$yN-TKIxm=5b5(qVnAU!v{9{B|)+rV3{IovJ{p3hLR&we$pY ztw*kFJ#tOX2w}4OsJlGb+-3WmtPti5h+##22rC->BQnT8B13#%^!9zxHzoy_jEr81 z$xk+f@VxJXt-f-%p74cX{WVQcs3wJ)>L*hD6P@e3u9EM%N*>hK4>tMvN1rLn zWF1xLq2Ye*(fJr3P_Cx^zCKf2p}ZP4aFgr* z9+%TS8)?UT>^R(shO621r4C#r@_`~B%*9-)pdktx7SsFkLwa8!W$r%5-M5>XV%f@& zE-R-RF6-uL3fvzkOHH*)e_6!2G2OjB_{&K3G5vk7kp8}p0_24?7En~Yk(e~Zvl^2wo$${Em(i4+pTkz?}Jr`{9&4n{xD4wyQrq+_A7V& z-=(SUIvmq)tH`%|$8@%UXP@z#<_W)Ps`+ENemK`Obpoyv@UsGW)_VN}*MGelzi=v~ zFF4>u1-z($J@Z4lN2;%UK@NV|gJxrrcvQIoELl z_?tlgmc=0|Fj57^^ZLmar2c}MT7ZA|>)SJ%e$;q@VXSnv-w$g)_<#Zsw11Y?kO2)TwNAm(V;E2n{Fg#p!ey-Dni#G( zuyXzW7;f7W!fktF$ekQQ?i4n1BaMCK?u_B9MIn5(mH zoXHhj>6ZoNJg%JTxqeBQ?-zvaenHsb7lVAi7!<_tKZYXy=jyzn%d5RmROQ8@8rB+W zSZ1hU1%3IZzKmn8p@cDp5VjaXXmx`5POwmc#y*}nsK6NtoW=F5Q*f7p_bE?yFT0sb z+mzF;95?E5qH^3Hf5QFoCoYGiNAM`pW4whtF6DCi*WlXJi8SkDnzd@6A58{RvsP(V zb2x)JoT2InkEy8)JT3#(QB8X~@fIf*=;aP}@)%F>EYAz5UO@gCOPg7;#ll_-`+1bd zMdqKMPx$BO6Yg6-;l8y;hQRtTn**KD=+5J-jrwS^{}&x+ztn!87;FFWtYNJHD+E|c znW~bh$9p)gmq0cM#J`j28jm7rjRSHVFoNY&@MHSNV^>o&(E4DyU;c#qkhlT z?x29ijdpDE!Bji=2l{*Mws&wJ4^W1_Cqv&m&9hEa=R{6WlovwLB(7qG0Cx+pi>G*o z7kOD{?xi#L=4{UK6K0*E$mI$s)tgI4#^gIILh_xJPN1`Wuhj{rIKfmu&UW~5wlgMo z4)>^HzdOfpoLdhMVFez-3eHm7-kE3nB)2BTZcW@-e8+L$aol%Q;5#bt9Zmb46W(Hw z*&oa7kFO3z{Mfz8j~CIs%8zSVACtR>h2-wxl*+qX*h-nYyPK!zgm*jPPjE$R zV^uO%rPEfOGZay+(^ao_S60on+|4fT=fRjfF)k!eOyFWJr6zhp6FpJSMs8xW0>>*b z&$@t~5KvXV^#bKIC}#uR{Z+gBs}f+90H4UR-vHNt)f^k<($k-rWl5D9Kd#2r%?{W? zsjimls)asZ?7$fgoMnBv^-}ATtmnt%$q^xWauj9sNg4GUXyP}}WNl|i*6xnUy1^k? zHrlLQ>;3`Q*v5b{tP_{G>KsyVn8x?Wif%X^NWpc3kLlCwlVgiFR_A{SMjh zi2ZcRbvorbO|(uE)hx09GW!+UZ#tFtr1I9vz*-qtH`;z;>` z$J2H^YljJToM^iMo)o}31+Pxhp0uB_eAPS<5^wpa5C~@N$okyxfbvXkPY3^Rfb8R^ZDz>B~Cl z76oompr0s{EzM?YFAK?wE4ZHrW3s6$B%Ai}2#*Q4TEJ^#($q5~etS)teBR{ql9#0T zB`JPs4(E#4db9QBMs5^ojz~vPAK9#rY~D`SaZ8avi)p>Z`peq>Wo_@b)WmP8$rhQ~ zB2%v@?-k{}B7?8U;MPLVR?}nh>a38wTIBlQrfs)r+ihyLP0iW{n8Q2BU`&65FzuFaOt0%q?LKe!dHZmVWG(CIvTJwQz0ud;O@ChCrI_rnzQg(sO|U}~?3lq> zuKyiswnNQ!IB^O0MS~mK?O;fW8j+OkaP)w!eaQ zDd>Rh(`}!_i}djInK3?hgWdax&)qNgonZSU3ZSn5GB0~j4<6VZcY_=4ERP^rPMkHC z<5^Ajwl})Rz459ZPfKn*6w?7KLONh2ooIj)eSW*Kj}D&TN!t(G-fi7u>*oddc_;jQ zIUBf@Zk9jqW_h6d>4ANDl5W%oc|;lH5#@_ZL;6J-9q2p*ooAp53{-(ZJ3WdF+H2vA z9naZuo*i8UAN!*DSa1ILIAtbCS#XE`$)lR$gp_;K=rvZVQ>pG{*lL+!D+OoHGI&#L zh+=~wie}~ZP;PHS5XFWh7I?~(f#J%z*(1))BMpJf@+dN*$iiBBPIY&i-ge12)ez%U z!ws-`H2Jrq0&$&x>^lEgirq`6!81{45|BrePkP|)HBms51(YqIfdX11pc(v zR-d`{sKB-etW{t#^r^`L+aa)>0@HUgHyDb@J|(giIw?4^wzVh;w zS7<2W)?+rDFh1qP!<=}S6As(s#220TicaG)8LptO_AuVn%evk>T<`t+IMbdd7#%ub zbV$L4r+G1^(|Uz;T5mdTn&S$ug!Fr<^_kXZ^E~Z0Rntx_(RqrczF6w-5z##b+(iL= zx7eV{Jf91wSX@0NUEOg}<(n?FF#q?eM;$7J)-E9=1i%$N4 z{T~q21A=;B8fUVIu9T7omRMM3LpfJd$9SNYUDUB2IL8aTY$|jxC3*rUatfz%C0DV9 z+Igh_R(8_<58D4h!9OVY2fKO77?}XdX3+j+TeW|g^p|xTEL&i(YzbGhifZtX8mx-O zL3(m1hjR?ab17X~tLnLdI@&4$JiN*ie1#`>*(;a5(jGF=%X*pha!>G!Ji$B9?;ZDh ze`zr7WrtpN7`{QfZqhLp>KKcC7wA~GO^)gKRUsW;VMJ)L5uv3IKVEvGF0h9}%ye~@}_^WOaon|E!T;T*2SM8uw zR_It2XJh(^6Fp-8M`m!AffbpkmWk@goZ`iRiCzpSRGJ;=j6#|tss)H{Tm`qGo%O(WN3Pl=x^*<`WVCXcf>c^Wm49d0`1>2ZdqM?MebJQZcn4TJ&o=z<~%Oq5;kx{48Jc5;rGQ{ z%H?e47Slq0zt6$}8;mUc{+PK$6U-%=$a*&NidogE+0_c@Qb5;U?l*}#$0X_z^uYg4 zCC~7jIY-KSS9$Mx41V{FDM!;xIhtXrQBPBiGB}7sSjnsZVaERPA?(jH_h>4ov4I=R zJt{Q!XgbyCk81SCR&F;J$@&572PE}?r2fhJpR6D3V-8Y3%EUpLIB5Ta_W$!NbCQZE z&_4_G&qsOO+@w|JCRLagc4&)*R&$ejn48p#*8g&Ky^H(IRmwJ3X&`rT50CMLxk@9< zRT>q;k#YWF(F9KCOfKe98nZc4L**S&-VvEQB6CO1@_Y>MXN2&6NgoT^^nGpmzDVB} z>HBjzpDVeFQuTf{^_BPamG}2>FAwk#rT%@XKib!1ss0?mK{1@4?Z2Fx!?j$`{X7`M z|MUvse|l5qOa4dd|7W=kr7;=cMty)A^#N{w2e|zmFp2qepFY5S`T%#W1KhO^sApqL zzTiRN3myc%aDaz+k(XmKC@Um`1~8A4=s{wT2Z=%JS;tmxXSZjuL8tr;JNMOJbYK0& zk<8_6y6^sC8OvG8YPuu&ViVoif62~WKN+DGFJzgyNFAu3(u|Kde*U-Tey?Ec#wzb>~o!c?v)VkO=GxMN4Zx= zxpxSM`4YHS54=|oymtzxvWUf8!ey*rCF|J0Eo`M~-m9AT9_CS=;kg**r6J7g!T!wR zFb?N9PT*8dV=?FX5}3El!U`KISl24`^r z7jY$5aV^(#6Pvk%JGq|++0Bwu7A{%162nh>hw#(B9K<2adxWsC7qd8k!#R=@IFZvhgY&q6E4Y%?T+0mxWc_#)7H;Pb?&W?SXE!hKQVc)u z6~fPZa{vc%By%~DlR1O4xPXhelB>9u>$!=|+`*mP&x0)Kws6YAC0>bPQST5I_2nQA zVJ^pTGN*7Bi@1nOxQZ2A&pI}93wLrC5ArZi@eHqo@QXBtU-V^v*Z(huSQuu*7>?r< zPGu2`xrEDD!AjP#fm_(hUEIUNJjydX7sKK-gvCABpIIEn;T*>aoXTmg|HZ`?=Gm}} zD_F^DHgE%5xt)8smq&S==XfE8|LhUMfA(S)2XHt?asnrE8fS1G7jOkvvYKmM|Nptc z!X|F#4({cC9%nZ%@KOv*dWEp0HwSPKM>3ZaIhiv!iwn4jE4hkmxt^QY%pKgx{WKsG zmULS<#Y?>6{|W2w{|U?DAP!+J$8a*Ia2AWWh)cMN6SubXB0EcrV zCvYOCaR%pc0atJ(t6l%g)>_!WP2A2M+{^tu&Td}dr5JwMD}-P6<^T@jNak`PCvyg8 zaRC=`C0B7R*K-q_xq~}dvfsi%3*9`$OT6NzqTYTf>dQeK!d#BwWKQ8M7RBVQ@gcb@ zkBhl9Ci(70@`tmK)9H36-|fz%y&;*jKPGpEkofI3xzpXuo$h8z?sB7dmm9tBREOj{ zYuU^#F)1)ET3}qXU@XVe?NNc-qk{buaFH4nsZo&{6{*qkW&v&CPVSw3X!d*^x4YkH%-rZ<)|Ih%ECpf-M38<%Uka!pq*1LZPM zzJ@hk*BczduS$kmkdj|XNyU^9DyDKF7qgumUe8mbN7U$%MsB2l9})2CJ|V2`NBgg~ z|LQY57sI1tLwIyNW#Ca6c=Q4<#Zc*~qtZi1jbb)0P8eOji#y56g8TnW+R)}!Oj?->L0>WSzOLiUVS&zUt0)IsnJtvv_AFTUJvH8 zfa_To!_#W?v>H7gxtyJpsro)%-|I&;uUGSWsjZjVdIi=i@VU`m z-y6#^mdDT#LTHGTu?87yn8hM4=2DkoL!AY^wL$8hm%8WM*zUJ+Cunqn7aILGzLDp7 z(QA7S+~B|s);Cyx(S9%5??r*UD3FbrUf0X!YF6ar%~$`^rOj%zS&cT^VY3}t^wJi+v}G*EQ%zdb zq@|f#*vZ{qoD){4d((bqOZ!Wl{~;hF}y0UR|WQ}&iSg&`D!~mc!uX3}u|v^BAXc4+hYYdXNAha4YTin*Fx-@_Juy7O;?QZ1+0fV6XEHJ=68yo^4@i2<^+M zChcnSMyB`qY=0w{W4N59>|kdMJBEg^BZt*o%ac6KDJ%=?F;E`ZTGgedwT|F(f)7S|Lwip&l5Zu!>+s#c1@!FcG>TDJq#B1Vm1ewS2Z|< zJwvJdJ<2cngOvP1O7?CHVQ&+6aSz>?>^*2OZ>GV#*#`5*8_dh&8rB%ZTWSz*Io0^T z)Oi1DV|P_N#uLWu1o%e*{!z{UsOAUsl>_?9f!*vfb|*uBDscV(slmbqgLbtB?do}! z=MC0L@t>vmkdz&gvO}kN*4Ugt{vwdW(O6th7IL~VIs3h5zxOoRdz$RMBRodsy{EjR zrH01JsNAE<{i{CkSO05b`0Hc~Q`p9KUiLy^@M58Yjw$Gv1CKfI*mmyVAs+F9;Xp4K z4(1%r7v@k#jT(pJ0zWSBziIQoY4g81&)=NqgKqB`UVZ-W)&$*}pj(@D zYqM@A>~_L#DeIQ9ZkJ2A-(F@XT~C9?qmD zI-`j`%J#zHKq~Mf1%9NaAF1it3@;q^p(Z)2NzS&h-Ft>k^xw|&--md_dxfLDS2&i- zUH|7wEp*zTP5y5P;r~Wc%`Td1cG(Msqr6Z!nrm1?1zb_U$4>CE6MWpkPVW;MlMBY= zg5OQU8XCh3#_$q%!HK)zq>&qW+0?aQDw@H;)ZpMXevnPBaT^`oCP%l)(VUiOPD?z( zW2T@fsE2~CHHvtxQN(MT*g~U@*BW)~xiBO>7t`HwPj| z$k@vu<8`JtTxWX2bppLkpx3$kO|CP2;5xr+UbllH%n)IQ6J|JJ#thEl0xn_;x6-I& zhEd7uo$z`myj~6cAe&sToa>d-+kJlTNY4ko^SGR)+|4dt@%~`y{{K_`EM$72a5`tQ zogLiA12O579g;o+Ig+_t%%!YgCAYH8dxTE-X(#-&z&|bUPYdYN0{Zkxp7uUrf%gdu zY5%_VH_IR~%b+Crj1zyxi9gf9PA?8hQ9mi_w~&jyH#ppTgCjYK`K;oanDlpCf5-LL zbp175|06s`6EOOlfblP5y)QVPr7YtKp7g$;@-vn1r|KkgjR_fH`bd^Ol698nWAeFzkbF+f zKUdF2+WtA)vqyQ4uw=A_H5O`kh)1Xf*=lg3NN*JBjRLz-U^hzTjZ*pf^&$CuT}-}E z7?Lkc=R7VjB3)-hx`A8S=Dotv-YXo-m0U%i5ApdBnHVAyU!E3{k}uD&Fy9dNLJHu^ z0{HS7p7WyN2rn9r;$kl4Q6A?xUhtw}t``l*P^NB@shec-CYiix9}jr1u%Gt|GdY*@ zxq>TsnrFRF==&%6O0+P+3x*RpoikZVZT6Ke?(<@yf^rm;qfK+PY0gwmV=e0`@En2P z?6{j9cXJJEV=`h>NJcbsCwFBzI^?a&tI?vna4! zf#r6vlO^XZT=e2#FE0-EW&sPihBfs0zxsUi=#Y#aO9hNpz-T8J?F3(&8IrHfW<49d zKRD3)gM>bE&PzXzQ;FjiQ#unGwDn(MwiYvk0kwuCRZev3zvIvn7>QJPS z;)4xiVm3mgYl4(K*dj&Rq4x9P%YW{<=l@v`R#-xvGDUyDU?T~y#j1!nbU^=Cg7Kl7`W3BPKY z6z9bGICZ(hCf`m`zRLp=zE>8c-a9OQOSIsA$g=dI-`M$O(?pqt^{*}1+fuN%#k%+r z3-u=(g7BnuaQp4U&^mb8ym5c=sMg;-s`ZaJJY~WDlm+|OR_zvgY{!A)!;Zsa#-ETc zmM<~>cNXNoZr%G-xeF>x{BINg$0J!MJd$Pa!x1a{N8WdS$NAkjOa(!hDwAkaqL*

    yHLIDFIk`kNNu-}*)nzEv5Ar|$>hX$3d5 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 seKGCLmLbo<*xcHB5 Date: Wed, 13 Dec 2023 14:43:38 +0100 Subject: [PATCH 23/38] commands code generation (#871) * commands code generation (#803) * commands code generation for only frames command * fix cmake file and add Caller files * working exptime, fully extended commands file and its variants * start adding template commands * add INT_CMD_VEC_ID template * add list command, generate multiple bins, format code * reach 208 commands using the cpp macros * add tests for command parser * start adding tests for commands parser * fix typo to use commands.yaml * add more tests for command_parser * add all template functions (up to 218 commands) * finish template functions and add more CmdProxy.cpp functions (250+) * 257 commands * 300 commands the rest are very special commands * add special commands without generation * separate special functions from generated c++ file * implementing one command for put and get (buggy) * add infer action in a separate file * generate header for special commands from yaml * allow only 0 or 1 for bool inputs * group all commands in gen_commands.py * add help to gen_commands.py * add autocomplete bash script * autocompletion: add support for module levels and help * remove debugging line * add autocompletion, help to commands, change int [0,1] to bool * copy tests for Caller.cpp. Tests pass * update with the new developer branch changes * fix errors after merging (there is problems with tests) * fixed port/stopport in yaml (intput typo), added '_caller' to the test dac and test on chip dac command in global test for cmdcaller * undo previous test simulator debug change * add documentation for the generated code * reducing the comment to be replaced in length so formatting does not split into 2 lines * removed formatting specific style of C++11 in gen_commands.py to keep with the top level clang format of the project * regeneratign code for commands * automation generated * Redirect deprecated commands (#872) * working implementation, need to fix dac * fixed deprecation redirect for dac command * Detector specific autocomplete (#873) * working implementation, need to fix dac * fixed deprecation redirect for dac command * detector specific completion for dac * added autocomplete using detector specific * fixed error when autocompleting partial words * Generate commands/fix commands (#875) * fix vm_a, im_a etc have deg Celsius suffix, also help missing or changed in some places * dac: require det id for all, arg0 to be printed at output, help for onchip dac and dac, onchipdac: spacing * getscan detid and blocking trigger help * udp_Dstlist det_id fixed, but rx_id invalid * cmdApp in line with cmdLineApp (missing version, receiver_id, not creating det object in help action * added set_command to differentiate between check_det_id and require_det_id (mixed up), args: -1 needs to check for at least one argument * reordering * reordering and checked till integer_command_hex * fixed a lot more commands * fix caller tests for eiger * changes to tests after Bechir left * changing .cmd to .cmdcall for the caller commands * fixed tests for caller, still warning for setexptime about cast input * autocomplete ran * add moench test * regenerating autocomplete and commands * fixing other things from merge conflicts (renaming slsDetectorDefs to defs in commands.yaml) * formatting * added code injection to help (#876) * updated 3 commands to have get output that can be put into put (#877) * updated some commands to have get output that can be put into put * fix tests for clkdiv * adding help to free (#878) * removing old commands and renaming them, (also making it work for parameters command as it was still calling cmdproxy) (#879) * More helpful error messages for unsupported actions (#880) * removing old commands and renaming them, (also making it work for parameters command as it was still calling cmdproxy) * Added specific help for unsupported actions * fixed a vetofile get special exception message. more specific warning for special exception message instead of no function warning * added condition checking true in exceptions for special message --------- Co-authored-by: Bechir Brahem Co-authored-by: Erik Frojdh Co-authored-by: Dhanya Thattil --- CMakeFiles/cmake.check_cache | 1 + CMakeLists.txt | 1 + slsDetectorSoftware/CMakeLists.txt | 34 +- slsDetectorSoftware/generator/Caller.in.cpp | 10 + slsDetectorSoftware/generator/Caller.in.h | 88 + .../generator/autocomplete/autocomplete.py | 236 + .../autocomplete/bash_autocomplete.in.sh | 164 + .../autocomplete/bash_autocomplete.sh | 3252 + .../generator/autocomplete/dump.json | 62035 +++++++++++++++ .../generator/autocomplete/fixed.json | 62037 ++++++++++++++++ .../autocomplete/slsdet-completion.bash | 171 + .../autocomplete/zsh_autocomplete.in.sh | 74 + .../autocomplete/zsh_autocomplete.sh | 3162 + slsDetectorSoftware/generator/commands.yaml | 4264 ++ .../generator/commands_parser/__init__.py | 0 .../commands_parser/commands_parser.py | 379 + .../generator/cpp_codegen/__init__.py | 0 .../generator/cpp_codegen/codegen.py | 282 + .../generator/deprecated_commands.yaml | 176 + .../generator/extended_commands.yaml | 13726 ++++ slsDetectorSoftware/generator/gen_commands.py | 276 + .../generator/inferAction.in.cpp | 19 + .../generator/inferAction.in.h | 30 + .../generator/infer_action/check_infer.py | 64 + slsDetectorSoftware/generator/readme.md | 288 + .../generator/requirements.txt | 6 + .../tests/command_parser/data/basic.yaml | 16 + .../data/basic_inheritance.yaml | 66 + .../tests/command_parser/data/detectors.yaml | 208 + .../test_commands_parser_basic.py | 101 + .../test_commands_parser_detector.py | 309 + .../tests/test_parse_and_generate.py | 29 + .../generator/very_special_functions.txt | 28 + slsDetectorSoftware/include/sls/Detector.h | 1 - slsDetectorSoftware/src/Caller.cpp | 18155 +++++ slsDetectorSoftware/src/Caller.h | 878 + slsDetectorSoftware/src/CallerSpecial.cpp | 1149 + .../src/{CmdLineApp.cpp => CmdApp.cpp} | 51 +- slsDetectorSoftware/src/CmdParser.h | 1 - slsDetectorSoftware/src/CmdProxy.cpp | 3431 - slsDetectorSoftware/src/CmdProxy.h | 2656 - slsDetectorSoftware/src/Detector.cpp | 6 +- slsDetectorSoftware/src/HelpDacs.cpp | 319 + slsDetectorSoftware/src/HelpDacs.h | 302 +- slsDetectorSoftware/src/inferAction.cpp | 4592 ++ slsDetectorSoftware/src/inferAction.h | 681 + slsDetectorSoftware/tests/CMakeLists.txt | 30 +- .../test-Caller-chiptestboard.cpp} | 734 +- .../test-Caller-eiger.cpp} | 426 +- .../test-Caller-global.cpp} | 44 +- .../tests/Caller/test-Caller-global.h | 16 + .../tests/Caller/test-Caller-gotthard.cpp | 175 + .../test-Caller-gotthard2.cpp} | 452 +- .../test-Caller-jungfrau.cpp} | 424 +- .../tests/Caller/test-Caller-moench.cpp | 114 + .../test-Caller-mythen3.cpp} | 376 +- .../test-Caller-pattern.cpp} | 164 +- .../test-Caller-rx.cpp} | 441 +- .../test-Caller.cpp} | 1815 +- .../tests/test-CmdProxy-global.h | 17 - .../tests/test-CmdProxy-gotthard.cpp | 164 - .../tests/test-CmdProxy-moench.cpp | 109 - tests/scripts/test_simulators.py | 2 +- 63 files changed, 180123 insertions(+), 9134 deletions(-) create mode 100644 CMakeFiles/cmake.check_cache create mode 100644 slsDetectorSoftware/generator/Caller.in.cpp create mode 100644 slsDetectorSoftware/generator/Caller.in.h create mode 100644 slsDetectorSoftware/generator/autocomplete/autocomplete.py create mode 100644 slsDetectorSoftware/generator/autocomplete/bash_autocomplete.in.sh create mode 100644 slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh create mode 100644 slsDetectorSoftware/generator/autocomplete/dump.json create mode 100644 slsDetectorSoftware/generator/autocomplete/fixed.json create mode 100644 slsDetectorSoftware/generator/autocomplete/slsdet-completion.bash create mode 100644 slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.in.sh create mode 100644 slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh create mode 100644 slsDetectorSoftware/generator/commands.yaml create mode 100644 slsDetectorSoftware/generator/commands_parser/__init__.py create mode 100644 slsDetectorSoftware/generator/commands_parser/commands_parser.py create mode 100644 slsDetectorSoftware/generator/cpp_codegen/__init__.py create mode 100644 slsDetectorSoftware/generator/cpp_codegen/codegen.py create mode 100644 slsDetectorSoftware/generator/deprecated_commands.yaml create mode 100644 slsDetectorSoftware/generator/extended_commands.yaml create mode 100644 slsDetectorSoftware/generator/gen_commands.py create mode 100644 slsDetectorSoftware/generator/inferAction.in.cpp create mode 100644 slsDetectorSoftware/generator/inferAction.in.h create mode 100644 slsDetectorSoftware/generator/infer_action/check_infer.py create mode 100644 slsDetectorSoftware/generator/readme.md create mode 100644 slsDetectorSoftware/generator/requirements.txt create mode 100644 slsDetectorSoftware/generator/tests/command_parser/data/basic.yaml create mode 100644 slsDetectorSoftware/generator/tests/command_parser/data/basic_inheritance.yaml create mode 100644 slsDetectorSoftware/generator/tests/command_parser/data/detectors.yaml create mode 100644 slsDetectorSoftware/generator/tests/command_parser/functional_tests/test_commands_parser_basic.py create mode 100644 slsDetectorSoftware/generator/tests/command_parser/functional_tests/test_commands_parser_detector.py create mode 100644 slsDetectorSoftware/generator/tests/test_parse_and_generate.py create mode 100644 slsDetectorSoftware/generator/very_special_functions.txt create mode 100644 slsDetectorSoftware/src/Caller.cpp create mode 100644 slsDetectorSoftware/src/Caller.h create mode 100644 slsDetectorSoftware/src/CallerSpecial.cpp rename slsDetectorSoftware/src/{CmdLineApp.cpp => CmdApp.cpp} (68%) delete mode 100644 slsDetectorSoftware/src/CmdProxy.cpp delete mode 100644 slsDetectorSoftware/src/CmdProxy.h create mode 100644 slsDetectorSoftware/src/HelpDacs.cpp create mode 100644 slsDetectorSoftware/src/inferAction.cpp create mode 100644 slsDetectorSoftware/src/inferAction.h rename slsDetectorSoftware/tests/{test-CmdProxy-chiptestboard.cpp => Caller/test-Caller-chiptestboard.cpp} (56%) rename slsDetectorSoftware/tests/{test-CmdProxy-eiger.cpp => Caller/test-Caller-eiger.cpp} (52%) rename slsDetectorSoftware/tests/{test-CmdProxy-global.cpp => Caller/test-Caller-global.cpp} (65%) create mode 100644 slsDetectorSoftware/tests/Caller/test-Caller-global.h create mode 100644 slsDetectorSoftware/tests/Caller/test-Caller-gotthard.cpp rename slsDetectorSoftware/tests/{test-CmdProxy-gotthard2.cpp => Caller/test-Caller-gotthard2.cpp} (52%) rename slsDetectorSoftware/tests/{test-CmdProxy-jungfrau.cpp => Caller/test-Caller-jungfrau.cpp} (57%) create mode 100644 slsDetectorSoftware/tests/Caller/test-Caller-moench.cpp rename slsDetectorSoftware/tests/{test-CmdProxy-mythen3.cpp => Caller/test-Caller-mythen3.cpp} (60%) rename slsDetectorSoftware/tests/{test-CmdProxy-pattern.cpp => Caller/test-Caller-pattern.cpp} (69%) rename slsDetectorSoftware/tests/{test-CmdProxy-rx.cpp => Caller/test-Caller-rx.cpp} (65%) rename slsDetectorSoftware/tests/{test-CmdProxy.cpp => Caller/test-Caller.cpp} (63%) delete mode 100644 slsDetectorSoftware/tests/test-CmdProxy-global.h delete mode 100644 slsDetectorSoftware/tests/test-CmdProxy-gotthard.cpp delete mode 100644 slsDetectorSoftware/tests/test-CmdProxy-moench.cpp diff --git a/CMakeFiles/cmake.check_cache b/CMakeFiles/cmake.check_cache new file mode 100644 index 000000000..3dccd7317 --- /dev/null +++ b/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/CMakeLists.txt b/CMakeLists.txt index 132ac8d65..298343e0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,6 +244,7 @@ if(SLS_USE_SANITIZER) # target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread) endif() + if(SLS_TUNE_LOCAL) target_compile_options(slsProjectOptions INTERFACE -mtune=native -march=native) endif() diff --git a/slsDetectorSoftware/CMakeLists.txt b/slsDetectorSoftware/CMakeLists.txt index 692302d11..905952154 100755 --- a/slsDetectorSoftware/CMakeLists.txt +++ b/slsDetectorSoftware/CMakeLists.txt @@ -4,10 +4,13 @@ set(SOURCES src/DetectorImpl.cpp src/Module.cpp src/Detector.cpp - src/CmdProxy.cpp + src/HelpDacs.cpp src/CmdParser.cpp src/Pattern.cpp src/CtbConfig.cpp + src/Caller.cpp + src/CallerSpecial.cpp + src/inferAction.cpp ) add_library(slsDetectorObject OBJECT @@ -76,26 +79,30 @@ endif() if(SLS_USE_TEXTCLIENT) - # Loop over list to generate command line binaries - set(bin_names "sls_detector_put" + set(det_bin_names "sls_detector_put" "sls_detector_get" "sls_detector_acquire" - "sls_detector_help") - set(cmd_name "PUT" "GET" "READOUT" "HELP") - list(LENGTH bin_names len1) + "sls_detector_help" + "sls_detector" + ) + set(det_cmd_name "PUT" "GET" "READOUT" "HELP" "INFER") + list(LENGTH det_bin_names len1) math(EXPR len2 "${len1} - 1") foreach(val RANGE ${len2}) - list(GET bin_names ${val} val1) - list(GET cmd_name ${val} val2) + list(GET det_bin_names ${val} val1) + list(GET det_cmd_name ${val} val2) message(STATUS "${val1} ${val2}") - add_executable(${val1} src/CmdLineApp.cpp) + add_executable(${val1} src/CmdApp.cpp) + target_link_libraries(${val1} - slsDetectorStatic - pthread - rt + slsDetectorStatic + pthread + rt ) + SET_SOURCE_FILES_PROPERTIES( src/Caller.cpp PROPERTIES COMPILE_FLAGS "-Wno-unused-variable -Wno-unused-but-set-variable") + set_target_properties(${val1} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin COMPILE_DEFINITIONS ${val2}=1 @@ -104,7 +111,8 @@ if(SLS_USE_TEXTCLIENT) set_property(TARGET ${val1} PROPERTY INTERPROCEDURAL_OPTIMIZATION True) endif() endforeach() - install(TARGETS ${bin_names} DESTINATION bin) + install(TARGETS ${det_bin_names} DESTINATION bin) # was not there for detp. Include? FIXME + endif(SLS_USE_TEXTCLIENT) diff --git a/slsDetectorSoftware/generator/Caller.in.cpp b/slsDetectorSoftware/generator/Caller.in.cpp new file mode 100644 index 000000000..4e7129cc7 --- /dev/null +++ b/slsDetectorSoftware/generator/Caller.in.cpp @@ -0,0 +1,10 @@ +#include "Caller.h" +#include "sls/logger.h" +#include "sls/string_utils.h" +#include + +namespace sls { + +// THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE + +} \ No newline at end of file diff --git a/slsDetectorSoftware/generator/Caller.in.h b/slsDetectorSoftware/generator/Caller.in.h new file mode 100644 index 000000000..21c4ac098 --- /dev/null +++ b/slsDetectorSoftware/generator/Caller.in.h @@ -0,0 +1,88 @@ +// This file is used as input to generate the caller class + +#include "CmdParser.h" +#include "HelpDacs.h" +#include "sls/Detector.h" + +#include +#include +#include +namespace sls { + +class Caller { + public: + Caller(Detector *ptr) : det(ptr) {} + void call(const std::string &command, + const std::vector &arguments, int detector_id, + int action, std::ostream &os = std::cout, int receiver_id = -1); + + IpAddr getDstIpFromAuto(); + IpAddr getSrcIpFromAuto(); + UdpDestination getUdpEntry(); + void GetLevelAndUpdateArgIndex(int action, + std::string levelSeparatedCommand, + int &level, int &iArg, size_t nGetArgs, + size_t nPutArgs); + void WrongNumberOfParameters(size_t expected); + + template std::string OutStringHex(const V &value) { + if (value.equal()) + return ToStringHex(value.front()); + return ToStringHex(value); + } + + template std::string OutStringHex(const V &value, int width) { + if (value.equal()) + return ToStringHex(value.front(), width); + return ToStringHex(value, width); + } + + template std::string OutString(const Result &value) { + if (value.equal()) + return ToString(value.front()); + return ToString(value); + } + + template std::string OutString(const V &value) { + return ToString(value); + } + + template + std::string OutString(const V &value, const std::string &unit) { + if (value.equal()) + return ToString(value.front(), unit); + return ToString(value, unit); + } + + std::vector getAllCommands(); + std::string list(int action); + + // THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1) + + std::vector args; + std::string cmd; + Detector *det; + int det_id{-1}; + int rx_id{-1}; + + private: + bool ReplaceIfDepreciated(std::string &command); + using FunctionMap = std::map; + using StringMap = std::map; + Detector *ptr; // pointer to the detector that executes the command + + FunctionMap functions{ + {"list", &Caller::list}, + + // THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (2) + + }; + + StringMap depreciated_functions{ + + // THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (3) + + }; +}; + +} // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/generator/autocomplete/autocomplete.py b/slsDetectorSoftware/generator/autocomplete/autocomplete.py new file mode 100644 index 000000000..afcfe93d7 --- /dev/null +++ b/slsDetectorSoftware/generator/autocomplete/autocomplete.py @@ -0,0 +1,236 @@ +import argparse +import json +from pathlib import Path + +# command to generate the ast +# clang version: 14.0.0-1ubuntu1.1 +# clang++ -Xclang -ast-dump=json -Xclang -ast-dump-filter -Xclang StringTo -c ToString.cpp -I ../include/ -std=gnu++11 +# +import yaml + +AUTOCOMPLETE_PATH = Path(__file__).parent +DUMP_PATH = AUTOCOMPLETE_PATH / 'dump.json' +FIXED_PATH = AUTOCOMPLETE_PATH / 'fixed.json' + +type_values = { + 'special::mv': ["mv", "mV"], + "special::deg": ["deg"], + "special::time_unit": ["s", "ms", "us", "ns"], + "special::hard": ["hard"], + "special::force-delete-normal-file": ["--force-delete-normal-file"], + "special::currentSourceFix": ["fix", "nofix"], + "special::currentSourceLow": ["normal", "low"], + "special::path": [], + "special::pedestal_parameters" : ["", "0"] + +} + + +def get_types(arg_types): + ret = set() + for arg_type in arg_types: + if type_info(arg_type) == 'base': + if arg_type == 'bool': + ret = ret.union(["0", "1"]) + else: + tmp = [not_list for not_list in type_values[arg_type] if not isinstance(not_list, list)] + ret = ret.union(tmp) + + #Intercept the options and in case detector specific options appear replace the + #list of options with a command line call that fetches them + #TODO! Rename detg + if "defs::dacIndex" in arg_types: + return "`detg daclist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`" + elif "defs::detectorSettings" in arg_types: + return "`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`" + elif "defs::timingMode" in arg_types: + return "`detg timinglist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`" + + + return ret + + +def type_info(type_name): + if type_name.startswith('defs::') or type_name.startswith('slsDetectorDefs::'): + return 'enum' + if type_name.startswith('special::'): + return 'special' + return 'base' + + +def get_enum(function): + return function['type']['qualType'].split(' ')[0] + + +def get_literal(ifstmt): + stringliteral = [] + expression = ifstmt['inner'][0] + if expression['kind'] == 'BinaryOperator': + if expression['opcode'] == '!=': + return None, None + for cxxOperatorCall in expression['inner']: + if cxxOperatorCall['kind'] == 'CXXOperatorCallExpr': + implicitCastExpr = cxxOperatorCall['inner'][2] + stringliteral.append(implicitCastExpr['inner'][0]['value'][1:-1]) + else: + cxxOperatorCall = expression + implicitCastExpr = cxxOperatorCall['inner'][2] + stringliteral = implicitCastExpr['inner'][0]['value'][1:-1] + + retstmt = get_object_by_kind(ifstmt['inner'], 'ReturnStmt') + declrefexpt = get_object_by_kind(retstmt['inner'], 'DeclRefExpr') + enum_val = declrefexpt["referencedDecl"]["name"] + + return enum_val, stringliteral + + +def get_object_by_kind(inner, kind, position=1): + for obj in inner: + if obj['kind'] == kind: + position -= 1 + if position == 0: + return obj + return None + + +def generate_type_values(): + functions = json.loads(FIXED_PATH.read_text()) + for function in functions: + if function['kind'] != 'FunctionDecl' or function['name'] != 'StringTo': + continue + enum = get_enum(function) + + if not enum.startswith('defs::'): + continue + # if enum != 'defs::dacIndex': + # continue + if not function['loc']['file'].endswith('ToString.cpp'): + continue + + compound_stmt = get_object_by_kind(function['inner'], 'CompoundStmt') + + for ifstmt in compound_stmt['inner']: + if ifstmt['kind'] != 'IfStmt': + continue + enum_val, stringliteral = get_literal(ifstmt) + if enum_val is None: + continue + + if enum not in type_values or type_values[enum] is None: + type_values[enum] = [] + type_values[enum].append(stringliteral) + items = list(type_values.items()) + for key, val in items: + if key.startswith('defs::'): + new_key = key.split('::')[1] + new_key = 'slsDetectorDefs::' + new_key + type_values[new_key] = val + elif key.startswith('slsDetectorDefs::'): + new_key = key.split('::')[1] + new_key = 'defs::' + new_key + type_values[new_key] = val + + return json.dumps(type_values, indent=2) + + +def fix_json(): + with DUMP_PATH.open('r') as f: + tmp = '[\n' + for line in f.read().split('\n'): + if line.startswith('}'): + tmp += line + ',\n' + else: + tmp += line + '\n' + tmp = tmp[:-3] + '\n]' + with FIXED_PATH.open('w') as f: + f.write(tmp) + + +def generate_bash_autocomplete(output_path=Path(__file__).parent / 'bash_autocomplete.sh', input_path=Path(__file__).parent / 'bash_autocomplete.in.sh'): + generate_type_values() + output_file = output_path.open('w') + template_file = input_path.open('r') + + def writeline(line): + output_file.write(line + '\n') + + class if_block: + def __init__(self, condition): + self.condition = condition + + def __enter__(self): + output_file.write('if [[ ' + self.condition + ' ]]; then\n') + + def __exit__(self, type, value, traceback): + output_file.write('fi\n') + + class function: + def __init__(self, name): + self.name = name + + def __enter__(self): + output_file.write(self.name + '() {\n') + + def __exit__(self, type, value, traceback): + output_file.write('}\n') + + command_path = Path(__file__).parent.parent / 'extended_commands.yaml' + commands = yaml.unsafe_load(command_path.open('r')) + + for line in template_file: + if '-- THIS LINE WILL BE REPLACED WITH GENERATED CODE --' not in line: + output_file.write(line) + continue + writeline(f'local SLS_COMMANDS=" {" ".join(commands.keys())} "') + # generate functions + for command_name, command in commands.items(): + # added for debugging + if command_name == 'xxxexptime': + continue + with function('__' + command_name): + writeline('FCN_RETURN=""') + + actions = ['GET', 'PUT'] + for action in actions: + if action in command['actions'] and 'args' in command['actions'][action]: + args = command['actions'][action]['args'] + possible_argc = {} + for arg in args: + if arg['argc'] == 0: + pass + for i in range(arg['argc']): + if i + 1 not in possible_argc: + possible_argc[i + 1] = [] + possible_argc[i + 1].append(arg['arg_types'][i]) + if possible_argc: + with if_block(f'${{IS_GET}} -eq {"1" if action == "GET" else "0"}'): + for argc in possible_argc: + with if_block(f'"${{cword}}" == "{argc + 1}"'): + if "defs::detectorSettings" in possible_argc[argc]: + print(argc, command_name, possible_argc[argc]) + choices = get_types(possible_argc[argc]) + + #check if we got choices back or a bash command + if isinstance(choices, (list,set)): + writeline(f'FCN_RETURN="{" ".join(sorted(choices))}"') + else: + writeline(f'FCN_RETURN="{choices}"') + if 'special::path' in possible_argc[argc]: + writeline('IS_PATH=1') + + writeline('return 0') + + + + output_file.close() + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='use parsed c++ code to generate autocomplete snippets') + parser.add_argument('-f', '--fix', action='store_true', help='fix the parsed ast to make it loadable') + # parser.add_argument('-p', '--path', type=str, help='output path to the fixed ast', default='ast.json') + args = parser.parse_known_args() + if args[0].fix: + fix_json() + ret = generate_type_values() + print(ret) diff --git a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.in.sh b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.in.sh new file mode 100644 index 000000000..c622a809d --- /dev/null +++ b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.in.sh @@ -0,0 +1,164 @@ +# GENERATED FILE - DO NOT EDIT +# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN + +_sd() { + + # Taken from https://github.com/scop/bash-completion/blob/15b74b1050333f425877a7cbd99af2998b95c476/bash_completion#L770C12-L770C12 + # Reassemble command line words, excluding specified characters from the + # list of word completion separators (COMP_WORDBREAKS). + # @param $1 chars Characters out of $COMP_WORDBREAKS which should + # NOT be considered word breaks. This is useful for things like scp where + # we want to return host:path and not only path, so we would pass the + # colon (:) as $1 here. + # @param $2 words Name of variable to return words to + # @param $3 cword Name of variable to return cword to + # + _comp__reassemble_words() +{ + local exclude="" i j line ref + # Exclude word separator characters? + if [[ $1 ]]; then + # Yes, exclude word separator characters; + # Exclude only those characters, which were really included + exclude="[${1//[^$COMP_WORDBREAKS]/}]" + fi + + # Default to cword unchanged + printf -v "$3" %s "$COMP_CWORD" + # Are characters excluded which were former included? + if [[ $exclude ]]; then + # Yes, list of word completion separators has shrunk; + line=$COMP_LINE + # Re-assemble words to complete + for ((i = 0, j = 0; i < ${#COMP_WORDS[@]}; i++, j++)); do + # Is current word not word 0 (the command itself) and is word not + # empty and is word made up of just word separator characters to + # be excluded and is current word not preceded by whitespace in + # original line? + while [[ $i -gt 0 && ${COMP_WORDS[i]} == +($exclude) ]]; do + # Is word separator not preceded by whitespace in original line + # and are we not going to append to word 0 (the command + # itself), then append to current word. + [[ $line != [[:blank:]]* ]] && ((j >= 2)) && ((j--)) + # Append word separator to current or new word + ref="$2[$j]" + printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" + # Indicate new cword + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + # Remove optional whitespace + word separator from line copy + line=${line#*"${COMP_WORDS[i]}"} + # Indicate next word if available, else end *both* while and + # for loop + if ((i < ${#COMP_WORDS[@]} - 1)); then + ((i++)) + else + break 2 + fi + # Start new word if word separator in original line is + # followed by whitespace. + [[ $line == [[:blank:]]* ]] && ((j++)) + done + # Append word to current word + ref="$2[$j]" + printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" + # Remove optional whitespace + word from line copy + line=${line#*"${COMP_WORDS[i]}"} + # Indicate new cword + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + done + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + else + # No, list of word completions separators hasn't changed; + for i in "${!COMP_WORDS[@]}"; do + printf -v "$2[i]" %s "${COMP_WORDS[i]}" + done + fi +} + + + local FCN_RETURN="" + local IS_PATH=0 + + + # -- THIS LINE WILL BE REPLACED WITH GENERATED CODE -- + + + COMPREPLY=() + local OPTIONS_NEW="" + + # check if bash or zsh + # _get_comp_words_by_ref is a bash built-in function, we check if it exists + declare -Ff _get_comp_words_by_ref > /dev/null && IS_BASH=1 || IS_BASH=0 + + + # bash interprets the colon character : as a special character and splits the argument in two + # different than what zsh does + # https://stackoverflow.com/a/3224910 + # https://stackoverflow.com/a/12495727 + local cur + local cword words=() + _comp__reassemble_words ":" words cword + cur=${words[cword]} + + # check the action (get or put) + case "${words[0]}" in + "sls_detector_get" | "g" | "detg") + local IS_GET=1 + ;; + *) + local IS_GET=0 + ;; + esac + + # if no command is written, autocomplete with the commands + if [[ ${cword} -eq 1 ]]; then +# local SLS_COMMANDS="trimbits exptime" + local SLS_COMMANDS_NEW="" + + case "$cur" in + [0-9]*:*) + local suggestions=($(compgen -W "${SLS_COMMANDS}" -- "${cur#*:}")) + COMPREPLY=( ${suggestions[*]} ) + ;; + [0-9]*) + COMPREPLY=() + ;; + *) + COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );; + + esac + return 0 + fi + + if [[ ${cword} -eq 2 ]] && [[ ${words[1]} == "-h" ]]; then + COMPREPLY=( $( compgen -W "$SLS_COMMANDS" -- "$cur" ) ) + return 0 + fi + + # if a command is written, autocomplete with the options + # call the function for the command + + if [[ "$SLS_COMMANDS" == *"${words[1]##*:}"* ]]; then + __"${words[1]##*:}" + fi + + # if IS_PATH is activated, autocomplete with the path + if [[ ${IS_PATH} -eq 1 ]]; then + COMPREPLY=($(compgen -f -- "${cur}")) + return 0 + fi + + # autocomplete with the options + COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}")) + + + +} + +complete -F _sd -o filenames sls_detector_get +complete -F _sd -o filenames g +complete -F _sd -o filenames detg + +complete -F _sd -o filenames sls_detector_put +complete -F _sd -o filenames p +complete -F _sd -o filenames detp diff --git a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh new file mode 100644 index 000000000..62764f094 --- /dev/null +++ b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh @@ -0,0 +1,3252 @@ +# GENERATED FILE - DO NOT EDIT +# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN + +_sd() { + + # Taken from https://github.com/scop/bash-completion/blob/15b74b1050333f425877a7cbd99af2998b95c476/bash_completion#L770C12-L770C12 + # Reassemble command line words, excluding specified characters from the + # list of word completion separators (COMP_WORDBREAKS). + # @param $1 chars Characters out of $COMP_WORDBREAKS which should + # NOT be considered word breaks. This is useful for things like scp where + # we want to return host:path and not only path, so we would pass the + # colon (:) as $1 here. + # @param $2 words Name of variable to return words to + # @param $3 cword Name of variable to return cword to + # + _comp__reassemble_words() +{ + local exclude="" i j line ref + # Exclude word separator characters? + if [[ $1 ]]; then + # Yes, exclude word separator characters; + # Exclude only those characters, which were really included + exclude="[${1//[^$COMP_WORDBREAKS]/}]" + fi + + # Default to cword unchanged + printf -v "$3" %s "$COMP_CWORD" + # Are characters excluded which were former included? + if [[ $exclude ]]; then + # Yes, list of word completion separators has shrunk; + line=$COMP_LINE + # Re-assemble words to complete + for ((i = 0, j = 0; i < ${#COMP_WORDS[@]}; i++, j++)); do + # Is current word not word 0 (the command itself) and is word not + # empty and is word made up of just word separator characters to + # be excluded and is current word not preceded by whitespace in + # original line? + while [[ $i -gt 0 && ${COMP_WORDS[i]} == +($exclude) ]]; do + # Is word separator not preceded by whitespace in original line + # and are we not going to append to word 0 (the command + # itself), then append to current word. + [[ $line != [[:blank:]]* ]] && ((j >= 2)) && ((j--)) + # Append word separator to current or new word + ref="$2[$j]" + printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" + # Indicate new cword + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + # Remove optional whitespace + word separator from line copy + line=${line#*"${COMP_WORDS[i]}"} + # Indicate next word if available, else end *both* while and + # for loop + if ((i < ${#COMP_WORDS[@]} - 1)); then + ((i++)) + else + break 2 + fi + # Start new word if word separator in original line is + # followed by whitespace. + [[ $line == [[:blank:]]* ]] && ((j++)) + done + # Append word to current word + ref="$2[$j]" + printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" + # Remove optional whitespace + word from line copy + line=${line#*"${COMP_WORDS[i]}"} + # Indicate new cword + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + done + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + else + # No, list of word completions separators hasn't changed; + for i in "${!COMP_WORDS[@]}"; do + printf -v "$2[i]" %s "${COMP_WORDS[i]}" + done + fi +} + + + local FCN_RETURN="" + local IS_PATH=0 + + +local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clearroi clientversion clkdiv clkfreq clkphase column compdisabletime confadc config counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 exptimel extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit patternX patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port powerchip powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga roi romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_a v_b v_c v_chip v_d v_io v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport " +__acquire() { +FCN_RETURN="" +return 0 +} +__activate() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__adcclk() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcenable() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcenable10g() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcinvert() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adclist() { +FCN_RETURN="" +return 0 +} +__adcname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcphase() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="deg" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="deg" +fi +fi +return 0 +} +__adcpipeline() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcreg() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcvpp() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="mV mv" +fi +fi +return 0 +} +__apulse() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__asamples() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__autocompdisable() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__badchannels() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__blockingtrigger() { +FCN_RETURN="" +return 0 +} +__burstmode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="burst_external burst_internal cw_external cw_internal" +fi +fi +return 0 +} +__burstperiod() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__bursts() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__burstsl() { +FCN_RETURN="" +return 0 +} +__bustest() { +FCN_RETURN="" +return 0 +} +__cdsgain() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__chipversion() { +FCN_RETURN="" +return 0 +} +__clearbit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__clearbusy() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__clearroi() { +FCN_RETURN="" +return 0 +} +__clientversion() { +FCN_RETURN="" +return 0 +} +__clkdiv() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__clkfreq() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__clkphase() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="deg" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="deg" +fi +fi +return 0 +} +__column() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__compdisabletime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__confadc() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__config() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__counters() { +FCN_RETURN="" +return 0 +} +__currentsource() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="fix nofix" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="low normal" +fi +fi +return 0 +} +__dac() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="mV mv" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="mV mv" +fi +fi +return 0 +} +__dacindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__daclist() { +FCN_RETURN="" +return 0 +} +__dacname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__dacvalues() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="mV mv" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="mV mv" +fi +fi +return 0 +} +__datastream() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="bottom left right top" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="bottom left right top" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__dbitclk() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__dbitphase() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="deg" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="deg" +fi +fi +return 0 +} +__dbitpipeline() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__defaultdac() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__defaultpattern() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__delay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__delayl() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__detectorserverversion() { +FCN_RETURN="" +return 0 +} +__detsize() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__diodelay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__dpulse() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__dr() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__drlist() { +FCN_RETURN="" +return 0 +} +__dsamples() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__execcommand() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__exptime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__exptime1() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__exptime2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__exptime3() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__exptimel() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__extrastoragecells() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__extsampling() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__extsamplingsrc() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__extsig() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="inversion_off inversion_on trigger_in_falling_edge trigger_in_rising_edge" +fi +fi +return 0 +} +__fformat() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="binary hdf5" +fi +fi +return 0 +} +__filtercells() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__filterresistor() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__findex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__firmwaretest() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__firmwareversion() { +FCN_RETURN="" +return 0 +} +__fliprows() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__flowcontrol10g() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__fmaster() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__fname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__foverwrite() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__fpath() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__framecounter() { +FCN_RETURN="" +return 0 +} +__frames() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__framesl() { +FCN_RETURN="" +return 0 +} +__frametime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__free() { +FCN_RETURN="" +return 0 +} +__fwrite() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__gaincaps() { +FCN_RETURN="" +return 0 +} +__gainmode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="dynamic fixg0 fixg1 fixg2 forceswitchg1 forceswitchg2" +fi +fi +return 0 +} +__gappixels() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__gatedelay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__gatedelay1() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__gatedelay2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__gatedelay3() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__gates() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__getbit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__hardwareversion() { +FCN_RETURN="" +return 0 +} +__highvoltage() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__hostname() { +FCN_RETURN="" +return 0 +} +__im_a() { +FCN_RETURN="" +return 0 +} +__im_b() { +FCN_RETURN="" +return 0 +} +__im_c() { +FCN_RETURN="" +return 0 +} +__im_d() { +FCN_RETURN="" +return 0 +} +__im_io() { +FCN_RETURN="" +return 0 +} +__imagetest() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__initialchecks() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__inj_ch() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__interpolation() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__interruptsubframe() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__kernelversion() { +FCN_RETURN="" +return 0 +} +__lastclient() { +FCN_RETURN="" +return 0 +} +__led() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__lock() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__master() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__maxadcphaseshift() { +FCN_RETURN="" +return 0 +} +__maxclkphaseshift() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__maxdbitphaseshift() { +FCN_RETURN="" +return 0 +} +__measuredperiod() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__measuredsubperiod() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__moduleid() { +FCN_RETURN="" +return 0 +} +__nextframenumber() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__nmod() { +FCN_RETURN="" +return 0 +} +__numinterfaces() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__overflow() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__packageversion() { +FCN_RETURN="" +return 0 +} +__parallel() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__parameters() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__partialreset() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__patfname() { +FCN_RETURN="" +return 0 +} +__patioctrl() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patlimits() { +FCN_RETURN="" +return 0 +} +__patloop() { +FCN_RETURN="" +return 0 +} +__patloop0() { +FCN_RETURN="" +return 0 +} +__patloop1() { +FCN_RETURN="" +return 0 +} +__patloop2() { +FCN_RETURN="" +return 0 +} +__patmask() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patnloop() { +FCN_RETURN="" +return 0 +} +__patnloop0() { +FCN_RETURN="" +return 0 +} +__patnloop1() { +FCN_RETURN="" +return 0 +} +__patnloop2() { +FCN_RETURN="" +return 0 +} +__patsetbit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patternX() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patternstart() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patwait() { +FCN_RETURN="" +return 0 +} +__patwait0() { +FCN_RETURN="" +return 0 +} +__patwait1() { +FCN_RETURN="" +return 0 +} +__patwait2() { +FCN_RETURN="" +return 0 +} +__patwaittime() { +FCN_RETURN="" +return 0 +} +__patwaittime0() { +FCN_RETURN="" +return 0 +} +__patwaittime1() { +FCN_RETURN="" +return 0 +} +__patwaittime2() { +FCN_RETURN="" +return 0 +} +__patword() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__pedestalmode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN=" 0" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__period() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__periodl() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__polarity() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="neg pos" +fi +fi +return 0 +} +__port() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__powerchip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__powerindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__powerlist() { +FCN_RETURN="" +return 0 +} +__powername() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__powervalues() { +FCN_RETURN="" +return 0 +} +__programfpga() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="--force-delete-normal-file" +fi +fi +return 0 +} +__pulse() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="--force-delete-normal-file" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__pulsechip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__pulsenmove() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__pumpprobe() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__quad() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__ratecorr() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__readnrows() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__readout() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__readoutspeed() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1 108 144 2 full_speed half_speed quarter_speed" +fi +fi +return 0 +} +__readoutspeedlist() { +FCN_RETURN="" +return 0 +} +__rebootcontroller() { +FCN_RETURN="" +return 0 +} +__reg() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__resetdacs() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="hard" +fi +fi +return 0 +} +__resetfpga() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="hard" +fi +fi +return 0 +} +__roi() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__romode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="analog analog_digital digital digital_transceiver transceiver" +fi +fi +return 0 +} +__row() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__runclk() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__runtime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__rx_arping() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_clearroi() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_dbitlist() { +FCN_RETURN="" +return 0 +} +__rx_dbitoffset() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_discardpolicy() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="discardempty discardpartial nodiscard" +fi +fi +return 0 +} +__rx_fifodepth() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_frameindex() { +FCN_RETURN="" +return 0 +} +__rx_framescaught() { +FCN_RETURN="" +return 0 +} +__rx_framesperfile() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_hostname() { +FCN_RETURN="" +return 0 +} +__rx_jsonaddheader() { +FCN_RETURN="" +return 0 +} +__rx_jsonpara() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_lastclient() { +FCN_RETURN="" +return 0 +} +__rx_lock() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_missingpackets() { +FCN_RETURN="" +return 0 +} +__rx_padding() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_printconfig() { +FCN_RETURN="" +return 0 +} +__rx_realudpsocksize() { +FCN_RETURN="" +return 0 +} +__rx_roi() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_silent() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_start() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_status() { +FCN_RETURN="" +return 0 +} +__rx_stop() { +FCN_RETURN="" +return 0 +} +__rx_tcpport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_threads() { +FCN_RETURN="" +return 0 +} +__rx_udpsocksize() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_version() { +FCN_RETURN="" +return 0 +} +__rx_zmqfreq() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqhwm() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqstartfnum() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqstream() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__samples() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__savepattern() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__scan() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "6" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__scanerrmsg() { +FCN_RETURN="" +return 0 +} +__selinterface() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__serialnumber() { +FCN_RETURN="" +return 0 +} +__setbit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__settings() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__settingslist() { +FCN_RETURN="" +return 0 +} +__settingspath() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__signalindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__signallist() { +FCN_RETURN="" +return 0 +} +__signalname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__slowadc() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__slowadcindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__slowadclist() { +FCN_RETURN="" +return 0 +} +__slowadcname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__slowadcvalues() { +FCN_RETURN="" +return 0 +} +__start() { +FCN_RETURN="" +return 0 +} +__status() { +FCN_RETURN="" +return 0 +} +__stop() { +FCN_RETURN="" +return 0 +} +__stopport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__storagecell_delay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__storagecell_start() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__subdeadtime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__subexptime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__sync() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__syncclk() { +FCN_RETURN="" +return 0 +} +__temp_10ge() { +FCN_RETURN="" +return 0 +} +__temp_adc() { +FCN_RETURN="" +return 0 +} +__temp_control() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__temp_dcdc() { +FCN_RETURN="" +return 0 +} +__temp_event() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__temp_fpga() { +FCN_RETURN="" +return 0 +} +__temp_fpgaext() { +FCN_RETURN="" +return 0 +} +__temp_fpgafl() { +FCN_RETURN="" +return 0 +} +__temp_fpgafr() { +FCN_RETURN="" +return 0 +} +__temp_slowadc() { +FCN_RETURN="" +return 0 +} +__temp_sodl() { +FCN_RETURN="" +return 0 +} +__temp_sodr() { +FCN_RETURN="" +return 0 +} +__temp_threshold() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__templist() { +FCN_RETURN="" +return 0 +} +__tempvalues() { +FCN_RETURN="" +return 0 +} +__tengiga() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__threshold() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__thresholdnotb() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__timing() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg timinglist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__timinglist() { +FCN_RETURN="" +return 0 +} +__timingsource() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="external internal" +fi +fi +return 0 +} +__top() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__transceiverenable() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__trigger() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__triggers() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__triggersl() { +FCN_RETURN="" +return 0 +} +__trimbits() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__trimen() { +FCN_RETURN="" +return 0 +} +__trimval() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__tsamples() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__txdelay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__txdelay_frame() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__txdelay_left() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__txdelay_right() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__type() { +FCN_RETURN="" +return 0 +} +__udp_cleardst() { +FCN_RETURN="" +return 0 +} +__udp_dstip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstip2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstlist() { +FCN_RETURN="" +return 0 +} +__udp_dstmac() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstmac2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstport2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_firstdst() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_numdst() { +FCN_RETURN="" +return 0 +} +__udp_reconfigure() { +FCN_RETURN="" +return 0 +} +__udp_srcip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_srcip2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_srcmac() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_srcmac2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_validate() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__update() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__updatedetectorserver() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__updatekernel() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__updatemode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__user() { +FCN_RETURN="" +return 0 +} +__v_a() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_b() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_c() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_chip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_d() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_io() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_limit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_comp_adc() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_comp_fe() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_cs() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_opa_1st() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_opa_fd() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_ref_comp_fe() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__versions() { +FCN_RETURN="" +return 0 +} +__veto() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__vetoalg() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="10gbe lll none" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="hits raw" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="10gbe lll none" +fi +fi +return 0 +} +__vetofile() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vetophoton() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vetoref() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vetostream() { +FCN_RETURN="" +return 0 +} +__virtual() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vm_a() { +FCN_RETURN="" +return 0 +} +__vm_b() { +FCN_RETURN="" +return 0 +} +__vm_c() { +FCN_RETURN="" +return 0 +} +__vm_d() { +FCN_RETURN="" +return 0 +} +__vm_io() { +FCN_RETURN="" +return 0 +} +__zmqhwm() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__zmqip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__zmqport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} + + + COMPREPLY=() + local OPTIONS_NEW="" + + # check if bash or zsh + # _get_comp_words_by_ref is a bash built-in function, we check if it exists + declare -Ff _get_comp_words_by_ref > /dev/null && IS_BASH=1 || IS_BASH=0 + + + # bash interprets the colon character : as a special character and splits the argument in two + # different than what zsh does + # https://stackoverflow.com/a/3224910 + # https://stackoverflow.com/a/12495727 + local cur + local cword words=() + _comp__reassemble_words ":" words cword + cur=${words[cword]} + + # check the action (get or put) + case "${words[0]}" in + "sls_detector_get" | "g" | "detg") + local IS_GET=1 + ;; + *) + local IS_GET=0 + ;; + esac + + # if no command is written, autocomplete with the commands + if [[ ${cword} -eq 1 ]]; then +# local SLS_COMMANDS="trimbits exptime" + local SLS_COMMANDS_NEW="" + + case "$cur" in + [0-9]*:*) + local suggestions=($(compgen -W "${SLS_COMMANDS}" -- "${cur#*:}")) + COMPREPLY=( ${suggestions[*]} ) + ;; + [0-9]*) + COMPREPLY=() + ;; + *) + COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );; + + esac + return 0 + fi + + if [[ ${cword} -eq 2 ]] && [[ ${words[1]} == "-h" ]]; then + COMPREPLY=( $( compgen -W "$SLS_COMMANDS" -- "$cur" ) ) + return 0 + fi + + # if a command is written, autocomplete with the options + # call the function for the command + + if [[ "$SLS_COMMANDS" == *"${words[1]##*:}"* ]]; then + __"${words[1]##*:}" + fi + + # if IS_PATH is activated, autocomplete with the path + if [[ ${IS_PATH} -eq 1 ]]; then + COMPREPLY=($(compgen -f -- "${cur}")) + return 0 + fi + + # autocomplete with the options + COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}")) + + + +} + +complete -F _sd -o filenames sls_detector_get +complete -F _sd -o filenames g +complete -F _sd -o filenames detg + +complete -F _sd -o filenames sls_detector_put +complete -F _sd -o filenames p +complete -F _sd -o filenames detp diff --git a/slsDetectorSoftware/generator/autocomplete/dump.json b/slsDetectorSoftware/generator/autocomplete/dump.json new file mode 100644 index 000000000..d2500d581 --- /dev/null +++ b/slsDetectorSoftware/generator/autocomplete/dump.json @@ -0,0 +1,62035 @@ +{ + "id": "0x3654da8", + "kind": "FunctionTemplateDecl", + "loc": { + "offset": 8539, + "file": "../include/sls/ToString.h", + "line": 271, + "col": 3, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8515, + "line": 270, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9380, + "line": 293, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "inner": [ + { + "id": "0x3654a48", + "kind": "TemplateTypeParmDecl", + "loc": { + "offset": 8534, + "line": 270, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8525, + "col": 11, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8534, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "T", + "tagUsed": "typename", + "depth": 0, + "index": 0 + }, + { + "id": "0x3654d08", + "kind": "FunctionDecl", + "loc": { + "offset": 8539, + "line": 271, + "col": 3, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8537, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9380, + "line": 293, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "type": { + "qualType": "T (const std::string &, const std::string &)" + }, + "inner": [ + { + "id": "0x3654b38", + "kind": "ParmVarDecl", + "loc": { + "offset": 8567, + "line": 271, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8548, + "col": 12, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8567, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "t", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "loc": { + "offset": 8589, + "col": 53, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8570, + "col": 34, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8589, + "col": 53, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "unit", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3687658", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8595, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9380, + "line": 293, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3654fe0", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 8601, + "line": 272, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8615, + "col": 19, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3654ea0", + "kind": "VarDecl", + "loc": { + "offset": 8608, + "col": 12, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8601, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8614, + "col": 18, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "tval", + "type": { + "qualType": "double" + }, + "init": "list", + "inner": [ + { + "id": "0x3654f80", + "kind": "InitListExpr", + "range": { + "begin": { + "offset": 8612, + "col": 16, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8614, + "col": 18, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3654fc0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8613, + "col": 17, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8613, + "col": 17, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "prvalue", + "castKind": "IntegralToFloating", + "inner": [ + { + "id": "0x3654f08", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 8613, + "col": 17, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8613, + "col": 17, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "0" + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3655488", + "kind": "CXXTryStmt", + "range": { + "begin": { + "offset": 8621, + "line": 273, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8771, + "line": 277, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36551c0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8625, + "line": 273, + "col": 9, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8660, + "line": 275, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36551a0", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 8635, + "line": 274, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8653, + "col": 27, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "opcode": "=", + "inner": [ + { + "id": "0x3654ff8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8635, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8635, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + }, + { + "id": "0x3655150", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 8642, + "col": 16, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8653, + "col": 27, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3655138", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8642, + "col": 16, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8647, + "col": 21, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double (*)(const std::string &, std::size_t *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36550a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8642, + "col": 16, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8647, + "col": 21, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double (const std::string &, std::size_t *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2caf050", + "kind": "FunctionDecl", + "name": "stod", + "type": { + "qualType": "double (const std::string &, std::size_t *)" + } + } + } + ] + }, + { + "id": "0x3655088", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8652, + "col": 26, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8652, + "col": 26, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654b38", + "kind": "ParmVarDecl", + "name": "t", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3655180", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue" + } + ] + } + ] + } + ] + }, + { + "id": "0x3655468", + "kind": "CXXCatchStmt", + "range": { + "begin": { + "offset": 8662, + "line": 275, + "col": 7, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8771, + "line": 277, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3655290", + "kind": "VarDecl", + "loc": { + "offset": 8698, + "line": 275, + "col": 43, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8669, + "col": 14, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8698, + "col": 43, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "e", + "type": { + "qualType": "const std::invalid_argument &" + } + }, + { + "id": "0x3655450", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8701, + "col": 46, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8771, + "line": 277, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3655438", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 8711, + "line": 276, + "col": 9, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3655420", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 8711, + "col": 9, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36553f0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x36553d8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x36553b0", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da84b8", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const char *)" + } + }, + "inner": [ + { + "id": "0x3655390", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3655388", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3655358", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const char *)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3655340", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8730, + "col": 28, + "tokLen": 34, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8730, + "col": 28, + "tokLen": 34, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3655308", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 8730, + "col": 28, + "tokLen": 34, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8730, + "col": 28, + "tokLen": 34, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[33]" + }, + "valueCategory": "lvalue", + "value": "\"Could not convert string to time\"" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3655560", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 8778, + "line": 279, + "col": 5, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8805, + "col": 32, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36554b8", + "kind": "UsingDecl", + "loc": { + "offset": 8797, + "col": 24, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8778, + "col": 5, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8797, + "col": 24, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "std::chrono::duration" + } + ] + }, + { + "id": "0x3655630", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 8811, + "line": 280, + "col": 5, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8843, + "col": 37, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3655588", + "kind": "UsingDecl", + "loc": { + "offset": 8830, + "col": 24, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8811, + "col": 5, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8830, + "col": 24, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "std::chrono::duration_cast" + } + ] + }, + { + "id": "0x3687628", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 8849, + "line": 281, + "col": 5, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "hasElse": true, + "inner": [ + { + "id": "0x36563f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 8853, + "line": 281, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x36563d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8858, + "col": 14, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8858, + "col": 14, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36563b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8858, + "col": 14, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8858, + "col": 14, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3655648", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8853, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8853, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x36563a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3655668", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"ns\"" + } + ] + } + ] + }, + { + "id": "0x366ce00", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8867, + "col": 23, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8941, + "line": 283, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x366cdf0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 8877, + "line": 282, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8934, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x366cdc8", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 8884, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8934, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3656438", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 8884, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8899, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "duration_cast", + "lookups": [ + { + "id": "0x36555e0", + "kind": "UsingShadowDecl", + "name": "duration_cast" + } + ] + }, + { + "id": "0x366cda0", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 8901, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8933, + "col": 65, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x366ca28", + "kind": "CXXConstructorDecl", + "name": "duration", + "type": { + "qualType": "void (const double &)" + } + }, + "inner": [ + { + "id": "0x366cd70", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 8901, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8933, + "col": 65, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const double &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x366cb78", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8929, + "col": 61, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8929, + "col": 61, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const double", + "qualType": "const double" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x36566d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8929, + "col": 61, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8929, + "col": 61, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36875f8", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 8948, + "line": 283, + "col": 12, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "hasElse": true, + "inner": [ + { + "id": "0x366dbc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 8952, + "line": 283, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x366dba8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8957, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8957, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x366db88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8957, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8957, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x366ce18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8952, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8952, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x366db70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x366ce38", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"us\"" + } + ] + } + ] + }, + { + "id": "0x3675a60", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8966, + "col": 30, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9041, + "line": 285, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3675a50", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 8976, + "line": 284, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9034, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3675a28", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 8983, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9034, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x366dc08", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 8983, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8998, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "duration_cast", + "lookups": [ + { + "id": "0x36555e0", + "kind": "UsingShadowDecl", + "name": "duration_cast" + } + ] + }, + { + "id": "0x3675a00", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 9000, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9033, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x3675688", + "kind": "CXXConstructorDecl", + "name": "duration", + "type": { + "qualType": "void (const double &)" + } + }, + "inner": [ + { + "id": "0x36759d0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9000, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9033, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const double &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x36757d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9029, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9029, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const double", + "qualType": "const double" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x366dea8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9029, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9029, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36875c8", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 9048, + "line": 285, + "col": 12, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "hasElse": true, + "inner": [ + { + "id": "0x3676820", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 9052, + "line": 285, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3676808", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9057, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9057, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36767e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9057, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9057, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3675a78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9052, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9052, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x36767d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3675a98", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"ms\"" + } + ] + } + ] + }, + { + "id": "0x367e6d0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 9066, + "col": 30, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9141, + "line": 287, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x367e6c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 9076, + "line": 286, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9134, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x367e698", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 9083, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9134, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3676868", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 9083, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9098, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "duration_cast", + "lookups": [ + { + "id": "0x36555e0", + "kind": "UsingShadowDecl", + "name": "duration_cast" + } + ] + }, + { + "id": "0x367e670", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 9100, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9133, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x367e2f8", + "kind": "CXXConstructorDecl", + "name": "duration", + "type": { + "qualType": "void (const double &)" + } + }, + "inner": [ + { + "id": "0x367e640", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9100, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9133, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const double &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x367e448", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9129, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9129, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const double", + "qualType": "const double" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3676b08", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9129, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9129, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3687598", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 9148, + "line": 287, + "col": 12, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "hasElse": true, + "inner": [ + { + "id": "0x367f568", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 9152, + "line": 287, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9178, + "col": 42, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x367f490", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 9152, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x367f478", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9157, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9157, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x367f458", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9157, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9157, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x367e6e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9152, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9152, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x367f440", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x367e708", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"s\"" + } + ] + } + ] + }, + { + "id": "0x367f518", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 9167, + "col": 31, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9178, + "col": 42, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x367f4e8", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 9167, + "col": 31, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9172, + "col": 36, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "empty", + "isArrow": false, + "referencedMemberDecl": "0x2c94de8", + "inner": [ + { + "id": "0x367f4c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9167, + "col": 31, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9167, + "col": 31, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x36873f0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 9181, + "col": 45, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9257, + "line": 289, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36873e0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 9191, + "line": 288, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9250, + "col": 68, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36873b8", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 9198, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9250, + "col": 68, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x367f598", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 9198, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9213, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "duration_cast", + "lookups": [ + { + "id": "0x36555e0", + "kind": "UsingShadowDecl", + "name": "duration_cast" + } + ] + }, + { + "id": "0x3687390", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 9215, + "col": 33, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9249, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration", + "qualType": "std::chrono::duration" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x3687018", + "kind": "CXXConstructorDecl", + "name": "duration", + "type": { + "qualType": "void (const double &)" + } + }, + "inner": [ + { + "id": "0x3687360", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9215, + "col": 33, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9249, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration", + "qualType": "std::chrono::duration" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const double &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687168", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9245, + "col": 63, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9245, + "col": 63, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const double", + "qualType": "const double" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x367f840", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9245, + "col": 63, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9245, + "col": 63, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3687580", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 9264, + "line": 289, + "col": 12, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687568", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 9274, + "line": 290, + "col": 9, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3687550", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 9274, + "line": 290, + "col": 9, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3687520", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687508", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x36874e0", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da84b8", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const char *)" + } + }, + "inner": [ + { + "id": "0x36874c0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x36874b8", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3687488", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const char *)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687470", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9306, + "col": 13, + "tokLen": 65, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9306, + "col": 13, + "tokLen": 65, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3687418", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 9306, + "col": 13, + "tokLen": 65, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9306, + "col": 13, + "tokLen": 65, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[64]" + }, + "valueCategory": "lvalue", + "value": "\"Invalid unit in conversion from string to std::chrono::duration\"" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x3687908", + "kind": "FunctionTemplateDecl", + "loc": { + "offset": 9407, + "file": "../include/sls/ToString.h", + "line": 295, + "col": 25, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9383, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9532, + "line": 299, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "inner": [ + { + "id": "0x3687690", + "kind": "TemplateTypeParmDecl", + "loc": { + "offset": 9402, + "line": 295, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9393, + "col": 11, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9402, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "T", + "tagUsed": "typename", + "depth": 0, + "index": 0 + }, + { + "id": "0x3687868", + "kind": "FunctionDecl", + "loc": { + "offset": 9407, + "col": 25, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9405, + "col": 23, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9532, + "line": 299, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "type": { + "qualType": "T (const std::string &)" + }, + "inner": [ + { + "id": "0x3687778", + "kind": "ParmVarDecl", + "loc": { + "offset": 9435, + "line": 295, + "col": 53, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9416, + "col": 34, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9435, + "col": 53, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "t", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3688030", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 9438, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9532, + "line": 299, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687b68", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 9444, + "line": 296, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9462, + "col": 23, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687a38", + "kind": "VarDecl", + "loc": { + "offset": 9456, + "col": 17, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9444, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9461, + "col": 22, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "tmp", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "init": "list", + "inner": [ + { + "id": "0x3687b38", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9456, + "col": 17, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9461, + "col": 22, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::basic_string &)" + }, + "list": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687aa0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9460, + "col": 21, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9460, + "col": 21, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3687778", + "kind": "ParmVarDecl", + "name": "t", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x3687ef0", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 9468, + "line": 297, + "col": 5, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9495, + "col": 32, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687bc0", + "kind": "VarDecl", + "loc": { + "offset": 9473, + "col": 10, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9468, + "col": 5, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "unit", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "init": "c", + "inner": [ + { + "id": "0x3687ed8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3687ea8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (std::basic_string &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687e60", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3687d50", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "temp": "0x3687d48", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3687d20", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3687d08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "std::string (*)(std::string &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3687c90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "std::string (std::string &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2fb3d48", + "kind": "FunctionDecl", + "name": "RemoveUnit", + "type": { + "qualType": "std::string (std::string &)" + } + } + } + ] + }, + { + "id": "0x3687c70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9491, + "col": 28, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9491, + "col": 28, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3687a38", + "kind": "VarDecl", + "name": "tmp", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3688020", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 9501, + "line": 298, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9529, + "col": 33, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687ff0", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 9508, + "col": 12, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9529, + "col": 33, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3687f30", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 9508, + "col": 12, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9518, + "col": 22, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "StringTo", + "lookups": [ + { + "id": "0x3687908", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + }, + { + "id": "0x3654da8", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + } + ] + }, + { + "id": "0x3687fb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9520, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9520, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3687a38", + "kind": "VarDecl", + "name": "tmp", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + }, + { + "id": "0x3687fd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9525, + "col": 29, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9525, + "col": 29, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3687bc0", + "kind": "VarDecl", + "name": "unit", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3849458", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::detectorType (const std::string &)" + } + }, + { + "id": "0x3850318", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::detectorSettings (const std::string &)" + } + }, + { + "id": "0x3866a58", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::speedLevel (const std::string &)" + } + }, + { + "id": "0x386e798", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::timingMode (const std::string &)" + } + }, + { + "id": "0x3873968", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::frameDiscardPolicy (const std::string &)" + } + }, + { + "id": "0x3876e78", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::fileFormat (const std::string &)" + } + }, + { + "id": "0x38794b8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::externalSignalFlag (const std::string &)" + } + }, + { + "id": "0x387d838", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::readoutMode (const std::string &)" + } + }, + { + "id": "0x3882a18", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::dacIndex (const std::string &)" + } + }, + { + "id": "0x7f1964638418", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::burstMode (const std::string &)" + } + }, + { + "id": "0x7f196463c788", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::timingSourceType (const std::string &)" + } + }, + { + "id": "0x7f196463edd8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::M3_GainCaps (const std::string &)" + } + }, + { + "id": "0x7f1964644df8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::portPosition (const std::string &)" + } + }, + { + "id": "0x38d72a8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::streamingInterface (const std::string &)" + } + }, + { + "id": "0x38dae78", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::vetoAlgorithm (const std::string &)" + } + }, + { + "id": "0x38dd4b8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::gainMode (const std::string &)" + } + }, + { + "id": "0x38e34f8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::polarity (const std::string &)" + } + }, + { + "id": "0x38e5ae8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "uint32_t (const std::string &)" + } + }, + { + "id": "0x38e62f8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "uint64_t (const std::string &)" + } + }, + { + "id": "0x38e6af0", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "int (const std::string &)" + } + }, + { + "id": "0x38e72d8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "bool (const std::string &)" + } + }, + { + "id": "0x38e7b28", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "int64_t (const std::string &)" + } + } + ] +} +{ + "id": "0x3688208", + "kind": "FunctionDecl", + "loc": { + "offset": 9566, + "file": "../include/sls/ToString.h", + "line": 301, + "col": 32, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9535, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9595, + "col": 61, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3688438", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs12detectorTypeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::detectorType (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "inner": [ + { + "id": "0x2f41f40", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "decl": { + "id": "0x2f41ea0", + "kind": "EnumDecl", + "name": "detectorType" + } + } + ] + }, + { + "id": "0x3688100", + "kind": "ParmVarDecl", + "loc": { + "offset": 9594, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9575, + "col": 41, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9594, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x3688728", + "kind": "FunctionDecl", + "loc": { + "offset": 9633, + "file": "../include/sls/ToString.h", + "line": 302, + "col": 36, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9598, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9662, + "col": 65, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3688958", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs16detectorSettingsEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::detectorSettings (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "inner": [ + { + "id": "0x2f5a2c0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "decl": { + "id": "0x2f5a218", + "kind": "EnumDecl", + "name": "detectorSettings" + } + } + ] + }, + { + "id": "0x3688620", + "kind": "ParmVarDecl", + "loc": { + "offset": 9661, + "col": 64, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9642, + "col": 45, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9661, + "col": 64, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x3688c48", + "kind": "FunctionDecl", + "loc": { + "offset": 9694, + "file": "../include/sls/ToString.h", + "line": 303, + "col": 30, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9665, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9723, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3688e78", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10speedLevelEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::speedLevel (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "inner": [ + { + "id": "0x2f5af70", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "decl": { + "id": "0x2f5aec8", + "kind": "EnumDecl", + "name": "speedLevel" + } + } + ] + }, + { + "id": "0x3688b40", + "kind": "ParmVarDecl", + "loc": { + "offset": 9722, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9703, + "col": 39, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9722, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x3689168", + "kind": "FunctionDecl", + "loc": { + "offset": 9755, + "file": "../include/sls/ToString.h", + "line": 304, + "col": 30, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9726, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9784, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3689398", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10timingModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::timingMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "inner": [ + { + "id": "0x2f57730", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "decl": { + "id": "0x2f57688", + "kind": "EnumDecl", + "name": "timingMode" + } + } + ] + }, + { + "id": "0x3689060", + "kind": "ParmVarDecl", + "loc": { + "offset": 9783, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9764, + "col": 39, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9783, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x3689688", + "kind": "FunctionDecl", + "loc": { + "offset": 9824, + "file": "../include/sls/ToString.h", + "line": 305, + "col": 38, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9787, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9853, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x36898b8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18frameDiscardPolicyEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::frameDiscardPolicy (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "inner": [ + { + "id": "0x2f554b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "decl": { + "id": "0x2f55410", + "kind": "EnumDecl", + "name": "frameDiscardPolicy" + } + } + ] + }, + { + "id": "0x3689580", + "kind": "ParmVarDecl", + "loc": { + "offset": 9852, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9833, + "col": 47, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9852, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x3689ba8", + "kind": "FunctionDecl", + "loc": { + "offset": 9885, + "file": "../include/sls/ToString.h", + "line": 306, + "col": 30, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9856, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9914, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3689dd8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10fileFormatEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::fileFormat (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "inner": [ + { + "id": "0x2f556b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "decl": { + "id": "0x2f55610", + "kind": "EnumDecl", + "name": "fileFormat" + } + } + ] + }, + { + "id": "0x3689aa0", + "kind": "ParmVarDecl", + "loc": { + "offset": 9913, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9894, + "col": 39, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9913, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368abf0", + "kind": "FunctionDecl", + "loc": { + "offset": 9954, + "file": "../include/sls/ToString.h", + "line": 307, + "col": 38, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9917, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9983, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368ae28", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18externalSignalFlagEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::externalSignalFlag (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "inner": [ + { + "id": "0x2f57500", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "decl": { + "id": "0x2f57458", + "kind": "EnumDecl", + "name": "externalSignalFlag" + } + } + ] + }, + { + "id": "0x3689fc0", + "kind": "ParmVarDecl", + "loc": { + "offset": 9982, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9963, + "col": 47, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9982, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368b118", + "kind": "FunctionDecl", + "loc": { + "offset": 10016, + "file": "../include/sls/ToString.h", + "line": 308, + "col": 31, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9986, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10045, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368b348", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs11readoutModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::readoutMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "inner": [ + { + "id": "0x2f5acf0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "decl": { + "id": "0x2f5ac48", + "kind": "EnumDecl", + "name": "readoutMode" + } + } + ] + }, + { + "id": "0x368b010", + "kind": "ParmVarDecl", + "loc": { + "offset": 10044, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10025, + "col": 40, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10044, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368b638", + "kind": "FunctionDecl", + "loc": { + "offset": 10075, + "file": "../include/sls/ToString.h", + "line": 309, + "col": 28, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10048, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10104, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368b868", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8dacIndexEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::dacIndex (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "inner": [ + { + "id": "0x2f57a00", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "decl": { + "id": "0x2f57958", + "kind": "EnumDecl", + "name": "dacIndex" + } + } + ] + }, + { + "id": "0x368b530", + "kind": "ParmVarDecl", + "loc": { + "offset": 10103, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10084, + "col": 37, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10103, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368bb58", + "kind": "FunctionDecl", + "loc": { + "offset": 10135, + "file": "../include/sls/ToString.h", + "line": 310, + "col": 29, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10107, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10164, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368bd88", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs9burstModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::burstMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "inner": [ + { + "id": "0x2f5b1f0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "decl": { + "id": "0x2f5b148", + "kind": "EnumDecl", + "name": "burstMode" + } + } + ] + }, + { + "id": "0x368ba50", + "kind": "ParmVarDecl", + "loc": { + "offset": 10163, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10144, + "col": 38, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10163, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368c078", + "kind": "FunctionDecl", + "loc": { + "offset": 10202, + "file": "../include/sls/ToString.h", + "line": 311, + "col": 36, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10167, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10231, + "col": 65, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368c2a8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs16timingSourceTypeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::timingSourceType (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "inner": [ + { + "id": "0x2f5b470", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "decl": { + "id": "0x2f5b3c8", + "kind": "EnumDecl", + "name": "timingSourceType" + } + } + ] + }, + { + "id": "0x368bf70", + "kind": "ParmVarDecl", + "loc": { + "offset": 10230, + "col": 64, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10211, + "col": 45, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10230, + "col": 64, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368c598", + "kind": "FunctionDecl", + "loc": { + "offset": 10264, + "file": "../include/sls/ToString.h", + "line": 312, + "col": 31, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10234, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10293, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368c7c8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs11M3_GainCapsEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::M3_GainCaps (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "inner": [ + { + "id": "0x2f5b5d0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "decl": { + "id": "0x2f5b530", + "kind": "EnumDecl", + "name": "M3_GainCaps" + } + } + ] + }, + { + "id": "0x368c490", + "kind": "ParmVarDecl", + "loc": { + "offset": 10292, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10273, + "col": 40, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10292, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368cab8", + "kind": "FunctionDecl", + "loc": { + "offset": 10327, + "file": "../include/sls/ToString.h", + "line": 313, + "col": 32, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10296, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10356, + "col": 61, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368cce8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs12portPositionEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::portPosition (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "inner": [ + { + "id": "0x2f5bc00", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "decl": { + "id": "0x2f5bb60", + "kind": "EnumDecl", + "name": "portPosition" + } + } + ] + }, + { + "id": "0x368c9b0", + "kind": "ParmVarDecl", + "loc": { + "offset": 10355, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10336, + "col": 41, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10355, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368cfd8", + "kind": "FunctionDecl", + "loc": { + "offset": 10396, + "file": "../include/sls/ToString.h", + "line": 314, + "col": 38, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10359, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10425, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368d208", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18streamingInterfaceEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::streamingInterface (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "inner": [ + { + "id": "0x2f5bf90", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "decl": { + "id": "0x2f5bef0", + "kind": "EnumDecl", + "name": "streamingInterface" + } + } + ] + }, + { + "id": "0x368ced0", + "kind": "ParmVarDecl", + "loc": { + "offset": 10424, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10405, + "col": 47, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10424, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368d4f8", + "kind": "FunctionDecl", + "loc": { + "offset": 10460, + "file": "../include/sls/ToString.h", + "line": 315, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10428, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10489, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368d728", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs13vetoAlgorithmEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::vetoAlgorithm (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "inner": [ + { + "id": "0x2f5c350", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "decl": { + "id": "0x2f5c2b0", + "kind": "EnumDecl", + "name": "vetoAlgorithm" + } + } + ] + }, + { + "id": "0x368d3f0", + "kind": "ParmVarDecl", + "loc": { + "offset": 10488, + "col": 61, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10469, + "col": 42, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10488, + "col": 61, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368da18", + "kind": "FunctionDecl", + "loc": { + "offset": 10519, + "file": "../include/sls/ToString.h", + "line": 316, + "col": 28, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10492, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10548, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368dc48", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8gainModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::gainMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "inner": [ + { + "id": "0x2f5c4b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "decl": { + "id": "0x2f5c410", + "kind": "EnumDecl", + "name": "gainMode" + } + } + ] + }, + { + "id": "0x368d910", + "kind": "ParmVarDecl", + "loc": { + "offset": 10547, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10528, + "col": 37, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10547, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368df38", + "kind": "FunctionDecl", + "loc": { + "offset": 10578, + "file": "../include/sls/ToString.h", + "line": 317, + "col": 28, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10551, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10607, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368e168", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8polarityEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::polarity (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "inner": [ + { + "id": "0x2f5c750", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "decl": { + "id": "0x2f5c6b0", + "kind": "EnumDecl", + "name": "polarity" + } + } + ] + }, + { + "id": "0x368de30", + "kind": "ParmVarDecl", + "loc": { + "offset": 10606, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10587, + "col": 37, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10606, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368e408", + "kind": "FunctionDecl", + "loc": { + "offset": 10632, + "file": "../include/sls/ToString.h", + "line": 319, + "col": 22, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10611, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10661, + "col": 51, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368e608", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIjEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "uint32_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "unsigned int" + }, + "inner": [ + { + "id": "0x230bbd0", + "kind": "BuiltinType", + "type": { + "qualType": "unsigned int" + } + } + ] + }, + { + "id": "0x368e310", + "kind": "ParmVarDecl", + "loc": { + "offset": 10660, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10641, + "col": 31, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10660, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368e8a8", + "kind": "FunctionDecl", + "loc": { + "offset": 10685, + "file": "../include/sls/ToString.h", + "line": 320, + "col": 22, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10664, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10714, + "col": 51, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368eaa8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToImEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "uint64_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "unsigned long" + }, + "inner": [ + { + "id": "0x230bbf0", + "kind": "BuiltinType", + "type": { + "qualType": "unsigned long" + } + } + ] + }, + { + "id": "0x368e7b0", + "kind": "ParmVarDecl", + "loc": { + "offset": 10713, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10694, + "col": 31, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10713, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368ed50", + "kind": "FunctionDecl", + "loc": { + "offset": 10733, + "file": "../include/sls/ToString.h", + "line": 321, + "col": 17, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10717, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10762, + "col": 46, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368ef58", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIiEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "int (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "int" + }, + "inner": [ + { + "id": "0x230bb30", + "kind": "BuiltinType", + "type": { + "qualType": "int" + } + } + ] + }, + { + "id": "0x368ec50", + "kind": "ParmVarDecl", + "loc": { + "offset": 10761, + "col": 45, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10742, + "col": 26, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10761, + "col": 45, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368f1c8", + "kind": "FunctionDecl", + "loc": { + "offset": 10782, + "file": "../include/sls/ToString.h", + "line": 322, + "col": 18, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10765, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10811, + "col": 47, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368f3c8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIbEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "bool (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "bool" + }, + "inner": [ + { + "id": "0x230bab0", + "kind": "BuiltinType", + "type": { + "qualType": "bool" + } + } + ] + }, + { + "id": "0x368f100", + "kind": "ParmVarDecl", + "loc": { + "offset": 10810, + "col": 46, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10791, + "col": 27, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10810, + "col": 46, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x368f668", + "kind": "FunctionDecl", + "loc": { + "offset": 10834, + "file": "../include/sls/ToString.h", + "line": 323, + "col": 21, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10814, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10863, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368f868", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIlEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "int64_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "long" + }, + "inner": [ + { + "id": "0x230bb50", + "kind": "BuiltinType", + "type": { + "qualType": "long" + } + } + ] + }, + { + "id": "0x368f570", + "kind": "ParmVarDecl", + "loc": { + "offset": 10862, + "col": 49, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10843, + "col": 30, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10862, + "col": 49, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +} +{ + "id": "0x3690758", + "kind": "FunctionTemplateDecl", + "loc": { + "offset": 11100, + "file": "../include/sls/ToString.h", + "line": 333, + "col": 16, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11063, + "line": 332, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11310, + "line": 339, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "inner": [ + { + "id": "0x3690160", + "kind": "TemplateTypeParmDecl", + "loc": { + "offset": 11082, + "line": 332, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11073, + "col": 11, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11082, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "T", + "tagUsed": "typename", + "depth": 0, + "index": 0 + }, + { + "id": "0x36906b8", + "kind": "FunctionDecl", + "loc": { + "offset": 11100, + "line": 333, + "col": 16, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11085, + "col": 1, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11310, + "line": 339, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "type": { + "qualType": "std::vector (const std::vector &)" + }, + "inner": [ + { + "id": "0x36905a0", + "kind": "ParmVarDecl", + "loc": { + "offset": 11141, + "line": 333, + "col": 57, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11109, + "col": 25, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11141, + "col": 57, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "strings", + "type": { + "qualType": "const std::vector &" + } + }, + { + "id": "0x36bd368", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 11150, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11310, + "line": 339, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3690a40", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11156, + "line": 334, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11177, + "col": 26, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36909d8", + "kind": "VarDecl", + "loc": { + "offset": 11171, + "col": 20, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11156, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11171, + "col": 20, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "result", + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + }, + "nrvo": true + } + ] + }, + { + "id": "0x36b69a8", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 11183, + "line": 335, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11212, + "col": 34, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3690a78", + "kind": "CXXDependentScopeMemberExpr", + "range": { + "begin": { + "offset": 11183, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11190, + "col": 12, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "isArrow": false, + "member": "reserve", + "inner": [ + { + "id": "0x3690a58", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11183, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11183, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36909d8", + "kind": "VarDecl", + "name": "result", + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + } + } + } + ] + }, + { + "id": "0x36b6490", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 11198, + "col": 20, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11211, + "col": 33, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::vector::size_type", + "typeAliasDeclId": "0x29007b8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36b6460", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 11198, + "col": 20, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11206, + "col": 28, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "size", + "isArrow": false, + "referencedMemberDecl": "0x36a9e90", + "inner": [ + { + "id": "0x3690ac0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11198, + "col": 20, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11198, + "col": 20, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::vector>", + "qualType": "const std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36905a0", + "kind": "ParmVarDecl", + "name": "strings", + "type": { + "qualType": "const std::vector &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x36bd140", + "kind": "CXXForRangeStmt", + "range": { + "begin": { + "offset": 11219, + "line": 336, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11288, + "line": 337, + "col": 40, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + {}, + { + "id": "0x36b6d50", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11240, + "line": 336, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36b6b50", + "kind": "VarDecl", + "loc": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isImplicit": true, + "isReferenced": true, + "name": "__range2", + "type": { + "qualType": "const std::vector &" + }, + "init": "c", + "inner": [ + { + "id": "0x36b69d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::vector>", + "qualType": "const std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36905a0", + "kind": "ParmVarDecl", + "name": "strings", + "type": { + "qualType": "const std::vector &" + } + } + } + ] + } + ] + }, + { + "id": "0x36bb028", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36b6de8", + "kind": "VarDecl", + "loc": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isImplicit": true, + "isReferenced": true, + "name": "__begin2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "init": "c", + "inner": [ + { + "id": "0x36babf8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36babc8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (__gnu_cxx::__normal_iterator *, std::vector>> &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x36ba968", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x36b6f88", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36b6f58", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "begin", + "isArrow": false, + "referencedMemberDecl": "0x36a9440", + "inner": [ + { + "id": "0x36b6d68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::vector>", + "qualType": "const std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6b50", + "kind": "VarDecl", + "name": "__range2", + "type": { + "qualType": "const std::vector &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36bb040", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36b6e90", + "kind": "VarDecl", + "loc": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isImplicit": true, + "isReferenced": true, + "name": "__end2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "init": "c", + "inner": [ + { + "id": "0x36bb010", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36bafe0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (__gnu_cxx::__normal_iterator *, std::vector>> &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x36bafc8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x36baca0", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36bac70", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "end", + "isArrow": false, + "referencedMemberDecl": "0x36a9600", + "inner": [ + { + "id": "0x36b6d88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::vector>", + "qualType": "const std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6b50", + "kind": "VarDecl", + "name": "__range2", + "type": { + "qualType": "const std::vector &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36bcd60", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x36bcd48", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const __normal_iterator *, std::vector>> &, const __normal_iterator *, std::vector>> &) noexcept" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36bccd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const __normal_iterator *, std::vector>> &, const __normal_iterator *, std::vector>> &) noexcept" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36bb9d0", + "kind": "FunctionDecl", + "name": "operator!=", + "type": { + "qualType": "bool (const __normal_iterator *, std::vector>> &, const __normal_iterator *, std::vector>> &) noexcept" + } + } + } + ] + }, + { + "id": "0x36bcca0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const __gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "const __normal_iterator *, std::vector>>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x36bb058", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6de8", + "kind": "VarDecl", + "name": "__begin2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + } + } + } + ] + }, + { + "id": "0x36bccb8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const __gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "const __normal_iterator *, std::vector>>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x36bb078", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6e90", + "kind": "VarDecl", + "name": "__end2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + } + } + } + ] + } + ] + }, + { + "id": "0x36bce50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>>" + }, + "valueCategory": "lvalue", + "inner": [ + { + "id": "0x36bce38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>> &(*)() noexcept" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36bcdb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>> &() noexcept" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b8d20", + "kind": "CXXMethodDecl", + "name": "operator++", + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>> &() noexcept" + } + } + } + ] + }, + { + "id": "0x36bcd98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6de8", + "kind": "VarDecl", + "name": "__begin2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + } + } + } + ] + }, + { + "id": "0x36b6ac8", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11224, + "col": 10, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11247, + "col": 33, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36b6a60", + "kind": "VarDecl", + "loc": { + "offset": 11236, + "col": 22, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11224, + "col": 10, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "s", + "type": { + "qualType": "std::basic_string const &" + }, + "init": "c", + "inner": [ + { + "id": "0x36bcf70", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::basic_string" + }, + "valueCategory": "lvalue", + "inner": [ + { + "id": "0x36bcf58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>>::reference (*)() const noexcept" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36bcee0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>>::reference () const noexcept" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b8aa0", + "kind": "CXXMethodDecl", + "name": "operator*", + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>>::reference () const noexcept" + } + } + } + ] + }, + { + "id": "0x36bcec8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const __gnu_cxx::__normal_iterator *, std::vector>>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x36bce80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6de8", + "kind": "VarDecl", + "name": "__begin2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + } + } + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36bd308", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 11257, + "line": 337, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11288, + "col": 40, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36bd1c0", + "kind": "CXXDependentScopeMemberExpr", + "range": { + "begin": { + "offset": 11257, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11264, + "col": 16, + "tokLen": 9, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "isArrow": false, + "member": "push_back", + "inner": [ + { + "id": "0x36bd1a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11257, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11257, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36909d8", + "kind": "VarDecl", + "name": "result", + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + } + } + } + ] + }, + { + "id": "0x36bd2e0", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 11274, + "col": 26, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11287, + "col": 39, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36bd238", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 11274, + "col": 26, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11284, + "col": 36, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "StringTo", + "lookups": [ + { + "id": "0x3690758", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + }, + { + "id": "0x3687908", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + }, + { + "id": "0x3654da8", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + } + ] + }, + { + "id": "0x36bd2c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11286, + "col": 38, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11286, + "col": 38, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "std::basic_string const" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6a60", + "kind": "VarDecl", + "name": "s", + "type": { + "qualType": "std::basic_string const &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x36bd350", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 11295, + "line": 338, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11302, + "col": 12, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36bd330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11302, + "col": 12, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11302, + "col": 12, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36909d8", + "kind": "VarDecl", + "name": "result", + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + } + } + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x3849458", + "kind": "FunctionDecl", + "loc": { + "offset": 20783, + "file": "ToString.cpp", + "line": 665, + "col": 32, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 20752, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 21262, + "line": 681, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3688208", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs12detectorTypeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::detectorType (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "inner": [ + { + "id": "0x2f41f40", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "decl": { + "id": "0x2f41ea0", + "kind": "EnumDecl", + "name": "detectorType" + } + } + ] + }, + { + "id": "0x3849388", + "kind": "ParmVarDecl", + "loc": { + "offset": 20811, + "line": 665, + "col": 60, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 20792, + "col": 41, + "tokLen": 5 + }, + "end": { + "offset": 20811, + "col": 60, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3850148", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 20814, + "col": 63, + "tokLen": 1 + }, + "end": { + "offset": 21262, + "line": 681, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x384a460", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 20820, + "line": 666, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 20859, + "line": 667, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x384a3b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 20824, + "line": 666, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20829, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384a398", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20826, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20826, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384a378", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20826, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20826, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3849610", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20824, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20824, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384a360", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20829, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 20829, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3849630", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 20829, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 20829, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"Eiger\"" + } + ] + } + ] + }, + { + "id": "0x384a450", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 20846, + "line": 667, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 20859, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x384a420", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20853, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 20859, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f41fb0", + "kind": "EnumConstantDecl", + "name": "EIGER", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384b2d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 20870, + "line": 668, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 20912, + "line": 669, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x384b220", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 20874, + "line": 668, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20879, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384b208", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20876, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20876, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384b1e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20876, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20876, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384a480", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20874, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20874, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384b1d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20879, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 20879, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384a4a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 20879, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 20879, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"Gotthard\"" + } + ] + } + ] + }, + { + "id": "0x384b2c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 20899, + "line": 669, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 20912, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x384b290", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20906, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 20912, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f42000", + "kind": "EnumConstantDecl", + "name": "GOTTHARD", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384c140", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 20926, + "line": 670, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 20968, + "line": 671, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x384c090", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 20930, + "line": 670, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384c078", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20932, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20932, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384c058", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20932, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20932, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384b2f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20930, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20930, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384c040", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20935, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 20935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384b310", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 20935, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 20935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"Jungfrau\"" + } + ] + } + ] + }, + { + "id": "0x384c130", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 20955, + "line": 671, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 20968, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x384c100", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20962, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 20968, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f42050", + "kind": "EnumConstantDecl", + "name": "JUNGFRAU", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384cfc0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 20982, + "line": 672, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21029, + "line": 673, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x384cf10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 20986, + "line": 672, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20991, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384cef8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20988, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20988, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384ced8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20988, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20988, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384c160", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20986, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20986, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384cec0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20991, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 20991, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384c180", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 20991, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 20991, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"ChipTestBoard\"" + } + ] + } + ] + }, + { + "id": "0x384cfb0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21016, + "line": 673, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21029, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x384cf80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21023, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21029, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f420a0", + "kind": "EnumConstantDecl", + "name": "CHIPTESTBOARD", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384de30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21048, + "line": 674, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21088, + "line": 675, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x384dd80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21052, + "line": 674, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21057, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384dd68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21054, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21054, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384dd48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21054, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21054, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384cfe0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21052, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21052, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384dd30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21057, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 21057, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384d000", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21057, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 21057, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"Moench\"" + } + ] + } + ] + }, + { + "id": "0x384de20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21075, + "line": 675, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21088, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x384ddf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21082, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21088, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f420f0", + "kind": "EnumConstantDecl", + "name": "MOENCH", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384eca0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21100, + "line": 676, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21141, + "line": 677, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x384ebf0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21104, + "line": 676, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21109, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384ebd8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21106, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21106, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384ebb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21106, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21106, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384de50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21104, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21104, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384eba0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21109, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 21109, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384de70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21109, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 21109, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"Mythen3\"" + } + ] + } + ] + }, + { + "id": "0x384ec90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21128, + "line": 677, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21141, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x384ec60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21135, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21141, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f42140", + "kind": "EnumConstantDecl", + "name": "MYTHEN3", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384fb20", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21154, + "line": 678, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21197, + "line": 679, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x384fa70", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21158, + "line": 678, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21163, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384fa58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21160, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21160, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384fa38", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21160, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21160, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384ecc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21158, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21158, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384fa20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21163, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 21163, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384ece0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21163, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 21163, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"Gotthard2\"" + } + ] + } + ] + }, + { + "id": "0x384fb10", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21184, + "line": 679, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21197, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x384fae0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21191, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21197, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f42190", + "kind": "EnumConstantDecl", + "name": "GOTTHARD2", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x3850130", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 21212, + "line": 680, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3850118", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 21212, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38500e8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38500d0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38500a8", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3850088", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3850080", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3850050", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3850038", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x3850020", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3850000", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x384fff8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x384ffc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384ffa8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21256, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 21256, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384ff88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21256, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 21256, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x384ff70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21231, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384fb50", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21231, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char[23]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown detector type \"" + } + ] + }, + { + "id": "0x384fb80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21258, + "col": 51, + "tokLen": 1 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x3850318", + "kind": "FunctionDecl", + "loc": { + "offset": 21300, + "file": "ToString.cpp", + "line": 683, + "col": 36, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 21265, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 22549, + "line": 725, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3688728", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs16detectorSettingsEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::detectorSettings (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "inner": [ + { + "id": "0x2f5a2c0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "decl": { + "id": "0x2f5a218", + "kind": "EnumDecl", + "name": "detectorSettings" + } + } + ] + }, + { + "id": "0x3850240", + "kind": "ParmVarDecl", + "loc": { + "offset": 21328, + "line": 683, + "col": 64, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 21309, + "col": 45, + "tokLen": 5 + }, + "end": { + "offset": 21328, + "col": 64, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3866820", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 21331, + "col": 67, + "tokLen": 1 + }, + "end": { + "offset": 22549, + "line": 725, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3851320", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21337, + "line": 684, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21379, + "line": 685, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x3851270", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21341, + "line": 684, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21346, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3851258", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21343, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21343, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3851238", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21343, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21343, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38504d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21341, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21341, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3851220", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21346, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21346, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38504f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21346, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21346, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"standard\"" + } + ] + } + ] + }, + { + "id": "0x3851310", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21366, + "line": 685, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21379, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38512e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21373, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21379, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a2e0", + "kind": "EnumConstantDecl", + "name": "STANDARD", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3855dc0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21393, + "line": 686, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21431, + "line": 687, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x3855d10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21397, + "line": 686, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21402, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3855cf8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21399, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21399, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3855cd8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21399, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21399, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3851340", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21397, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21397, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3855cc0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21402, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 21402, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3851360", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21402, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 21402, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"fast\"" + } + ] + } + ] + }, + { + "id": "0x3855db0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21418, + "line": 687, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21431, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x3855d80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21425, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21431, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a330", + "kind": "EnumConstantDecl", + "name": "FAST", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3856c30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21441, + "line": 688, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21483, + "line": 689, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x3856b80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21445, + "line": 688, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21450, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3856b68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21447, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21447, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3856b48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21447, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21447, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3855de0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21445, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21445, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3856b30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21450, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21450, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3855e00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21450, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21450, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"highgain\"" + } + ] + } + ] + }, + { + "id": "0x3856c20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21470, + "line": 689, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21483, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x3856bf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21477, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21483, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a380", + "kind": "EnumConstantDecl", + "name": "HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3857ab0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21497, + "line": 690, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21542, + "line": 691, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x3857a00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21501, + "line": 690, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21506, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38579e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21503, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21503, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38579c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21503, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21503, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3856c50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21501, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21501, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38579b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21506, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 21506, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3856c70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21506, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 21506, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"dynamicgain\"" + } + ] + } + ] + }, + { + "id": "0x3857aa0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21529, + "line": 691, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21542, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x3857a70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21536, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21542, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a3d0", + "kind": "EnumConstantDecl", + "name": "DYNAMICGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3858920", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21559, + "line": 692, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21600, + "line": 693, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x3858870", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21563, + "line": 692, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3858858", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21565, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21565, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3858838", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21565, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21565, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3857ad0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21563, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21563, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3858820", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21568, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 21568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3857af0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21568, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 21568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"lowgain\"" + } + ] + } + ] + }, + { + "id": "0x3858910", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21587, + "line": 693, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21600, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38588e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21594, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21600, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a420", + "kind": "EnumConstantDecl", + "name": "LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x38597a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21613, + "line": 694, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21657, + "line": 695, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38596f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21617, + "line": 694, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21622, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38596d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21619, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21619, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38596b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21619, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21619, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3858940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21617, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21617, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38596a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21622, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 21622, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3858960", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21622, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 21622, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"mediumgain\"" + } + ] + } + ] + }, + { + "id": "0x3859790", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21644, + "line": 695, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21657, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3859760", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21651, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21657, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a470", + "kind": "EnumConstantDecl", + "name": "MEDIUMGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385a620", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21673, + "line": 696, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21719, + "line": 697, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x385a570", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21677, + "line": 696, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21682, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385a558", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21679, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21679, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385a538", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21679, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21679, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38597c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21677, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21677, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385a520", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21682, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 21682, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38597e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21682, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 21682, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"veryhighgain\"" + } + ] + } + ] + }, + { + "id": "0x385a610", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21706, + "line": 697, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21719, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x385a5e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21713, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21719, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a4c0", + "kind": "EnumConstantDecl", + "name": "VERYHIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385b4a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21737, + "line": 698, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21780, + "line": 699, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x385b3f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21741, + "line": 698, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21746, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385b3d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21743, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21743, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385b3b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21743, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21743, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385a640", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21741, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21741, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385b3a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21746, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 21746, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385a660", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21746, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 21746, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"highgain0\"" + } + ] + } + ] + }, + { + "id": "0x385b490", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21767, + "line": 699, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21780, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x385b460", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21774, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21780, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a510", + "kind": "EnumConstantDecl", + "name": "HIGHGAIN0", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385c310", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21795, + "line": 700, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21837, + "line": 701, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x385c260", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21799, + "line": 700, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21804, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385c248", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21801, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21801, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385c228", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21801, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21801, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385b4c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21799, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21799, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385c210", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21804, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21804, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385b4e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21804, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21804, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"fixgain1\"" + } + ] + } + ] + }, + { + "id": "0x385c300", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21824, + "line": 701, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21837, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x385c2d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21831, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21837, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a560", + "kind": "EnumConstantDecl", + "name": "FIXGAIN1", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385d180", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21851, + "line": 702, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21893, + "line": 703, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x385d0d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21855, + "line": 702, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21860, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385d0b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21857, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21857, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385d098", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21857, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21857, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385c330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21855, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21855, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385d080", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21860, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21860, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385c350", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21860, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21860, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"fixgain2\"" + } + ] + } + ] + }, + { + "id": "0x385d170", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21880, + "line": 703, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21893, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x385d140", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21887, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21893, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a5b0", + "kind": "EnumConstantDecl", + "name": "FIXGAIN2", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385e000", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21907, + "line": 704, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21952, + "line": 705, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x385df50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21911, + "line": 704, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21916, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385df38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21913, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21913, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385df18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21913, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21913, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385d1a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21911, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21911, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385df00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21916, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 21916, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385d1c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21916, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 21916, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"verylowgain\"" + } + ] + } + ] + }, + { + "id": "0x385dff0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21939, + "line": 705, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21952, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x385dfc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21946, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21952, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a600", + "kind": "EnumConstantDecl", + "name": "VERYLOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385ee70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21969, + "line": 706, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22008, + "line": 707, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x385edc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21973, + "line": 706, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21978, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385eda8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21975, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21975, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385ed88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21975, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21975, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385e020", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21973, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21973, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385ed70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21978, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 21978, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385e040", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21978, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 21978, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"g1_hg\"" + } + ] + } + ] + }, + { + "id": "0x385ee60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21995, + "line": 707, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22008, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x385ee30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22002, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22008, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a650", + "kind": "EnumConstantDecl", + "name": "G1_HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385fce0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22025, + "line": 708, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22064, + "line": 709, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x385fc30", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22029, + "line": 708, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22034, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385fc18", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22031, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22031, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385fbf8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22031, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22031, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385ee90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22029, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22029, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385fbe0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22034, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22034, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385eeb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22034, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22034, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"g1_lg\"" + } + ] + } + ] + }, + { + "id": "0x385fcd0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22051, + "line": 709, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22064, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x385fca0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22058, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22064, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a6a0", + "kind": "EnumConstantDecl", + "name": "G1_LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3860b50", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22080, + "line": 710, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22122, + "line": 711, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x3860aa0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22084, + "line": 710, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22089, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3860a88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22086, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22086, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3860a68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22086, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22086, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385fd00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22084, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22084, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3860a50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22089, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22089, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385fd20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22089, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22089, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"g2_hc_hg\"" + } + ] + } + ] + }, + { + "id": "0x3860b40", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22109, + "line": 711, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22122, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x3860b10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22116, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22122, + "col": 22, + "tokLen": 19 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a6f0", + "kind": "EnumConstantDecl", + "name": "G2_HIGHCAP_HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x38619c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22147, + "line": 712, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22189, + "line": 713, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x3861910", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22151, + "line": 712, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22156, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38618f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22153, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22153, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38618d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22153, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22153, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3860b70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22151, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22151, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38618c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22156, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22156, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3860b90", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22156, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22156, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"g2_hc_lg\"" + } + ] + } + ] + }, + { + "id": "0x38619b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22176, + "line": 713, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22189, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x3861980", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22183, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22189, + "col": 22, + "tokLen": 18 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a740", + "kind": "EnumConstantDecl", + "name": "G2_HIGHCAP_LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3862830", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22213, + "line": 714, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22255, + "line": 715, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x3862780", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22217, + "line": 714, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22222, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3862768", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22219, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22219, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3862748", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22219, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22219, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38619e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22217, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22217, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3862730", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22222, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22222, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3861a00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22222, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22222, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"g2_lc_hg\"" + } + ] + } + ] + }, + { + "id": "0x3862820", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22242, + "line": 715, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22255, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x38627f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22249, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22255, + "col": 22, + "tokLen": 18 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a790", + "kind": "EnumConstantDecl", + "name": "G2_LOWCAP_HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x38636a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22279, + "line": 716, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22321, + "line": 717, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x38635f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22283, + "line": 716, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22288, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38635d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22285, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22285, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38635b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22285, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22285, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3862850", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22283, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22283, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38635a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22288, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22288, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3862870", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22288, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22288, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"g2_lc_lg\"" + } + ] + } + ] + }, + { + "id": "0x3863690", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22308, + "line": 717, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22321, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x3863660", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22315, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22321, + "col": 22, + "tokLen": 17 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a7e0", + "kind": "EnumConstantDecl", + "name": "G2_LOWCAP_LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3864510", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22344, + "line": 718, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22383, + "line": 719, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x3864460", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22348, + "line": 718, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22353, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3864448", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22350, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22350, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3864428", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22350, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22350, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38636c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22348, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22348, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3864410", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22353, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22353, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38636e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22353, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22353, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"g4_hg\"" + } + ] + } + ] + }, + { + "id": "0x3864500", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22370, + "line": 719, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22383, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38644d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22377, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22383, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a830", + "kind": "EnumConstantDecl", + "name": "G4_HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3865390", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22400, + "line": 720, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22439, + "line": 721, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38652e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22404, + "line": 720, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22409, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38652c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22406, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22406, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38652a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22406, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22406, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3864530", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22404, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22404, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3865290", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22409, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22409, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3864550", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22409, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22409, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"gain0\"" + } + ] + } + ] + }, + { + "id": "0x3865380", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22426, + "line": 721, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22439, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3865350", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22433, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22439, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a8d0", + "kind": "EnumConstantDecl", + "name": "GAIN0", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3866200", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22450, + "line": 722, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22489, + "line": 723, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3866150", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22454, + "line": 722, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22459, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3866138", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22456, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22456, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3866118", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22456, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22456, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38653b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22454, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22454, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3866100", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22459, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22459, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38653d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22459, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22459, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"g4_lg\"" + } + ] + } + ] + }, + { + "id": "0x38661f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22476, + "line": 723, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22489, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38661c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22483, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22489, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a880", + "kind": "EnumConstantDecl", + "name": "G4_LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3866808", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 22505, + "line": 724, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38667f0", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 22505, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38667c0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38667a8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3866780", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3866760", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3866758", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3866728", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3866710", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38666f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38666d8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38666d0", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3866698", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3866680", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22543, + "col": 43, + "tokLen": 1 + }, + "end": { + "offset": 22543, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3866660", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22543, + "col": 43, + "tokLen": 1 + }, + "end": { + "offset": 22543, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x3866648", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22524, + "col": 24, + "tokLen": 18 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3866230", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22524, + "col": 24, + "tokLen": 18 + } + }, + "type": { + "qualType": "const char[17]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown setting \"" + } + ] + }, + { + "id": "0x3866258", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22545, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x3866a58", + "kind": "FunctionDecl", + "loc": { + "offset": 22581, + "file": "ToString.cpp", + "line": 727, + "col": 30, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 22552, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 23106, + "line": 745, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3688c48", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10speedLevelEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::speedLevel (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "inner": [ + { + "id": "0x2f5af70", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "decl": { + "id": "0x2f5aec8", + "kind": "EnumDecl", + "name": "speedLevel" + } + } + ] + }, + { + "id": "0x3866980", + "kind": "ParmVarDecl", + "loc": { + "offset": 22609, + "line": 727, + "col": 58, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 22590, + "col": 39, + "tokLen": 5 + }, + "end": { + "offset": 22609, + "col": 58, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x386e5c0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 22612, + "col": 61, + "tokLen": 1 + }, + "end": { + "offset": 23106, + "line": 745, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3867a70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22618, + "line": 728, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22662, + "line": 729, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38679c0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22622, + "line": 728, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22627, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38679a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22624, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22624, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3867988", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22624, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22624, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3866c10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22622, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22622, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3867970", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22627, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 22627, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3866c30", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22627, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 22627, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"full_speed\"" + } + ] + } + ] + }, + { + "id": "0x3867a60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22649, + "line": 729, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22662, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3867a30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22656, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22662, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5af90", + "kind": "EnumConstantDecl", + "name": "FULL_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x38688e0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22678, + "line": 730, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22713, + "line": 731, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3868830", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22682, + "line": 730, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22687, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3868818", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22684, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22684, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38687f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22684, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22684, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3867a90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22682, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22682, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38687e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22687, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22687, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3867ab0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22687, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22687, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"0\"" + } + ] + } + ] + }, + { + "id": "0x38688d0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22700, + "line": 731, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22713, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38688a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22707, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22713, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5af90", + "kind": "EnumConstantDecl", + "name": "FULL_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x3869760", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22729, + "line": 732, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22773, + "line": 733, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38696b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22733, + "line": 732, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22738, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3869698", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22735, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22735, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3869678", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22735, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22735, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3868900", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22733, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22733, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3869660", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22738, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 22738, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3868920", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22738, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 22738, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"half_speed\"" + } + ] + } + ] + }, + { + "id": "0x3869750", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22760, + "line": 733, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22773, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3869720", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22767, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22773, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5afe0", + "kind": "EnumConstantDecl", + "name": "HALF_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386a5d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22789, + "line": 734, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22824, + "line": 735, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x386a520", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22793, + "line": 734, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22798, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386a508", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22795, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22795, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386a4e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22795, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22795, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3869780", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22793, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22793, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386a4d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22798, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22798, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38697a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22798, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22798, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"1\"" + } + ] + } + ] + }, + { + "id": "0x386a5c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22811, + "line": 735, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22824, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x386a590", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22818, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22824, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5afe0", + "kind": "EnumConstantDecl", + "name": "HALF_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386b450", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22840, + "line": 736, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22887, + "line": 737, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x386b3a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22844, + "line": 736, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22849, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386b388", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22846, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22846, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386b368", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22846, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22846, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386a5f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22844, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22844, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386b350", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22849, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 22849, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386a610", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22849, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 22849, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"quarter_speed\"" + } + ] + } + ] + }, + { + "id": "0x386b440", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22874, + "line": 737, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22887, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x386b410", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22881, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22887, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b030", + "kind": "EnumConstantDecl", + "name": "QUARTER_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386c2c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22906, + "line": 738, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22941, + "line": 739, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x386c210", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22910, + "line": 738, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22915, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386c1f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22912, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22912, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386c1d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22912, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22912, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386b470", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22910, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22910, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386c1c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22915, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22915, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386b490", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22915, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22915, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"2\"" + } + ] + } + ] + }, + { + "id": "0x386c2b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22928, + "line": 739, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22941, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x386c280", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22935, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22941, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b030", + "kind": "EnumConstantDecl", + "name": "QUARTER_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386d130", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22960, + "line": 740, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22997, + "line": 741, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x386d080", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22964, + "line": 740, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22969, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386d068", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22966, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22966, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386d048", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22966, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22966, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386c2e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22964, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22964, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386d030", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22969, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 22969, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386c300", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22969, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 22969, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"108\"" + } + ] + } + ] + }, + { + "id": "0x386d120", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22984, + "line": 741, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22997, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x386d0f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22991, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22997, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b080", + "kind": "EnumConstantDecl", + "name": "G2_108MHZ", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386dfa0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23012, + "line": 742, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23049, + "line": 743, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x386def0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23016, + "line": 742, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23021, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386ded8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23018, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23018, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386deb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23018, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23018, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386d150", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23016, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23016, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386dea0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23021, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 23021, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386d170", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23021, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 23021, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"144\"" + } + ] + } + ] + }, + { + "id": "0x386df90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23036, + "line": 743, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23049, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x386df60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23043, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23049, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b0d0", + "kind": "EnumConstantDecl", + "name": "G2_144MHZ", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386e5a8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 23064, + "line": 744, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x386e590", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 23064, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x386e560", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x386e548", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x386e520", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x386e500", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x386e4f8", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x386e4c8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x386e4b0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x386e498", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x386e478", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x386e470", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x386e438", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386e420", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23100, + "col": 41, + "tokLen": 1 + }, + "end": { + "offset": 23100, + "col": 41, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386e400", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23100, + "col": 41, + "tokLen": 1 + }, + "end": { + "offset": 23100, + "col": 41, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x386e3e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23083, + "col": 24, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386dfd0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23083, + "col": 24, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown speed \"" + } + ] + }, + { + "id": "0x386dff8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23102, + "col": 43, + "tokLen": 1 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x386e798", + "kind": "FunctionDecl", + "loc": { + "offset": 23138, + "file": "ToString.cpp", + "line": 747, + "col": 30, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 23109, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 23525, + "line": 759, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3689168", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10timingModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::timingMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "inner": [ + { + "id": "0x2f57730", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "decl": { + "id": "0x2f57688", + "kind": "EnumDecl", + "name": "timingMode" + } + } + ] + }, + { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "loc": { + "offset": 23166, + "line": 747, + "col": 58, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 23147, + "col": 39, + "tokLen": 5 + }, + "end": { + "offset": 23166, + "col": 58, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38737a8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 23169, + "col": 61, + "tokLen": 1 + }, + "end": { + "offset": 23525, + "line": 759, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x386f7a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23175, + "line": 748, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23213, + "line": 749, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x386f6f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23179, + "line": 748, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23184, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386f6d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23181, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23181, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386f6b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23181, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23181, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386e950", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23179, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23179, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386f6a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23184, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 23184, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386e970", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23184, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 23184, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"auto\"" + } + ] + } + ] + }, + { + "id": "0x386f790", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23200, + "line": 749, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23213, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x386f760", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23207, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23213, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57750", + "kind": "EnumConstantDecl", + "name": "AUTO_TIMING", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3870610", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23230, + "line": 750, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23271, + "line": 751, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x3870560", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23234, + "line": 750, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23239, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3870548", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23236, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23236, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3870528", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23236, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23236, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386f7c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23234, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23234, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3870510", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23239, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 23239, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386f7e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23239, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 23239, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"trigger\"" + } + ] + } + ] + }, + { + "id": "0x3870600", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23258, + "line": 751, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23271, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x38705d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23265, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23271, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f577a0", + "kind": "EnumConstantDecl", + "name": "TRIGGER_EXPOSURE", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3871480", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23293, + "line": 752, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23333, + "line": 753, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38713d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23297, + "line": 752, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23302, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38713b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23299, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23299, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3871398", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23299, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23299, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3870630", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23297, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23297, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3871380", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23302, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 23302, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3870650", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23302, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 23302, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"gating\"" + } + ] + } + ] + }, + { + "id": "0x3871470", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23320, + "line": 753, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23333, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3871440", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23327, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23333, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f577f0", + "kind": "EnumConstantDecl", + "name": "GATED", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3872300", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23344, + "line": 754, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23391, + "line": 755, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x3872250", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23348, + "line": 754, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23353, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3872238", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23350, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23350, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3872218", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23350, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23350, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38714a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23348, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23348, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3872200", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23353, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 23353, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38714c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23353, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 23353, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"burst_trigger\"" + } + ] + } + ] + }, + { + "id": "0x38722f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23378, + "line": 755, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23391, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x38722c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23385, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23391, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57840", + "kind": "EnumConstantDecl", + "name": "BURST_TRIGGER", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3873180", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23410, + "line": 756, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23458, + "line": 757, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x38730d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23414, + "line": 756, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23419, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38730b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23416, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23416, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3873098", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23416, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23416, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3872320", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23414, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23414, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3873080", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23419, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 23419, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3872340", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23419, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 23419, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"trigger_gating\"" + } + ] + } + ] + }, + { + "id": "0x3873170", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23445, + "line": 757, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23458, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x3873140", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23452, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23458, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57890", + "kind": "EnumConstantDecl", + "name": "TRIGGER_GATED", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3873790", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 23477, + "line": 758, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3873778", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 23477, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3873748", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3873730", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3873708", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38736e8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38736e0", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38736b0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3873698", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x3873680", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3873660", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x3873658", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3873620", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3873608", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23519, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 23519, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38735e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23519, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 23519, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38735d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23496, + "col": 24, + "tokLen": 22 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38731b0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23496, + "col": 24, + "tokLen": 22 + } + }, + "type": { + "qualType": "const char[21]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown timing mode \"" + } + ] + }, + { + "id": "0x38731e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23521, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x3873968", + "kind": "FunctionDecl", + "loc": { + "offset": 23565, + "file": "ToString.cpp", + "line": 761, + "col": 38, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 23528, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 23866, + "line": 769, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3689688", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18frameDiscardPolicyEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::frameDiscardPolicy (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "inner": [ + { + "id": "0x2f554b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "decl": { + "id": "0x2f55410", + "kind": "EnumDecl", + "name": "frameDiscardPolicy" + } + } + ] + }, + { + "id": "0x3873890", + "kind": "ParmVarDecl", + "loc": { + "offset": 23593, + "line": 761, + "col": 66, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 23574, + "col": 47, + "tokLen": 5 + }, + "end": { + "offset": 23593, + "col": 66, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3876cd0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 23596, + "col": 69, + "tokLen": 1 + }, + "end": { + "offset": 23866, + "line": 769, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3874980", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23602, + "line": 762, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23645, + "line": 763, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38748d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23606, + "line": 762, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23611, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38748b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23608, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23608, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3874898", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23608, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23608, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3873b20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23606, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23606, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3873890", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3874880", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23611, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 23611, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3873b40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23611, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 23611, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"nodiscard\"" + } + ] + } + ] + }, + { + "id": "0x3874970", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23632, + "line": 763, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23645, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3874940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23639, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23645, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f554d0", + "kind": "EnumConstantDecl", + "name": "NO_DISCARD", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + } + } + } + ] + } + ] + }, + { + "id": "0x3875820", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23661, + "line": 764, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23707, + "line": 765, + "col": 22, + "tokLen": 20 + } + }, + "inner": [ + { + "id": "0x3875770", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23665, + "line": 764, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23670, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3875758", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23667, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23667, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3875738", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23667, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23667, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38749a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23665, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23665, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3873890", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3875720", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23670, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 23670, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38749c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23670, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 23670, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"discardempty\"" + } + ] + } + ] + }, + { + "id": "0x3875810", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23694, + "line": 765, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23707, + "col": 22, + "tokLen": 20 + } + }, + "inner": [ + { + "id": "0x38757e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23701, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23707, + "col": 22, + "tokLen": 20 + } + }, + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f55520", + "kind": "EnumConstantDecl", + "name": "DISCARD_EMPTY_FRAMES", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + } + } + } + ] + } + ] + }, + { + "id": "0x38766a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23733, + "line": 766, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23781, + "line": 767, + "col": 22, + "tokLen": 22 + } + }, + "inner": [ + { + "id": "0x38765f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23737, + "line": 766, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23742, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38765d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23739, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23739, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38765b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23739, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23739, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3875840", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23737, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23737, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3873890", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38765a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23742, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 23742, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3875860", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23742, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 23742, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"discardpartial\"" + } + ] + } + ] + }, + { + "id": "0x3876690", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23768, + "line": 767, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23781, + "col": 22, + "tokLen": 22 + } + }, + "inner": [ + { + "id": "0x3876660", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23775, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23781, + "col": 22, + "tokLen": 22 + } + }, + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f55570", + "kind": "EnumConstantDecl", + "name": "DISCARD_PARTIAL_FRAMES", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + } + } + } + ] + } + ] + }, + { + "id": "0x3876cb8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 23809, + "line": 768, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3876ca0", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 23809, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3876c70", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3876c58", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3876c30", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3876c10", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3876c08", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3876bd8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3876bc0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x3876ba8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3876b88", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x3876b80", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3876b48", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3876b30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23860, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 23860, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3876b10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23860, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 23860, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x3876af8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23828, + "col": 24, + "tokLen": 31 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38766d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23828, + "col": 24, + "tokLen": 31 + } + }, + "type": { + "qualType": "const char[30]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown frame discard policy \"" + } + ] + }, + { + "id": "0x3876708", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23862, + "col": 58, + "tokLen": 1 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3873890", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x3876e78", + "kind": "FunctionDecl", + "loc": { + "offset": 23898, + "file": "ToString.cpp", + "line": 771, + "col": 30, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 23869, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 24083, + "line": 777, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3689ba8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10fileFormatEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::fileFormat (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "inner": [ + { + "id": "0x2f556b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "decl": { + "id": "0x2f55610", + "kind": "EnumDecl", + "name": "fileFormat" + } + } + ] + }, + { + "id": "0x3876da8", + "kind": "ParmVarDecl", + "loc": { + "offset": 23926, + "line": 771, + "col": 58, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 23907, + "col": 39, + "tokLen": 5 + }, + "end": { + "offset": 23926, + "col": 58, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3879318", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 23929, + "col": 61, + "tokLen": 1 + }, + "end": { + "offset": 24083, + "line": 777, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3877e80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23935, + "line": 772, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23973, + "line": 773, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x3877dd0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23939, + "line": 772, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23944, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3877db8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23941, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23941, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3877d98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23941, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23941, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3877030", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23939, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23939, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3876da8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3877d80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23944, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 23944, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3877050", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23944, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 23944, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"hdf5\"" + } + ] + } + ] + }, + { + "id": "0x3877e70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23960, + "line": 773, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23973, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x3877e40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23967, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23973, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f55720", + "kind": "EnumConstantDecl", + "name": "HDF5", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + } + } + } + ] + } + ] + }, + { + "id": "0x3878cf0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23983, + "line": 774, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24023, + "line": 775, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3878c40", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23987, + "line": 774, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23992, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3878c28", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23989, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23989, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3878c08", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23989, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23989, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3877ea0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23987, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23987, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3876da8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3878bf0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23992, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 23992, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3877ec0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23992, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 23992, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"binary\"" + } + ] + } + ] + }, + { + "id": "0x3878ce0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24010, + "line": 775, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24023, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3878cb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24017, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24023, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f556d0", + "kind": "EnumConstantDecl", + "name": "BINARY", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + } + } + } + ] + } + ] + }, + { + "id": "0x3879300", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 24035, + "line": 776, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38792e8", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 24035, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38792b8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38792a0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3879278", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3879258", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3879250", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3879220", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3879208", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38791f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38791d0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38791c8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3879190", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3879178", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24077, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 24077, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3879158", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24077, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 24077, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x3879140", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24054, + "col": 24, + "tokLen": 22 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3878d20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24054, + "col": 24, + "tokLen": 22 + } + }, + "type": { + "qualType": "const char[21]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown file format \"" + } + ] + }, + { + "id": "0x3878d50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24079, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3876da8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38794b8", + "kind": "FunctionDecl", + "loc": { + "offset": 24123, + "file": "ToString.cpp", + "line": 779, + "col": 38, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 24086, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 24517, + "line": 789, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368abf0", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18externalSignalFlagEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::externalSignalFlag (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "inner": [ + { + "id": "0x2f57500", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "decl": { + "id": "0x2f57458", + "kind": "EnumDecl", + "name": "externalSignalFlag" + } + } + ] + }, + { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "loc": { + "offset": 24151, + "line": 779, + "col": 66, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 24132, + "col": 47, + "tokLen": 5 + }, + "end": { + "offset": 24151, + "col": 66, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x387d680", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 24154, + "col": 69, + "tokLen": 1 + }, + "end": { + "offset": 24517, + "line": 789, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x387a4d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24160, + "line": 780, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24216, + "line": 781, + "col": 22, + "tokLen": 22 + } + }, + "inner": [ + { + "id": "0x387a420", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24164, + "line": 780, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24169, + "col": 14, + "tokLen": 24 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387a408", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24166, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24166, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387a3e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24166, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24166, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3879670", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24164, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24164, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387a3d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24169, + "col": 14, + "tokLen": 24 + }, + "end": { + "offset": 24169, + "col": 14, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3879690", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24169, + "col": 14, + "tokLen": 24 + }, + "end": { + "offset": 24169, + "col": 14, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char[23]" + }, + "valueCategory": "lvalue", + "value": "\"trigger_in_rising_edge\"" + } + ] + } + ] + }, + { + "id": "0x387a4c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24203, + "line": 781, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24216, + "col": 22, + "tokLen": 22 + } + }, + "inner": [ + { + "id": "0x387a490", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24210, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24216, + "col": 22, + "tokLen": 22 + } + }, + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57520", + "kind": "EnumConstantDecl", + "name": "TRIGGER_IN_RISING_EDGE", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + } + } + } + ] + } + ] + }, + { + "id": "0x387b350", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24244, + "line": 782, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24301, + "line": 783, + "col": 22, + "tokLen": 23 + } + }, + "inner": [ + { + "id": "0x387b2a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24248, + "line": 782, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24253, + "col": 14, + "tokLen": 25 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387b288", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24250, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24250, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387b268", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24250, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24250, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387a4f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24248, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24248, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387b250", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24253, + "col": 14, + "tokLen": 25 + }, + "end": { + "offset": 24253, + "col": 14, + "tokLen": 25 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387a510", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24253, + "col": 14, + "tokLen": 25 + }, + "end": { + "offset": 24253, + "col": 14, + "tokLen": 25 + } + }, + "type": { + "qualType": "const char[24]" + }, + "valueCategory": "lvalue", + "value": "\"trigger_in_falling_edge\"" + } + ] + } + ] + }, + { + "id": "0x387b340", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24288, + "line": 783, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24301, + "col": 22, + "tokLen": 23 + } + }, + "inner": [ + { + "id": "0x387b310", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24295, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24301, + "col": 22, + "tokLen": 23 + } + }, + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57570", + "kind": "EnumConstantDecl", + "name": "TRIGGER_IN_FALLING_EDGE", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + } + } + } + ] + } + ] + }, + { + "id": "0x387c1d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24330, + "line": 784, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24376, + "line": 785, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x387c120", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24334, + "line": 784, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24339, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387c108", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24336, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24336, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387c0e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24336, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24336, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387b370", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24334, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24334, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387c0d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24339, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 24339, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387b390", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24339, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 24339, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"inversion_on\"" + } + ] + } + ] + }, + { + "id": "0x387c1c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24363, + "line": 785, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24376, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x387c190", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24370, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24376, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f575c0", + "kind": "EnumConstantDecl", + "name": "INVERSION_ON", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + } + } + } + ] + } + ] + }, + { + "id": "0x387d050", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24394, + "line": 786, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24441, + "line": 787, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x387cfa0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24398, + "line": 786, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24403, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387cf88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24400, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24400, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387cf68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24400, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24400, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387c1f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24398, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24398, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387cf50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24403, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 24403, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387c210", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24403, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 24403, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"inversion_off\"" + } + ] + } + ] + }, + { + "id": "0x387d040", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24428, + "line": 787, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24441, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x387d010", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24435, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24441, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57610", + "kind": "EnumConstantDecl", + "name": "INVERSION_OFF", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + } + } + } + ] + } + ] + }, + { + "id": "0x387d668", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 24460, + "line": 788, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x387d650", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 24460, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x387d620", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x387d608", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x387d5e0", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x387d5c0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x387d5b8", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x387d588", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x387d570", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x387d558", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x387d538", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x387d530", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x387d4f8", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387d4e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24511, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 24511, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387d4c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24511, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 24511, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x387d4a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24479, + "col": 24, + "tokLen": 31 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387d080", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24479, + "col": 24, + "tokLen": 31 + } + }, + "type": { + "qualType": "const char[30]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown external signal flag \"" + } + ] + }, + { + "id": "0x387d0b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24513, + "col": 58, + "tokLen": 1 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x387d838", + "kind": "FunctionDecl", + "loc": { + "offset": 24550, + "file": "ToString.cpp", + "line": 791, + "col": 31, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 24520, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 24973, + "line": 803, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368b118", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs11readoutModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::readoutMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "inner": [ + { + "id": "0x2f5acf0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "decl": { + "id": "0x2f5ac48", + "kind": "EnumDecl", + "name": "readoutMode" + } + } + ] + }, + { + "id": "0x387d760", + "kind": "ParmVarDecl", + "loc": { + "offset": 24578, + "line": 791, + "col": 59, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 24559, + "col": 40, + "tokLen": 5 + }, + "end": { + "offset": 24578, + "col": 59, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3882858", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 24581, + "col": 62, + "tokLen": 1 + }, + "end": { + "offset": 24973, + "line": 803, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x387e840", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24587, + "line": 792, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24627, + "line": 793, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x387e790", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24591, + "line": 792, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24596, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387e778", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24593, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24593, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387e758", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24593, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24593, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387d9f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24591, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24591, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387e740", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24596, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 24596, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387da10", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24596, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 24596, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"analog\"" + } + ] + } + ] + }, + { + "id": "0x387e830", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24614, + "line": 793, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24627, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x387e800", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24621, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24627, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ad10", + "kind": "EnumConstantDecl", + "name": "ANALOG_ONLY", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x387f6b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24644, + "line": 794, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24685, + "line": 795, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x387f600", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24648, + "line": 794, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24653, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387f5e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24650, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24650, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387f5c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24650, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24650, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387e860", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24648, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24648, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387f5b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24653, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 24653, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387e880", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24653, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 24653, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"digital\"" + } + ] + } + ] + }, + { + "id": "0x387f6a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24672, + "line": 795, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24685, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x387f670", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24679, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24685, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ad60", + "kind": "EnumConstantDecl", + "name": "DIGITAL_ONLY", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3880530", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24703, + "line": 796, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24751, + "line": 797, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x3880480", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24707, + "line": 796, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24712, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3880468", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24709, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24709, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3880448", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24709, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24709, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387f6d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24707, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24707, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3880430", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24712, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 24712, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387f6f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24712, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 24712, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"analog_digital\"" + } + ] + } + ] + }, + { + "id": "0x3880520", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24738, + "line": 797, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24751, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x38804f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24745, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24751, + "col": 22, + "tokLen": 18 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5adb0", + "kind": "EnumConstantDecl", + "name": "ANALOG_AND_DIGITAL", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38813b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24775, + "line": 798, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24820, + "line": 799, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x3881300", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24779, + "line": 798, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24784, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38812e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24781, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24781, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38812c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24781, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24781, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3880550", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24779, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24779, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38812b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24784, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 24784, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3880570", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24784, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 24784, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"transceiver\"" + } + ] + } + ] + }, + { + "id": "0x38813a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24807, + "line": 799, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24820, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x3881370", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24814, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24820, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ae00", + "kind": "EnumConstantDecl", + "name": "TRANSCEIVER_ONLY", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3882230", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24842, + "line": 800, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24895, + "line": 801, + "col": 22, + "tokLen": 23 + } + }, + "inner": [ + { + "id": "0x3882180", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24846, + "line": 800, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24851, + "col": 14, + "tokLen": 21 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3882168", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24848, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24848, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3882148", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24848, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24848, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38813d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24846, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24846, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3882130", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24851, + "col": 14, + "tokLen": 21 + }, + "end": { + "offset": 24851, + "col": 14, + "tokLen": 21 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38813f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24851, + "col": 14, + "tokLen": 21 + }, + "end": { + "offset": 24851, + "col": 14, + "tokLen": 21 + } + }, + "type": { + "qualType": "const char[20]" + }, + "valueCategory": "lvalue", + "value": "\"digital_transceiver\"" + } + ] + } + ] + }, + { + "id": "0x3882220", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24882, + "line": 801, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24895, + "col": 22, + "tokLen": 23 + } + }, + "inner": [ + { + "id": "0x38821f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24889, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24895, + "col": 22, + "tokLen": 23 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ae50", + "kind": "EnumConstantDecl", + "name": "DIGITAL_AND_TRANSCEIVER", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3882840", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 24924, + "line": 802, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3882828", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 24924, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38827f8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38827e0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38827b8", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3882798", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3882790", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3882760", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3882748", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x3882730", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3882710", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x3882708", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38826d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38826b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24967, + "col": 48, + "tokLen": 1 + }, + "end": { + "offset": 24967, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3882698", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24967, + "col": 48, + "tokLen": 1 + }, + "end": { + "offset": 24967, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x3882680", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24943, + "col": 24, + "tokLen": 23 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3882260", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24943, + "col": 24, + "tokLen": 23 + } + }, + "type": { + "qualType": "const char[22]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown readout mode \"" + } + ] + }, + { + "id": "0x3882290", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24969, + "col": 50, + "tokLen": 1 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x3882a18", + "kind": "FunctionDecl", + "loc": { + "offset": 25003, + "file": "ToString.cpp", + "line": 805, + "col": 28, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 24976, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 30397, + "line": 991, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368b638", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8dacIndexEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::dacIndex (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "inner": [ + { + "id": "0x2f57a00", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "decl": { + "id": "0x2f57958", + "kind": "EnumDecl", + "name": "dacIndex" + } + } + ] + }, + { + "id": "0x3882940", + "kind": "ParmVarDecl", + "loc": { + "offset": 25031, + "line": 805, + "col": 56, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 25012, + "col": 37, + "tokLen": 5 + }, + "end": { + "offset": 25031, + "col": 56, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x7f1964637fa8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 25034, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 30397, + "line": 991, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3884820", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25040, + "line": 806, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25091, + "line": 807, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3884788", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25044, + "line": 806, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25065, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3883970", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25044, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25049, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3883958", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25046, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25046, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3883938", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25046, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25046, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3882bd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25044, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25044, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3883920", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25049, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25049, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3882bf0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25049, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25049, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 0\"" + } + ] + } + ] + }, + { + "id": "0x3884750", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25060, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25065, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3884738", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25062, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25062, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3884718", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25062, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25062, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38839a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25060, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25060, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3884700", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25065, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25065, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38839c8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25065, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25065, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"0\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3884810", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25078, + "line": 807, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25091, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38847e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25085, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25091, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57a20", + "kind": "EnumConstantDecl", + "name": "DAC_0", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38864d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25102, + "line": 808, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25153, + "line": 809, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3886438", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25106, + "line": 808, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25127, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3885620", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25106, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25111, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3885608", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25108, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25108, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38855e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25108, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25108, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3884840", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25106, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25106, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38855d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25111, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25111, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3884860", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25111, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25111, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 1\"" + } + ] + } + ] + }, + { + "id": "0x3886400", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25122, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25127, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38863e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25124, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25124, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38863c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25124, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25124, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3885658", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25122, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25122, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38863b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25127, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25127, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3885678", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25127, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25127, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"1\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x38864c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25140, + "line": 809, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25153, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3886490", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25147, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25153, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57a70", + "kind": "EnumConstantDecl", + "name": "DAC_1", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3888140", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25164, + "line": 810, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25215, + "line": 811, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38880a8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25168, + "line": 810, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25189, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3887290", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25168, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25173, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3887278", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25170, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25170, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3887258", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25170, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25170, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38864f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25168, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25168, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3887240", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25173, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25173, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3886510", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25173, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25173, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 2\"" + } + ] + } + ] + }, + { + "id": "0x3888070", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25184, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25189, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3888058", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25186, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25186, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3888038", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25186, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25186, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38872c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25184, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25184, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3888020", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25189, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25189, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38872e8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25189, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25189, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"2\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3888130", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25202, + "line": 811, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25215, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3888100", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25209, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25215, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57ac0", + "kind": "EnumConstantDecl", + "name": "DAC_2", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3889db0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25226, + "line": 812, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25277, + "line": 813, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3889d18", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25230, + "line": 812, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25251, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3888f00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25230, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25235, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3888ee8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25232, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25232, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3888ec8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25232, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25232, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3888160", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25230, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25230, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3888eb0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25235, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25235, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3888180", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25235, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25235, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 3\"" + } + ] + } + ] + }, + { + "id": "0x3889ce0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25246, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25251, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3889cc8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25248, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25248, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3889ca8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25248, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25248, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3888f38", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25246, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25246, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3889c90", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25251, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25251, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3888f58", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25251, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25251, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"3\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3889da0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25264, + "line": 813, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25277, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3889d70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25271, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25277, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57b10", + "kind": "EnumConstantDecl", + "name": "DAC_3", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x388ba20", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25288, + "line": 814, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25339, + "line": 815, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388b988", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25292, + "line": 814, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25313, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x388ab70", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25292, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25297, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388ab58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25294, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25294, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388ab38", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25294, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25294, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3889dd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25292, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25292, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388ab20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25297, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25297, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3889df0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25297, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25297, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 4\"" + } + ] + } + ] + }, + { + "id": "0x388b950", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25308, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25313, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388b938", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25310, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25310, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388b918", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25310, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25310, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388aba8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25308, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25308, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388b900", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25313, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25313, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388abc8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25313, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25313, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"4\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x388ba10", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25326, + "line": 815, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25339, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388b9e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25333, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25339, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57b60", + "kind": "EnumConstantDecl", + "name": "DAC_4", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x388d690", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25350, + "line": 816, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25401, + "line": 817, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388d5f8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25354, + "line": 816, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25375, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x388c7e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25354, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25359, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388c7c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25356, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25356, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388c7a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25356, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25356, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388ba40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25354, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25354, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388c790", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25359, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25359, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388ba60", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25359, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25359, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 5\"" + } + ] + } + ] + }, + { + "id": "0x388d5c0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25370, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25375, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388d5a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25372, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25372, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388d588", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25372, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25372, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388c818", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25370, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25370, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388d570", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25375, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25375, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388c838", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25375, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25375, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"5\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x388d680", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25388, + "line": 817, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25401, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388d650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25395, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25401, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57bb0", + "kind": "EnumConstantDecl", + "name": "DAC_5", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x388f300", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25412, + "line": 818, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25463, + "line": 819, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388f268", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25416, + "line": 818, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25437, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x388e450", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25416, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25421, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388e438", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25418, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25418, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388e418", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25418, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25418, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388d6b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25416, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25416, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388e400", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25421, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25421, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388d6d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25421, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25421, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 6\"" + } + ] + } + ] + }, + { + "id": "0x388f230", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25432, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25437, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388f218", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25434, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25434, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388f1f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25434, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25434, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388e488", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25432, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25432, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388f1e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25437, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25437, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388e4a8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25437, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25437, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"6\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x388f2f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25450, + "line": 819, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25463, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388f2c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25457, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25463, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57c00", + "kind": "EnumConstantDecl", + "name": "DAC_6", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3890f70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25474, + "line": 820, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25525, + "line": 821, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3890ed8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25478, + "line": 820, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25499, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38900c0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25478, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25483, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38900a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25480, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25480, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3890088", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25480, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25480, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388f320", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25478, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25478, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3890070", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25483, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25483, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388f340", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25483, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25483, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 7\"" + } + ] + } + ] + }, + { + "id": "0x3890ea0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25494, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25499, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3890e88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25496, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25496, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3890e68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25496, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25496, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38900f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25494, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25494, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3890e50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25499, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25499, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3890118", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25499, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25499, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"7\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3890f60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25512, + "line": 821, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25525, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3890f30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25519, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25525, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57c50", + "kind": "EnumConstantDecl", + "name": "DAC_7", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3892be0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25536, + "line": 822, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25587, + "line": 823, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3892b48", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25540, + "line": 822, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25561, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3891d30", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25540, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25545, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3891d18", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25542, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25542, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3891cf8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25542, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25542, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3890f90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25540, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25540, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3891ce0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25545, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25545, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3890fb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25545, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25545, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 8\"" + } + ] + } + ] + }, + { + "id": "0x3892b10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25556, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25561, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3892af8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25558, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25558, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3892ad8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25558, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25558, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3891d68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25556, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25556, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3892ac0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25561, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25561, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3891d88", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25561, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25561, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"8\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3892bd0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25574, + "line": 823, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25587, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3892ba0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25581, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25587, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57ca0", + "kind": "EnumConstantDecl", + "name": "DAC_8", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3894850", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25598, + "line": 824, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25649, + "line": 825, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38947b8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25602, + "line": 824, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25623, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38939a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25602, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25607, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3893988", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25604, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25604, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3893968", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25604, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25604, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3892c00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25602, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25602, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3893950", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25607, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25607, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3892c20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25607, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25607, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 9\"" + } + ] + } + ] + }, + { + "id": "0x3894780", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25618, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25623, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3894768", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25620, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25620, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3894748", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25620, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25620, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38939d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25618, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25618, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3894730", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25623, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25623, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38939f8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25623, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25623, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"9\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3894840", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25636, + "line": 825, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25649, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3894810", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25643, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25649, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57cf0", + "kind": "EnumConstantDecl", + "name": "DAC_9", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38964e0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25660, + "line": 826, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25713, + "line": 827, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3896448", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25664, + "line": 826, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25686, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3895630", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25664, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25669, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3895618", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25666, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25666, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38955f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25666, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25666, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3894870", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25664, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25664, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38955e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25669, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25669, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3894890", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25669, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25669, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 10\"" + } + ] + } + ] + }, + { + "id": "0x3896410", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25681, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25686, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38963f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25683, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25683, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38963d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25683, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25683, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3895668", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25681, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25681, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38963c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25686, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25686, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3895688", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25686, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25686, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"10\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x38964d0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25700, + "line": 827, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25713, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38964a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25707, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25713, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57d40", + "kind": "EnumConstantDecl", + "name": "DAC_10", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3898150", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25725, + "line": 828, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25778, + "line": 829, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38980b8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25729, + "line": 828, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25751, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38972a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25729, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25734, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3897288", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25731, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25731, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3897268", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25731, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25731, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3896500", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25729, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25729, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3897250", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25734, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25734, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3896520", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25734, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25734, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 11\"" + } + ] + } + ] + }, + { + "id": "0x3898080", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25746, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25751, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3898068", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25748, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25748, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3898048", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25748, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25748, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38972d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25746, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25746, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3898030", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25751, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25751, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38972f8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25751, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25751, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"11\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3898140", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25765, + "line": 829, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25778, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3898110", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25772, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25778, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57d90", + "kind": "EnumConstantDecl", + "name": "DAC_11", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3899dc0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25790, + "line": 830, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25843, + "line": 831, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3899d28", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25794, + "line": 830, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25816, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3898f10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25794, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25799, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3898ef8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25796, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25796, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3898ed8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25796, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25796, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3898170", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25794, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25794, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3898ec0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25799, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25799, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3898190", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25799, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25799, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 12\"" + } + ] + } + ] + }, + { + "id": "0x3899cf0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25811, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25816, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3899cd8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25813, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25813, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3899cb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25813, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25813, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3898f48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25811, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25811, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3899ca0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25816, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25816, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3898f68", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25816, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25816, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"12\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3899db0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25830, + "line": 831, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25843, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3899d80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25837, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25843, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57de0", + "kind": "EnumConstantDecl", + "name": "DAC_12", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x389ba30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25855, + "line": 832, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25908, + "line": 833, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389b998", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25859, + "line": 832, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25881, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x389ab80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25859, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25864, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389ab68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25861, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25861, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389ab48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25861, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25861, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3899de0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25859, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25859, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389ab30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25864, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25864, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3899e00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25864, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25864, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 13\"" + } + ] + } + ] + }, + { + "id": "0x389b960", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25876, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25881, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389b948", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25878, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25878, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389b928", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25878, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25878, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389abb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25876, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25876, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389b910", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25881, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25881, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389abd8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25881, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25881, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"13\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x389ba20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25895, + "line": 833, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25908, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389b9f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25902, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25908, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57e30", + "kind": "EnumConstantDecl", + "name": "DAC_13", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x389d6a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25920, + "line": 834, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25973, + "line": 835, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389d608", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25924, + "line": 834, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25946, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x389c7f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25924, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25929, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389c7d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25926, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25926, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389c7b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25926, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25926, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389ba50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25924, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25924, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389c7a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25929, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25929, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389ba70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25929, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25929, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 14\"" + } + ] + } + ] + }, + { + "id": "0x389d5d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25941, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25946, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389d5b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25943, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25943, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389d598", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25943, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25943, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389c828", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25941, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25941, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389d580", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25946, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25946, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389c848", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25946, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25946, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"14\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x389d690", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25960, + "line": 835, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25973, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389d660", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25967, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25973, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57e80", + "kind": "EnumConstantDecl", + "name": "DAC_14", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x389f310", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25985, + "line": 836, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26038, + "line": 837, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389f278", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25989, + "line": 836, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26011, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x389e460", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25989, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25994, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389e448", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25991, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25991, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389e428", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25991, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25991, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389d6c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25989, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25989, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389e410", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25994, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25994, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389d6e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25994, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25994, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 15\"" + } + ] + } + ] + }, + { + "id": "0x389f240", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26006, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26011, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389f228", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26008, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26008, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389f208", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26008, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26008, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389e498", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26006, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26006, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389f1f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26011, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26011, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389e4b8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26011, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26011, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"15\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x389f300", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26025, + "line": 837, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26038, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389f2d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26032, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26038, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57ed0", + "kind": "EnumConstantDecl", + "name": "DAC_15", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a0f80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26050, + "line": 838, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26103, + "line": 839, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a0ee8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 26054, + "line": 838, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26076, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38a00d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26054, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26059, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a00b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26056, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26056, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a0098", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26056, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26056, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389f330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26054, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26054, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a0080", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26059, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26059, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389f350", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26059, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26059, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 16\"" + } + ] + } + ] + }, + { + "id": "0x38a0eb0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26071, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26076, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a0e98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26073, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26073, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a0e78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26073, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26073, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a0108", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26071, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26071, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a0e60", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26076, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26076, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a0128", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26076, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26076, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"16\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x38a0f70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26090, + "line": 839, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26103, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a0f40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26097, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26103, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57f20", + "kind": "EnumConstantDecl", + "name": "DAC_16", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a2bf0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26115, + "line": 840, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26168, + "line": 841, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a2b58", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 26119, + "line": 840, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26141, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38a1d40", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26119, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26124, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a1d28", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26121, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26121, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a1d08", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26121, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26121, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a0fa0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26119, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26119, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a1cf0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26124, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26124, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a0fc0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26124, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26124, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 17\"" + } + ] + } + ] + }, + { + "id": "0x38a2b20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26136, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26141, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a2b08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26138, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26138, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a2ae8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26138, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26138, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a1d78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26136, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26136, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a2ad0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26141, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26141, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a1d98", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26141, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26141, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"17\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x38a2be0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26155, + "line": 841, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26168, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a2bb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26162, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26168, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57f70", + "kind": "EnumConstantDecl", + "name": "DAC_17", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a3a60", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26180, + "line": 842, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26218, + "line": 843, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38a39b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26184, + "line": 842, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26189, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a3998", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26186, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26186, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a3978", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26186, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26186, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a2c10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26184, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26184, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a3960", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26189, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26189, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a2c30", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26189, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26189, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vsvp\"" + } + ] + } + ] + }, + { + "id": "0x38a3a50", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26205, + "line": 843, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26218, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38a3a20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26212, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26218, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57fc0", + "kind": "EnumConstantDecl", + "name": "VSVP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a48d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26228, + "line": 844, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26267, + "line": 845, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38a4820", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26232, + "line": 844, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26237, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a4808", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26234, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26234, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a47e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26234, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26234, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a3a80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26232, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26232, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a47d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26237, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 26237, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a3aa0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26237, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 26237, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vtrim\"" + } + ] + } + ] + }, + { + "id": "0x38a48c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26254, + "line": 845, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26267, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38a4890", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26261, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26267, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58010", + "kind": "EnumConstantDecl", + "name": "VTRIM", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a5760", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26278, + "line": 846, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26320, + "line": 847, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38a56b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26282, + "line": 846, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26287, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a5698", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26284, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26284, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a5678", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26284, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26284, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a48f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26282, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26282, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a5660", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26287, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26287, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a4910", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26287, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26287, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vrpreamp\"" + } + ] + } + ] + }, + { + "id": "0x38a5750", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26307, + "line": 847, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26320, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38a5720", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26314, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26320, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58060", + "kind": "EnumConstantDecl", + "name": "VRPREAMP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a65d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26334, + "line": 848, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26376, + "line": 849, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38a6520", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26338, + "line": 848, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26343, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a6508", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26340, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26340, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a64e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26340, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26340, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a5780", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26338, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26338, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a64d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26343, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26343, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a57a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26343, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26343, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vrshaper\"" + } + ] + } + ] + }, + { + "id": "0x38a65c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26363, + "line": 849, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26376, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38a6590", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26370, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26376, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f580b0", + "kind": "EnumConstantDecl", + "name": "VRSHAPER", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a7440", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26390, + "line": 850, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26428, + "line": 851, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38a7390", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26394, + "line": 850, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26399, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a7378", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26396, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26396, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a7358", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26396, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26396, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a65f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26394, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26394, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a7340", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26399, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26399, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a6610", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26399, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26399, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vsvn\"" + } + ] + } + ] + }, + { + "id": "0x38a7430", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26415, + "line": 851, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26428, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38a7400", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26422, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26428, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58100", + "kind": "EnumConstantDecl", + "name": "VSVN", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a82b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26438, + "line": 852, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26478, + "line": 853, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a8200", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26442, + "line": 852, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26447, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a81e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26444, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26444, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a81c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26444, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26444, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a7460", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26442, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26442, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a81b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26447, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26447, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a7480", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26447, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26447, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vtgstv\"" + } + ] + } + ] + }, + { + "id": "0x38a82a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26465, + "line": 853, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26478, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a8270", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26472, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26478, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58150", + "kind": "EnumConstantDecl", + "name": "VTGSTV", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a9120", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26490, + "line": 854, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26531, + "line": 855, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38a9070", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26494, + "line": 854, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26499, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a9058", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26496, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26496, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a9038", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26496, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26496, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a82d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26494, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26494, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a9020", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26499, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26499, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a82f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26499, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26499, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vcmp_ll\"" + } + ] + } + ] + }, + { + "id": "0x38a9110", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26518, + "line": 855, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26531, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38a90e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26525, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26531, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f581a0", + "kind": "EnumConstantDecl", + "name": "VCMP_LL", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a9f90", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26544, + "line": 856, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26585, + "line": 857, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38a9ee0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26548, + "line": 856, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26553, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a9ec8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26550, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26550, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a9ea8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26550, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26550, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a9140", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26548, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26548, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a9e90", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26553, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26553, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a9160", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26553, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26553, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vcmp_lr\"" + } + ] + } + ] + }, + { + "id": "0x38a9f80", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26572, + "line": 857, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26585, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38a9f50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26579, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26585, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f581f0", + "kind": "EnumConstantDecl", + "name": "VCMP_LR", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38aae00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26598, + "line": 858, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26636, + "line": 859, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38aad50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26602, + "line": 858, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26607, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38aad38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26604, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26604, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38aad18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26604, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26604, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a9fb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26602, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26602, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38aad00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26607, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26607, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a9fd0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26607, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26607, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vcal\"" + } + ] + } + ] + }, + { + "id": "0x38aadf0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26623, + "line": 859, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26636, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38aadc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26630, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26636, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58240", + "kind": "EnumConstantDecl", + "name": "VCAL", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38abc70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26646, + "line": 860, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26687, + "line": 861, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38abbc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26650, + "line": 860, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26655, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38abba8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26652, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26652, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38abb88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26652, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26652, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38aae20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26650, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26650, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38abb70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26655, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26655, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38aae40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26655, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26655, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vcmp_rl\"" + } + ] + } + ] + }, + { + "id": "0x38abc60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26674, + "line": 861, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26687, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38abc30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26681, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26687, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58290", + "kind": "EnumConstantDecl", + "name": "VCMP_RL", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38acae0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26700, + "line": 862, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26740, + "line": 863, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38aca30", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26704, + "line": 862, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26709, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38aca18", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26706, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26706, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ac9f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26706, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26706, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38abc90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26704, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26704, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ac9e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26709, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26709, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38abcb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26709, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26709, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"rxb_rb\"" + } + ] + } + ] + }, + { + "id": "0x38acad0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26727, + "line": 863, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26740, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38acaa0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26734, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26740, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f582e0", + "kind": "EnumConstantDecl", + "name": "RXB_RB", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ad950", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26752, + "line": 864, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26792, + "line": 865, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38ad8a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26756, + "line": 864, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26761, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ad888", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26758, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26758, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ad868", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26758, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26758, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38acb00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26756, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26756, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ad850", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26761, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26761, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38acb20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26761, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26761, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"rxb_lb\"" + } + ] + } + ] + }, + { + "id": "0x38ad940", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26779, + "line": 865, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26792, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38ad910", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26786, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26792, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58330", + "kind": "EnumConstantDecl", + "name": "RXB_LB", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ae7c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26804, + "line": 866, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26845, + "line": 867, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38ae710", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26808, + "line": 866, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26813, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ae6f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26810, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26810, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ae6d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26810, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26810, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ad970", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26808, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26808, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ae6c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26813, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26813, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ad990", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26813, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26813, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vcmp_rr\"" + } + ] + } + ] + }, + { + "id": "0x38ae7b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26832, + "line": 867, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26845, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38ae780", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26839, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26845, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58380", + "kind": "EnumConstantDecl", + "name": "VCMP_RR", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38af630", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26858, + "line": 868, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26895, + "line": 869, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38af580", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26862, + "line": 868, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26867, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38af568", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26864, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26864, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38af548", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26864, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26864, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ae7e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26862, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26862, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38af530", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26867, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 26867, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ae800", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26867, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 26867, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"vcp\"" + } + ] + } + ] + }, + { + "id": "0x38af620", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26882, + "line": 869, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26895, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38af5f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26889, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26895, + "col": 22, + "tokLen": 3 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f583d0", + "kind": "EnumConstantDecl", + "name": "VCP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b04a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26904, + "line": 870, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26941, + "line": 871, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38b03f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26908, + "line": 870, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26913, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b03d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26910, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26910, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b03b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26910, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26910, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38af650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26908, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26908, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b03a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26913, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 26913, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38af670", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26913, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 26913, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"vcn\"" + } + ] + } + ] + }, + { + "id": "0x38b0490", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26928, + "line": 871, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26941, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38b0460", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26935, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26941, + "col": 22, + "tokLen": 3 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58420", + "kind": "EnumConstantDecl", + "name": "VCN", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b1310", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26950, + "line": 872, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26992, + "line": 873, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38b1260", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26954, + "line": 872, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26959, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b1248", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26956, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26956, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b1228", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26956, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26956, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b04c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26954, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26954, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b1210", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26959, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26959, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b04e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26959, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26959, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vishaper\"" + } + ] + } + ] + }, + { + "id": "0x38b1300", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26979, + "line": 873, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26992, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38b12d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26986, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26992, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58470", + "kind": "EnumConstantDecl", + "name": "VISHAPER", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b2190", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27006, + "line": 874, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27050, + "line": 875, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38b20e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27010, + "line": 874, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27015, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b20c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27012, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27012, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b20a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27012, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27012, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b1330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27010, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27010, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b2090", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27015, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27015, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b1350", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27015, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27015, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vthreshold\"" + } + ] + } + ] + }, + { + "id": "0x38b2180", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27037, + "line": 875, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27050, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38b2150", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27044, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27050, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f584c0", + "kind": "EnumConstantDecl", + "name": "VTHRESHOLD", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b3000", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27066, + "line": 876, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27107, + "line": 877, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38b2f50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27070, + "line": 876, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27075, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b2f38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27072, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27072, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b2f18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27072, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27072, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b21b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27070, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27070, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b2f00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27075, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27075, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b21d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27075, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27075, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vref_ds\"" + } + ] + } + ] + }, + { + "id": "0x38b2ff0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27094, + "line": 877, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27107, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38b2fc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27101, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27107, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58560", + "kind": "EnumConstantDecl", + "name": "VREF_DS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b3e80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27120, + "line": 878, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27163, + "line": 879, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b3dd0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27124, + "line": 878, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27129, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b3db8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27126, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27126, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b3d98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27126, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27126, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b3020", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27124, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27124, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b3d80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27129, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27129, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b3040", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27129, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27129, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcascn_pb\"" + } + ] + } + ] + }, + { + "id": "0x38b3e70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27150, + "line": 879, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27163, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b3e40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27157, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27163, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f585b0", + "kind": "EnumConstantDecl", + "name": "VCASCN_PB", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b4d00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27178, + "line": 880, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27221, + "line": 881, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b4c50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27182, + "line": 880, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27187, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b4c38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27184, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27184, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b4c18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27184, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27184, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b3ea0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27182, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27182, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b4c00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27187, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27187, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b3ec0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27187, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27187, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcascp_pb\"" + } + ] + } + ] + }, + { + "id": "0x38b4cf0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27208, + "line": 881, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27221, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b4cc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27215, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27221, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58600", + "kind": "EnumConstantDecl", + "name": "VCASCP_PB", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b5b90", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27236, + "line": 882, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27277, + "line": 883, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38b5ae0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27240, + "line": 882, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27245, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b5ac8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27242, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27242, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b5aa8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27242, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27242, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b4d20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27240, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27240, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b5a90", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27245, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27245, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b4d40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27245, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27245, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vout_cm\"" + } + ] + } + ] + }, + { + "id": "0x38b5b80", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27264, + "line": 883, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27277, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38b5b50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27271, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27277, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58650", + "kind": "EnumConstantDecl", + "name": "VOUT_CM", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b6a10", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27290, + "line": 884, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27333, + "line": 885, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b6960", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27294, + "line": 884, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27299, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b6948", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27296, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27296, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b6928", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27296, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27296, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b5bb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27294, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27294, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b6910", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27299, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27299, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b5bd0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27299, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27299, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcasc_out\"" + } + ] + } + ] + }, + { + "id": "0x38b6a00", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27320, + "line": 885, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27333, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b69d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27327, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27333, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f586a0", + "kind": "EnumConstantDecl", + "name": "VCASC_OUT", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b7880", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27348, + "line": 886, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27388, + "line": 887, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38b77d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27352, + "line": 886, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27357, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b77b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27354, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27354, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b7798", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27354, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27354, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b6a30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27352, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27352, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b7780", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27357, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 27357, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b6a50", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27357, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 27357, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vin_cm\"" + } + ] + } + ] + }, + { + "id": "0x38b7870", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27375, + "line": 887, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27388, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38b7840", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27382, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27388, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f586f0", + "kind": "EnumConstantDecl", + "name": "VIN_CM", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b8700", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27400, + "line": 888, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27443, + "line": 889, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b8650", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27404, + "line": 888, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27409, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b8638", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27406, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27406, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b8618", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27406, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27406, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b78a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27404, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27404, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b8600", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27409, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27409, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b78c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27409, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27409, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vref_comp\"" + } + ] + } + ] + }, + { + "id": "0x38b86f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27430, + "line": 889, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27443, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b86c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27437, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27443, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58740", + "kind": "EnumConstantDecl", + "name": "VREF_COMP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b9580", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27458, + "line": 890, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27501, + "line": 891, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38b94d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27462, + "line": 890, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27467, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b94b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27464, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27464, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b9498", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27464, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27464, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b8720", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27462, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27462, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b9480", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27467, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27467, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b8740", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27467, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27467, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"ib_test_c\"" + } + ] + } + ] + }, + { + "id": "0x38b9570", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27488, + "line": 891, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27501, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38b9540", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27495, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27501, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58790", + "kind": "EnumConstantDecl", + "name": "IB_TESTC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ba3f0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27515, + "line": 892, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27556, + "line": 893, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38ba340", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27519, + "line": 892, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27524, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ba328", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27521, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27521, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ba308", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27521, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27521, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b95a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27519, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27519, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ba2f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27524, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27524, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b95c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27524, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27524, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vb_comp\"" + } + ] + } + ] + }, + { + "id": "0x38ba3e0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27543, + "line": 893, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27556, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38ba3b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27550, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27556, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f587e0", + "kind": "EnumConstantDecl", + "name": "VB_COMP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bb260", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27569, + "line": 894, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27611, + "line": 895, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38bb1b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27573, + "line": 894, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27578, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bb198", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27575, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27575, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bb178", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27575, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27575, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ba410", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27573, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27573, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bb160", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27578, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 27578, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ba430", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27578, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 27578, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vdd_prot\"" + } + ] + } + ] + }, + { + "id": "0x38bb250", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27598, + "line": 895, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27611, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38bb220", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27605, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27611, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58830", + "kind": "EnumConstantDecl", + "name": "VDD_PROT", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bc0d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27625, + "line": 896, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27666, + "line": 897, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38bc020", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27629, + "line": 896, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27634, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bc008", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27631, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27631, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bbfe8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27631, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27631, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bb280", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27629, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27629, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bbfd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27634, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27634, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bb2a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27634, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27634, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vin_com\"" + } + ] + } + ] + }, + { + "id": "0x38bc0c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27653, + "line": 897, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27666, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38bc090", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27660, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27666, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58880", + "kind": "EnumConstantDecl", + "name": "VIN_COM", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bcf50", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27679, + "line": 898, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27723, + "line": 899, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38bcea0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27683, + "line": 898, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27688, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bce88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27685, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27685, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bce68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27685, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27685, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bc0f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27683, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27683, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bce50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27688, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27688, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bc110", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27688, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27688, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vref_prech\"" + } + ] + } + ] + }, + { + "id": "0x38bcf40", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27710, + "line": 899, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27723, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38bcf10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27717, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27723, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f588d0", + "kind": "EnumConstantDecl", + "name": "VREF_PRECH", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bddd0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27739, + "line": 900, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27782, + "line": 901, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38bdd20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27743, + "line": 900, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27748, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bdd08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27745, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27745, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bdce8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27745, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27745, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bcf70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27743, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27743, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bdcd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27748, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27748, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bcf90", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27748, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27748, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vb_pixbuf\"" + } + ] + } + ] + }, + { + "id": "0x38bddc0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27769, + "line": 901, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27782, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38bdd90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27776, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27782, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58920", + "kind": "EnumConstantDecl", + "name": "VB_PIXBUF", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bec40", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27797, + "line": 902, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27836, + "line": 903, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38beb90", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27801, + "line": 902, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27806, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38beb78", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27803, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27803, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38beb58", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27803, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27803, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bddf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27801, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27801, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38beb40", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27806, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 27806, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bde10", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27806, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 27806, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vb_ds\"" + } + ] + } + ] + }, + { + "id": "0x38bec30", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27823, + "line": 903, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27836, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38bec00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27830, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27836, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58970", + "kind": "EnumConstantDecl", + "name": "VB_DS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bfac0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27847, + "line": 904, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27891, + "line": 905, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38bfa10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27851, + "line": 904, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27856, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bf9f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27853, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27853, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bf9d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27853, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27853, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bec60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27851, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27851, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bf9c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27856, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27856, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bec80", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27856, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27856, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vref_h_adc\"" + } + ] + } + ] + }, + { + "id": "0x38bfab0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27878, + "line": 905, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27891, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38bfa80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27885, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27891, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f589c0", + "kind": "EnumConstantDecl", + "name": "VREF_H_ADC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c0940", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27907, + "line": 906, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27951, + "line": 907, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c0890", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27911, + "line": 906, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27916, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c0878", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27913, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27913, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c0858", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27913, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27913, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bfae0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27911, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27911, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c0840", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27916, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27916, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bfb00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27916, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27916, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vb_comp_fe\"" + } + ] + } + ] + }, + { + "id": "0x38c0930", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27938, + "line": 907, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27951, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c0900", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27945, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27951, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58a10", + "kind": "EnumConstantDecl", + "name": "VB_COMP_FE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c17c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27967, + "line": 908, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28012, + "line": 909, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38c1710", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27971, + "line": 908, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27976, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c16f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27973, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27973, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c16d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27973, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27973, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c0960", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27971, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27971, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c16c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27976, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 27976, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c0980", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27976, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 27976, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"vb_comp_adc\"" + } + ] + } + ] + }, + { + "id": "0x38c17b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27999, + "line": 909, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28012, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38c1780", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28006, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28012, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58a60", + "kind": "EnumConstantDecl", + "name": "VB_COMP_ADC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c2630", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28029, + "line": 910, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28071, + "line": 911, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38c2580", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28033, + "line": 910, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28038, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c2568", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28035, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28035, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c2548", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28035, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28035, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c17e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28033, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28033, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c2530", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28038, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 28038, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c1800", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28038, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 28038, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vcom_cds\"" + } + ] + } + ] + }, + { + "id": "0x38c2620", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28058, + "line": 911, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28071, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38c25f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28065, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28071, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58ab0", + "kind": "EnumConstantDecl", + "name": "VCOM_CDS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c34b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28085, + "line": 912, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28130, + "line": 913, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38c3400", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28089, + "line": 912, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28094, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c33e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28091, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28091, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c33c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28091, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28091, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c2650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28089, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28089, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c33b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28094, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 28094, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c2670", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28094, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 28094, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"vref_rstore\"" + } + ] + } + ] + }, + { + "id": "0x38c34a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28117, + "line": 913, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28130, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38c3470", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28124, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28130, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58b00", + "kind": "EnumConstantDecl", + "name": "VREF_RSTORE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c4330", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28147, + "line": 914, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28191, + "line": 915, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c4280", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28151, + "line": 914, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28156, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c4268", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28153, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28153, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c4248", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28153, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28153, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c34d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28151, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28151, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c4230", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28156, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28156, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c34f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28156, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28156, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vb_opa_1st\"" + } + ] + } + ] + }, + { + "id": "0x38c4320", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28178, + "line": 915, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28191, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c42f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28185, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28191, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58b50", + "kind": "EnumConstantDecl", + "name": "VB_OPA_1ST", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c51c8", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28207, + "line": 916, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28253, + "line": 917, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x38c5100", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28211, + "line": 916, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28216, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c50e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28213, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28213, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c50c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28213, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28213, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c4350", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28211, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28211, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c50b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28216, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 28216, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c4370", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28216, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 28216, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"vref_comp_fe\"" + } + ] + } + ] + }, + { + "id": "0x38c51b8", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28240, + "line": 917, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28253, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x38c5188", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28247, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28253, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58ba0", + "kind": "EnumConstantDecl", + "name": "VREF_COMP_FE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c6040", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28271, + "line": 918, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28314, + "line": 919, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38c5f90", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28275, + "line": 918, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28280, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c5f78", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28277, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28277, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c5f58", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28277, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28277, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c51e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28275, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28275, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c5f40", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28280, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28280, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c5208", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28280, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28280, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcom_adc1\"" + } + ] + } + ] + }, + { + "id": "0x38c6030", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28301, + "line": 919, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28314, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38c6000", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28308, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28314, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58bf0", + "kind": "EnumConstantDecl", + "name": "VCOM_ADC1", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c6ec0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28329, + "line": 920, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28373, + "line": 921, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c6e10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28333, + "line": 920, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28338, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c6df8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28335, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28335, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c6dd8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28335, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28335, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c6060", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28333, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28333, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c6dc0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28338, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28338, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c6080", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28338, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28338, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vref_l_adc\"" + } + ] + } + ] + }, + { + "id": "0x38c6eb0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28360, + "line": 921, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28373, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c6e80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28367, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28373, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58c40", + "kind": "EnumConstantDecl", + "name": "VREF_L_ADC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c7d30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28389, + "line": 922, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28431, + "line": 923, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38c7c80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28393, + "line": 922, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28398, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c7c68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28395, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28395, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c7c48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28395, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28395, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c6ee0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28393, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28393, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c7c30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28398, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 28398, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c6f00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28398, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 28398, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vref_cds\"" + } + ] + } + ] + }, + { + "id": "0x38c7d20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28418, + "line": 923, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28431, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38c7cf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28425, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28431, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58c90", + "kind": "EnumConstantDecl", + "name": "VREF_CDS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c8ba0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28445, + "line": 924, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28484, + "line": 925, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38c8af0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28449, + "line": 924, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28454, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c8ad8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28451, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28451, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c8ab8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28451, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28451, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c7d50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28449, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28449, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c8aa0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28454, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 28454, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c7d70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28454, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 28454, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vb_cs\"" + } + ] + } + ] + }, + { + "id": "0x38c8b90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28471, + "line": 925, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28484, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38c8b60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28478, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28484, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58ce0", + "kind": "EnumConstantDecl", + "name": "VB_CS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c9a20", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28495, + "line": 926, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28538, + "line": 927, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38c9970", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28499, + "line": 926, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28504, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c9958", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28501, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28501, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c9938", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28501, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28501, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c8bc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28499, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28499, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c9920", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28504, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28504, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c8be0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28504, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28504, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vb_opa_fd\"" + } + ] + } + ] + }, + { + "id": "0x38c9a10", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28525, + "line": 927, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28538, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38c99e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28532, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28538, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58d30", + "kind": "EnumConstantDecl", + "name": "VB_OPA_FD", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ca8a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28553, + "line": 928, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28596, + "line": 929, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38ca7f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28557, + "line": 928, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28562, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ca7d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28559, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28559, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ca7b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28559, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28559, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c9a40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28557, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28557, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ca7a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28562, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28562, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c9a60", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28562, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28562, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcom_adc2\"" + } + ] + } + ] + }, + { + "id": "0x38ca890", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28583, + "line": 929, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28596, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38ca860", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28590, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28596, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58d80", + "kind": "EnumConstantDecl", + "name": "VCOM_ADC2", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cb710", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28611, + "line": 930, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28651, + "line": 931, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38cb660", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28615, + "line": 930, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28620, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cb648", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28617, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28617, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cb628", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28617, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28617, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ca8c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28615, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28615, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38cb610", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28620, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 28620, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ca8e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28620, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 28620, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vcassh\"" + } + ] + } + ] + }, + { + "id": "0x38cb700", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28638, + "line": 931, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28651, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38cb6d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28645, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28651, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58dd0", + "kind": "EnumConstantDecl", + "name": "VCASSH", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cc580", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28663, + "line": 932, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28701, + "line": 933, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cc4d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28667, + "line": 932, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28672, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cc4b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28669, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28669, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cc498", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28669, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28669, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cb730", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28667, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28667, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38cc480", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28672, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28672, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cb750", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28672, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28672, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vth2\"" + } + ] + } + ] + }, + { + "id": "0x38cc570", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28688, + "line": 933, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28701, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cc540", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28695, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28701, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58e20", + "kind": "EnumConstantDecl", + "name": "VTH2", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cd400", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28711, + "line": 934, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28755, + "line": 935, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38cd350", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28715, + "line": 934, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28720, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cd338", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28717, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28717, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cd318", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28717, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28717, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cc5a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28715, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28715, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38cd300", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28720, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28720, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cc5c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28720, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28720, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vrshaper_n\"" + } + ] + } + ] + }, + { + "id": "0x38cd3f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28742, + "line": 935, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28755, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38cd3c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28749, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28755, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58e70", + "kind": "EnumConstantDecl", + "name": "VRSHAPER_N", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ce280", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28771, + "line": 936, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28814, + "line": 937, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38ce1d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28775, + "line": 936, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28780, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ce1b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28777, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28777, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ce198", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28777, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28777, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cd420", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28775, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28775, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ce180", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28780, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28780, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cd440", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28780, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28780, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vipre_out\"" + } + ] + } + ] + }, + { + "id": "0x38ce270", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28801, + "line": 937, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28814, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38ce240", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28808, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28814, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58ec0", + "kind": "EnumConstantDecl", + "name": "VIPRE_OUT", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cf0f0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28829, + "line": 938, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28867, + "line": 939, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cf040", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28833, + "line": 938, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28838, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cf028", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28835, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28835, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cf008", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28835, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28835, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ce2a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28833, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28833, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ceff0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28838, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28838, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ce2c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28838, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28838, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vth3\"" + } + ] + } + ] + }, + { + "id": "0x38cf0e0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28854, + "line": 939, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28867, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cf0b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28861, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28867, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58f10", + "kind": "EnumConstantDecl", + "name": "VTH3", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cff60", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28877, + "line": 940, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28915, + "line": 941, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cfeb0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28881, + "line": 940, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28886, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cfe98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28883, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28883, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cfe78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28883, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28883, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cf110", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28881, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28881, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38cfe60", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28886, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28886, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cf130", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28886, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28886, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vth1\"" + } + ] + } + ] + }, + { + "id": "0x38cff50", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28902, + "line": 941, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28915, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cff20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28909, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28915, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58f60", + "kind": "EnumConstantDecl", + "name": "VTH1", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d0dd0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28925, + "line": 942, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28964, + "line": 943, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38d0d20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28929, + "line": 942, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28934, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d0d08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28931, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28931, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d0ce8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28931, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28931, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cff80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28929, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28929, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d0cd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28934, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 28934, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cffa0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28934, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 28934, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vicin\"" + } + ] + } + ] + }, + { + "id": "0x38d0dc0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28951, + "line": 943, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28964, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38d0d90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28958, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28964, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58fb0", + "kind": "EnumConstantDecl", + "name": "VICIN", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d1c40", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28975, + "line": 944, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29013, + "line": 945, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38d1b90", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28979, + "line": 944, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28984, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d1b78", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28981, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28981, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d1b58", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28981, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28981, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d0df0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28979, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28979, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d1b40", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28984, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28984, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d0e10", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28984, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28984, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vcas\"" + } + ] + } + ] + }, + { + "id": "0x38d1c30", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29000, + "line": 945, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29013, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38d1c00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29007, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29013, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59000", + "kind": "EnumConstantDecl", + "name": "VCAS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d2ab0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29023, + "line": 946, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29063, + "line": 947, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d2a00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29027, + "line": 946, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29032, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d29e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29029, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29029, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d29c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29029, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29029, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d1c60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29027, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29027, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d29b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29032, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29032, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d1c80", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29032, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29032, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vcal_n\"" + } + ] + } + ] + }, + { + "id": "0x38d2aa0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29050, + "line": 947, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29063, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d2a70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29057, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29063, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59050", + "kind": "EnumConstantDecl", + "name": "VCAL_N", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d3920", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29075, + "line": 948, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29114, + "line": 949, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38d3870", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29079, + "line": 948, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29084, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d3858", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29081, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29081, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d3838", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29081, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29081, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d2ad0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29079, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29079, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d3820", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29084, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 29084, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d2af0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29084, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 29084, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vipre\"" + } + ] + } + ] + }, + { + "id": "0x38d3910", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29101, + "line": 949, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29114, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38d38e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29108, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29114, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f590a0", + "kind": "EnumConstantDecl", + "name": "VIPRE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d4790", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29125, + "line": 950, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29165, + "line": 951, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d46e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29129, + "line": 950, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29134, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d46c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29131, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29131, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d46a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29131, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29131, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d3940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29129, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29129, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d4690", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29134, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29134, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d3960", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29134, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29134, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vcal_p\"" + } + ] + } + ] + }, + { + "id": "0x38d4780", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29152, + "line": 951, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29165, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d4750", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29159, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29165, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f590f0", + "kind": "EnumConstantDecl", + "name": "VCAL_P", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f19646274c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29177, + "line": 952, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29216, + "line": 953, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x7f1964627410", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29181, + "line": 952, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29186, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646273f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29183, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29183, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f19646273d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29183, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29183, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d47b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29181, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29181, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f19646273c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29186, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 29186, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d47d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29186, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 29186, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vdcsh\"" + } + ] + } + ] + }, + { + "id": "0x7f19646274b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29203, + "line": 953, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29216, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x7f1964627480", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29210, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29216, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59140", + "kind": "EnumConstantDecl", + "name": "VDCSH", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964628340", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29227, + "line": 954, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29271, + "line": 955, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x7f1964628290", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29231, + "line": 954, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29236, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964628278", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29233, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29233, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964628258", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29233, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29233, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646274e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29231, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29231, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964628240", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29236, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 29236, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964627500", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29236, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 29236, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vbp_colbuf\"" + } + ] + } + ] + }, + { + "id": "0x7f1964628330", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29258, + "line": 955, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29271, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x7f1964628300", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29265, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29271, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59190", + "kind": "EnumConstantDecl", + "name": "VBP_COLBUF", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f19646291b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29287, + "line": 956, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29327, + "line": 957, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x7f1964629100", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29291, + "line": 956, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29296, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646290e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29293, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29293, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f19646290c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29293, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29293, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964628360", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29291, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29291, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f19646290b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29296, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29296, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964628380", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29296, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29296, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vb_sda\"" + } + ] + } + ] + }, + { + "id": "0x7f19646291a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29314, + "line": 957, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29327, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x7f1964629170", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29321, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29327, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f591e0", + "kind": "EnumConstantDecl", + "name": "VB_SDA", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462a030", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29339, + "line": 958, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29382, + "line": 959, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f1964629f80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29343, + "line": 958, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29348, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964629f68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29345, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29345, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964629f48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29345, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29345, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646291d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29343, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29343, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964629f30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29348, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29348, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646291f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29348, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29348, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcasc_sfp\"" + } + ] + } + ] + }, + { + "id": "0x7f196462a020", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29369, + "line": 959, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29382, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f1964629ff0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29376, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29382, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59230", + "kind": "EnumConstantDecl", + "name": "VCASC_SFP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462aeb0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29397, + "line": 960, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29440, + "line": 961, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196462ae00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29401, + "line": 960, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29406, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462ade8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29403, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29403, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462adc8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29403, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29403, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462a050", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29401, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29401, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462adb0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29406, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29406, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462a070", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29406, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29406, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vipre_cds\"" + } + ] + } + ] + }, + { + "id": "0x7f196462aea0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29427, + "line": 961, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29440, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196462ae70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29434, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29440, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59280", + "kind": "EnumConstantDecl", + "name": "VIPRE_CDS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462bd30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29455, + "line": 962, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29498, + "line": 963, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196462bc80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29459, + "line": 962, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29464, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462bc68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29461, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29461, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462bc48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29461, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29461, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462aed0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29459, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29459, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462bc30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29464, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29464, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462aef0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29464, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29464, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"ibias_sfp\"" + } + ] + } + ] + }, + { + "id": "0x7f196462bd20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29485, + "line": 963, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29498, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196462bcf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29492, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29498, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f592d0", + "kind": "EnumConstantDecl", + "name": "IBIAS_SFP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462cba0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29513, + "line": 964, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29555, + "line": 965, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x7f196462caf0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29517, + "line": 964, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29522, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462cad8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29519, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29519, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462cab8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29519, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29519, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462bd50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29517, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29517, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462caa0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29522, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 29522, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462bd70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29522, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 29522, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"trimbits\"" + } + ] + } + ] + }, + { + "id": "0x7f196462cb90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29542, + "line": 965, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29555, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x7f196462cb60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29549, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29555, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59690", + "kind": "EnumConstantDecl", + "name": "TRIMBIT_SCAN", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462da20", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29573, + "line": 966, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29618, + "line": 967, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x7f196462d970", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29577, + "line": 966, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29582, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462d958", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29579, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29579, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462d938", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29579, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29579, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462cbc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29577, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29577, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462d920", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29582, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 29582, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462cbe0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29582, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 29582, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"highvoltage\"" + } + ] + } + ] + }, + { + "id": "0x7f196462da10", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29605, + "line": 967, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29618, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x7f196462d9e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29612, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29618, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59370", + "kind": "EnumConstantDecl", + "name": "HIGH_VOLTAGE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462e890", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29636, + "line": 968, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29677, + "line": 969, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f196462e7e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29640, + "line": 968, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29645, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462e7c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29642, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29642, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462e7a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29642, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29642, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462da40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29640, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29640, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462e790", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29645, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 29645, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462da60", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29645, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 29645, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"iodelay\"" + } + ] + } + ] + }, + { + "id": "0x7f196462e880", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29664, + "line": 969, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29677, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f196462e850", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29671, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29677, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58510", + "kind": "EnumConstantDecl", + "name": "IO_DELAY", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462f700", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29691, + "line": 970, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29733, + "line": 971, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196462f650", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29695, + "line": 970, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29700, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462f638", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29697, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29697, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462f618", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29697, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29697, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462e8b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29695, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29695, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462f600", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29700, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 29700, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462e8d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29700, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 29700, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"temp_adc\"" + } + ] + } + ] + }, + { + "id": "0x7f196462f6f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29720, + "line": 971, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29733, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196462f6c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29727, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29733, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f593c0", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_ADC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964630580", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29754, + "line": 972, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29797, + "line": 973, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f19646304d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29758, + "line": 972, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29763, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646304b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29760, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29760, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964630498", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29760, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29760, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462f720", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29758, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29758, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964630480", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29763, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29763, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462f740", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29763, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29763, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_fpga\"" + } + ] + } + ] + }, + { + "id": "0x7f1964630570", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29784, + "line": 973, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29797, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964630540", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29791, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29797, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59410", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_FPGA", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964631400", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29819, + "line": 974, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29865, + "line": 975, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f1964631350", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29823, + "line": 974, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29828, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964631338", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29825, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29825, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964631318", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29825, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29825, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646305a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29823, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29823, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964631300", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29828, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 29828, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646305c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29828, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 29828, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"temp_fpgaext\"" + } + ] + } + ] + }, + { + "id": "0x7f19646313f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29852, + "line": 975, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29865, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f19646313c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29859, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29865, + "col": 22, + "tokLen": 19 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59460", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_FPGAEXT", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964632280", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29890, + "line": 976, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29933, + "line": 977, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f19646321d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29894, + "line": 976, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29899, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646321b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29896, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29896, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964632198", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29896, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29896, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964631420", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29894, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29894, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964632180", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29899, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29899, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964631440", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29899, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29899, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_10ge\"" + } + ] + } + ] + }, + { + "id": "0x7f1964632270", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29920, + "line": 977, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29933, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964632240", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29927, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29933, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f594b0", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_10GE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964633100", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29955, + "line": 978, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29998, + "line": 979, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964633050", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29959, + "line": 978, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29964, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964633038", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29961, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29961, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964633018", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29961, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29961, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646322a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29959, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29959, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964633000", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29964, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29964, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646322c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29964, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29964, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_dcdc\"" + } + ] + } + ] + }, + { + "id": "0x7f19646330f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29985, + "line": 979, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29998, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f19646330c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29992, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29998, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59500", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_DCDC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964633f80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30020, + "line": 980, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30063, + "line": 981, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964633ed0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30024, + "line": 980, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30029, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964633eb8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30026, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30026, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964633e98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30026, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30026, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964633120", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30024, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30024, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964633e80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30029, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 30029, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964633140", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30029, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 30029, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_sodl\"" + } + ] + } + ] + }, + { + "id": "0x7f1964633f70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30050, + "line": 981, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30063, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964633f40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30057, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30063, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59550", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_SODL", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964634e00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30085, + "line": 982, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30128, + "line": 983, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964634d50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30089, + "line": 982, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30094, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964634d38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30091, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30091, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964634d18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30091, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30091, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964633fa0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30089, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30089, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964634d00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30094, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 30094, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964633fc0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30094, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 30094, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_sodr\"" + } + ] + } + ] + }, + { + "id": "0x7f1964634df0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30115, + "line": 983, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30128, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964634dc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30122, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30128, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f595a0", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_SODR", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964635c80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30150, + "line": 984, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30195, + "line": 985, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x7f1964635bd0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30154, + "line": 984, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30159, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964635bb8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30156, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30156, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964635b98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30156, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30156, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964634e20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30154, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30154, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964635b80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30159, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30159, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964634e40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30159, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30159, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"temp_fpgafl\"" + } + ] + } + ] + }, + { + "id": "0x7f1964635c70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30182, + "line": 985, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30195, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x7f1964635c40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30189, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30195, + "col": 22, + "tokLen": 17 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f595f0", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_FPGA2", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964636b00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30218, + "line": 986, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30263, + "line": 987, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x7f1964636a50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30222, + "line": 986, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30227, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964636a38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30224, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30224, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964636a18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30224, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30224, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964635ca0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30222, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30222, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964636a00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30227, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30227, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964635cc0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30227, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30227, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"temp_fpgafr\"" + } + ] + } + ] + }, + { + "id": "0x7f1964636af0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30250, + "line": 987, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30263, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x7f1964636ac0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30257, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30263, + "col": 22, + "tokLen": 17 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59640", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_FPGA3", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964637980", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30286, + "line": 988, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30332, + "line": 989, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x7f19646378d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30290, + "line": 988, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30295, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646378b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30292, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30292, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964637898", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30292, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30292, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964636b20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30290, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30290, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964637880", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30295, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 30295, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964636b40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30295, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 30295, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"temp_slowadc\"" + } + ] + } + ] + }, + { + "id": "0x7f1964637970", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30319, + "line": 989, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30332, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x7f1964637940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30326, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30332, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a060", + "kind": "EnumConstantDecl", + "name": "SLOW_ADC_TEMP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964637f90", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 30351, + "line": 990, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x7f1964637f78", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 30351, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x7f1964637f48", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f1964637f30", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x7f1964637f08", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x7f1964637ee8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x7f1964637ee0", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f1964637eb0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f1964637e98", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x7f1964637e80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x7f1964637e60", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x7f1964637e58", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f1964637e20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964637e08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30391, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 30391, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964637de8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30391, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 30391, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x7f1964637dd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30370, + "col": 24, + "tokLen": 20 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646379b0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30370, + "col": 24, + "tokLen": 20 + } + }, + "type": { + "qualType": "const char[19]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown dac Index \"" + } + ] + }, + { + "id": "0x7f19646379e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30393, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x7f1964638418", + "kind": "FunctionDecl", + "loc": { + "offset": 30428, + "file": "ToString.cpp", + "line": 993, + "col": 29, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 30400, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 30788, + "line": 1003, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368bb58", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs9burstModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::burstMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "inner": [ + { + "id": "0x2f5b1f0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "decl": { + "id": "0x2f5b148", + "kind": "EnumDecl", + "name": "burstMode" + } + } + ] + }, + { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "loc": { + "offset": 30456, + "line": 993, + "col": 57, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 30437, + "col": 38, + "tokLen": 5 + }, + "end": { + "offset": 30456, + "col": 57, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x7f196463c5d8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 30459, + "col": 60, + "tokLen": 1 + }, + "end": { + "offset": 30788, + "line": 1003, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x7f1964639430", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30465, + "line": 994, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30513, + "line": 995, + "col": 22, + "tokLen": 14 + } + }, + "inner": [ + { + "id": "0x7f1964639380", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30469, + "line": 994, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30474, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964639368", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30471, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30471, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964639348", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30471, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30471, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646385d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30469, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30469, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964639330", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30474, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 30474, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646385f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30474, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 30474, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"burst_internal\"" + } + ] + } + ] + }, + { + "id": "0x7f1964639420", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30500, + "line": 995, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30513, + "col": 22, + "tokLen": 14 + } + }, + "inner": [ + { + "id": "0x7f19646393f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30507, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30513, + "col": 22, + "tokLen": 14 + } + }, + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b210", + "kind": "EnumConstantDecl", + "name": "BURST_INTERNAL", + "type": { + "qualType": "slsDetectorDefs::burstMode" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463a2b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30533, + "line": 996, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30581, + "line": 997, + "col": 22, + "tokLen": 14 + } + }, + "inner": [ + { + "id": "0x7f196463a200", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30537, + "line": 996, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30542, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463a1e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30539, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30539, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463a1c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30539, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30539, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964639450", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30537, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30537, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463a1b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30542, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 30542, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964639470", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30542, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 30542, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"burst_external\"" + } + ] + } + ] + }, + { + "id": "0x7f196463a2a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30568, + "line": 997, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30581, + "col": 22, + "tokLen": 14 + } + }, + "inner": [ + { + "id": "0x7f196463a270", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30575, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30581, + "col": 22, + "tokLen": 14 + } + }, + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b260", + "kind": "EnumConstantDecl", + "name": "BURST_EXTERNAL", + "type": { + "qualType": "slsDetectorDefs::burstMode" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463b130", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30601, + "line": 998, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30646, + "line": 999, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f196463b080", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30605, + "line": 998, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30610, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463b068", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30607, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30607, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463b048", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30607, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30607, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463a2d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30605, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30605, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463b030", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30610, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30610, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463a2f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30610, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30610, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"cw_internal\"" + } + ] + } + ] + }, + { + "id": "0x7f196463b120", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30633, + "line": 999, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30646, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f196463b0f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30640, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30646, + "col": 22, + "tokLen": 19 + } + }, + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b2b0", + "kind": "EnumConstantDecl", + "name": "CONTINUOUS_INTERNAL", + "type": { + "qualType": "slsDetectorDefs::burstMode" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463bfb0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30671, + "line": 1000, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30716, + "line": 1001, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f196463bf00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30675, + "line": 1000, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30680, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463bee8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30677, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30677, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463bec8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30677, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30677, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463b150", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30675, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30675, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463beb0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30680, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30680, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463b170", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30680, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30680, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"cw_external\"" + } + ] + } + ] + }, + { + "id": "0x7f196463bfa0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30703, + "line": 1001, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30716, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f196463bf70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30710, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30716, + "col": 22, + "tokLen": 19 + } + }, + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b300", + "kind": "EnumConstantDecl", + "name": "CONTINUOUS_EXTERNAL", + "type": { + "qualType": "slsDetectorDefs::burstMode" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463c5c0", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 30741, + "line": 1002, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x7f196463c5a8", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 30741, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x7f196463c578", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f196463c560", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x7f196463c538", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x7f196463c518", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x7f196463c510", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f196463c4e0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f196463c4c8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x7f196463c4b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x7f196463c490", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x7f196463c488", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f196463c450", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463c438", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30782, + "col": 46, + "tokLen": 1 + }, + "end": { + "offset": 30782, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463c418", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30782, + "col": 46, + "tokLen": 1 + }, + "end": { + "offset": 30782, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x7f196463c400", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30760, + "col": 24, + "tokLen": 21 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463bfe0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30760, + "col": 24, + "tokLen": 21 + } + }, + "type": { + "qualType": "const char[20]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown burst mode \"" + } + ] + }, + { + "id": "0x7f196463c010", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30784, + "col": 48, + "tokLen": 1 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x7f196463c788", + "kind": "FunctionDecl", + "loc": { + "offset": 30826, + "file": "ToString.cpp", + "line": 1005, + "col": 36, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 30791, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 31044, + "line": 1011, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368c078", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs16timingSourceTypeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::timingSourceType (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "inner": [ + { + "id": "0x2f5b470", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "decl": { + "id": "0x2f5b3c8", + "kind": "EnumDecl", + "name": "timingSourceType" + } + } + ] + }, + { + "id": "0x7f196463c6b8", + "kind": "ParmVarDecl", + "loc": { + "offset": 30854, + "line": 1005, + "col": 64, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 30835, + "col": 45, + "tokLen": 5 + }, + "end": { + "offset": 30854, + "col": 64, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x7f196463ec30", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 30857, + "col": 67, + "tokLen": 1 + }, + "end": { + "offset": 31044, + "line": 1011, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x7f196463d790", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30863, + "line": 1006, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30905, + "line": 1007, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196463d6e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30867, + "line": 1006, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30872, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463d6c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30869, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30869, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463d6a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30869, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30869, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463c940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30867, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30867, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463c6b8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463d690", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30872, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 30872, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463c960", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30872, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 30872, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"internal\"" + } + ] + } + ] + }, + { + "id": "0x7f196463d780", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30892, + "line": 1007, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30905, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196463d750", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30899, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30905, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b490", + "kind": "EnumConstantDecl", + "name": "TIMING_INTERNAL", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463e600", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30926, + "line": 1008, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30968, + "line": 1009, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196463e550", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30930, + "line": 1008, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463e538", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30932, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30932, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463e518", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30932, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30932, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463d7b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30930, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30930, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463c6b8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463e500", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30935, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 30935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463d7d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30935, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 30935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"external\"" + } + ] + } + ] + }, + { + "id": "0x7f196463e5f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30955, + "line": 1009, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30968, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196463e5c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30962, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30968, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b4e0", + "kind": "EnumConstantDecl", + "name": "TIMING_EXTERNAL", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463ec18", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 30989, + "line": 1010, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x7f196463ec00", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 30989, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x7f196463ebd0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f196463ebb8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x7f196463eb90", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x7f196463eb70", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x7f196463eb68", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f196463eb38", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f196463eb20", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x7f196463eb08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x7f196463eae8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x7f196463eae0", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f196463eaa8", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463ea90", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31038, + "col": 54, + "tokLen": 1 + }, + "end": { + "offset": 31038, + "col": 54, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463ea70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31038, + "col": 54, + "tokLen": 1 + }, + "end": { + "offset": 31038, + "col": 54, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x7f196463ea58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31008, + "col": 24, + "tokLen": 29 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463e630", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31008, + "col": 24, + "tokLen": 29 + } + }, + "type": { + "qualType": "const char[28]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown timing source type \"" + } + ] + }, + { + "id": "0x7f196463e668", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31040, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463c6b8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x7f196463edd8", + "kind": "FunctionDecl", + "loc": { + "offset": 31077, + "file": "ToString.cpp", + "line": 1013, + "col": 31, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 31047, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 31487, + "line": 1027, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368c598", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs11M3_GainCapsEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::M3_GainCaps (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "inner": [ + { + "id": "0x2f5b5d0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "decl": { + "id": "0x2f5b530", + "kind": "EnumDecl", + "name": "M3_GainCaps" + } + } + ] + }, + { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "loc": { + "offset": 31105, + "line": 1013, + "col": 59, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 31086, + "col": 40, + "tokLen": 5 + }, + "end": { + "offset": 31105, + "col": 59, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x7f1964644c38", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 31108, + "col": 62, + "tokLen": 1 + }, + "end": { + "offset": 31487, + "line": 1027, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x7f196463fde0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31114, + "line": 1014, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31154, + "line": 1015, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196463fd30", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31118, + "line": 1014, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31123, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463fd18", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31120, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31120, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463fcf8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31120, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31120, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463ef90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31118, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31118, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463fce0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31123, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31123, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463efb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31123, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31123, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"C10pre\"" + } + ] + } + ] + }, + { + "id": "0x7f196463fdd0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31141, + "line": 1015, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31154, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196463fda0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31148, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31154, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b670", + "kind": "EnumConstantDecl", + "name": "M3_C10pre", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964640c50", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31169, + "line": 1016, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31208, + "line": 1017, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964640ba0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31173, + "line": 1016, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31178, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964640b88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31175, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31175, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964640b68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31175, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31175, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463fe00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31173, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31173, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964640b50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31178, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31178, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463fe20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31178, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31178, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"C15sh\"" + } + ] + } + ] + }, + { + "id": "0x7f1964640c40", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31195, + "line": 1017, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31208, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964640c10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31202, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31208, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b740", + "kind": "EnumConstantDecl", + "name": "M3_C15sh", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964641ac0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31222, + "line": 1018, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31261, + "line": 1019, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964641a10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31226, + "line": 1018, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31231, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646419f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31228, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31228, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f19646419d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31228, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31228, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964640c70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31226, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31226, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f19646419c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31231, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31231, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964640c90", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31231, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31231, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"C30sh\"" + } + ] + } + ] + }, + { + "id": "0x7f1964641ab0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31248, + "line": 1019, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31261, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964641a80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31255, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31261, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b810", + "kind": "EnumConstantDecl", + "name": "M3_C30sh", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964642930", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31275, + "line": 1020, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31314, + "line": 1021, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964642880", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31279, + "line": 1020, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31284, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964642868", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31281, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31281, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964642848", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31281, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31281, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964641ae0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31279, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31279, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964642830", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31284, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31284, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964641b00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31284, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31284, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"C50sh\"" + } + ] + } + ] + }, + { + "id": "0x7f1964642920", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31301, + "line": 1021, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31314, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f19646428f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31308, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31314, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b8e0", + "kind": "EnumConstantDecl", + "name": "M3_C50sh", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f19646437a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31328, + "line": 1022, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31370, + "line": 1023, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x7f19646436f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31332, + "line": 1022, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31337, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646436d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31334, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31334, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f19646436b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31334, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31334, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964642950", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31332, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31332, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f19646436a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31337, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 31337, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964642970", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31337, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 31337, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"C225ACsh\"" + } + ] + } + ] + }, + { + "id": "0x7f1964643790", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31357, + "line": 1023, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31370, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x7f1964643760", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31364, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31370, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b9b0", + "kind": "EnumConstantDecl", + "name": "M3_C225ACsh", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964644610", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31387, + "line": 1024, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31427, + "line": 1025, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f1964644560", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31391, + "line": 1024, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31396, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964644548", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31393, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31393, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964644528", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31393, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31393, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646437c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31391, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31391, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964644510", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31396, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31396, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646437e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31396, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31396, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"C15pre\"" + } + ] + } + ] + }, + { + "id": "0x7f1964644600", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31414, + "line": 1025, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31427, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f19646445d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31421, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31427, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ba80", + "kind": "EnumConstantDecl", + "name": "M3_C15pre", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964644c20", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 31442, + "line": 1026, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x7f1964644c08", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 31442, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x7f1964644bd8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f1964644bc0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x7f1964644b98", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x7f1964644b78", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x7f1964644b70", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f1964644b40", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f1964644b28", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x7f1964644b10", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x7f1964644af0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x7f1964644ae8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f1964644ab0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964644a98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31481, + "col": 44, + "tokLen": 1 + }, + "end": { + "offset": 31481, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964644a78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31481, + "col": 44, + "tokLen": 1 + }, + "end": { + "offset": 31481, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x7f1964644a60", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31461, + "col": 24, + "tokLen": 19 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964644640", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31461, + "col": 24, + "tokLen": 19 + } + }, + "type": { + "qualType": "const char[18]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown gain cap \"" + } + ] + }, + { + "id": "0x7f1964644670", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31483, + "col": 46, + "tokLen": 1 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x7f1964644df8", + "kind": "FunctionDecl", + "loc": { + "offset": 31521, + "file": "ToString.cpp", + "line": 1029, + "col": 32, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 31490, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 31804, + "line": 1039, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368cab8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs12portPositionEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::portPosition (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "inner": [ + { + "id": "0x2f5bc00", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "decl": { + "id": "0x2f5bb60", + "kind": "EnumDecl", + "name": "portPosition" + } + } + ] + }, + { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "loc": { + "offset": 31549, + "line": 1029, + "col": 60, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 31530, + "col": 41, + "tokLen": 5 + }, + "end": { + "offset": 31549, + "col": 60, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38d70f8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 31552, + "col": 63, + "tokLen": 1 + }, + "end": { + "offset": 31804, + "line": 1039, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x7f1964645e00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31558, + "line": 1030, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31596, + "line": 1031, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x7f1964645d50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31562, + "line": 1030, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31567, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964645d38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31564, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31564, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964645d18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31564, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31564, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964644fb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31562, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31562, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964645d00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31567, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 31567, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964644fd0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31567, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 31567, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"left\"" + } + ] + } + ] + }, + { + "id": "0x7f1964645df0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31583, + "line": 1031, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31596, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x7f1964645dc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31590, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31596, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bc20", + "kind": "EnumConstantDecl", + "name": "LEFT", + "type": { + "qualType": "slsDetectorDefs::portPosition" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964646c70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31606, + "line": 1032, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31645, + "line": 1033, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x7f1964646bc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31610, + "line": 1032, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31615, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964646ba8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31612, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31612, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964646b88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31612, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31612, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964645e20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31610, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31610, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964646b70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31615, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31615, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964645e40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31615, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31615, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"right\"" + } + ] + } + ] + }, + { + "id": "0x7f1964646c60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31632, + "line": 1033, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31645, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x7f1964646c30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31639, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31645, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bc70", + "kind": "EnumConstantDecl", + "name": "RIGHT", + "type": { + "qualType": "slsDetectorDefs::portPosition" + } + } + } + ] + } + ] + }, + { + "id": "0x38d5c60", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31656, + "line": 1034, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31693, + "line": 1035, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38d5bb0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31660, + "line": 1034, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31665, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d5b98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31662, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31662, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d5b78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31662, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31662, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964646c90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31660, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31660, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d5b60", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31665, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 31665, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964646cb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31665, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 31665, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"top\"" + } + ] + } + ] + }, + { + "id": "0x38d5c50", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31680, + "line": 1035, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31693, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38d5c20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31687, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31693, + "col": 22, + "tokLen": 3 + } + }, + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bcc0", + "kind": "EnumConstantDecl", + "name": "TOP", + "type": { + "qualType": "slsDetectorDefs::portPosition" + } + } + } + ] + } + ] + }, + { + "id": "0x38d6ad0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31702, + "line": 1036, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31742, + "line": 1037, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d6a20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31706, + "line": 1036, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31711, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d6a08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31708, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31708, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d69e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31708, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31708, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d5c80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31706, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31706, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d69d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31711, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31711, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d5ca0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31711, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31711, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"bottom\"" + } + ] + } + ] + }, + { + "id": "0x38d6ac0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31729, + "line": 1037, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31742, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d6a90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31736, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31742, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bd10", + "kind": "EnumConstantDecl", + "name": "BOTTOM", + "type": { + "qualType": "slsDetectorDefs::portPosition" + } + } + } + ] + } + ] + }, + { + "id": "0x38d70e0", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 31754, + "line": 1038, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38d70c8", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 31754, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38d7098", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38d7080", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38d7058", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38d7038", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38d7030", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38d7000", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38d6fe8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38d6fd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d6fb0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38d6fa8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38d6f70", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d6f58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31798, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 31798, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d6f38", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31798, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 31798, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38d6f20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31773, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d6b00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31773, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char[23]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown port position \"" + } + ] + }, + { + "id": "0x38d6b30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31800, + "col": 51, + "tokLen": 1 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38d72a8", + "kind": "FunctionDecl", + "loc": { + "offset": 31844, + "file": "ToString.cpp", + "line": 1041, + "col": 38, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 31807, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 32267, + "line": 1052, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368cfd8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18streamingInterfaceEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::streamingInterface (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "inner": [ + { + "id": "0x2f5bf90", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "decl": { + "id": "0x2f5bef0", + "kind": "EnumDecl", + "name": "streamingInterface" + } + } + ] + }, + { + "id": "0x38d71d8", + "kind": "ParmVarDecl", + "loc": { + "offset": 31872, + "line": 1041, + "col": 66, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 31853, + "col": 47, + "tokLen": 5 + }, + "end": { + "offset": 31872, + "col": 66, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38dacc0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 31875, + "col": 69, + "tokLen": 1 + }, + "end": { + "offset": 32267, + "line": 1052, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38d7560", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 31881, + "line": 1042, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 31899, + "col": 23, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38d74a8", + "kind": "VarDecl", + "loc": { + "offset": 31893, + "col": 17, + "tokLen": 2 + }, + "range": { + "begin": { + "offset": 31881, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 31898, + "col": 22, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "init": "c", + "inner": [ + { + "id": "0x38d7530", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31898, + "col": 22, + "tokLen": 1 + }, + "end": { + "offset": 31898, + "col": 22, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::basic_string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38d7510", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31898, + "col": 22, + "tokLen": 1 + }, + "end": { + "offset": 31898, + "col": 22, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d71d8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x38d7ab0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31905, + "line": 1043, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31972, + "line": 1044, + "col": 30, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38d77c0", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 31909, + "line": 1043, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31937, + "col": 37, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38d7650", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 31909, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31919, + "col": 19, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38d7620", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 31909, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31911, + "col": 11, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1fe0", + "inner": [ + { + "id": "0x38d7578", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31909, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31909, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d71d8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38d7608", + "kind": "CharacterLiteral", + "range": { + "begin": { + "offset": 31916, + "col": 16, + "tokLen": 3 + }, + "end": { + "offset": 31916, + "col": 16, + "tokLen": 3 + } + }, + "type": { + "qualType": "char" + }, + "valueCategory": "prvalue", + "value": 44 + }, + { + "id": "0x38d7698", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38d77a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31924, + "col": 24, + "tokLen": 3 + }, + "end": { + "offset": 31937, + "col": 37, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38d7778", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31924, + "col": 24, + "tokLen": 3 + }, + "end": { + "offset": 31937, + "col": 37, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38d7a08", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 31951, + "line": 1044, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31972, + "col": 30, + "tokLen": 1 + } + }, + "type": { + "qualType": "std::basic_string" + }, + "valueCategory": "lvalue", + "inner": [ + { + "id": "0x38d79d8", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 31951, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31954, + "col": 12, + "tokLen": 5 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "erase", + "isArrow": false, + "referencedMemberDecl": "0x2c9ba48", + "inner": [ + { + "id": "0x38d77e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31951, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31951, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + }, + { + "id": "0x38d7940", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 31960, + "col": 18, + "tokLen": 2 + }, + "end": { + "offset": 31971, + "col": 29, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38d7910", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 31960, + "col": 18, + "tokLen": 2 + }, + "end": { + "offset": 31963, + "col": 21, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1fe0", + "inner": [ + { + "id": "0x38d7970", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31960, + "col": 18, + "tokLen": 2 + }, + "end": { + "offset": 31960, + "col": 18, + "tokLen": 2 + } + }, + "type": { + "qualType": "const std::basic_string" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d7868", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31960, + "col": 18, + "tokLen": 2 + }, + "end": { + "offset": 31960, + "col": 18, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + } + ] + }, + { + "id": "0x38d78f8", + "kind": "CharacterLiteral", + "range": { + "begin": { + "offset": 31968, + "col": 26, + "tokLen": 3 + }, + "end": { + "offset": 31968, + "col": 26, + "tokLen": 3 + } + }, + "type": { + "qualType": "char" + }, + "valueCategory": "prvalue", + "value": 44 + }, + { + "id": "0x38d7988", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38d7a90", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + } + ] + }, + { + "id": "0x38d8950", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31979, + "line": 1045, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32038, + "line": 1046, + "col": 42, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38d8888", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31983, + "line": 1045, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31989, + "col": 15, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d8870", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31986, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 31986, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d8850", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31986, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 31986, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d8820", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31983, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31983, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d7ad0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31983, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31983, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + }, + { + "id": "0x38d8838", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31989, + "col": 15, + "tokLen": 6 + }, + "end": { + "offset": 31989, + "col": 15, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d7af0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31989, + "col": 15, + "tokLen": 6 + }, + "end": { + "offset": 31989, + "col": 15, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"none\"" + } + ] + } + ] + }, + { + "id": "0x38d8940", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32005, + "line": 1046, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32038, + "col": 42, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38d8910", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32012, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32038, + "col": 42, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bff0", + "kind": "EnumConstantDecl", + "name": "NONE", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + } + } + } + ] + } + ] + }, + { + "id": "0x38d97f0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32048, + "line": 1047, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32106, + "line": 1048, + "col": 42, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x38d9728", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32052, + "line": 1047, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32058, + "col": 15, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d9710", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32055, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 32055, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d96f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32055, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 32055, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d96c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32052, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32052, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d8970", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32052, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32052, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + }, + { + "id": "0x38d96d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32058, + "col": 15, + "tokLen": 5 + }, + "end": { + "offset": 32058, + "col": 15, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d8990", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32058, + "col": 15, + "tokLen": 5 + }, + "end": { + "offset": 32058, + "col": 15, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"lll\"" + } + ] + } + ] + }, + { + "id": "0x38d97e0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32073, + "line": 1048, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32106, + "col": 42, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x38d97b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32080, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32106, + "col": 42, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c0c0", + "kind": "EnumConstantDecl", + "name": "LOW_LATENCY_LINK", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + } + } + } + ] + } + ] + }, + { + "id": "0x38da690", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32128, + "line": 1049, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32188, + "line": 1050, + "col": 42, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x38da5c8", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32132, + "line": 1049, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32138, + "col": 15, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38da5b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32135, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 32135, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38da590", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32135, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 32135, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38da560", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32132, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32132, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d9810", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32132, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32132, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + }, + { + "id": "0x38da578", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32138, + "col": 15, + "tokLen": 7 + }, + "end": { + "offset": 32138, + "col": 15, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d9830", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32138, + "col": 15, + "tokLen": 7 + }, + "end": { + "offset": 32138, + "col": 15, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"10gbe\"" + } + ] + } + ] + }, + { + "id": "0x38da680", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32155, + "line": 1050, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32188, + "col": 42, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x38da650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32162, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32188, + "col": 42, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c190", + "kind": "EnumConstantDecl", + "name": "ETHERNET_10GB", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + } + } + } + ] + } + ] + }, + { + "id": "0x38daca8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 32207, + "line": 1051, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38dac90", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 32207, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38dac60", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38dac48", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38dac20", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38dac00", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38dabf8", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38dabc8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38dabb0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38dab98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38dab78", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38dab70", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38dab38", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38dab20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32261, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 32261, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38dab00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32261, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 32261, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38daae8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32226, + "col": 24, + "tokLen": 34 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38da6c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32226, + "col": 24, + "tokLen": 34 + } + }, + "type": { + "qualType": "const char[33]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown streamingInterface type \"" + } + ] + }, + { + "id": "0x38da6f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32263, + "col": 61, + "tokLen": 1 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d71d8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38dae78", + "kind": "FunctionDecl", + "loc": { + "offset": 32302, + "file": "ToString.cpp", + "line": 1054, + "col": 33, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 32270, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 32492, + "line": 1060, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368d4f8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs13vetoAlgorithmEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::vetoAlgorithm (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "inner": [ + { + "id": "0x2f5c350", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "decl": { + "id": "0x2f5c2b0", + "kind": "EnumDecl", + "name": "vetoAlgorithm" + } + } + ] + }, + { + "id": "0x38dada8", + "kind": "ParmVarDecl", + "loc": { + "offset": 32330, + "line": 1054, + "col": 61, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 32311, + "col": 42, + "tokLen": 5 + }, + "end": { + "offset": 32330, + "col": 61, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38dd318", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 32333, + "col": 64, + "tokLen": 1 + }, + "end": { + "offset": 32492, + "line": 1060, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38dbe80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32339, + "line": 1055, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32377, + "line": 1056, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38dbdd0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32343, + "line": 1055, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32348, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38dbdb8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32345, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32345, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38dbd98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32345, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32345, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38db030", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32343, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32343, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dada8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38dbd80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32348, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 32348, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38db050", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32348, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 32348, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"hits\"" + } + ] + } + ] + }, + { + "id": "0x38dbe70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32364, + "line": 1056, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32377, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38dbe40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32371, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32377, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c370", + "kind": "EnumConstantDecl", + "name": "ALG_HITS", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + } + } + } + ] + } + ] + }, + { + "id": "0x38dccf0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32391, + "line": 1057, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32428, + "line": 1058, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38dcc40", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32395, + "line": 1057, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32400, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38dcc28", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32397, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32397, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38dcc08", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32397, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32397, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38dbea0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32395, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32395, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dada8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38dcbf0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32400, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 32400, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38dbec0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32400, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 32400, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"raw\"" + } + ] + } + ] + }, + { + "id": "0x38dcce0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32415, + "line": 1058, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32428, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38dccb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32422, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32428, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c3c0", + "kind": "EnumConstantDecl", + "name": "ALG_RAW", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + } + } + } + ] + } + ] + }, + { + "id": "0x38dd300", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 32441, + "line": 1059, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38dd2e8", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 32441, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38dd2b8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38dd2a0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38dd278", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38dd258", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38dd250", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38dd220", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38dd208", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38dd1f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38dd1d0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38dd1c8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38dd190", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38dd178", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32486, + "col": 50, + "tokLen": 1 + }, + "end": { + "offset": 32486, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38dd158", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32486, + "col": 50, + "tokLen": 1 + }, + "end": { + "offset": 32486, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38dd140", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32460, + "col": 24, + "tokLen": 25 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38dcd20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32460, + "col": 24, + "tokLen": 25 + } + }, + "type": { + "qualType": "const char[24]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown veto algorithm \"" + } + ] + }, + { + "id": "0x38dcd50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32488, + "col": 52, + "tokLen": 1 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dada8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38dd4b8", + "kind": "FunctionDecl", + "loc": { + "offset": 32522, + "file": "ToString.cpp", + "line": 1062, + "col": 28, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 32495, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 32948, + "line": 1076, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368da18", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8gainModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::gainMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "inner": [ + { + "id": "0x2f5c4b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "decl": { + "id": "0x2f5c410", + "kind": "EnumDecl", + "name": "gainMode" + } + } + ] + }, + { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "loc": { + "offset": 32550, + "line": 1062, + "col": 56, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 32531, + "col": 37, + "tokLen": 5 + }, + "end": { + "offset": 32550, + "col": 56, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e3338", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 32553, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 32948, + "line": 1076, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38de4c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32559, + "line": 1063, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32600, + "line": 1064, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38de410", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32563, + "line": 1063, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38de3f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32565, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32565, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38de3d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32565, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32565, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38dd670", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32563, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32563, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38de3c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32568, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 32568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38dd690", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32568, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 32568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"dynamic\"" + } + ] + } + ] + }, + { + "id": "0x38de4b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32587, + "line": 1064, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32600, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38de480", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32594, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32600, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c4d0", + "kind": "EnumConstantDecl", + "name": "DYNAMIC", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38df340", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32613, + "line": 1065, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32660, + "line": 1066, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x38df290", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32617, + "line": 1065, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32622, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38df278", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32619, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32619, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38df258", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32619, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32619, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38de4e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32617, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32617, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38df240", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32622, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 32622, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38de500", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32622, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 32622, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"forceswitchg1\"" + } + ] + } + ] + }, + { + "id": "0x38df330", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32647, + "line": 1066, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32660, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x38df300", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32654, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32660, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c520", + "kind": "EnumConstantDecl", + "name": "FORCE_SWITCH_G1", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e01c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32681, + "line": 1067, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32728, + "line": 1068, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x38e0110", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32685, + "line": 1067, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32690, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e00f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32687, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32687, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e00d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32687, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32687, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38df360", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32685, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32685, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e00c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32690, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 32690, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38df380", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32690, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 32690, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"forceswitchg2\"" + } + ] + } + ] + }, + { + "id": "0x38e01b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32715, + "line": 1068, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32728, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x38e0180", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32722, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32728, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c570", + "kind": "EnumConstantDecl", + "name": "FORCE_SWITCH_G2", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e1030", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32749, + "line": 1069, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32788, + "line": 1070, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e0f80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32753, + "line": 1069, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32758, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e0f68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32755, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32755, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e0f48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32755, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32755, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e01e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32753, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32753, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e0f30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32758, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32758, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e0200", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32758, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32758, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"fixg1\"" + } + ] + } + ] + }, + { + "id": "0x38e1020", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32775, + "line": 1070, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32788, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e0ff0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32782, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32788, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c5c0", + "kind": "EnumConstantDecl", + "name": "FIX_G1", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e1ea0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32800, + "line": 1071, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32839, + "line": 1072, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e1df0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32804, + "line": 1071, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32809, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e1dd8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32806, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32806, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e1db8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32806, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32806, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e1050", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32804, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32804, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e1da0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32809, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32809, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e1070", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32809, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32809, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"fixg2\"" + } + ] + } + ] + }, + { + "id": "0x38e1e90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32826, + "line": 1072, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32839, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e1e60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32833, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32839, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c610", + "kind": "EnumConstantDecl", + "name": "FIX_G2", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e2d10", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32851, + "line": 1073, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32890, + "line": 1074, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e2c60", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32855, + "line": 1073, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32860, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e2c48", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32857, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32857, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e2c28", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32857, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32857, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e1ec0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32855, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32855, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e2c10", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32860, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32860, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e1ee0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32860, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32860, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"fixg0\"" + } + ] + } + ] + }, + { + "id": "0x38e2d00", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32877, + "line": 1074, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32890, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e2cd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32884, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32890, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c660", + "kind": "EnumConstantDecl", + "name": "FIX_G0", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e3320", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 32902, + "line": 1075, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38e3308", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 32902, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e32d8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e32c0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38e3298", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38e3278", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38e3270", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e3240", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e3228", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38e3210", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38e31f0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38e31e8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e31b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e3198", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32942, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 32942, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e3178", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32942, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 32942, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38e3160", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32921, + "col": 24, + "tokLen": 20 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e2d40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32921, + "col": 24, + "tokLen": 20 + } + }, + "type": { + "qualType": "const char[19]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown gain mode \"" + } + ] + }, + { + "id": "0x38e2d70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32944, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38e34f8", + "kind": "FunctionDecl", + "loc": { + "offset": 32978, + "file": "ToString.cpp", + "line": 1078, + "col": 28, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 32951, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33167, + "line": 1084, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368df38", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8polarityEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::polarity (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "inner": [ + { + "id": "0x2f5c750", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "decl": { + "id": "0x2f5c6b0", + "kind": "EnumDecl", + "name": "polarity" + } + } + ] + }, + { + "id": "0x38e3428", + "kind": "ParmVarDecl", + "loc": { + "offset": 33006, + "line": 1078, + "col": 56, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 32987, + "col": 37, + "tokLen": 5 + }, + "end": { + "offset": 33006, + "col": 56, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e5998", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33009, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 33167, + "line": 1084, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e4500", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 33015, + "line": 1079, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 33052, + "line": 1080, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38e4450", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 33019, + "line": 1079, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 33024, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e4438", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33021, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 33021, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e4418", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33021, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 33021, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e36b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33019, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 33019, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e3428", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e4400", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33024, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 33024, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e36d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33024, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 33024, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"pos\"" + } + ] + } + ] + }, + { + "id": "0x38e44f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33039, + "line": 1080, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 33052, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38e44c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33046, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 33052, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c770", + "kind": "EnumConstantDecl", + "name": "POSITIVE", + "type": { + "qualType": "slsDetectorDefs::polarity" + } + } + } + ] + } + ] + }, + { + "id": "0x38e5370", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 33066, + "line": 1081, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 33103, + "line": 1082, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38e52c0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 33070, + "line": 1081, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 33075, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e52a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33072, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 33072, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e5288", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33072, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 33072, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e4520", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33070, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 33070, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e3428", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e5270", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33075, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 33075, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e4540", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33075, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 33075, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"neg\"" + } + ] + } + ] + }, + { + "id": "0x38e5360", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33090, + "line": 1082, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 33103, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38e5330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33097, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 33103, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c7c0", + "kind": "EnumConstantDecl", + "name": "NEGATIVE", + "type": { + "qualType": "slsDetectorDefs::polarity" + } + } + } + ] + } + ] + }, + { + "id": "0x38e5980", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 33117, + "line": 1083, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38e5968", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 33117, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e5938", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e5920", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38e58f8", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38e58d8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38e58d0", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e58a0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e5888", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38e5870", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38e5850", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38e5848", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e5810", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e57f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33161, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 33161, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e57d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33161, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 33161, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38e57c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33136, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e53a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33136, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char[23]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown polarity mode \"" + } + ] + }, + { + "id": "0x38e53d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33163, + "col": 51, + "tokLen": 1 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e3428", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38e5ae8", + "kind": "FunctionDecl", + "loc": { + "offset": 33191, + "file": "ToString.cpp", + "line": 1086, + "col": 22, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33170, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33325, + "line": 1089, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368e408", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIjEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "uint32_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "unsigned int" + }, + "inner": [ + { + "id": "0x230bbd0", + "kind": "BuiltinType", + "type": { + "qualType": "unsigned int" + } + } + ] + }, + { + "id": "0x38e5a28", + "kind": "ParmVarDecl", + "loc": { + "offset": 33219, + "line": 1086, + "col": 50, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33200, + "col": 31, + "tokLen": 5 + }, + "end": { + "offset": 33219, + "col": 50, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e61b0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33222, + "col": 53, + "tokLen": 1 + }, + "end": { + "offset": 33325, + "line": 1089, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e5fa0", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33228, + "line": 1087, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33282, + "col": 59, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e5c88", + "kind": "VarDecl", + "loc": { + "offset": 33232, + "col": 9, + "tokLen": 4 + }, + "range": { + "begin": { + "offset": 33228, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33280, + "col": 57, + "tokLen": 2 + } + }, + "isUsed": true, + "name": "base", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e5f70", + "kind": "ConditionalOperator", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33280, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e5f10", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33268, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38e5dd0", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33250, + "col": 27, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e5da0", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33241, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1d70", + "inner": [ + { + "id": "0x38e5cf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33239, + "col": 16, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e5a28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38e5e00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33246, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33246, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e5d80", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33246, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33246, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"0x\"" + } + ] + }, + { + "id": "0x38e5e30", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e5ef8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33255, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33268, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e5ec8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33255, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33268, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38e5f30", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33275, + "col": 52, + "tokLen": 2 + }, + "end": { + "offset": 33275, + "col": 52, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "16" + }, + { + "id": "0x38e5f50", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33280, + "col": 57, + "tokLen": 2 + }, + "end": { + "offset": 33280, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e61a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33288, + "line": 1088, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 33322, + "col": 39, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6188", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33295, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33322, + "col": 39, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned int", + "qualType": "uint32_t", + "typeAliasDeclId": "0x23ae7f8" + }, + "valueCategory": "prvalue", + "castKind": "IntegralCast", + "inner": [ + { + "id": "0x38e6120", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 33295, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33322, + "col": 39, + "tokLen": 1 + } + }, + "type": { + "qualType": "unsigned long" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e6108", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33295, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33300, + "col": 17, + "tokLen": 5 + } + }, + "type": { + "qualType": "unsigned long (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e6078", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33295, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33300, + "col": 17, + "tokLen": 5 + } + }, + "type": { + "qualType": "unsigned long (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2ca8d40", + "kind": "FunctionDecl", + "name": "stoul", + "type": { + "qualType": "unsigned long (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e6028", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33306, + "col": 23, + "tokLen": 1 + }, + "end": { + "offset": 33306, + "col": 23, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e5a28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e6158", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33309, + "col": 26, + "tokLen": 7 + }, + "end": { + "offset": 33309, + "col": 26, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e6048", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 33309, + "col": 26, + "tokLen": 7 + }, + "end": { + "offset": 33309, + "col": 26, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e6170", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33318, + "col": 35, + "tokLen": 4 + }, + "end": { + "offset": 33318, + "col": 35, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e6058", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33318, + "col": 35, + "tokLen": 4 + }, + "end": { + "offset": 33318, + "col": 35, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e5c88", + "kind": "VarDecl", + "name": "base", + "type": { + "qualType": "int" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38e62f8", + "kind": "FunctionDecl", + "loc": { + "offset": 33349, + "file": "ToString.cpp", + "line": 1091, + "col": 22, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33328, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33484, + "line": 1094, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368e8a8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToImEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "uint64_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "unsigned long" + }, + "inner": [ + { + "id": "0x230bbf0", + "kind": "BuiltinType", + "type": { + "qualType": "unsigned long" + } + } + ] + }, + { + "id": "0x38e6238", + "kind": "ParmVarDecl", + "loc": { + "offset": 33377, + "line": 1091, + "col": 50, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33358, + "col": 31, + "tokLen": 5 + }, + "end": { + "offset": 33377, + "col": 50, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e69a0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33380, + "col": 53, + "tokLen": 1 + }, + "end": { + "offset": 33484, + "line": 1094, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6798", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33386, + "line": 1092, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33440, + "col": 59, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6498", + "kind": "VarDecl", + "loc": { + "offset": 33390, + "col": 9, + "tokLen": 4 + }, + "range": { + "begin": { + "offset": 33386, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33438, + "col": 57, + "tokLen": 2 + } + }, + "isUsed": true, + "name": "base", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e6768", + "kind": "ConditionalOperator", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33438, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e6708", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33426, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38e65e0", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33408, + "col": 27, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e65b0", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33399, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1d70", + "inner": [ + { + "id": "0x38e6500", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33397, + "col": 16, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6238", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38e6610", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33404, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33404, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e6590", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33404, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33404, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"0x\"" + } + ] + }, + { + "id": "0x38e6628", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e66f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33413, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33426, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e66c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33413, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33426, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38e6728", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33433, + "col": 52, + "tokLen": 2 + }, + "end": { + "offset": 33433, + "col": 52, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "16" + }, + { + "id": "0x38e6748", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33438, + "col": 57, + "tokLen": 2 + }, + "end": { + "offset": 33438, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e6990", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33446, + "line": 1093, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 33481, + "col": 40, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6978", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33453, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33481, + "col": 40, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "uint64_t", + "typeAliasDeclId": "0x23ae860" + }, + "valueCategory": "prvalue", + "castKind": "IntegralCast", + "inner": [ + { + "id": "0x38e6910", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 33453, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33481, + "col": 40, + "tokLen": 1 + } + }, + "type": { + "qualType": "unsigned long long" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e68f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33453, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33458, + "col": 17, + "tokLen": 6 + } + }, + "type": { + "qualType": "unsigned long long (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e6870", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33453, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33458, + "col": 17, + "tokLen": 6 + } + }, + "type": { + "qualType": "unsigned long long (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2caac00", + "kind": "FunctionDecl", + "name": "stoull", + "type": { + "qualType": "unsigned long long (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e6820", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33465, + "col": 24, + "tokLen": 1 + }, + "end": { + "offset": 33465, + "col": 24, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6238", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e6948", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33468, + "col": 27, + "tokLen": 7 + }, + "end": { + "offset": 33468, + "col": 27, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e6840", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 33468, + "col": 27, + "tokLen": 7 + }, + "end": { + "offset": 33468, + "col": 27, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e6960", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33477, + "col": 36, + "tokLen": 4 + }, + "end": { + "offset": 33477, + "col": 36, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e6850", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33477, + "col": 36, + "tokLen": 4 + }, + "end": { + "offset": 33477, + "col": 36, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6498", + "kind": "VarDecl", + "name": "base", + "type": { + "qualType": "int" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38e6af0", + "kind": "FunctionDecl", + "loc": { + "offset": 33503, + "file": "ToString.cpp", + "line": 1096, + "col": 17, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33487, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33636, + "line": 1099, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368ed50", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIiEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "int (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "int" + }, + "inner": [ + { + "id": "0x230bb30", + "kind": "BuiltinType", + "type": { + "qualType": "int" + } + } + ] + }, + { + "id": "0x38e6a28", + "kind": "ParmVarDecl", + "loc": { + "offset": 33531, + "line": 1096, + "col": 45, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33512, + "col": 26, + "tokLen": 5 + }, + "end": { + "offset": 33531, + "col": 45, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e7188", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33534, + "col": 48, + "tokLen": 1 + }, + "end": { + "offset": 33636, + "line": 1099, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6f98", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33540, + "line": 1097, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33594, + "col": 59, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6c98", + "kind": "VarDecl", + "loc": { + "offset": 33544, + "col": 9, + "tokLen": 4 + }, + "range": { + "begin": { + "offset": 33540, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33592, + "col": 57, + "tokLen": 2 + } + }, + "isUsed": true, + "name": "base", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e6f68", + "kind": "ConditionalOperator", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33592, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e6f08", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33580, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38e6de0", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33562, + "col": 27, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e6db0", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33553, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1d70", + "inner": [ + { + "id": "0x38e6d00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33551, + "col": 16, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6a28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38e6e10", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33558, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33558, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e6d90", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33558, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33558, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"0x\"" + } + ] + }, + { + "id": "0x38e6e28", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e6ef0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33567, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33580, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e6ec0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33567, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33580, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38e6f28", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33587, + "col": 52, + "tokLen": 2 + }, + "end": { + "offset": 33587, + "col": 52, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "16" + }, + { + "id": "0x38e6f48", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33592, + "col": 57, + "tokLen": 2 + }, + "end": { + "offset": 33592, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e7178", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33600, + "line": 1098, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 33633, + "col": 38, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7110", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 33607, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33633, + "col": 38, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e70f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33607, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33612, + "col": 17, + "tokLen": 4 + } + }, + "type": { + "qualType": "int (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e7070", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33607, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33612, + "col": 17, + "tokLen": 4 + } + }, + "type": { + "qualType": "int (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2c76400", + "kind": "FunctionDecl", + "name": "stoi", + "type": { + "qualType": "int (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e7020", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33617, + "col": 22, + "tokLen": 1 + }, + "end": { + "offset": 33617, + "col": 22, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6a28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e7148", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33620, + "col": 25, + "tokLen": 7 + }, + "end": { + "offset": 33620, + "col": 25, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e7040", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 33620, + "col": 25, + "tokLen": 7 + }, + "end": { + "offset": 33620, + "col": 25, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e7160", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33629, + "col": 34, + "tokLen": 4 + }, + "end": { + "offset": 33629, + "col": 34, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e7050", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33629, + "col": 34, + "tokLen": 4 + }, + "end": { + "offset": 33629, + "col": 34, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6c98", + "kind": "VarDecl", + "name": "base", + "type": { + "qualType": "int" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38e72d8", + "kind": "FunctionDecl", + "loc": { + "offset": 33656, + "file": "ToString.cpp", + "line": 1101, + "col": 18, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33639, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33900, + "line": 1111, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368f1c8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIbEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "bool (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "bool" + }, + "inner": [ + { + "id": "0x230bab0", + "kind": "BuiltinType", + "type": { + "qualType": "bool" + } + } + ] + }, + { + "id": "0x38e7210", + "kind": "ParmVarDecl", + "loc": { + "offset": 33684, + "line": 1101, + "col": 46, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33665, + "col": 27, + "tokLen": 5 + }, + "end": { + "offset": 33684, + "col": 46, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e79e0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33687, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 33900, + "line": 1111, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7638", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33693, + "line": 1102, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33726, + "col": 38, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7478", + "kind": "VarDecl", + "loc": { + "offset": 33697, + "col": 9, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33693, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33725, + "col": 37, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "i", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e75e8", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 33701, + "col": 13, + "tokLen": 3 + }, + "end": { + "offset": 33725, + "col": 37, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e75d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33701, + "col": 13, + "tokLen": 3 + }, + "end": { + "offset": 33706, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "int (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e75a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33701, + "col": 13, + "tokLen": 3 + }, + "end": { + "offset": 33706, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "int (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2c76400", + "kind": "FunctionDecl", + "name": "stoi", + "type": { + "qualType": "int (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e7550", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33711, + "col": 23, + "tokLen": 1 + }, + "end": { + "offset": 33711, + "col": 23, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7210", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e7620", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33714, + "col": 26, + "tokLen": 7 + }, + "end": { + "offset": 33714, + "col": 26, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e7570", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 33714, + "col": 26, + "tokLen": 7 + }, + "end": { + "offset": 33714, + "col": 26, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e7580", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33723, + "col": 35, + "tokLen": 2 + }, + "end": { + "offset": 33723, + "col": 35, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e7688", + "kind": "SwitchStmt", + "range": { + "begin": { + "offset": 33732, + "line": 1103, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 33898, + "line": 1110, + "col": 5, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7670", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33740, + "line": 1103, + "col": 13, + "tokLen": 1 + }, + "end": { + "offset": 33740, + "col": 13, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e7650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33740, + "col": 13, + "tokLen": 1 + }, + "end": { + "offset": 33740, + "col": 13, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7478", + "kind": "VarDecl", + "name": "i", + "type": { + "qualType": "int" + } + } + } + ] + }, + { + "id": "0x38e79b8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33743, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33898, + "line": 1110, + "col": 5, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e76f0", + "kind": "CaseStmt", + "range": { + "begin": { + "offset": 33749, + "line": 1104, + "col": 5, + "tokLen": 4 + }, + "end": { + "offset": 33772, + "line": 1105, + "col": 16, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38e76d0", + "kind": "ConstantExpr", + "range": { + "begin": { + "offset": 33754, + "line": 1104, + "col": 10, + "tokLen": 1 + }, + "end": { + "offset": 33754, + "col": 10, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "0", + "inner": [ + { + "id": "0x38e76b0", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33754, + "col": 10, + "tokLen": 1 + }, + "end": { + "offset": 33754, + "col": 10, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "0" + } + ] + }, + { + "id": "0x38e7728", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33765, + "line": 1105, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 33772, + "col": 16, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38e7718", + "kind": "CXXBoolLiteralExpr", + "range": { + "begin": { + "offset": 33772, + "col": 16, + "tokLen": 5 + }, + "end": { + "offset": 33772, + "col": 16, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "value": false + } + ] + } + ] + }, + { + "id": "0x38e7778", + "kind": "CaseStmt", + "range": { + "begin": { + "offset": 33783, + "line": 1106, + "col": 5, + "tokLen": 4 + }, + "end": { + "offset": 33806, + "line": 1107, + "col": 16, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38e7758", + "kind": "ConstantExpr", + "range": { + "begin": { + "offset": 33788, + "line": 1106, + "col": 10, + "tokLen": 1 + }, + "end": { + "offset": 33788, + "col": 10, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "1", + "inner": [ + { + "id": "0x38e7738", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33788, + "col": 10, + "tokLen": 1 + }, + "end": { + "offset": 33788, + "col": 10, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "1" + } + ] + }, + { + "id": "0x38e77b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33799, + "line": 1107, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 33806, + "col": 16, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38e77a0", + "kind": "CXXBoolLiteralExpr", + "range": { + "begin": { + "offset": 33806, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 33806, + "col": 16, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "value": true + } + ] + } + ] + }, + { + "id": "0x38e7998", + "kind": "DefaultStmt", + "range": { + "begin": { + "offset": 33816, + "line": 1108, + "col": 5, + "tokLen": 7 + }, + "end": { + "offset": 33891, + "line": 1109, + "col": 67, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7980", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 33833, + "col": 9, + "tokLen": 5 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38e7968", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 33833, + "col": 9, + "tokLen": 5 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e7938", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e7920", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38e78f8", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da84b8", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const char *)" + } + }, + "inner": [ + { + "id": "0x38e78d8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38e78d0", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e78a0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const char *)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e7888", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33852, + "col": 28, + "tokLen": 39 + }, + "end": { + "offset": 33852, + "col": 28, + "tokLen": 39 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e7848", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33852, + "col": 28, + "tokLen": 39 + }, + "end": { + "offset": 33852, + "col": 28, + "tokLen": 39 + } + }, + "type": { + "qualType": "const char[38]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown boolean. Expecting be 0 or 1.\"" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +} +{ + "id": "0x38e7b28", + "kind": "FunctionDecl", + "loc": { + "offset": 33923, + "file": "ToString.cpp", + "line": 1113, + "col": 21, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33903, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 34056, + "line": 1116, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368f668", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIlEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "int64_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "long" + }, + "inner": [ + { + "id": "0x230bb50", + "kind": "BuiltinType", + "type": { + "qualType": "long" + } + } + ] + }, + { + "id": "0x38e7a68", + "kind": "ParmVarDecl", + "loc": { + "offset": 33951, + "line": 1113, + "col": 49, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33932, + "col": 30, + "tokLen": 5 + }, + "end": { + "offset": 33951, + "col": 49, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e81b8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33954, + "col": 52, + "tokLen": 1 + }, + "end": { + "offset": 34056, + "line": 1116, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7fc8", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33960, + "line": 1114, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 34014, + "col": 59, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7cc8", + "kind": "VarDecl", + "loc": { + "offset": 33964, + "col": 9, + "tokLen": 4 + }, + "range": { + "begin": { + "offset": 33960, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 34012, + "col": 57, + "tokLen": 2 + } + }, + "isUsed": true, + "name": "base", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e7f98", + "kind": "ConditionalOperator", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 34012, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e7f38", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 34000, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38e7e10", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33982, + "col": 27, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e7de0", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33973, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1d70", + "inner": [ + { + "id": "0x38e7d30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33971, + "col": 16, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7a68", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38e7e40", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33978, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33978, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e7dc0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33978, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33978, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"0x\"" + } + ] + }, + { + "id": "0x38e7e58", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e7f20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33987, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 34000, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e7ef0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33987, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 34000, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38e7f58", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 34007, + "col": 52, + "tokLen": 2 + }, + "end": { + "offset": 34007, + "col": 52, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "16" + }, + { + "id": "0x38e7f78", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 34012, + "col": 57, + "tokLen": 2 + }, + "end": { + "offset": 34012, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e81a8", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 34020, + "line": 1115, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 34053, + "col": 38, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e8140", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 34027, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 34053, + "col": 38, + "tokLen": 1 + } + }, + "type": { + "qualType": "long" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e8128", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 34027, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 34032, + "col": 17, + "tokLen": 4 + } + }, + "type": { + "qualType": "long (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e80a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 34027, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 34032, + "col": 17, + "tokLen": 4 + } + }, + "type": { + "qualType": "long (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2ca7f70", + "kind": "FunctionDecl", + "name": "stol", + "type": { + "qualType": "long (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e8050", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 34037, + "col": 22, + "tokLen": 1 + }, + "end": { + "offset": 34037, + "col": 22, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7a68", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e8178", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 34040, + "col": 25, + "tokLen": 7 + }, + "end": { + "offset": 34040, + "col": 25, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e8070", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 34040, + "col": 25, + "tokLen": 7 + }, + "end": { + "offset": 34040, + "col": 25, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e8190", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 34049, + "col": 34, + "tokLen": 4 + }, + "end": { + "offset": 34049, + "col": 34, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e8080", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 34049, + "col": 34, + "tokLen": 4 + }, + "end": { + "offset": 34049, + "col": 34, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7cc8", + "kind": "VarDecl", + "name": "base", + "type": { + "qualType": "int" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] +} diff --git a/slsDetectorSoftware/generator/autocomplete/fixed.json b/slsDetectorSoftware/generator/autocomplete/fixed.json new file mode 100644 index 000000000..441d25449 --- /dev/null +++ b/slsDetectorSoftware/generator/autocomplete/fixed.json @@ -0,0 +1,62037 @@ +[ +{ + "id": "0x3654da8", + "kind": "FunctionTemplateDecl", + "loc": { + "offset": 8539, + "file": "../include/sls/ToString.h", + "line": 271, + "col": 3, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8515, + "line": 270, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9380, + "line": 293, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "inner": [ + { + "id": "0x3654a48", + "kind": "TemplateTypeParmDecl", + "loc": { + "offset": 8534, + "line": 270, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8525, + "col": 11, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8534, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "T", + "tagUsed": "typename", + "depth": 0, + "index": 0 + }, + { + "id": "0x3654d08", + "kind": "FunctionDecl", + "loc": { + "offset": 8539, + "line": 271, + "col": 3, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8537, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9380, + "line": 293, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "type": { + "qualType": "T (const std::string &, const std::string &)" + }, + "inner": [ + { + "id": "0x3654b38", + "kind": "ParmVarDecl", + "loc": { + "offset": 8567, + "line": 271, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8548, + "col": 12, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8567, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "t", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "loc": { + "offset": 8589, + "col": 53, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8570, + "col": 34, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8589, + "col": 53, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "unit", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3687658", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8595, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9380, + "line": 293, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3654fe0", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 8601, + "line": 272, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8615, + "col": 19, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3654ea0", + "kind": "VarDecl", + "loc": { + "offset": 8608, + "col": 12, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8601, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8614, + "col": 18, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "tval", + "type": { + "qualType": "double" + }, + "init": "list", + "inner": [ + { + "id": "0x3654f80", + "kind": "InitListExpr", + "range": { + "begin": { + "offset": 8612, + "col": 16, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8614, + "col": 18, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3654fc0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8613, + "col": 17, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8613, + "col": 17, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "prvalue", + "castKind": "IntegralToFloating", + "inner": [ + { + "id": "0x3654f08", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 8613, + "col": 17, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8613, + "col": 17, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "0" + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3655488", + "kind": "CXXTryStmt", + "range": { + "begin": { + "offset": 8621, + "line": 273, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8771, + "line": 277, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36551c0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8625, + "line": 273, + "col": 9, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8660, + "line": 275, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36551a0", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 8635, + "line": 274, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8653, + "col": 27, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "opcode": "=", + "inner": [ + { + "id": "0x3654ff8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8635, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8635, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + }, + { + "id": "0x3655150", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 8642, + "col": 16, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8653, + "col": 27, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3655138", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8642, + "col": 16, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8647, + "col": 21, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double (*)(const std::string &, std::size_t *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36550a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8642, + "col": 16, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8647, + "col": 21, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double (const std::string &, std::size_t *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2caf050", + "kind": "FunctionDecl", + "name": "stod", + "type": { + "qualType": "double (const std::string &, std::size_t *)" + } + } + } + ] + }, + { + "id": "0x3655088", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8652, + "col": 26, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8652, + "col": 26, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654b38", + "kind": "ParmVarDecl", + "name": "t", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3655180", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue" + } + ] + } + ] + } + ] + }, + { + "id": "0x3655468", + "kind": "CXXCatchStmt", + "range": { + "begin": { + "offset": 8662, + "line": 275, + "col": 7, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8771, + "line": 277, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3655290", + "kind": "VarDecl", + "loc": { + "offset": 8698, + "line": 275, + "col": 43, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8669, + "col": 14, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8698, + "col": 43, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "e", + "type": { + "qualType": "const std::invalid_argument &" + } + }, + { + "id": "0x3655450", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8701, + "col": 46, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8771, + "line": 277, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3655438", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 8711, + "line": 276, + "col": 9, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3655420", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 8711, + "col": 9, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36553f0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x36553d8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x36553b0", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da84b8", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const char *)" + } + }, + "inner": [ + { + "id": "0x3655390", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3655388", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3655358", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 8717, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8764, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const char *)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3655340", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8730, + "col": 28, + "tokLen": 34, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8730, + "col": 28, + "tokLen": 34, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3655308", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 8730, + "col": 28, + "tokLen": 34, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8730, + "col": 28, + "tokLen": 34, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[33]" + }, + "valueCategory": "lvalue", + "value": "\"Could not convert string to time\"" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3655560", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 8778, + "line": 279, + "col": 5, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8805, + "col": 32, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36554b8", + "kind": "UsingDecl", + "loc": { + "offset": 8797, + "col": 24, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8778, + "col": 5, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8797, + "col": 24, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "std::chrono::duration" + } + ] + }, + { + "id": "0x3655630", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 8811, + "line": 280, + "col": 5, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8843, + "col": 37, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3655588", + "kind": "UsingDecl", + "loc": { + "offset": 8830, + "col": 24, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 8811, + "col": 5, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8830, + "col": 24, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "std::chrono::duration_cast" + } + ] + }, + { + "id": "0x3687628", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 8849, + "line": 281, + "col": 5, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "hasElse": true, + "inner": [ + { + "id": "0x36563f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 8853, + "line": 281, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x36563d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8858, + "col": 14, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8858, + "col": 14, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36563b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8858, + "col": 14, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8858, + "col": 14, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3655648", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8853, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8853, + "col": 9, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x36563a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3655668", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8861, + "col": 17, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"ns\"" + } + ] + } + ] + }, + { + "id": "0x366ce00", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8867, + "col": 23, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8941, + "line": 283, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x366cdf0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 8877, + "line": 282, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8934, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x366cdc8", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 8884, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8934, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3656438", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 8884, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8899, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "duration_cast", + "lookups": [ + { + "id": "0x36555e0", + "kind": "UsingShadowDecl", + "name": "duration_cast" + } + ] + }, + { + "id": "0x366cda0", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 8901, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8933, + "col": 65, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x366ca28", + "kind": "CXXConstructorDecl", + "name": "duration", + "type": { + "qualType": "void (const double &)" + } + }, + "inner": [ + { + "id": "0x366cd70", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 8901, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8933, + "col": 65, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const double &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x366cb78", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8929, + "col": 61, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8929, + "col": 61, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const double", + "qualType": "const double" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x36566d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8929, + "col": 61, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8929, + "col": 61, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36875f8", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 8948, + "line": 283, + "col": 12, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "hasElse": true, + "inner": [ + { + "id": "0x366dbc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 8952, + "line": 283, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x366dba8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8957, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8957, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x366db88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8957, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8957, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x366ce18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 8952, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8952, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x366db70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x366ce38", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8960, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"us\"" + } + ] + } + ] + }, + { + "id": "0x3675a60", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 8966, + "col": 30, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9041, + "line": 285, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3675a50", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 8976, + "line": 284, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9034, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3675a28", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 8983, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9034, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x366dc08", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 8983, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 8998, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "duration_cast", + "lookups": [ + { + "id": "0x36555e0", + "kind": "UsingShadowDecl", + "name": "duration_cast" + } + ] + }, + { + "id": "0x3675a00", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 9000, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9033, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x3675688", + "kind": "CXXConstructorDecl", + "name": "duration", + "type": { + "qualType": "void (const double &)" + } + }, + "inner": [ + { + "id": "0x36759d0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9000, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9033, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const double &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x36757d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9029, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9029, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const double", + "qualType": "const double" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x366dea8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9029, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9029, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36875c8", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 9048, + "line": 285, + "col": 12, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "hasElse": true, + "inner": [ + { + "id": "0x3676820", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 9052, + "line": 285, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3676808", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9057, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9057, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36767e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9057, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9057, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3675a78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9052, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9052, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x36767d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3675a98", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9060, + "col": 24, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"ms\"" + } + ] + } + ] + }, + { + "id": "0x367e6d0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 9066, + "col": 30, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9141, + "line": 287, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x367e6c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 9076, + "line": 286, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9134, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x367e698", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 9083, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9134, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3676868", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 9083, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9098, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "duration_cast", + "lookups": [ + { + "id": "0x36555e0", + "kind": "UsingShadowDecl", + "name": "duration_cast" + } + ] + }, + { + "id": "0x367e670", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 9100, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9133, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x367e2f8", + "kind": "CXXConstructorDecl", + "name": "duration", + "type": { + "qualType": "void (const double &)" + } + }, + "inner": [ + { + "id": "0x367e640", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9100, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9133, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration>", + "qualType": "duration" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const double &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x367e448", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9129, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9129, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const double", + "qualType": "const double" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3676b08", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9129, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9129, + "col": 62, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3687598", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 9148, + "line": 287, + "col": 12, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "hasElse": true, + "inner": [ + { + "id": "0x367f568", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 9152, + "line": 287, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9178, + "col": 42, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x367f490", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 9152, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x367f478", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9157, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9157, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x367f458", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9157, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9157, + "col": 21, + "tokLen": 2, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x367e6e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9152, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9152, + "col": 16, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x367f440", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x367e708", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9160, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"s\"" + } + ] + } + ] + }, + { + "id": "0x367f518", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 9167, + "col": 31, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9178, + "col": 42, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x367f4e8", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 9167, + "col": 31, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9172, + "col": 36, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "empty", + "isArrow": false, + "referencedMemberDecl": "0x2c94de8", + "inner": [ + { + "id": "0x367f4c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9167, + "col": 31, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9167, + "col": 31, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654bf8", + "kind": "ParmVarDecl", + "name": "unit", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x36873f0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 9181, + "col": 45, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9257, + "line": 289, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36873e0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 9191, + "line": 288, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9250, + "col": 68, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36873b8", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 9198, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9250, + "col": 68, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x367f598", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 9198, + "col": 16, + "tokLen": 13, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9213, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "duration_cast", + "lookups": [ + { + "id": "0x36555e0", + "kind": "UsingShadowDecl", + "name": "duration_cast" + } + ] + }, + { + "id": "0x3687390", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 9215, + "col": 33, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9249, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration", + "qualType": "std::chrono::duration" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x3687018", + "kind": "CXXConstructorDecl", + "name": "duration", + "type": { + "qualType": "void (const double &)" + } + }, + "inner": [ + { + "id": "0x3687360", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9215, + "col": 33, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9249, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::chrono::duration", + "qualType": "std::chrono::duration" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const double &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687168", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9245, + "col": 63, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9245, + "col": 63, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const double", + "qualType": "const double" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x367f840", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9245, + "col": 63, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9245, + "col": 63, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "double" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3654ea0", + "kind": "VarDecl", + "name": "tval", + "type": { + "qualType": "double" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3687580", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 9264, + "line": 289, + "col": 12, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9378, + "line": 292, + "col": 5, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687568", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 9274, + "line": 290, + "col": 9, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3687550", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 9274, + "line": 290, + "col": 9, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3687520", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687508", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x36874e0", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da84b8", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const char *)" + } + }, + "inner": [ + { + "id": "0x36874c0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x36874b8", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3687488", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9280, + "line": 290, + "col": 15, + "tokLen": 12, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9371, + "line": 291, + "col": 78, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const char *)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687470", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9306, + "col": 13, + "tokLen": 65, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9306, + "col": 13, + "tokLen": 65, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3687418", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 9306, + "col": 13, + "tokLen": 65, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9306, + "col": 13, + "tokLen": 65, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const char[64]" + }, + "valueCategory": "lvalue", + "value": "\"Invalid unit in conversion from string to std::chrono::duration\"" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x3687908", + "kind": "FunctionTemplateDecl", + "loc": { + "offset": 9407, + "file": "../include/sls/ToString.h", + "line": 295, + "col": 25, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9383, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9532, + "line": 299, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "inner": [ + { + "id": "0x3687690", + "kind": "TemplateTypeParmDecl", + "loc": { + "offset": 9402, + "line": 295, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9393, + "col": 11, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9402, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "T", + "tagUsed": "typename", + "depth": 0, + "index": 0 + }, + { + "id": "0x3687868", + "kind": "FunctionDecl", + "loc": { + "offset": 9407, + "col": 25, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9405, + "col": 23, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9532, + "line": 299, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "type": { + "qualType": "T (const std::string &)" + }, + "inner": [ + { + "id": "0x3687778", + "kind": "ParmVarDecl", + "loc": { + "offset": 9435, + "line": 295, + "col": 53, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9416, + "col": 34, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9435, + "col": 53, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "t", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3688030", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 9438, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9532, + "line": 299, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687b68", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 9444, + "line": 296, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9462, + "col": 23, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687a38", + "kind": "VarDecl", + "loc": { + "offset": 9456, + "col": 17, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9444, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9461, + "col": 22, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "tmp", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "init": "list", + "inner": [ + { + "id": "0x3687b38", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9456, + "col": 17, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9461, + "col": 22, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::basic_string &)" + }, + "list": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687aa0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9460, + "col": 21, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9460, + "col": 21, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3687778", + "kind": "ParmVarDecl", + "name": "t", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x3687ef0", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 9468, + "line": 297, + "col": 5, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9495, + "col": 32, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687bc0", + "kind": "VarDecl", + "loc": { + "offset": 9473, + "col": 10, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9468, + "col": 5, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "unit", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "init": "c", + "inner": [ + { + "id": "0x3687ed8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3687ea8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (std::basic_string &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3687e60", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3687d50", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "temp": "0x3687d48", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3687d20", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9494, + "col": 31, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3687d08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "std::string (*)(std::string &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3687c90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9480, + "col": 17, + "tokLen": 10, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "std::string (std::string &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2fb3d48", + "kind": "FunctionDecl", + "name": "RemoveUnit", + "type": { + "qualType": "std::string (std::string &)" + } + } + } + ] + }, + { + "id": "0x3687c70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9491, + "col": 28, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9491, + "col": 28, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3687a38", + "kind": "VarDecl", + "name": "tmp", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3688020", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 9501, + "line": 298, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9529, + "col": 33, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3687ff0", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 9508, + "col": 12, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9529, + "col": 33, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3687f30", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 9508, + "col": 12, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9518, + "col": 22, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "StringTo", + "lookups": [ + { + "id": "0x3687908", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + }, + { + "id": "0x3654da8", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + } + ] + }, + { + "id": "0x3687fb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9520, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9520, + "col": 24, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3687a38", + "kind": "VarDecl", + "name": "tmp", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + }, + { + "id": "0x3687fd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 9525, + "col": 29, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9525, + "col": 29, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3687bc0", + "kind": "VarDecl", + "name": "unit", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x3849458", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::detectorType (const std::string &)" + } + }, + { + "id": "0x3850318", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::detectorSettings (const std::string &)" + } + }, + { + "id": "0x3866a58", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::speedLevel (const std::string &)" + } + }, + { + "id": "0x386e798", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::timingMode (const std::string &)" + } + }, + { + "id": "0x3873968", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::frameDiscardPolicy (const std::string &)" + } + }, + { + "id": "0x3876e78", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::fileFormat (const std::string &)" + } + }, + { + "id": "0x38794b8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::externalSignalFlag (const std::string &)" + } + }, + { + "id": "0x387d838", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::readoutMode (const std::string &)" + } + }, + { + "id": "0x3882a18", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::dacIndex (const std::string &)" + } + }, + { + "id": "0x7f1964638418", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::burstMode (const std::string &)" + } + }, + { + "id": "0x7f196463c788", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::timingSourceType (const std::string &)" + } + }, + { + "id": "0x7f196463edd8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::M3_GainCaps (const std::string &)" + } + }, + { + "id": "0x7f1964644df8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::portPosition (const std::string &)" + } + }, + { + "id": "0x38d72a8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::streamingInterface (const std::string &)" + } + }, + { + "id": "0x38dae78", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::vetoAlgorithm (const std::string &)" + } + }, + { + "id": "0x38dd4b8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::gainMode (const std::string &)" + } + }, + { + "id": "0x38e34f8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "defs::polarity (const std::string &)" + } + }, + { + "id": "0x38e5ae8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "uint32_t (const std::string &)" + } + }, + { + "id": "0x38e62f8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "uint64_t (const std::string &)" + } + }, + { + "id": "0x38e6af0", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "int (const std::string &)" + } + }, + { + "id": "0x38e72d8", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "bool (const std::string &)" + } + }, + { + "id": "0x38e7b28", + "kind": "FunctionDecl", + "name": "StringTo", + "type": { + "qualType": "int64_t (const std::string &)" + } + } + ] +}, +{ + "id": "0x3688208", + "kind": "FunctionDecl", + "loc": { + "offset": 9566, + "file": "../include/sls/ToString.h", + "line": 301, + "col": 32, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9535, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9595, + "col": 61, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3688438", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs12detectorTypeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::detectorType (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "inner": [ + { + "id": "0x2f41f40", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "decl": { + "id": "0x2f41ea0", + "kind": "EnumDecl", + "name": "detectorType" + } + } + ] + }, + { + "id": "0x3688100", + "kind": "ParmVarDecl", + "loc": { + "offset": 9594, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9575, + "col": 41, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9594, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x3688728", + "kind": "FunctionDecl", + "loc": { + "offset": 9633, + "file": "../include/sls/ToString.h", + "line": 302, + "col": 36, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9598, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9662, + "col": 65, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3688958", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs16detectorSettingsEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::detectorSettings (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "inner": [ + { + "id": "0x2f5a2c0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "decl": { + "id": "0x2f5a218", + "kind": "EnumDecl", + "name": "detectorSettings" + } + } + ] + }, + { + "id": "0x3688620", + "kind": "ParmVarDecl", + "loc": { + "offset": 9661, + "col": 64, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9642, + "col": 45, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9661, + "col": 64, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x3688c48", + "kind": "FunctionDecl", + "loc": { + "offset": 9694, + "file": "../include/sls/ToString.h", + "line": 303, + "col": 30, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9665, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9723, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3688e78", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10speedLevelEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::speedLevel (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "inner": [ + { + "id": "0x2f5af70", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "decl": { + "id": "0x2f5aec8", + "kind": "EnumDecl", + "name": "speedLevel" + } + } + ] + }, + { + "id": "0x3688b40", + "kind": "ParmVarDecl", + "loc": { + "offset": 9722, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9703, + "col": 39, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9722, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x3689168", + "kind": "FunctionDecl", + "loc": { + "offset": 9755, + "file": "../include/sls/ToString.h", + "line": 304, + "col": 30, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9726, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9784, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3689398", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10timingModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::timingMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "inner": [ + { + "id": "0x2f57730", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "decl": { + "id": "0x2f57688", + "kind": "EnumDecl", + "name": "timingMode" + } + } + ] + }, + { + "id": "0x3689060", + "kind": "ParmVarDecl", + "loc": { + "offset": 9783, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9764, + "col": 39, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9783, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x3689688", + "kind": "FunctionDecl", + "loc": { + "offset": 9824, + "file": "../include/sls/ToString.h", + "line": 305, + "col": 38, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9787, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9853, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x36898b8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18frameDiscardPolicyEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::frameDiscardPolicy (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "inner": [ + { + "id": "0x2f554b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "decl": { + "id": "0x2f55410", + "kind": "EnumDecl", + "name": "frameDiscardPolicy" + } + } + ] + }, + { + "id": "0x3689580", + "kind": "ParmVarDecl", + "loc": { + "offset": 9852, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9833, + "col": 47, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9852, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x3689ba8", + "kind": "FunctionDecl", + "loc": { + "offset": 9885, + "file": "../include/sls/ToString.h", + "line": 306, + "col": 30, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9856, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9914, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x3689dd8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10fileFormatEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::fileFormat (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "inner": [ + { + "id": "0x2f556b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "decl": { + "id": "0x2f55610", + "kind": "EnumDecl", + "name": "fileFormat" + } + } + ] + }, + { + "id": "0x3689aa0", + "kind": "ParmVarDecl", + "loc": { + "offset": 9913, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9894, + "col": 39, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9913, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368abf0", + "kind": "FunctionDecl", + "loc": { + "offset": 9954, + "file": "../include/sls/ToString.h", + "line": 307, + "col": 38, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9917, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9983, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368ae28", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18externalSignalFlagEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::externalSignalFlag (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "inner": [ + { + "id": "0x2f57500", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "decl": { + "id": "0x2f57458", + "kind": "EnumDecl", + "name": "externalSignalFlag" + } + } + ] + }, + { + "id": "0x3689fc0", + "kind": "ParmVarDecl", + "loc": { + "offset": 9982, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9963, + "col": 47, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 9982, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368b118", + "kind": "FunctionDecl", + "loc": { + "offset": 10016, + "file": "../include/sls/ToString.h", + "line": 308, + "col": 31, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 9986, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10045, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368b348", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs11readoutModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::readoutMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "inner": [ + { + "id": "0x2f5acf0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "decl": { + "id": "0x2f5ac48", + "kind": "EnumDecl", + "name": "readoutMode" + } + } + ] + }, + { + "id": "0x368b010", + "kind": "ParmVarDecl", + "loc": { + "offset": 10044, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10025, + "col": 40, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10044, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368b638", + "kind": "FunctionDecl", + "loc": { + "offset": 10075, + "file": "../include/sls/ToString.h", + "line": 309, + "col": 28, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10048, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10104, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368b868", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8dacIndexEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::dacIndex (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "inner": [ + { + "id": "0x2f57a00", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "decl": { + "id": "0x2f57958", + "kind": "EnumDecl", + "name": "dacIndex" + } + } + ] + }, + { + "id": "0x368b530", + "kind": "ParmVarDecl", + "loc": { + "offset": 10103, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10084, + "col": 37, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10103, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368bb58", + "kind": "FunctionDecl", + "loc": { + "offset": 10135, + "file": "../include/sls/ToString.h", + "line": 310, + "col": 29, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10107, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10164, + "col": 58, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368bd88", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs9burstModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::burstMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "inner": [ + { + "id": "0x2f5b1f0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "decl": { + "id": "0x2f5b148", + "kind": "EnumDecl", + "name": "burstMode" + } + } + ] + }, + { + "id": "0x368ba50", + "kind": "ParmVarDecl", + "loc": { + "offset": 10163, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10144, + "col": 38, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10163, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368c078", + "kind": "FunctionDecl", + "loc": { + "offset": 10202, + "file": "../include/sls/ToString.h", + "line": 311, + "col": 36, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10167, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10231, + "col": 65, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368c2a8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs16timingSourceTypeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::timingSourceType (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "inner": [ + { + "id": "0x2f5b470", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "decl": { + "id": "0x2f5b3c8", + "kind": "EnumDecl", + "name": "timingSourceType" + } + } + ] + }, + { + "id": "0x368bf70", + "kind": "ParmVarDecl", + "loc": { + "offset": 10230, + "col": 64, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10211, + "col": 45, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10230, + "col": 64, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368c598", + "kind": "FunctionDecl", + "loc": { + "offset": 10264, + "file": "../include/sls/ToString.h", + "line": 312, + "col": 31, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10234, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10293, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368c7c8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs11M3_GainCapsEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::M3_GainCaps (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "inner": [ + { + "id": "0x2f5b5d0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "decl": { + "id": "0x2f5b530", + "kind": "EnumDecl", + "name": "M3_GainCaps" + } + } + ] + }, + { + "id": "0x368c490", + "kind": "ParmVarDecl", + "loc": { + "offset": 10292, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10273, + "col": 40, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10292, + "col": 59, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368cab8", + "kind": "FunctionDecl", + "loc": { + "offset": 10327, + "file": "../include/sls/ToString.h", + "line": 313, + "col": 32, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10296, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10356, + "col": 61, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368cce8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs12portPositionEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::portPosition (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "inner": [ + { + "id": "0x2f5bc00", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "decl": { + "id": "0x2f5bb60", + "kind": "EnumDecl", + "name": "portPosition" + } + } + ] + }, + { + "id": "0x368c9b0", + "kind": "ParmVarDecl", + "loc": { + "offset": 10355, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10336, + "col": 41, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10355, + "col": 60, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368cfd8", + "kind": "FunctionDecl", + "loc": { + "offset": 10396, + "file": "../include/sls/ToString.h", + "line": 314, + "col": 38, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10359, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10425, + "col": 67, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368d208", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18streamingInterfaceEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::streamingInterface (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "inner": [ + { + "id": "0x2f5bf90", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "decl": { + "id": "0x2f5bef0", + "kind": "EnumDecl", + "name": "streamingInterface" + } + } + ] + }, + { + "id": "0x368ced0", + "kind": "ParmVarDecl", + "loc": { + "offset": 10424, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10405, + "col": 47, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10424, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368d4f8", + "kind": "FunctionDecl", + "loc": { + "offset": 10460, + "file": "../include/sls/ToString.h", + "line": 315, + "col": 33, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10428, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10489, + "col": 62, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368d728", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs13vetoAlgorithmEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::vetoAlgorithm (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "inner": [ + { + "id": "0x2f5c350", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "decl": { + "id": "0x2f5c2b0", + "kind": "EnumDecl", + "name": "vetoAlgorithm" + } + } + ] + }, + { + "id": "0x368d3f0", + "kind": "ParmVarDecl", + "loc": { + "offset": 10488, + "col": 61, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10469, + "col": 42, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10488, + "col": 61, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368da18", + "kind": "FunctionDecl", + "loc": { + "offset": 10519, + "file": "../include/sls/ToString.h", + "line": 316, + "col": 28, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10492, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10548, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368dc48", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8gainModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::gainMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "inner": [ + { + "id": "0x2f5c4b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "decl": { + "id": "0x2f5c410", + "kind": "EnumDecl", + "name": "gainMode" + } + } + ] + }, + { + "id": "0x368d910", + "kind": "ParmVarDecl", + "loc": { + "offset": 10547, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10528, + "col": 37, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10547, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368df38", + "kind": "FunctionDecl", + "loc": { + "offset": 10578, + "file": "../include/sls/ToString.h", + "line": 317, + "col": 28, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10551, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10607, + "col": 57, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368e168", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8polarityEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::polarity (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "inner": [ + { + "id": "0x2f5c750", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "decl": { + "id": "0x2f5c6b0", + "kind": "EnumDecl", + "name": "polarity" + } + } + ] + }, + { + "id": "0x368de30", + "kind": "ParmVarDecl", + "loc": { + "offset": 10606, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10587, + "col": 37, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10606, + "col": 56, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368e408", + "kind": "FunctionDecl", + "loc": { + "offset": 10632, + "file": "../include/sls/ToString.h", + "line": 319, + "col": 22, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10611, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10661, + "col": 51, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368e608", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIjEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "uint32_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "unsigned int" + }, + "inner": [ + { + "id": "0x230bbd0", + "kind": "BuiltinType", + "type": { + "qualType": "unsigned int" + } + } + ] + }, + { + "id": "0x368e310", + "kind": "ParmVarDecl", + "loc": { + "offset": 10660, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10641, + "col": 31, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10660, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368e8a8", + "kind": "FunctionDecl", + "loc": { + "offset": 10685, + "file": "../include/sls/ToString.h", + "line": 320, + "col": 22, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10664, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10714, + "col": 51, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368eaa8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToImEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "uint64_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "unsigned long" + }, + "inner": [ + { + "id": "0x230bbf0", + "kind": "BuiltinType", + "type": { + "qualType": "unsigned long" + } + } + ] + }, + { + "id": "0x368e7b0", + "kind": "ParmVarDecl", + "loc": { + "offset": 10713, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10694, + "col": 31, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10713, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368ed50", + "kind": "FunctionDecl", + "loc": { + "offset": 10733, + "file": "../include/sls/ToString.h", + "line": 321, + "col": 17, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10717, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10762, + "col": 46, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368ef58", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIiEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "int (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "int" + }, + "inner": [ + { + "id": "0x230bb30", + "kind": "BuiltinType", + "type": { + "qualType": "int" + } + } + ] + }, + { + "id": "0x368ec50", + "kind": "ParmVarDecl", + "loc": { + "offset": 10761, + "col": 45, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10742, + "col": 26, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10761, + "col": 45, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368f1c8", + "kind": "FunctionDecl", + "loc": { + "offset": 10782, + "file": "../include/sls/ToString.h", + "line": 322, + "col": 18, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10765, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10811, + "col": 47, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368f3c8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIbEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "bool (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "bool" + }, + "inner": [ + { + "id": "0x230bab0", + "kind": "BuiltinType", + "type": { + "qualType": "bool" + } + } + ] + }, + { + "id": "0x368f100", + "kind": "ParmVarDecl", + "loc": { + "offset": 10810, + "col": 46, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10791, + "col": 27, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10810, + "col": 46, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x368f668", + "kind": "FunctionDecl", + "loc": { + "offset": 10834, + "file": "../include/sls/ToString.h", + "line": 323, + "col": 21, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10814, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10863, + "col": 50, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "previousDecl": "0x368f868", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIlEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "int64_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "long" + }, + "inner": [ + { + "id": "0x230bb50", + "kind": "BuiltinType", + "type": { + "qualType": "long" + } + } + ] + }, + { + "id": "0x368f570", + "kind": "ParmVarDecl", + "loc": { + "offset": 10862, + "col": 49, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 10843, + "col": 30, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 10862, + "col": 49, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + ] +}, +{ + "id": "0x3690758", + "kind": "FunctionTemplateDecl", + "loc": { + "offset": 11100, + "file": "../include/sls/ToString.h", + "line": 333, + "col": 16, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11063, + "line": 332, + "col": 1, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11310, + "line": 339, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "inner": [ + { + "id": "0x3690160", + "kind": "TemplateTypeParmDecl", + "loc": { + "offset": 11082, + "line": 332, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11073, + "col": 11, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11082, + "col": 20, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "T", + "tagUsed": "typename", + "depth": 0, + "index": 0 + }, + { + "id": "0x36906b8", + "kind": "FunctionDecl", + "loc": { + "offset": 11100, + "line": 333, + "col": 16, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11085, + "col": 1, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11310, + "line": 339, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "name": "StringTo", + "type": { + "qualType": "std::vector (const std::vector &)" + }, + "inner": [ + { + "id": "0x36905a0", + "kind": "ParmVarDecl", + "loc": { + "offset": 11141, + "line": 333, + "col": 57, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11109, + "col": 25, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11141, + "col": 57, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "strings", + "type": { + "qualType": "const std::vector &" + } + }, + { + "id": "0x36bd368", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 11150, + "col": 66, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11310, + "line": 339, + "col": 1, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x3690a40", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11156, + "line": 334, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11177, + "col": 26, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36909d8", + "kind": "VarDecl", + "loc": { + "offset": 11171, + "col": 20, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11156, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11171, + "col": 20, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "result", + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + }, + "nrvo": true + } + ] + }, + { + "id": "0x36b69a8", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 11183, + "line": 335, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11212, + "col": 34, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3690a78", + "kind": "CXXDependentScopeMemberExpr", + "range": { + "begin": { + "offset": 11183, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11190, + "col": 12, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "isArrow": false, + "member": "reserve", + "inner": [ + { + "id": "0x3690a58", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11183, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11183, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36909d8", + "kind": "VarDecl", + "name": "result", + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + } + } + } + ] + }, + { + "id": "0x36b6490", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 11198, + "col": 20, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11211, + "col": 33, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::vector::size_type", + "typeAliasDeclId": "0x29007b8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36b6460", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 11198, + "col": 20, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11206, + "col": 28, + "tokLen": 4, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "size", + "isArrow": false, + "referencedMemberDecl": "0x36a9e90", + "inner": [ + { + "id": "0x3690ac0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11198, + "col": 20, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11198, + "col": 20, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::vector>", + "qualType": "const std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36905a0", + "kind": "ParmVarDecl", + "name": "strings", + "type": { + "qualType": "const std::vector &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x36bd140", + "kind": "CXXForRangeStmt", + "range": { + "begin": { + "offset": 11219, + "line": 336, + "col": 5, + "tokLen": 3, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11288, + "line": 337, + "col": 40, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + {}, + { + "id": "0x36b6d50", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11240, + "line": 336, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36b6b50", + "kind": "VarDecl", + "loc": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isImplicit": true, + "isReferenced": true, + "name": "__range2", + "type": { + "qualType": "const std::vector &" + }, + "init": "c", + "inner": [ + { + "id": "0x36b69d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11240, + "col": 26, + "tokLen": 7, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::vector>", + "qualType": "const std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36905a0", + "kind": "ParmVarDecl", + "name": "strings", + "type": { + "qualType": "const std::vector &" + } + } + } + ] + } + ] + }, + { + "id": "0x36bb028", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36b6de8", + "kind": "VarDecl", + "loc": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isImplicit": true, + "isReferenced": true, + "name": "__begin2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "init": "c", + "inner": [ + { + "id": "0x36babf8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36babc8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (__gnu_cxx::__normal_iterator *, std::vector>> &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x36ba968", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x36b6f88", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36b6f58", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "begin", + "isArrow": false, + "referencedMemberDecl": "0x36a9440", + "inner": [ + { + "id": "0x36b6d68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::vector>", + "qualType": "const std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6b50", + "kind": "VarDecl", + "name": "__range2", + "type": { + "qualType": "const std::vector &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36bb040", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36b6e90", + "kind": "VarDecl", + "loc": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isImplicit": true, + "isReferenced": true, + "name": "__end2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "init": "c", + "inner": [ + { + "id": "0x36bb010", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36bafe0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (__gnu_cxx::__normal_iterator *, std::vector>> &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x36bafc8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x36baca0", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36bac70", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "end", + "isArrow": false, + "referencedMemberDecl": "0x36a9600", + "inner": [ + { + "id": "0x36b6d88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::vector>", + "qualType": "const std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6b50", + "kind": "VarDecl", + "name": "__range2", + "type": { + "qualType": "const std::vector &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36bcd60", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x36bcd48", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (*)(const __normal_iterator *, std::vector>> &, const __normal_iterator *, std::vector>> &) noexcept" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36bccd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "bool (const __normal_iterator *, std::vector>> &, const __normal_iterator *, std::vector>> &) noexcept" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36bb9d0", + "kind": "FunctionDecl", + "name": "operator!=", + "type": { + "qualType": "bool (const __normal_iterator *, std::vector>> &, const __normal_iterator *, std::vector>> &) noexcept" + } + } + } + ] + }, + { + "id": "0x36bcca0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const __gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "const __normal_iterator *, std::vector>>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x36bb058", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6de8", + "kind": "VarDecl", + "name": "__begin2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + } + } + } + ] + }, + { + "id": "0x36bccb8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const __gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "const __normal_iterator *, std::vector>>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x36bb078", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6e90", + "kind": "VarDecl", + "name": "__end2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + } + } + } + ] + } + ] + }, + { + "id": "0x36bce50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>>" + }, + "valueCategory": "lvalue", + "inner": [ + { + "id": "0x36bce38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>> &(*)() noexcept" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36bcdb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>> &() noexcept" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b8d20", + "kind": "CXXMethodDecl", + "name": "operator++", + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>> &() noexcept" + } + } + } + ] + }, + { + "id": "0x36bcd98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6de8", + "kind": "VarDecl", + "name": "__begin2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + } + } + } + ] + }, + { + "id": "0x36b6ac8", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 11224, + "col": 10, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11247, + "col": 33, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36b6a60", + "kind": "VarDecl", + "loc": { + "offset": 11236, + "col": 22, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "range": { + "begin": { + "offset": 11224, + "col": 10, + "tokLen": 5, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "isReferenced": true, + "name": "s", + "type": { + "qualType": "std::basic_string const &" + }, + "init": "c", + "inner": [ + { + "id": "0x36bcf70", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::basic_string" + }, + "valueCategory": "lvalue", + "inner": [ + { + "id": "0x36bcf58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>>::reference (*)() const noexcept" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x36bcee0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>>::reference () const noexcept" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b8aa0", + "kind": "CXXMethodDecl", + "name": "operator*", + "type": { + "qualType": "__gnu_cxx::__normal_iterator *, std::vector>>::reference () const noexcept" + } + } + } + ] + }, + { + "id": "0x36bcec8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "const __gnu_cxx::__normal_iterator *, std::vector>>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x36bce80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11238, + "col": 24, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6de8", + "kind": "VarDecl", + "name": "__begin2", + "type": { + "desugaredQualType": "__gnu_cxx::__normal_iterator *, std::vector>>", + "qualType": "std::vector>::const_iterator", + "typeAliasDeclId": "0x36a3be8" + } + } + } + ] + } + ] + } + ] + } + ] + }, + { + "id": "0x36bd308", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 11257, + "line": 337, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11288, + "col": 40, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36bd1c0", + "kind": "CXXDependentScopeMemberExpr", + "range": { + "begin": { + "offset": 11257, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11264, + "col": 16, + "tokLen": 9, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "isArrow": false, + "member": "push_back", + "inner": [ + { + "id": "0x36bd1a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11257, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11257, + "col": 9, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36909d8", + "kind": "VarDecl", + "name": "result", + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + } + } + } + ] + }, + { + "id": "0x36bd2e0", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 11274, + "col": 26, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11287, + "col": 39, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x36bd238", + "kind": "UnresolvedLookupExpr", + "range": { + "begin": { + "offset": 11274, + "col": 26, + "tokLen": 8, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11284, + "col": 36, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "lvalue", + "usesADL": true, + "name": "StringTo", + "lookups": [ + { + "id": "0x3690758", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + }, + { + "id": "0x3687908", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + }, + { + "id": "0x3654da8", + "kind": "FunctionTemplateDecl", + "name": "StringTo" + } + ] + }, + { + "id": "0x36bd2c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11286, + "col": 38, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11286, + "col": 38, + "tokLen": 1, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "std::basic_string const" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36b6a60", + "kind": "VarDecl", + "name": "s", + "type": { + "qualType": "std::basic_string const &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x36bd350", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 11295, + "line": 338, + "col": 5, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11302, + "col": 12, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "inner": [ + { + "id": "0x36bd330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 11302, + "col": 12, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + }, + "end": { + "offset": 11302, + "col": 12, + "tokLen": 6, + "includedFrom": { + "file": "ToString.cpp" + } + } + }, + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x36909d8", + "kind": "VarDecl", + "name": "result", + "type": { + "desugaredQualType": "vector", + "qualType": "std::vector" + } + } + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x3849458", + "kind": "FunctionDecl", + "loc": { + "offset": 20783, + "file": "ToString.cpp", + "line": 665, + "col": 32, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 20752, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 21262, + "line": 681, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3688208", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs12detectorTypeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::detectorType (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "inner": [ + { + "id": "0x2f41f40", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "decl": { + "id": "0x2f41ea0", + "kind": "EnumDecl", + "name": "detectorType" + } + } + ] + }, + { + "id": "0x3849388", + "kind": "ParmVarDecl", + "loc": { + "offset": 20811, + "line": 665, + "col": 60, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 20792, + "col": 41, + "tokLen": 5 + }, + "end": { + "offset": 20811, + "col": 60, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3850148", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 20814, + "col": 63, + "tokLen": 1 + }, + "end": { + "offset": 21262, + "line": 681, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x384a460", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 20820, + "line": 666, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 20859, + "line": 667, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x384a3b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 20824, + "line": 666, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20829, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384a398", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20826, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20826, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384a378", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20826, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20826, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3849610", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20824, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20824, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384a360", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20829, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 20829, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3849630", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 20829, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 20829, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"Eiger\"" + } + ] + } + ] + }, + { + "id": "0x384a450", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 20846, + "line": 667, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 20859, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x384a420", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20853, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 20859, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f41fb0", + "kind": "EnumConstantDecl", + "name": "EIGER", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384b2d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 20870, + "line": 668, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 20912, + "line": 669, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x384b220", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 20874, + "line": 668, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20879, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384b208", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20876, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20876, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384b1e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20876, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20876, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384a480", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20874, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20874, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384b1d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20879, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 20879, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384a4a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 20879, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 20879, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"Gotthard\"" + } + ] + } + ] + }, + { + "id": "0x384b2c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 20899, + "line": 669, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 20912, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x384b290", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20906, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 20912, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f42000", + "kind": "EnumConstantDecl", + "name": "GOTTHARD", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384c140", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 20926, + "line": 670, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 20968, + "line": 671, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x384c090", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 20930, + "line": 670, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384c078", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20932, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20932, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384c058", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20932, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20932, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384b2f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20930, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20930, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384c040", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20935, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 20935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384b310", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 20935, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 20935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"Jungfrau\"" + } + ] + } + ] + }, + { + "id": "0x384c130", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 20955, + "line": 671, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 20968, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x384c100", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20962, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 20968, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f42050", + "kind": "EnumConstantDecl", + "name": "JUNGFRAU", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384cfc0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 20982, + "line": 672, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21029, + "line": 673, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x384cf10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 20986, + "line": 672, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20991, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384cef8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20988, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20988, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384ced8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20988, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 20988, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384c160", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 20986, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 20986, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384cec0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 20991, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 20991, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384c180", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 20991, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 20991, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"ChipTestBoard\"" + } + ] + } + ] + }, + { + "id": "0x384cfb0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21016, + "line": 673, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21029, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x384cf80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21023, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21029, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f420a0", + "kind": "EnumConstantDecl", + "name": "CHIPTESTBOARD", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384de30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21048, + "line": 674, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21088, + "line": 675, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x384dd80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21052, + "line": 674, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21057, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384dd68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21054, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21054, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384dd48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21054, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21054, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384cfe0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21052, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21052, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384dd30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21057, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 21057, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384d000", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21057, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 21057, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"Moench\"" + } + ] + } + ] + }, + { + "id": "0x384de20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21075, + "line": 675, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21088, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x384ddf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21082, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21088, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f420f0", + "kind": "EnumConstantDecl", + "name": "MOENCH", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384eca0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21100, + "line": 676, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21141, + "line": 677, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x384ebf0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21104, + "line": 676, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21109, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384ebd8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21106, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21106, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384ebb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21106, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21106, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384de50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21104, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21104, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384eba0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21109, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 21109, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384de70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21109, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 21109, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"Mythen3\"" + } + ] + } + ] + }, + { + "id": "0x384ec90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21128, + "line": 677, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21141, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x384ec60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21135, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21141, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f42140", + "kind": "EnumConstantDecl", + "name": "MYTHEN3", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x384fb20", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21154, + "line": 678, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21197, + "line": 679, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x384fa70", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21158, + "line": 678, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21163, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384fa58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21160, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21160, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384fa38", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21160, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21160, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x384ecc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21158, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21158, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x384fa20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21163, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 21163, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384ece0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21163, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 21163, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"Gotthard2\"" + } + ] + } + ] + }, + { + "id": "0x384fb10", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21184, + "line": 679, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21197, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x384fae0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21191, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21197, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f42190", + "kind": "EnumConstantDecl", + "name": "GOTTHARD2", + "type": { + "qualType": "slsDetectorDefs::detectorType" + } + } + } + ] + } + ] + }, + { + "id": "0x3850130", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 21212, + "line": 680, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3850118", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 21212, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38500e8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38500d0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38500a8", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3850088", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3850080", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3850050", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 21218, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 21259, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3850038", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x3850020", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3850000", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x384fff8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x384ffc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x384ffa8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21256, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 21256, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x384ff88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21256, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 21256, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x384ff70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21231, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x384fb50", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21231, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 21231, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char[23]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown detector type \"" + } + ] + }, + { + "id": "0x384fb80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21258, + "col": 51, + "tokLen": 1 + }, + "end": { + "offset": 21258, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3849388", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x3850318", + "kind": "FunctionDecl", + "loc": { + "offset": 21300, + "file": "ToString.cpp", + "line": 683, + "col": 36, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 21265, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 22549, + "line": 725, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3688728", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs16detectorSettingsEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::detectorSettings (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "inner": [ + { + "id": "0x2f5a2c0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "decl": { + "id": "0x2f5a218", + "kind": "EnumDecl", + "name": "detectorSettings" + } + } + ] + }, + { + "id": "0x3850240", + "kind": "ParmVarDecl", + "loc": { + "offset": 21328, + "line": 683, + "col": 64, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 21309, + "col": 45, + "tokLen": 5 + }, + "end": { + "offset": 21328, + "col": 64, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3866820", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 21331, + "col": 67, + "tokLen": 1 + }, + "end": { + "offset": 22549, + "line": 725, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3851320", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21337, + "line": 684, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21379, + "line": 685, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x3851270", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21341, + "line": 684, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21346, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3851258", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21343, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21343, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3851238", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21343, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21343, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38504d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21341, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21341, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3851220", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21346, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21346, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38504f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21346, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21346, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"standard\"" + } + ] + } + ] + }, + { + "id": "0x3851310", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21366, + "line": 685, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21379, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38512e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21373, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21379, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a2e0", + "kind": "EnumConstantDecl", + "name": "STANDARD", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3855dc0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21393, + "line": 686, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21431, + "line": 687, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x3855d10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21397, + "line": 686, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21402, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3855cf8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21399, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21399, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3855cd8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21399, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21399, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3851340", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21397, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21397, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3855cc0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21402, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 21402, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3851360", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21402, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 21402, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"fast\"" + } + ] + } + ] + }, + { + "id": "0x3855db0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21418, + "line": 687, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21431, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x3855d80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21425, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21431, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a330", + "kind": "EnumConstantDecl", + "name": "FAST", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3856c30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21441, + "line": 688, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21483, + "line": 689, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x3856b80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21445, + "line": 688, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21450, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3856b68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21447, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21447, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3856b48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21447, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21447, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3855de0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21445, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21445, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3856b30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21450, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21450, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3855e00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21450, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21450, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"highgain\"" + } + ] + } + ] + }, + { + "id": "0x3856c20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21470, + "line": 689, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21483, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x3856bf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21477, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21483, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a380", + "kind": "EnumConstantDecl", + "name": "HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3857ab0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21497, + "line": 690, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21542, + "line": 691, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x3857a00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21501, + "line": 690, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21506, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38579e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21503, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21503, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38579c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21503, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21503, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3856c50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21501, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21501, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38579b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21506, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 21506, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3856c70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21506, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 21506, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"dynamicgain\"" + } + ] + } + ] + }, + { + "id": "0x3857aa0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21529, + "line": 691, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21542, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x3857a70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21536, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21542, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a3d0", + "kind": "EnumConstantDecl", + "name": "DYNAMICGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3858920", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21559, + "line": 692, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21600, + "line": 693, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x3858870", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21563, + "line": 692, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3858858", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21565, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21565, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3858838", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21565, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21565, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3857ad0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21563, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21563, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3858820", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21568, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 21568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3857af0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21568, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 21568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"lowgain\"" + } + ] + } + ] + }, + { + "id": "0x3858910", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21587, + "line": 693, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21600, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38588e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21594, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21600, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a420", + "kind": "EnumConstantDecl", + "name": "LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x38597a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21613, + "line": 694, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21657, + "line": 695, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38596f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21617, + "line": 694, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21622, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38596d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21619, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21619, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38596b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21619, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21619, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3858940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21617, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21617, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38596a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21622, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 21622, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3858960", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21622, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 21622, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"mediumgain\"" + } + ] + } + ] + }, + { + "id": "0x3859790", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21644, + "line": 695, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21657, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3859760", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21651, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21657, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a470", + "kind": "EnumConstantDecl", + "name": "MEDIUMGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385a620", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21673, + "line": 696, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21719, + "line": 697, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x385a570", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21677, + "line": 696, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21682, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385a558", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21679, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21679, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385a538", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21679, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21679, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38597c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21677, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21677, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385a520", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21682, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 21682, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38597e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21682, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 21682, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"veryhighgain\"" + } + ] + } + ] + }, + { + "id": "0x385a610", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21706, + "line": 697, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21719, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x385a5e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21713, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21719, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a4c0", + "kind": "EnumConstantDecl", + "name": "VERYHIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385b4a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21737, + "line": 698, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21780, + "line": 699, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x385b3f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21741, + "line": 698, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21746, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385b3d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21743, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21743, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385b3b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21743, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21743, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385a640", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21741, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21741, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385b3a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21746, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 21746, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385a660", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21746, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 21746, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"highgain0\"" + } + ] + } + ] + }, + { + "id": "0x385b490", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21767, + "line": 699, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21780, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x385b460", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21774, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21780, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a510", + "kind": "EnumConstantDecl", + "name": "HIGHGAIN0", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385c310", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21795, + "line": 700, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21837, + "line": 701, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x385c260", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21799, + "line": 700, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21804, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385c248", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21801, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21801, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385c228", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21801, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21801, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385b4c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21799, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21799, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385c210", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21804, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21804, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385b4e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21804, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21804, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"fixgain1\"" + } + ] + } + ] + }, + { + "id": "0x385c300", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21824, + "line": 701, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21837, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x385c2d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21831, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21837, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a560", + "kind": "EnumConstantDecl", + "name": "FIXGAIN1", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385d180", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21851, + "line": 702, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21893, + "line": 703, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x385d0d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21855, + "line": 702, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21860, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385d0b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21857, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21857, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385d098", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21857, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21857, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385c330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21855, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21855, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385d080", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21860, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21860, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385c350", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21860, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 21860, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"fixgain2\"" + } + ] + } + ] + }, + { + "id": "0x385d170", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21880, + "line": 703, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21893, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x385d140", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21887, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21893, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a5b0", + "kind": "EnumConstantDecl", + "name": "FIXGAIN2", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385e000", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21907, + "line": 704, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 21952, + "line": 705, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x385df50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21911, + "line": 704, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21916, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385df38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21913, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21913, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385df18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21913, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21913, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385d1a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21911, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21911, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385df00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21916, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 21916, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385d1c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21916, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 21916, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"verylowgain\"" + } + ] + } + ] + }, + { + "id": "0x385dff0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21939, + "line": 705, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 21952, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x385dfc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21946, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 21952, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a600", + "kind": "EnumConstantDecl", + "name": "VERYLOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385ee70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 21969, + "line": 706, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22008, + "line": 707, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x385edc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 21973, + "line": 706, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21978, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385eda8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21975, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21975, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385ed88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21975, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 21975, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385e020", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 21973, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 21973, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385ed70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 21978, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 21978, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385e040", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 21978, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 21978, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"g1_hg\"" + } + ] + } + ] + }, + { + "id": "0x385ee60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 21995, + "line": 707, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22008, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x385ee30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22002, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22008, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a650", + "kind": "EnumConstantDecl", + "name": "G1_HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x385fce0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22025, + "line": 708, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22064, + "line": 709, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x385fc30", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22029, + "line": 708, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22034, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x385fc18", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22031, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22031, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x385fbf8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22031, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22031, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385ee90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22029, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22029, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x385fbe0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22034, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22034, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385eeb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22034, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22034, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"g1_lg\"" + } + ] + } + ] + }, + { + "id": "0x385fcd0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22051, + "line": 709, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22064, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x385fca0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22058, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22064, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a6a0", + "kind": "EnumConstantDecl", + "name": "G1_LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3860b50", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22080, + "line": 710, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22122, + "line": 711, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x3860aa0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22084, + "line": 710, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22089, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3860a88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22086, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22086, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3860a68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22086, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22086, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x385fd00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22084, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22084, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3860a50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22089, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22089, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x385fd20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22089, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22089, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"g2_hc_hg\"" + } + ] + } + ] + }, + { + "id": "0x3860b40", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22109, + "line": 711, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22122, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x3860b10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22116, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22122, + "col": 22, + "tokLen": 19 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a6f0", + "kind": "EnumConstantDecl", + "name": "G2_HIGHCAP_HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x38619c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22147, + "line": 712, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22189, + "line": 713, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x3861910", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22151, + "line": 712, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22156, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38618f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22153, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22153, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38618d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22153, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22153, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3860b70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22151, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22151, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38618c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22156, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22156, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3860b90", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22156, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22156, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"g2_hc_lg\"" + } + ] + } + ] + }, + { + "id": "0x38619b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22176, + "line": 713, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22189, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x3861980", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22183, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22189, + "col": 22, + "tokLen": 18 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a740", + "kind": "EnumConstantDecl", + "name": "G2_HIGHCAP_LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3862830", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22213, + "line": 714, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22255, + "line": 715, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x3862780", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22217, + "line": 714, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22222, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3862768", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22219, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22219, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3862748", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22219, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22219, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38619e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22217, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22217, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3862730", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22222, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22222, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3861a00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22222, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22222, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"g2_lc_hg\"" + } + ] + } + ] + }, + { + "id": "0x3862820", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22242, + "line": 715, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22255, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x38627f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22249, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22255, + "col": 22, + "tokLen": 18 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a790", + "kind": "EnumConstantDecl", + "name": "G2_LOWCAP_HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x38636a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22279, + "line": 716, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22321, + "line": 717, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x38635f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22283, + "line": 716, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22288, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38635d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22285, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22285, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38635b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22285, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22285, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3862850", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22283, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22283, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38635a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22288, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22288, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3862870", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22288, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 22288, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"g2_lc_lg\"" + } + ] + } + ] + }, + { + "id": "0x3863690", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22308, + "line": 717, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22321, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x3863660", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22315, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22321, + "col": 22, + "tokLen": 17 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a7e0", + "kind": "EnumConstantDecl", + "name": "G2_LOWCAP_LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3864510", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22344, + "line": 718, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22383, + "line": 719, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x3864460", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22348, + "line": 718, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22353, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3864448", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22350, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22350, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3864428", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22350, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22350, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38636c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22348, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22348, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3864410", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22353, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22353, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38636e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22353, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22353, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"g4_hg\"" + } + ] + } + ] + }, + { + "id": "0x3864500", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22370, + "line": 719, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22383, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38644d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22377, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22383, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a830", + "kind": "EnumConstantDecl", + "name": "G4_HIGHGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3865390", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22400, + "line": 720, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22439, + "line": 721, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38652e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22404, + "line": 720, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22409, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38652c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22406, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22406, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38652a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22406, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22406, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3864530", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22404, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22404, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3865290", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22409, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22409, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3864550", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22409, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22409, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"gain0\"" + } + ] + } + ] + }, + { + "id": "0x3865380", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22426, + "line": 721, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22439, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3865350", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22433, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22439, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a8d0", + "kind": "EnumConstantDecl", + "name": "GAIN0", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3866200", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22450, + "line": 722, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22489, + "line": 723, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3866150", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22454, + "line": 722, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22459, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3866138", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22456, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22456, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3866118", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22456, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22456, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38653b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22454, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22454, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3866100", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22459, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22459, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38653d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22459, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 22459, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"g4_lg\"" + } + ] + } + ] + }, + { + "id": "0x38661f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22476, + "line": 723, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22489, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38661c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22483, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22489, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a880", + "kind": "EnumConstantDecl", + "name": "G4_LOWGAIN", + "type": { + "qualType": "slsDetectorDefs::detectorSettings" + } + } + } + ] + } + ] + }, + { + "id": "0x3866808", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 22505, + "line": 724, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38667f0", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 22505, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38667c0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38667a8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3866780", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3866760", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3866758", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3866728", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 22511, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 22546, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3866710", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38666f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38666d8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38666d0", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3866698", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3866680", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22543, + "col": 43, + "tokLen": 1 + }, + "end": { + "offset": 22543, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3866660", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22543, + "col": 43, + "tokLen": 1 + }, + "end": { + "offset": 22543, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x3866648", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22524, + "col": 24, + "tokLen": 18 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3866230", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22524, + "col": 24, + "tokLen": 18 + }, + "end": { + "offset": 22524, + "col": 24, + "tokLen": 18 + } + }, + "type": { + "qualType": "const char[17]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown setting \"" + } + ] + }, + { + "id": "0x3866258", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22545, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 22545, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3850240", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x3866a58", + "kind": "FunctionDecl", + "loc": { + "offset": 22581, + "file": "ToString.cpp", + "line": 727, + "col": 30, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 22552, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 23106, + "line": 745, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3688c48", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10speedLevelEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::speedLevel (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "inner": [ + { + "id": "0x2f5af70", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "decl": { + "id": "0x2f5aec8", + "kind": "EnumDecl", + "name": "speedLevel" + } + } + ] + }, + { + "id": "0x3866980", + "kind": "ParmVarDecl", + "loc": { + "offset": 22609, + "line": 727, + "col": 58, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 22590, + "col": 39, + "tokLen": 5 + }, + "end": { + "offset": 22609, + "col": 58, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x386e5c0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 22612, + "col": 61, + "tokLen": 1 + }, + "end": { + "offset": 23106, + "line": 745, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3867a70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22618, + "line": 728, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22662, + "line": 729, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38679c0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22622, + "line": 728, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22627, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38679a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22624, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22624, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3867988", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22624, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22624, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3866c10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22622, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22622, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3867970", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22627, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 22627, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3866c30", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22627, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 22627, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"full_speed\"" + } + ] + } + ] + }, + { + "id": "0x3867a60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22649, + "line": 729, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22662, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3867a30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22656, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22662, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5af90", + "kind": "EnumConstantDecl", + "name": "FULL_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x38688e0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22678, + "line": 730, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22713, + "line": 731, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3868830", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22682, + "line": 730, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22687, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3868818", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22684, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22684, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38687f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22684, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22684, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3867a90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22682, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22682, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38687e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22687, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22687, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3867ab0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22687, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22687, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"0\"" + } + ] + } + ] + }, + { + "id": "0x38688d0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22700, + "line": 731, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22713, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38688a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22707, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22713, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5af90", + "kind": "EnumConstantDecl", + "name": "FULL_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x3869760", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22729, + "line": 732, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22773, + "line": 733, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38696b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22733, + "line": 732, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22738, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3869698", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22735, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22735, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3869678", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22735, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22735, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3868900", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22733, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22733, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3869660", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22738, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 22738, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3868920", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22738, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 22738, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"half_speed\"" + } + ] + } + ] + }, + { + "id": "0x3869750", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22760, + "line": 733, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22773, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3869720", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22767, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22773, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5afe0", + "kind": "EnumConstantDecl", + "name": "HALF_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386a5d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22789, + "line": 734, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22824, + "line": 735, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x386a520", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22793, + "line": 734, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22798, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386a508", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22795, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22795, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386a4e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22795, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22795, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3869780", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22793, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22793, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386a4d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22798, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22798, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38697a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22798, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22798, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"1\"" + } + ] + } + ] + }, + { + "id": "0x386a5c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22811, + "line": 735, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22824, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x386a590", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22818, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22824, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5afe0", + "kind": "EnumConstantDecl", + "name": "HALF_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386b450", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22840, + "line": 736, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22887, + "line": 737, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x386b3a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22844, + "line": 736, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22849, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386b388", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22846, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22846, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386b368", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22846, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22846, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386a5f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22844, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22844, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386b350", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22849, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 22849, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386a610", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22849, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 22849, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"quarter_speed\"" + } + ] + } + ] + }, + { + "id": "0x386b440", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22874, + "line": 737, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22887, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x386b410", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22881, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22887, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b030", + "kind": "EnumConstantDecl", + "name": "QUARTER_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386c2c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22906, + "line": 738, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22941, + "line": 739, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x386c210", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22910, + "line": 738, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22915, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386c1f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22912, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22912, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386c1d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22912, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22912, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386b470", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22910, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22910, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386c1c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22915, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22915, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386b490", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22915, + "col": 14, + "tokLen": 3 + }, + "end": { + "offset": 22915, + "col": 14, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"2\"" + } + ] + } + ] + }, + { + "id": "0x386c2b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22928, + "line": 739, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22941, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x386c280", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22935, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22941, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b030", + "kind": "EnumConstantDecl", + "name": "QUARTER_SPEED", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386d130", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 22960, + "line": 740, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 22997, + "line": 741, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x386d080", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 22964, + "line": 740, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22969, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386d068", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22966, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22966, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386d048", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22966, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 22966, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386c2e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22964, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 22964, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386d030", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 22969, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 22969, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386c300", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 22969, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 22969, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"108\"" + } + ] + } + ] + }, + { + "id": "0x386d120", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 22984, + "line": 741, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 22997, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x386d0f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 22991, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 22997, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b080", + "kind": "EnumConstantDecl", + "name": "G2_108MHZ", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386dfa0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23012, + "line": 742, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23049, + "line": 743, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x386def0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23016, + "line": 742, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23021, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386ded8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23018, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23018, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386deb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23018, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23018, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386d150", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23016, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23016, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386dea0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23021, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 23021, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386d170", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23021, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 23021, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"144\"" + } + ] + } + ] + }, + { + "id": "0x386df90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23036, + "line": 743, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23049, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x386df60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23043, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23049, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::speedLevel" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b0d0", + "kind": "EnumConstantDecl", + "name": "G2_144MHZ", + "type": { + "qualType": "slsDetectorDefs::speedLevel" + } + } + } + ] + } + ] + }, + { + "id": "0x386e5a8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 23064, + "line": 744, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x386e590", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 23064, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x386e560", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x386e548", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x386e520", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x386e500", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x386e4f8", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x386e4c8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23070, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23103, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x386e4b0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x386e498", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x386e478", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x386e470", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x386e438", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386e420", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23100, + "col": 41, + "tokLen": 1 + }, + "end": { + "offset": 23100, + "col": 41, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386e400", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23100, + "col": 41, + "tokLen": 1 + }, + "end": { + "offset": 23100, + "col": 41, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x386e3e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23083, + "col": 24, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386dfd0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23083, + "col": 24, + "tokLen": 16 + }, + "end": { + "offset": 23083, + "col": 24, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown speed \"" + } + ] + }, + { + "id": "0x386dff8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23102, + "col": 43, + "tokLen": 1 + }, + "end": { + "offset": 23102, + "col": 43, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3866980", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x386e798", + "kind": "FunctionDecl", + "loc": { + "offset": 23138, + "file": "ToString.cpp", + "line": 747, + "col": 30, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 23109, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 23525, + "line": 759, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3689168", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10timingModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::timingMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "inner": [ + { + "id": "0x2f57730", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "decl": { + "id": "0x2f57688", + "kind": "EnumDecl", + "name": "timingMode" + } + } + ] + }, + { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "loc": { + "offset": 23166, + "line": 747, + "col": 58, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 23147, + "col": 39, + "tokLen": 5 + }, + "end": { + "offset": 23166, + "col": 58, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38737a8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 23169, + "col": 61, + "tokLen": 1 + }, + "end": { + "offset": 23525, + "line": 759, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x386f7a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23175, + "line": 748, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23213, + "line": 749, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x386f6f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23179, + "line": 748, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23184, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x386f6d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23181, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23181, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x386f6b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23181, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23181, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386e950", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23179, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23179, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x386f6a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23184, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 23184, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386e970", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23184, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 23184, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"auto\"" + } + ] + } + ] + }, + { + "id": "0x386f790", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23200, + "line": 749, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23213, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x386f760", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23207, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23213, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57750", + "kind": "EnumConstantDecl", + "name": "AUTO_TIMING", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3870610", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23230, + "line": 750, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23271, + "line": 751, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x3870560", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23234, + "line": 750, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23239, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3870548", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23236, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23236, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3870528", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23236, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23236, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x386f7c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23234, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23234, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3870510", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23239, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 23239, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x386f7e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23239, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 23239, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"trigger\"" + } + ] + } + ] + }, + { + "id": "0x3870600", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23258, + "line": 751, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23271, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x38705d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23265, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23271, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f577a0", + "kind": "EnumConstantDecl", + "name": "TRIGGER_EXPOSURE", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3871480", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23293, + "line": 752, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23333, + "line": 753, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38713d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23297, + "line": 752, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23302, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38713b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23299, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23299, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3871398", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23299, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23299, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3870630", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23297, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23297, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3871380", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23302, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 23302, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3870650", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23302, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 23302, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"gating\"" + } + ] + } + ] + }, + { + "id": "0x3871470", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23320, + "line": 753, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23333, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3871440", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23327, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23333, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f577f0", + "kind": "EnumConstantDecl", + "name": "GATED", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3872300", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23344, + "line": 754, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23391, + "line": 755, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x3872250", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23348, + "line": 754, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23353, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3872238", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23350, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23350, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3872218", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23350, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23350, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38714a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23348, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23348, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3872200", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23353, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 23353, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38714c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23353, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 23353, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"burst_trigger\"" + } + ] + } + ] + }, + { + "id": "0x38722f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23378, + "line": 755, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23391, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x38722c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23385, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23391, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57840", + "kind": "EnumConstantDecl", + "name": "BURST_TRIGGER", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3873180", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23410, + "line": 756, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23458, + "line": 757, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x38730d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23414, + "line": 756, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23419, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38730b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23416, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23416, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3873098", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23416, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23416, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3872320", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23414, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23414, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3873080", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23419, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 23419, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3872340", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23419, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 23419, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"trigger_gating\"" + } + ] + } + ] + }, + { + "id": "0x3873170", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23445, + "line": 757, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23458, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x3873140", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23452, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23458, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57890", + "kind": "EnumConstantDecl", + "name": "TRIGGER_GATED", + "type": { + "qualType": "slsDetectorDefs::timingMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3873790", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 23477, + "line": 758, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3873778", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 23477, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3873748", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3873730", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3873708", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38736e8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38736e0", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38736b0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23483, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23522, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3873698", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x3873680", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3873660", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x3873658", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3873620", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3873608", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23519, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 23519, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38735e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23519, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 23519, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38735d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23496, + "col": 24, + "tokLen": 22 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38731b0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23496, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 23496, + "col": 24, + "tokLen": 22 + } + }, + "type": { + "qualType": "const char[21]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown timing mode \"" + } + ] + }, + { + "id": "0x38731e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23521, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 23521, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x386e6c0", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x3873968", + "kind": "FunctionDecl", + "loc": { + "offset": 23565, + "file": "ToString.cpp", + "line": 761, + "col": 38, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 23528, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 23866, + "line": 769, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3689688", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18frameDiscardPolicyEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::frameDiscardPolicy (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "inner": [ + { + "id": "0x2f554b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "decl": { + "id": "0x2f55410", + "kind": "EnumDecl", + "name": "frameDiscardPolicy" + } + } + ] + }, + { + "id": "0x3873890", + "kind": "ParmVarDecl", + "loc": { + "offset": 23593, + "line": 761, + "col": 66, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 23574, + "col": 47, + "tokLen": 5 + }, + "end": { + "offset": 23593, + "col": 66, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3876cd0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 23596, + "col": 69, + "tokLen": 1 + }, + "end": { + "offset": 23866, + "line": 769, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3874980", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23602, + "line": 762, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23645, + "line": 763, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38748d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23606, + "line": 762, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23611, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38748b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23608, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23608, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3874898", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23608, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23608, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3873b20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23606, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23606, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3873890", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3874880", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23611, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 23611, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3873b40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23611, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 23611, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"nodiscard\"" + } + ] + } + ] + }, + { + "id": "0x3874970", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23632, + "line": 763, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23645, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x3874940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23639, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23645, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f554d0", + "kind": "EnumConstantDecl", + "name": "NO_DISCARD", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + } + } + } + ] + } + ] + }, + { + "id": "0x3875820", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23661, + "line": 764, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23707, + "line": 765, + "col": 22, + "tokLen": 20 + } + }, + "inner": [ + { + "id": "0x3875770", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23665, + "line": 764, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23670, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3875758", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23667, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23667, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3875738", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23667, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23667, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38749a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23665, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23665, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3873890", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3875720", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23670, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 23670, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38749c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23670, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 23670, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"discardempty\"" + } + ] + } + ] + }, + { + "id": "0x3875810", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23694, + "line": 765, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23707, + "col": 22, + "tokLen": 20 + } + }, + "inner": [ + { + "id": "0x38757e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23701, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23707, + "col": 22, + "tokLen": 20 + } + }, + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f55520", + "kind": "EnumConstantDecl", + "name": "DISCARD_EMPTY_FRAMES", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + } + } + } + ] + } + ] + }, + { + "id": "0x38766a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23733, + "line": 766, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23781, + "line": 767, + "col": 22, + "tokLen": 22 + } + }, + "inner": [ + { + "id": "0x38765f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23737, + "line": 766, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23742, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38765d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23739, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23739, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38765b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23739, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23739, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3875840", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23737, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23737, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3873890", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38765a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23742, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 23742, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3875860", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23742, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 23742, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"discardpartial\"" + } + ] + } + ] + }, + { + "id": "0x3876690", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23768, + "line": 767, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23781, + "col": 22, + "tokLen": 22 + } + }, + "inner": [ + { + "id": "0x3876660", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23775, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23781, + "col": 22, + "tokLen": 22 + } + }, + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f55570", + "kind": "EnumConstantDecl", + "name": "DISCARD_PARTIAL_FRAMES", + "type": { + "qualType": "slsDetectorDefs::frameDiscardPolicy" + } + } + } + ] + } + ] + }, + { + "id": "0x3876cb8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 23809, + "line": 768, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3876ca0", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 23809, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x3876c70", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3876c58", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3876c30", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3876c10", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3876c08", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3876bd8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 23815, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 23863, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3876bc0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x3876ba8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3876b88", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x3876b80", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3876b48", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3876b30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23860, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 23860, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3876b10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23860, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 23860, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x3876af8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23828, + "col": 24, + "tokLen": 31 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38766d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23828, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 23828, + "col": 24, + "tokLen": 31 + } + }, + "type": { + "qualType": "const char[30]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown frame discard policy \"" + } + ] + }, + { + "id": "0x3876708", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23862, + "col": 58, + "tokLen": 1 + }, + "end": { + "offset": 23862, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3873890", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x3876e78", + "kind": "FunctionDecl", + "loc": { + "offset": 23898, + "file": "ToString.cpp", + "line": 771, + "col": 30, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 23869, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 24083, + "line": 777, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x3689ba8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs10fileFormatEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::fileFormat (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "inner": [ + { + "id": "0x2f556b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "decl": { + "id": "0x2f55610", + "kind": "EnumDecl", + "name": "fileFormat" + } + } + ] + }, + { + "id": "0x3876da8", + "kind": "ParmVarDecl", + "loc": { + "offset": 23926, + "line": 771, + "col": 58, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 23907, + "col": 39, + "tokLen": 5 + }, + "end": { + "offset": 23926, + "col": 58, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3879318", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 23929, + "col": 61, + "tokLen": 1 + }, + "end": { + "offset": 24083, + "line": 777, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3877e80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23935, + "line": 772, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 23973, + "line": 773, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x3877dd0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23939, + "line": 772, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23944, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3877db8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23941, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23941, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3877d98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23941, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23941, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3877030", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23939, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23939, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3876da8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3877d80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23944, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 23944, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3877050", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23944, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 23944, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"hdf5\"" + } + ] + } + ] + }, + { + "id": "0x3877e70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 23960, + "line": 773, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 23973, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x3877e40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23967, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 23973, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f55720", + "kind": "EnumConstantDecl", + "name": "HDF5", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + } + } + } + ] + } + ] + }, + { + "id": "0x3878cf0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 23983, + "line": 774, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24023, + "line": 775, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3878c40", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 23987, + "line": 774, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23992, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3878c28", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23989, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23989, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3878c08", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23989, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 23989, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3877ea0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 23987, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 23987, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3876da8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3878bf0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 23992, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 23992, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3877ec0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 23992, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 23992, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"binary\"" + } + ] + } + ] + }, + { + "id": "0x3878ce0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24010, + "line": 775, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24023, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3878cb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24017, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24023, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::fileFormat" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f556d0", + "kind": "EnumConstantDecl", + "name": "BINARY", + "type": { + "qualType": "slsDetectorDefs::fileFormat" + } + } + } + ] + } + ] + }, + { + "id": "0x3879300", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 24035, + "line": 776, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38792e8", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 24035, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38792b8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38792a0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x3879278", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3879258", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3879250", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3879220", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24041, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24080, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3879208", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38791f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38791d0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38791c8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3879190", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3879178", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24077, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 24077, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3879158", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24077, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 24077, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x3879140", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24054, + "col": 24, + "tokLen": 22 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3878d20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24054, + "col": 24, + "tokLen": 22 + }, + "end": { + "offset": 24054, + "col": 24, + "tokLen": 22 + } + }, + "type": { + "qualType": "const char[21]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown file format \"" + } + ] + }, + { + "id": "0x3878d50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24079, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 24079, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3876da8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38794b8", + "kind": "FunctionDecl", + "loc": { + "offset": 24123, + "file": "ToString.cpp", + "line": 779, + "col": 38, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 24086, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 24517, + "line": 789, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368abf0", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18externalSignalFlagEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::externalSignalFlag (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "inner": [ + { + "id": "0x2f57500", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "decl": { + "id": "0x2f57458", + "kind": "EnumDecl", + "name": "externalSignalFlag" + } + } + ] + }, + { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "loc": { + "offset": 24151, + "line": 779, + "col": 66, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 24132, + "col": 47, + "tokLen": 5 + }, + "end": { + "offset": 24151, + "col": 66, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x387d680", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 24154, + "col": 69, + "tokLen": 1 + }, + "end": { + "offset": 24517, + "line": 789, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x387a4d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24160, + "line": 780, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24216, + "line": 781, + "col": 22, + "tokLen": 22 + } + }, + "inner": [ + { + "id": "0x387a420", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24164, + "line": 780, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24169, + "col": 14, + "tokLen": 24 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387a408", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24166, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24166, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387a3e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24166, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24166, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3879670", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24164, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24164, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387a3d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24169, + "col": 14, + "tokLen": 24 + }, + "end": { + "offset": 24169, + "col": 14, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3879690", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24169, + "col": 14, + "tokLen": 24 + }, + "end": { + "offset": 24169, + "col": 14, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char[23]" + }, + "valueCategory": "lvalue", + "value": "\"trigger_in_rising_edge\"" + } + ] + } + ] + }, + { + "id": "0x387a4c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24203, + "line": 781, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24216, + "col": 22, + "tokLen": 22 + } + }, + "inner": [ + { + "id": "0x387a490", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24210, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24216, + "col": 22, + "tokLen": 22 + } + }, + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57520", + "kind": "EnumConstantDecl", + "name": "TRIGGER_IN_RISING_EDGE", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + } + } + } + ] + } + ] + }, + { + "id": "0x387b350", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24244, + "line": 782, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24301, + "line": 783, + "col": 22, + "tokLen": 23 + } + }, + "inner": [ + { + "id": "0x387b2a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24248, + "line": 782, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24253, + "col": 14, + "tokLen": 25 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387b288", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24250, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24250, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387b268", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24250, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24250, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387a4f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24248, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24248, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387b250", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24253, + "col": 14, + "tokLen": 25 + }, + "end": { + "offset": 24253, + "col": 14, + "tokLen": 25 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387a510", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24253, + "col": 14, + "tokLen": 25 + }, + "end": { + "offset": 24253, + "col": 14, + "tokLen": 25 + } + }, + "type": { + "qualType": "const char[24]" + }, + "valueCategory": "lvalue", + "value": "\"trigger_in_falling_edge\"" + } + ] + } + ] + }, + { + "id": "0x387b340", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24288, + "line": 783, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24301, + "col": 22, + "tokLen": 23 + } + }, + "inner": [ + { + "id": "0x387b310", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24295, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24301, + "col": 22, + "tokLen": 23 + } + }, + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57570", + "kind": "EnumConstantDecl", + "name": "TRIGGER_IN_FALLING_EDGE", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + } + } + } + ] + } + ] + }, + { + "id": "0x387c1d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24330, + "line": 784, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24376, + "line": 785, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x387c120", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24334, + "line": 784, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24339, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387c108", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24336, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24336, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387c0e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24336, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24336, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387b370", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24334, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24334, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387c0d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24339, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 24339, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387b390", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24339, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 24339, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"inversion_on\"" + } + ] + } + ] + }, + { + "id": "0x387c1c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24363, + "line": 785, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24376, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x387c190", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24370, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24376, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f575c0", + "kind": "EnumConstantDecl", + "name": "INVERSION_ON", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + } + } + } + ] + } + ] + }, + { + "id": "0x387d050", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24394, + "line": 786, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24441, + "line": 787, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x387cfa0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24398, + "line": 786, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24403, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387cf88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24400, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24400, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387cf68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24400, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24400, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387c1f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24398, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24398, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387cf50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24403, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 24403, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387c210", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24403, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 24403, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"inversion_off\"" + } + ] + } + ] + }, + { + "id": "0x387d040", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24428, + "line": 787, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24441, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x387d010", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24435, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24441, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57610", + "kind": "EnumConstantDecl", + "name": "INVERSION_OFF", + "type": { + "qualType": "slsDetectorDefs::externalSignalFlag" + } + } + } + ] + } + ] + }, + { + "id": "0x387d668", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 24460, + "line": 788, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x387d650", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 24460, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x387d620", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x387d608", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x387d5e0", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x387d5c0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x387d5b8", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x387d588", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24466, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24514, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x387d570", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x387d558", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x387d538", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x387d530", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x387d4f8", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387d4e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24511, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 24511, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387d4c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24511, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 24511, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x387d4a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24479, + "col": 24, + "tokLen": 31 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387d080", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24479, + "col": 24, + "tokLen": 31 + }, + "end": { + "offset": 24479, + "col": 24, + "tokLen": 31 + } + }, + "type": { + "qualType": "const char[30]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown external signal flag \"" + } + ] + }, + { + "id": "0x387d0b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24513, + "col": 58, + "tokLen": 1 + }, + "end": { + "offset": 24513, + "col": 58, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38793e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x387d838", + "kind": "FunctionDecl", + "loc": { + "offset": 24550, + "file": "ToString.cpp", + "line": 791, + "col": 31, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 24520, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 24973, + "line": 803, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368b118", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs11readoutModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::readoutMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "inner": [ + { + "id": "0x2f5acf0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "decl": { + "id": "0x2f5ac48", + "kind": "EnumDecl", + "name": "readoutMode" + } + } + ] + }, + { + "id": "0x387d760", + "kind": "ParmVarDecl", + "loc": { + "offset": 24578, + "line": 791, + "col": 59, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 24559, + "col": 40, + "tokLen": 5 + }, + "end": { + "offset": 24578, + "col": 59, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x3882858", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 24581, + "col": 62, + "tokLen": 1 + }, + "end": { + "offset": 24973, + "line": 803, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x387e840", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24587, + "line": 792, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24627, + "line": 793, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x387e790", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24591, + "line": 792, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24596, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387e778", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24593, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24593, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387e758", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24593, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24593, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387d9f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24591, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24591, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387e740", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24596, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 24596, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387da10", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24596, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 24596, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"analog\"" + } + ] + } + ] + }, + { + "id": "0x387e830", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24614, + "line": 793, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24627, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x387e800", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24621, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24627, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ad10", + "kind": "EnumConstantDecl", + "name": "ANALOG_ONLY", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x387f6b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24644, + "line": 794, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24685, + "line": 795, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x387f600", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24648, + "line": 794, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24653, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x387f5e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24650, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24650, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x387f5c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24650, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24650, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387e860", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24648, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24648, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x387f5b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24653, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 24653, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387e880", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24653, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 24653, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"digital\"" + } + ] + } + ] + }, + { + "id": "0x387f6a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24672, + "line": 795, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24685, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x387f670", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24679, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24685, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ad60", + "kind": "EnumConstantDecl", + "name": "DIGITAL_ONLY", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3880530", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24703, + "line": 796, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24751, + "line": 797, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x3880480", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24707, + "line": 796, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24712, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3880468", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24709, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24709, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3880448", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24709, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24709, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x387f6d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24707, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24707, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3880430", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24712, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 24712, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x387f6f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24712, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 24712, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"analog_digital\"" + } + ] + } + ] + }, + { + "id": "0x3880520", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24738, + "line": 797, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24751, + "col": 22, + "tokLen": 18 + } + }, + "inner": [ + { + "id": "0x38804f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24745, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24751, + "col": 22, + "tokLen": 18 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5adb0", + "kind": "EnumConstantDecl", + "name": "ANALOG_AND_DIGITAL", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38813b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24775, + "line": 798, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24820, + "line": 799, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x3881300", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24779, + "line": 798, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24784, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38812e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24781, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24781, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38812c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24781, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24781, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3880550", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24779, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24779, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38812b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24784, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 24784, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3880570", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24784, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 24784, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"transceiver\"" + } + ] + } + ] + }, + { + "id": "0x38813a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24807, + "line": 799, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24820, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x3881370", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24814, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24820, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ae00", + "kind": "EnumConstantDecl", + "name": "TRANSCEIVER_ONLY", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3882230", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 24842, + "line": 800, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 24895, + "line": 801, + "col": 22, + "tokLen": 23 + } + }, + "inner": [ + { + "id": "0x3882180", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24846, + "line": 800, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24851, + "col": 14, + "tokLen": 21 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3882168", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24848, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24848, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3882148", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24848, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 24848, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38813d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24846, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 24846, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3882130", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24851, + "col": 14, + "tokLen": 21 + }, + "end": { + "offset": 24851, + "col": 14, + "tokLen": 21 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38813f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24851, + "col": 14, + "tokLen": 21 + }, + "end": { + "offset": 24851, + "col": 14, + "tokLen": 21 + } + }, + "type": { + "qualType": "const char[20]" + }, + "valueCategory": "lvalue", + "value": "\"digital_transceiver\"" + } + ] + } + ] + }, + { + "id": "0x3882220", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 24882, + "line": 801, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 24895, + "col": 22, + "tokLen": 23 + } + }, + "inner": [ + { + "id": "0x38821f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24889, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 24895, + "col": 22, + "tokLen": 23 + } + }, + "type": { + "qualType": "slsDetectorDefs::readoutMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ae50", + "kind": "EnumConstantDecl", + "name": "DIGITAL_AND_TRANSCEIVER", + "type": { + "qualType": "slsDetectorDefs::readoutMode" + } + } + } + ] + } + ] + }, + { + "id": "0x3882840", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 24924, + "line": 802, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x3882828", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 24924, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38827f8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38827e0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38827b8", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x3882798", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x3882790", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x3882760", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 24930, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 24970, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x3882748", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x3882730", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x3882710", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x3882708", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38826d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38826b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24967, + "col": 48, + "tokLen": 1 + }, + "end": { + "offset": 24967, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3882698", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24967, + "col": 48, + "tokLen": 1 + }, + "end": { + "offset": 24967, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x3882680", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24943, + "col": 24, + "tokLen": 23 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3882260", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 24943, + "col": 24, + "tokLen": 23 + }, + "end": { + "offset": 24943, + "col": 24, + "tokLen": 23 + } + }, + "type": { + "qualType": "const char[22]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown readout mode \"" + } + ] + }, + { + "id": "0x3882290", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 24969, + "col": 50, + "tokLen": 1 + }, + "end": { + "offset": 24969, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x387d760", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x3882a18", + "kind": "FunctionDecl", + "loc": { + "offset": 25003, + "file": "ToString.cpp", + "line": 805, + "col": 28, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 24976, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 30397, + "line": 991, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368b638", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8dacIndexEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::dacIndex (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "inner": [ + { + "id": "0x2f57a00", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "decl": { + "id": "0x2f57958", + "kind": "EnumDecl", + "name": "dacIndex" + } + } + ] + }, + { + "id": "0x3882940", + "kind": "ParmVarDecl", + "loc": { + "offset": 25031, + "line": 805, + "col": 56, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 25012, + "col": 37, + "tokLen": 5 + }, + "end": { + "offset": 25031, + "col": 56, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x7f1964637fa8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 25034, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 30397, + "line": 991, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x3884820", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25040, + "line": 806, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25091, + "line": 807, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3884788", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25044, + "line": 806, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25065, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3883970", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25044, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25049, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3883958", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25046, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25046, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3883938", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25046, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25046, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3882bd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25044, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25044, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3883920", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25049, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25049, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3882bf0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25049, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25049, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 0\"" + } + ] + } + ] + }, + { + "id": "0x3884750", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25060, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25065, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3884738", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25062, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25062, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3884718", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25062, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25062, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38839a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25060, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25060, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3884700", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25065, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25065, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38839c8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25065, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25065, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"0\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3884810", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25078, + "line": 807, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25091, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38847e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25085, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25091, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57a20", + "kind": "EnumConstantDecl", + "name": "DAC_0", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38864d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25102, + "line": 808, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25153, + "line": 809, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3886438", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25106, + "line": 808, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25127, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3885620", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25106, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25111, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3885608", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25108, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25108, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38855e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25108, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25108, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3884840", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25106, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25106, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38855d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25111, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25111, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3884860", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25111, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25111, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 1\"" + } + ] + } + ] + }, + { + "id": "0x3886400", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25122, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25127, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38863e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25124, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25124, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38863c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25124, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25124, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3885658", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25122, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25122, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38863b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25127, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25127, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3885678", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25127, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25127, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"1\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x38864c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25140, + "line": 809, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25153, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3886490", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25147, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25153, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57a70", + "kind": "EnumConstantDecl", + "name": "DAC_1", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3888140", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25164, + "line": 810, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25215, + "line": 811, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38880a8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25168, + "line": 810, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25189, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3887290", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25168, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25173, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3887278", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25170, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25170, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3887258", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25170, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25170, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38864f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25168, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25168, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3887240", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25173, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25173, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3886510", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25173, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25173, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 2\"" + } + ] + } + ] + }, + { + "id": "0x3888070", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25184, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25189, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3888058", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25186, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25186, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3888038", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25186, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25186, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38872c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25184, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25184, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3888020", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25189, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25189, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38872e8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25189, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25189, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"2\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3888130", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25202, + "line": 811, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25215, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3888100", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25209, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25215, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57ac0", + "kind": "EnumConstantDecl", + "name": "DAC_2", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3889db0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25226, + "line": 812, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25277, + "line": 813, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3889d18", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25230, + "line": 812, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25251, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3888f00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25230, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25235, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3888ee8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25232, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25232, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3888ec8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25232, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25232, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3888160", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25230, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25230, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3888eb0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25235, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25235, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3888180", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25235, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25235, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 3\"" + } + ] + } + ] + }, + { + "id": "0x3889ce0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25246, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25251, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3889cc8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25248, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25248, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3889ca8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25248, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25248, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3888f38", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25246, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25246, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3889c90", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25251, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25251, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3888f58", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25251, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25251, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"3\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3889da0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25264, + "line": 813, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25277, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3889d70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25271, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25277, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57b10", + "kind": "EnumConstantDecl", + "name": "DAC_3", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x388ba20", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25288, + "line": 814, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25339, + "line": 815, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388b988", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25292, + "line": 814, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25313, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x388ab70", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25292, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25297, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388ab58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25294, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25294, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388ab38", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25294, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25294, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3889dd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25292, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25292, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388ab20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25297, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25297, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3889df0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25297, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25297, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 4\"" + } + ] + } + ] + }, + { + "id": "0x388b950", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25308, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25313, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388b938", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25310, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25310, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388b918", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25310, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25310, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388aba8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25308, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25308, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388b900", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25313, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25313, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388abc8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25313, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25313, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"4\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x388ba10", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25326, + "line": 815, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25339, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388b9e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25333, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25339, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57b60", + "kind": "EnumConstantDecl", + "name": "DAC_4", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x388d690", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25350, + "line": 816, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25401, + "line": 817, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388d5f8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25354, + "line": 816, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25375, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x388c7e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25354, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25359, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388c7c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25356, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25356, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388c7a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25356, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25356, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388ba40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25354, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25354, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388c790", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25359, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25359, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388ba60", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25359, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25359, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 5\"" + } + ] + } + ] + }, + { + "id": "0x388d5c0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25370, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25375, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388d5a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25372, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25372, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388d588", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25372, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25372, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388c818", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25370, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25370, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388d570", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25375, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25375, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388c838", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25375, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25375, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"5\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x388d680", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25388, + "line": 817, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25401, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388d650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25395, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25401, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57bb0", + "kind": "EnumConstantDecl", + "name": "DAC_5", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x388f300", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25412, + "line": 818, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25463, + "line": 819, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388f268", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25416, + "line": 818, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25437, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x388e450", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25416, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25421, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388e438", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25418, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25418, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388e418", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25418, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25418, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388d6b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25416, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25416, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388e400", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25421, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25421, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388d6d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25421, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25421, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 6\"" + } + ] + } + ] + }, + { + "id": "0x388f230", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25432, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25437, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x388f218", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25434, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25434, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x388f1f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25434, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25434, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388e488", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25432, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25432, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x388f1e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25437, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25437, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388e4a8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25437, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25437, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"6\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x388f2f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25450, + "line": 819, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25463, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x388f2c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25457, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25463, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57c00", + "kind": "EnumConstantDecl", + "name": "DAC_6", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3890f70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25474, + "line": 820, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25525, + "line": 821, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3890ed8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25478, + "line": 820, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25499, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38900c0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25478, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25483, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38900a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25480, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25480, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3890088", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25480, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25480, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x388f320", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25478, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25478, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3890070", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25483, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25483, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x388f340", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25483, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25483, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 7\"" + } + ] + } + ] + }, + { + "id": "0x3890ea0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25494, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25499, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3890e88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25496, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25496, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3890e68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25496, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25496, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38900f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25494, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25494, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3890e50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25499, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25499, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3890118", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25499, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25499, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"7\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3890f60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25512, + "line": 821, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25525, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3890f30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25519, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25525, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57c50", + "kind": "EnumConstantDecl", + "name": "DAC_7", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3892be0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25536, + "line": 822, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25587, + "line": 823, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3892b48", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25540, + "line": 822, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25561, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3891d30", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25540, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25545, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3891d18", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25542, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25542, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3891cf8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25542, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25542, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3890f90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25540, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25540, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3891ce0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25545, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25545, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3890fb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25545, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25545, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 8\"" + } + ] + } + ] + }, + { + "id": "0x3892b10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25556, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25561, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3892af8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25558, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25558, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3892ad8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25558, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25558, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3891d68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25556, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25556, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3892ac0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25561, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25561, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3891d88", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25561, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25561, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"8\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3892bd0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25574, + "line": 823, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25587, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3892ba0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25581, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25587, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57ca0", + "kind": "EnumConstantDecl", + "name": "DAC_8", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3894850", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25598, + "line": 824, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25649, + "line": 825, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38947b8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25602, + "line": 824, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25623, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38939a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25602, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25607, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3893988", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25604, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25604, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3893968", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25604, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25604, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3892c00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25602, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25602, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3893950", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25607, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25607, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3892c20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25607, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 25607, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"dac 9\"" + } + ] + } + ] + }, + { + "id": "0x3894780", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25618, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25623, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3894768", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25620, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25620, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3894748", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25620, + "col": 27, + "tokLen": 2 + }, + "end": { + "offset": 25620, + "col": 27, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38939d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25618, + "col": 25, + "tokLen": 1 + }, + "end": { + "offset": 25618, + "col": 25, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3894730", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25623, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25623, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38939f8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25623, + "col": 30, + "tokLen": 3 + }, + "end": { + "offset": 25623, + "col": 30, + "tokLen": 3 + } + }, + "type": { + "qualType": "const char[2]" + }, + "valueCategory": "lvalue", + "value": "\"9\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3894840", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25636, + "line": 825, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25649, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x3894810", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25643, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25649, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57cf0", + "kind": "EnumConstantDecl", + "name": "DAC_9", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38964e0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25660, + "line": 826, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25713, + "line": 827, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3896448", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25664, + "line": 826, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25686, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3895630", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25664, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25669, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3895618", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25666, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25666, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38955f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25666, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25666, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3894870", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25664, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25664, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38955e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25669, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25669, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3894890", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25669, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25669, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 10\"" + } + ] + } + ] + }, + { + "id": "0x3896410", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25681, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25686, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38963f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25683, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25683, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38963d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25683, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25683, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3895668", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25681, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25681, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38963c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25686, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25686, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3895688", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25686, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25686, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"10\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x38964d0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25700, + "line": 827, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25713, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38964a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25707, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25713, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57d40", + "kind": "EnumConstantDecl", + "name": "DAC_10", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3898150", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25725, + "line": 828, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25778, + "line": 829, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38980b8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25729, + "line": 828, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25751, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38972a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25729, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25734, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3897288", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25731, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25731, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3897268", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25731, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25731, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3896500", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25729, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25729, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3897250", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25734, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25734, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3896520", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25734, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25734, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 11\"" + } + ] + } + ] + }, + { + "id": "0x3898080", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25746, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25751, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3898068", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25748, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25748, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3898048", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25748, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25748, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38972d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25746, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25746, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3898030", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25751, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25751, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38972f8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25751, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25751, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"11\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3898140", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25765, + "line": 829, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25778, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3898110", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25772, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25778, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57d90", + "kind": "EnumConstantDecl", + "name": "DAC_11", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x3899dc0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25790, + "line": 830, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25843, + "line": 831, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3899d28", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25794, + "line": 830, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25816, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x3898f10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25794, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25799, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3898ef8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25796, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25796, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3898ed8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25796, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25796, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3898170", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25794, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25794, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3898ec0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25799, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25799, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3898190", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25799, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25799, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 12\"" + } + ] + } + ] + }, + { + "id": "0x3899cf0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25811, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25816, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x3899cd8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25813, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25813, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x3899cb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25813, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25813, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3898f48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25811, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25811, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x3899ca0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25816, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25816, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3898f68", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25816, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25816, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"12\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x3899db0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25830, + "line": 831, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25843, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x3899d80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25837, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25843, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57de0", + "kind": "EnumConstantDecl", + "name": "DAC_12", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x389ba30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25855, + "line": 832, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25908, + "line": 833, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389b998", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25859, + "line": 832, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25881, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x389ab80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25859, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25864, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389ab68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25861, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25861, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389ab48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25861, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25861, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x3899de0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25859, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25859, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389ab30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25864, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25864, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x3899e00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25864, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25864, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 13\"" + } + ] + } + ] + }, + { + "id": "0x389b960", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25876, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25881, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389b948", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25878, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25878, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389b928", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25878, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25878, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389abb8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25876, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25876, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389b910", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25881, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25881, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389abd8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25881, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25881, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"13\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x389ba20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25895, + "line": 833, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25908, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389b9f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25902, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25908, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57e30", + "kind": "EnumConstantDecl", + "name": "DAC_13", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x389d6a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25920, + "line": 834, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 25973, + "line": 835, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389d608", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25924, + "line": 834, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25946, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x389c7f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25924, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25929, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389c7d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25926, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25926, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389c7b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25926, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25926, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389ba50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25924, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25924, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389c7a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25929, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25929, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389ba70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25929, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25929, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 14\"" + } + ] + } + ] + }, + { + "id": "0x389d5d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25941, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25946, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389d5b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25943, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25943, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389d598", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25943, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 25943, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389c828", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25941, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 25941, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389d580", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25946, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25946, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389c848", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25946, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 25946, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"14\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x389d690", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 25960, + "line": 835, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 25973, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389d660", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25967, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 25973, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57e80", + "kind": "EnumConstantDecl", + "name": "DAC_14", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x389f310", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 25985, + "line": 836, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26038, + "line": 837, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389f278", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 25989, + "line": 836, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26011, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x389e460", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 25989, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25994, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389e448", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25991, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25991, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389e428", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25991, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 25991, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389d6c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 25989, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 25989, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389e410", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 25994, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25994, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389d6e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 25994, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 25994, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 15\"" + } + ] + } + ] + }, + { + "id": "0x389f240", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26006, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26011, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x389f228", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26008, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26008, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x389f208", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26008, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26008, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389e498", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26006, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26006, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x389f1f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26011, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26011, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389e4b8", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26011, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26011, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"15\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x389f300", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26025, + "line": 837, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26038, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x389f2d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26032, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26038, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57ed0", + "kind": "EnumConstantDecl", + "name": "DAC_15", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a0f80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26050, + "line": 838, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26103, + "line": 839, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a0ee8", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 26054, + "line": 838, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26076, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38a00d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26054, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26059, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a00b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26056, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26056, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a0098", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26056, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26056, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x389f330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26054, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26054, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a0080", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26059, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26059, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x389f350", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26059, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26059, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 16\"" + } + ] + } + ] + }, + { + "id": "0x38a0eb0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26071, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26076, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a0e98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26073, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26073, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a0e78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26073, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26073, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a0108", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26071, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26071, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a0e60", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26076, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26076, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a0128", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26076, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26076, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"16\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x38a0f70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26090, + "line": 839, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26103, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a0f40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26097, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26103, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57f20", + "kind": "EnumConstantDecl", + "name": "DAC_16", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a2bf0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26115, + "line": 840, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26168, + "line": 841, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a2b58", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 26119, + "line": 840, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26141, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "||", + "inner": [ + { + "id": "0x38a1d40", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26119, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26124, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a1d28", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26121, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26121, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a1d08", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26121, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26121, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a0fa0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26119, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26119, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a1cf0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26124, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26124, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a0fc0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26124, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26124, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"dac 17\"" + } + ] + } + ] + }, + { + "id": "0x38a2b20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26136, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26141, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a2b08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26138, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26138, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a2ae8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26138, + "col": 28, + "tokLen": 2 + }, + "end": { + "offset": 26138, + "col": 28, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a1d78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26136, + "col": 26, + "tokLen": 1 + }, + "end": { + "offset": 26136, + "col": 26, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a2ad0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26141, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26141, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a1d98", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26141, + "col": 31, + "tokLen": 4 + }, + "end": { + "offset": 26141, + "col": 31, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"17\"" + } + ] + } + ] + } + ] + }, + { + "id": "0x38a2be0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26155, + "line": 841, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26168, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a2bb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26162, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26168, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57f70", + "kind": "EnumConstantDecl", + "name": "DAC_17", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a3a60", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26180, + "line": 842, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26218, + "line": 843, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38a39b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26184, + "line": 842, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26189, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a3998", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26186, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26186, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a3978", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26186, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26186, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a2c10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26184, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26184, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a3960", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26189, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26189, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a2c30", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26189, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26189, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vsvp\"" + } + ] + } + ] + }, + { + "id": "0x38a3a50", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26205, + "line": 843, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26218, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38a3a20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26212, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26218, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f57fc0", + "kind": "EnumConstantDecl", + "name": "VSVP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a48d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26228, + "line": 844, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26267, + "line": 845, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38a4820", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26232, + "line": 844, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26237, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a4808", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26234, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26234, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a47e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26234, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26234, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a3a80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26232, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26232, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a47d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26237, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 26237, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a3aa0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26237, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 26237, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vtrim\"" + } + ] + } + ] + }, + { + "id": "0x38a48c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26254, + "line": 845, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26267, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38a4890", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26261, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26267, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58010", + "kind": "EnumConstantDecl", + "name": "VTRIM", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a5760", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26278, + "line": 846, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26320, + "line": 847, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38a56b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26282, + "line": 846, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26287, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a5698", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26284, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26284, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a5678", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26284, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26284, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a48f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26282, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26282, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a5660", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26287, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26287, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a4910", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26287, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26287, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vrpreamp\"" + } + ] + } + ] + }, + { + "id": "0x38a5750", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26307, + "line": 847, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26320, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38a5720", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26314, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26320, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58060", + "kind": "EnumConstantDecl", + "name": "VRPREAMP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a65d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26334, + "line": 848, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26376, + "line": 849, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38a6520", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26338, + "line": 848, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26343, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a6508", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26340, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26340, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a64e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26340, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26340, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a5780", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26338, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26338, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a64d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26343, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26343, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a57a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26343, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26343, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vrshaper\"" + } + ] + } + ] + }, + { + "id": "0x38a65c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26363, + "line": 849, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26376, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38a6590", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26370, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26376, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f580b0", + "kind": "EnumConstantDecl", + "name": "VRSHAPER", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a7440", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26390, + "line": 850, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26428, + "line": 851, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38a7390", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26394, + "line": 850, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26399, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a7378", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26396, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26396, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a7358", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26396, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26396, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a65f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26394, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26394, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a7340", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26399, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26399, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a6610", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26399, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26399, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vsvn\"" + } + ] + } + ] + }, + { + "id": "0x38a7430", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26415, + "line": 851, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26428, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38a7400", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26422, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26428, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58100", + "kind": "EnumConstantDecl", + "name": "VSVN", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a82b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26438, + "line": 852, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26478, + "line": 853, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a8200", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26442, + "line": 852, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26447, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a81e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26444, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26444, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a81c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26444, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26444, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a7460", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26442, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26442, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a81b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26447, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26447, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a7480", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26447, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26447, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vtgstv\"" + } + ] + } + ] + }, + { + "id": "0x38a82a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26465, + "line": 853, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26478, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38a8270", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26472, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26478, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58150", + "kind": "EnumConstantDecl", + "name": "VTGSTV", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a9120", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26490, + "line": 854, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26531, + "line": 855, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38a9070", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26494, + "line": 854, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26499, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a9058", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26496, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26496, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a9038", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26496, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26496, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a82d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26494, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26494, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a9020", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26499, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26499, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a82f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26499, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26499, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vcmp_ll\"" + } + ] + } + ] + }, + { + "id": "0x38a9110", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26518, + "line": 855, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26531, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38a90e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26525, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26531, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f581a0", + "kind": "EnumConstantDecl", + "name": "VCMP_LL", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38a9f90", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26544, + "line": 856, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26585, + "line": 857, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38a9ee0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26548, + "line": 856, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26553, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38a9ec8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26550, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26550, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38a9ea8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26550, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26550, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a9140", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26548, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26548, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38a9e90", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26553, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26553, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a9160", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26553, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26553, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vcmp_lr\"" + } + ] + } + ] + }, + { + "id": "0x38a9f80", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26572, + "line": 857, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26585, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38a9f50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26579, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26585, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f581f0", + "kind": "EnumConstantDecl", + "name": "VCMP_LR", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38aae00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26598, + "line": 858, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26636, + "line": 859, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38aad50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26602, + "line": 858, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26607, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38aad38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26604, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26604, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38aad18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26604, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26604, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38a9fb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26602, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26602, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38aad00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26607, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26607, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38a9fd0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26607, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 26607, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vcal\"" + } + ] + } + ] + }, + { + "id": "0x38aadf0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26623, + "line": 859, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26636, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38aadc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26630, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26636, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58240", + "kind": "EnumConstantDecl", + "name": "VCAL", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38abc70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26646, + "line": 860, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26687, + "line": 861, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38abbc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26650, + "line": 860, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26655, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38abba8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26652, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26652, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38abb88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26652, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26652, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38aae20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26650, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26650, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38abb70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26655, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26655, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38aae40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26655, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26655, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vcmp_rl\"" + } + ] + } + ] + }, + { + "id": "0x38abc60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26674, + "line": 861, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26687, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38abc30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26681, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26687, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58290", + "kind": "EnumConstantDecl", + "name": "VCMP_RL", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38acae0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26700, + "line": 862, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26740, + "line": 863, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38aca30", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26704, + "line": 862, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26709, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38aca18", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26706, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26706, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ac9f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26706, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26706, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38abc90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26704, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26704, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ac9e0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26709, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26709, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38abcb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26709, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26709, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"rxb_rb\"" + } + ] + } + ] + }, + { + "id": "0x38acad0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26727, + "line": 863, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26740, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38acaa0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26734, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26740, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f582e0", + "kind": "EnumConstantDecl", + "name": "RXB_RB", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ad950", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26752, + "line": 864, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26792, + "line": 865, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38ad8a0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26756, + "line": 864, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26761, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ad888", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26758, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26758, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ad868", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26758, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26758, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38acb00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26756, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26756, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ad850", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26761, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26761, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38acb20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26761, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 26761, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"rxb_lb\"" + } + ] + } + ] + }, + { + "id": "0x38ad940", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26779, + "line": 865, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26792, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38ad910", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26786, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26792, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58330", + "kind": "EnumConstantDecl", + "name": "RXB_LB", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ae7c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26804, + "line": 866, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26845, + "line": 867, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38ae710", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26808, + "line": 866, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26813, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ae6f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26810, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26810, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ae6d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26810, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26810, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ad970", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26808, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26808, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ae6c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26813, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26813, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ad990", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26813, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 26813, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vcmp_rr\"" + } + ] + } + ] + }, + { + "id": "0x38ae7b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26832, + "line": 867, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26845, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38ae780", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26839, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26845, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58380", + "kind": "EnumConstantDecl", + "name": "VCMP_RR", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38af630", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26858, + "line": 868, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26895, + "line": 869, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38af580", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26862, + "line": 868, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26867, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38af568", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26864, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26864, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38af548", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26864, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26864, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ae7e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26862, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26862, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38af530", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26867, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 26867, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ae800", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26867, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 26867, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"vcp\"" + } + ] + } + ] + }, + { + "id": "0x38af620", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26882, + "line": 869, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26895, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38af5f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26889, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26895, + "col": 22, + "tokLen": 3 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f583d0", + "kind": "EnumConstantDecl", + "name": "VCP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b04a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26904, + "line": 870, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26941, + "line": 871, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38b03f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26908, + "line": 870, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26913, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b03d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26910, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26910, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b03b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26910, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26910, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38af650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26908, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26908, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b03a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26913, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 26913, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38af670", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26913, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 26913, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"vcn\"" + } + ] + } + ] + }, + { + "id": "0x38b0490", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26928, + "line": 871, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26941, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38b0460", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26935, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26941, + "col": 22, + "tokLen": 3 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58420", + "kind": "EnumConstantDecl", + "name": "VCN", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b1310", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 26950, + "line": 872, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 26992, + "line": 873, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38b1260", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 26954, + "line": 872, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26959, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b1248", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26956, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26956, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b1228", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26956, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 26956, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b04c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26954, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 26954, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b1210", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 26959, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26959, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b04e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 26959, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 26959, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vishaper\"" + } + ] + } + ] + }, + { + "id": "0x38b1300", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 26979, + "line": 873, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 26992, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38b12d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 26986, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 26992, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58470", + "kind": "EnumConstantDecl", + "name": "VISHAPER", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b2190", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27006, + "line": 874, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27050, + "line": 875, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38b20e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27010, + "line": 874, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27015, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b20c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27012, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27012, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b20a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27012, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27012, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b1330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27010, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27010, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b2090", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27015, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27015, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b1350", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27015, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27015, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vthreshold\"" + } + ] + } + ] + }, + { + "id": "0x38b2180", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27037, + "line": 875, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27050, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38b2150", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27044, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27050, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f584c0", + "kind": "EnumConstantDecl", + "name": "VTHRESHOLD", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b3000", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27066, + "line": 876, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27107, + "line": 877, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38b2f50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27070, + "line": 876, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27075, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b2f38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27072, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27072, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b2f18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27072, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27072, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b21b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27070, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27070, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b2f00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27075, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27075, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b21d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27075, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27075, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vref_ds\"" + } + ] + } + ] + }, + { + "id": "0x38b2ff0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27094, + "line": 877, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27107, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38b2fc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27101, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27107, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58560", + "kind": "EnumConstantDecl", + "name": "VREF_DS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b3e80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27120, + "line": 878, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27163, + "line": 879, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b3dd0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27124, + "line": 878, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27129, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b3db8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27126, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27126, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b3d98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27126, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27126, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b3020", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27124, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27124, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b3d80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27129, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27129, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b3040", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27129, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27129, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcascn_pb\"" + } + ] + } + ] + }, + { + "id": "0x38b3e70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27150, + "line": 879, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27163, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b3e40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27157, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27163, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f585b0", + "kind": "EnumConstantDecl", + "name": "VCASCN_PB", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b4d00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27178, + "line": 880, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27221, + "line": 881, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b4c50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27182, + "line": 880, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27187, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b4c38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27184, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27184, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b4c18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27184, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27184, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b3ea0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27182, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27182, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b4c00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27187, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27187, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b3ec0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27187, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27187, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcascp_pb\"" + } + ] + } + ] + }, + { + "id": "0x38b4cf0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27208, + "line": 881, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27221, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b4cc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27215, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27221, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58600", + "kind": "EnumConstantDecl", + "name": "VCASCP_PB", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b5b90", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27236, + "line": 882, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27277, + "line": 883, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38b5ae0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27240, + "line": 882, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27245, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b5ac8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27242, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27242, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b5aa8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27242, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27242, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b4d20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27240, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27240, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b5a90", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27245, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27245, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b4d40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27245, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27245, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vout_cm\"" + } + ] + } + ] + }, + { + "id": "0x38b5b80", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27264, + "line": 883, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27277, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38b5b50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27271, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27277, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58650", + "kind": "EnumConstantDecl", + "name": "VOUT_CM", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b6a10", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27290, + "line": 884, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27333, + "line": 885, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b6960", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27294, + "line": 884, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27299, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b6948", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27296, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27296, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b6928", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27296, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27296, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b5bb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27294, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27294, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b6910", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27299, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27299, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b5bd0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27299, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27299, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcasc_out\"" + } + ] + } + ] + }, + { + "id": "0x38b6a00", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27320, + "line": 885, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27333, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b69d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27327, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27333, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f586a0", + "kind": "EnumConstantDecl", + "name": "VCASC_OUT", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b7880", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27348, + "line": 886, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27388, + "line": 887, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38b77d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27352, + "line": 886, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27357, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b77b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27354, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27354, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b7798", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27354, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27354, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b6a30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27352, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27352, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b7780", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27357, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 27357, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b6a50", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27357, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 27357, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vin_cm\"" + } + ] + } + ] + }, + { + "id": "0x38b7870", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27375, + "line": 887, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27388, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38b7840", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27382, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27388, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f586f0", + "kind": "EnumConstantDecl", + "name": "VIN_CM", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b8700", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27400, + "line": 888, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27443, + "line": 889, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b8650", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27404, + "line": 888, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27409, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b8638", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27406, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27406, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b8618", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27406, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27406, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b78a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27404, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27404, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b8600", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27409, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27409, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b78c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27409, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27409, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vref_comp\"" + } + ] + } + ] + }, + { + "id": "0x38b86f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27430, + "line": 889, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27443, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38b86c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27437, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27443, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58740", + "kind": "EnumConstantDecl", + "name": "VREF_COMP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38b9580", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27458, + "line": 890, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27501, + "line": 891, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38b94d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27462, + "line": 890, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27467, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38b94b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27464, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27464, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38b9498", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27464, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27464, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b8720", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27462, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27462, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38b9480", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27467, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27467, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b8740", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27467, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27467, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"ib_test_c\"" + } + ] + } + ] + }, + { + "id": "0x38b9570", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27488, + "line": 891, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27501, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38b9540", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27495, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27501, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58790", + "kind": "EnumConstantDecl", + "name": "IB_TESTC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ba3f0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27515, + "line": 892, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27556, + "line": 893, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38ba340", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27519, + "line": 892, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27524, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ba328", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27521, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27521, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ba308", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27521, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27521, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38b95a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27519, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27519, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ba2f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27524, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27524, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38b95c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27524, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27524, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vb_comp\"" + } + ] + } + ] + }, + { + "id": "0x38ba3e0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27543, + "line": 893, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27556, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38ba3b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27550, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27556, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f587e0", + "kind": "EnumConstantDecl", + "name": "VB_COMP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bb260", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27569, + "line": 894, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27611, + "line": 895, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38bb1b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27573, + "line": 894, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27578, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bb198", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27575, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27575, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bb178", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27575, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27575, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ba410", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27573, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27573, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bb160", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27578, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 27578, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ba430", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27578, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 27578, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vdd_prot\"" + } + ] + } + ] + }, + { + "id": "0x38bb250", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27598, + "line": 895, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27611, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38bb220", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27605, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27611, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58830", + "kind": "EnumConstantDecl", + "name": "VDD_PROT", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bc0d0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27625, + "line": 896, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27666, + "line": 897, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38bc020", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27629, + "line": 896, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27634, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bc008", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27631, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27631, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bbfe8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27631, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27631, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bb280", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27629, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27629, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bbfd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27634, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27634, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bb2a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27634, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 27634, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"vin_com\"" + } + ] + } + ] + }, + { + "id": "0x38bc0c0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27653, + "line": 897, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27666, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38bc090", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27660, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27666, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58880", + "kind": "EnumConstantDecl", + "name": "VIN_COM", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bcf50", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27679, + "line": 898, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27723, + "line": 899, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38bcea0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27683, + "line": 898, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27688, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bce88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27685, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27685, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bce68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27685, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27685, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bc0f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27683, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27683, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bce50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27688, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27688, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bc110", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27688, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27688, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vref_prech\"" + } + ] + } + ] + }, + { + "id": "0x38bcf40", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27710, + "line": 899, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27723, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38bcf10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27717, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27723, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f588d0", + "kind": "EnumConstantDecl", + "name": "VREF_PRECH", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bddd0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27739, + "line": 900, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27782, + "line": 901, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38bdd20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27743, + "line": 900, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27748, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bdd08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27745, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27745, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bdce8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27745, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27745, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bcf70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27743, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27743, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bdcd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27748, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27748, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bcf90", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27748, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 27748, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vb_pixbuf\"" + } + ] + } + ] + }, + { + "id": "0x38bddc0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27769, + "line": 901, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27782, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38bdd90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27776, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27782, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58920", + "kind": "EnumConstantDecl", + "name": "VB_PIXBUF", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bec40", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27797, + "line": 902, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27836, + "line": 903, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38beb90", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27801, + "line": 902, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27806, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38beb78", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27803, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27803, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38beb58", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27803, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27803, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bddf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27801, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27801, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38beb40", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27806, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 27806, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bde10", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27806, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 27806, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vb_ds\"" + } + ] + } + ] + }, + { + "id": "0x38bec30", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27823, + "line": 903, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27836, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38bec00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27830, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27836, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58970", + "kind": "EnumConstantDecl", + "name": "VB_DS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38bfac0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27847, + "line": 904, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27891, + "line": 905, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38bfa10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27851, + "line": 904, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27856, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38bf9f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27853, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27853, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38bf9d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27853, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27853, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bec60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27851, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27851, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38bf9c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27856, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27856, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bec80", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27856, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27856, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vref_h_adc\"" + } + ] + } + ] + }, + { + "id": "0x38bfab0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27878, + "line": 905, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27891, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38bfa80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27885, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27891, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f589c0", + "kind": "EnumConstantDecl", + "name": "VREF_H_ADC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c0940", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27907, + "line": 906, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 27951, + "line": 907, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c0890", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27911, + "line": 906, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27916, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c0878", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27913, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27913, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c0858", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27913, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27913, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38bfae0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27911, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27911, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c0840", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27916, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27916, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38bfb00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27916, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 27916, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vb_comp_fe\"" + } + ] + } + ] + }, + { + "id": "0x38c0930", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27938, + "line": 907, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 27951, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c0900", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27945, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 27951, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58a10", + "kind": "EnumConstantDecl", + "name": "VB_COMP_FE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c17c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 27967, + "line": 908, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28012, + "line": 909, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38c1710", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 27971, + "line": 908, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27976, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c16f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27973, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27973, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c16d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27973, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 27973, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c0960", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 27971, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 27971, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c16c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 27976, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 27976, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c0980", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 27976, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 27976, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"vb_comp_adc\"" + } + ] + } + ] + }, + { + "id": "0x38c17b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 27999, + "line": 909, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28012, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38c1780", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28006, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28012, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58a60", + "kind": "EnumConstantDecl", + "name": "VB_COMP_ADC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c2630", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28029, + "line": 910, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28071, + "line": 911, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38c2580", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28033, + "line": 910, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28038, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c2568", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28035, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28035, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c2548", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28035, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28035, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c17e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28033, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28033, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c2530", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28038, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 28038, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c1800", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28038, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 28038, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vcom_cds\"" + } + ] + } + ] + }, + { + "id": "0x38c2620", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28058, + "line": 911, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28071, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38c25f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28065, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28071, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58ab0", + "kind": "EnumConstantDecl", + "name": "VCOM_CDS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c34b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28085, + "line": 912, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28130, + "line": 913, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38c3400", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28089, + "line": 912, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28094, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c33e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28091, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28091, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c33c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28091, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28091, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c2650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28089, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28089, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c33b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28094, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 28094, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c2670", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28094, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 28094, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"vref_rstore\"" + } + ] + } + ] + }, + { + "id": "0x38c34a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28117, + "line": 913, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28130, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x38c3470", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28124, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28130, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58b00", + "kind": "EnumConstantDecl", + "name": "VREF_RSTORE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c4330", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28147, + "line": 914, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28191, + "line": 915, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c4280", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28151, + "line": 914, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28156, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c4268", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28153, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28153, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c4248", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28153, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28153, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c34d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28151, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28151, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c4230", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28156, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28156, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c34f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28156, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28156, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vb_opa_1st\"" + } + ] + } + ] + }, + { + "id": "0x38c4320", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28178, + "line": 915, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28191, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c42f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28185, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28191, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58b50", + "kind": "EnumConstantDecl", + "name": "VB_OPA_1ST", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c51c8", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28207, + "line": 916, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28253, + "line": 917, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x38c5100", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28211, + "line": 916, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28216, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c50e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28213, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28213, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c50c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28213, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28213, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c4350", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28211, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28211, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c50b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28216, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 28216, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c4370", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28216, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 28216, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"vref_comp_fe\"" + } + ] + } + ] + }, + { + "id": "0x38c51b8", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28240, + "line": 917, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28253, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x38c5188", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28247, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28253, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58ba0", + "kind": "EnumConstantDecl", + "name": "VREF_COMP_FE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c6040", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28271, + "line": 918, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28314, + "line": 919, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38c5f90", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28275, + "line": 918, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28280, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c5f78", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28277, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28277, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c5f58", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28277, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28277, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c51e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28275, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28275, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c5f40", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28280, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28280, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c5208", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28280, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28280, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcom_adc1\"" + } + ] + } + ] + }, + { + "id": "0x38c6030", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28301, + "line": 919, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28314, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38c6000", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28308, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28314, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58bf0", + "kind": "EnumConstantDecl", + "name": "VCOM_ADC1", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c6ec0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28329, + "line": 920, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28373, + "line": 921, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c6e10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28333, + "line": 920, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28338, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c6df8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28335, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28335, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c6dd8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28335, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28335, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c6060", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28333, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28333, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c6dc0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28338, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28338, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c6080", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28338, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28338, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vref_l_adc\"" + } + ] + } + ] + }, + { + "id": "0x38c6eb0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28360, + "line": 921, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28373, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38c6e80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28367, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28373, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58c40", + "kind": "EnumConstantDecl", + "name": "VREF_L_ADC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c7d30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28389, + "line": 922, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28431, + "line": 923, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38c7c80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28393, + "line": 922, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28398, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c7c68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28395, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28395, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c7c48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28395, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28395, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c6ee0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28393, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28393, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c7c30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28398, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 28398, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c6f00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28398, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 28398, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"vref_cds\"" + } + ] + } + ] + }, + { + "id": "0x38c7d20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28418, + "line": 923, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28431, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38c7cf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28425, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28431, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58c90", + "kind": "EnumConstantDecl", + "name": "VREF_CDS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c8ba0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28445, + "line": 924, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28484, + "line": 925, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38c8af0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28449, + "line": 924, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28454, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c8ad8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28451, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28451, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c8ab8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28451, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28451, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c7d50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28449, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28449, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c8aa0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28454, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 28454, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c7d70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28454, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 28454, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vb_cs\"" + } + ] + } + ] + }, + { + "id": "0x38c8b90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28471, + "line": 925, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28484, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38c8b60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28478, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28484, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58ce0", + "kind": "EnumConstantDecl", + "name": "VB_CS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38c9a20", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28495, + "line": 926, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28538, + "line": 927, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38c9970", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28499, + "line": 926, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28504, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38c9958", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28501, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28501, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38c9938", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28501, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28501, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c8bc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28499, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28499, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38c9920", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28504, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28504, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c8be0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28504, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28504, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vb_opa_fd\"" + } + ] + } + ] + }, + { + "id": "0x38c9a10", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28525, + "line": 927, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28538, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38c99e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28532, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28538, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58d30", + "kind": "EnumConstantDecl", + "name": "VB_OPA_FD", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ca8a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28553, + "line": 928, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28596, + "line": 929, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38ca7f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28557, + "line": 928, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28562, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ca7d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28559, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28559, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ca7b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28559, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28559, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38c9a40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28557, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28557, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ca7a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28562, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28562, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38c9a60", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28562, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28562, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcom_adc2\"" + } + ] + } + ] + }, + { + "id": "0x38ca890", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28583, + "line": 929, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28596, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38ca860", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28590, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28596, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58d80", + "kind": "EnumConstantDecl", + "name": "VCOM_ADC2", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cb710", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28611, + "line": 930, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28651, + "line": 931, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38cb660", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28615, + "line": 930, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28620, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cb648", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28617, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28617, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cb628", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28617, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28617, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ca8c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28615, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28615, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38cb610", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28620, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 28620, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ca8e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28620, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 28620, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vcassh\"" + } + ] + } + ] + }, + { + "id": "0x38cb700", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28638, + "line": 931, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28651, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38cb6d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28645, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28651, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58dd0", + "kind": "EnumConstantDecl", + "name": "VCASSH", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cc580", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28663, + "line": 932, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28701, + "line": 933, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cc4d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28667, + "line": 932, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28672, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cc4b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28669, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28669, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cc498", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28669, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28669, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cb730", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28667, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28667, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38cc480", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28672, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28672, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cb750", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28672, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28672, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vth2\"" + } + ] + } + ] + }, + { + "id": "0x38cc570", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28688, + "line": 933, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28701, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cc540", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28695, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28701, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58e20", + "kind": "EnumConstantDecl", + "name": "VTH2", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cd400", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28711, + "line": 934, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28755, + "line": 935, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38cd350", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28715, + "line": 934, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28720, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cd338", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28717, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28717, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cd318", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28717, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28717, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cc5a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28715, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28715, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38cd300", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28720, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28720, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cc5c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28720, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 28720, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vrshaper_n\"" + } + ] + } + ] + }, + { + "id": "0x38cd3f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28742, + "line": 935, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28755, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x38cd3c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28749, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28755, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58e70", + "kind": "EnumConstantDecl", + "name": "VRSHAPER_N", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38ce280", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28771, + "line": 936, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28814, + "line": 937, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38ce1d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28775, + "line": 936, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28780, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38ce1b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28777, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28777, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38ce198", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28777, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28777, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cd420", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28775, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28775, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ce180", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28780, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28780, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cd440", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28780, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 28780, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vipre_out\"" + } + ] + } + ] + }, + { + "id": "0x38ce270", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28801, + "line": 937, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28814, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x38ce240", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28808, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28814, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58ec0", + "kind": "EnumConstantDecl", + "name": "VIPRE_OUT", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cf0f0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28829, + "line": 938, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28867, + "line": 939, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cf040", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28833, + "line": 938, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28838, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cf028", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28835, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28835, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cf008", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28835, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28835, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38ce2a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28833, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28833, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38ceff0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28838, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28838, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38ce2c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28838, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28838, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vth3\"" + } + ] + } + ] + }, + { + "id": "0x38cf0e0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28854, + "line": 939, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28867, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cf0b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28861, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28867, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58f10", + "kind": "EnumConstantDecl", + "name": "VTH3", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38cff60", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28877, + "line": 940, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28915, + "line": 941, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cfeb0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28881, + "line": 940, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28886, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38cfe98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28883, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28883, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38cfe78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28883, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28883, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cf110", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28881, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28881, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38cfe60", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28886, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28886, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cf130", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28886, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28886, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vth1\"" + } + ] + } + ] + }, + { + "id": "0x38cff50", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28902, + "line": 941, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28915, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38cff20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28909, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28915, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58f60", + "kind": "EnumConstantDecl", + "name": "VTH1", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d0dd0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28925, + "line": 942, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 28964, + "line": 943, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38d0d20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28929, + "line": 942, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28934, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d0d08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28931, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28931, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d0ce8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28931, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28931, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38cff80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28929, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28929, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d0cd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28934, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 28934, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38cffa0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28934, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 28934, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vicin\"" + } + ] + } + ] + }, + { + "id": "0x38d0dc0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 28951, + "line": 943, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 28964, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38d0d90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28958, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 28964, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58fb0", + "kind": "EnumConstantDecl", + "name": "VICIN", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d1c40", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 28975, + "line": 944, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29013, + "line": 945, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38d1b90", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 28979, + "line": 944, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28984, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d1b78", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28981, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28981, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d1b58", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28981, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 28981, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d0df0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 28979, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 28979, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d1b40", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 28984, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28984, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d0e10", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 28984, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 28984, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"vcas\"" + } + ] + } + ] + }, + { + "id": "0x38d1c30", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29000, + "line": 945, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29013, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38d1c00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29007, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29013, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59000", + "kind": "EnumConstantDecl", + "name": "VCAS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d2ab0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29023, + "line": 946, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29063, + "line": 947, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d2a00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29027, + "line": 946, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29032, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d29e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29029, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29029, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d29c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29029, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29029, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d1c60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29027, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29027, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d29b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29032, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29032, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d1c80", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29032, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29032, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vcal_n\"" + } + ] + } + ] + }, + { + "id": "0x38d2aa0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29050, + "line": 947, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29063, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d2a70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29057, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29063, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59050", + "kind": "EnumConstantDecl", + "name": "VCAL_N", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d3920", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29075, + "line": 948, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29114, + "line": 949, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38d3870", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29079, + "line": 948, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29084, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d3858", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29081, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29081, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d3838", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29081, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29081, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d2ad0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29079, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29079, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d3820", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29084, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 29084, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d2af0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29084, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 29084, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vipre\"" + } + ] + } + ] + }, + { + "id": "0x38d3910", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29101, + "line": 949, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29114, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38d38e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29108, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29114, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f590a0", + "kind": "EnumConstantDecl", + "name": "VIPRE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x38d4790", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29125, + "line": 950, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29165, + "line": 951, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d46e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29129, + "line": 950, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29134, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d46c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29131, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29131, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d46a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29131, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29131, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d3940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29129, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29129, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d4690", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29134, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29134, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d3960", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29134, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29134, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vcal_p\"" + } + ] + } + ] + }, + { + "id": "0x38d4780", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29152, + "line": 951, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29165, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d4750", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29159, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29165, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f590f0", + "kind": "EnumConstantDecl", + "name": "VCAL_P", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f19646274c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29177, + "line": 952, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29216, + "line": 953, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x7f1964627410", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29181, + "line": 952, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29186, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646273f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29183, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29183, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f19646273d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29183, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29183, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d47b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29181, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29181, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f19646273c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29186, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 29186, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d47d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29186, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 29186, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"vdcsh\"" + } + ] + } + ] + }, + { + "id": "0x7f19646274b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29203, + "line": 953, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29216, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x7f1964627480", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29210, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29216, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59140", + "kind": "EnumConstantDecl", + "name": "VDCSH", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964628340", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29227, + "line": 954, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29271, + "line": 955, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x7f1964628290", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29231, + "line": 954, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29236, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964628278", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29233, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29233, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964628258", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29233, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29233, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646274e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29231, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29231, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964628240", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29236, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 29236, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964627500", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29236, + "col": 14, + "tokLen": 12 + }, + "end": { + "offset": 29236, + "col": 14, + "tokLen": 12 + } + }, + "type": { + "qualType": "const char[11]" + }, + "valueCategory": "lvalue", + "value": "\"vbp_colbuf\"" + } + ] + } + ] + }, + { + "id": "0x7f1964628330", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29258, + "line": 955, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29271, + "col": 22, + "tokLen": 10 + } + }, + "inner": [ + { + "id": "0x7f1964628300", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29265, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29271, + "col": 22, + "tokLen": 10 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59190", + "kind": "EnumConstantDecl", + "name": "VBP_COLBUF", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f19646291b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29287, + "line": 956, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29327, + "line": 957, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x7f1964629100", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29291, + "line": 956, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29296, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646290e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29293, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29293, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f19646290c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29293, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29293, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964628360", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29291, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29291, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f19646290b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29296, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29296, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964628380", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29296, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 29296, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"vb_sda\"" + } + ] + } + ] + }, + { + "id": "0x7f19646291a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29314, + "line": 957, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29327, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x7f1964629170", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29321, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29327, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f591e0", + "kind": "EnumConstantDecl", + "name": "VB_SDA", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462a030", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29339, + "line": 958, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29382, + "line": 959, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f1964629f80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29343, + "line": 958, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29348, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964629f68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29345, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29345, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964629f48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29345, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29345, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646291d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29343, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29343, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964629f30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29348, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29348, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646291f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29348, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29348, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vcasc_sfp\"" + } + ] + } + ] + }, + { + "id": "0x7f196462a020", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29369, + "line": 959, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29382, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f1964629ff0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29376, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29382, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59230", + "kind": "EnumConstantDecl", + "name": "VCASC_SFP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462aeb0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29397, + "line": 960, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29440, + "line": 961, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196462ae00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29401, + "line": 960, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29406, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462ade8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29403, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29403, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462adc8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29403, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29403, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462a050", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29401, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29401, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462adb0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29406, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29406, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462a070", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29406, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29406, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"vipre_cds\"" + } + ] + } + ] + }, + { + "id": "0x7f196462aea0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29427, + "line": 961, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29440, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196462ae70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29434, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29440, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59280", + "kind": "EnumConstantDecl", + "name": "VIPRE_CDS", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462bd30", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29455, + "line": 962, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29498, + "line": 963, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196462bc80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29459, + "line": 962, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29464, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462bc68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29461, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29461, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462bc48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29461, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29461, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462aed0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29459, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29459, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462bc30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29464, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29464, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462aef0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29464, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29464, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"ibias_sfp\"" + } + ] + } + ] + }, + { + "id": "0x7f196462bd20", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29485, + "line": 963, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29498, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196462bcf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29492, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29498, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f592d0", + "kind": "EnumConstantDecl", + "name": "IBIAS_SFP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462cba0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29513, + "line": 964, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29555, + "line": 965, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x7f196462caf0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29517, + "line": 964, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29522, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462cad8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29519, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29519, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462cab8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29519, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29519, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462bd50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29517, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29517, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462caa0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29522, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 29522, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462bd70", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29522, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 29522, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"trimbits\"" + } + ] + } + ] + }, + { + "id": "0x7f196462cb90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29542, + "line": 965, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29555, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x7f196462cb60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29549, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29555, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59690", + "kind": "EnumConstantDecl", + "name": "TRIMBIT_SCAN", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462da20", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29573, + "line": 966, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29618, + "line": 967, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x7f196462d970", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29577, + "line": 966, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29582, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462d958", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29579, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29579, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462d938", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29579, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29579, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462cbc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29577, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29577, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462d920", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29582, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 29582, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462cbe0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29582, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 29582, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"highvoltage\"" + } + ] + } + ] + }, + { + "id": "0x7f196462da10", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29605, + "line": 967, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29618, + "col": 22, + "tokLen": 12 + } + }, + "inner": [ + { + "id": "0x7f196462d9e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29612, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29618, + "col": 22, + "tokLen": 12 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59370", + "kind": "EnumConstantDecl", + "name": "HIGH_VOLTAGE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462e890", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29636, + "line": 968, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29677, + "line": 969, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f196462e7e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29640, + "line": 968, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29645, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462e7c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29642, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29642, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462e7a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29642, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29642, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462da40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29640, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29640, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462e790", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29645, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 29645, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462da60", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29645, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 29645, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"iodelay\"" + } + ] + } + ] + }, + { + "id": "0x7f196462e880", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29664, + "line": 969, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29677, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f196462e850", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29671, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29677, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f58510", + "kind": "EnumConstantDecl", + "name": "IO_DELAY", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196462f700", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29691, + "line": 970, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29733, + "line": 971, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196462f650", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29695, + "line": 970, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29700, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196462f638", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29697, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29697, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196462f618", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29697, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29697, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462e8b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29695, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29695, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196462f600", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29700, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 29700, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462e8d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29700, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 29700, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"temp_adc\"" + } + ] + } + ] + }, + { + "id": "0x7f196462f6f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29720, + "line": 971, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29733, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196462f6c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29727, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29733, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f593c0", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_ADC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964630580", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29754, + "line": 972, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29797, + "line": 973, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f19646304d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29758, + "line": 972, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29763, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646304b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29760, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29760, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964630498", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29760, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29760, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196462f720", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29758, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29758, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964630480", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29763, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29763, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196462f740", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29763, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29763, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_fpga\"" + } + ] + } + ] + }, + { + "id": "0x7f1964630570", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29784, + "line": 973, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29797, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964630540", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29791, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29797, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59410", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_FPGA", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964631400", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29819, + "line": 974, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29865, + "line": 975, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f1964631350", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29823, + "line": 974, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29828, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964631338", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29825, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29825, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964631318", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29825, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29825, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646305a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29823, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29823, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964631300", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29828, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 29828, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646305c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29828, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 29828, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"temp_fpgaext\"" + } + ] + } + ] + }, + { + "id": "0x7f19646313f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29852, + "line": 975, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29865, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f19646313c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29859, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29865, + "col": 22, + "tokLen": 19 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59460", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_FPGAEXT", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964632280", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29890, + "line": 976, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29933, + "line": 977, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f19646321d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29894, + "line": 976, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29899, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646321b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29896, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29896, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964632198", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29896, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29896, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964631420", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29894, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29894, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964632180", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29899, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29899, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964631440", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29899, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29899, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_10ge\"" + } + ] + } + ] + }, + { + "id": "0x7f1964632270", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29920, + "line": 977, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29933, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964632240", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29927, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29933, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f594b0", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_10GE", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964633100", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 29955, + "line": 978, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 29998, + "line": 979, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964633050", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 29959, + "line": 978, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29964, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964633038", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29961, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29961, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964633018", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29961, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 29961, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646322a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29959, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 29959, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964633000", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 29964, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29964, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646322c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 29964, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 29964, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_dcdc\"" + } + ] + } + ] + }, + { + "id": "0x7f19646330f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 29985, + "line": 979, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 29998, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f19646330c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 29992, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 29998, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59500", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_DCDC", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964633f80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30020, + "line": 980, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30063, + "line": 981, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964633ed0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30024, + "line": 980, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30029, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964633eb8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30026, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30026, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964633e98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30026, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30026, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964633120", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30024, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30024, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964633e80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30029, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 30029, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964633140", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30029, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 30029, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_sodl\"" + } + ] + } + ] + }, + { + "id": "0x7f1964633f70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30050, + "line": 981, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30063, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964633f40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30057, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30063, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59550", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_SODL", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964634e00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30085, + "line": 982, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30128, + "line": 983, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964634d50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30089, + "line": 982, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30094, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964634d38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30091, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30091, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964634d18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30091, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30091, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964633fa0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30089, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30089, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964634d00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30094, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 30094, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964633fc0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30094, + "col": 14, + "tokLen": 11 + }, + "end": { + "offset": 30094, + "col": 14, + "tokLen": 11 + } + }, + "type": { + "qualType": "const char[10]" + }, + "valueCategory": "lvalue", + "value": "\"temp_sodr\"" + } + ] + } + ] + }, + { + "id": "0x7f1964634df0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30115, + "line": 983, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30128, + "col": 22, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x7f1964634dc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30122, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30128, + "col": 22, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f595a0", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_SODR", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964635c80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30150, + "line": 984, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30195, + "line": 985, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x7f1964635bd0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30154, + "line": 984, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30159, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964635bb8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30156, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30156, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964635b98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30156, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30156, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964634e20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30154, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30154, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964635b80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30159, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30159, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964634e40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30159, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30159, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"temp_fpgafl\"" + } + ] + } + ] + }, + { + "id": "0x7f1964635c70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30182, + "line": 985, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30195, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x7f1964635c40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30189, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30195, + "col": 22, + "tokLen": 17 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f595f0", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_FPGA2", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964636b00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30218, + "line": 986, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30263, + "line": 987, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x7f1964636a50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30222, + "line": 986, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30227, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964636a38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30224, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30224, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964636a18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30224, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30224, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964635ca0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30222, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30222, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964636a00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30227, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30227, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964635cc0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30227, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30227, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"temp_fpgafr\"" + } + ] + } + ] + }, + { + "id": "0x7f1964636af0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30250, + "line": 987, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30263, + "col": 22, + "tokLen": 17 + } + }, + "inner": [ + { + "id": "0x7f1964636ac0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30257, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30263, + "col": 22, + "tokLen": 17 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f59640", + "kind": "EnumConstantDecl", + "name": "TEMPERATURE_FPGA3", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964637980", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30286, + "line": 988, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30332, + "line": 989, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x7f19646378d0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30290, + "line": 988, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30295, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646378b8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30292, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30292, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964637898", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30292, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30292, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964636b20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30290, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30290, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964637880", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30295, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 30295, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964636b40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30295, + "col": 14, + "tokLen": 14 + }, + "end": { + "offset": 30295, + "col": 14, + "tokLen": 14 + } + }, + "type": { + "qualType": "const char[13]" + }, + "valueCategory": "lvalue", + "value": "\"temp_slowadc\"" + } + ] + } + ] + }, + { + "id": "0x7f1964637970", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30319, + "line": 989, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30332, + "col": 22, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x7f1964637940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30326, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30332, + "col": 22, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::dacIndex" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5a060", + "kind": "EnumConstantDecl", + "name": "SLOW_ADC_TEMP", + "type": { + "qualType": "slsDetectorDefs::dacIndex" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964637f90", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 30351, + "line": 990, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x7f1964637f78", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 30351, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x7f1964637f48", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f1964637f30", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x7f1964637f08", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x7f1964637ee8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x7f1964637ee0", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f1964637eb0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30357, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30394, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f1964637e98", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x7f1964637e80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x7f1964637e60", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x7f1964637e58", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f1964637e20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964637e08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30391, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 30391, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964637de8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30391, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 30391, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x7f1964637dd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30370, + "col": 24, + "tokLen": 20 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646379b0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30370, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 30370, + "col": 24, + "tokLen": 20 + } + }, + "type": { + "qualType": "const char[19]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown dac Index \"" + } + ] + }, + { + "id": "0x7f19646379e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30393, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 30393, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3882940", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x7f1964638418", + "kind": "FunctionDecl", + "loc": { + "offset": 30428, + "file": "ToString.cpp", + "line": 993, + "col": 29, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 30400, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 30788, + "line": 1003, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368bb58", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs9burstModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::burstMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "inner": [ + { + "id": "0x2f5b1f0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "decl": { + "id": "0x2f5b148", + "kind": "EnumDecl", + "name": "burstMode" + } + } + ] + }, + { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "loc": { + "offset": 30456, + "line": 993, + "col": 57, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 30437, + "col": 38, + "tokLen": 5 + }, + "end": { + "offset": 30456, + "col": 57, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x7f196463c5d8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 30459, + "col": 60, + "tokLen": 1 + }, + "end": { + "offset": 30788, + "line": 1003, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x7f1964639430", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30465, + "line": 994, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30513, + "line": 995, + "col": 22, + "tokLen": 14 + } + }, + "inner": [ + { + "id": "0x7f1964639380", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30469, + "line": 994, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30474, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964639368", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30471, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30471, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964639348", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30471, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30471, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646385d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30469, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30469, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964639330", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30474, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 30474, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646385f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30474, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 30474, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"burst_internal\"" + } + ] + } + ] + }, + { + "id": "0x7f1964639420", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30500, + "line": 995, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30513, + "col": 22, + "tokLen": 14 + } + }, + "inner": [ + { + "id": "0x7f19646393f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30507, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30513, + "col": 22, + "tokLen": 14 + } + }, + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b210", + "kind": "EnumConstantDecl", + "name": "BURST_INTERNAL", + "type": { + "qualType": "slsDetectorDefs::burstMode" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463a2b0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30533, + "line": 996, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30581, + "line": 997, + "col": 22, + "tokLen": 14 + } + }, + "inner": [ + { + "id": "0x7f196463a200", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30537, + "line": 996, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30542, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463a1e8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30539, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30539, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463a1c8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30539, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30539, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964639450", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30537, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30537, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463a1b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30542, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 30542, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964639470", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30542, + "col": 14, + "tokLen": 16 + }, + "end": { + "offset": 30542, + "col": 14, + "tokLen": 16 + } + }, + "type": { + "qualType": "const char[15]" + }, + "valueCategory": "lvalue", + "value": "\"burst_external\"" + } + ] + } + ] + }, + { + "id": "0x7f196463a2a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30568, + "line": 997, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30581, + "col": 22, + "tokLen": 14 + } + }, + "inner": [ + { + "id": "0x7f196463a270", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30575, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30581, + "col": 22, + "tokLen": 14 + } + }, + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b260", + "kind": "EnumConstantDecl", + "name": "BURST_EXTERNAL", + "type": { + "qualType": "slsDetectorDefs::burstMode" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463b130", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30601, + "line": 998, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30646, + "line": 999, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f196463b080", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30605, + "line": 998, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30610, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463b068", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30607, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30607, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463b048", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30607, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30607, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463a2d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30605, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30605, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463b030", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30610, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30610, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463a2f0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30610, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30610, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"cw_internal\"" + } + ] + } + ] + }, + { + "id": "0x7f196463b120", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30633, + "line": 999, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30646, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f196463b0f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30640, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30646, + "col": 22, + "tokLen": 19 + } + }, + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b2b0", + "kind": "EnumConstantDecl", + "name": "CONTINUOUS_INTERNAL", + "type": { + "qualType": "slsDetectorDefs::burstMode" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463bfb0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30671, + "line": 1000, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30716, + "line": 1001, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f196463bf00", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30675, + "line": 1000, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30680, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463bee8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30677, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30677, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463bec8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30677, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30677, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463b150", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30675, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30675, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463beb0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30680, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30680, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463b170", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30680, + "col": 14, + "tokLen": 13 + }, + "end": { + "offset": 30680, + "col": 14, + "tokLen": 13 + } + }, + "type": { + "qualType": "const char[12]" + }, + "valueCategory": "lvalue", + "value": "\"cw_external\"" + } + ] + } + ] + }, + { + "id": "0x7f196463bfa0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30703, + "line": 1001, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30716, + "col": 22, + "tokLen": 19 + } + }, + "inner": [ + { + "id": "0x7f196463bf70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30710, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30716, + "col": 22, + "tokLen": 19 + } + }, + "type": { + "qualType": "slsDetectorDefs::burstMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b300", + "kind": "EnumConstantDecl", + "name": "CONTINUOUS_EXTERNAL", + "type": { + "qualType": "slsDetectorDefs::burstMode" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463c5c0", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 30741, + "line": 1002, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x7f196463c5a8", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 30741, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x7f196463c578", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f196463c560", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x7f196463c538", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x7f196463c518", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x7f196463c510", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f196463c4e0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30747, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 30785, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f196463c4c8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x7f196463c4b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x7f196463c490", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x7f196463c488", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f196463c450", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463c438", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30782, + "col": 46, + "tokLen": 1 + }, + "end": { + "offset": 30782, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463c418", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30782, + "col": 46, + "tokLen": 1 + }, + "end": { + "offset": 30782, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x7f196463c400", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30760, + "col": 24, + "tokLen": 21 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463bfe0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30760, + "col": 24, + "tokLen": 21 + }, + "end": { + "offset": 30760, + "col": 24, + "tokLen": 21 + } + }, + "type": { + "qualType": "const char[20]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown burst mode \"" + } + ] + }, + { + "id": "0x7f196463c010", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30784, + "col": 48, + "tokLen": 1 + }, + "end": { + "offset": 30784, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964638348", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x7f196463c788", + "kind": "FunctionDecl", + "loc": { + "offset": 30826, + "file": "ToString.cpp", + "line": 1005, + "col": 36, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 30791, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 31044, + "line": 1011, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368c078", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs16timingSourceTypeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::timingSourceType (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "inner": [ + { + "id": "0x2f5b470", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "decl": { + "id": "0x2f5b3c8", + "kind": "EnumDecl", + "name": "timingSourceType" + } + } + ] + }, + { + "id": "0x7f196463c6b8", + "kind": "ParmVarDecl", + "loc": { + "offset": 30854, + "line": 1005, + "col": 64, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 30835, + "col": 45, + "tokLen": 5 + }, + "end": { + "offset": 30854, + "col": 64, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x7f196463ec30", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 30857, + "col": 67, + "tokLen": 1 + }, + "end": { + "offset": 31044, + "line": 1011, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x7f196463d790", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30863, + "line": 1006, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30905, + "line": 1007, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196463d6e0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30867, + "line": 1006, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30872, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463d6c8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30869, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30869, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463d6a8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30869, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30869, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463c940", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30867, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30867, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463c6b8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463d690", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30872, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 30872, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463c960", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30872, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 30872, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"internal\"" + } + ] + } + ] + }, + { + "id": "0x7f196463d780", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30892, + "line": 1007, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30905, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196463d750", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30899, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30905, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b490", + "kind": "EnumConstantDecl", + "name": "TIMING_INTERNAL", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463e600", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 30926, + "line": 1008, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 30968, + "line": 1009, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196463e550", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 30930, + "line": 1008, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463e538", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30932, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30932, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463e518", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30932, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 30932, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463d7b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30930, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 30930, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463c6b8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463e500", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 30935, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 30935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463d7d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 30935, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 30935, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"external\"" + } + ] + } + ] + }, + { + "id": "0x7f196463e5f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 30955, + "line": 1009, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 30968, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x7f196463e5c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 30962, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 30968, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b4e0", + "kind": "EnumConstantDecl", + "name": "TIMING_EXTERNAL", + "type": { + "qualType": "slsDetectorDefs::timingSourceType" + } + } + } + ] + } + ] + }, + { + "id": "0x7f196463ec18", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 30989, + "line": 1010, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x7f196463ec00", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 30989, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x7f196463ebd0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f196463ebb8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x7f196463eb90", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x7f196463eb70", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x7f196463eb68", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f196463eb38", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 30995, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31041, + "col": 57, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f196463eb20", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x7f196463eb08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x7f196463eae8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x7f196463eae0", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f196463eaa8", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463ea90", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31038, + "col": 54, + "tokLen": 1 + }, + "end": { + "offset": 31038, + "col": 54, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463ea70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31038, + "col": 54, + "tokLen": 1 + }, + "end": { + "offset": 31038, + "col": 54, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x7f196463ea58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31008, + "col": 24, + "tokLen": 29 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463e630", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31008, + "col": 24, + "tokLen": 29 + }, + "end": { + "offset": 31008, + "col": 24, + "tokLen": 29 + } + }, + "type": { + "qualType": "const char[28]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown timing source type \"" + } + ] + }, + { + "id": "0x7f196463e668", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31040, + "col": 56, + "tokLen": 1 + }, + "end": { + "offset": 31040, + "col": 56, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463c6b8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x7f196463edd8", + "kind": "FunctionDecl", + "loc": { + "offset": 31077, + "file": "ToString.cpp", + "line": 1013, + "col": 31, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 31047, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 31487, + "line": 1027, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368c598", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs11M3_GainCapsEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::M3_GainCaps (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "inner": [ + { + "id": "0x2f5b5d0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "decl": { + "id": "0x2f5b530", + "kind": "EnumDecl", + "name": "M3_GainCaps" + } + } + ] + }, + { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "loc": { + "offset": 31105, + "line": 1013, + "col": 59, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 31086, + "col": 40, + "tokLen": 5 + }, + "end": { + "offset": 31105, + "col": 59, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x7f1964644c38", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 31108, + "col": 62, + "tokLen": 1 + }, + "end": { + "offset": 31487, + "line": 1027, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x7f196463fde0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31114, + "line": 1014, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31154, + "line": 1015, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196463fd30", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31118, + "line": 1014, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31123, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f196463fd18", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31120, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31120, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f196463fcf8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31120, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31120, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463ef90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31118, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31118, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f196463fce0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31123, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31123, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463efb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31123, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31123, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"C10pre\"" + } + ] + } + ] + }, + { + "id": "0x7f196463fdd0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31141, + "line": 1015, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31154, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f196463fda0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31148, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31154, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b670", + "kind": "EnumConstantDecl", + "name": "M3_C10pre", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964640c50", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31169, + "line": 1016, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31208, + "line": 1017, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964640ba0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31173, + "line": 1016, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31178, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964640b88", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31175, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31175, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964640b68", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31175, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31175, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f196463fe00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31173, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31173, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964640b50", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31178, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31178, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f196463fe20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31178, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31178, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"C15sh\"" + } + ] + } + ] + }, + { + "id": "0x7f1964640c40", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31195, + "line": 1017, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31208, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964640c10", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31202, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31208, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b740", + "kind": "EnumConstantDecl", + "name": "M3_C15sh", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964641ac0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31222, + "line": 1018, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31261, + "line": 1019, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964641a10", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31226, + "line": 1018, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31231, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646419f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31228, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31228, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f19646419d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31228, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31228, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964640c70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31226, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31226, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f19646419c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31231, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31231, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964640c90", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31231, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31231, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"C30sh\"" + } + ] + } + ] + }, + { + "id": "0x7f1964641ab0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31248, + "line": 1019, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31261, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964641a80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31255, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31261, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b810", + "kind": "EnumConstantDecl", + "name": "M3_C30sh", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964642930", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31275, + "line": 1020, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31314, + "line": 1021, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f1964642880", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31279, + "line": 1020, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31284, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964642868", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31281, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31281, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964642848", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31281, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31281, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964641ae0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31279, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31279, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964642830", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31284, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31284, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964641b00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31284, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31284, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"C50sh\"" + } + ] + } + ] + }, + { + "id": "0x7f1964642920", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31301, + "line": 1021, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31314, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x7f19646428f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31308, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31314, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b8e0", + "kind": "EnumConstantDecl", + "name": "M3_C50sh", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f19646437a0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31328, + "line": 1022, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31370, + "line": 1023, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x7f19646436f0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31332, + "line": 1022, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31337, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f19646436d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31334, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31334, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f19646436b8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31334, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31334, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964642950", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31332, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31332, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f19646436a0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31337, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 31337, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964642970", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31337, + "col": 14, + "tokLen": 10 + }, + "end": { + "offset": 31337, + "col": 14, + "tokLen": 10 + } + }, + "type": { + "qualType": "const char[9]" + }, + "valueCategory": "lvalue", + "value": "\"C225ACsh\"" + } + ] + } + ] + }, + { + "id": "0x7f1964643790", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31357, + "line": 1023, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31370, + "col": 22, + "tokLen": 11 + } + }, + "inner": [ + { + "id": "0x7f1964643760", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31364, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31370, + "col": 22, + "tokLen": 11 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5b9b0", + "kind": "EnumConstantDecl", + "name": "M3_C225ACsh", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964644610", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31387, + "line": 1024, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31427, + "line": 1025, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f1964644560", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31391, + "line": 1024, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31396, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964644548", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31393, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31393, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964644528", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31393, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31393, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f19646437c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31391, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31391, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964644510", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31396, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31396, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f19646437e0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31396, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31396, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"C15pre\"" + } + ] + } + ] + }, + { + "id": "0x7f1964644600", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31414, + "line": 1025, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31427, + "col": 22, + "tokLen": 9 + } + }, + "inner": [ + { + "id": "0x7f19646445d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31421, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31427, + "col": 22, + "tokLen": 9 + } + }, + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5ba80", + "kind": "EnumConstantDecl", + "name": "M3_C15pre", + "type": { + "qualType": "slsDetectorDefs::M3_GainCaps" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964644c20", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 31442, + "line": 1026, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x7f1964644c08", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 31442, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x7f1964644bd8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f1964644bc0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x7f1964644b98", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x7f1964644b78", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x7f1964644b70", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f1964644b40", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31448, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31484, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x7f1964644b28", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x7f1964644b10", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x7f1964644af0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x7f1964644ae8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x7f1964644ab0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964644a98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31481, + "col": 44, + "tokLen": 1 + }, + "end": { + "offset": 31481, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964644a78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31481, + "col": 44, + "tokLen": 1 + }, + "end": { + "offset": 31481, + "col": 44, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x7f1964644a60", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31461, + "col": 24, + "tokLen": 19 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964644640", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31461, + "col": 24, + "tokLen": 19 + }, + "end": { + "offset": 31461, + "col": 24, + "tokLen": 19 + } + }, + "type": { + "qualType": "const char[18]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown gain cap \"" + } + ] + }, + { + "id": "0x7f1964644670", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31483, + "col": 46, + "tokLen": 1 + }, + "end": { + "offset": 31483, + "col": 46, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f196463ed00", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x7f1964644df8", + "kind": "FunctionDecl", + "loc": { + "offset": 31521, + "file": "ToString.cpp", + "line": 1029, + "col": 32, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 31490, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 31804, + "line": 1039, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368cab8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs12portPositionEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::portPosition (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "inner": [ + { + "id": "0x2f5bc00", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "decl": { + "id": "0x2f5bb60", + "kind": "EnumDecl", + "name": "portPosition" + } + } + ] + }, + { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "loc": { + "offset": 31549, + "line": 1029, + "col": 60, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 31530, + "col": 41, + "tokLen": 5 + }, + "end": { + "offset": 31549, + "col": 60, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38d70f8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 31552, + "col": 63, + "tokLen": 1 + }, + "end": { + "offset": 31804, + "line": 1039, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x7f1964645e00", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31558, + "line": 1030, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31596, + "line": 1031, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x7f1964645d50", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31562, + "line": 1030, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31567, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964645d38", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31564, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31564, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964645d18", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31564, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31564, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964644fb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31562, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31562, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964645d00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31567, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 31567, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964644fd0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31567, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 31567, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"left\"" + } + ] + } + ] + }, + { + "id": "0x7f1964645df0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31583, + "line": 1031, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31596, + "col": 22, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x7f1964645dc0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31590, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31596, + "col": 22, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bc20", + "kind": "EnumConstantDecl", + "name": "LEFT", + "type": { + "qualType": "slsDetectorDefs::portPosition" + } + } + } + ] + } + ] + }, + { + "id": "0x7f1964646c70", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31606, + "line": 1032, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31645, + "line": 1033, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x7f1964646bc0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31610, + "line": 1032, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31615, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x7f1964646ba8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31612, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31612, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x7f1964646b88", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31612, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31612, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964645e20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31610, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31610, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x7f1964646b70", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31615, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31615, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964645e40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31615, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 31615, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"right\"" + } + ] + } + ] + }, + { + "id": "0x7f1964646c60", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31632, + "line": 1033, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31645, + "col": 22, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x7f1964646c30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31639, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31645, + "col": 22, + "tokLen": 5 + } + }, + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bc70", + "kind": "EnumConstantDecl", + "name": "RIGHT", + "type": { + "qualType": "slsDetectorDefs::portPosition" + } + } + } + ] + } + ] + }, + { + "id": "0x38d5c60", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31656, + "line": 1034, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31693, + "line": 1035, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38d5bb0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31660, + "line": 1034, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31665, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d5b98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31662, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31662, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d5b78", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31662, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31662, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x7f1964646c90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31660, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31660, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d5b60", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31665, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 31665, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x7f1964646cb0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31665, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 31665, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"top\"" + } + ] + } + ] + }, + { + "id": "0x38d5c50", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31680, + "line": 1035, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31693, + "col": 22, + "tokLen": 3 + } + }, + "inner": [ + { + "id": "0x38d5c20", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31687, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31693, + "col": 22, + "tokLen": 3 + } + }, + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bcc0", + "kind": "EnumConstantDecl", + "name": "TOP", + "type": { + "qualType": "slsDetectorDefs::portPosition" + } + } + } + ] + } + ] + }, + { + "id": "0x38d6ad0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31702, + "line": 1036, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31742, + "line": 1037, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d6a20", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31706, + "line": 1036, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31711, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d6a08", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31708, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31708, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d69e8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31708, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 31708, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d5c80", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31706, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31706, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38d69d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31711, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31711, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d5ca0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31711, + "col": 14, + "tokLen": 8 + }, + "end": { + "offset": 31711, + "col": 14, + "tokLen": 8 + } + }, + "type": { + "qualType": "const char[7]" + }, + "valueCategory": "lvalue", + "value": "\"bottom\"" + } + ] + } + ] + }, + { + "id": "0x38d6ac0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 31729, + "line": 1037, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 31742, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38d6a90", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31736, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 31742, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::portPosition" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bd10", + "kind": "EnumConstantDecl", + "name": "BOTTOM", + "type": { + "qualType": "slsDetectorDefs::portPosition" + } + } + } + ] + } + ] + }, + { + "id": "0x38d70e0", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 31754, + "line": 1038, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38d70c8", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 31754, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38d7098", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38d7080", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38d7058", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38d7038", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38d7030", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38d7000", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31760, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 31801, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38d6fe8", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38d6fd0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d6fb0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38d6fa8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38d6f70", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d6f58", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31798, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 31798, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d6f38", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31798, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 31798, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38d6f20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31773, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d6b00", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31773, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 31773, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char[23]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown port position \"" + } + ] + }, + { + "id": "0x38d6b30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31800, + "col": 51, + "tokLen": 1 + }, + "end": { + "offset": 31800, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x7f1964644d28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38d72a8", + "kind": "FunctionDecl", + "loc": { + "offset": 31844, + "file": "ToString.cpp", + "line": 1041, + "col": 38, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 31807, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 32267, + "line": 1052, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368cfd8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs18streamingInterfaceEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::streamingInterface (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "inner": [ + { + "id": "0x2f5bf90", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "decl": { + "id": "0x2f5bef0", + "kind": "EnumDecl", + "name": "streamingInterface" + } + } + ] + }, + { + "id": "0x38d71d8", + "kind": "ParmVarDecl", + "loc": { + "offset": 31872, + "line": 1041, + "col": 66, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 31853, + "col": 47, + "tokLen": 5 + }, + "end": { + "offset": 31872, + "col": 66, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38dacc0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 31875, + "col": 69, + "tokLen": 1 + }, + "end": { + "offset": 32267, + "line": 1052, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38d7560", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 31881, + "line": 1042, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 31899, + "col": 23, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38d74a8", + "kind": "VarDecl", + "loc": { + "offset": 31893, + "col": 17, + "tokLen": 2 + }, + "range": { + "begin": { + "offset": 31881, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 31898, + "col": 22, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "init": "c", + "inner": [ + { + "id": "0x38d7530", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 31898, + "col": 22, + "tokLen": 1 + }, + "end": { + "offset": 31898, + "col": 22, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::basic_string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38d7510", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31898, + "col": 22, + "tokLen": 1 + }, + "end": { + "offset": 31898, + "col": 22, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d71d8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + }, + { + "id": "0x38d7ab0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31905, + "line": 1043, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 31972, + "line": 1044, + "col": 30, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38d77c0", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 31909, + "line": 1043, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31937, + "col": 37, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38d7650", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 31909, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31919, + "col": 19, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38d7620", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 31909, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31911, + "col": 11, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1fe0", + "inner": [ + { + "id": "0x38d7578", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31909, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 31909, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d71d8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38d7608", + "kind": "CharacterLiteral", + "range": { + "begin": { + "offset": 31916, + "col": 16, + "tokLen": 3 + }, + "end": { + "offset": 31916, + "col": 16, + "tokLen": 3 + } + }, + "type": { + "qualType": "char" + }, + "valueCategory": "prvalue", + "value": 44 + }, + { + "id": "0x38d7698", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38d77a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31924, + "col": 24, + "tokLen": 3 + }, + "end": { + "offset": 31937, + "col": 37, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38d7778", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31924, + "col": 24, + "tokLen": 3 + }, + "end": { + "offset": 31937, + "col": 37, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38d7a08", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 31951, + "line": 1044, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31972, + "col": 30, + "tokLen": 1 + } + }, + "type": { + "qualType": "std::basic_string" + }, + "valueCategory": "lvalue", + "inner": [ + { + "id": "0x38d79d8", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 31951, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31954, + "col": 12, + "tokLen": 5 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "erase", + "isArrow": false, + "referencedMemberDecl": "0x2c9ba48", + "inner": [ + { + "id": "0x38d77e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31951, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31951, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + }, + { + "id": "0x38d7940", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 31960, + "col": 18, + "tokLen": 2 + }, + "end": { + "offset": 31971, + "col": 29, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38d7910", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 31960, + "col": 18, + "tokLen": 2 + }, + "end": { + "offset": 31963, + "col": 21, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1fe0", + "inner": [ + { + "id": "0x38d7970", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31960, + "col": 18, + "tokLen": 2 + }, + "end": { + "offset": 31960, + "col": 18, + "tokLen": 2 + } + }, + "type": { + "qualType": "const std::basic_string" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d7868", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31960, + "col": 18, + "tokLen": 2 + }, + "end": { + "offset": 31960, + "col": 18, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + } + ] + }, + { + "id": "0x38d78f8", + "kind": "CharacterLiteral", + "range": { + "begin": { + "offset": 31968, + "col": 26, + "tokLen": 3 + }, + "end": { + "offset": 31968, + "col": 26, + "tokLen": 3 + } + }, + "type": { + "qualType": "char" + }, + "valueCategory": "prvalue", + "value": 44 + }, + { + "id": "0x38d7988", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38d7a90", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + } + ] + }, + { + "id": "0x38d8950", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 31979, + "line": 1045, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32038, + "line": 1046, + "col": 42, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38d8888", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 31983, + "line": 1045, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31989, + "col": 15, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d8870", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31986, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 31986, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d8850", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31986, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 31986, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d8820", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31983, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31983, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d7ad0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 31983, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 31983, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + }, + { + "id": "0x38d8838", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 31989, + "col": 15, + "tokLen": 6 + }, + "end": { + "offset": 31989, + "col": 15, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d7af0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 31989, + "col": 15, + "tokLen": 6 + }, + "end": { + "offset": 31989, + "col": 15, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"none\"" + } + ] + } + ] + }, + { + "id": "0x38d8940", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32005, + "line": 1046, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32038, + "col": 42, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38d8910", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32012, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32038, + "col": 42, + "tokLen": 4 + } + }, + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5bff0", + "kind": "EnumConstantDecl", + "name": "NONE", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + } + } + } + ] + } + ] + }, + { + "id": "0x38d97f0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32048, + "line": 1047, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32106, + "line": 1048, + "col": 42, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x38d9728", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32052, + "line": 1047, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32058, + "col": 15, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38d9710", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32055, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 32055, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38d96f0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32055, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 32055, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38d96c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32052, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32052, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d8970", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32052, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32052, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + }, + { + "id": "0x38d96d8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32058, + "col": 15, + "tokLen": 5 + }, + "end": { + "offset": 32058, + "col": 15, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d8990", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32058, + "col": 15, + "tokLen": 5 + }, + "end": { + "offset": 32058, + "col": 15, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"lll\"" + } + ] + } + ] + }, + { + "id": "0x38d97e0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32073, + "line": 1048, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32106, + "col": 42, + "tokLen": 16 + } + }, + "inner": [ + { + "id": "0x38d97b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32080, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32106, + "col": 42, + "tokLen": 16 + } + }, + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c0c0", + "kind": "EnumConstantDecl", + "name": "LOW_LATENCY_LINK", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + } + } + } + ] + } + ] + }, + { + "id": "0x38da690", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32128, + "line": 1049, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32188, + "line": 1050, + "col": 42, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x38da5c8", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32132, + "line": 1049, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32138, + "col": 15, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38da5b0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32135, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 32135, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38da590", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32135, + "col": 12, + "tokLen": 2 + }, + "end": { + "offset": 32135, + "col": 12, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38da560", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32132, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32132, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38d9810", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32132, + "col": 9, + "tokLen": 2 + }, + "end": { + "offset": 32132, + "col": 9, + "tokLen": 2 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d74a8", + "kind": "VarDecl", + "name": "rs", + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "std::string", + "typeAliasDeclId": "0x2a12a80" + } + } + } + ] + }, + { + "id": "0x38da578", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32138, + "col": 15, + "tokLen": 7 + }, + "end": { + "offset": 32138, + "col": 15, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38d9830", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32138, + "col": 15, + "tokLen": 7 + }, + "end": { + "offset": 32138, + "col": 15, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"10gbe\"" + } + ] + } + ] + }, + { + "id": "0x38da680", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32155, + "line": 1050, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32188, + "col": 42, + "tokLen": 13 + } + }, + "inner": [ + { + "id": "0x38da650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32162, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32188, + "col": 42, + "tokLen": 13 + } + }, + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c190", + "kind": "EnumConstantDecl", + "name": "ETHERNET_10GB", + "type": { + "qualType": "slsDetectorDefs::streamingInterface" + } + } + } + ] + } + ] + }, + { + "id": "0x38daca8", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 32207, + "line": 1051, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38dac90", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 32207, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38dac60", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38dac48", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38dac20", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38dac00", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38dabf8", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38dabc8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32213, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32264, + "col": 62, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38dabb0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38dab98", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38dab78", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38dab70", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38dab38", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38dab20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32261, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 32261, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38dab00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32261, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 32261, + "col": 59, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38daae8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32226, + "col": 24, + "tokLen": 34 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38da6c0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32226, + "col": 24, + "tokLen": 34 + }, + "end": { + "offset": 32226, + "col": 24, + "tokLen": 34 + } + }, + "type": { + "qualType": "const char[33]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown streamingInterface type \"" + } + ] + }, + { + "id": "0x38da6f8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32263, + "col": 61, + "tokLen": 1 + }, + "end": { + "offset": 32263, + "col": 61, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38d71d8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38dae78", + "kind": "FunctionDecl", + "loc": { + "offset": 32302, + "file": "ToString.cpp", + "line": 1054, + "col": 33, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 32270, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 32492, + "line": 1060, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368d4f8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs13vetoAlgorithmEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::vetoAlgorithm (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "inner": [ + { + "id": "0x2f5c350", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "decl": { + "id": "0x2f5c2b0", + "kind": "EnumDecl", + "name": "vetoAlgorithm" + } + } + ] + }, + { + "id": "0x38dada8", + "kind": "ParmVarDecl", + "loc": { + "offset": 32330, + "line": 1054, + "col": 61, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 32311, + "col": 42, + "tokLen": 5 + }, + "end": { + "offset": 32330, + "col": 61, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38dd318", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 32333, + "col": 64, + "tokLen": 1 + }, + "end": { + "offset": 32492, + "line": 1060, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38dbe80", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32339, + "line": 1055, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32377, + "line": 1056, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38dbdd0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32343, + "line": 1055, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32348, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38dbdb8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32345, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32345, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38dbd98", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32345, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32345, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38db030", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32343, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32343, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dada8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38dbd80", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32348, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 32348, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38db050", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32348, + "col": 14, + "tokLen": 6 + }, + "end": { + "offset": 32348, + "col": 14, + "tokLen": 6 + } + }, + "type": { + "qualType": "const char[5]" + }, + "valueCategory": "lvalue", + "value": "\"hits\"" + } + ] + } + ] + }, + { + "id": "0x38dbe70", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32364, + "line": 1056, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32377, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38dbe40", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32371, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32377, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c370", + "kind": "EnumConstantDecl", + "name": "ALG_HITS", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + } + } + } + ] + } + ] + }, + { + "id": "0x38dccf0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32391, + "line": 1057, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32428, + "line": 1058, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38dcc40", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32395, + "line": 1057, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32400, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38dcc28", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32397, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32397, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38dcc08", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32397, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32397, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38dbea0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32395, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32395, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dada8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38dcbf0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32400, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 32400, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38dbec0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32400, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 32400, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"raw\"" + } + ] + } + ] + }, + { + "id": "0x38dcce0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32415, + "line": 1058, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32428, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38dccb0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32422, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32428, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c3c0", + "kind": "EnumConstantDecl", + "name": "ALG_RAW", + "type": { + "qualType": "slsDetectorDefs::vetoAlgorithm" + } + } + } + ] + } + ] + }, + { + "id": "0x38dd300", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 32441, + "line": 1059, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38dd2e8", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 32441, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38dd2b8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38dd2a0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38dd278", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38dd258", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38dd250", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38dd220", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32447, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32489, + "col": 53, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38dd208", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38dd1f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38dd1d0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38dd1c8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38dd190", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38dd178", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32486, + "col": 50, + "tokLen": 1 + }, + "end": { + "offset": 32486, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38dd158", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32486, + "col": 50, + "tokLen": 1 + }, + "end": { + "offset": 32486, + "col": 50, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38dd140", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32460, + "col": 24, + "tokLen": 25 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38dcd20", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32460, + "col": 24, + "tokLen": 25 + }, + "end": { + "offset": 32460, + "col": 24, + "tokLen": 25 + } + }, + "type": { + "qualType": "const char[24]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown veto algorithm \"" + } + ] + }, + { + "id": "0x38dcd50", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32488, + "col": 52, + "tokLen": 1 + }, + "end": { + "offset": 32488, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dada8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38dd4b8", + "kind": "FunctionDecl", + "loc": { + "offset": 32522, + "file": "ToString.cpp", + "line": 1062, + "col": 28, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 32495, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 32948, + "line": 1076, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368da18", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8gainModeEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::gainMode (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "inner": [ + { + "id": "0x2f5c4b0", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "decl": { + "id": "0x2f5c410", + "kind": "EnumDecl", + "name": "gainMode" + } + } + ] + }, + { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "loc": { + "offset": 32550, + "line": 1062, + "col": 56, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 32531, + "col": 37, + "tokLen": 5 + }, + "end": { + "offset": 32550, + "col": 56, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e3338", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 32553, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 32948, + "line": 1076, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38de4c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32559, + "line": 1063, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32600, + "line": 1064, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38de410", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32563, + "line": 1063, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38de3f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32565, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32565, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38de3d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32565, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32565, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38dd670", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32563, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32563, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38de3c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32568, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 32568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38dd690", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32568, + "col": 14, + "tokLen": 9 + }, + "end": { + "offset": 32568, + "col": 14, + "tokLen": 9 + } + }, + "type": { + "qualType": "const char[8]" + }, + "valueCategory": "lvalue", + "value": "\"dynamic\"" + } + ] + } + ] + }, + { + "id": "0x38de4b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32587, + "line": 1064, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32600, + "col": 22, + "tokLen": 7 + } + }, + "inner": [ + { + "id": "0x38de480", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32594, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32600, + "col": 22, + "tokLen": 7 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c4d0", + "kind": "EnumConstantDecl", + "name": "DYNAMIC", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38df340", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32613, + "line": 1065, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32660, + "line": 1066, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x38df290", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32617, + "line": 1065, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32622, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38df278", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32619, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32619, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38df258", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32619, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32619, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38de4e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32617, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32617, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38df240", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32622, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 32622, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38de500", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32622, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 32622, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"forceswitchg1\"" + } + ] + } + ] + }, + { + "id": "0x38df330", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32647, + "line": 1066, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32660, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x38df300", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32654, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32660, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c520", + "kind": "EnumConstantDecl", + "name": "FORCE_SWITCH_G1", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e01c0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32681, + "line": 1067, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32728, + "line": 1068, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x38e0110", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32685, + "line": 1067, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32690, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e00f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32687, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32687, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e00d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32687, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32687, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38df360", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32685, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32685, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e00c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32690, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 32690, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38df380", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32690, + "col": 14, + "tokLen": 15 + }, + "end": { + "offset": 32690, + "col": 14, + "tokLen": 15 + } + }, + "type": { + "qualType": "const char[14]" + }, + "valueCategory": "lvalue", + "value": "\"forceswitchg2\"" + } + ] + } + ] + }, + { + "id": "0x38e01b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32715, + "line": 1068, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32728, + "col": 22, + "tokLen": 15 + } + }, + "inner": [ + { + "id": "0x38e0180", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32722, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32728, + "col": 22, + "tokLen": 15 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c570", + "kind": "EnumConstantDecl", + "name": "FORCE_SWITCH_G2", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e1030", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32749, + "line": 1069, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32788, + "line": 1070, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e0f80", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32753, + "line": 1069, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32758, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e0f68", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32755, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32755, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e0f48", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32755, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32755, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e01e0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32753, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32753, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e0f30", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32758, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32758, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e0200", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32758, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32758, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"fixg1\"" + } + ] + } + ] + }, + { + "id": "0x38e1020", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32775, + "line": 1070, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32788, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e0ff0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32782, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32788, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c5c0", + "kind": "EnumConstantDecl", + "name": "FIX_G1", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e1ea0", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32800, + "line": 1071, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32839, + "line": 1072, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e1df0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32804, + "line": 1071, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32809, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e1dd8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32806, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32806, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e1db8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32806, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32806, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e1050", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32804, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32804, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e1da0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32809, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32809, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e1070", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32809, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32809, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"fixg2\"" + } + ] + } + ] + }, + { + "id": "0x38e1e90", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32826, + "line": 1072, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32839, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e1e60", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32833, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32839, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c610", + "kind": "EnumConstantDecl", + "name": "FIX_G2", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e2d10", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 32851, + "line": 1073, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 32890, + "line": 1074, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e2c60", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32855, + "line": 1073, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32860, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e2c48", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32857, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32857, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e2c28", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32857, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 32857, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e1ec0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32855, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 32855, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e2c10", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32860, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32860, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e1ee0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32860, + "col": 14, + "tokLen": 7 + }, + "end": { + "offset": 32860, + "col": 14, + "tokLen": 7 + } + }, + "type": { + "qualType": "const char[6]" + }, + "valueCategory": "lvalue", + "value": "\"fixg0\"" + } + ] + } + ] + }, + { + "id": "0x38e2d00", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 32877, + "line": 1074, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 32890, + "col": 22, + "tokLen": 6 + } + }, + "inner": [ + { + "id": "0x38e2cd0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32884, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 32890, + "col": 22, + "tokLen": 6 + } + }, + "type": { + "qualType": "slsDetectorDefs::gainMode" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c660", + "kind": "EnumConstantDecl", + "name": "FIX_G0", + "type": { + "qualType": "slsDetectorDefs::gainMode" + } + } + } + ] + } + ] + }, + { + "id": "0x38e3320", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 32902, + "line": 1075, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38e3308", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 32902, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e32d8", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e32c0", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38e3298", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38e3278", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38e3270", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e3240", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 32908, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 32945, + "col": 48, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e3228", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38e3210", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38e31f0", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38e31e8", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e31b0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e3198", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32942, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 32942, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e3178", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32942, + "col": 45, + "tokLen": 1 + }, + "end": { + "offset": 32942, + "col": 45, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38e3160", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32921, + "col": 24, + "tokLen": 20 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e2d40", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 32921, + "col": 24, + "tokLen": 20 + }, + "end": { + "offset": 32921, + "col": 24, + "tokLen": 20 + } + }, + "type": { + "qualType": "const char[19]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown gain mode \"" + } + ] + }, + { + "id": "0x38e2d70", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 32944, + "col": 47, + "tokLen": 1 + }, + "end": { + "offset": 32944, + "col": 47, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38dd3e8", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38e34f8", + "kind": "FunctionDecl", + "loc": { + "offset": 32978, + "file": "ToString.cpp", + "line": 1078, + "col": 28, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 32951, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33167, + "line": 1084, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368df38", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIN15slsDetectorDefs8polarityEEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "defs::polarity (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "inner": [ + { + "id": "0x2f5c750", + "kind": "EnumType", + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "decl": { + "id": "0x2f5c6b0", + "kind": "EnumDecl", + "name": "polarity" + } + } + ] + }, + { + "id": "0x38e3428", + "kind": "ParmVarDecl", + "loc": { + "offset": 33006, + "line": 1078, + "col": 56, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 32987, + "col": 37, + "tokLen": 5 + }, + "end": { + "offset": 33006, + "col": 56, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e5998", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33009, + "col": 59, + "tokLen": 1 + }, + "end": { + "offset": 33167, + "line": 1084, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e4500", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 33015, + "line": 1079, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 33052, + "line": 1080, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38e4450", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 33019, + "line": 1079, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 33024, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e4438", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33021, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 33021, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e4418", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33021, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 33021, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e36b0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33019, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 33019, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e3428", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e4400", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33024, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 33024, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e36d0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33024, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 33024, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"pos\"" + } + ] + } + ] + }, + { + "id": "0x38e44f0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33039, + "line": 1080, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 33052, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38e44c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33046, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 33052, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c770", + "kind": "EnumConstantDecl", + "name": "POSITIVE", + "type": { + "qualType": "slsDetectorDefs::polarity" + } + } + } + ] + } + ] + }, + { + "id": "0x38e5370", + "kind": "IfStmt", + "range": { + "begin": { + "offset": 33066, + "line": 1081, + "col": 5, + "tokLen": 2 + }, + "end": { + "offset": 33103, + "line": 1082, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38e52c0", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 33070, + "line": 1081, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 33075, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e52a8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33072, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 33072, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (*)(const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e5288", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33072, + "col": 11, + "tokLen": 2 + }, + "end": { + "offset": 33072, + "col": 11, + "tokLen": 2 + } + }, + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x3605608", + "kind": "FunctionDecl", + "name": "operator==", + "type": { + "qualType": "bool (const basic_string, std::allocator> &, const char *)" + } + } + } + ] + }, + { + "id": "0x38e4520", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33070, + "col": 9, + "tokLen": 1 + }, + "end": { + "offset": 33070, + "col": 9, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e3428", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e5270", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33075, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 33075, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e4540", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33075, + "col": 14, + "tokLen": 5 + }, + "end": { + "offset": 33075, + "col": 14, + "tokLen": 5 + } + }, + "type": { + "qualType": "const char[4]" + }, + "valueCategory": "lvalue", + "value": "\"neg\"" + } + ] + } + ] + }, + { + "id": "0x38e5360", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33090, + "line": 1082, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 33103, + "col": 22, + "tokLen": 8 + } + }, + "inner": [ + { + "id": "0x38e5330", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33097, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 33103, + "col": 22, + "tokLen": 8 + } + }, + "type": { + "qualType": "slsDetectorDefs::polarity" + }, + "valueCategory": "prvalue", + "referencedDecl": { + "id": "0x2f5c7c0", + "kind": "EnumConstantDecl", + "name": "NEGATIVE", + "type": { + "qualType": "slsDetectorDefs::polarity" + } + } + } + ] + } + ] + }, + { + "id": "0x38e5980", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 33117, + "line": 1083, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38e5968", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 33117, + "col": 5, + "tokLen": 5 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e5938", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e5920", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38e58f8", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da8350", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const std::string &)" + } + }, + "inner": [ + { + "id": "0x38e58d8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38e58d0", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e58a0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 33123, + "col": 11, + "tokLen": 12 + }, + "end": { + "offset": 33164, + "col": 52, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const std::string &)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e5888", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "lvalue", + "storageDuration": "full expression", + "boundToLValueRef": true, + "inner": [ + { + "id": "0x38e5870", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "castKind": "NoOp", + "inner": [ + { + "id": "0x38e5850", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "temp": "0x38e5848", + "dtor": { + "id": "0x2c92d00", + "kind": "CXXDestructorDecl", + "name": "~basic_string", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e5810", + "kind": "CXXOperatorCallExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "std::basic_string", + "qualType": "basic_string, std::allocator>" + }, + "valueCategory": "prvalue", + "adl": true, + "inner": [ + { + "id": "0x38e57f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33161, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 33161, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (*)(const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e57d8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33161, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 33161, + "col": 49, + "tokLen": 1 + } + }, + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2faab58", + "kind": "FunctionDecl", + "name": "operator+", + "type": { + "qualType": "basic_string, std::allocator> (const char *, const basic_string, std::allocator> &)" + } + } + } + ] + }, + { + "id": "0x38e57c0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33136, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e53a0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33136, + "col": 24, + "tokLen": 24 + }, + "end": { + "offset": 33136, + "col": 24, + "tokLen": 24 + } + }, + "type": { + "qualType": "const char[23]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown polarity mode \"" + } + ] + }, + { + "id": "0x38e53d0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33163, + "col": 51, + "tokLen": 1 + }, + "end": { + "offset": 33163, + "col": 51, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e3428", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38e5ae8", + "kind": "FunctionDecl", + "loc": { + "offset": 33191, + "file": "ToString.cpp", + "line": 1086, + "col": 22, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33170, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33325, + "line": 1089, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368e408", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIjEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "uint32_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "unsigned int" + }, + "inner": [ + { + "id": "0x230bbd0", + "kind": "BuiltinType", + "type": { + "qualType": "unsigned int" + } + } + ] + }, + { + "id": "0x38e5a28", + "kind": "ParmVarDecl", + "loc": { + "offset": 33219, + "line": 1086, + "col": 50, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33200, + "col": 31, + "tokLen": 5 + }, + "end": { + "offset": 33219, + "col": 50, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e61b0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33222, + "col": 53, + "tokLen": 1 + }, + "end": { + "offset": 33325, + "line": 1089, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e5fa0", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33228, + "line": 1087, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33282, + "col": 59, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e5c88", + "kind": "VarDecl", + "loc": { + "offset": 33232, + "col": 9, + "tokLen": 4 + }, + "range": { + "begin": { + "offset": 33228, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33280, + "col": 57, + "tokLen": 2 + } + }, + "isUsed": true, + "name": "base", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e5f70", + "kind": "ConditionalOperator", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33280, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e5f10", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33268, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38e5dd0", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33250, + "col": 27, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e5da0", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33241, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1d70", + "inner": [ + { + "id": "0x38e5cf0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33239, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33239, + "col": 16, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e5a28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38e5e00", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33246, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33246, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e5d80", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33246, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33246, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"0x\"" + } + ] + }, + { + "id": "0x38e5e30", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e5ef8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33255, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33268, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e5ec8", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33255, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33268, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38e5f30", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33275, + "col": 52, + "tokLen": 2 + }, + "end": { + "offset": 33275, + "col": 52, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "16" + }, + { + "id": "0x38e5f50", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33280, + "col": 57, + "tokLen": 2 + }, + "end": { + "offset": 33280, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e61a0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33288, + "line": 1088, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 33322, + "col": 39, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6188", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33295, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33322, + "col": 39, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned int", + "qualType": "uint32_t", + "typeAliasDeclId": "0x23ae7f8" + }, + "valueCategory": "prvalue", + "castKind": "IntegralCast", + "inner": [ + { + "id": "0x38e6120", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 33295, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33322, + "col": 39, + "tokLen": 1 + } + }, + "type": { + "qualType": "unsigned long" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e6108", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33295, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33300, + "col": 17, + "tokLen": 5 + } + }, + "type": { + "qualType": "unsigned long (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e6078", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33295, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33300, + "col": 17, + "tokLen": 5 + } + }, + "type": { + "qualType": "unsigned long (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2ca8d40", + "kind": "FunctionDecl", + "name": "stoul", + "type": { + "qualType": "unsigned long (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e6028", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33306, + "col": 23, + "tokLen": 1 + }, + "end": { + "offset": 33306, + "col": 23, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e5a28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e6158", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33309, + "col": 26, + "tokLen": 7 + }, + "end": { + "offset": 33309, + "col": 26, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e6048", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 33309, + "col": 26, + "tokLen": 7 + }, + "end": { + "offset": 33309, + "col": 26, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e6170", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33318, + "col": 35, + "tokLen": 4 + }, + "end": { + "offset": 33318, + "col": 35, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e6058", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33318, + "col": 35, + "tokLen": 4 + }, + "end": { + "offset": 33318, + "col": 35, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e5c88", + "kind": "VarDecl", + "name": "base", + "type": { + "qualType": "int" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38e62f8", + "kind": "FunctionDecl", + "loc": { + "offset": 33349, + "file": "ToString.cpp", + "line": 1091, + "col": 22, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33328, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33484, + "line": 1094, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368e8a8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToImEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "uint64_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "unsigned long" + }, + "inner": [ + { + "id": "0x230bbf0", + "kind": "BuiltinType", + "type": { + "qualType": "unsigned long" + } + } + ] + }, + { + "id": "0x38e6238", + "kind": "ParmVarDecl", + "loc": { + "offset": 33377, + "line": 1091, + "col": 50, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33358, + "col": 31, + "tokLen": 5 + }, + "end": { + "offset": 33377, + "col": 50, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e69a0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33380, + "col": 53, + "tokLen": 1 + }, + "end": { + "offset": 33484, + "line": 1094, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6798", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33386, + "line": 1092, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33440, + "col": 59, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6498", + "kind": "VarDecl", + "loc": { + "offset": 33390, + "col": 9, + "tokLen": 4 + }, + "range": { + "begin": { + "offset": 33386, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33438, + "col": 57, + "tokLen": 2 + } + }, + "isUsed": true, + "name": "base", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e6768", + "kind": "ConditionalOperator", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33438, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e6708", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33426, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38e65e0", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33408, + "col": 27, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e65b0", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33399, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1d70", + "inner": [ + { + "id": "0x38e6500", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33397, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33397, + "col": 16, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6238", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38e6610", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33404, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33404, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e6590", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33404, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33404, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"0x\"" + } + ] + }, + { + "id": "0x38e6628", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e66f0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33413, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33426, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e66c0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33413, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33426, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38e6728", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33433, + "col": 52, + "tokLen": 2 + }, + "end": { + "offset": 33433, + "col": 52, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "16" + }, + { + "id": "0x38e6748", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33438, + "col": 57, + "tokLen": 2 + }, + "end": { + "offset": 33438, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e6990", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33446, + "line": 1093, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 33481, + "col": 40, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6978", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33453, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33481, + "col": 40, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "uint64_t", + "typeAliasDeclId": "0x23ae860" + }, + "valueCategory": "prvalue", + "castKind": "IntegralCast", + "inner": [ + { + "id": "0x38e6910", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 33453, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33481, + "col": 40, + "tokLen": 1 + } + }, + "type": { + "qualType": "unsigned long long" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e68f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33453, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33458, + "col": 17, + "tokLen": 6 + } + }, + "type": { + "qualType": "unsigned long long (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e6870", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33453, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33458, + "col": 17, + "tokLen": 6 + } + }, + "type": { + "qualType": "unsigned long long (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2caac00", + "kind": "FunctionDecl", + "name": "stoull", + "type": { + "qualType": "unsigned long long (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e6820", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33465, + "col": 24, + "tokLen": 1 + }, + "end": { + "offset": 33465, + "col": 24, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6238", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e6948", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33468, + "col": 27, + "tokLen": 7 + }, + "end": { + "offset": 33468, + "col": 27, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e6840", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 33468, + "col": 27, + "tokLen": 7 + }, + "end": { + "offset": 33468, + "col": 27, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e6960", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33477, + "col": 36, + "tokLen": 4 + }, + "end": { + "offset": 33477, + "col": 36, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e6850", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33477, + "col": 36, + "tokLen": 4 + }, + "end": { + "offset": 33477, + "col": 36, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6498", + "kind": "VarDecl", + "name": "base", + "type": { + "qualType": "int" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38e6af0", + "kind": "FunctionDecl", + "loc": { + "offset": 33503, + "file": "ToString.cpp", + "line": 1096, + "col": 17, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33487, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33636, + "line": 1099, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368ed50", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIiEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "int (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "int" + }, + "inner": [ + { + "id": "0x230bb30", + "kind": "BuiltinType", + "type": { + "qualType": "int" + } + } + ] + }, + { + "id": "0x38e6a28", + "kind": "ParmVarDecl", + "loc": { + "offset": 33531, + "line": 1096, + "col": 45, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33512, + "col": 26, + "tokLen": 5 + }, + "end": { + "offset": 33531, + "col": 45, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e7188", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33534, + "col": 48, + "tokLen": 1 + }, + "end": { + "offset": 33636, + "line": 1099, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6f98", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33540, + "line": 1097, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33594, + "col": 59, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e6c98", + "kind": "VarDecl", + "loc": { + "offset": 33544, + "col": 9, + "tokLen": 4 + }, + "range": { + "begin": { + "offset": 33540, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33592, + "col": 57, + "tokLen": 2 + } + }, + "isUsed": true, + "name": "base", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e6f68", + "kind": "ConditionalOperator", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33592, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e6f08", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33580, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38e6de0", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33562, + "col": 27, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e6db0", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33553, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1d70", + "inner": [ + { + "id": "0x38e6d00", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33551, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33551, + "col": 16, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6a28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38e6e10", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33558, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33558, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e6d90", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33558, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33558, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"0x\"" + } + ] + }, + { + "id": "0x38e6e28", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e6ef0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33567, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33580, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e6ec0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33567, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 33580, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38e6f28", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33587, + "col": 52, + "tokLen": 2 + }, + "end": { + "offset": 33587, + "col": 52, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "16" + }, + { + "id": "0x38e6f48", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33592, + "col": 57, + "tokLen": 2 + }, + "end": { + "offset": 33592, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e7178", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33600, + "line": 1098, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 33633, + "col": 38, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7110", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 33607, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33633, + "col": 38, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e70f8", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33607, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33612, + "col": 17, + "tokLen": 4 + } + }, + "type": { + "qualType": "int (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e7070", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33607, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 33612, + "col": 17, + "tokLen": 4 + } + }, + "type": { + "qualType": "int (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2c76400", + "kind": "FunctionDecl", + "name": "stoi", + "type": { + "qualType": "int (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e7020", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33617, + "col": 22, + "tokLen": 1 + }, + "end": { + "offset": 33617, + "col": 22, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6a28", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e7148", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33620, + "col": 25, + "tokLen": 7 + }, + "end": { + "offset": 33620, + "col": 25, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e7040", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 33620, + "col": 25, + "tokLen": 7 + }, + "end": { + "offset": 33620, + "col": 25, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e7160", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33629, + "col": 34, + "tokLen": 4 + }, + "end": { + "offset": 33629, + "col": 34, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e7050", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33629, + "col": 34, + "tokLen": 4 + }, + "end": { + "offset": 33629, + "col": 34, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e6c98", + "kind": "VarDecl", + "name": "base", + "type": { + "qualType": "int" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38e72d8", + "kind": "FunctionDecl", + "loc": { + "offset": 33656, + "file": "ToString.cpp", + "line": 1101, + "col": 18, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33639, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 33900, + "line": 1111, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368f1c8", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIbEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "bool (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "bool" + }, + "inner": [ + { + "id": "0x230bab0", + "kind": "BuiltinType", + "type": { + "qualType": "bool" + } + } + ] + }, + { + "id": "0x38e7210", + "kind": "ParmVarDecl", + "loc": { + "offset": 33684, + "line": 1101, + "col": 46, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33665, + "col": 27, + "tokLen": 5 + }, + "end": { + "offset": 33684, + "col": 46, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e79e0", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33687, + "col": 49, + "tokLen": 1 + }, + "end": { + "offset": 33900, + "line": 1111, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7638", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33693, + "line": 1102, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33726, + "col": 38, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7478", + "kind": "VarDecl", + "loc": { + "offset": 33697, + "col": 9, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33693, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 33725, + "col": 37, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "i", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e75e8", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 33701, + "col": 13, + "tokLen": 3 + }, + "end": { + "offset": 33725, + "col": 37, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e75d0", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33701, + "col": 13, + "tokLen": 3 + }, + "end": { + "offset": 33706, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "int (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e75a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33701, + "col": 13, + "tokLen": 3 + }, + "end": { + "offset": 33706, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "int (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2c76400", + "kind": "FunctionDecl", + "name": "stoi", + "type": { + "qualType": "int (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e7550", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33711, + "col": 23, + "tokLen": 1 + }, + "end": { + "offset": 33711, + "col": 23, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7210", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e7620", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33714, + "col": 26, + "tokLen": 7 + }, + "end": { + "offset": 33714, + "col": 26, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e7570", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 33714, + "col": 26, + "tokLen": 7 + }, + "end": { + "offset": 33714, + "col": 26, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e7580", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33723, + "col": 35, + "tokLen": 2 + }, + "end": { + "offset": 33723, + "col": 35, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e7688", + "kind": "SwitchStmt", + "range": { + "begin": { + "offset": 33732, + "line": 1103, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 33898, + "line": 1110, + "col": 5, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7670", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33740, + "line": 1103, + "col": 13, + "tokLen": 1 + }, + "end": { + "offset": 33740, + "col": 13, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e7650", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33740, + "col": 13, + "tokLen": 1 + }, + "end": { + "offset": 33740, + "col": 13, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7478", + "kind": "VarDecl", + "name": "i", + "type": { + "qualType": "int" + } + } + } + ] + }, + { + "id": "0x38e79b8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33743, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33898, + "line": 1110, + "col": 5, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e76f0", + "kind": "CaseStmt", + "range": { + "begin": { + "offset": 33749, + "line": 1104, + "col": 5, + "tokLen": 4 + }, + "end": { + "offset": 33772, + "line": 1105, + "col": 16, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38e76d0", + "kind": "ConstantExpr", + "range": { + "begin": { + "offset": 33754, + "line": 1104, + "col": 10, + "tokLen": 1 + }, + "end": { + "offset": 33754, + "col": 10, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "0", + "inner": [ + { + "id": "0x38e76b0", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33754, + "col": 10, + "tokLen": 1 + }, + "end": { + "offset": 33754, + "col": 10, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "0" + } + ] + }, + { + "id": "0x38e7728", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33765, + "line": 1105, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 33772, + "col": 16, + "tokLen": 5 + } + }, + "inner": [ + { + "id": "0x38e7718", + "kind": "CXXBoolLiteralExpr", + "range": { + "begin": { + "offset": 33772, + "col": 16, + "tokLen": 5 + }, + "end": { + "offset": 33772, + "col": 16, + "tokLen": 5 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "value": false + } + ] + } + ] + }, + { + "id": "0x38e7778", + "kind": "CaseStmt", + "range": { + "begin": { + "offset": 33783, + "line": 1106, + "col": 5, + "tokLen": 4 + }, + "end": { + "offset": 33806, + "line": 1107, + "col": 16, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38e7758", + "kind": "ConstantExpr", + "range": { + "begin": { + "offset": 33788, + "line": 1106, + "col": 10, + "tokLen": 1 + }, + "end": { + "offset": 33788, + "col": 10, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "1", + "inner": [ + { + "id": "0x38e7738", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 33788, + "col": 10, + "tokLen": 1 + }, + "end": { + "offset": 33788, + "col": 10, + "tokLen": 1 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "1" + } + ] + }, + { + "id": "0x38e77b0", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 33799, + "line": 1107, + "col": 9, + "tokLen": 6 + }, + "end": { + "offset": 33806, + "col": 16, + "tokLen": 4 + } + }, + "inner": [ + { + "id": "0x38e77a0", + "kind": "CXXBoolLiteralExpr", + "range": { + "begin": { + "offset": 33806, + "col": 16, + "tokLen": 4 + }, + "end": { + "offset": 33806, + "col": 16, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "value": true + } + ] + } + ] + }, + { + "id": "0x38e7998", + "kind": "DefaultStmt", + "range": { + "begin": { + "offset": 33816, + "line": 1108, + "col": 5, + "tokLen": 7 + }, + "end": { + "offset": 33891, + "line": 1109, + "col": 67, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7980", + "kind": "ExprWithCleanups", + "range": { + "begin": { + "offset": 33833, + "col": 9, + "tokLen": 5 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "cleanupsHaveSideEffects": true, + "inner": [ + { + "id": "0x38e7968", + "kind": "CXXThrowExpr", + "range": { + "begin": { + "offset": 33833, + "col": 9, + "tokLen": 5 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "void" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e7938", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (sls::RuntimeError &&) noexcept" + }, + "elidable": true, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e7920", + "kind": "MaterializeTemporaryExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "xvalue", + "storageDuration": "full expression", + "inner": [ + { + "id": "0x38e78f8", + "kind": "CXXFunctionalCastExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "castKind": "ConstructorConversion", + "conversionFunc": { + "id": "0x2da84b8", + "kind": "CXXConstructorDecl", + "name": "RuntimeError", + "type": { + "qualType": "void (const char *)" + } + }, + "inner": [ + { + "id": "0x38e78d8", + "kind": "CXXBindTemporaryExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "temp": "0x38e78d0", + "dtor": { + "id": "0x2da8c50", + "kind": "CXXDestructorDecl", + "name": "~RuntimeError", + "type": { + "qualType": "void () noexcept" + } + }, + "inner": [ + { + "id": "0x38e78a0", + "kind": "CXXConstructExpr", + "range": { + "begin": { + "offset": 33839, + "col": 15, + "tokLen": 12 + }, + "end": { + "offset": 33891, + "col": 67, + "tokLen": 1 + } + }, + "type": { + "qualType": "sls::RuntimeError" + }, + "valueCategory": "prvalue", + "ctorType": { + "qualType": "void (const char *)" + }, + "hadMultipleCandidates": true, + "constructionKind": "complete", + "inner": [ + { + "id": "0x38e7888", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33852, + "col": 28, + "tokLen": 39 + }, + "end": { + "offset": 33852, + "col": 28, + "tokLen": 39 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e7848", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33852, + "col": 28, + "tokLen": 39 + }, + "end": { + "offset": 33852, + "col": 28, + "tokLen": 39 + } + }, + "type": { + "qualType": "const char[38]" + }, + "valueCategory": "lvalue", + "value": "\"Unknown boolean. Expecting be 0 or 1.\"" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}, +{ + "id": "0x38e7b28", + "kind": "FunctionDecl", + "loc": { + "offset": 33923, + "file": "ToString.cpp", + "line": 1113, + "col": 21, + "tokLen": 8 + }, + "range": { + "begin": { + "offset": 33903, + "col": 1, + "tokLen": 8 + }, + "end": { + "offset": 34056, + "line": 1116, + "col": 1, + "tokLen": 1 + } + }, + "previousDecl": "0x368f668", + "name": "StringTo", + "mangledName": "_ZN3sls8StringToIlEET_RKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE", + "type": { + "qualType": "int64_t (const std::string &)" + }, + "inner": [ + { + "kind": "TemplateArgument", + "type": { + "qualType": "long" + }, + "inner": [ + { + "id": "0x230bb50", + "kind": "BuiltinType", + "type": { + "qualType": "long" + } + } + ] + }, + { + "id": "0x38e7a68", + "kind": "ParmVarDecl", + "loc": { + "offset": 33951, + "line": 1113, + "col": 49, + "tokLen": 1 + }, + "range": { + "begin": { + "offset": 33932, + "col": 30, + "tokLen": 5 + }, + "end": { + "offset": 33951, + "col": 49, + "tokLen": 1 + } + }, + "isUsed": true, + "name": "s", + "type": { + "qualType": "const std::string &" + } + }, + { + "id": "0x38e81b8", + "kind": "CompoundStmt", + "range": { + "begin": { + "offset": 33954, + "col": 52, + "tokLen": 1 + }, + "end": { + "offset": 34056, + "line": 1116, + "col": 1, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7fc8", + "kind": "DeclStmt", + "range": { + "begin": { + "offset": 33960, + "line": 1114, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 34014, + "col": 59, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e7cc8", + "kind": "VarDecl", + "loc": { + "offset": 33964, + "col": 9, + "tokLen": 4 + }, + "range": { + "begin": { + "offset": 33960, + "col": 5, + "tokLen": 3 + }, + "end": { + "offset": 34012, + "col": 57, + "tokLen": 2 + } + }, + "isUsed": true, + "name": "base", + "type": { + "qualType": "int" + }, + "init": "c", + "inner": [ + { + "id": "0x38e7f98", + "kind": "ConditionalOperator", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 34012, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e7f38", + "kind": "BinaryOperator", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 34000, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "qualType": "bool" + }, + "valueCategory": "prvalue", + "opcode": "!=", + "inner": [ + { + "id": "0x38e7e10", + "kind": "CXXMemberCallExpr", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33982, + "col": 27, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e7de0", + "kind": "MemberExpr", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33973, + "col": 18, + "tokLen": 4 + } + }, + "type": { + "qualType": "" + }, + "valueCategory": "prvalue", + "name": "find", + "isArrow": false, + "referencedMemberDecl": "0x2ca1d70", + "inner": [ + { + "id": "0x38e7d30", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33971, + "col": 16, + "tokLen": 1 + }, + "end": { + "offset": 33971, + "col": 16, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7a68", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + } + ] + }, + { + "id": "0x38e7e40", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33978, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33978, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char *" + }, + "valueCategory": "prvalue", + "castKind": "ArrayToPointerDecay", + "inner": [ + { + "id": "0x38e7dc0", + "kind": "StringLiteral", + "range": { + "begin": { + "offset": 33978, + "col": 23, + "tokLen": 4 + }, + "end": { + "offset": 33978, + "col": 23, + "tokLen": 4 + } + }, + "type": { + "qualType": "const char[3]" + }, + "valueCategory": "lvalue", + "value": "\"0x\"" + } + ] + }, + { + "id": "0x38e7e58", + "kind": "CXXDefaultArgExpr", + "range": { + "begin": {}, + "end": {} + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "std::basic_string::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e7f20", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 33987, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 34000, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "unsigned long", + "qualType": "typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e7ef0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 33987, + "col": 32, + "tokLen": 3 + }, + "end": { + "offset": 34000, + "col": 45, + "tokLen": 4 + } + }, + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x31f4700", + "kind": "VarDecl", + "name": "npos", + "type": { + "desugaredQualType": "const unsigned long", + "qualType": "const typename basic_string, allocator>::size_type", + "typeAliasDeclId": "0x2c82e40" + } + }, + "nonOdrUseReason": "constant" + } + ] + } + ] + }, + { + "id": "0x38e7f58", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 34007, + "col": 52, + "tokLen": 2 + }, + "end": { + "offset": 34007, + "col": 52, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "16" + }, + { + "id": "0x38e7f78", + "kind": "IntegerLiteral", + "range": { + "begin": { + "offset": 34012, + "col": 57, + "tokLen": 2 + }, + "end": { + "offset": 34012, + "col": 57, + "tokLen": 2 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "value": "10" + } + ] + } + ] + } + ] + }, + { + "id": "0x38e81a8", + "kind": "ReturnStmt", + "range": { + "begin": { + "offset": 34020, + "line": 1115, + "col": 5, + "tokLen": 6 + }, + "end": { + "offset": 34053, + "col": 38, + "tokLen": 1 + } + }, + "inner": [ + { + "id": "0x38e8140", + "kind": "CallExpr", + "range": { + "begin": { + "offset": 34027, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 34053, + "col": 38, + "tokLen": 1 + } + }, + "type": { + "qualType": "long" + }, + "valueCategory": "prvalue", + "inner": [ + { + "id": "0x38e8128", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 34027, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 34032, + "col": 17, + "tokLen": 4 + } + }, + "type": { + "qualType": "long (*)(const std::string &, std::size_t *, int)" + }, + "valueCategory": "prvalue", + "castKind": "FunctionToPointerDecay", + "inner": [ + { + "id": "0x38e80a0", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 34027, + "col": 12, + "tokLen": 3 + }, + "end": { + "offset": 34032, + "col": 17, + "tokLen": 4 + } + }, + "type": { + "qualType": "long (const std::string &, std::size_t *, int)" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x2ca7f70", + "kind": "FunctionDecl", + "name": "stol", + "type": { + "qualType": "long (const std::string &, std::size_t *, int)" + } + } + } + ] + }, + { + "id": "0x38e8050", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 34037, + "col": 22, + "tokLen": 1 + }, + "end": { + "offset": 34037, + "col": 22, + "tokLen": 1 + } + }, + "type": { + "desugaredQualType": "const std::basic_string", + "qualType": "const std::string", + "typeAliasDeclId": "0x2a12a80" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7a68", + "kind": "ParmVarDecl", + "name": "s", + "type": { + "qualType": "const std::string &" + } + } + }, + { + "id": "0x38e8178", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 34040, + "col": 25, + "tokLen": 7 + }, + "end": { + "offset": 34040, + "col": 25, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::size_t *" + }, + "valueCategory": "prvalue", + "castKind": "NullToPointer", + "inner": [ + { + "id": "0x38e8070", + "kind": "CXXNullPtrLiteralExpr", + "range": { + "begin": { + "offset": 34040, + "col": 25, + "tokLen": 7 + }, + "end": { + "offset": 34040, + "col": 25, + "tokLen": 7 + } + }, + "type": { + "qualType": "std::nullptr_t" + }, + "valueCategory": "prvalue" + } + ] + }, + { + "id": "0x38e8190", + "kind": "ImplicitCastExpr", + "range": { + "begin": { + "offset": 34049, + "col": 34, + "tokLen": 4 + }, + "end": { + "offset": 34049, + "col": 34, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "prvalue", + "castKind": "LValueToRValue", + "inner": [ + { + "id": "0x38e8080", + "kind": "DeclRefExpr", + "range": { + "begin": { + "offset": 34049, + "col": 34, + "tokLen": 4 + }, + "end": { + "offset": 34049, + "col": 34, + "tokLen": 4 + } + }, + "type": { + "qualType": "int" + }, + "valueCategory": "lvalue", + "referencedDecl": { + "id": "0x38e7cc8", + "kind": "VarDecl", + "name": "base", + "type": { + "qualType": "int" + } + } + } + ] + } + ] + } + ] + } + ] + } + ] +} +] \ No newline at end of file diff --git a/slsDetectorSoftware/generator/autocomplete/slsdet-completion.bash b/slsDetectorSoftware/generator/autocomplete/slsdet-completion.bash new file mode 100644 index 000000000..0572be712 --- /dev/null +++ b/slsDetectorSoftware/generator/autocomplete/slsdet-completion.bash @@ -0,0 +1,171 @@ +#### simpler version of autocomplete.sh to understand the logic +#### each command has its own function when called it will produce the possible values for autocompletion + + +_sd() { + + # Reassemble command line words, excluding specified characters from the + # list of word completion separators (COMP_WORDBREAKS). + # @param $1 chars Characters out of $COMP_WORDBREAKS which should + # NOT be considered word breaks. This is useful for things like scp where + # we want to return host:path and not only path, so we would pass the + # colon (:) as $1 here. + # @param $2 words Name of variable to return words to + # @param $3 cword Name of variable to return cword to + # + _comp__reassemble_words() +{ + local exclude="" i j line ref + # Exclude word separator characters? + if [[ $1 ]]; then + # Yes, exclude word separator characters; + # Exclude only those characters, which were really included + exclude="[${1//[^$COMP_WORDBREAKS]/}]" + fi + + # Default to cword unchanged + printf -v "$3" %s "$COMP_CWORD" + # Are characters excluded which were former included? + if [[ $exclude ]]; then + # Yes, list of word completion separators has shrunk; + line=$COMP_LINE + # Re-assemble words to complete + for ((i = 0, j = 0; i < ${#COMP_WORDS[@]}; i++, j++)); do + # Is current word not word 0 (the command itself) and is word not + # empty and is word made up of just word separator characters to + # be excluded and is current word not preceded by whitespace in + # original line? + while [[ $i -gt 0 && ${COMP_WORDS[i]} == +($exclude) ]]; do + # Is word separator not preceded by whitespace in original line + # and are we not going to append to word 0 (the command + # itself), then append to current word. + [[ $line != [[:blank:]]* ]] && ((j >= 2)) && ((j--)) + # Append word separator to current or new word + ref="$2[$j]" + printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" + # Indicate new cword + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + # Remove optional whitespace + word separator from line copy + line=${line#*"${COMP_WORDS[i]}"} + # Indicate next word if available, else end *both* while and + # for loop + if ((i < ${#COMP_WORDS[@]} - 1)); then + ((i++)) + else + break 2 + fi + # Start new word if word separator in original line is + # followed by whitespace. + [[ $line == [[:blank:]]* ]] && ((j++)) + done + # Append word to current word + ref="$2[$j]" + printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" + # Remove optional whitespace + word from line copy + line=${line#*"${COMP_WORDS[i]}"} + # Indicate new cword + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + done + ((i == COMP_CWORD)) && printf -v "$3" %s "$j" + else + # No, list of word completions separators hasn't changed; + for i in "${!COMP_WORDS[@]}"; do + printf -v "$2[i]" %s "${COMP_WORDS[i]}" + done + fi +} + + + + __exptime(){ + if [ "${IS_GET}" == "1" ]; then + if [ "${cword}" == "2" ]; then + FCN_RETURN="s ms us ns" + fi + else + if [ "${cword}" == "2" ]; then + FCN_RETURN="" + fi + + if [ "${cword}" == "3" ]; then + FCN_RETURN="s ms us ns" + fi + + fi + } + + # trimbits will activate IS_PATH and signal that its input is a path + __trimbits(){ + if [ "${IS_GET}" == "1" ]; then + if [ "${cword}" == "2" ]; then + FCN_RETURN="" + IS_PATH=1 + fi + else + if [ "${cword}" == "2" ]; then + FCN_RETURN="" + IS_PATH=1 + fi + fi + } + + local cword words=() + _comp__reassemble_words ":" words cword + local FCN_RETURN="" + local IS_PATH=0 + COMPREPLY=() + local OPTIONS_NEW="" +# _get_comp_words_by_ref -n : cur + local cur=${words[cword]} + # check the action (get or put) + if [ "${words[0]}" == "sls_detector_get" ]; then + local IS_GET=1 + else + local IS_GET=0 + fi + + + # if no command is written, autocomplete with the commands + if [[ ${cword} -eq 1 ]]; then + local SLS_COMMANDS="trimbits exptime" + local SLS_COMMANDS_NEW="" + + case "$cur" in + [0-9]*:*) + local suggestions=($(compgen -W "${SLS_COMMANDS}" -- "${cur#*:}")) + COMPREPLY=( ${suggestions[*]} ) + ;; + [0-9]*) + COMPREPLY=() + ;; + *) + COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );; + + esac + return 0 + fi + + # if a command is written, autocomplete with the options + # call the function for the command + __"${words[1]##*:}" + + # if IS_PATH is activated, autocomplete with the path + if [[ ${IS_PATH} -eq 1 ]]; then + COMPREPLY=($(compgen -f -- "${cur}")) + return 0 + fi + + # autocomplete with the options + COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}")) + + + +} + +complete -F _sd -o filenames sls_detector_get +complete -F _sd -o filenames g +complete -F _sd -o filenames p +complete -F _sd -o filenames detg +complete -F _sd -o filenames detp + +complete -F _sd -o filenames sls_detector_put diff --git a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.in.sh b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.in.sh new file mode 100644 index 000000000..5b34c2bc6 --- /dev/null +++ b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.in.sh @@ -0,0 +1,74 @@ +# GENERATED FILE - DO NOT EDIT +# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN + +_sd() { + + + # -- THIS LINE WILL BE REPLACED WITH GENERATED CODE -- + + + local FCN_RETURN="" + local IS_PATH=0 + COMPREPLY=() + local OPTIONS_NEW="" + words=("${COMP_WORDS[@]}") + cword=$COMP_CWORD + + local cur=${words[cword]} + # check the action (get or put) + case "${words[0]}" in + "sls_detector_get" | "g" | "detg") + local IS_GET=1 + ;; + *) + local IS_GET=0 + ;; + esac + + # if no command is written, autocomplete with the commands + if [[ ${cword} -eq 1 ]]; then + + case "$cur" in + [0-9]*) + for i in $SLS_COMMANDS; do + SLS_COMMANDS_NEW="${SLS_COMMANDS_NEW} ${cur%%:*}:$i" + done + COMPREPLY=( $( compgen -W "${SLS_COMMANDS_NEW}" -- "$cur" ) );; + *) + COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );; + esac + return 0 + fi + + if [[ ${cword} -eq 2 ]] && [[ ${words[1]} == "-h" ]]; then + COMPREPLY=( $( compgen -W "$SLS_COMMANDS" -- "$cur" ) ) + return 0 + fi + + # if a command is written, autocomplete with the options + # call the function for the command + + if [[ "$SLS_COMMANDS" == *"${words[1]##*:}"* ]]; then + __"${words[1]##*:}" + fi + + # if IS_PATH is activated, autocomplete with the path + if [[ ${IS_PATH} -eq 1 ]]; then + COMPREPLY=($(compgen -f -- "${cur}")) + return 0 + fi + + # autocomplete with the options + COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}")) + + + +} + +complete -F _sd -o filenames sls_detector_get +complete -F _sd -o filenames g +complete -F _sd -o filenames detg + +complete -F _sd -o filenames sls_detector_put +complete -F _sd -o filenames p +complete -F _sd -o filenames detp \ No newline at end of file diff --git a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh new file mode 100644 index 000000000..07b4728dd --- /dev/null +++ b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh @@ -0,0 +1,3162 @@ +# GENERATED FILE - DO NOT EDIT +# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN + +_sd() { + + +local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clearroi clientversion clkdiv clkfreq clkphase column compdisabletime confadc config counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 exptimel extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit patternX patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port powerchip powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga roi romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_a v_b v_c v_chip v_d v_io v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport " +__acquire() { +FCN_RETURN="" +return 0 +} +__activate() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__adcclk() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcenable() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcenable10g() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcinvert() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adclist() { +FCN_RETURN="" +return 0 +} +__adcname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcphase() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="deg" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="deg" +fi +fi +return 0 +} +__adcpipeline() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcreg() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__adcvpp() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="mV mv" +fi +fi +return 0 +} +__apulse() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__asamples() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__autocompdisable() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__badchannels() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__blockingtrigger() { +FCN_RETURN="" +return 0 +} +__burstmode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="burst_external burst_internal cw_external cw_internal" +fi +fi +return 0 +} +__burstperiod() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__bursts() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__burstsl() { +FCN_RETURN="" +return 0 +} +__bustest() { +FCN_RETURN="" +return 0 +} +__cdsgain() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__chipversion() { +FCN_RETURN="" +return 0 +} +__clearbit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__clearbusy() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__clearroi() { +FCN_RETURN="" +return 0 +} +__clientversion() { +FCN_RETURN="" +return 0 +} +__clkdiv() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__clkfreq() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__clkphase() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="deg" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="deg" +fi +fi +return 0 +} +__column() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__compdisabletime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__confadc() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__config() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__counters() { +FCN_RETURN="" +return 0 +} +__currentsource() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="fix nofix" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="low normal" +fi +fi +return 0 +} +__dac() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="mV mv" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="mV mv" +fi +fi +return 0 +} +__dacindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__daclist() { +FCN_RETURN="" +return 0 +} +__dacname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__dacvalues() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="mV mv" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="mV mv" +fi +fi +return 0 +} +__datastream() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="bottom left right top" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="bottom left right top" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__dbitclk() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__dbitphase() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="deg" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="deg" +fi +fi +return 0 +} +__dbitpipeline() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__defaultdac() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__defaultpattern() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__delay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__delayl() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__detectorserverversion() { +FCN_RETURN="" +return 0 +} +__detsize() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__diodelay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__dpulse() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__dr() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__drlist() { +FCN_RETURN="" +return 0 +} +__dsamples() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__execcommand() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__exptime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__exptime1() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__exptime2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__exptime3() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__exptimel() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__extrastoragecells() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__extsampling() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__extsamplingsrc() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__extsig() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="inversion_off inversion_on trigger_in_falling_edge trigger_in_rising_edge" +fi +fi +return 0 +} +__fformat() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="binary hdf5" +fi +fi +return 0 +} +__filtercells() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__filterresistor() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__findex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__firmwaretest() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__firmwareversion() { +FCN_RETURN="" +return 0 +} +__fliprows() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__flowcontrol10g() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__fmaster() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__fname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__foverwrite() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__fpath() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__framecounter() { +FCN_RETURN="" +return 0 +} +__frames() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__framesl() { +FCN_RETURN="" +return 0 +} +__frametime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__free() { +FCN_RETURN="" +return 0 +} +__fwrite() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__gaincaps() { +FCN_RETURN="" +return 0 +} +__gainmode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="dynamic fixg0 fixg1 fixg2 forceswitchg1 forceswitchg2" +fi +fi +return 0 +} +__gappixels() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__gatedelay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__gatedelay1() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__gatedelay2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__gatedelay3() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__gates() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__getbit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__hardwareversion() { +FCN_RETURN="" +return 0 +} +__highvoltage() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__hostname() { +FCN_RETURN="" +return 0 +} +__im_a() { +FCN_RETURN="" +return 0 +} +__im_b() { +FCN_RETURN="" +return 0 +} +__im_c() { +FCN_RETURN="" +return 0 +} +__im_d() { +FCN_RETURN="" +return 0 +} +__im_io() { +FCN_RETURN="" +return 0 +} +__imagetest() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__initialchecks() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__inj_ch() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__interpolation() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__interruptsubframe() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__kernelversion() { +FCN_RETURN="" +return 0 +} +__lastclient() { +FCN_RETURN="" +return 0 +} +__led() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__lock() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__master() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__maxadcphaseshift() { +FCN_RETURN="" +return 0 +} +__maxclkphaseshift() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__maxdbitphaseshift() { +FCN_RETURN="" +return 0 +} +__measuredperiod() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__measuredsubperiod() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__moduleid() { +FCN_RETURN="" +return 0 +} +__nextframenumber() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__nmod() { +FCN_RETURN="" +return 0 +} +__numinterfaces() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__overflow() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__packageversion() { +FCN_RETURN="" +return 0 +} +__parallel() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__parameters() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__partialreset() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__patfname() { +FCN_RETURN="" +return 0 +} +__patioctrl() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patlimits() { +FCN_RETURN="" +return 0 +} +__patloop() { +FCN_RETURN="" +return 0 +} +__patloop0() { +FCN_RETURN="" +return 0 +} +__patloop1() { +FCN_RETURN="" +return 0 +} +__patloop2() { +FCN_RETURN="" +return 0 +} +__patmask() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patnloop() { +FCN_RETURN="" +return 0 +} +__patnloop0() { +FCN_RETURN="" +return 0 +} +__patnloop1() { +FCN_RETURN="" +return 0 +} +__patnloop2() { +FCN_RETURN="" +return 0 +} +__patsetbit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patternX() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patternstart() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__patwait() { +FCN_RETURN="" +return 0 +} +__patwait0() { +FCN_RETURN="" +return 0 +} +__patwait1() { +FCN_RETURN="" +return 0 +} +__patwait2() { +FCN_RETURN="" +return 0 +} +__patwaittime() { +FCN_RETURN="" +return 0 +} +__patwaittime0() { +FCN_RETURN="" +return 0 +} +__patwaittime1() { +FCN_RETURN="" +return 0 +} +__patwaittime2() { +FCN_RETURN="" +return 0 +} +__patword() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__pedestalmode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN=" 0" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__period() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__periodl() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__polarity() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="neg pos" +fi +fi +return 0 +} +__port() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__powerchip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__powerindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__powerlist() { +FCN_RETURN="" +return 0 +} +__powername() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__powervalues() { +FCN_RETURN="" +return 0 +} +__programfpga() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="--force-delete-normal-file" +fi +fi +return 0 +} +__pulse() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="--force-delete-normal-file" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__pulsechip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__pulsenmove() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__pumpprobe() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__quad() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__ratecorr() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__readnrows() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__readout() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__readoutspeed() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1 108 144 2 full_speed half_speed quarter_speed" +fi +fi +return 0 +} +__readoutspeedlist() { +FCN_RETURN="" +return 0 +} +__rebootcontroller() { +FCN_RETURN="" +return 0 +} +__reg() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__resetdacs() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="hard" +fi +fi +return 0 +} +__resetfpga() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="hard" +fi +fi +return 0 +} +__roi() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__romode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="analog analog_digital digital digital_transceiver transceiver" +fi +fi +return 0 +} +__row() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__runclk() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__runtime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__rx_arping() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_clearroi() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_dbitlist() { +FCN_RETURN="" +return 0 +} +__rx_dbitoffset() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_discardpolicy() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="discardempty discardpartial nodiscard" +fi +fi +return 0 +} +__rx_fifodepth() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_frameindex() { +FCN_RETURN="" +return 0 +} +__rx_framescaught() { +FCN_RETURN="" +return 0 +} +__rx_framesperfile() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_hostname() { +FCN_RETURN="" +return 0 +} +__rx_jsonaddheader() { +FCN_RETURN="" +return 0 +} +__rx_jsonpara() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_lastclient() { +FCN_RETURN="" +return 0 +} +__rx_lock() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_missingpackets() { +FCN_RETURN="" +return 0 +} +__rx_padding() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_printconfig() { +FCN_RETURN="" +return 0 +} +__rx_realudpsocksize() { +FCN_RETURN="" +return 0 +} +__rx_roi() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_silent() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_start() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__rx_status() { +FCN_RETURN="" +return 0 +} +__rx_stop() { +FCN_RETURN="" +return 0 +} +__rx_tcpport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_threads() { +FCN_RETURN="" +return 0 +} +__rx_udpsocksize() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_version() { +FCN_RETURN="" +return 0 +} +__rx_zmqfreq() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqhwm() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqstartfnum() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__rx_zmqstream() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__samples() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__savepattern() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__scan() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "6" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__scanerrmsg() { +FCN_RETURN="" +return 0 +} +__selinterface() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__serialnumber() { +FCN_RETURN="" +return 0 +} +__setbit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__settings() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__settingslist() { +FCN_RETURN="" +return 0 +} +__settingspath() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__signalindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__signallist() { +FCN_RETURN="" +return 0 +} +__signalname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__slowadc() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__slowadcindex() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__slowadclist() { +FCN_RETURN="" +return 0 +} +__slowadcname() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__slowadcvalues() { +FCN_RETURN="" +return 0 +} +__start() { +FCN_RETURN="" +return 0 +} +__status() { +FCN_RETURN="" +return 0 +} +__stop() { +FCN_RETURN="" +return 0 +} +__stopport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__storagecell_delay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__storagecell_start() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__subdeadtime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__subexptime() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="ms ns s us" +fi +fi +return 0 +} +__sync() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__syncclk() { +FCN_RETURN="" +return 0 +} +__temp_10ge() { +FCN_RETURN="" +return 0 +} +__temp_adc() { +FCN_RETURN="" +return 0 +} +__temp_control() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__temp_dcdc() { +FCN_RETURN="" +return 0 +} +__temp_event() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__temp_fpga() { +FCN_RETURN="" +return 0 +} +__temp_fpgaext() { +FCN_RETURN="" +return 0 +} +__temp_fpgafl() { +FCN_RETURN="" +return 0 +} +__temp_fpgafr() { +FCN_RETURN="" +return 0 +} +__temp_slowadc() { +FCN_RETURN="" +return 0 +} +__temp_sodl() { +FCN_RETURN="" +return 0 +} +__temp_sodr() { +FCN_RETURN="" +return 0 +} +__temp_threshold() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__templist() { +FCN_RETURN="" +return 0 +} +__tempvalues() { +FCN_RETURN="" +return 0 +} +__tengiga() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__threshold() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__thresholdnotb() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__timing() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="`detg timinglist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +fi +fi +return 0 +} +__timinglist() { +FCN_RETURN="" +return 0 +} +__timingsource() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="external internal" +fi +fi +return 0 +} +__top() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__transceiverenable() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__trigger() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__triggers() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__triggersl() { +FCN_RETURN="" +return 0 +} +__trimbits() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__trimen() { +FCN_RETURN="" +return 0 +} +__trimval() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__tsamples() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__txdelay() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__txdelay_frame() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__txdelay_left() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__txdelay_right() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__type() { +FCN_RETURN="" +return 0 +} +__udp_cleardst() { +FCN_RETURN="" +return 0 +} +__udp_dstip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstip2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstlist() { +FCN_RETURN="" +return 0 +} +__udp_dstmac() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstmac2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_dstport2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_firstdst() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_numdst() { +FCN_RETURN="" +return 0 +} +__udp_reconfigure() { +FCN_RETURN="" +return 0 +} +__udp_srcip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_srcip2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_srcmac() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_srcmac2() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__udp_validate() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__update() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__updatedetectorserver() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__updatekernel() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +IS_PATH=1 +fi +fi +return 0 +} +__updatemode() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__user() { +FCN_RETURN="" +return 0 +} +__v_a() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_b() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_c() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_chip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_d() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_io() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__v_limit() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_comp_adc() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_comp_fe() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_cs() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_opa_1st() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_opa_fd() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vchip_ref_comp_fe() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__versions() { +FCN_RETURN="" +return 0 +} +__veto() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="0 1" +fi +fi +return 0 +} +__vetoalg() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="10gbe lll none" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="hits raw" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="10gbe lll none" +fi +fi +return 0 +} +__vetofile() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vetophoton() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 1 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "4" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "5" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vetoref() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vetostream() { +FCN_RETURN="" +return 0 +} +__virtual() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +if [[ "${cword}" == "3" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__vm_a() { +FCN_RETURN="" +return 0 +} +__vm_b() { +FCN_RETURN="" +return 0 +} +__vm_c() { +FCN_RETURN="" +return 0 +} +__vm_d() { +FCN_RETURN="" +return 0 +} +__vm_io() { +FCN_RETURN="" +return 0 +} +__zmqhwm() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__zmqip() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} +__zmqport() { +FCN_RETURN="" +if [[ ${IS_GET} -eq 0 ]]; then +if [[ "${cword}" == "2" ]]; then +FCN_RETURN="" +fi +fi +return 0 +} + + + local FCN_RETURN="" + local IS_PATH=0 + COMPREPLY=() + local OPTIONS_NEW="" + words=("${COMP_WORDS[@]}") + cword=$COMP_CWORD + + local cur=${words[cword]} + # check the action (get or put) + case "${words[0]}" in + "sls_detector_get" | "g" | "detg") + local IS_GET=1 + ;; + *) + local IS_GET=0 + ;; + esac + + # if no command is written, autocomplete with the commands + if [[ ${cword} -eq 1 ]]; then + + case "$cur" in + [0-9]*) + for i in $SLS_COMMANDS; do + SLS_COMMANDS_NEW="${SLS_COMMANDS_NEW} ${cur%%:*}:$i" + done + COMPREPLY=( $( compgen -W "${SLS_COMMANDS_NEW}" -- "$cur" ) );; + *) + COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );; + esac + return 0 + fi + + if [[ ${cword} -eq 2 ]] && [[ ${words[1]} == "-h" ]]; then + COMPREPLY=( $( compgen -W "$SLS_COMMANDS" -- "$cur" ) ) + return 0 + fi + + # if a command is written, autocomplete with the options + # call the function for the command + + if [[ "$SLS_COMMANDS" == *"${words[1]##*:}"* ]]; then + __"${words[1]##*:}" + fi + + # if IS_PATH is activated, autocomplete with the path + if [[ ${IS_PATH} -eq 1 ]]; then + COMPREPLY=($(compgen -f -- "${cur}")) + return 0 + fi + + # autocomplete with the options + COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}")) + + + +} + +complete -F _sd -o filenames sls_detector_get +complete -F _sd -o filenames g +complete -F _sd -o filenames detg + +complete -F _sd -o filenames sls_detector_put +complete -F _sd -o filenames p +complete -F _sd -o filenames detp \ No newline at end of file diff --git a/slsDetectorSoftware/generator/commands.yaml b/slsDetectorSoftware/generator/commands.yaml new file mode 100644 index 000000000..2a7224d53 --- /dev/null +++ b/slsDetectorSoftware/generator/commands.yaml @@ -0,0 +1,4264 @@ +--- +# detectors: MYTHEN3 + +################# TEMPLATES ################# +TIME_COMMAND: + infer_action: true + help: "" + template: true + actions: + GET: + require_det_id: true + function: '' + args: + - argc: 0 + output: [ OutString(t) ] + - argc: 1 + arg_types: [ special::time_unit ] + output: [ "OutString(t , args[0])" ] + PUT: + function: '' + require_det_id: true + input: [ converted_time ] + input_types: [ time::ns ] + args: + - argc: 1 + arg_types: [ std::string ] + + separate_time_units: + input: 'args[0]' + output: [ converted_time, unit ] + output: [ 'args[0]' ] + - argc: 2 + arg_types: [ int, special::time_unit ] + + convert_to_time: + input: [ 'args[0]', 'args[1]' ] + output: converted_time + output: [ 'args[0]', 'args[1]' ] + +TIME_GET_COMMAND: + infer_action: true + help: "" + template: true + actions: + GET: + require_det_id: true + function: '' + args: + - argc: 0 + output: [ OutString(t) ] + - argc: 1 + arg_types: [ special::time_unit ] + output: [ "OutString(t , args[0])" ] + +STRING_COMMAND: + infer_action: true + help: "" + template: true + actions: + GET: + require_det_id: true + function: '' + argc: 0 + output: [ OutString(t) ] + PUT: + function: '' + output: [ 'args.front()' ] + input: [ 'args[0]' ] + input_types: [ std::string ] + require_det_id: true + cast_input: [ false ] + argc: 1 + +INTEGER_COMMAND_HEX_WIDTH16: + infer_action: true + help: "" + template: true + actions: + GET: + require_det_id: true + function: '' + argc: 0 + output: [ "OutStringHex(t, 16)" ] + PUT: + require_det_id: true + function: '' + argc: 1 + input: [ 'args[0]' ] + cast_input: [ true ] + input_types: [ uint64_t ] + output: [ "ToStringHex(arg0, 16)" ] + +INTEGER_COMMAND_HEX: + template: true + infer_action: true + help: "" + actions: + GET: + require_det_id: true + function: '' + argc: 0 + output: [ "OutStringHex(t)" ] + PUT: + require_det_id: true + function: '' + argc: 1 + input: [ 'args[0]' ] + cast_input: [ true ] + input_types: [ uint32_t ] + output: [ "args.front()" ] + +INTEGER_COMMAND_VEC_ID: + template: true + infer_action: true + help: "" + actions: + GET: + require_det_id: true + function: '' + argc: 0 + output: [ OutString(t) ] + PUT: + require_det_id: true + function: '' + argc: 1 + input: [ 'args[0]' ] + cast_input: [ true ] + input_types: [ int ] + output: [ 'args.front()' ] + +INTEGER_COMMAND_VEC_ID_GET: + template: true + infer_action: true + help: "" + actions: + GET: + require_det_id: true + function: '' + argc: 0 + output: [ OutString(t) ] + PUT: + require_det_id: true + convert_det_id: false + function: '' + argc: 1 + input: [ 'args[0]' ] + cast_input: [ true ] + input_types: [ int ] + output: [ 'args.front()' ] + +INTEGER_COMMAND_SET_NOID_GET_ID: + template: true + infer_action: true + help: "" + actions: + GET: + require_det_id: true + function: '' + argc: 0 + output: [ OutString(t) ] + PUT: + check_det_id: true + function: '' + argc: 1 + input: [ 'args[0]' ] + cast_input: [ true ] + input_types: [ int ] + output: [ 'args.front()' ] + +INTEGER_COMMAND_NOID: + template: true + infer_action: true + help: "" + actions: + GET: + check_det_id: true + function: '' + argc: 0 + output: [ OutString(t) ] + PUT: + check_det_id: true + function: '' + argc: 1 + input: [ 'args[0]' ] + cast_input: [ true ] + input_types: [ int ] + output: [ 'args.front()' ] + +INTEGER_IND_COMMAND: + template: true + infer_action: true + help: "" + actions: + GET: + # extra variable to store the index + require_det_id: true + function: '' + argc: 0 + input: [ 'INDEX' ] + input_types: [ int ] + cast_input: [ false ] + output: [ OutString(t) ] + PUT: + # extra variable to store the index + function: '' + require_det_id: true + argc: 1 + input: [ 'INDEX', 'args[0]' ] + input_types: [ int, int ] + cast_input: [ false, true ] + output: [ 'args.front()' ] + +INTEGER_USER_IND_COMMAND: + template: true + infer_action: true + help: "" + actions: + GET: + # extra variable to store the index + require_det_id: true + function: '' + argc: 1 + input: [ 'INDEX', 'args[0]' ] + cast_input: [ false, true ] + input_types: [ int, int ] + output: [ 'args[0]', "' '", OutStringHex(t) ] + PUT: + # extra variable to store the index + function: '' + require_det_id: true + argc: 2 + input: [ 'INDEX', 'args[0]', 'args[1]' ] + cast_input: [ false, true, true ] + input_types: [ int, int , int ] + output: [ 'args[0]', "' '", 'args[1]' ] + +EXECUTE_SET_COMMAND_NOID: + template: true + infer_action: true + help: "" + actions: + PUT: + check_det_id: true + function: '' + output: [ '"successful"' ] + argc: 0 + +EXECUTE_SET_COMMAND: + template: true + infer_action: true + help: "" + actions: + PUT: + require_det_id: true + function: '' + output: [ '"successful"' ] + argc: 0 + +EXECUTE_SET_COMMAND_NOID_1ARG: + template: true + infer_action: true + help: "" + actions: + PUT: + check_det_id: true + function: '' + argc: 1 + input: [ 'args[0]' ] + cast_input: [ false ] + arg_types: [special::path] + input_types: [ std::string ] + output: [ 'args.front()' ] + +GET_COMMAND: + template: true + infer_action: true + help: "" + actions: + GET: + require_det_id: true + function: '' + argc: 0 + output: [ OutString(t) ] + +GET_COMMAND_NOID: + template: true + infer_action: true + help: "" + actions: + GET: + function: '' + argc: 0 + output: [ ToString(t) ] + +GET_IND_COMMAND: + template: true + infer_action: true + help: "" + actions: + GET: + require_det_id: true + function: '' + argc: 0 + input: [ 'VAL' ] + cast_input: [ false ] + input_types: [ int ] + output: [ OutString(t) ] + +CTB_NAMED_LIST: + template: true + infer_action: true + actions: + GET: + check_det_id: true + exceptions: + - condition: 'cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD' + message: 'cmd + " only allowed for CTB."' + argc: 0 + output: [ 'ToString(t)' ] + PUT: + check_det_id: true + exceptions: + - condition: 'cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD' + message: 'cmd + " only allowed for CTB."' + - condition: 'cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD' + message: '"This detector already has fixed dac names. Cannot change them."' + input: [ 'args' ] + argc: -1 # unknown number of args + input_types: [ std::string ] + output: [ 'ToString(args)' ] + +CTB_SINGLE_DACNAME: + template: true + infer_action: true + actions: + GET: + extra_variables: + - name: index + type: defs::dacIndex + value: 0 + + check_det_id: true + exceptions: + - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + message: 'cmd + " only allowed for CTB."' + argc: 1 + input: [ "static_cast(StringTo(args[0]) + index)" ] + input_types: [ defs::dacIndex ] + output: [ 'args[0]',"' '", 't' ] + + PUT: + extra_variables: + - name: index + type: defs::dacIndex + value: 0 + + check_det_id: true + exceptions: + - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + message: 'cmd + " only allowed for CTB."' + argc: 2 + input: [ "static_cast(StringTo(args[0]) + index)","args[1]" ] + input_types: [ defs::dacIndex , std::string ] + output: [ 'ToString(args)' ] + +CTB_GET_DACINDEX: + template: true + infer_action: true + actions: + GET: + extra_variables: + - name: index + type: defs::dacIndex + value: 0 + + check_det_id: true + exceptions: + - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + message: 'cmd + " only allowed for CTB."' + argc: 1 + input: [ 'args[0]' ] + input_types: [ std::string ] + output: [ 'ToString(static_cast(t) - index)' ] + +CTB_SINGLE_NAME: + template: true + infer_action: true + actions: + GET: + check_det_id: true + exceptions: + - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + message: 'cmd + " only allowed for CTB."' + argc: 1 + input: [ "args[0]" ] + cast_input: [ true ] + input_types: [ int ] + output: [ 'args[0]',"' '", 't' ] + PUT: + check_det_id: true + exceptions: + - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + message: 'cmd + " only allowed for CTB."' + argc: 2 + cast_input: [ true, false ] + input: [ "args[0]","args[1]" ] + input_types: [ int , std::string ] + output: [ 'ToString(args)' ] + +CTB_GET_INDEX: + template: true + infer_action: true + actions: + GET: + check_det_id: true + exceptions: + - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + message: 'cmd + " only allowed for CTB."' + argc: 1 + input: [ 'args[0]' ] + input_types: [ std::string ] + output: [ 'static_cast(t)' ] + + +################# COMMANDS ################################## +################# TIME_COMMAND ############# + +period: + help: "[duration] [(optional unit) ns|us|ms|s]\n\tPeriod between frames" + inherit_actions: TIME_COMMAND + actions: + GET: + function: getPeriod + PUT: + function: setPeriod + +delay: + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb][Moench] Delay after trigger" + inherit_actions: TIME_COMMAND + actions: + GET: + function: getDelayAfterTrigger + PUT: + function: setDelayAfterTrigger + +subexptime: + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Eiger] Exposure time of EIGER subframes in 32 bit mode." + inherit_actions: TIME_COMMAND + actions: + GET: + function: getSubExptime + PUT: + function: setSubExptime + +subdeadtime: + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Eiger] Dead time of EIGER subframes in 32 bit mode. Subperiod = subexptime + subdeadtime." + inherit_actions: TIME_COMMAND + actions: + GET: + function: getSubDeadTime + PUT: + function: setSubDeadTime + +compdisabletime: + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau] Time before end of exposure when comparator is disabled. It is only possible for chipv1.1." + inherit_actions: TIME_COMMAND + actions: + GET: + function: getComparatorDisableTime + PUT: + function: setComparatorDisableTime + +storagecell_delay: + help: "[duration (0-1638375 ns)] [(optional unit) ns|us|ms|s]\n\t[Jungfrau] Additional time delay between 2 consecutive exposures in burst mode (resolution of 25ns). Only applicable for chipv1.0. For advanced users only." + inherit_actions: TIME_COMMAND + actions: + GET: + function: getStorageCellDelay + PUT: + function: setStorageCellDelay + +burstperiod: + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Gotthard2] Period between 2 bursts. Only in burst mode and auto timing mode." + inherit_actions: TIME_COMMAND + actions: + GET: + function: getBurstPeriod + PUT: + function: setBurstPeriod + +################# TIME_GET_COMMAND ############# +delayl: + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Delay Left in Acquisition. \n\t[Gotthard2] only in continuous mode." + inherit_actions: TIME_GET_COMMAND + actions: + GET: + function: getDelayAfterTriggerLeft + +periodl: + help: "\n\t[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Period left for current frame. \n\t[Gotthard2] only in continuous mode." + inherit_actions: TIME_GET_COMMAND + actions: + GET: + function: getPeriodLeft + +measuredperiod: + help: "[(optional unit) ns|us|ms|s]\n\t[Eiger] Measured frame period between last frame and previous one. Can be measured with minimum 2 frames in an acquisition." + inherit_actions: TIME_GET_COMMAND + actions: + GET: + function: getMeasuredPeriod + +measuredsubperiod: + help: "[(optional unit) ns|us|ms|s]\n\t[Eiger] Measured sub frame period between last sub frame and previous one." + inherit_actions: TIME_GET_COMMAND + actions: + GET: + function: getMeasuredSubFramePeriod + +exptimel: + help: "[(optional unit) ns|us|ms|s]\n\t[Gotthard] Exposure time left for current frame. " + inherit_actions: TIME_GET_COMMAND + actions: + GET: + function: getExptimeLeft + +runtime: + help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Time from detector start up.\n\t[Gotthard2] not in burst and auto mode." + inherit_actions: TIME_GET_COMMAND + actions: + GET: + function: getActualTime + +frametime: + help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Timestamp at a frame start.\n\t[Gotthard2] not in burst and auto mode." + inherit_actions: TIME_GET_COMMAND + actions: + GET: + function: getMeasurementTime + +################# STRING_COMMAND ################# +settingspath: + help: "[path]\n\t[Eiger][Mythen3] Directory where settings files are loaded from/to." + inherit_actions: STRING_COMMAND + actions: + GET: + function: getSettingsPath + PUT: + function: setSettingsPath + arg_types: [ special::path ] + +fpath: + help: "[path]\n\tDirectory where output data files are written in receiver. Default is '/'. \n\tIf path does not exist, it will try to create it." + inherit_actions: STRING_COMMAND + actions: + GET: + function: getFilePath + PUT: + function: setFilePath + arg_types: [ special::path ] + +fname: + help: "[name]\n\tFile name prefix for output data file. Default is run. File name: [file name prefix]_d[detector index]_f[sub file index]_[acquisition/file index].raw." + inherit_actions: STRING_COMMAND + actions: + GET: + function: getFileNamePrefix + PUT: + function: setFileNamePrefix + +################# INTEGER_COMMAND_HEX_WIDTH16 ################# +patioctrl: + help: "[64 bit mask]\n\t[Ctb] 64 bit mask defining input (0) and output (1) signals." + inherit_actions: INTEGER_COMMAND_HEX_WIDTH16 + actions: + GET: + function: getPatternIOControl + PUT: + function: setPatternIOControl + +patmask: + help: "[64 bit mask]\n\t[Ctb][Mythen3] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern." + inherit_actions: INTEGER_COMMAND_HEX_WIDTH16 + actions: + GET: + function: getPatternMask + PUT: + function: setPatternMask + +patsetbit: + help: "[64 bit mask]\n\t[Ctb][Mythen3] Sets the mask applied to every pattern to the selected bits." + inherit_actions: INTEGER_COMMAND_HEX_WIDTH16 + actions: + GET: + function: getPatternBitMask + PUT: + function: setPatternBitMask + +################# INTEGER_COMMAND_HEX ################# +adcenable: + help: "[bitmask]\n\t[Ctb] ADC Enable Mask for 1Gb Enable for each 32 ADC channel." + inherit_actions: INTEGER_COMMAND_HEX + actions: + GET: + function: getADCEnableMask + PUT: + function: setADCEnableMask + +adcenable10g: + help: "[bitmask]\n\t[Ctb] ADC Enable Mask for 10Gb mode for each 32 ADC channel. However, if any of a consecutive 4 bits are enabled, the complete 4 bits are enabled." + inherit_actions: INTEGER_COMMAND_HEX + actions: + GET: + function: getTenGigaADCEnableMask + PUT: + function: setTenGigaADCEnableMask + +transceiverenable: + help: "[bitmask]\n\t[Ctb] Transceiver Enable Mask. Enable for each 4 Transceiver channel." + inherit_actions: INTEGER_COMMAND_HEX + actions: + GET: + function: getTransceiverEnableMask + PUT: + function: setTransceiverEnableMask + +adcinvert: + help: "[bitmask]\n\t[Ctb][Jungfrau][Moench] ADC Inversion Mask.\n\t[Jungfrau][Moench] Inversions on top of the default mask." + inherit_actions: INTEGER_COMMAND_HEX + actions: + GET: + function: getADCInvert + PUT: + function: setADCInvert + +################# INTEGER_COMMAND_VEC_ID ################# +settings: + help: "[standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain, highgain0, fixgain1, fixgain2, forceswitchg1, forceswitchg2, verylowgain, g1_hg, g1_lg, g2_hc_hg, g2_hc_lg, g2_lc_hg, g2_lc_lg, g4_hg, g4_lg, gain0]\n\t Detector Settings\n\t[Jungfrau] - [ gain0 | highgain0]\n\t[Gotthard] - [dynamicgain | highgain | lowgain | mediumgain | veryhighgain]\n\t[Gotthard] Also loads default dacs on to the detector.\n\t[Gotthard2] - [dynamicgain | fixgain1 | fixgain2]\n\t[Mythen3] - [standard | fast | highgain] Also changes vrshaper and vrpreamp. \n\t[Eiger] Use threshold or thresholdnotb. \n\t[Eiger] threshold and settings loaded from file found in settingspath. \n\t[Moench] - [g1_hg | g1_lg | g2_hc_hg | g2_hc_lg | g2_lc_hg | g2_lc_lg | g4_hg | g4_lg]" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getSettings + PUT: + function: setSettings + input_types: [ defs::detectorSettings ] + +trimval: + help: "[n_trimval]\n\t[Eiger][Mythen3] All trimbits set to this value. Returns -1 if all trimbits are different values." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getAllTrimbits + PUT: + function: setAllTrimbits + +fliprows: + help: "[0, 1]\n\t[Eiger] flips rows paramater sent to slsreceiver to stream as json parameter to flip rows in gui \n\t[Jungfrau][Moench] flips rows in the detector itself. For bottom module and number of interfaces must be set to 2. slsReceiver and slsDetectorGui does not handle." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getFlipRows + PUT: + function: setFlipRows + input_types: [ bool ] + +row: + inherit_actions: INTEGER_COMMAND_VEC_ID + help: "[value]\n\tSet Detector row (udp header) to value. \n\tGui uses it to rearrange for complete image" + actions: + GET: + function: getRow + PUT: + function: setRow + +column: + help: "[value]\n\tSet Detector column (udp header) to value. \n\tGui uses it to rearrange for complete image" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getColumn + PUT: + function: setColumn + +timing: + help: "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Moench][Gotthard][Ctb][Gotthard2] [auto|trigger]\n\t[Mythen3] [auto|trigger|gating|trigger_gating]\n\t[Eiger] [auto|trigger|gating|burst_trigger]" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getTimingMode + PUT: + function: setTimingMode + input_types: [ defs::timingMode ] + +highvoltage: + help: "[n_value]\n\tHigh voltage to the sensor in Voltage. \n\t[Gotthard] [0|90|110|120|150|180|200] \n\t[Eiger][Mythen3][Gotthard2] 0-200 \n\t[Jungfrau][Moench][Ctb] [0|60-200]" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getHighVoltage + PUT: + function: setHighVoltage + +powerchip: + help: "[0, 1]\n\t[Jungfrau][Moench][Mythen3][Gotthard2] Power the chip. \n\t[Jungfrau][Moench] Default is 0. Get will return power status. Can be off if temperature event occured (temperature over temp_threshold with temp_control enabled. Will configure chip (only chip v1.1)\n\t[Mythen3][Gotthard2] Default is 1. If module not connected or wrong module, powerchip will fail." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getPowerChip + PUT: + function: setPowerChip + input_types: [ bool ] + +imagetest: + help: "[0, 1]\n\t[Gotthard] 1 adds channel intensity with precalculated values when taking an acquisition. Default is 0.\n\t[Eiger][Jungfrau][Moench] Only for Virtual servers. If 0, each pixel intensity incremented by 1. If 1, all pixels almost saturated." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getImageTestMode + PUT: + function: setImageTestMode + input_types: [ bool ] + +parallel: + help: "[0, 1]\n\t[Eiger][Mythen3][Gotthard2][Moench] Enable or disable parallel mode.\n\t[Mythen3] If exptime is too short, the acquisition will return ERROR status and take fewer frames than expected.\n\t[Mythen3][Eiger][Moench] Default: Non parallel.\n\t[Gotthard2] Default: Parallel. Non parallel mode works only in continuous mode." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getParallelMode + PUT: + function: setParallelMode + input_types: [ bool ] + +filterresistor: + help: "[value] [Gotthard2][Jungfrau] Set filter resistor. Increasing values for increasing resistance.\n\t[Gotthard2] Options: [0|1|2|3]. Default is 0.\n\t[Jungfrau] Options: [0|1]. Default is 1." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getFilterResistor + PUT: + function: setFilterResistor + +dbitpipeline: + help: "[n_value]\n\t[Ctb][Gotthard2] Pipeline of the clock for latching digital bits.\n\t[Gotthard2] Options: 0-7\n\t[CTB] Options: 0-255" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getDBITPipeline + PUT: + function: setDBITPipeline + +readnrows: + help: "\n\t[1-256]\n\t\t[Eiger] Number of rows to readout per half module starting from the centre. Options: 0 - 256. 256 is default. The permissible values depend on dynamic range and 10Gbe enabled.\n\t[8-512 (multiple of 8)]\n\t\t[Jungfrau] Number of rows per module starting from the centre. Options: 8 - 512, must be multiples of 8. Default is 512.\n\t\t[Moench] Number of rows per module starting from the centre. Options:16 - 400, must be multiples of 16. Default is 400." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getReadNRows + PUT: + function: setReadNRows + +nextframenumber: + help: "[n_value]\n\t[Eiger][Jungfrau][Moench][CTB] Next frame number. Stopping acquisition might result in different frame numbers for different modules." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getNextFrameNumber + PUT: + function: setNextFrameNumber + input_types: [ uint64_t ] + +numinterfaces: + help: "[1, 2]\n\t[Jungfrau][Moench] Number of udp interfaces to stream data from detector. Default: 1.\n\tAlso enables second interface in receiver for listening (Writes a file per interface if writing enabled).\n\tAlso restarts client and receiver zmq sockets if zmq streaming enabled.\n\t[Eiger] Only gets with result 2." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getNumberofUDPInterfaces + PUT: + function: setNumberofUDPInterfaces + +selinterface: + help: "[0, 1]\n\t[Jungfrau][Moench] The udp interface to stream data from detector. Effective only when number of interfaces is 1. Default: 0 (outer)" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getSelectedUDPInterface + PUT: + function: selectUDPInterface + input_types: [ bool ] + +udp_firstdst: + help: "\n[0 - 31 (or number of udp destinations)]\n\t[Jungfrau][Moench][Gotthard2]\n[0-63]\n\t[Mythen3]\n\n\t One can set which is the first destination that the detector will stream images out from in a round robin fashion. The entry must not have been empty. Default: 0" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getFirstUDPDestination + PUT: + function: setFirstUDPDestination + +udp_srcmac: + help: "[x:x:x:x:x:x]\n\tMac address of the detector (source) udp interface. \n\t[Eiger] Do not set as detector will replace with its own DHCP Mac (1G) or DHCP Mac + 1 (10G)." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getSourceUDPMAC + PUT: + function: setSourceUDPMAC + input_types: [ MacAddr ] + input: [ 'MacAddr(args[0])' ] + cast_input: [ false ] + +udp_srcmac2: + help: "[x:x:x:x:x:x]\n\t[Jungfrau][Moench] Mac address of the top half or inner (source) udp interface. " + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getSourceUDPMAC2 + PUT: + function: setSourceUDPMAC2 + input_types: [ MacAddr ] + input: [ 'MacAddr(args[0])' ] + cast_input: [ false ] + +udp_dstmac: + help: "[x:x:x:x:x:x]\n\tMac address of the receiver (destination) udp interface. Not mandatory to set as udp_dstip retrieves it from slsReceiver process, but must be set if you use a custom receiver (not slsReceiver). Use router mac if router between detector and receiver." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getDestinationUDPMAC + PUT: + function: setDestinationUDPMAC + input_types: [ MacAddr ] + input: [ 'MacAddr(args[0])' ] + cast_input: [ false ] + +udp_dstmac2: + help: "[x:x:x:x:x:x]\n\t[Jungfrau][Moench] Mac address of the receiver (destination) udp interface 2. Not mandatory to set as udp_dstip2 retrieves it from slsReceiver process but must be set if you use a custom receiver (not slsReceiver). \n\t [Jungfrau][Moench] top half or inner interface \n\t [Gotthard2] veto debugging. Use router mac if router between detector and receiver." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getDestinationUDPMAC2 + PUT: + function: setDestinationUDPMAC2 + input_types: [ MacAddr ] + input: [ 'MacAddr(args[0])' ] + cast_input: [ false ] + +tengiga: + help: "[0, 1]\n\t[Eiger][Ctb][Mythen3] 10GbE Enable." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getTenGiga + PUT: + function: setTenGiga + input_types: [ bool ] + +flowcontrol10g: + help: "[0, 1]\n\t[Eiger][Jungfrau][Moench] 10GbE Flow Control." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getTenGigaFlowControl + PUT: + function: setTenGigaFlowControl + input_types: [ bool ] + +txdelay_frame: + help: "[n_delay]\n\t[Eiger][Jungfrau][Moench][Mythen3] Transmission delay of first udp packet being streamed out of the module.\n\t[Jungfrau][Moench] [0-31] Each value represents 1 ms\n\t[Eiger] Additional delay to txdelay_left and txdelay_right. Each value represents 10ns. Typical value is 50000.\n\t[Mythen3] [0-16777215] Each value represents 8 ns (125 MHz clock), max is 134 ms." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getTransmissionDelayFrame + PUT: + function: setTransmissionDelayFrame + +txdelay_left: + help: "[n_delay]\n\t[Eiger] Transmission delay of first packet in an image being streamed out of the module's left UDP port. Each value represents 10ns. Typical value is 50000." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getTransmissionDelayLeft + PUT: + function: setTransmissionDelayLeft + +txdelay_right: + help: "[n_delay]\n\t[Eiger] Transmission delay of first packet in an image being streamed out of the module's right UDP port. Each value represents 10ns. Typical value is 50000." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getTransmissionDelayRight + PUT: + function: setTransmissionDelayRight + +rx_fifodepth: + help: "[n_frames]\n\tSet the number of frames in the receiver fifo depth (buffer between listener and writer threads)." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxFifoDepth + PUT: + function: setRxFifoDepth + +rx_silent: + help: "[0, 1]\n\tSwitch on or off receiver text output during acquisition." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxSilentMode + PUT: + function: setRxSilentMode + input_types: [ bool ] + +rx_discardpolicy: + help: "[nodiscard (default)|discardempty|discardpartial(fastest)]\n\tFrame discard policy of receiver. nodiscard does not discard frames, discardempty discards empty frames, discardpartial discards partial frames." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxFrameDiscardPolicy + PUT: + function: setRxFrameDiscardPolicy + input_types: [ defs::frameDiscardPolicy ] + +rx_padding: + help: "[0, 1]\n\tPartial frames padding enable in the receiver. Default: enabled. Disabling is fastest." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getPartialFramesPadding + PUT: + function: setPartialFramesPadding + input_types: [ bool ] + +rx_udpsocksize: + help: "[n_size]\n\tUDP socket buffer size in receiver. Tune rmem_default and rmem_max accordingly. Max value is INT_MAX/2." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxUDPSocketBufferSize + PUT: + function: setRxUDPSocketBufferSize + +rx_lock: + help: "[0, 1]\n\tLock receiver to one client IP, 1 locks, 0 unlocks. Default is unlocked." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxLock + PUT: + function: setRxLock + input_types: [ bool ] + +rx_arping: + help: "[0, 1]\n\tStarts a thread in slsReceiver to arping the interface it is listening to every minute. Useful in 10G mode." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxArping + PUT: + function: setRxArping + input_types: [ bool ] + +fformat: + help: "[binary|hdf5]\n\tFile format of data file. For HDF5, package must be compiled with HDF5 flags. Default is binary." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getFileFormat + PUT: + function: setFileFormat + input_types: [ defs::fileFormat ] + +findex: + help: "[n_value]\n\tFile or Acquisition index." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getAcquisitionIndex + PUT: + function: setAcquisitionIndex + input_types: [ uint64_t ] + +fwrite: + help: "[0, 1]\n\tEnable or disable receiver file write. Default is 1." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getFileWrite + PUT: + function: setFileWrite + input_types: [ bool ] + +foverwrite: + help: "[0, 1]\n\tEnable or disable file overwriting. Default is 1." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getFileOverWrite + PUT: + function: setFileOverWrite + input_types: [ bool ] + +rx_framesperfile: + help: "[n_frames]\n\tNumber of frames per file in receiver in an acquisition. Default depends on detector type. 0 is infinite or all frames in single file." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getFramesPerFile + PUT: + function: setFramesPerFile + +rx_zmqstream: + help: "[0, 1]\n\tEnable/ disable data streaming from receiver via zmq (eg. to GUI or to another process for further processing). This creates/ destroys zmq streamer threads in receiver. \n\tSwitching to Gui automatically enables data streaming in receiver. \n\tSwitching back to command line acquire will require disabling data streaming in receiver for fast applications. " + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxZmqDataStream + PUT: + function: setRxZmqDataStream + input_types: [ bool ] + +rx_zmqfreq: + help: "[nth frame]\n\tFrequency of frames streamed out from receiver via zmq\n\tDefault: 1, Means every frame is streamed out. \n\tIf 2, every second frame is streamed out. \n\tIf 0, streaming timer is the timeout, after which current frame is sent out. (default timeout is 500 ms). Usually used for gui purposes." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxZmqFrequency + PUT: + function: setRxZmqFrequency + +rx_zmqstartfnum: + help: "[fnum]\n\tThe starting frame index to stream out. 0 by default, which streams the first frame in an acquisition, and then depending on the rx zmq frequency/ timer" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxZmqStartingFrame + PUT: + function: setRxZmqStartingFrame + +rx_zmqip: + help: "[x.x.x.x]\n\tZmq Ip Address from which data is to be streamed out of the receiver. Also restarts receiver zmq streaming if enabled. Default is from rx_hostname. Modified only when using an intermediate process between receiver." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxZmqIP + PUT: + function: setRxZmqIP + input_types: [ IpAddr ] + input: [ 'IpAddr(args[0])' ] + cast_input: [ false ] + +zmqip: + help: "[x.x.x.x]\n\tIp Address to listen to zmq data streamed out from receiver or intermediate process. Default connects to receiver zmq Ip Address (from rx_hostname). Modified only when using an intermediate process between receiver and client(gui). Also restarts client zmq streaming if enabled." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getClientZmqIp + PUT: + function: setClientZmqIp + input_types: [ IpAddr ] + input: [ 'IpAddr(args[0])' ] + cast_input: [ false ] + +overflow: + help: "[0, 1]\n\t[Eiger] Enable or disable show overflow flag in 32 bit mode. Default is disabled." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getOverFlowMode + PUT: + function: setOverFlowMode + input_types: [ bool ] + +interruptsubframe: + help: "[0, 1]\n\t[Eiger] 1 interrupts last subframe at required exposure time. 0 will wait for last sub frame to finish exposing. 0 is default." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getInterruptSubframe + PUT: + function: setInterruptSubframe + input_types: [ bool ] + +activate: + help: "[0, 1] \n\t[Eiger] 1 is default. 0 deactivates readout and does not send data." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getActive + PUT: + function: setActive + input_types: [ bool ] + +partialreset: + help: "[0, 1]\n\t[Eiger] Sets up detector to do partial or complete reset at start of acquisition. 0 complete reset, 1 partial reset. Default is complete reset. Advanced function!" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getPartialReset + PUT: + function: setPartialReset + input_types: [ bool ] + +top: + help: "[0, 1]\n\t[Eiger] Sets half module to top (1), else bottom." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getTop + PUT: + function: setTop + input_types: [ bool ] + +temp_threshold: + help: "[n_temp (in degrees)]\n\t[Jungfrau][Moench] Threshold temperature in degrees. If temperature crosses threshold temperature and temperature control is enabled, power to chip will be switched off and temperature event occurs. To power on chip again, temperature has to be less than threshold temperature and temperature event has to be cleared." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getThresholdTemperature + PUT: + function: setThresholdTemperature + +temp_control: + help: "[0, 1]\n\t[Jungfrau][Moench] Temperature control enable. Default is 0 (disabled). If temperature crosses threshold temperature and temperature control is enabled, power to chip will be switched off and temperature event occurs. To power on chip again, temperature has to be less than threshold temperature and temperature event has to be cleared." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getTemperatureControl + PUT: + function: setTemperatureControl + input_types: [ bool ] + +autocompdisable: + help: "[0, 1]\n\t[Jungfrau] Auto comparator disable mode. By default, the on-chip gain switching is active during the entire exposure.This mode disables the on - chip gain switching comparator automatically after 93.75% (only for chipv1.0) of exposure time (only for longer than 100us). It is possible to set the duration for chipv1.1 using compdisabletime command.\n\tDefault is 0 or this mode disabled(comparator enabled throughout). 1 enables mode. 0 disables mode. " + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getAutoComparatorDisable + PUT: + function: setAutoComparatorDisable + input_types: [ bool ] + +storagecell_start: + help: "[0-max]\n\t[Jungfrau] Storage cell that stores the first acquisition of the series. max is 15 (default) for chipv1.0 and 3 (default) for chipv1.1. For advanced users only." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getStorageCellStart + PUT: + function: setStorageCellStart + +gainmode: + help: "[dynamicgain|forceswitchg1|forceswitchg2|fixg1|fixg2|fixg0]\n\t[Jungfrau] Gain mode.\n\tCAUTION: Do not use fixg0 without caution, you can damage the detector!!!" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getGainMode + PUT: + function: setGainMode + input_types: [ defs::gainMode ] + +filtercells: + help: "[0-12]\n\t[Jungfrau] Set Filter Cell. Only for chipv1.1. Advanced user Command" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getNumberOfFilterCells + PUT: + function: setNumberOfFilterCells + +cdsgain: + help: "[0, 1]\n\t[Gotthard2] Enable or disable CDS gain. Default is disabled." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getCDSGain + PUT: + function: setCDSGain + input_types: [ bool ] + +timingsource: + help: "[internal|external]\n\t[Gotthard2] Timing source. Internal is crystal and external is system timing. Default is internal." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getTimingSource + PUT: + function: setTimingSource + input_types: [ defs::timingSourceType ] + +veto: + help: "[0, 1]\n\t[Gotthard2] Enable or disable veto data data from chip. Default is 0." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getVeto + PUT: + function: setVeto + input_types: [ bool ] + +gates: + help: "[n_gates]\n\t[Mythen3] Number of external gates in gating or trigger_gating mode (external gating)." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getNumberOfGates + PUT: + function: setNumberOfGates + +polarity: + help: "[pos|neg]\n\t[Mythen3] Sets negative or positive polarity. Default is positive" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getPolarity + PUT: + function: setPolarity + input_types: [ defs::polarity ] + +interpolation: + help: "[0, 1]\n\t[Mythen3] Enables or disables interpolation. Default is disabled. Interpolation mode enables all counters and disables vth3. Disabling sets back counter mask and vth3." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getInterpolation + PUT: + function: setInterpolation + input_types: [ bool ] + +pumpprobe: + help: "[0, 1]\n\t[Mythen3] Enables or disables pump probe mode. Default is disabled. Pump probe mode only enables vth2. Disabling sets back to previous value." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getPumpProbe + PUT: + function: setPumpProbe + input_types: [ bool ] + +apulse: + help: "[0, 1]\n\t[Mythen3] Enables or disables analog pulsing. Default is disabled" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getAnalogPulsing + PUT: + function: setAnalogPulsing + input_types: [ bool ] + +dpulse: + help: "[0, 1]\n\t[Mythen3] Enables or disables digital pulsing. Default is disabled" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getDigitalPulsing + PUT: + function: setDigitalPulsing + input_types: [ bool ] + +asamples: + help: "[n_samples]\n\t[CTB] Number of analog samples expected." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getNumberOfAnalogSamples + PUT: + function: setNumberOfAnalogSamples + +adcclk: + help: "[n_clk in MHz]\n\t[Ctb] ADC clock frequency in MHz." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getADCClock + PUT: + function: setADCClock + +runclk: + help: "[n_clk in MHz]\n\t[Ctb] Run clock in MHz." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRUNClock + PUT: + function: setRUNClock + +dsamples: + help: "[n_value]\n\t[CTB] Number of digital samples expected." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getNumberOfDigitalSamples + PUT: + function: setNumberOfDigitalSamples + +tsamples: + help: "[n_value]\n\t[CTB] Number of transceiver samples expected." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getNumberOfTransceiverSamples + PUT: + function: setNumberOfTransceiverSamples + +romode: + help: "[analog|digital|analog_digital|transceiver|digital_transceiver]\n\t[CTB] Readout mode. Default is analog." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getReadoutMode + PUT: + function: setReadoutMode + input_types: [ defs::readoutMode ] + +dbitclk: + help: "[n_clk in MHz]\n\t[Ctb] Clock for latching the digital bits in MHz." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getDBITClock + PUT: + function: setDBITClock + +extsampling: + help: "[0, 1]\n\t[Ctb] Enable for external sampling signal for digital data to signal by extsampling src command. For advanced users only." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getExternalSampling + PUT: + function: setExternalSampling + input_types: [ bool ] + +extsamplingsrc: + help: "[0-63]\n\t[Ctb] Sampling source signal for digital data. For advanced users only." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getExternalSamplingSource + PUT: + function: setExternalSamplingSource + +rx_dbitoffset: + help: "[n_bytes]\n\t[Ctb] Offset in bytes in digital data to skip in receiver." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getRxDbitOffset + PUT: + function: setRxDbitOffset + +led: + help: "[0, 1]\n\t[Ctb] Switches on/off all LEDs." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getLEDEnable + PUT: + function: setLEDEnable + input_types: [ bool ] + +adcpipeline: + help: "[n_value]\n\t[Ctb][Moench] Pipeline for ADC clock." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getADCPipeline + PUT: + function: setADCPipeline + +updatemode: + help: "[0|1]\n\tRestart the detector server in update mode or not. This is useful when server-firmware compatibility is at its worst and server cannot start up normally" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getUpdateMode + PUT: + function: setUpdateMode + +port: + help: "[n]\n\tPort number of the control server on detector for detector-client tcp interface. Default is 1952. Normally unchanged. Set different ports for virtual servers on same pc." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getControlPort + PUT: + input_types: [ uint16_t ] + function: setControlPort + +stopport: + help: "[n]\n\tPort number of the stop server on detector for detector-client tcp interface. Default is 1953. Normally unchanged." + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getStopPort + PUT: + input_types: [ uint16_t ] + function: setStopPort + +lock: + help: "[0, 1]\n\tLock detector to one IP, 1: locks. Default is unlocked" + inherit_actions: INTEGER_COMMAND_VEC_ID + actions: + GET: + function: getDetectorLock + PUT: + function: setDetectorLock + input_types: [ bool ] + +################# INTEGER_COMMAND_VEC_ID_GET ################# + +master: + inherit_actions: INTEGER_COMMAND_VEC_ID_GET + help: "[0, 1]\n\t[Eiger][Gotthard2][Jungfrau][Moench] Sets (half) module to master and other(s) to slaves.\n\t[Gotthard][Gotthard2][Mythen3][Eiger][Jungfrau][Moench] Gets if the current (half) module is master." + actions: + GET: + function: getMaster + PUT: + function: setMaster + input_types: [ bool ] + +udp_dstport: + inherit_actions: INTEGER_COMMAND_VEC_ID_GET + help: "[n]\n\tPort number of the receiver (destination) udp interface. Default is 50001. \n\tIf multi command, ports for each module is calculated (incremented by 1 if no 2nd interface)" + actions: + GET: + function: getDestinationUDPPort + PUT: + input_types: [ uint16_t ] + function: setDestinationUDPPort + +udp_dstport2: + inherit_actions: INTEGER_COMMAND_VEC_ID_GET + help: "[n]\n\t[Jungfrau][Moench][Eiger][Gotthard2] Port number of the receiver (destination) udp interface 2. Default is 50002. \n\tIf multi command, ports for each module is calculated (incremented by 2) \n\t[Jungfrau][Moench] top half or inner interface \n\t[Eiger] right half \n\t[Gotthard2] veto debugging" + actions: + GET: + function: getDestinationUDPPort2 + PUT: + input_types: [ uint16_t ] + function: setDestinationUDPPort2 + +rx_tcpport: + help: "[port]\n\tTCP port for client-receiver communication. Default is 1954. Must be different if multiple receivers on same pc. Must be first command to set a receiver parameter. Multi command will automatically increment for individual modules." + inherit_actions: INTEGER_COMMAND_VEC_ID_GET + actions: + GET: + function: getRxPort + PUT: + input_types: [ uint16_t ] + function: setRxPort + +rx_zmqport: + help: "[port]\n\tZmq port for data to be streamed out of the receiver. Also restarts receiver zmq streaming if enabled. Default is 30001. Modified only when using an intermediate process between receiver and client(gui). Must be different for every detector (and udp port). Multi command will automatically increment for individual modules." + inherit_actions: INTEGER_COMMAND_VEC_ID_GET + actions: + GET: + function: getRxZmqPort + PUT: + input_types: [ uint16_t ] + function: setRxZmqPort + +zmqport: + help: "[port]\n\tZmq port in client(gui) or intermediate process for data to be streamed to from receiver. Default connects to receiver zmq streaming out port (30001). Modified only when using an intermediate process between receiver and client(gui). Also restarts client zmq streaming if enabled. Must be different for every detector (and udp port). Multi command will automatically increment for individual modules." + inherit_actions: INTEGER_COMMAND_VEC_ID_GET + actions: + GET: + function: getClientZmqPort + PUT: + input_types: [ uint16_t ] + function: setClientZmqPort + +################# INTEGER_COMMAND_SET_NOID_GET_ID ############ +sync: + inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID + help: "[0, 1]\n\t[Jungfrau][Moench] Enables or disables synchronization between modules. Sync mode requires at least one master configured. Also requires flatband cabling between master and slave with termination board." + actions: + GET: + function: getSynchronization + PUT: + function: setSynchronization + input_types: [ bool ] + +frames: + inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID + help: "[n_frames]\n\tNumber of frames per acquisition. In trigger mode, number of frames per trigger. \n\tCannot be set in modular level. \n\tIn scan mode, number of frames is set to number of steps.\n\t[Gotthard2] Burst mode has a maximum of 2720 frames." + actions: + GET: + function: getNumberOfFrames + PUT: + function: setNumberOfFrames + input_types: [ int64_t ] + +triggers: + inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID + help: "[n_triggers]\n\tNumber of triggers per aquire. Set timing mode to use triggers." + actions: + GET: + function: getNumberOfTriggers + PUT: + function: setNumberOfTriggers + input_types: [ int64_t ] + +dr: + inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID + help: "[value]\n\tDynamic Range or number of bits per pixel in detector.\n\t[Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets clkdivider to 2, else to 0.\n\t[Mythen3] Options: 8, 16, 32\n\t[Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16" + actions: + GET: + function: getDynamicRange + PUT: + function: setDynamicRange + +rx_zmqhwm: + inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID + help: "[n_value]\n\tReceiver's zmq send high water mark. Default is the zmq library's default (1000). This is a high number and can be set to 2 for gui purposes. One must also set the client's receive high water mark to similar value. Final effect is sum of them. Also restarts receiver zmq streaming if enabled. Can set to -1 to set default value." + actions: + GET: + function: getRxZmqHwm + PUT: + function: setRxZmqHwm + +extrastoragecells: + inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID + help: "[0-15]\n\t[Jungfrau] Only for chipv1.0. Number of additional storage cells. Default is 0. For advanced users only. \n\tThe #images = #frames x #triggers x (#extrastoragecells + 1)." + actions: + GET: + function: getNumberOfAdditionalStorageCells + PUT: + function: setNumberOfAdditionalStorageCells + +bursts: + inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID + help: "[n_bursts]\n\t[Gotthard2] Number of bursts per aquire. Only in auto timing mode and burst mode. Use timing command to set timing mode and burstmode command to set burst mode." + actions: + GET: + function: getNumberOfBursts + PUT: + function: setNumberOfBursts + input_types: [ int64_t ] + +################# INTEGER_COMMAND_NOID ####################### +fmaster: + inherit_actions: INTEGER_COMMAND_NOID + help: "[0, 1]\n\tEnable or disable receiver master file. Default is 1." + actions: + GET: + function: getMasterFileWrite + PUT: + function: setMasterFileWrite + input_types: [ bool ] + +################# INTEGER_IND_COMMAND ####################### +v_limit: + inherit_actions: INTEGER_IND_COMMAND + help: "[n_value]\n\t[Ctb] Soft limit for power supplies (ctb only) and DACS in mV." + actions: + GET: + function: getPower + input: [ 'defs::V_LIMIT' ] + PUT: + function: setPower + input: [ 'defs::V_LIMIT', 'args[0]' ] + +v_a: + inherit_actions: INTEGER_IND_COMMAND + help: "[n_value]\n\t[Ctb] Power supply a in mV." + actions: + GET: + function: getPower + input: [ 'defs::V_POWER_A' ] + PUT: + function: setPower + input: [ 'defs::V_POWER_A', 'args[0]' ] + +v_b: + inherit_actions: INTEGER_IND_COMMAND + help: "[n_value]\n\t[Ctb] Power supply b in mV." + actions: + GET: + function: getPower + input: [ 'defs::V_POWER_B' ] + PUT: + function: setPower + input: [ 'defs::V_POWER_B', 'args[0]' ] + +v_c: + inherit_actions: INTEGER_IND_COMMAND + help: "[n_value]\n\t[Ctb] Power supply c in mV." + actions: + GET: + function: getPower + input: [ 'defs::V_POWER_C' ] + PUT: + function: setPower + input: [ 'defs::V_POWER_C', 'args[0]' ] + +v_d: + inherit_actions: INTEGER_IND_COMMAND + help: "[n_value]\n\t[Ctb] Power supply d in mV." + actions: + GET: + function: getPower + input: [ 'defs::V_POWER_D' ] + PUT: + function: setPower + input: [ 'defs::V_POWER_D', 'args[0]' ] + +v_io: + inherit_actions: INTEGER_IND_COMMAND + help: "[n_value]\n\t[Ctb] Power supply io in mV. Minimum 1200 mV. Must be the first power regulator to be set after fpga reset (on-board detector server start up)." + actions: + GET: + function: getPower + input: [ 'defs::V_POWER_IO' ] + PUT: + function: setPower + input: [ 'defs::V_POWER_IO', 'args[0]' ] + +v_chip: + inherit_actions: INTEGER_IND_COMMAND + help: "[n_value]\n\t[Ctb] Power supply chip in mV. Do not use it unless you are completely sure you will not fry the board." + actions: + GET: + function: getPower + input: [ 'defs::V_POWER_CHIP' ] + PUT: + function: setPower + input: [ 'defs::V_POWER_CHIP', 'args[0]' ] + +################# INTEGER_USER_IND_COMMAND ################### +vchip_comp_fe: + inherit_actions: INTEGER_USER_IND_COMMAND + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for comparator current of analogue front end." + actions: + GET: + function: getOnChipDAC + input: [ 'defs::VB_COMP_FE', 'args[0]' ] + PUT: + function: setOnChipDAC + input: [ 'defs::VB_COMP_FE', 'args[0]', 'args[1]' ] + +vchip_opa_1st: + inherit_actions: INTEGER_USER_IND_COMMAND + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for opa current for driving the other DACs in chip." + actions: + GET: + function: getOnChipDAC + input: [ 'defs::VB_OPA_1ST', 'args[0]' ] + PUT: + function: setOnChipDAC + input: [ 'defs::VB_OPA_1ST', 'args[0]', 'args[1]' ] + +vchip_opa_fd: + inherit_actions: INTEGER_USER_IND_COMMAND + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac current for CDS opa stage." + actions: + GET: + function: getOnChipDAC + input: [ 'defs::VB_OPA_FD', 'args[0]' ] + PUT: + function: setOnChipDAC + input: [ 'defs::VB_OPA_FD', 'args[0]', 'args[1]' ] + +vchip_comp_adc: + inherit_actions: INTEGER_USER_IND_COMMAND + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for comparator current of ADC." + actions: + GET: + function: getOnChipDAC + input: [ 'defs::VB_COMP_ADC', 'args[0]' ] + PUT: + function: setOnChipDAC + input: [ 'defs::VB_COMP_ADC', 'args[0]', 'args[1]' ] + +vchip_ref_comp_fe: + inherit_actions: INTEGER_USER_IND_COMMAND + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for reference voltage of the comparator of analogue front end." + actions: + GET: + function: getOnChipDAC + input: [ 'defs::VREF_COMP_FE', 'args[0]' ] + PUT: + function: setOnChipDAC + input: [ 'defs::VREF_COMP_FE', 'args[0]', 'args[1]' ] + +vchip_cs: + inherit_actions: INTEGER_USER_IND_COMMAND + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac for current injection into preamplifier." + actions: + GET: + function: getOnChipDAC + input: [ 'defs::VB_CS', 'args[0]' ] + PUT: + function: setOnChipDAC + input: [ 'defs::VB_CS', 'args[0]', 'args[1]' ] + +################# EXECUTE_SET_COMMAND_NOID ####################### +clearbusy: + inherit_actions: EXECUTE_SET_COMMAND_NOID + help: "\n\tIf acquisition aborted during acquire command, use this to clear acquiring flag in shared memory before starting next acquisition" + actions: + PUT: + function: clearAcquiringFlag + +rx_start: + inherit_actions: EXECUTE_SET_COMMAND_NOID + help: "\n\tStarts receiver listener for detector data packets and create a data file (if file write enabled)." + actions: + PUT: + function: startReceiver + +rx_stop: + inherit_actions: EXECUTE_SET_COMMAND_NOID + help: "\n\tStops receiver listener for detector data packets and closes current data file (if file write enabled)." + actions: + PUT: + function: stopReceiver + +readout: + inherit_actions: EXECUTE_SET_COMMAND_NOID + help: "\n\t[Mythen3] Starts detector readout. Status changes to TRANSMITTING and automatically returns to idle at the end of readout." + actions: + PUT: + function: startDetectorReadout + +rx_clearroi: + inherit_actions: EXECUTE_SET_COMMAND_NOID + help: "Resets Region of interest in receiver. Default is all channels/pixels enabled." + actions: + PUT: + function: clearRxROI + +################# EXECUTE_SET_COMMAND ######################## +start: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\tStarts detector acquisition. Status changes to RUNNING or WAITING and automatically returns to idle at the end of acquisition. If the acquisition was abruptly stopped, some detectors come back to STOPPED." + actions: + PUT: + function: startDetector + +stop: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\tAbort detector acquisition. Status changes to IDLE or STOPPED. Goes to stop server." + actions: + PUT: + function: stopDetector + +udp_cleardst: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\tClears udp destination details on the detector." + actions: + PUT: + function: clearUDPDestinations + +udp_reconfigure: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\tReconfigures Detector with UDP destination. More for debugging as the configuration is done automatically when the detector has sufficient UDP details." + actions: + PUT: + function: reconfigureUDPDestination + +udp_validate: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\tValidates that UDP configuration in the detector is valid. If not configured, it will throw with error message requesting missing udp information." + actions: + PUT: + function: validateUDPConfiguration + +clearroi: + inherit_actions: EXECUTE_SET_COMMAND + help: "[Gotthard] Resets Region of interest in detector. All channels enabled. Default is all channels enabled." + actions: + PUT: + function: clearROI + +defaultpattern: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\t[Mythen3] Loads and runs default pattern in pattern generator. It is to go back to initial settings." + actions: + PUT: + function: loadDefaultPattern + +patternstart: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\t[Mythen3] Starts Pattern" + actions: + PUT: + function: startPattern + +resetfpga: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\t[Jungfrau][Moench][Ctb] Reset FPGA." + actions: + PUT: + function: resetFPGA + +rebootcontroller: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\t[Jungfrau][Moench][Ctb][Gotthard][Mythen3][Gotthard2] Reboot controller of detector." + actions: + PUT: + function: rebootController + +firmwaretest: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Firmware test, ie. reads a read fixed pattern from a register." + actions: + PUT: + function: executeFirmwareTest + +bustest: + inherit_actions: EXECUTE_SET_COMMAND + help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Bus test, ie. Writes different values in a R/W register and confirms the writes to check bus.\n\tAdvanced User function!" + actions: + PUT: + function: executeBusTest + +################# EXECUTE_SET_COMMAND_NOID_1ARG ############## +config: + inherit_actions: EXECUTE_SET_COMMAND_NOID_1ARG + help: "\n\tFrees shared memory before loading configuration file. Set up once." + actions: + PUT: + function: loadConfig + +parameters: + inherit_actions: EXECUTE_SET_COMMAND_NOID_1ARG + help: "\n\tSets detector measurement parameters to those contained in fname. Set up per measurement." + actions: + PUT: + function: loadParameters + +savepattern: + inherit_actions: EXECUTE_SET_COMMAND_NOID_1ARG + help: "\n\t[Ctb][Mythen3] Saves pattern to file (ascii). \n\t[Ctb] Also executes pattern." + actions: + PUT: + function: savePattern + +################# GET_COMMAND ################################ +detectorserverversion: + inherit_actions: GET_COMMAND + help: "\n\tOn-board detector server software version" + actions: + GET: + function: getDetectorServerVersion + +hardwareversion: + inherit_actions: GET_COMMAND + help: "\n\t[Jungfrau][Gotthard2][Myhten3][Gotthard][Ctb][Moench] Hardware version of detector. \n\t[Eiger] Hardware version of front FPGA on detector." + actions: + GET: + function: getHardwareVersion + +kernelversion: + inherit_actions: GET_COMMAND + help: "\n\tGet kernel version on the detector including time and date." + actions: + GET: + function: getKernelVersion + +rx_version: + inherit_actions: GET_COMMAND + help: "\n\tReceiver version" + actions: + GET: + function: getReceiverVersion + +moduleid: + inherit_actions: GET_COMMAND + help: "\n\t[Gotthard2][Eiger][Mythen3][Jungfrau][Moench] 16 bit value (ideally unique) that is streamed out in the UDP header of the detector. Picked up from a file on the module." + actions: + GET: + function: getModuleId + +type: + inherit_actions: GET_COMMAND + help: "\n\tReturns detector type. Can be Eiger, Jungfrau, Gotthard, Moench, Mythen3, Gotthard2, ChipTestBoard" + actions: + GET: + function: getDetectorType + +framesl: + inherit_actions: GET_COMMAND + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames left in acquisition. \n\t[Gotthard2] only in continuous auto mode." + actions: + GET: + function: getNumberOfFramesLeft + +triggersl: + inherit_actions: GET_COMMAND + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of triggers left in acquisition. Only when external trigger used." + actions: + GET: + function: getNumberOfTriggersLeft + +maxadcphaseshift: + inherit_actions: GET_COMMAND + help: "\n\t[Jungfrau][Moench][CTB] Absolute maximum Phase shift of ADC clock." + actions: + GET: + function: getMaxADCPhaseShift + +maxdbitphaseshift: + inherit_actions: GET_COMMAND + help: "\n\t[CTB][Jungfrau] Absolute maximum Phase shift of of the clock to latch digital bits." + actions: + GET: + function: getMaxDBITPhaseShift + +rx_framescaught: + inherit_actions: GET_COMMAND + help: "\n\tNumber of frames caught by each port in receiver." + actions: + GET: + function: getFramesCaught + +rx_missingpackets: + inherit_actions: GET_COMMAND + help: "\n\tNumber of missing packets for receiver. If negative, they are packets in excess." + actions: + GET: + function: getNumMissingPackets + +rx_frameindex: + inherit_actions: GET_COMMAND + help: "\n\tCurrent frame index received for each port in receiver during acquisition." + actions: + GET: + function: getRxCurrentFrameIndex + +scanerrmsg: + inherit_actions: GET_COMMAND + help: "\n\tGets Scan error message if scan ended in error for non blocking acquisitions." + actions: + GET: + function: getScanErrorMessage + +udp_numdst: + inherit_actions: GET_COMMAND + help: "\n\t[Jungfrau][Moench][Eiger][Mythen3][Gotthard2] One can enter upto 32 (64 for Mythen3) destinations that the detector will stream images out in a round robin fashion. This is get only command. Default: 1" + actions: + GET: + function: getNumberofUDPDestinations + +rx_printconfig: + inherit_actions: GET_COMMAND + help: "\n\tPrints the receiver configuration." + actions: + GET: + function: printRxConfiguration + +rx_realudpsocksize: + inherit_actions: GET_COMMAND + help: "\n\tActual udp socket buffer size. Double the size of rx_udpsocksize due to kernel bookkeeping." + actions: + GET: + function: getRxRealUDPSocketBufferSize + +rx_lastclient: + inherit_actions: GET_COMMAND + help: "\n\tClient IP Address that last communicated with the receiver." + actions: + GET: + function: getRxLastClientIP + +rx_threads: + inherit_actions: GET_COMMAND + help: "\n\tGet kernel thread ids from the receiver in order of [parent, tcp, listener 0, processor 0, streamer 0, listener 1, processor 1, streamer 1, arping]. If no streamer yet or there is no second interface, it gives 0 in its place." + actions: + GET: + function: getRxThreadIds + +chipversion: + inherit_actions: GET_COMMAND + help: "\n\t[Jungfrau] Returns chip version. Can be 1.0 or 1.1" + actions: + GET: + function: getChipVersion + +burstsl: + inherit_actions: GET_COMMAND + help: "\n\t[Gotthard2] Number of bursts left in acquisition. Only in burst auto mode." + actions: + GET: + function: getNumberOfBurstsLeft + +syncclk: + inherit_actions: GET_COMMAND + help: "[n_clk in MHz]\n\t[Ctb] Sync clock in MHz." + actions: + GET: + function: getSYNCClock + +patfname: + inherit_actions: GET_COMMAND + help: "\n\t[Ctb][Mythen3] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default file" + actions: + GET: + function: getPatterFileName + +lastclient: + inherit_actions: GET_COMMAND + help: "\n\tClient IP Address that last communicated with the detector." + actions: + GET: + function: getLastClientIP + +framecounter: + inherit_actions: GET_COMMAND + help: "\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames from start run control.\n\t[Gotthard2] only in continuous mode." + actions: + GET: + function: getNumberOfFramesFromStart + +################# GET_COMMAND_HEX ############################ +serialnumber: + inherit_actions: GET_COMMAND + help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][CTB]\nSerial number of detector." + actions: + GET: + function: getSerialNumber + output: [ "OutStringHex(t)" ] + +################# GET_COMMAND_NOID ########################### +nmod: + inherit_actions: GET_COMMAND_NOID + help: "\n\tNumber of modules in shared memory." + actions: + GET: + function: size + +settingslist: + inherit_actions: GET_COMMAND_NOID + help: "\n\tList of settings implemented for this detector." + actions: + GET: + function: getSettingsList + +drlist: + inherit_actions: GET_COMMAND_NOID + help: "\n\tGets the list of dynamic ranges for this detector." + actions: + GET: + function: getDynamicRangeList + +timinglist: + inherit_actions: GET_COMMAND_NOID + help: "\n\tGets the list of timing modes for this detector." + actions: + GET: + function: getTimingModeList + +readoutspeedlist: + inherit_actions: GET_COMMAND_NOID + help: "\n\tList of readout speed levels implemented for this detector." + actions: + GET: + function: getReadoutSpeedList + +templist: + inherit_actions: GET_COMMAND_NOID + help: "\n\tList of temperature commands implemented for this detector." + actions: + GET: + function: getTemperatureList + +################# GET_IND_COMMAND ############################ +temp_adc: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Jungfrau][Moench][Gotthard] ADC Temperature" + actions: + GET: + function: getTemperature + input: [ 'defs::TEMPERATURE_ADC' ] + output: [ OutString(t), '" °C"' ] + +temp_fpga: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Eiger][Jungfrau][Moench][Gotthard][Mythen3][Gotthard2] FPGA Temperature" + actions: + GET: + function: getTemperature + input: [ 'defs::TEMPERATURE_FPGA' ] + output: [ OutString(t), '" °C"' ] + +temp_fpgaext: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Eiger]Temperature close to the FPGA" + actions: + GET: + function: getTemperature + input: [ 'defs::TEMPERATURE_FPGAEXT' ] + output: [ OutString(t), '" °C"' ] + +temp_10ge: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Eiger]Temperature close to the 10GbE" + actions: + GET: + function: getTemperature + input: [ 'defs::TEMPERATURE_10GE' ] + output: [ OutString(t), '" °C"' ] + +temp_dcdc: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Eiger]Temperature close to the dc dc converter" + actions: + GET: + function: getTemperature + input: [ 'defs::TEMPERATURE_DCDC' ] + output: [ OutString(t), '" °C"' ] + +temp_sodl: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Eiger]Temperature close to the left so-dimm memory" + actions: + GET: + function: getTemperature + input: [ 'defs::TEMPERATURE_SODL' ] + output: [ OutString(t), '" °C"' ] + +temp_sodr: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Eiger]Temperature close to the right so-dimm memory" + actions: + GET: + function: getTemperature + input: [ 'defs::TEMPERATURE_SODR' ] + output: [ OutString(t), '" °C"' ] + +temp_fpgafl: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Eiger]Temperature of the left front end board fpga." + actions: + GET: + function: getTemperature + input: [ 'defs::TEMPERATURE_FPGA2' ] + output: [ OutString(t), '" °C"' ] + +temp_fpgafr: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Eiger]Temperature of the right front end board fpga." + actions: + GET: + function: getTemperature + input: [ 'defs::TEMPERATURE_FPGA3' ] + output: [ OutString(t), '" °C"' ] + +temp_slowadc: + inherit_actions: GET_IND_COMMAND + help: "[n_value]\n\t[Ctb]Temperature of the slow adc" + actions: + GET: + function: getTemperature + input: [ 'defs::SLOW_ADC_TEMP' ] + output: [ OutString(t), '" °C"' ] + +vm_a: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured voltage of power supply a in mV." + actions: + GET: + function: getMeasuredPower + input: [ 'defs::V_POWER_A' ] + +vm_b: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured voltage of power supply b in mV." + actions: + GET: + function: getMeasuredPower + input: [ 'defs::V_POWER_B' ] + +vm_c: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured voltage of power supply c in mV." + actions: + GET: + function: getMeasuredPower + input: [ 'defs::V_POWER_C' ] + +vm_d: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured voltage of power supply d in mV." + actions: + GET: + function: getMeasuredPower + input: [ 'defs::V_POWER_D' ] + +vm_io: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured voltage of power supply io in mV." + actions: + GET: + function: getMeasuredPower + input: [ 'defs::V_POWER_IO' ] + +im_a: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured current of power supply a in mA." + actions: + GET: + function: getMeasuredCurrent + input: [ 'defs::I_POWER_A' ] + +im_b: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured current of power supply b in mA." + actions: + GET: + function: getMeasuredCurrent + input: [ 'defs::I_POWER_B' ] + +im_c: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured current of power supply c in mA." + actions: + GET: + function: getMeasuredCurrent + input: [ 'defs::I_POWER_C' ] + +im_d: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured current of power supply d in mA." + actions: + GET: + function: getMeasuredCurrent + input: [ 'defs::I_POWER_D' ] + +im_io: + inherit_actions: GET_IND_COMMAND + help: "\n\t[Ctb] Measured current of power supply io in mA." + actions: + GET: + function: getMeasuredCurrent + input: [ 'defs::I_POWER_IO' ] + +################# CTB_NAMED_LIST ############################# +daclist: + inherit_actions: CTB_NAMED_LIST + help: "[dacname1 dacname2 .. dacname18] \n\t\t[ChipTestBoard] Set the list of dac names for this detector.\n\t\t[All] Gets the list of dac names for every dac for this detector." + actions: + GET: + function: getDacNames + PUT: + function: setDacNames + +adclist: + inherit_actions: CTB_NAMED_LIST + help: "[adcname1 adcname2 .. adcname32] \n\t\t[ChipTestBoard] Set the list of adc names for this board." + actions: + GET: + function: getAdcNames + PUT: + function: setAdcNames + +signallist: + inherit_actions: CTB_NAMED_LIST + help: "[signalname1 signalname2 .. signalname63] \n\t\t[ChipTestBoard] Set the list of signal names for this board." + actions: + GET: + function: getSignalNames + PUT: + function: setSignalNames + +powerlist: + inherit_actions: CTB_NAMED_LIST + help: "[powername1 powername2 .. powername4] \n\t\t[ChipTestBoard] Set the list of power names for this board." + actions: + GET: + function: getPowerNames + PUT: + function: setPowerNames + +slowadclist: + inherit_actions: CTB_NAMED_LIST + help: "[slowadcname1 slowadcname2 .. slowadcname7] \n\t\t[ChipTestBoard] Set the list of slowadc names for this board." + actions: + GET: + function: getSlowADCNames + PUT: + function: setSlowADCNames + +################# CTB_VALUES ################################ +powervalues: + help: "[name] \n\t\t[ChipTestBoard] Get values of all powers." + actions: + GET: + argc: 0 + ctb_output_list: + GETFCNLIST: getPowerList + GETFCNNAME: getPowerNames + GETFCN: getPower + suffix: "mV" + printable_name: "*name_it++" + +slowadcvalues: + help: "[name] \n\t\t[ChipTestBoard] Get values of all slow adcs." + actions: + GET: + argc: 0 + ctb_output_list: + GETFCNLIST: getSlowADCList + GETFCNNAME: getSlowADCNames + GETFCN: getSlowADC + suffix: "mV" + printable_name: "*name_it++" + +tempvalues: + help: "\n\tGets the values for every temperature for this detector." + actions: + GET: + argc: 0 + ctb_output_list: + GETFCNLIST: getTemperatureList + GETFCNNAME: "" + GETFCN: getTemperature + suffix: "°C" + printable_name: "*it" + +################# CTB_SINGLE_DACNAME ######################## +dacname: + inherit_actions: CTB_SINGLE_DACNAME + help: "[0-17][name] \n\t\t[ChipTestBoard] Set the dac at the given position to the given name." + actions: + GET: + function: getDacName + extra_variables: + - name: index + type: defs::dacIndex + value: defs::DAC_0 + PUT: + function: setDacName + extra_variables: + - name: index + type: defs::dacIndex + value: defs::DAC_0 + +powername: + inherit_actions: CTB_SINGLE_DACNAME + help: "[0-4][name] \n\t\t[ChipTestBoard] Set the power at the given position to the given name." + actions: + GET: + function: getPowerName + extra_variables: + - name: index + type: defs::dacIndex + value: defs::V_POWER_A + PUT: + function: setPowerName + extra_variables: + - name: index + type: defs::dacIndex + value: defs::V_POWER_A + +slowadcname: + inherit_actions: CTB_SINGLE_DACNAME + help: "[0-7][name] \n\t\t[ChipTestBoard] Set the slowadc at the given position to the given name." + actions: + GET: + function: getSlowADCName + extra_variables: + - name: index + type: defs::dacIndex + value: defs::SLOW_ADC0 + PUT: + function: setSlowADCName + extra_variables: + - name: index + type: defs::dacIndex + value: defs::SLOW_ADC0 + +################# CTB_GET_DACINDEX ########################## +dacindex: + inherit_actions: CTB_GET_DACINDEX + help: "[name] \n\t\t[ChipTestBoard] Get the dac index for the given name." + actions: + GET: + function: getDacIndex + extra_variables: + - name: index + type: defs::dacIndex + value: defs::DAC_0 + +powerindex: + inherit_actions: CTB_GET_DACINDEX + help: "[name] \n\t\t[ChipTestBoard] Get the power index for the given name." + actions: + GET: + function: getPowerIndex + extra_variables: + - name: index + type: defs::dacIndex + value: defs::V_POWER_A + +slowadcindex: + inherit_actions: CTB_GET_DACINDEX + help: "[name] \n\t\t[ChipTestBoard] Get the slowadc index for the given name." + actions: + GET: + function: getSlowADCIndex + extra_variables: + - name: index + type: defs::dacIndex + value: defs::SLOW_ADC0 + +################# CTB_SINGLE_NAME ########################### +adcname: + inherit_actions: CTB_SINGLE_NAME + help: "[0-31][name] \n\t\t[ChipTestBoard] Set the adc at the given position to the given name." + actions: + GET: + function: getAdcName + PUT: + function: setAdcName + +signalname: + inherit_actions: CTB_SINGLE_NAME + help: "[0-63][name] \n\t\t[ChipTestBoard] Set the signal at the given position to the given name." + actions: + GET: + function: getSignalName + PUT: + function: setSignalName + +################# CTB_GET_INDEX ############################# +adcindex: + inherit_actions: CTB_GET_INDEX + help: "[name] \n\t\t[ChipTestBoard] Get the adc index for the given name." + actions: + GET: + function: getAdcIndex + +signalindex: + inherit_actions: CTB_GET_INDEX + help: "[name] \n\t\t[ChipTestBoard] Get the signal index for the given name." + actions: + GET: + function: getSignalIndex + + +######################### description only commands ############################# +## code is generated for these commands +free: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: 0 + +hostname: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: -1 + arg_types: [ std::string ] + +acquire: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: 0 + +versions: + is_description: true + actions: + GET: + argc: 0 + +threshold: + is_description: true + actions: + GET: + argc: 0 + PUT: + args: + - argc: 1 + arg_types: [ int ] + - argc: 2 + arg_types: [ int, defs::detectorSettings ] + - argc: 3 + arg_types: [ int,int,int ] + - argc: 4 + arg_types: [ int ,int,int,defs::detectorSettings] + +thresholdnotb: + is_description: true + duplicate_function: true + function_alias: threshold + actions: + GET: + argc: 0 + PUT: + args: + - argc: 1 + arg_types: [ int ] + - argc: 2 + arg_types: [ int, defs::detectorSettings ] + - argc: 3 + arg_types: [ int,int,int ] + - argc: 4 + arg_types: [ int ,int,int,defs::detectorSettings ] + +trimen: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: -1 + +badchannels: + is_description: true + actions: + GET: + argc: 1 + arg_types: [ std::string ] + PUT: + argc: -1 + +udp_srcip: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: 1 + arg_types: [ std::string ] + +udp_srcip2: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: 1 + arg_types: [ std::string ] + +udp_dstip: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: 1 + arg_types: [ std::string ] + +udp_dstip2: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: 1 + arg_types: [ std::string ] + +rx_hostname: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: -1 + +rx_roi: + is_description: true + actions: + GET: + argc: 0 + PUT: + args: + - argc: 2 + arg_types: [ int, int ] + - argc: 4 + arg_types: [ int, int, int, int ] + +ratecorr: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: 1 + arg_types: [ int ] + +burstmode: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: 1 + arg_types: [ defs::burstMode ] + +vetostream: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: -1 + +counters: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: -1 + +samples: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: 1 + arg_types: [ int ] + +slowadc: + is_description: true + actions: + GET: + argc: 1 + arg_types: [ int ] + +rx_dbitlist: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: -1 + +rx_jsonaddheader: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: -1 + +execcommand: + is_description: true + actions: + PUT: + argc: -1 + +dacvalues: + is_description: true + actions: + GET: + args: + - argc: 0 + - argc: 1 + arg_types: [ special::mv ] + +currentsource: + is_description: true + actions: + GET: + argc: 0 + PUT: + args: + - argc: 1 + arg_types: [ bool ] + - argc: 3 + arg_types: [ bool, special::currentSourceFix, int ] + - argc: 4 + arg_types: [bool, special::currentSourceFix, int, special::currentSourceLow ] + +gaincaps: + is_description: true + actions: + GET: + argc: 0 + PUT: + argc: -1 + arg_types: [ defs::defs::M3_GainCaps ] + +################# special commands ########################## + +virtual: + function_alias: virtualFunction + help: "[n_servers] [starting_port_number]\n\tConnecs to n virtual server at local host starting at specific control port. Every virtual server will have a stop port (control port + 1)" + actions: + PUT: + function: setVirtualDetectorServers + argc: 2 + check_det_id: true + input: [ 'args[0]', 'args[1]' ] + input_types: [ int, uint16_t ] + cast_input: [ true, true ] + output: [ 'ToString(args)' ] + +packageversion: + help: "\n\tPackage version." + actions: + GET: + argc: 0 + function: getPackageVersion + output: [ t ] + +clientversion: + help: "\n\tClient software version" + actions: + GET: + argc: 0 + function: getClientVersion + output: [ t ] + +firmwareversion: + help: "\n\tFirmware version of detector in format [0xYYMMDD] or an increasing 2 digit number for Eiger." + actions: + GET: + argc: 0 + require_det_id: true + function: getFirmwareVersion + output: [ OutStringHex(t) ] + detectors: + EIGER: + output: [ OutString(t) ] + +detsize: + help: "[nx] [ny]\n\tDetector size, ie. Number of channels in x and y dim. This is used to calculate module coordinates included in UDP data. \n\tBy default, it adds module in y dimension for 2d detectors and in x dimension for 1d detectors packet header." + actions: + GET: + argc: 0 + function: getDetectorSize + output: [ t ] + PUT: + argc: 2 + function: setDetectorSize + input: [ 'defs::xy(StringTo(args[0]),StringTo(args[1]))' ] + input_types: [ defs::xy ] + arg_types: [int, int] + output: [ 'ToString(args)' ] + +trimbits: + infer_action: true + help: "[fname]\n\t[Eiger][Mythen3] Put will load the trimbit file to detector. If no extension specified, serial number of each module is attached. Get will save the trimbits from the detector to file with serial number added to file name." + actions: + GET: + argc: 1 + require_det_id: true + store_result_in_t: false + function: saveTrimbits + input: [ 'args[0]' ] + input_types: [ std::string ] + arg_types: [special::path] + output: [ "args[0]" ] + PUT: + argc: 1 + require_det_id: true + function: loadTrimbits + input: [ 'args[0]' ] + input_types: [ std::string ] + arg_types: [special::path] + output: [ "args[0]" ] + +gappixels: + help: "[0, 1]\n\t[Eiger][Jungfrau][Moench] Include Gap pixels in client data call back in Detecor api. Will not be in detector streaming, receiver file or streaming. Default is 0. " + actions: + GET: + argc: 0 + check_det_id: true + function: getGapPixelsinCallback + output: [ t ] + PUT: + argc: 1 + check_det_id: true + function: setGapPixelsinCallback + input: [ 'args[0]' ] + input_types: [ bool ] + cast_input: [ true ] + output: [ args.front() ] + +Exptime: + template: true + infer_action: true # infer action based on actions' argc (they must be unique if true) + actions: + GET: + require_det_id: true + function: '' + args: + - argc: 0 + output: [ OutString(t) ] + - argc: 1 + arg_types: [ special::time_unit ] + output: [ "OutString(t , args[0])" ] + PUT: + require_det_id: true + function: '' + input: [ converted_time ] + input_types: [ time::ns ] + args: + - argc: 1 + arg_types: [ std::string ] + separate_time_units: + input: 'args[0]' + output: [ converted_time, unit ] + output: [ 'args[0]' ] + - argc: 2 + arg_types: [ int, special::time_unit ] + convert_to_time: + input: [ 'args[0]', 'args[1]' ] + output: converted_time + output: [ 'args[0]', 'args[1]' ] + +exptime: + inherit_actions: Exptime + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Eiger][Jungfrau][Moench][Gotthard][Gotthard2][Ctb] Exposure time\n\t[Mythen3] Exposure time of all gate signals in auto and trigger mode (internal gating). To specify gate index, use exptime1, exptime2, exptime3." + actions: + GET: + function: getExptime + detectors: + MYTHEN3: + function: getExptimeForAllGates + PUT: + function: setExptime + +exptime1: + inherit_actions: Exptime + help: "[n_value]\n\t[Mythen3] Exposure time of gate signal 1 in auto and trigger mode (internal gating)." + actions: + GET: + extra_variables: + - name: gateIndex + type: int + value: 0 + function: getExptime + input: [ gateIndex ] + input_types: [ int ] + PUT: + extra_variables: + - name: gateIndex + type: int + value: 0 + function: setExptime + input: [ gateIndex,converted_time ] + input_types: [ int, time::ns ] + +exptime2: + inherit_actions: exptime1 + help: "[n_value]\n\t[Mythen3] Exposure time of gate signal 2 in auto and trigger mode (internal gating)." + actions: + GET: + extra_variables: + - name: gateIndex + type: int + value: 1 + PUT: + extra_variables: + - name: gateIndex + type: int + value: 1 + +exptime3: + inherit_actions: exptime1 + help: "[n_value]\n\t[Mythen3] Exposure time of gate signal 3 in auto and trigger mode (internal gating)." + actions: + GET: + extra_variables: + - name: gateIndex + type: int + value: 2 + PUT: + extra_variables: + - name: gateIndex + type: int + value: 2 + +readoutspeed: + help: "\n\t[0 or full_speed|1 or half_speed|2 or quarter_speed]\n\t[Eiger][Jungfrau][Moench] Readout speed of chip.\n\t[Eiger][Moench] Default speed is full_speed.\n\t[Jungfrau] Default speed is half_speed. full_speed option only available from v2.0 boards and is recommended to set number of interfaces to 2. Also overwrites adcphase to recommended default.\n\t [144|108]\n\t\t[Gotthard2] Readout speed of chip in MHz. Default is 108." + actions: + GET: + exceptions: + - condition: 'det->getDetectorType().squash() == defs::CHIPTESTBOARD' + message: '"ReadoutSpeed not implemented. Did you mean runclk?"' + argc: 0 + require_det_id: true + function: getReadoutSpeed + output: [ OutString(t) ] + PUT: + exceptions: + - condition: 'det->getDetectorType().squash() == defs::CHIPTESTBOARD' + message: '"ReadoutSpeed not implemented. Did you mean runclk?"' + argc: 1 + require_det_id: true + function: setReadoutSpeed + input: [ 'args[0]' ] + input_types: [ defs::speedLevel ] + cast_input: [ true ] + output: [ 'ToString(StringTo(args[0]))' ] + +adcphase: + infer_action: true + help: "[n_value] [(optional)deg]\n\t[Jungfrau][Moench][Ctb][Gotthard] Phase shift of ADC clock. \n\t[Jungfrau][Moench] Absolute phase shift. If deg used, then shift in degrees. Changing Speed also resets adcphase to recommended defaults.\n\t[Ctb] Absolute phase shift. If deg used, then shift in degrees. Changing adcclk also resets adcphase and sets it to previous values.\n\t[Gotthard] Relative phase shift. Cannot get" + actions: + GET: + require_det_id: true + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + + exceptions: + - condition: 'det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2' + message: '"adcphase not implemented for this detector"' + args: + - argc: 0 + function: getADCPhase + output: [ OutString(t) ] + - argc: 1 + exceptions: + - condition: 'det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2' + message: '"adcphase not implemented for this detector"' + - condition: 'args[0] != "deg"' + message: '"Unknown adcphase argument " + args[0] + ". Did you mean deg? "' + function: getADCPhaseInDegrees + arg_types: [ special::deg ] + output: [ OutString(t), '" deg"' ] + + PUT: + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + exceptions: + - condition: 'det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2' + message: '"adcphase not implemented for this detector"' + require_det_id: true + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + + args: + - argc: 1 + function: setADCPhase + output: [ 'args.front()' ] + - argc: 2 + arg_types: [ int, special::deg ] + exceptions: + - condition: 'det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2' + message: '"adcphase not implemented for this detector"' + - condition: 'args[1] != "deg"' + message: '"Unknown adcphase 2nd argument " + args[1] + ". Did you mean deg?"' + + function: setADCPhaseInDegrees + output: [ 'args[0]',"' '", 'args[1]' ] + +dbitphase: + help: "[n_value] [(optional)deg]\n\t[Ctb][Jungfrau] Phase shift of clock to latch digital bits. Absolute phase shift. If deg used, then shift in degrees. \n\t[Ctb]Changing dbitclk also resets dbitphase and sets to previous values." + actions: + GET: + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + + exceptions: + - condition: 'det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2 || det_type == defs::MOENCH' + message: '"dbitphase not implemented for this detector"' + require_det_id: true + args: + - argc: 0 + function: getDBITPhase + output: [ OutString(t) ] + - argc: 1 + exceptions: + - condition: 'det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2 || det_type == defs::MOENCH' + message: '"dbitphase not implemented for this detector"' + - condition: 'args[0] != "deg"' + message: '"Unknown dbitphase argument " + args[0] + ". Did you mean deg? "' + function: getDBITPhaseInDegrees + arg_types: [ special::deg ] + output: [ OutString(t), '" deg"' ] + PUT: + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + + exceptions: + - condition: 'det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2 || det_type == defs::MOENCH' + message: '"dbitphase not implemented for this detector"' + require_det_id: true + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + args: + - argc: 1 + function: setDBITPhase + output: [ 'args.front()' ] + - argc: 2 + exceptions: + - condition: 'det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2 || det_type == defs::MOENCH' + message: '"dbitphase not implemented for this detector"' + - condition: 'args[1] != "deg"' + message: '"Unknown dbitphase 2nd argument " + args[1] + ". Did you mean deg? "' + function: setDBITPhaseInDegrees + arg_types: [ int, special::deg ] + output: [ 'args[0]',"' '", 'args[1]' ] + +clkfreq: + help: "[n_clock (0-5)] [freq_in_Hz]\n\t[Gotthard2][Mythen3] Frequency of clock n_clock in Hz. Use clkdiv to set frequency." + actions: + GET: + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + exceptions: + - condition: 'type != defs::GOTTHARD2 && type != defs::MYTHEN3' + message: '"clkfreq not implemented for this detector."' + argc: 1 + require_det_id: true + function: getClockFrequency + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + output: [ OutString(t) ] + +clkphase: + help: "[n_clock (0-5)] [phase] [deg (optional)]\n\t[Gotthard2][Mythen3] Phase of clock n_clock. If deg, then phase shift in degrees, else absolute phase shift values." + actions: + GET: + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + exceptions: + - condition: 'type != defs::GOTTHARD2 && type != defs::MYTHEN3' + message: '"clkphase not implemented for this detector."' + require_det_id: true + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + output: [ OutString(t) ] + args: + - argc: 1 + function: getClockPhase + - argc: 2 + exceptions: + - condition: 'type != defs::GOTTHARD2 && type != defs::MYTHEN3' + message: '"clkphase not implemented for this detector."' + - condition: 'args[1] != "deg"' + message: '"Cannot scan argument" + args[1] + ". Did you mean deg?"' + arg_types: [ int , special::deg ] + function: getClockPhaseinDegrees + output: [ OutString(t), '" deg"' ] + PUT: + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + exceptions: + - condition: 'type != defs::GOTTHARD2 && type != defs::MYTHEN3' + message: '"clkphase not implemented for this detector."' + require_det_id: true + input: [ 'args[0]', 'args[1]' ] + input_types: [ int, int ] + cast_input: [ true, true ] + args: + - argc: 2 + function: setClockPhase + output: [ 'args[1]' ] + - argc: 3 + arg_types: [int, int , special::deg ] + + exceptions: + - condition: 'type != defs::GOTTHARD2 && type != defs::MYTHEN3' + message: '"clkphase not implemented for this detector."' + - condition: 'args[2] != "deg"' + message: '"Cannot scan argument" + args[2] + ". Did you mean deg?"' + function: setClockPhaseinDegrees + output: [ 'args[1]', '" "', 'args[2]' ] + +maxclkphaseshift: + help: "[n_clock (0-5)]\n\t[Gotthard2][Mythen3] Absolute Maximum Phase shift of clock n_clock." + actions: + GET: + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + exceptions: + - condition: 'type != defs::GOTTHARD2 && type != defs::MYTHEN3' + message: '"maxclkphaseshift not implemented for this detector."' + require_det_id: true + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + output: [ OutString(t) ] + argc: 1 + function: getMaxClockPhaseShift + +clkdiv: + help: "[n_clock (0-5)] [n_divider]\n\t[Gotthard2][Mythen3] Clock Divider of clock n_clock. Must be greater than 1." + actions: + GET: + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + exceptions: + - condition: 'type != defs::GOTTHARD2 && type != defs::MYTHEN3' + message: '"clkdiv not implemented for this detector."' + require_det_id: true + function: getClockDivider + argc: 1 + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + output: [ 'args[0]', "' '", OutString(t) ] + PUT: + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + exceptions: + - condition: 'type != defs::GOTTHARD2 && type != defs::MYTHEN3' + message: '"clkdiv not implemented for this detector."' + require_det_id: true + function: setClockDivider + argc: 2 + arg_types: [ int, int ] + input: [ 'args[0]', 'args[1]'] + input_types: [ int, int ] + cast_input: [ true, true ] + output: [ 'args[0]', "' '", 'args[1]' ] + +extsig: + help: "[n_signal] [signal_type]\n\t[Gotthard][Mythen3] External signal mode for trigger timing mode.\n\t[Gotthard] [0] [trigger_in_rising_edge|trigger_in_falling_edge]\n\t[Mythen3] [0-7] [trigger_in_rising_edge|trigger_in_falling_edge|inversion_on|inversion_off]\n\t where 0 is master input trigger signal, 1-3 is master input gate signals, 4 is busy out signal and 5-7 is master output gate signals." + actions: + GET: + argc: 1 + require_det_id: true + function: getExternalSignalFlags + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + output: [ "args[0]","' '", OutString(t) ] + PUT: + argc: 2 + require_det_id: true + function: setExternalSignalFlags + input: [ 'args[0]', 'args[1]' ] + input_types: [ int, defs::externalSignalFlag ] + cast_input: [ true, true ] + output: [ 'args[0]', "' '", 'args[1]' ] + +dac: + help: "code: return GetHelpDacWrapper(cmd, args);\n" # this is a special case + actions: + GET: + exceptions: + - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD" + message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' + extra_variables: + - name: dacIndex + type: defs::dacIndex + value: "(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0])" + function: getDAC + require_det_id: true + input_types: [ defs::dacIndex, bool ] + cast_input: [ false, true ] + args: + - argc: 1 + arg_types: [defs::dacIndex] + input: [ dacIndex, '"0"' ] + output: [ 'args[0]', "' '", OutString(t) ] + - argc: 2 + exceptions: + - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD" + message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' + - condition: 'args[1] != "mv" && args[1] != "mV"' + message: '"Unknown argument " + args[1] + ". Did you mean mV?"' + arg_types: [defs::dacIndex, special::mv] + input: [ dacIndex, '"1"' ] + output: [ 'args[0]', "' '" , OutString(t), '" mV"' ] + PUT: + exceptions: + - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD" + message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' + extra_variables: + - name: dacIndex + type: defs::dacIndex + value: "(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0])" + function: setDAC + require_det_id: true + input_types: [ defs::dacIndex, int, bool ] + cast_input: [ false, true, true ] + args: + - argc: 2 + arg_types: [defs::dacIndex, int] + input: [ dacIndex, "args[1]", '"0"' ] + output: [ "args[0]", "' '", "args[1]" ] + - argc: 3 + arg_types: [defs::dacIndex, int, special::mv] + input: [ dacIndex, "args[1]", '"1"' ] + output: [ "args[0]", "' '", "args[1]", '" mV"' ] + +resetdacs: + help: "[(optional) hard] \n\t[Eiger][Jungfrau][Moench][Gotthard][Gotthard2][Mythen3]Reset dac values to the defaults. A 'hard' optional reset will reset the dacs to the hardcoded defaults in on-board detector server." + actions: + PUT: + function: resetToDefaultDacs + require_det_id: true + input_types: [ bool ] + output: [ '"successful"' ] + args: + - argc: 1 + arg_types: [ special::hard ] + exceptions: + - condition: 'args[0] != "hard"' + message: '"Unknown argument " + args[0] + ". Did you mean hard?"' + input: [ '"1"' ] + - argc: 0 + input: [ '"0"' ] + +defaultdac: + help: "[dac name][value][(optional)setting]\n\tSets the default for that dac to this value.\n\t[Jungfrau][Moench][Mythen3] When settings is provided, it sets the default value only for that setting" + actions: + GET: + function: getDefaultDac + require_det_id: true + args: + - argc: 1 + input: [ "args[0]" ] + cast_input: [ true ] + input_types: [ defs::dacIndex ] + output: [ "args[0]", "' '", OutString(t) ] + - argc: 2 + input: [ "args[0]", "args[1]" ] + cast_input: [ true, true ] + input_types: [ defs::dacIndex, defs::detectorSettings ] + output: [ "args[0]", "' '", "args[1]", "' '", OutString(t) ] + PUT: + function: setDefaultDac + require_det_id: true + args: + - argc: 2 + cast_input: [ true, true ] + input: [ "args[0]", "args[1]" ] + input_types: [ defs::dacIndex, int ] + output: [ "args[0]", "' '", "args[1]" ] + + - argc: 3 + cast_input: [ true, true, true ] + input: [ "args[0]", "args[1]", "args[2]" ] + input_types: [ defs::dacIndex, int, defs::detectorSettings ] + output: [ "args[0]", "' '", "args[2]", "' '", "args[1]" ] + +rx_status: + help: "[running, idle, transmitting]\n\tReceiver listener status." + actions: + GET: + argc: 0 + function: getReceiverStatus + require_det_id: true + output: [ OutString(t) ] + PUT: + argc: -1 + exceptions: + - condition: 'true' + message: '"Cannot put. Did you mean to use command: \"rx_start\" or \"rx_stop\"?"' + +status: + help: "[running, error, transmitting, finished, waiting, idle]\n\tDetector status. Goes to stop server." + actions: + GET: + argc: 0 + function: getDetectorStatus + require_det_id: true + output: [ OutString(t) ] + PUT: + argc: -1 + exceptions: + - condition: 'true' + message: '"Cannot put. Did you mean to use command: \"start\" or \"stop\"?"' + + +scan: + help: "[dac_name|0|trimbits] [start_val] [stop_val] [step_size] [dac settling time ns|us|ms|s]\n\tEnables/ disables scans for dac and trimbits \n\tEnabling scan sets number of frames to number of steps in receiver. \n\tTo cancel scan configuration, set dac to '0', which also sets number of frames to 1. \n\t[Eiger][Mythen3] Use trimbits as dac name for a trimbit scan." + actions: + GET: + argc: 0 + function: getScan + require_det_id: true + output: [ OutString(t) ] + PUT: + check_det_id: true + function: setScan + output: [ ToString(args) ] + args: + - argc: 1 + exceptions: + - condition: 'StringTo(args[0]) != 0' + message: '"Unknown argument " + args[0] + ". Did you mean 0 to disable scan?"' + arg_types: [ int ] + input: [ "defs::scanParameters()" ] + input_types: [ auto ] + - argc: 4 + arg_types: [ defs::dacIndex, int, int, int ] + input: [ "defs::scanParameters(StringTo(args[0]), StringTo(args[1]), StringTo(args[2]), StringTo(args[3]))" ] + input_types: [ auto ] + - argc: 5 + arg_types: [ defs::dacIndex, int, int, int, std::string ] + separate_time_units: + input: 'args[4]' + output: [ t, unit ] + input: [ "defs::scanParameters(StringTo(args[0]), StringTo(args[1]), StringTo(args[2]), StringTo(args[3]), t)" ] + input_types: [ auto ] + +Trigger: + template: true + actions: + PUT: + check_det_id: true + argc: 0 + function: sendSoftwareTrigger + input: [ block ] + input_types: [ bool ] + cast_input: [ false ] + output: [ '"successful"' ] + +trigger: + inherit_actions: Trigger + help: "\n\t[Eiger][Mythen3][Jungfrau][Moench] Sends software trigger signal to detector" + actions: + PUT: + extra_variables: + - name: block + type: bool + value: "false" + +blockingtrigger: + inherit_actions: Trigger + help: "\n\t[Eiger][Jungfrau][Moench] Sends software trigger signal to detector and blocks till the frames are sent out for that trigger." + actions: + PUT: + extra_variables: + - name: block + type: bool + value: "true" + +udp_dstlist: + help: "[ip=x.x.x.x] [(optional)ip2=x.x.x.x] \n\t\t[mac=xx:xx:xx:xx:xx:xx] [(optional)mac2=xx:xx:xx:xx:xx:xx]\n\t\t[port=value] [(optional)port2=value]\n\t\tThe order of ip, mac and port does not matter. entry_value can be >0 only for [Eiger][Jungfrau][Moench][Mythen3][Gotthard2] where round robin is implemented. If 'auto' used, then ip is set to ip of rx_hostname." + actions: + GET: + exceptions: + - condition: "det_id == -1" + message: '"Can execute udp_dstlist only at module level."' + - condition: "rx_id < 0 || rx_id >= MAX_UDP_DESTINATION" + message: '"Invalid receiver index " + std::to_string(rx_id) + " to set round robin entry."' + argc: 0 + function: getDestinationUDPList + require_det_id: true + input: [ rx_id ] + input_types: [ auto ] + output: [ OutString(t) ] + PUT: + exceptions: + - condition: "det_id == -1" + message: '"Can execute udp_dstlist only at module level."' + - condition: "rx_id < 0 || rx_id >= MAX_UDP_DESTINATION" + message: '"Invalid receiver index " + std::to_string(rx_id) + " to set round robin entry."' + - condition: "args.empty()" + message: '"udp_dstlist require at least one argument."' + argc: -1 + function: setDestinationUDPList + require_det_id: true + convert_det_id: false + arg_types: [ std::string ] + input: [ getUdpEntry() ] + input_types: [ auto ] + output: [ ToString(args) ] + +txdelay: + help: "[n_delay]\n\t[Eiger][Jungfrau][Moench][Mythen3] Set transmission delay for all modules in the detector using the step size provided.Sets up \n\t\t[Eiger] txdelay_left to (2 * mod_index * n_delay), \n\t\t[Eiger] txdelay_right to ((2 * mod_index + 1) * n_delay) and \n\t\t[Eiger] txdelay_frame to (2 *num_modules * n_delay) \n\t\t[Jungfrau][Moench][Mythen3] txdelay_frame to (num_modules * n_delay) \nfor every module." + actions: + GET: + argc: 0 + check_det_id: true + function: getTransmissionDelay + output: [ OutString(t) ] + PUT: + argc: 1 + check_det_id: true + function: setTransmissionDelay + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + output: [ 'args.front()' ] + +zmqhwm: + help: "[n_limit] \n\tClient's zmq receive high water mark. Default is the zmq library's default (1000), can also be set here using -1. \n\tThis is a high number and can be set to 2 for gui purposes. \n\tOne must also set the receiver's send high water mark to similar value. Final effect is sum of them.\n\t Setting it via command line is useful only before zmq enabled (before opening gui)." + actions: + GET: + argc: 0 + function: getClientZmqHwm + output: [ t ] + PUT: + argc: 1 + function: setClientZmqHwm + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + output: [ 'det->getClientZmqHwm()' ] + +Pulse: + template: true + help: '' + actions: + PUT: + argc: 3 + require_det_id: true + function: '' + arg_types: [int, int, int] + extra_variables: + - name: c + type: defs::xy + value: defs::xy(StringTo(args[1]), StringTo(args[2])) + input: [ 'args[0]', c ] + input_types: [ int, defs::xy ] + cast_input: [ true, false ] + output: [ ToString(args) ] + +pulse: + inherit_actions: Pulse + help: "[n_times] [x] [y]\n\t[Eiger] Pulse pixel n number of times at coordinates (x, y). Advanced User!" + actions: + PUT: + function: pulsePixel + +pulsenmove: + inherit_actions: Pulse + help: "[n_times] [x] [y]\n\t[Eiger] Pulse pixel n number of times and moves relatively by (x, y). Advanced User!" + actions: + PUT: + function: pulsePixelNMove + +pulsechip: + help: "[n_times] \n\t[Eiger] Pulse chip n times. If n is -1, resets to normal mode (reset chip completely at start of acquisition, where partialreset = 0). Advanced User!" + actions: + PUT: + argc: 1 + require_det_id: true + function: pulseChip + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + output: [ args.front() ] + +quad: + help: "[0, 1]\n\t[Eiger] Sets detector size to a quad. 0 (disabled) is default. (Specific hardware required)." + actions: + GET: + argc: 0 + require_det_id: true + function: getQuad + output: [ OutString(t) ] + PUT: + argc: 1 + check_det_id: true + function: setQuad + input: [ 'args[0]' ] + input_types: [ bool ] + cast_input: [ true ] + output: [ args.front() ] + +datastream: + help: "[left|right] [0, 1]\n\t[Eiger] Enables or disables data streaming from left or/and right side of detector for 10 GbE mode. 1 (enabled) by default." + actions: + GET: + argc: 1 + require_det_id: true + function: getDataStream + input: [ 'args[0]' ] + input_types: [ defs::portPosition ] + cast_input: [ true ] + output: [ OutString(t) ] + PUT: + argc: 2 + require_det_id: true + function: setDataStream + input: [ 'args[0]', 'args[1]' ] + input_types: [ defs::portPosition, bool ] + cast_input: [ true, true ] + output: [ 'ToString(args)' ] + +temp_event: + help: "[0]\n\t[Jungfrau][Moench] 1, if a temperature event occured. To clear this event, set it to 0.\n\tIf temperature crosses threshold temperature and temperature control is enabled, power to chip will be switched off and temperature event occurs. To power on chip again, temperature has to be less than threshold temperature and temperature event has to be cleared." + actions: + GET: + argc: 0 + require_det_id: true + function: getTemperatureEvent + output: [ OutString(t) ] + PUT: + argc: 1 + exceptions: + - condition: 'StringTo(args[0]) != 0' + message: '"Unknown argument for temp event: ( " + args[0] + " ). Did you mean 0 to reset event?"' + require_det_id: true + function: resetTemperatureEvent + arg_types: [ int ] + output: [ '"cleared"' ] + +pedestalmode: + help: " [frames] [loops]\n\t\t[Jungfrau] Enable pedestal mode. \n\t\tThe number of frames or triggers is overwritten by: \n\t\t(#pedestal_frames x #pedestal_loops x 2). \n\t\tIn auto timing mode or in trigger mode with #frames > 1, \n\t\t#frames is overwritten and #triggers = 1, \n\t\telse #triggers is overwritten and #frames = 1. \n\t\tOne cannot set #frames, #triggers or timing mode in pedestal mode (exception thrown).\n\npedestalmode [0]\n\t\t[Jungfrau] Disable pedestal mode.\n\t\tDisabling pedestal mode will set back the normal mode values of #frames and #triggers." + actions: + GET: + argc: 0 + require_det_id: true + function: getPedestalMode + output: [ OutString(t) ] + PUT: + function: setPedestalMode + output: [ "ToString(args)" ] + args: + - argc: 1 + exceptions: + - condition: 'args[0] != "0"' + message: '"Unknown argument " + args[0] + ". Did you mean 0 to disable pedestal mode?"' + arg_types: [ special::pedestal_parameters ] + input: [ defs::pedestalParameters() ] + input_types: [ defs::pedestalParameters ] + - argc: 2 + arg_types: [ uint8_t, uint16_t ] + input_types: [ defs::pedestalParameters ] + input: [ 'defs::pedestalParameters(StringTo(args[0]), StringTo(args[1]))' ] + +roi: + help: "[xmin] [xmax] \n\t[Gotthard] Region of interest in detector.\n\tOptions: Only a single ROI per module. \n\tEither all channels or a single adc or 2 chips (256 channels). Default is all channels enabled (-1 -1). " + actions: + GET: + argc: 0 + require_det_id: true + function: getROI + output: [ t ] + PUT: + argc: 2 + exceptions: + - condition: 'det_id == -1 && det->size() > 1' + message: '"Cannot execute ROI at multi module level"' + require_det_id: true + convert_det_id: false + function: setROI + arg_types: [ int, int ] + extra_variables: + - name: t + type: defs::ROI + value: defs::ROI(StringTo(args[0]), StringTo(args[1])) + input: [ t ] + input_types: [ defs::ROI ] + output: [ 't' ] + +inj_ch: + help: "[offset] [increment]\n\t[Gotthard2] Inject channels with current source for calibration. Offset is starting channel that is injected, increment determines succeeding channels to be injected." + actions: + GET: + argc: 0 + require_det_id: true + function: getInjectChannel + output: [ OutString(t) ] + PUT: + argc: 2 + function: setInjectChannel + require_det_id: true + arg_types: [int, int] + input: [ 'args[0]', 'args[1]' ] + input_types: [ int, int ] + cast_input: [ true, true ] + output: [ ToString(args) ] + +vetophoton: + help: "[ichip] [#photons] [energy in keV] [reference file]\n\t[Gotthard2] Set veto reference for 128 channels for chip ichip according to reference file and #photons and energy in keV.\n[ichip] [output file]\n\t Get gain indices and veto reference for 128 channels for chip ichip, saved to file." + actions: + GET: + argc: 2 + require_det_id: true + function: getVetoPhoton + store_result_in_t: false + input: [ 'args[0]', 'args[1]' ] + input_types: [ int, std::string ] + cast_input: [ true, false ] + output: [ '"saved to file "' , "args[1]" ] + PUT: + argc: 4 + require_det_id: true + function: setVetoPhoton + input: [ 'args[0]', 'args[1]', "args[2]", "args[3]" ] + input_types: [ int, int, int, std::string ] + cast_input: [ true, true, true, false ] + output: [ ToString(args) ] + +vetoref: + help: "[gain index] [12 bit value]\n\t[Gotthard2] Set veto reference for all 128 channels for all chips." + actions: + GET: + argc: -1 + exceptions: + - condition: 'true' + message: '"Cannot get vetoref. Did you mean vetophoton?"' + + PUT: + argc: 2 + function: setVetoReference + input: [ 'args[0]', 'args[1]' ] + input_types: [ int, int ] + cast_input: [ true, true ] + output: [ ToString(args) ] + +vetofile: + help: "[chip index 0-9, -1 for all] [file name] \n\t[Gotthard2] Set veto reference for each 128 channels for specific chip. The file should have 128 rows of gain index and 12 bit value in dec" + actions: + GET: + argc: -1 + exceptions: + - condition: 'true' + message: '"Cannot get vetofile. Did you mean vetophoton?"' + PUT: + argc: 2 + function: setVetoFile + require_det_id: true + input: [ 'args[0]', 'args[1]' ] + input_types: [ int, std::string ] + cast_input: [ true, false ] + output: [ ToString(args) ] + +vetoalg: + help: "[hits|raw] [lll|10gbe]\n\t[Gotthard2] Set the veto algorithm. Default is hits." + actions: + GET: + argc: 1 + extra_variables: + - name: interface + type: defs::streamingInterface + value: StringTo(args[0]) + exceptions: + - condition: 'interface == defs::streamingInterface::NONE' + message: '"Must specify an interface to set algorithm"' + require_det_id: true + function: getVetoAlgorithm + input: [ 'interface' ] + input_types: [ defs::streamingInterface ] + cast_input: [ false ] + output: [ OutString(t), "' '", ToString(interface) ] + PUT: + argc: 2 + extra_variables: + - name: alg + type: defs::vetoAlgorithm + value: StringTo(args[0]) + - name: interface + type: defs::streamingInterface + value: StringTo(args[1]) + exceptions: + - condition: 'interface == defs::streamingInterface::NONE' + message: '"Must specify an interface to set algorithm"' + require_det_id: true + function: setVetoAlgorithm + input: [ 'alg', 'interface' ] + input_types: [ defs::vetoAlgorithm, defs::streamingInterface ] + cast_input: [ false, false ] + output: [ ToString(alg), "' '", ToString(interface) ] + +confadc: + help: "[chip index 0-9, -1 for all] [adc index 0-31, -1 for all] [7 bit configuration value in hex]\n\t[Gotthard2] Sets configuration for specific chip and adc, but configures 1 chip (all adcs for that chip) at a time." + actions: + GET: + argc: 2 + require_det_id: true + function: getADCConfiguration + input: [ 'args[0]', 'args[1]' ] + input_types: [ int, int ] + cast_input: [ true, true ] + output: [ OutStringHex(t) ] + PUT: + argc: 3 + require_det_id: true + function: setADCConfiguration + input: [ 'args[0]', 'args[1]', 'args[2]' ] + input_types: [ int, int, int ] + cast_input: [ true, true, true ] + output: [ "'['", "args[0]", '", "', "args[1]", '", "', "ToStringHex( StringTo(args[2]))", '"]"' ] + +gatedelay: + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Mythen3] Gate Delay of all gate signals in auto and trigger mode (internal gating)." + actions: + GET: + function: getGateDelayForAllGates + require_det_id: true + args: + - argc: 0 + output: [ OutString(t) ] + - argc: 1 + arg_types: [ special::time_unit ] + output: [ "OutString(t, args[0])" ] + PUT: + extra_variables: + - name: gateIndex + type: int + value: -1 + require_det_id: true + function: setGateDelay + input: [ gateIndex, converted_time ] + input_types: [ int, time::ns ] + args: + - argc: 1 + arg_types: [ std::string ] + separate_time_units: + input: 'args[0]' + output: [ converted_time, unit ] + output: [ 'args[0]' ] + - argc: 2 + arg_types: [ int, special::time_unit ] + convert_to_time: + input: [ 'args[0]', 'args[1]' ] + output: converted_time + output: [ 'args[0]', 'args[1]' ] + +gatedelay1: + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Mythen3] Gate Delay of gate signal 1 in auto and trigger mode (internal gating)." + inherit_actions: gatedelay + actions: + GET: + extra_variables: + - name: gateIndex + type: int + value: 0 + function: getGateDelay + input: [ gateIndex ] + input_types: [ int ] + PUT: + extra_variables: + - name: gateIndex + type: int + value: 0 + +gatedelay2: + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Mythen3] Gate Delay of gate signal 2 in auto and trigger mode (internal gating)." + inherit_actions: gatedelay1 + actions: + GET: + extra_variables: + - name: gateIndex + type: int + value: 1 + PUT: + extra_variables: + - name: gateIndex + type: int + value: 1 + +gatedelay3: + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Mythen3] Gate Delay of gate signal 3 in auto and trigger mode (internal gating)." + inherit_actions: gatedelay1 + actions: + GET: + extra_variables: + - name: gateIndex + type: int + value: 2 + PUT: + extra_variables: + - name: gateIndex + type: int + value: 2 + +adcvpp: + help: "[dac or mV value][(optional unit) mV] \n\t[Ctb] Vpp of ADC.\n\t 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V. \n\tAdvanced User function!" + actions: + GET: + require_det_id: true + function: getADCVpp + args: + - argc: 0 + input: [ '"0"' ] + input_types: [ bool ] + cast_input: [ true ] + output: [ OutString(t) ] + - argc: 1 + arg_type: [ special::mv ] + exceptions: + - condition: '(args[0] != "mv") && (args[0] != "mV")' + message: '"Unknown argument " + args[0] + ". Did you mean mV?"' + input: [ '"1"' ] + input_types: [ bool ] + cast_input: [ true ] + output: [ OutString(t), '" mV"' ] + PUT: + require_det_id: true + function: setADCVpp + args: + - argc: 1 + output: [ "args[0]" ] + input: [ "args[0]", '"0"' ] + input_types: [ int, bool ] + arg_types: [ int ] + cast_input: [ true, true ] + - argc: 2 + arg_types: [ int, special::mv ] + exceptions: + - condition: '(args[1] != "mv") && (args[1] != "mV")' + message: '"Unknown argument " + args[1] + ". Did you mean mV?"' + input: [ "args[0]", '"1"' ] + input_types: [ int, bool ] + cast_input: [ true , true ] + output: [ "args[0]", '" mV"' ] + +diodelay: + help: "[0-775]\n\t[Ctb] Delay for diode. Delay is in ps and max of 775 ps. Resolution is 25 ps." + actions: + PUT: + argc: 2 + require_det_id: true + function: setDigitalIODelay + input: [ 'args[0]', 'args[1]' ] + input_types: [ uint64_t, int ] + cast_input: [ true, true ] + output: [ ToString(args) ] + +# pattern is a keyword in yaml, so patternX is used to avoid it +patternX: + help: "[fname]\n\t[Mythen3][Ctb] Loads ASCII pattern file directly to server (instead of executing line by line)" + command_name: "pattern" + actions: + PUT: + argc: 1 + require_det_id: true + function: setPattern + input: [ 'args[0]' ] + input_types: [ std::string ] + cast_input: [ false ] + output: [ 'args.front()' ] + +patword: + help: "[step or address] [64 bit mask]\n\t[Ctb][Mythen3] 64 bit pattern at address of pattern memory.\n\t[Ctb] read is same as executing pattern" + actions: + GET: + argc: 1 + require_det_id: true + function: getPatternWord + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + output: [ "'['","ToStringHex(arg0, 4)", '", "', "OutStringHex(t, 16)", '"]"' ] + PUT: + argc: 2 + require_det_id: true + function: setPatternWord + input: [ 'args[0]', 'args[1]' ] + input_types: [ int, uint64_t ] + cast_input: [ true, true ] + output: [ "'['", "ToStringHex(arg0, 4)", '", "', "ToStringHex(arg1, 16)", '"]"' ] + +patlimits: + help: "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of complete pattern" + actions: + GET: + argc: -1 + require_det_id: true + function: getPatternLoopAddresses + input: [ '"-1"' ] + input_types: [ int ] + cast_input: [ true ] + output: [ "OutStringHex(t, 4)" ] + PUT: + argc: -1 + require_det_id: true + function: setPatternLoopAddresses + input: [ '"-1"', 'args[0]', 'args[1]' ] + input_types: [ int, int, int ] + cast_input: [ true, true, true ] + output: [ "'['" , "ToStringHex(arg1, 4)" , '", "' , "ToStringHex(arg2, 4)", "']'" ] + +patloop: + help: "[0-6] [start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of the loop level provided.\n\t[Mythen3] Level options: 0-3 only." + actions: + GET: + argc: -1 + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + function: getPatternLoopAddresses + input: [ level ] + input_types: [ int ] + cast_input: [ false ] + output: [level,"' '" ,"OutStringHex(t, 4)" ] + PUT: + argc: -1 + extra_variables: + - name: start + type: int + value: "StringTo(args[iArg++])" + - name: stop + type: int + value: "StringTo(args[iArg++])" + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + function: setPatternLoopAddresses + input: [ level, start, stop ] + input_types: [ int, int, int ] + output: [level,"' '" , "'['" , "ToStringHex(start, 4)" , '", "' , "ToStringHex(stop, 4)", "']'" ] + +patloop0: + help: "Depreciated command. Use patloop." + inherit_actions: patloop + actions: + GET: + output: ["OutStringHex(t, 4)" ] + PUT: + output: [ "'['" , "ToStringHex(start, 4)" , '", "' , "ToStringHex(stop, 4)", "']'" ] + +patloop1: + inherit_actions: patloop0 + +patloop2: + inherit_actions: patloop0 + +patnloop: + help: "[0-6] [n_cycles] \n\t[Ctb][Mythen3] Number of cycles of the loop level provided.\n\t[Mythen3] Level options: 0-3 only." + actions: + GET: + argc: -1 + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + function: getPatternLoopCycles + input: [ level ] + input_types: [ int ] + cast_input: [ false ] + output: [ level,"' '" , "OutString(t)" ] + PUT: + argc: -1 + extra_variables: + - name: nloops + type: std::string + value: "args[iArg++]" + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + function: setPatternLoopCycles + input: [ level, nloops ] + input_types: [ int, int ] + cast_input: [ false, true ] + output: [ level,"' '" , nloops ] + +patnloop0: + help: "Depreciated command. Use patnloop." + inherit_actions: patnloop + actions: + GET: + output: [ "OutString(t)" ] + PUT: + output: [ "nloops" ] + +patnloop1: + inherit_actions: patnloop0 + +patnloop2: + inherit_actions: patnloop0 + +patwait: + help: "[0-6] [addr] \n\t[Ctb][Mythen3] Wait address for loop level provided. \n\t[Mythen3] Level options: 0-3 only." + actions: + GET: + argc: -1 + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + function: getPatternWaitAddr + input: [ level ] + input_types: [ int ] + cast_input: [ false ] + output: [level,"' '" , "OutStringHex(t, 4)" ] + PUT: + argc: -1 + extra_variables: + - name: addr + type: int + value: "StringTo(args[iArg++])" + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + function: setPatternWaitAddr + input: [ level, addr ] + input_types: [ int, int ] + output: [level,"' '" , "ToStringHex(addr, 4)" ] + +patwait0: + help: "Depreciated command. Use patwait." + inherit_actions: patwait + actions: + GET: + output: [ "OutStringHex(t, 4)" ] + PUT: + output: [ "ToStringHex(addr, 4)" ] + +patwait1: + inherit_actions: patwait0 + +patwait2: + inherit_actions: patwait0 + +patwaittime: + help: "[0-6] [n_clk] \n\t[Ctb][Mythen3] Wait time in clock cycles for the loop provided.\n\t[Mythen3] Level options: 0-3 only." + actions: + GET: + argc: -1 + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + function: getPatternWaitTime + input: [ level ] + input_types: [ int ] + cast_input: [ false ] + output: [ level,"' '" , "OutString(t)" ] + PUT: + argc: -1 + extra_variables: + - name: waittime + type: uint64_t + value: "StringTo(args[iArg++])" + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + function: setPatternWaitTime + input: [ level, waittime ] + input_types: [ int, int ] + output: [level,"' '" , "waittime" ] + +patwaittime0: + help: "Depreciated command. Use patwaittime." + inherit_actions: patwaittime + actions: + GET: + output: [ "OutString(t)" ] + PUT: + output: [ "waittime" ] + +patwaittime1: + inherit_actions: patwaittime0 + +patwaittime2: + inherit_actions: patwaittime0 + +rx_jsonpara: + help: "[key1] [value1]\n\t[Receiver] Additional json header parameter streamed out from receiver. If not found in header, the pair is appended. An empty values deletes parameter. Max 20 characters for each key/value." + actions: + GET: + argc: 1 + require_det_id: true + function: getAdditionalJsonParameter + input: [ 'args[0]' ] + input_types: [ std::string ] + output: [ OutString(t) ] + PUT: + require_det_id: true + function: setAdditionalJsonParameter + args: + - argc: 1 + input: [ 'args[0]', '""' ] + arg_types: [ std::string ] + input_types: [ std::string, std::string ] + cast_input: [ false, false ] + output: [ 'args[0]', '" deleted"' ] + - argc: 2 + input: [ 'args[0]', 'args[1]' ] + input_types: [ std::string, std::string ] + cast_input: [ false, false ] + output: [ '"{"', 'args[0]', '": "', 'args[1]', '"}"' ] + +programfpga: + help: "[fname.pof | fname.rbf (full path)][(opitonal)--force-delete-normal-file]\n\t[Jungfrau][Moench][Ctb] Programs FPGA from pof file (full path). Then, detector controller is rebooted. \n\t\tUse --force-delete-normal-file argument, if normal file found in device tree, it must be deleted, a new device drive created and programming continued.\n\t[Mythen3][Gotthard2] Programs FPGA from rbf file (full path). Then, detector controller is rebooted." + actions: + PUT: + require_det_id: true + function: programFPGA + output: [ '"successful"' ] + args: + - argc: 1 + input: [ 'args[0]', '"0"' ] + input_types: [ std::string, bool ] + arg_types: [special::path] + cast_input: [ false, true ] + - argc: 2 + arg_types: [special::path, special::force-delete-normal-file] + exceptions: + - condition: 'args[1] != "--force-delete-normal-file"' + message: '"Could not scan second argument. Did you mean --force-delete-normal-file?"' + input: [ 'args[0]', '"1"' ] + input_types: [ std::string, bool ] + cast_input: [ false, true ] + +updatedetectorserver: + help: "[server_name with full path]\n\t[Jungfrau][Moench][Eiger][Ctb][Mythen3][Gotthard2] Copies detector server via TCP (without tftp). Makes a symbolic link with a shorter name (without vx.x.x). Then, detector controller reboots (except Eiger).\n\t[Jungfrau][Moench][Ctb]Also changes respawn server to the link, which is effective after a reboot." + actions: + PUT: + argc: 1 + require_det_id: true + function: updateDetectorServer + input: [ 'args[0]' ] + arg_types: [special::path] + input_types: [ std::string ] + output: [ '"successful"' ] + +updatekernel: + help: "[kernel_name with full path]\n\t[Jungfrau][Moench][Ctb][Mythen3][Gotthard2] Advanced Command!! You could damage the detector. Please use with caution.\n\tUpdates the kernel image. Then, detector controller reboots with new kernel." + actions: + PUT: + argc: 1 + require_det_id: true + function: updateKernel + input: [ 'args[0]' ] + arg_types: [special::path] + input_types: [ std::string ] + output: [ '"successful"' ] + +update: + help: "\n\tWithout tftp: [server_name (incl fullpath)] [fname.pof (incl full path)] This does not use tftp.\n\t\t[Jungfrau][Moench][Gotthard][CTB] Updates the firmware, detector server, deletes old server, creates the symbolic link and then reboots detector controller. \n\t\t[Mythen3][Gotthard2] will require a script to start up the shorter named server link at start up. \n\t\tserver_name is full path name of detector server binary\n\t\tfname is full path of programming file" + actions: + PUT: + argc: 2 + exceptions: + - condition: 'args[args.size() - 1].find(".pof") == std::string::npos && args[args.size() - 1].find(".rbf") == std::string::npos' + message: '"Programming file must be a pof/rbf file."' + require_det_id: true + function: updateFirmwareAndServer + input: [ 'args[0]', 'args[1]' ] + arg_types: [ special::path, special::path ] + input_types: [ std::string, std::string ] + output: [ '"successful"' ] + +reg: + help: "[address] [32 bit value]\n\t[Mythen3][Gotthard2] Reads/writes to a 32 bit register in hex. Advanced Function!\n\tGoes to stop server. Hence, can be called while calling blocking acquire().\n\t[Eiger] +0x100 for only left, +0x200 for only right." + actions: + GET: + argc: 1 + require_det_id: true + function: readRegister + input: [ 'args[0]' ] + input_types: [ uint32_t ] + cast_input: [ true ] + output: [ OutStringHex(t) ] + PUT: + argc: 2 + require_det_id: true + function: writeRegister + input: [ 'args[0]', 'args[1]' ] + input_types: [ uint32_t, uint32_t ] + cast_input: [ true, true ] + output: [ ToString(args) ] + +adcreg: + help: "[address] [value]\n\t[Jungfrau][Moench][Ctb][Gotthard] Writes to an adc register in hex. Advanced user Function!" + actions: + PUT: + argc: 2 + require_det_id: true + function: writeAdcRegister + input: [ 'args[0]', 'args[1]' ] + input_types: [ uint32_t, uint32_t ] + cast_input: [ true, true ] + output: [ ToString(args) ] + +getbit: + help: "[reg address in hex] [bit index]\n\tGets bit in address." + actions: + GET: + argc: 2 + exceptions: + - condition: 'StringTo(args[1]) < 0 || StringTo(args[1]) > 31' + message: '"Bit number out of range: " + args[1]' + require_det_id: true + function: getBit + input: [ 'args[0]', 'args[1]' ] + input_types: [ uint32_t, int ] + cast_input: [ true, true ] + output: [ OutString(t) ] + +Setbit: + template: true + actions: + PUT: + argc: 2 + exceptions: + - condition: 'StringTo(args[1]) < 0 || StringTo(args[1]) > 31' + message: '"Bit number out of range: " + args[1]' + require_det_id: true + function: setBit + input: [ 'args[0]', 'args[1]' ] + input_types: [ uint32_t, int ] + cast_input: [ true, true ] + output: [ ToString(args) ] + +setbit: + inherit_actions: Setbit + help: "[reg address in hex] [bit index]\n\tSets bit in address." + actions: + PUT: + function: setBit + +clearbit: + inherit_actions: Setbit + help: "[reg address in hex] [bit index]\n\tClears bit in address." + actions: + PUT: + function: clearBit + +initialchecks: + help: "[0, 1]\n\t[Mythen3][Gotthard2] Enable or disable intial compatibility and other checks at detector start up. It is enabled by default. Must come before 'hostname' command to take effect. Can be used to reprogram fpga when current firmware is incompatible.\n\tAdvanced User function!" + actions: + GET: + argc: 0 + check_det_id: true + function: getInitialChecks + output: [ t ] + PUT: + argc: 1 + check_det_id: true + function: setInitialChecks + input: [ 'args[0]' ] + input_types: [ bool ] + cast_input: [ true ] + output: [ args.front() ] + +user: + help: "\n\tUser details from shared memory (hostname, type, PID, User, Date)." + actions: + GET: + argc: 0 + check_det_id: true + function: getUserDetails + output: [ t ] + + + + + + diff --git a/slsDetectorSoftware/generator/commands_parser/__init__.py b/slsDetectorSoftware/generator/commands_parser/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/slsDetectorSoftware/generator/commands_parser/commands_parser.py b/slsDetectorSoftware/generator/commands_parser/commands_parser.py new file mode 100644 index 000000000..9a11cd789 --- /dev/null +++ b/slsDetectorSoftware/generator/commands_parser/commands_parser.py @@ -0,0 +1,379 @@ +import copy +import logging +import yaml +from pathlib import Path + + +class CommandParser: + def __init__( + self, + commands_file: Path = Path(__file__).parent.parent / 'commands.yaml', + output_file: Path = Path(__file__).parent.parent / 'extended_commands.yaml' + ): + + self.output_file = output_file + self.commands_file = commands_file + self.fp = self.commands_file.open('r') + self.simple_commands = yaml.unsafe_load(self.fp) + self.extended_commands = {} + self.argc_set = set() + self.logger = logging.getLogger('command_parser') + self.__current_action: str = '' + FORMAT = '[%(levelname)s] %(message)s' + logging.basicConfig(format=FORMAT, level=logging.INFO) + + self.propagate_config = { + 'require_det_id': False, + 'convert_det_id': True, + 'input': [], + 'input_types': [], + 'function': '', + 'output': [], + 'cast_input': [], + 'check_det_id': False, + 'arg_types': [], + # 'store_result_in_t': False, # always true in GET action + } + self.default_config = { + 'infer_action': True, + 'help': '', + 'actions': {} + } + + def _verify_argument(self, arg, infer_action, command_name, action): + if arg['function'] == '' and 'ctb_output_list' not in arg: + special_exception_message_list = ["Cannot put", "Cannot get"] + if 'exceptions' in arg and arg['exceptions'][0]['condition'] == 'true' and any(ele in arg['exceptions'][0]['message'] for ele in special_exception_message_list): + self.logger.warning(f"{command_name} has a special exception message for {action}.") + else: + self.logger.warning(f"{command_name} [{action}] does not have a function") + if len(arg['input_types']) != len(arg['input']): + raise ValueError(f'Argument {arg} does not have the correct number of inputs') + if 'separate_time_units' in arg: + + if arg['separate_time_units']['input'] == "": + raise ValueError(f'Argument {arg} does not have the correct number of inputs for separate_time_units') + if len(arg['separate_time_units']['output']) != 2: + raise ValueError(f'Argument {arg} does not have the correct number of outputs for separate_time_units') + if 'convert_to_time' in arg: + if len(arg['convert_to_time']['input']) != 2: + raise ValueError(f'Argument {arg} does not have the correct number of inputs for convert_to_time') + if len(arg['convert_to_time']['output']) == "": + raise ValueError(f'Argument {arg} does not have the correct number of outputs for convert_to_time') + # if infer_action: + # if arg['argc'] in self.argc_set: + # raise ValueError(f'Argument {arg} has a duplicate argc') + # self.argc_set.add(arg['argc']) + + def verify_format(self): + # todo verify detectors + # todo verify circular inheritance + # todo verify child commands (those that inherit) + # todo verify that there is no wrongly typed parameters + # todo verify that the same number of input_types and input are given + # todo verify that each argument has argc (error can happen when inheriting) + for command_name, command in self.simple_commands.items(): + if 'inherit_actions' in command or 'template' in command and command[ + 'template'] or 'is_description' in command and command['is_description']: + continue + self.argc_set = set() + if 'infer_action' not in command: + command['infer_action'] = True + if 'actions' not in command: + raise ValueError(f'Command {command_name} does not have any actions') + for action, action_params in command['actions'].items(): + if 'argc' in action_params: + if 'args' in action_params: + raise ValueError(f'Action {action} has both argc and args') + arg = {**self.propagate_config, **action_params} + self._verify_argument(arg, command['infer_action'], command_name, action) + elif 'args' in action_params: + if type(action_params['args']) is not list: + raise ValueError(f'Action {action} args is not a list') + if len(action_params['args']) == 0: + raise ValueError(f'Action {action} args is empty') + action_args = {**self.propagate_config, **action_params} + del action_args['args'] + for arg in action_params['args']: + arg = {**action_args, **arg} + self._verify_argument(arg, command['infer_action'], command_name, action) + self.logger.info('Commands file is valid ✅️') + return True + + def _parse_inherited_command(self, parent, command, simple_parent): + """ + parse a command that inherits from parent command + :param parent: parsed parent command + :param command: the current command + :param simple_parent: unparsed parent command + :return: parsed command + """ + # deepcopy parent and command to avoid modifying the originals + command = copy.deepcopy(command) + config = copy.deepcopy(parent) + # add help + if 'help' in command: + config['help'] = command['help'] + if 'actions' not in command: + return config + for action, command_params in command['actions'].items(): + self.__current_action = action + if action not in config['actions']: + # todo: handle this case + pass + parent_params = config['actions'][action] + if 'args' in command_params: + # child has args => inherit action level params from parent + override with child args + use child's + # action level params + context = {**self.propagate_config, **simple_parent['actions'][action], **command_params} + config['actions'][action]['args'] = self.parse_action(context, command_params['args']) + elif 'argc' in command_params: + # child has action level args (argc) + context = {**self.propagate_config, **simple_parent['actions'][action], **command_params} + config['actions'][action]['args'] = self.parse_action(context, []) + else: + # child does not have args => use parent's action level params + override with child's action level + if 'args' in parent_params: + config['actions'][action]['args'] = self.parse_action({}, parent_params['args'], command_params) + + if 'detectors' in command_params: + if command_params['detectors'] is None: + # if child has an empty detector section, then delete the parent's detector section + del config['actions'][action]['detectors'] + continue + + for detector_name, detector_params in command_params['detectors'].items(): + if 'detectors' not in config['actions'][action]: + config['actions'][action]['detectors'] = {} + config_detector = config['actions'][action]['detectors'] + if 'detectors' not in parent_params or detector_name not in parent_params['detectors']: + if 'args' in detector_params: + # if child has detector args and parent does not have detectors + # => use child's detector args + context = {**self.propagate_config, **simple_parent['actions'][action], **detector_params} + config_detector[detector_name] = self.parse_action(context, detector_params['args']) + elif 'args' in parent_params: + # if child does not have detector args and parent does not have detectors + # => use the child's action args + context = {**self.propagate_config, **simple_parent['actions'][action]} + config_detector[detector_name] = self.parse_action(context, + config['actions'][action]['args'], + detector_params) + elif detector_name in parent_params['detectors']: + + if 'args' in detector_params: + # child and parent have the same detector and child has detector args + # => use child's detector args + context = { + **self.propagate_config, + **simple_parent['actions'][action], + **simple_parent['actions'][action]['detectors'][detector_name], + + } + config_detector[detector_name] = self.parse_action(context, detector_params['args']) + else: + # child and parent have the same detector and child does not have detector args + # => use parent's detector args + priority_context = {**command_params, **detector_params} + config_detector[detector_name] = self.parse_action( + {}, + parent_params['detectors'][detector_name], + priority_context + ) + + else: + pass + + return config + + def _parse_command(self, command): + """ + logic function for parse_command. + This function is recursive + :return: parsed command + """ + config = self.default_config.copy() + config.update(command) + config['actions'] = {} + + # check if command inherits from another command + if 'inherit_actions' in command: + if command['inherit_actions'] in self.extended_commands: + # if parent command has already been parsed, use that + parent = self.extended_commands[command['inherit_actions']] + else: + # if parent command has not been parsed, parse it + parent = self.parse_command(command['inherit_actions']) + # parse the current command and merge it with the parent command + config = self._parse_inherited_command(parent, command, self.simple_commands[command['inherit_actions']]) + return config + + if 'actions' not in command: + return config + + for action, action_params in command['actions'].items(): + self.__current_action = action + + config['actions'][action] = {} + config_action = config['actions'][action] + # the context in the current command and the current action + action_context = {**self.propagate_config, **action_params} + if 'args' not in action_params: + # parse the action with the action context + if action_params.keys() != {'detectors'}: + config_action['args'] = self.parse_action(action_context, []) + else: + config_action['args'] = self.parse_action(action_context, action_params['args']) + + # check if the action has detectors + if 'detectors' in action_params: + config_action['detectors'] = {} + for detector_name, detector_params in action_params['detectors'].items(): + # get the context for the detector and merge it with the action context + detector_context = {**action_context, **detector_params} + + # if the detector does not have args, then use the action args + # otherwise, use the detector args and override the action args + tmp_args = [] + if 'args' not in detector_params: + if 'args' in config_action: + tmp_args = config_action['args'] + else: + tmp_args = detector_params['args'] + detector_params['args'] = tmp_args + + # parse the action with the detector context + config_action['detectors'][detector_name] = self.parse_action(detector_context, + tmp_args, + detector_params) + return config + + def sanitize_argument(func): + def f(self, action_context, args_old, priority_context={}): + args = func(self, action_context, args_old, priority_context) + for i, arg in enumerate(args): + if 'args' in arg: + del arg['args'] + if 'detectors' in arg: + del arg['detectors'] + if not arg['cast_input']: + # if the cast_input is empty, then set it to False + arg['cast_input'] = [False] * len(arg['input']) + + elif len(arg['cast_input']) != len(arg['input']): + # if the cast_input is not the same length as the input, then set it to False + arg['cast_input'] = [False] * len(arg['input']) + self.logger.warning(f'cast_input for {arg["function"]} ' + f'with argc: {arg["argc"]} has different length than input') + if 'store_result_in_t' not in arg: + if self.__current_action == 'GET': + arg['store_result_in_t'] = True + else: + arg['store_result_in_t'] = False + return args + + return f + + @sanitize_argument + def parse_action(self, action_context, args, priority_context={}): + """ + parse an action + :param action_context: context of the action + :param args: arguments to be used in the action + :param priority_context: context that should override the arguments params + :return: parsed action + """ + + def add_cast_input(argument): + return argument + + # deepcopy action_context to avoid modifying the original + action_context = {**self.propagate_config, **copy.deepcopy(action_context)} + priority_context = copy.deepcopy(priority_context) + + if 'detectors' in action_context: + del action_context['detectors'] + if 'detectors' in priority_context: + del priority_context['detectors'] + + if args == []: + # if there are no arguments, then the action has only one argument + context = {**action_context, **priority_context} + return [add_cast_input(context)] + + ret_args = [] + if 'args' in action_context: + del action_context['args'] + if 'args' in priority_context: + del priority_context['args'] + + # if there are arguments, then merge them with the action context and priority context + for arg in args: + arg = {**action_context, **arg, **priority_context} + ret_args.append(add_cast_input(arg)) + return ret_args + + def parse_command(self, command_name): + """ + parse a single command + This function is recursive + + :param command_name: name of the command to parse + :return: the parsed command + """ + command = self.simple_commands[command_name] + parsed_command = self._parse_command(command) + if 'function_alias' not in command: + if 'command_name' in command: + parsed_command['function_alias'] = command['command_name'] + else: + parsed_command['function_alias'] = command_name + + if 'command_name' not in command: + parsed_command['command_name'] = command_name + + if 'template' in command and command['template']: + return parsed_command + self.extended_commands[command_name] = parsed_command + return self.extended_commands[command_name] + + def parse_all_commands(self): + """ + iterate over all commands in yaml file and parse them + :return: None + """ + + for command_name in self.simple_commands: + # todo remove this (added for debugging) + if command_name != 'xtiming': + self.parse_command(command_name) + + # post-process the parsed commands + self.post_process_all_commands() + + yaml.Dumper.ignore_aliases = lambda *args: True + self.logger.info(f'parsed {len(self.extended_commands)} commands') + yaml.dump(self.extended_commands, self.output_file.open('w'), default_flow_style=False) + + def post_process_all_commands(self): + for command_name, command in self.extended_commands.items(): + if 'is_description' in command and command['is_description']: + continue + for action_name, action, in command['actions'].items(): + for arg in action['args']: + if arg['argc'] == 0: + arg['arg_types'] = [] + continue + if arg['argc'] == -1: + pass + if arg['arg_types'] == []: + arg['arg_types'] = arg['input_types'] + + +# command_parser = CommandParser(Path( +# '/afs/psi.ch/user/b/braham_b/github/slsDetectorPackage/slsDetectorSoftware/generator/tests/command_parser/data/detectors.yaml')) +command_parser = CommandParser() + +if __name__ == '__main__': + command_parser.verify_format() + command_parser.parse_all_commands() diff --git a/slsDetectorSoftware/generator/cpp_codegen/__init__.py b/slsDetectorSoftware/generator/cpp_codegen/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/slsDetectorSoftware/generator/cpp_codegen/codegen.py b/slsDetectorSoftware/generator/cpp_codegen/codegen.py new file mode 100644 index 000000000..5df7c3b61 --- /dev/null +++ b/slsDetectorSoftware/generator/cpp_codegen/codegen.py @@ -0,0 +1,282 @@ +class CodeGenerator: + def __init__(self): + self.file = None + self.actions_dict = { + 'GET': 'slsDetectorDefs::GET_ACTION', + 'PUT': 'slsDetectorDefs::PUT_ACTION', + 'READOUT': 'slsDetectorDefs::READOUT_ACTION', + 'HELP': 'slsDetectorDefs::HELP_ACTION', + } + self.template_file = None + + def open(self, path): + self.file = path.open('w') + + def close(self): + self.file.close() + self.file = None + + def write_line(self, line): + self.file.write(line + '\n') + + def write(self, text): + self.file.write(text) + + def write_opening(self, path): + """Write the opening file for the caller.cpp file""" + self.template_file = path.open('r') + for line in self.template_file: + if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE" in line: + return + self.file.write(line) + + def write_closing(self): + """Write the closing file for the caller.cpp file""" + for line in self.template_file.readlines(): + self.file.write(line) + self.template_file.close() + + def write_header(self, in_path, out_path, commands, deprecated_commands): + """Write the header file for the caller.h file""" + with out_path.open('w') as fp: + with in_path.open('r') as fp2: + for line in fp2: + if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1)" in line: + for command_name, command in commands.items(): + if 'duplicate_function' in command and command['duplicate_function']: + continue + fp.write(f'std::string {command["function_alias"]}(int action);\n') + continue + if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (2)" in line: + map_string = '' + for command_name, command in commands.items(): + map_string += f'{{"{command_name}", &Caller::{command["function_alias"]}}},' + fp.write(map_string[:-1] + '\n') + continue + + if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (3)" in line: + for key, value in deprecated_commands.items(): + fp.write(f'{{"{key}", "{value}"}},\n') + continue + + fp.write(line) + + def write_infer_header(self, in_path, out_path, commands): + """Write the header file for the inferAction.h file""" + with out_path.open('w+') as fp: + with in_path.open('r') as fp2: + for line in fp2: + if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1) - DO NOT REMOVE" in line: + for command_name, command in commands.items(): + if 'duplicate_function' in command and command['duplicate_function']: + continue + + fp.write(f'int {command["function_alias"]}();\n') + continue + if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (2) - DO NOT REMOVE" in line: + map_string = '' + for command_name, command in commands.items(): + map_string += f'{{"{command_name}", &InferAction::{command["function_alias"]}}},' + fp.write(map_string[:-1] + '\n') + continue + fp.write(line) + + def write_infer_cpp(self, in_path, out_path, commands, non_dist, type_dist): + """Write the source file for the inferAction.cpp file""" + with in_path.open('r') as fp2: + for line in fp2: + if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1) - DO NOT REMOVE" in line: + for command_name, command in commands.items(): + if 'duplicate_function' in command and command['duplicate_function']: + continue + + with function('int', f"InferAction::{command['function_alias']}", []) as f: + if (command_name, -1) in non_dist| type_dist: + self.write_line( + f'throw RuntimeError("det is disabled for command: {command_name}. Use detg or detp");') + elif not command['infer_action']: + self.write_line('throw RuntimeError("infer_action is disabled");') + else: + checked_argcs = set() + for action, action_params in command['actions'].items(): + for arg in action_params['args']: + if arg['argc'] in checked_argcs: + continue + checked_argcs.add(arg['argc']) + with if_block(f'args.size() == {arg["argc"]}'): + # check if this argc is not distinguishable + if (command_name, arg["argc"]) in non_dist | type_dist: + self.write_line( + f'throw RuntimeError("det is disabled for command: {command_name} with number of arguments {arg["argc"]}. Use detg or detp");') + else: + self.write_line(f'return {self.actions_dict[action]};') + with else_block(): + self.write_line( + 'throw RuntimeError("Could not infer action: Wrong number of arguments");') + continue + self.write_line(line) + + def write_check_arg(self): + pass + + def write_arg(self, args, action, command_name): + for arg in args: + if arg['argc'] != -1: + if_block(f'args.size() == {arg["argc"]}',).__enter__() + if 'pattern_command' in arg and arg['pattern_command']: + self.write_line(f'int level = -1, iArg = 0, ' + f'nGetArgs = {arg["pattern_command"]["nGetArgs"]},' + f' nPutArgs = {arg["pattern_command"]["nPutArgs"]};\nGetLevelAndUpdateArgIndex(action, ' + f'"{arg["pattern_command"]["command_name"]}", level, iArg, nGetArgs,nPutArgs);' + ) + + if 'extra_variables' in arg: + for var in arg['extra_variables']: + codegen.write_line(f'{var["type"]} {var["name"]} = {var["value"]};') + if 'separate_time_units' in arg and arg['separate_time_units']: + self.write_line(f'std::string tmp_time({arg["separate_time_units"]["input"]});') + self.write_line(f'std::string {arg["separate_time_units"]["output"][1]}' + f' = RemoveUnit(tmp_time);') + self.write_line(f'auto {arg["separate_time_units"]["output"][0]} = ' + f'StringTo < time::ns > (tmp_time,' + f' {arg["separate_time_units"]["output"][1]});') + if 'convert_to_time' in arg and arg['convert_to_time']: + self.write_line(f'auto {arg["convert_to_time"]["output"]} = ' + f'StringTo < time::ns > ({", ".join(arg["convert_to_time"]["input"])});') + input_arguments = [] + if 'exceptions' in arg: + for exception in arg['exceptions']: + self.write_line(f'if ({exception["condition"]}) {{ throw RuntimeError({exception["message"]}); }}') + if 'check_det_id' in arg and arg['check_det_id']: + self.write_line( + f'if (det_id != -1) {{ throw RuntimeError("Cannot execute {command_name} at module level"); }} ' + ) + # only used for 3 commands :( + if 'ctb_output_list' in arg: + self.write_line(f""" + std::string suffix = " {arg['ctb_output_list']['suffix']}"; + auto t = det->{arg['ctb_output_list']['GETFCNLIST']}();""") + if arg['ctb_output_list']['GETFCNNAME'] != '': + self.write_line(f""" + auto names = det->{arg['ctb_output_list']['GETFCNNAME']}(); + auto name_it = names.begin();""") + self.write_line("os << '[';") + with if_block(f't.size() > 0'): + self.write_line(f""" + auto it = t.cbegin(); + os << ToString({arg['ctb_output_list']['printable_name']}) << ' '; + os << OutString(det->{arg['ctb_output_list']['GETFCN']}(*it++, std::vector{{det_id}}))<< suffix; + while (it != t.cend()) {{ + os << ", " << ToString({arg['ctb_output_list']['printable_name']}) << ' '; + os << OutString(det->{arg['ctb_output_list']['GETFCN']}(*it++, std::vector{{det_id}}))<< suffix; + }} + """) + self.write_line('os << "]\\n";') + if arg['argc'] != -1: + if_block().__exit__() + + return + + for i in range(len(arg['input'])): + if arg['cast_input'][i]: + self.write_line( + f'auto arg{i} = StringTo<{arg["input_types"][i]}>({arg["input"][i]});') + input_arguments.append(f'arg{i}') + else: + input_arguments.append(arg["input"][i]) + if 'require_det_id' in arg and arg['require_det_id']: + if 'convert_det_id' in arg and arg['convert_det_id']: + input_arguments.append("std::vector{ det_id }") + else: + input_arguments.append("det_id") + + input_arguments = ", ".join(input_arguments) + # call function + if arg["function"]: + if arg['store_result_in_t']: + self.write_line(f'auto t = det->{arg["function"]}({input_arguments});') + else: + self.write_line(f'det->{arg["function"]}({input_arguments});') + else: + pass #We have no function so skip block + + output_args = [] + for output in arg['output']: + output_args.append(output) + if len(output_args) > 0: + self.write_line(f"os << {'<< '.join(output_args)} << '\\n';") + + if arg['argc'] != -1: + if_block().__exit__() + + +class if_block: + def __init__(self, condition="", elseif=False): + self.condition = condition + self.elseif = elseif + self.block = False + + def __enter__(self): + if self.elseif: + codegen.write_line('else if (' + self.condition + ') {') + else: + codegen.write_line('if (' + self.condition + ') {') + if self.block: + codegen.write_line('{\n') + + def __exit__(self, *args): + codegen.write_line('}') + if self.block: + codegen.write_line('}') + codegen.write_line('') + + +class else_block: + def __init__(self): + pass + + def __enter__(self): + codegen.write_line('else {') + codegen.write_line('') + + def __exit__(self, *args): + codegen.write_line('}') + codegen.write_line('') + + +class for_block: + def __init__(self, condition): + self.condition = condition + + def __enter__(self): + codegen.write_line('for (' + self.condition + ') {') + codegen.write_line('') + + def __exit__(self, *args): + codegen.write_line('}') + codegen.write_line('') + + +class function: + def __init__(self, return_type, name, args: list[tuple[str, str]]): + self.name = name + self.args = args + self.return_type = return_type + + def __enter__(self): + s = "" + for arg in self.args: + arg_type, arg_name = arg + s += arg_type + ' ' + arg_name + ', ' + s = s[:-2] + codegen.write_line(self.return_type + ' ' + self.name + + f'({s}) {{') + codegen.write_line('') + return self + + def __exit__(self, *args): + codegen.write_line('}') + codegen.write_line('') + + +codegen = CodeGenerator() diff --git a/slsDetectorSoftware/generator/deprecated_commands.yaml b/slsDetectorSoftware/generator/deprecated_commands.yaml new file mode 100644 index 000000000..22788505d --- /dev/null +++ b/slsDetectorSoftware/generator/deprecated_commands.yaml @@ -0,0 +1,176 @@ +#configuration +detectorversion: firmwareversion +softwareversion: detectorserverversion +receiverversion: rx_version +detectornumber: serialnumber +thisversion: clientversion +detsizechan: detsize +trimdir: settingspath +settingsdir: settingspath +flippeddatax: fliprows + +#acquisition parameters +cycles: triggers +cyclesl: triggersl +clkdivider: readoutspeed +speed: readoutspeed +vhighvoltage: highvoltage +digitest: imagetest +filter: filterresistor +readnlines: readnrows + +# temperature + +# super old dacs +vtr: vtrim +vrf: vrpreamp +vrs: vrshaper +vcall: vcal +vis: vishaper +vshaper: vrshaper +vpreamp: vrpreamp +vshaperneg: vrshaper_n +viinsh: vishaper +vpl: vcal_n +vph: vcal_p + +# dacs +vthreshold: dac +vsvp: dac +vsvn: dac +vtrim: dac +vrpreamp: dac +vrshaper: dac +vtgstv: dac +vcmp_ll: dac +vcmp_lr: dac +vcal: dac +vcmp_rl: dac +vcmp_rr: dac +rxb_rb: dac +rxb_lb: dac +vcp: dac +vcn: dac +vishaper: dac +iodelay: dac +vref_ds: dac +vcascn_pb: dac +vcascp_pb: dac +vout_cm: dac +vcasc_out: dac +vin_cm: dac +vref_comp: dac +ib_test_c: dac +vrshaper_n: dac +vipre: dac +vdcsh: dac +vth1: dac +vth2: dac +vth3: dac +vcal_n: dac +vcal_p: dac +vcassh: dac +vcas: dac +vicin: dac +vipre_out: dac +vref_h_adc: dac +vb_comp_fe: dac +vb_comp_adc: dac +vcom_cds: dac +vref_rstore: dac +vb_opa_1st: dac +vref_comp_fe: dac +vcom_adc1: dac +vref_prech: dac +vref_l_adc: dac +vref_cds: dac +vb_cs: dac +vb_opa_fd: dac +vcom_adc2: dac +vb_ds: dac +vb_comp: dac +vb_pixbuf: dac +vin_com: dac +vdd_prot: dac +vbp_colbuf: dac +vb_sda: dac +vcasc_sfp: dac +vipre_cds: dac +ibias_sfp: dac + +defaultdacs: resetdacs + +#acquisition +busy: clearbusy +receiver: rx_status +framescaught: rx_framescaught +startingfnum: nextframenumber + +#Network Configuration (Detector<->Receiver) +detectorip: udp_srcip +detectorip2: udp_srcip2 +detectormac: udp_srcmac +detectormac2: udp_srcmac2 +rx_udpip: udp_dstip +rx_udpip2: udp_dstip2 +rx_udpmac: udp_dstmac +rx_udpmac2: udp_dstmac2 +rx_udpport: udp_dstport +rx_udpport2: udp_dstport2 +flowcontrol_10g: flowcontrol10g +txndelay_frame: txdelay_frame +txndelay_left: txdelay_left +txndelay_right: txdelay_right + +#Receiver Config +r_silent: rx_silent +r_discardpolicy: rx_discardpolicy +r_padding: rx_padding +r_lock: rx_lock +r_lastclient: rx_lastclient + +#File +fileformat: fformat +outdir: fpath +index: findex +enablefwrite: fwrite +masterfile: fmaster +overwrite: foverwrite +r_framesperfile: rx_framesperfile + +#ZMQ Streaming Parameters (Receiver<->Client) +r_readfreq: rx_zmqfreq +rx_readfreq: rx_zmqfreq +rx_datastream: rx_zmqstream + +#Eiger Specific +resmat: partialreset + +#Jungfrau Specific +storagecells: extrastoragecells +auto_comp_disable: autocompdisable +comp_disable_time: compdisabletime + +#Gotthard Specific +#Gotthard2 Specific +#Mythen3 Specific +#CTB Specific +adc: slowadc +flags: romode +i_a: im_a +i_b: im_b +i_c: im_c +i_d: im_d +i_io: im_io + +#Pattern +#Moench + +#Advanced +copydetectorserver: updatedetectorserver + +#Insignificant +nframes: framecounter +now: runtime +timestamp: frametime +frameindex: rx_frameindex \ No newline at end of file diff --git a/slsDetectorSoftware/generator/extended_commands.yaml b/slsDetectorSoftware/generator/extended_commands.yaml new file mode 100644 index 000000000..ff4431f9b --- /dev/null +++ b/slsDetectorSoftware/generator/extended_commands.yaml @@ -0,0 +1,13726 @@ +acquire: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: acquire + function_alias: acquire + help: '' + infer_action: true + is_description: true +activate: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getActive + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setActive + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: activate + function_alias: activate + help: "[0, 1] \n\t[Eiger] 1 is default. 0 deactivates readout and does not send\ + \ data." + infer_action: true + template: true +adcclk: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getADCClock + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setADCClock + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: adcclk + function_alias: adcclk + help: "[n_clk in MHz]\n\t[Ctb] ADC clock frequency in MHz." + infer_action: true + template: true +adcenable: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getADCEnableMask + input: [] + input_types: [] + output: + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint32_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setADCEnableMask + input: + - args[0] + input_types: + - uint32_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: adcenable + function_alias: adcenable + help: "[bitmask]\n\t[Ctb] ADC Enable Mask for 1Gb Enable for each 32 ADC channel." + infer_action: true + template: true +adcenable10g: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTenGigaADCEnableMask + input: [] + input_types: [] + output: + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint32_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTenGigaADCEnableMask + input: + - args[0] + input_types: + - uint32_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: adcenable10g + function_alias: adcenable10g + help: "[bitmask]\n\t[Ctb] ADC Enable Mask for 10Gb mode for each 32 ADC channel.\ + \ However, if any of a consecutive 4 bits are enabled, the complete 4 bits are\ + \ enabled." + infer_action: true + template: true +adcindex: + actions: + GET: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: getAdcIndex + input: + - args[0] + input_types: + - std::string + output: + - static_cast(t) + require_det_id: false + store_result_in_t: true + command_name: adcindex + function_alias: adcindex + help: "[name] \n\t\t[ChipTestBoard] Get the adc index for the given name." + infer_action: true + template: true +adcinvert: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getADCInvert + input: [] + input_types: [] + output: + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint32_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setADCInvert + input: + - args[0] + input_types: + - uint32_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: adcinvert + function_alias: adcinvert + help: "[bitmask]\n\t[Ctb][Jungfrau][Moench] ADC Inversion Mask.\n\t[Jungfrau][Moench]\ + \ Inversions on top of the default mask." + infer_action: true + template: true +adclist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: getAdcNames + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: -1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: '"This detector already has fixed dac names. Cannot change them."' + function: setAdcNames + input: + - args + input_types: + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: adclist + function_alias: adclist + help: "[adcname1 adcname2 .. adcname32] \n\t\t[ChipTestBoard] Set the list of adc\ + \ names for this board." + infer_action: true + template: true +adcname: + actions: + GET: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: getAdcName + input: + - args[0] + input_types: + - int + output: + - args[0] + - ''' ''' + - t + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - std::string + argc: 2 + cast_input: + - true + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: setAdcName + input: + - args[0] + - args[1] + input_types: + - int + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: adcname + function_alias: adcname + help: "[0-31][name] \n\t\t[ChipTestBoard] Set the adc at the given position to the\ + \ given name." + infer_action: true + template: true +adcphase: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type + == defs::GOTTHARD2 + message: '"adcphase not implemented for this detector"' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + function: getADCPhase + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::deg + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type + == defs::GOTTHARD2 + message: '"adcphase not implemented for this detector"' + - condition: args[0] != "deg" + message: '"Unknown adcphase argument " + args[0] + ". Did you mean deg? "' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + function: getADCPhaseInDegrees + input: [] + input_types: [] + output: + - OutString(t) + - '" deg"' + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type + == defs::GOTTHARD2 + message: '"adcphase not implemented for this detector"' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + function: setADCPhase + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + - arg_types: + - int + - special::deg + argc: 2 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type + == defs::GOTTHARD2 + message: '"adcphase not implemented for this detector"' + - condition: args[1] != "deg" + message: '"Unknown adcphase 2nd argument " + args[1] + ". Did you mean deg?"' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + function: setADCPhaseInDegrees + input: + - args[0] + input_types: + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: adcphase + function_alias: adcphase + help: "[n_value] [(optional)deg]\n\t[Jungfrau][Moench][Ctb][Gotthard] Phase shift\ + \ of ADC clock. \n\t[Jungfrau][Moench] Absolute phase shift. If deg used, then\ + \ shift in degrees. Changing Speed also resets adcphase to recommended defaults.\n\ + \t[Ctb] Absolute phase shift. If deg used, then shift in degrees. Changing adcclk\ + \ also resets adcphase and sets it to previous values.\n\t[Gotthard] Relative\ + \ phase shift. Cannot get" + infer_action: true +adcpipeline: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getADCPipeline + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setADCPipeline + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: adcpipeline + function_alias: adcpipeline + help: "[n_value]\n\t[Ctb][Moench] Pipeline for ADC clock." + infer_action: true + template: true +adcreg: + actions: + PUT: + args: + - arg_types: + - uint32_t + - uint32_t + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: writeAdcRegister + input: + - args[0] + - args[1] + input_types: + - uint32_t + - uint32_t + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: adcreg + function_alias: adcreg + help: "[address] [value]\n\t[Jungfrau][Moench][Ctb][Gotthard] Writes to an adc register\ + \ in hex. Advanced user Function!" + infer_action: true +adcvpp: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: getADCVpp + input: + - '"0"' + input_types: + - bool + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_type: + - special::mv + arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: (args[0] != "mv") && (args[0] != "mV") + message: '"Unknown argument " + args[0] + ". Did you mean mV?"' + function: getADCVpp + input: + - '"1"' + input_types: + - bool + output: + - OutString(t) + - '" mV"' + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: setADCVpp + input: + - args[0] + - '"0"' + input_types: + - int + - bool + output: + - args[0] + require_det_id: true + store_result_in_t: false + - arg_types: + - int + - special::mv + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: (args[1] != "mv") && (args[1] != "mV") + message: '"Unknown argument " + args[1] + ". Did you mean mV?"' + function: setADCVpp + input: + - args[0] + - '"1"' + input_types: + - int + - bool + output: + - args[0] + - '" mV"' + require_det_id: true + store_result_in_t: false + command_name: adcvpp + function_alias: adcvpp + help: "[dac or mV value][(optional unit) mV] \n\t[Ctb] Vpp of ADC.\n\t 0 -> 1V ;\ + \ 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V. \n\tAdvanced User function!" + infer_action: true +apulse: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getAnalogPulsing + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setAnalogPulsing + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: apulse + function_alias: apulse + help: "[0, 1]\n\t[Mythen3] Enables or disables analog pulsing. Default is disabled" + infer_action: true + template: true +asamples: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfAnalogSamples + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setNumberOfAnalogSamples + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: asamples + function_alias: asamples + help: "[n_samples]\n\t[CTB] Number of analog samples expected." + infer_action: true + template: true +autocompdisable: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getAutoComparatorDisable + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setAutoComparatorDisable + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: autocompdisable + function_alias: autocompdisable + help: "[0, 1]\n\t[Jungfrau] Auto comparator disable mode. By default, the on-chip\ + \ gain switching is active during the entire exposure.This mode disables the on\ + \ - chip gain switching comparator automatically after 93.75% (only for chipv1.0)\ + \ of exposure time (only for longer than 100us). It is possible to set the duration\ + \ for chipv1.1 using compdisabletime command.\n\tDefault is 0 or this mode disabled(comparator\ + \ enabled throughout). 1 enables mode. 0 disables mode. " + infer_action: true + template: true +badchannels: + actions: + GET: + args: + - arg_types: + - std::string + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: badchannels + function_alias: badchannels + help: '' + infer_action: true + is_description: true +blockingtrigger: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: true + convert_det_id: true + extra_variables: + - name: block + type: bool + value: 'true' + function: sendSoftwareTrigger + input: + - block + input_types: + - bool + output: + - '"successful"' + require_det_id: false + store_result_in_t: false + command_name: blockingtrigger + function_alias: blockingtrigger + help: "\n\t[Eiger][Jungfrau][Moench] Sends software trigger signal to detector and\ + \ blocks till the frames are sent out for that trigger." + infer_action: true + template: true +burstmode: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::burstMode + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: burstmode + function_alias: burstmode + help: '' + infer_action: true + is_description: true +burstperiod: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getBurstPeriod + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getBurstPeriod + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setBurstPeriod + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + function: setBurstPeriod + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: burstperiod + function_alias: burstperiod + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Gotthard2] Period between 2 bursts.\ + \ Only in burst mode and auto timing mode." + infer_action: true + template: true +bursts: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfBursts + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int64_t + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setNumberOfBursts + input: + - args[0] + input_types: + - int64_t + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: bursts + function_alias: bursts + help: "[n_bursts]\n\t[Gotthard2] Number of bursts per aquire. Only in auto timing\ + \ mode and burst mode. Use timing command to set timing mode and burstmode command\ + \ to set burst mode." + infer_action: true + template: true +burstsl: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfBurstsLeft + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: burstsl + function_alias: burstsl + help: "\n\t[Gotthard2] Number of bursts left in acquisition. Only in burst auto\ + \ mode." + infer_action: true + template: true +bustest: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: executeBusTest + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: bustest + function_alias: bustest + help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Bus test, ie. Writes\ + \ different values in a R/W register and confirms the writes to check bus.\n\t\ + Advanced User function!" + infer_action: true + template: true +cdsgain: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getCDSGain + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setCDSGain + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: cdsgain + function_alias: cdsgain + help: "[0, 1]\n\t[Gotthard2] Enable or disable CDS gain. Default is disabled." + infer_action: true + template: true +chipversion: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getChipVersion + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: chipversion + function_alias: chipversion + help: "\n\t[Jungfrau] Returns chip version. Can be 1.0 or 1.1" + infer_action: true + template: true +clearbit: + actions: + PUT: + args: + - arg_types: + - uint32_t + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: StringTo(args[1]) < 0 || StringTo(args[1]) > 31 + message: '"Bit number out of range: " + args[1]' + function: clearBit + input: + - args[0] + - args[1] + input_types: + - uint32_t + - int + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: clearbit + function_alias: clearbit + help: "[reg address in hex] [bit index]\n\tClears bit in address." + infer_action: true + template: true +clearbusy: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: clearAcquiringFlag + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: false + store_result_in_t: false + command_name: clearbusy + function_alias: clearbusy + help: "\n\tIf acquisition aborted during acquire command, use this to clear acquiring\ + \ flag in shared memory before starting next acquisition" + infer_action: true + template: true +clearroi: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: clearROI + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: clearroi + function_alias: clearroi + help: '[Gotthard] Resets Region of interest in detector. All channels enabled. Default + is all channels enabled.' + infer_action: true + template: true +clientversion: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getClientVersion + input: [] + input_types: [] + output: + - t + require_det_id: false + store_result_in_t: true + command_name: clientversion + function_alias: clientversion + help: "\n\tClient software version" + infer_action: true +clkdiv: + actions: + GET: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: type != defs::GOTTHARD2 && type != defs::MYTHEN3 + message: '"clkdiv not implemented for this detector."' + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + function: getClockDivider + input: + - args[0] + input_types: + - int + output: + - args[0] + - ''' ''' + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: type != defs::GOTTHARD2 && type != defs::MYTHEN3 + message: '"clkdiv not implemented for this detector."' + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + function: setClockDivider + input: + - args[0] + - args[1] + input_types: + - int + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: clkdiv + function_alias: clkdiv + help: "[n_clock (0-5)] [n_divider]\n\t[Gotthard2][Mythen3] Clock Divider of clock\ + \ n_clock. Must be greater than 1." + infer_action: true +clkfreq: + actions: + GET: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: type != defs::GOTTHARD2 && type != defs::MYTHEN3 + message: '"clkfreq not implemented for this detector."' + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + function: getClockFrequency + input: + - args[0] + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: clkfreq + function_alias: clkfreq + help: "[n_clock (0-5)] [freq_in_Hz]\n\t[Gotthard2][Mythen3] Frequency of clock n_clock\ + \ in Hz. Use clkdiv to set frequency." + infer_action: true +clkphase: + actions: + GET: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: type != defs::GOTTHARD2 && type != defs::MYTHEN3 + message: '"clkphase not implemented for this detector."' + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + function: getClockPhase + input: + - args[0] + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - int + - special::deg + argc: 2 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: type != defs::GOTTHARD2 && type != defs::MYTHEN3 + message: '"clkphase not implemented for this detector."' + - condition: args[1] != "deg" + message: '"Cannot scan argument" + args[1] + ". Did you mean deg?"' + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + function: getClockPhaseinDegrees + input: + - args[0] + input_types: + - int + output: + - OutString(t) + - '" deg"' + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: type != defs::GOTTHARD2 && type != defs::MYTHEN3 + message: '"clkphase not implemented for this detector."' + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + function: setClockPhase + input: + - args[0] + - args[1] + input_types: + - int + - int + output: + - args[1] + require_det_id: true + store_result_in_t: false + - arg_types: + - int + - int + - special::deg + argc: 3 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: type != defs::GOTTHARD2 && type != defs::MYTHEN3 + message: '"clkphase not implemented for this detector."' + - condition: args[2] != "deg" + message: '"Cannot scan argument" + args[2] + ". Did you mean deg?"' + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + function: setClockPhaseinDegrees + input: + - args[0] + - args[1] + input_types: + - int + - int + output: + - args[1] + - '" "' + - args[2] + require_det_id: true + store_result_in_t: false + command_name: clkphase + function_alias: clkphase + help: "[n_clock (0-5)] [phase] [deg (optional)]\n\t[Gotthard2][Mythen3] Phase of\ + \ clock n_clock. If deg, then phase shift in degrees, else absolute phase shift\ + \ values." + infer_action: true +column: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getColumn + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setColumn + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: column + function_alias: column + help: "[value]\n\tSet Detector column (udp header) to value. \n\tGui uses it to\ + \ rearrange for complete image" + infer_action: true + template: true +compdisabletime: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getComparatorDisableTime + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getComparatorDisableTime + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setComparatorDisableTime + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + function: setComparatorDisableTime + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: compdisabletime + function_alias: compdisabletime + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau] Time before end of\ + \ exposure when comparator is disabled. It is only possible for chipv1.1." + infer_action: true + template: true +confadc: + actions: + GET: + args: + - arg_types: + - int + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: getADCConfiguration + input: + - args[0] + - args[1] + input_types: + - int + - int + output: + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: 3 + cast_input: + - true + - true + - true + check_det_id: false + convert_det_id: true + function: setADCConfiguration + input: + - args[0] + - args[1] + - args[2] + input_types: + - int + - int + - int + output: + - '''[''' + - args[0] + - '", "' + - args[1] + - '", "' + - ToStringHex( StringTo(args[2])) + - '"]"' + require_det_id: true + store_result_in_t: false + command_name: confadc + function_alias: confadc + help: "[chip index 0-9, -1 for all] [adc index 0-31, -1 for all] [7 bit configuration\ + \ value in hex]\n\t[Gotthard2] Sets configuration for specific chip and adc,\ + \ but configures 1 chip (all adcs for that chip) at a time." + infer_action: true +config: + actions: + PUT: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + function: loadConfig + input: + - args[0] + input_types: + - std::string + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: config + function_alias: config + help: "\n\tFrees shared memory before loading configuration file. Set up once." + infer_action: true + template: true +counters: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: counters + function_alias: counters + help: '' + infer_action: true + is_description: true +currentsource: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + - arg_types: + - bool + - special::currentSourceFix + - int + argc: 3 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + - arg_types: + - bool + - special::currentSourceFix + - int + - special::currentSourceLow + argc: 4 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: currentsource + function_alias: currentsource + help: '' + infer_action: true + is_description: true +dac: + actions: + GET: + args: + - arg_types: + - defs::dacIndex + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: '"Dac indices can only be used for chip test board. Use daclist + to get list of dac names for current detector."' + extra_variables: + - name: dacIndex + type: defs::dacIndex + value: '(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) + ? det->getDacIndex(args[0]) : StringTo(args[0])' + function: getDAC + input: + - dacIndex + - '"0"' + input_types: + - defs::dacIndex + - bool + output: + - args[0] + - ''' ''' + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - defs::dacIndex + - special::mv + argc: 2 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: '"Dac indices can only be used for chip test board. Use daclist + to get list of dac names for current detector."' + - condition: args[1] != "mv" && args[1] != "mV" + message: '"Unknown argument " + args[1] + ". Did you mean mV?"' + extra_variables: + - name: dacIndex + type: defs::dacIndex + value: '(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) + ? det->getDacIndex(args[0]) : StringTo(args[0])' + function: getDAC + input: + - dacIndex + - '"1"' + input_types: + - defs::dacIndex + - bool + output: + - args[0] + - ''' ''' + - OutString(t) + - '" mV"' + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::dacIndex + - int + argc: 2 + cast_input: + - false + - true + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: '"Dac indices can only be used for chip test board. Use daclist + to get list of dac names for current detector."' + extra_variables: + - name: dacIndex + type: defs::dacIndex + value: '(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) + ? det->getDacIndex(args[0]) : StringTo(args[0])' + function: setDAC + input: + - dacIndex + - args[1] + - '"0"' + input_types: + - defs::dacIndex + - int + - bool + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + - arg_types: + - defs::dacIndex + - int + - special::mv + argc: 3 + cast_input: + - false + - true + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: '"Dac indices can only be used for chip test board. Use daclist + to get list of dac names for current detector."' + extra_variables: + - name: dacIndex + type: defs::dacIndex + value: '(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) + ? det->getDacIndex(args[0]) : StringTo(args[0])' + function: setDAC + input: + - dacIndex + - args[1] + - '"1"' + input_types: + - defs::dacIndex + - int + - bool + output: + - args[0] + - ''' ''' + - args[1] + - '" mV"' + require_det_id: true + store_result_in_t: false + command_name: dac + function_alias: dac + help: 'code: return GetHelpDacWrapper(cmd, args); + + ' + infer_action: true +dacindex: + actions: + GET: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + extra_variables: + - name: index + type: defs::dacIndex + value: defs::DAC_0 + function: getDacIndex + input: + - args[0] + input_types: + - std::string + output: + - ToString(static_cast(t) - index) + require_det_id: false + store_result_in_t: true + command_name: dacindex + function_alias: dacindex + help: "[name] \n\t\t[ChipTestBoard] Get the dac index for the given name." + infer_action: true + template: true +daclist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: getDacNames + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: -1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: '"This detector already has fixed dac names. Cannot change them."' + function: setDacNames + input: + - args + input_types: + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: daclist + function_alias: daclist + help: "[dacname1 dacname2 .. dacname18] \n\t\t[ChipTestBoard] Set the list of dac\ + \ names for this detector.\n\t\t[All] Gets the list of dac names for every dac\ + \ for this detector." + infer_action: true + template: true +dacname: + actions: + GET: + args: + - arg_types: + - defs::dacIndex + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + extra_variables: + - name: index + type: defs::dacIndex + value: defs::DAC_0 + function: getDacName + input: + - static_cast(StringTo(args[0]) + index) + input_types: + - defs::dacIndex + output: + - args[0] + - ''' ''' + - t + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::dacIndex + - std::string + argc: 2 + cast_input: + - false + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + extra_variables: + - name: index + type: defs::dacIndex + value: defs::DAC_0 + function: setDacName + input: + - static_cast(StringTo(args[0]) + index) + - args[1] + input_types: + - defs::dacIndex + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: dacname + function_alias: dacname + help: "[0-17][name] \n\t\t[ChipTestBoard] Set the dac at the given position to the\ + \ given name." + infer_action: true + template: true +dacvalues: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + - arg_types: + - special::mv + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + command_name: dacvalues + function_alias: dacvalues + help: '' + infer_action: true + is_description: true +datastream: + actions: + GET: + args: + - arg_types: + - defs::portPosition + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: getDataStream + input: + - args[0] + input_types: + - defs::portPosition + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::portPosition + - bool + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: setDataStream + input: + - args[0] + - args[1] + input_types: + - defs::portPosition + - bool + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: datastream + function_alias: datastream + help: "[left|right] [0, 1]\n\t[Eiger] Enables or disables data streaming from left\ + \ or/and right side of detector for 10 GbE mode. 1 (enabled) by default." + infer_action: true +dbitclk: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDBITClock + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setDBITClock + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: dbitclk + function_alias: dbitclk + help: "[n_clk in MHz]\n\t[Ctb] Clock for latching the digital bits in MHz." + infer_action: true + template: true +dbitphase: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type + == defs::GOTTHARD2 || det_type == defs::MOENCH + message: '"dbitphase not implemented for this detector"' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + function: getDBITPhase + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::deg + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type + == defs::GOTTHARD2 || det_type == defs::MOENCH + message: '"dbitphase not implemented for this detector"' + - condition: args[0] != "deg" + message: '"Unknown dbitphase argument " + args[0] + ". Did you mean deg? "' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + function: getDBITPhaseInDegrees + input: [] + input_types: [] + output: + - OutString(t) + - '" deg"' + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type + == defs::GOTTHARD2 || det_type == defs::MOENCH + message: '"dbitphase not implemented for this detector"' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + function: setDBITPhase + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + - arg_types: + - int + - special::deg + argc: 2 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type + == defs::GOTTHARD2 || det_type == defs::MOENCH + message: '"dbitphase not implemented for this detector"' + - condition: args[1] != "deg" + message: '"Unknown dbitphase 2nd argument " + args[1] + ". Did you mean + deg? "' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); + function: setDBITPhaseInDegrees + input: + - args[0] + input_types: + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: dbitphase + function_alias: dbitphase + help: "[n_value] [(optional)deg]\n\t[Ctb][Jungfrau] Phase shift of clock to latch\ + \ digital bits. Absolute phase shift. If deg used, then shift in degrees. \n\t\ + [Ctb]Changing dbitclk also resets dbitphase and sets to previous values." + infer_action: true +dbitpipeline: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDBITPipeline + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setDBITPipeline + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: dbitpipeline + function_alias: dbitpipeline + help: "[n_value]\n\t[Ctb][Gotthard2] Pipeline of the clock for latching digital\ + \ bits.\n\t[Gotthard2] Options: 0-7\n\t[CTB] Options: 0-255" + infer_action: true + template: true +defaultdac: + actions: + GET: + args: + - arg_types: + - defs::dacIndex + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: getDefaultDac + input: + - args[0] + input_types: + - defs::dacIndex + output: + - args[0] + - ''' ''' + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - defs::dacIndex + - defs::detectorSettings + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: getDefaultDac + input: + - args[0] + - args[1] + input_types: + - defs::dacIndex + - defs::detectorSettings + output: + - args[0] + - ''' ''' + - args[1] + - ''' ''' + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::dacIndex + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: setDefaultDac + input: + - args[0] + - args[1] + input_types: + - defs::dacIndex + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + - arg_types: + - defs::dacIndex + - int + - defs::detectorSettings + argc: 3 + cast_input: + - true + - true + - true + check_det_id: false + convert_det_id: true + function: setDefaultDac + input: + - args[0] + - args[1] + - args[2] + input_types: + - defs::dacIndex + - int + - defs::detectorSettings + output: + - args[0] + - ''' ''' + - args[2] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: defaultdac + function_alias: defaultdac + help: "[dac name][value][(optional)setting]\n\tSets the default for that dac to\ + \ this value.\n\t[Jungfrau][Moench][Mythen3] When settings is provided, it sets\ + \ the default value only for that setting" + infer_action: true +defaultpattern: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: loadDefaultPattern + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: defaultpattern + function_alias: defaultpattern + help: "\n\t[Mythen3] Loads and runs default pattern in pattern generator. It is\ + \ to go back to initial settings." + infer_action: true + template: true +delay: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDelayAfterTrigger + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDelayAfterTrigger + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setDelayAfterTrigger + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + function: setDelayAfterTrigger + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: delay + function_alias: delay + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb][Moench]\ + \ Delay after trigger" + infer_action: true + template: true +delayl: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDelayAfterTriggerLeft + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDelayAfterTriggerLeft + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + command_name: delayl + function_alias: delayl + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Delay Left in Acquisition.\ + \ \n\t[Gotthard2] only in continuous mode." + infer_action: true + template: true +detectorserverversion: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDetectorServerVersion + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: detectorserverversion + function_alias: detectorserverversion + help: "\n\tOn-board detector server software version" + infer_action: true + template: true +detsize: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDetectorSize + input: [] + input_types: [] + output: + - t + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setDetectorSize + input: + - defs::xy(StringTo(args[0]),StringTo(args[1])) + input_types: + - defs::xy + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: detsize + function_alias: detsize + help: "[nx] [ny]\n\tDetector size, ie. Number of channels in x and y dim. This is\ + \ used to calculate module coordinates included in UDP data. \n\tBy default, it\ + \ adds module in y dimension for 2d detectors and in x dimension for 1d detectors\ + \ packet header." + infer_action: true +diodelay: + actions: + PUT: + args: + - arg_types: + - uint64_t + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: setDigitalIODelay + input: + - args[0] + - args[1] + input_types: + - uint64_t + - int + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: diodelay + function_alias: diodelay + help: "[0-775]\n\t[Ctb] Delay for diode. Delay is in ps and max of 775 ps. Resolution\ + \ is 25 ps." + infer_action: true +dpulse: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDigitalPulsing + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setDigitalPulsing + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: dpulse + function_alias: dpulse + help: "[0, 1]\n\t[Mythen3] Enables or disables digital pulsing. Default is disabled" + infer_action: true + template: true +dr: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDynamicRange + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setDynamicRange + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: dr + function_alias: dr + help: "[value]\n\tDynamic Range or number of bits per pixel in detector.\n\t[Eiger]\ + \ Options: 4, 8, 12, 16, 32. If set to 32, also sets clkdivider to 2, else to\ + \ 0.\n\t[Mythen3] Options: 8, 16, 32\n\t[Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2]\ + \ 16" + infer_action: true + template: true +drlist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDynamicRangeList + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + command_name: drlist + function_alias: drlist + help: "\n\tGets the list of dynamic ranges for this detector." + infer_action: true + template: true +dsamples: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfDigitalSamples + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setNumberOfDigitalSamples + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: dsamples + function_alias: dsamples + help: "[n_value]\n\t[CTB] Number of digital samples expected." + infer_action: true + template: true +execcommand: + actions: + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: execcommand + function_alias: execcommand + help: '' + infer_action: true + is_description: true +exptime: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getExptime + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getExptime + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + detectors: + MYTHEN3: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getExptimeForAllGates + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getExptimeForAllGates + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setExptime + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + function: setExptime + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: exptime + function_alias: exptime + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Eiger][Jungfrau][Moench][Gotthard][Gotthard2][Ctb]\ + \ Exposure time\n\t[Mythen3] Exposure time of all gate signals in auto and trigger\ + \ mode (internal gating). To specify gate index, use exptime1, exptime2, exptime3." + infer_action: true + template: true +exptime1: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 0 + function: getExptime + input: + - gateIndex + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 0 + function: getExptime + input: + - gateIndex + input_types: + - int + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 0 + function: setExptime + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + extra_variables: + - name: gateIndex + type: int + value: 0 + function: setExptime + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: exptime1 + function_alias: exptime1 + help: "[n_value]\n\t[Mythen3] Exposure time of gate signal 1 in auto and trigger\ + \ mode (internal gating)." + infer_action: true + template: true +exptime2: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 1 + function: getExptime + input: + - gateIndex + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 1 + function: getExptime + input: + - gateIndex + input_types: + - int + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 1 + function: setExptime + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + extra_variables: + - name: gateIndex + type: int + value: 1 + function: setExptime + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: exptime2 + function_alias: exptime2 + help: "[n_value]\n\t[Mythen3] Exposure time of gate signal 2 in auto and trigger\ + \ mode (internal gating)." + infer_action: true + template: true +exptime3: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 2 + function: getExptime + input: + - gateIndex + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 2 + function: getExptime + input: + - gateIndex + input_types: + - int + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 2 + function: setExptime + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + extra_variables: + - name: gateIndex + type: int + value: 2 + function: setExptime + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: exptime3 + function_alias: exptime3 + help: "[n_value]\n\t[Mythen3] Exposure time of gate signal 3 in auto and trigger\ + \ mode (internal gating)." + infer_action: true + template: true +exptimel: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getExptimeLeft + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getExptimeLeft + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + command_name: exptimel + function_alias: exptimel + help: "[(optional unit) ns|us|ms|s]\n\t[Gotthard] Exposure time left for current\ + \ frame. " + infer_action: true + template: true +extrastoragecells: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfAdditionalStorageCells + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setNumberOfAdditionalStorageCells + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: extrastoragecells + function_alias: extrastoragecells + help: "[0-15]\n\t[Jungfrau] Only for chipv1.0. Number of additional storage cells.\ + \ Default is 0. For advanced users only. \n\tThe #images = #frames x #triggers\ + \ x (#extrastoragecells + 1)." + infer_action: true + template: true +extsampling: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getExternalSampling + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setExternalSampling + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: extsampling + function_alias: extsampling + help: "[0, 1]\n\t[Ctb] Enable for external sampling signal for digital data to signal\ + \ by extsampling src command. For advanced users only." + infer_action: true + template: true +extsamplingsrc: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getExternalSamplingSource + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setExternalSamplingSource + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: extsamplingsrc + function_alias: extsamplingsrc + help: "[0-63]\n\t[Ctb] Sampling source signal for digital data. For advanced users\ + \ only." + infer_action: true + template: true +extsig: + actions: + GET: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: getExternalSignalFlags + input: + - args[0] + input_types: + - int + output: + - args[0] + - ''' ''' + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - defs::externalSignalFlag + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: setExternalSignalFlags + input: + - args[0] + - args[1] + input_types: + - int + - defs::externalSignalFlag + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: extsig + function_alias: extsig + help: "[n_signal] [signal_type]\n\t[Gotthard][Mythen3] External signal mode for\ + \ trigger timing mode.\n\t[Gotthard] [0] [trigger_in_rising_edge|trigger_in_falling_edge]\n\ + \t[Mythen3] [0-7] [trigger_in_rising_edge|trigger_in_falling_edge|inversion_on|inversion_off]\n\ + \t where 0 is master input trigger signal, 1-3 is master input gate signals, 4\ + \ is busy out signal and 5-7 is master output gate signals." + infer_action: true +fformat: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFileFormat + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::fileFormat + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setFileFormat + input: + - args[0] + input_types: + - defs::fileFormat + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: fformat + function_alias: fformat + help: "[binary|hdf5]\n\tFile format of data file. For HDF5, package must be compiled\ + \ with HDF5 flags. Default is binary." + infer_action: true + template: true +filtercells: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfFilterCells + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setNumberOfFilterCells + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: filtercells + function_alias: filtercells + help: "[0-12]\n\t[Jungfrau] Set Filter Cell. Only for chipv1.1. Advanced user Command" + infer_action: true + template: true +filterresistor: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFilterResistor + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setFilterResistor + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: filterresistor + function_alias: filterresistor + help: "[value] [Gotthard2][Jungfrau] Set filter resistor. Increasing values for\ + \ increasing resistance.\n\t[Gotthard2] Options: [0|1|2|3]. Default is 0.\n\t\ + [Jungfrau] Options: [0|1]. Default is 1." + infer_action: true + template: true +findex: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getAcquisitionIndex + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint64_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setAcquisitionIndex + input: + - args[0] + input_types: + - uint64_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: findex + function_alias: findex + help: "[n_value]\n\tFile or Acquisition index." + infer_action: true + template: true +firmwaretest: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: executeFirmwareTest + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: firmwaretest + function_alias: firmwaretest + help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Firmware test,\ + \ ie. reads a read fixed pattern from a register." + infer_action: true + template: true +firmwareversion: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFirmwareVersion + input: [] + input_types: [] + output: + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + detectors: + EIGER: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFirmwareVersion + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: firmwareversion + function_alias: firmwareversion + help: "\n\tFirmware version of detector in format [0xYYMMDD] or an increasing 2\ + \ digit number for Eiger." + infer_action: true +fliprows: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFlipRows + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setFlipRows + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: fliprows + function_alias: fliprows + help: "[0, 1]\n\t[Eiger] flips rows paramater sent to slsreceiver to stream as json\ + \ parameter to flip rows in gui \n\t[Jungfrau][Moench] flips rows in the detector\ + \ itself. For bottom module and number of interfaces must be set to 2. slsReceiver\ + \ and slsDetectorGui does not handle." + infer_action: true + template: true +flowcontrol10g: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTenGigaFlowControl + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTenGigaFlowControl + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: flowcontrol10g + function_alias: flowcontrol10g + help: "[0, 1]\n\t[Eiger][Jungfrau][Moench] 10GbE Flow Control." + infer_action: true + template: true +fmaster: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: getMasterFileWrite + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setMasterFileWrite + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: fmaster + function_alias: fmaster + help: "[0, 1]\n\tEnable or disable receiver master file. Default is 1." + infer_action: true + template: true +fname: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFileNamePrefix + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setFileNamePrefix + input: + - args[0] + input_types: + - std::string + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: fname + function_alias: fname + help: "[name]\n\tFile name prefix for output data file. Default is run. File name:\ + \ [file name prefix]_d[detector index]_f[sub file index]_[acquisition/file index].raw." + infer_action: true + template: true +foverwrite: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFileOverWrite + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setFileOverWrite + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: foverwrite + function_alias: foverwrite + help: "[0, 1]\n\tEnable or disable file overwriting. Default is 1." + infer_action: true + template: true +fpath: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFilePath + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setFilePath + input: + - args[0] + input_types: + - std::string + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: fpath + function_alias: fpath + help: "[path]\n\tDirectory where output data files are written in receiver. Default\ + \ is '/'. \n\tIf path does not exist, it will try to create it." + infer_action: true + template: true +framecounter: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfFramesFromStart + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: framecounter + function_alias: framecounter + help: "\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames from start\ + \ run control.\n\t[Gotthard2] only in continuous mode." + infer_action: true + template: true +frames: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfFrames + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int64_t + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setNumberOfFrames + input: + - args[0] + input_types: + - int64_t + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: frames + function_alias: frames + help: "[n_frames]\n\tNumber of frames per acquisition. In trigger mode, number of\ + \ frames per trigger. \n\tCannot be set in modular level. \n\tIn scan mode, number\ + \ of frames is set to number of steps.\n\t[Gotthard2] Burst mode has a maximum\ + \ of 2720 frames." + infer_action: true + template: true +framesl: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfFramesLeft + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: framesl + function_alias: framesl + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames\ + \ left in acquisition. \n\t[Gotthard2] only in continuous auto mode." + infer_action: true + template: true +frametime: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getMeasurementTime + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getMeasurementTime + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + command_name: frametime + function_alias: frametime + help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB]\ + \ Timestamp at a frame start.\n\t[Gotthard2] not in burst and auto mode." + infer_action: true + template: true +free: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: free + function_alias: free + help: '' + infer_action: true + is_description: true +fwrite: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFileWrite + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setFileWrite + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: fwrite + function_alias: fwrite + help: "[0, 1]\n\tEnable or disable receiver file write. Default is 1." + infer_action: true + template: true +gaincaps: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::defs::M3_GainCaps + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: gaincaps + function_alias: gaincaps + help: '' + infer_action: true + is_description: true +gainmode: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getGainMode + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::gainMode + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setGainMode + input: + - args[0] + input_types: + - defs::gainMode + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: gainmode + function_alias: gainmode + help: "[dynamicgain|forceswitchg1|forceswitchg2|fixg1|fixg2|fixg0]\n\t[Jungfrau]\ + \ Gain mode.\n\tCAUTION: Do not use fixg0 without caution, you can damage the\ + \ detector!!!" + infer_action: true + template: true +gappixels: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: getGapPixelsinCallback + input: [] + input_types: [] + output: + - t + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setGapPixelsinCallback + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: gappixels + function_alias: gappixels + help: "[0, 1]\n\t[Eiger][Jungfrau][Moench] Include Gap pixels in client data call\ + \ back in Detecor api. Will not be in detector streaming, receiver file or streaming.\ + \ Default is 0. " + infer_action: true +gatedelay: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getGateDelayForAllGates + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getGateDelayForAllGates + input: [] + input_types: [] + output: + - OutString(t, args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: -1 + function: setGateDelay + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + extra_variables: + - name: gateIndex + type: int + value: -1 + function: setGateDelay + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: gatedelay + function_alias: gatedelay + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Mythen3] Gate Delay of all gate\ + \ signals in auto and trigger mode (internal gating)." + infer_action: true +gatedelay1: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 0 + function: getGateDelay + input: + - gateIndex + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 0 + function: getGateDelay + input: + - gateIndex + input_types: + - int + output: + - OutString(t, args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 0 + function: setGateDelay + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + extra_variables: + - name: gateIndex + type: int + value: 0 + function: setGateDelay + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: gatedelay1 + function_alias: gatedelay1 + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Mythen3] Gate Delay of gate signal\ + \ 1 in auto and trigger mode (internal gating)." + infer_action: true +gatedelay2: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 1 + function: getGateDelay + input: + - gateIndex + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 1 + function: getGateDelay + input: + - gateIndex + input_types: + - int + output: + - OutString(t, args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 1 + function: setGateDelay + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + extra_variables: + - name: gateIndex + type: int + value: 1 + function: setGateDelay + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: gatedelay2 + function_alias: gatedelay2 + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Mythen3] Gate Delay of gate signal\ + \ 2 in auto and trigger mode (internal gating)." + infer_action: true +gatedelay3: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 2 + function: getGateDelay + input: + - gateIndex + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 2 + function: getGateDelay + input: + - gateIndex + input_types: + - int + output: + - OutString(t, args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: gateIndex + type: int + value: 2 + function: setGateDelay + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + extra_variables: + - name: gateIndex + type: int + value: 2 + function: setGateDelay + input: + - gateIndex + - converted_time + input_types: + - int + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: gatedelay3 + function_alias: gatedelay3 + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Mythen3] Gate Delay of gate signal\ + \ 3 in auto and trigger mode (internal gating)." + infer_action: true +gates: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfGates + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setNumberOfGates + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: gates + function_alias: gates + help: "[n_gates]\n\t[Mythen3] Number of external gates in gating or trigger_gating\ + \ mode (external gating)." + infer_action: true + template: true +getbit: + actions: + GET: + args: + - arg_types: + - uint32_t + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: StringTo(args[1]) < 0 || StringTo(args[1]) > 31 + message: '"Bit number out of range: " + args[1]' + function: getBit + input: + - args[0] + - args[1] + input_types: + - uint32_t + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: getbit + function_alias: getbit + help: "[reg address in hex] [bit index]\n\tGets bit in address." + infer_action: true +hardwareversion: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getHardwareVersion + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: hardwareversion + function_alias: hardwareversion + help: "\n\t[Jungfrau][Gotthard2][Myhten3][Gotthard][Ctb][Moench] Hardware version\ + \ of detector. \n\t[Eiger] Hardware version of front FPGA on detector." + infer_action: true + template: true +highvoltage: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getHighVoltage + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setHighVoltage + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: highvoltage + function_alias: highvoltage + help: "[n_value]\n\tHigh voltage to the sensor in Voltage. \n\t[Gotthard] [0|90|110|120|150|180|200]\ + \ \n\t[Eiger][Mythen3][Gotthard2] 0-200 \n\t[Jungfrau][Moench][Ctb] [0|60-200]" + infer_action: true + template: true +hostname: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: hostname + function_alias: hostname + help: '' + infer_action: true + is_description: true +im_a: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredCurrent + input: + - defs::I_POWER_A + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: im_a + function_alias: im_a + help: "\n\t[Ctb] Measured current of power supply a in mA." + infer_action: true + template: true +im_b: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredCurrent + input: + - defs::I_POWER_B + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: im_b + function_alias: im_b + help: "\n\t[Ctb] Measured current of power supply b in mA." + infer_action: true + template: true +im_c: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredCurrent + input: + - defs::I_POWER_C + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: im_c + function_alias: im_c + help: "\n\t[Ctb] Measured current of power supply c in mA." + infer_action: true + template: true +im_d: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredCurrent + input: + - defs::I_POWER_D + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: im_d + function_alias: im_d + help: "\n\t[Ctb] Measured current of power supply d in mA." + infer_action: true + template: true +im_io: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredCurrent + input: + - defs::I_POWER_IO + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: im_io + function_alias: im_io + help: "\n\t[Ctb] Measured current of power supply io in mA." + infer_action: true + template: true +imagetest: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getImageTestMode + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setImageTestMode + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: imagetest + function_alias: imagetest + help: "[0, 1]\n\t[Gotthard] 1 adds channel intensity with precalculated values when\ + \ taking an acquisition. Default is 0.\n\t[Eiger][Jungfrau][Moench] Only for Virtual\ + \ servers. If 0, each pixel intensity incremented by 1. If 1, all pixels almost\ + \ saturated." + infer_action: true + template: true +initialchecks: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: getInitialChecks + input: [] + input_types: [] + output: + - t + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setInitialChecks + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: initialchecks + function_alias: initialchecks + help: "[0, 1]\n\t[Mythen3][Gotthard2] Enable or disable intial compatibility and\ + \ other checks at detector start up. It is enabled by default. Must come before\ + \ 'hostname' command to take effect. Can be used to reprogram fpga when current\ + \ firmware is incompatible.\n\tAdvanced User function!" + infer_action: true +inj_ch: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getInjectChannel + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: setInjectChannel + input: + - args[0] + - args[1] + input_types: + - int + - int + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: inj_ch + function_alias: inj_ch + help: "[offset] [increment]\n\t[Gotthard2] Inject channels with current source for\ + \ calibration. Offset is starting channel that is injected, increment determines\ + \ succeeding channels to be injected." + infer_action: true +interpolation: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getInterpolation + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setInterpolation + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: interpolation + function_alias: interpolation + help: "[0, 1]\n\t[Mythen3] Enables or disables interpolation. Default is disabled.\ + \ Interpolation mode enables all counters and disables vth3. Disabling sets back\ + \ counter mask and vth3." + infer_action: true + template: true +interruptsubframe: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getInterruptSubframe + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setInterruptSubframe + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: interruptsubframe + function_alias: interruptsubframe + help: "[0, 1]\n\t[Eiger] 1 interrupts last subframe at required exposure time. 0\ + \ will wait for last sub frame to finish exposing. 0 is default." + infer_action: true + template: true +kernelversion: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getKernelVersion + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: kernelversion + function_alias: kernelversion + help: "\n\tGet kernel version on the detector including time and date." + infer_action: true + template: true +lastclient: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getLastClientIP + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: lastclient + function_alias: lastclient + help: "\n\tClient IP Address that last communicated with the detector." + infer_action: true + template: true +led: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getLEDEnable + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setLEDEnable + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: led + function_alias: led + help: "[0, 1]\n\t[Ctb] Switches on/off all LEDs." + infer_action: true + template: true +lock: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDetectorLock + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setDetectorLock + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: lock + function_alias: lock + help: "[0, 1]\n\tLock detector to one IP, 1: locks. Default is unlocked" + infer_action: true + template: true +master: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getMaster + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: false + function: setMaster + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: master + function_alias: master + help: "[0, 1]\n\t[Eiger][Gotthard2][Jungfrau][Moench] Sets (half) module to master\ + \ and other(s) to slaves.\n\t[Gotthard][Gotthard2][Mythen3][Eiger][Jungfrau][Moench]\ + \ Gets if the current (half) module is master." + infer_action: true + template: true +maxadcphaseshift: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getMaxADCPhaseShift + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: maxadcphaseshift + function_alias: maxadcphaseshift + help: "\n\t[Jungfrau][Moench][CTB] Absolute maximum Phase shift of ADC clock." + infer_action: true + template: true +maxclkphaseshift: + actions: + GET: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: type != defs::GOTTHARD2 && type != defs::MYTHEN3 + message: '"maxclkphaseshift not implemented for this detector."' + extra_variables: + - name: type + type: defs::detectorType + value: det->getDetectorType().squash(defs::GENERIC); + function: getMaxClockPhaseShift + input: + - args[0] + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: maxclkphaseshift + function_alias: maxclkphaseshift + help: "[n_clock (0-5)]\n\t[Gotthard2][Mythen3] Absolute Maximum Phase shift of clock\ + \ n_clock." + infer_action: true +maxdbitphaseshift: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getMaxDBITPhaseShift + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: maxdbitphaseshift + function_alias: maxdbitphaseshift + help: "\n\t[CTB][Jungfrau] Absolute maximum Phase shift of of the clock to latch\ + \ digital bits." + infer_action: true + template: true +measuredperiod: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getMeasuredPeriod + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getMeasuredPeriod + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + command_name: measuredperiod + function_alias: measuredperiod + help: "[(optional unit) ns|us|ms|s]\n\t[Eiger] Measured frame period between last\ + \ frame and previous one. Can be measured with minimum 2 frames in an acquisition." + infer_action: true + template: true +measuredsubperiod: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getMeasuredSubFramePeriod + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getMeasuredSubFramePeriod + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + command_name: measuredsubperiod + function_alias: measuredsubperiod + help: "[(optional unit) ns|us|ms|s]\n\t[Eiger] Measured sub frame period between\ + \ last sub frame and previous one." + infer_action: true + template: true +moduleid: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getModuleId + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: moduleid + function_alias: moduleid + help: "\n\t[Gotthard2][Eiger][Mythen3][Jungfrau][Moench] 16 bit value (ideally unique)\ + \ that is streamed out in the UDP header of the detector. Picked up from a file\ + \ on the module." + infer_action: true + template: true +nextframenumber: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNextFrameNumber + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint64_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setNextFrameNumber + input: + - args[0] + input_types: + - uint64_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: nextframenumber + function_alias: nextframenumber + help: "[n_value]\n\t[Eiger][Jungfrau][Moench][CTB] Next frame number. Stopping acquisition\ + \ might result in different frame numbers for different modules." + infer_action: true + template: true +nmod: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: size + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + command_name: nmod + function_alias: nmod + help: "\n\tNumber of modules in shared memory." + infer_action: true + template: true +numinterfaces: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberofUDPInterfaces + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setNumberofUDPInterfaces + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: numinterfaces + function_alias: numinterfaces + help: "[1, 2]\n\t[Jungfrau][Moench] Number of udp interfaces to stream data from\ + \ detector. Default: 1.\n\tAlso enables second interface in receiver for listening\ + \ (Writes a file per interface if writing enabled).\n\tAlso restarts client and\ + \ receiver zmq sockets if zmq streaming enabled.\n\t[Eiger] Only gets with result\ + \ 2." + infer_action: true + template: true +overflow: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getOverFlowMode + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setOverFlowMode + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: overflow + function_alias: overflow + help: "[0, 1]\n\t[Eiger] Enable or disable show overflow flag in 32 bit mode. Default\ + \ is disabled." + infer_action: true + template: true +packageversion: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPackageVersion + input: [] + input_types: [] + output: + - t + require_det_id: false + store_result_in_t: true + command_name: packageversion + function_alias: packageversion + help: "\n\tPackage version." + infer_action: true +parallel: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getParallelMode + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setParallelMode + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: parallel + function_alias: parallel + help: "[0, 1]\n\t[Eiger][Mythen3][Gotthard2][Moench] Enable or disable parallel\ + \ mode.\n\t[Mythen3] If exptime is too short, the acquisition will return ERROR\ + \ status and take fewer frames than expected.\n\t[Mythen3][Eiger][Moench] Default:\ + \ Non parallel.\n\t[Gotthard2] Default: Parallel. Non parallel mode works only\ + \ in continuous mode." + infer_action: true + template: true +parameters: + actions: + PUT: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + function: loadParameters + input: + - args[0] + input_types: + - std::string + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: parameters + function_alias: parameters + help: "\n\tSets detector measurement parameters to those contained in fname. Set\ + \ up per measurement." + infer_action: true + template: true +partialreset: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPartialReset + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setPartialReset + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: partialreset + function_alias: partialreset + help: "[0, 1]\n\t[Eiger] Sets up detector to do partial or complete reset at start\ + \ of acquisition. 0 complete reset, 1 partial reset. Default is complete reset.\ + \ Advanced function!" + infer_action: true + template: true +patfname: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPatterFileName + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: patfname + function_alias: patfname + help: "\n\t[Ctb][Mythen3] Gets the pattern file name including path of the last\ + \ pattern uploaded. Returns an empty if nothing was uploaded or via a server default\ + \ file" + infer_action: true + template: true +patioctrl: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPatternIOControl + input: [] + input_types: [] + output: + - OutStringHex(t, 16) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint64_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setPatternIOControl + input: + - args[0] + input_types: + - uint64_t + output: + - ToStringHex(arg0, 16) + require_det_id: true + store_result_in_t: false + command_name: patioctrl + function_alias: patioctrl + help: "[64 bit mask]\n\t[Ctb] 64 bit mask defining input (0) and output (1) signals." + infer_action: true + template: true +patlimits: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: getPatternLoopAddresses + input: + - '"-1"' + input_types: + - int + output: + - OutStringHex(t, 4) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: -1 + cast_input: + - true + - true + - true + check_det_id: false + convert_det_id: true + function: setPatternLoopAddresses + input: + - '"-1"' + - args[0] + - args[1] + input_types: + - int + - int + - int + output: + - '''[''' + - ToStringHex(arg1, 4) + - '", "' + - ToStringHex(arg2, 4) + - ''']''' + require_det_id: true + store_result_in_t: false + command_name: patlimits + function_alias: patlimits + help: "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of complete pattern" + infer_action: true +patloop: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternLoopAddresses + input: + - level + input_types: + - int + output: + - level + - ''' ''' + - OutStringHex(t, 4) + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: -1 + cast_input: + - false + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: start + type: int + value: StringTo(args[iArg++]) + - name: stop + type: int + value: StringTo(args[iArg++]) + function: setPatternLoopAddresses + input: + - level + - start + - stop + input_types: + - int + - int + - int + output: + - level + - ''' ''' + - '''[''' + - ToStringHex(start, 4) + - '", "' + - ToStringHex(stop, 4) + - ''']''' + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + store_result_in_t: false + command_name: patloop + function_alias: patloop + help: "[0-6] [start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of the loop level\ + \ provided.\n\t[Mythen3] Level options: 0-3 only." + infer_action: true +patloop0: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternLoopAddresses + input: + - level + input_types: + - int + output: + - OutStringHex(t, 4) + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: -1 + cast_input: + - false + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: start + type: int + value: StringTo(args[iArg++]) + - name: stop + type: int + value: StringTo(args[iArg++]) + function: setPatternLoopAddresses + input: + - level + - start + - stop + input_types: + - int + - int + - int + output: + - '''[''' + - ToStringHex(start, 4) + - '", "' + - ToStringHex(stop, 4) + - ''']''' + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + store_result_in_t: false + command_name: patloop0 + function_alias: patloop0 + help: Depreciated command. Use patloop. + infer_action: true +patloop1: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternLoopAddresses + input: + - level + input_types: + - int + output: + - OutStringHex(t, 4) + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: -1 + cast_input: + - false + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: start + type: int + value: StringTo(args[iArg++]) + - name: stop + type: int + value: StringTo(args[iArg++]) + function: setPatternLoopAddresses + input: + - level + - start + - stop + input_types: + - int + - int + - int + output: + - '''[''' + - ToStringHex(start, 4) + - '", "' + - ToStringHex(stop, 4) + - ''']''' + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + store_result_in_t: false + command_name: patloop1 + function_alias: patloop1 + help: Depreciated command. Use patloop. + infer_action: true +patloop2: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternLoopAddresses + input: + - level + input_types: + - int + output: + - OutStringHex(t, 4) + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: -1 + cast_input: + - false + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: start + type: int + value: StringTo(args[iArg++]) + - name: stop + type: int + value: StringTo(args[iArg++]) + function: setPatternLoopAddresses + input: + - level + - start + - stop + input_types: + - int + - int + - int + output: + - '''[''' + - ToStringHex(start, 4) + - '", "' + - ToStringHex(stop, 4) + - ''']''' + pattern_command: + command_name: patloop + nGetArgs: 0 + nPutArgs: 2 + require_det_id: true + store_result_in_t: false + command_name: patloop2 + function_alias: patloop2 + help: Depreciated command. Use patloop. + infer_action: true +patmask: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPatternMask + input: [] + input_types: [] + output: + - OutStringHex(t, 16) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint64_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setPatternMask + input: + - args[0] + input_types: + - uint64_t + output: + - ToStringHex(arg0, 16) + require_det_id: true + store_result_in_t: false + command_name: patmask + function_alias: patmask + help: "[64 bit mask]\n\t[Ctb][Mythen3] Selects the bits that will have a pattern\ + \ mask applied to the selected patmask for every pattern." + infer_action: true + template: true +patnloop: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternLoopCycles + input: + - level + input_types: + - int + output: + - level + - ''' ''' + - OutString(t) + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + extra_variables: + - name: nloops + type: std::string + value: args[iArg++] + function: setPatternLoopCycles + input: + - level + - nloops + input_types: + - int + - int + output: + - level + - ''' ''' + - nloops + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patnloop + function_alias: patnloop + help: "[0-6] [n_cycles] \n\t[Ctb][Mythen3] Number of cycles of the loop level provided.\n\ + \t[Mythen3] Level options: 0-3 only." + infer_action: true +patnloop0: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternLoopCycles + input: + - level + input_types: + - int + output: + - OutString(t) + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + extra_variables: + - name: nloops + type: std::string + value: args[iArg++] + function: setPatternLoopCycles + input: + - level + - nloops + input_types: + - int + - int + output: + - nloops + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patnloop0 + function_alias: patnloop0 + help: Depreciated command. Use patnloop. + infer_action: true +patnloop1: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternLoopCycles + input: + - level + input_types: + - int + output: + - OutString(t) + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + extra_variables: + - name: nloops + type: std::string + value: args[iArg++] + function: setPatternLoopCycles + input: + - level + - nloops + input_types: + - int + - int + output: + - nloops + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patnloop1 + function_alias: patnloop1 + help: Depreciated command. Use patnloop. + infer_action: true +patnloop2: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternLoopCycles + input: + - level + input_types: + - int + output: + - OutString(t) + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + extra_variables: + - name: nloops + type: std::string + value: args[iArg++] + function: setPatternLoopCycles + input: + - level + - nloops + input_types: + - int + - int + output: + - nloops + pattern_command: + command_name: patnloop + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patnloop2 + function_alias: patnloop2 + help: Depreciated command. Use patnloop. + infer_action: true +patsetbit: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPatternBitMask + input: [] + input_types: [] + output: + - OutStringHex(t, 16) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint64_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setPatternBitMask + input: + - args[0] + input_types: + - uint64_t + output: + - ToStringHex(arg0, 16) + require_det_id: true + store_result_in_t: false + command_name: patsetbit + function_alias: patsetbit + help: "[64 bit mask]\n\t[Ctb][Mythen3] Sets the mask applied to every pattern to\ + \ the selected bits." + infer_action: true + template: true +patternX: + actions: + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setPattern + input: + - args[0] + input_types: + - std::string + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: pattern + function_alias: pattern + help: "[fname]\n\t[Mythen3][Ctb] Loads ASCII pattern file directly to server (instead\ + \ of executing line by line)" + infer_action: true +patternstart: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: startPattern + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: patternstart + function_alias: patternstart + help: "\n\t[Mythen3] Starts Pattern" + infer_action: true + template: true +patwait: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternWaitAddr + input: + - level + input_types: + - int + output: + - level + - ''' ''' + - OutStringHex(t, 4) + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: addr + type: int + value: StringTo(args[iArg++]) + function: setPatternWaitAddr + input: + - level + - addr + input_types: + - int + - int + output: + - level + - ''' ''' + - ToStringHex(addr, 4) + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patwait + function_alias: patwait + help: "[0-6] [addr] \n\t[Ctb][Mythen3] Wait address for loop level provided. \n\t\ + [Mythen3] Level options: 0-3 only." + infer_action: true +patwait0: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternWaitAddr + input: + - level + input_types: + - int + output: + - OutStringHex(t, 4) + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: addr + type: int + value: StringTo(args[iArg++]) + function: setPatternWaitAddr + input: + - level + - addr + input_types: + - int + - int + output: + - ToStringHex(addr, 4) + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patwait0 + function_alias: patwait0 + help: Depreciated command. Use patwait. + infer_action: true +patwait1: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternWaitAddr + input: + - level + input_types: + - int + output: + - OutStringHex(t, 4) + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: addr + type: int + value: StringTo(args[iArg++]) + function: setPatternWaitAddr + input: + - level + - addr + input_types: + - int + - int + output: + - ToStringHex(addr, 4) + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patwait1 + function_alias: patwait1 + help: Depreciated command. Use patwait. + infer_action: true +patwait2: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternWaitAddr + input: + - level + input_types: + - int + output: + - OutStringHex(t, 4) + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: addr + type: int + value: StringTo(args[iArg++]) + function: setPatternWaitAddr + input: + - level + - addr + input_types: + - int + - int + output: + - ToStringHex(addr, 4) + pattern_command: + command_name: patwait + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patwait2 + function_alias: patwait2 + help: Depreciated command. Use patwait. + infer_action: true +patwaittime: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternWaitTime + input: + - level + input_types: + - int + output: + - level + - ''' ''' + - OutString(t) + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: waittime + type: uint64_t + value: StringTo(args[iArg++]) + function: setPatternWaitTime + input: + - level + - waittime + input_types: + - int + - int + output: + - level + - ''' ''' + - waittime + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patwaittime + function_alias: patwaittime + help: "[0-6] [n_clk] \n\t[Ctb][Mythen3] Wait time in clock cycles for the loop provided.\n\ + \t[Mythen3] Level options: 0-3 only." + infer_action: true +patwaittime0: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternWaitTime + input: + - level + input_types: + - int + output: + - OutString(t) + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: waittime + type: uint64_t + value: StringTo(args[iArg++]) + function: setPatternWaitTime + input: + - level + - waittime + input_types: + - int + - int + output: + - waittime + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patwaittime0 + function_alias: patwaittime0 + help: Depreciated command. Use patwaittime. + infer_action: true +patwaittime1: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternWaitTime + input: + - level + input_types: + - int + output: + - OutString(t) + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: waittime + type: uint64_t + value: StringTo(args[iArg++]) + function: setPatternWaitTime + input: + - level + - waittime + input_types: + - int + - int + output: + - waittime + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patwaittime1 + function_alias: patwaittime1 + help: Depreciated command. Use patwaittime. + infer_action: true +patwaittime2: + actions: + GET: + args: + - arg_types: + - int + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPatternWaitTime + input: + - level + input_types: + - int + output: + - OutString(t) + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: -1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: waittime + type: uint64_t + value: StringTo(args[iArg++]) + function: setPatternWaitTime + input: + - level + - waittime + input_types: + - int + - int + output: + - waittime + pattern_command: + command_name: patwaittime + nGetArgs: 0 + nPutArgs: 1 + require_det_id: true + store_result_in_t: false + command_name: patwaittime2 + function_alias: patwaittime2 + help: Depreciated command. Use patwaittime. + infer_action: true +patword: + actions: + GET: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: getPatternWord + input: + - args[0] + input_types: + - int + output: + - '''[''' + - ToStringHex(arg0, 4) + - '", "' + - OutStringHex(t, 16) + - '"]"' + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - uint64_t + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: setPatternWord + input: + - args[0] + - args[1] + input_types: + - int + - uint64_t + output: + - '''[''' + - ToStringHex(arg0, 4) + - '", "' + - ToStringHex(arg1, 16) + - '"]"' + require_det_id: true + store_result_in_t: false + command_name: patword + function_alias: patword + help: "[step or address] [64 bit mask]\n\t[Ctb][Mythen3] 64 bit pattern at address\ + \ of pattern memory.\n\t[Ctb] read is same as executing pattern" + infer_action: true +pedestalmode: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPedestalMode + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - special::pedestal_parameters + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + exceptions: + - condition: args[0] != "0" + message: '"Unknown argument " + args[0] + ". Did you mean 0 to disable pedestal + mode?"' + function: setPedestalMode + input: + - defs::pedestalParameters() + input_types: + - defs::pedestalParameters + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + - arg_types: + - uint8_t + - uint16_t + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setPedestalMode + input: + - defs::pedestalParameters(StringTo(args[0]), StringTo(args[1])) + input_types: + - defs::pedestalParameters + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: pedestalmode + function_alias: pedestalmode + help: " [frames] [loops]\n\t\t[Jungfrau] Enable pedestal mode.\ + \ \n\t\tThe number of frames or triggers is overwritten by: \n\t\t(#pedestal_frames\ + \ x #pedestal_loops x 2). \n\t\tIn auto timing mode or in trigger mode with #frames\ + \ > 1, \n\t\t#frames is overwritten and #triggers = 1, \n\t\telse #triggers is\ + \ overwritten and #frames = 1. \n\t\tOne cannot set #frames, #triggers or timing\ + \ mode in pedestal mode (exception thrown).\n\npedestalmode [0]\n\t\t[Jungfrau]\ + \ Disable pedestal mode.\n\t\tDisabling pedestal mode will set back the normal\ + \ mode values of #frames and #triggers." + infer_action: true +period: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPeriod + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPeriod + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setPeriod + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + function: setPeriod + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: period + function_alias: period + help: "[duration] [(optional unit) ns|us|ms|s]\n\tPeriod between frames" + infer_action: true + template: true +periodl: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPeriodLeft + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPeriodLeft + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + command_name: periodl + function_alias: periodl + help: "\n\t[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Period left for\ + \ current frame. \n\t[Gotthard2] only in continuous mode." + infer_action: true + template: true +polarity: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPolarity + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::polarity + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setPolarity + input: + - args[0] + input_types: + - defs::polarity + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: polarity + function_alias: polarity + help: "[pos|neg]\n\t[Mythen3] Sets negative or positive polarity. Default is positive" + infer_action: true + template: true +port: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getControlPort + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint16_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setControlPort + input: + - args[0] + input_types: + - uint16_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: port + function_alias: port + help: "[n]\n\tPort number of the control server on detector for detector-client\ + \ tcp interface. Default is 1952. Normally unchanged. Set different ports for\ + \ virtual servers on same pc." + infer_action: true + template: true +powerchip: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPowerChip + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setPowerChip + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: powerchip + function_alias: powerchip + help: "[0, 1]\n\t[Jungfrau][Moench][Mythen3][Gotthard2] Power the chip. \n\t[Jungfrau][Moench]\ + \ Default is 0. Get will return power status. Can be off if temperature event\ + \ occured (temperature over temp_threshold with temp_control enabled. Will configure\ + \ chip (only chip v1.1)\n\t[Mythen3][Gotthard2] Default is 1. If module not connected\ + \ or wrong module, powerchip will fail." + infer_action: true + template: true +powerindex: + actions: + GET: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + extra_variables: + - name: index + type: defs::dacIndex + value: defs::V_POWER_A + function: getPowerIndex + input: + - args[0] + input_types: + - std::string + output: + - ToString(static_cast(t) - index) + require_det_id: false + store_result_in_t: true + command_name: powerindex + function_alias: powerindex + help: "[name] \n\t\t[ChipTestBoard] Get the power index for the given name." + infer_action: true + template: true +powerlist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: getPowerNames + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: -1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: '"This detector already has fixed dac names. Cannot change them."' + function: setPowerNames + input: + - args + input_types: + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: powerlist + function_alias: powerlist + help: "[powername1 powername2 .. powername4] \n\t\t[ChipTestBoard] Set the list\ + \ of power names for this board." + infer_action: true + template: true +powername: + actions: + GET: + args: + - arg_types: + - defs::dacIndex + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + extra_variables: + - name: index + type: defs::dacIndex + value: defs::V_POWER_A + function: getPowerName + input: + - static_cast(StringTo(args[0]) + index) + input_types: + - defs::dacIndex + output: + - args[0] + - ''' ''' + - t + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::dacIndex + - std::string + argc: 2 + cast_input: + - false + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + extra_variables: + - name: index + type: defs::dacIndex + value: defs::V_POWER_A + function: setPowerName + input: + - static_cast(StringTo(args[0]) + index) + - args[1] + input_types: + - defs::dacIndex + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: powername + function_alias: powername + help: "[0-4][name] \n\t\t[ChipTestBoard] Set the power at the given position to\ + \ the given name." + infer_action: true + template: true +powervalues: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + ctb_output_list: + GETFCN: getPower + GETFCNLIST: getPowerList + GETFCNNAME: getPowerNames + printable_name: '*name_it++' + suffix: mV + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + command_name: powervalues + function_alias: powervalues + help: "[name] \n\t\t[ChipTestBoard] Get values of all powers." + infer_action: true +programfpga: + actions: + PUT: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: programFPGA + input: + - args[0] + - '"0"' + input_types: + - std::string + - bool + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + - arg_types: + - special::path + - special::force-delete-normal-file + argc: 2 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: args[1] != "--force-delete-normal-file" + message: '"Could not scan second argument. Did you mean --force-delete-normal-file?"' + function: programFPGA + input: + - args[0] + - '"1"' + input_types: + - std::string + - bool + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: programfpga + function_alias: programfpga + help: "[fname.pof | fname.rbf (full path)][(opitonal)--force-delete-normal-file]\n\ + \t[Jungfrau][Moench][Ctb] Programs FPGA from pof file (full path). Then, detector\ + \ controller is rebooted. \n\t\tUse --force-delete-normal-file argument, if normal\ + \ file found in device tree, it must be deleted, a new device drive created and\ + \ programming continued.\n\t[Mythen3][Gotthard2] Programs FPGA from rbf file (full\ + \ path). Then, detector controller is rebooted." + infer_action: true +pulse: + actions: + PUT: + args: + - arg_types: + - int + - int + - int + argc: 3 + cast_input: + - true + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: c + type: defs::xy + value: defs::xy(StringTo(args[1]), StringTo(args[2])) + function: pulsePixel + input: + - args[0] + - c + input_types: + - int + - defs::xy + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: pulse + function_alias: pulse + help: "[n_times] [x] [y]\n\t[Eiger] Pulse pixel n number of times at coordinates\ + \ (x, y). Advanced User!" + infer_action: true + template: true +pulsechip: + actions: + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: pulseChip + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: pulsechip + function_alias: pulsechip + help: "[n_times] \n\t[Eiger] Pulse chip n times. If n is -1, resets to normal mode\ + \ (reset chip completely at start of acquisition, where partialreset = 0). Advanced\ + \ User!" + infer_action: true +pulsenmove: + actions: + PUT: + args: + - arg_types: + - int + - int + - int + argc: 3 + cast_input: + - true + - false + check_det_id: false + convert_det_id: true + extra_variables: + - name: c + type: defs::xy + value: defs::xy(StringTo(args[1]), StringTo(args[2])) + function: pulsePixelNMove + input: + - args[0] + - c + input_types: + - int + - defs::xy + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: pulsenmove + function_alias: pulsenmove + help: "[n_times] [x] [y]\n\t[Eiger] Pulse pixel n number of times and moves relatively\ + \ by (x, y). Advanced User!" + infer_action: true + template: true +pumpprobe: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPumpProbe + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setPumpProbe + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: pumpprobe + function_alias: pumpprobe + help: "[0, 1]\n\t[Mythen3] Enables or disables pump probe mode. Default is disabled.\ + \ Pump probe mode only enables vth2. Disabling sets back to previous value." + infer_action: true + template: true +quad: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getQuad + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setQuad + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: quad + function_alias: quad + help: "[0, 1]\n\t[Eiger] Sets detector size to a quad. 0 (disabled) is default.\ + \ (Specific hardware required)." + infer_action: true +ratecorr: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: ratecorr + function_alias: ratecorr + help: '' + infer_action: true + is_description: true +readnrows: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getReadNRows + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setReadNRows + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: readnrows + function_alias: readnrows + help: "\n\t[1-256]\n\t\t[Eiger] Number of rows to readout per half module starting\ + \ from the centre. Options: 0 - 256. 256 is default. The permissible values depend\ + \ on dynamic range and 10Gbe enabled.\n\t[8-512 (multiple of 8)]\n\t\t[Jungfrau]\ + \ Number of rows per module starting from the centre. Options: 8 - 512, must be\ + \ multiples of 8. Default is 512.\n\t\t[Moench] Number of rows per module starting\ + \ from the centre. Options:16 - 400, must be multiples of 16. Default is 400." + infer_action: true + template: true +readout: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: startDetectorReadout + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: false + store_result_in_t: false + command_name: readout + function_alias: readout + help: "\n\t[Mythen3] Starts detector readout. Status changes to TRANSMITTING and\ + \ automatically returns to idle at the end of readout." + infer_action: true + template: true +readoutspeed: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() == defs::CHIPTESTBOARD + message: '"ReadoutSpeed not implemented. Did you mean runclk?"' + function: getReadoutSpeed + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::speedLevel + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() == defs::CHIPTESTBOARD + message: '"ReadoutSpeed not implemented. Did you mean runclk?"' + function: setReadoutSpeed + input: + - args[0] + input_types: + - defs::speedLevel + output: + - ToString(StringTo(args[0])) + require_det_id: true + store_result_in_t: false + command_name: readoutspeed + function_alias: readoutspeed + help: "\n\t[0 or full_speed|1 or half_speed|2 or quarter_speed]\n\t[Eiger][Jungfrau][Moench]\ + \ Readout speed of chip.\n\t[Eiger][Moench] Default speed is full_speed.\n\t[Jungfrau]\ + \ Default speed is half_speed. full_speed option only available from v2.0 boards\ + \ and is recommended to set number of interfaces to 2. Also overwrites adcphase\ + \ to recommended default.\n\t [144|108]\n\t\t[Gotthard2] Readout speed of chip\ + \ in MHz. Default is 108." + infer_action: true +readoutspeedlist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getReadoutSpeedList + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + command_name: readoutspeedlist + function_alias: readoutspeedlist + help: "\n\tList of readout speed levels implemented for this detector." + infer_action: true + template: true +rebootcontroller: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: rebootController + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: rebootcontroller + function_alias: rebootcontroller + help: "\n\t[Jungfrau][Moench][Ctb][Gotthard][Mythen3][Gotthard2] Reboot controller\ + \ of detector." + infer_action: true + template: true +reg: + actions: + GET: + args: + - arg_types: + - uint32_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: readRegister + input: + - args[0] + input_types: + - uint32_t + output: + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint32_t + - uint32_t + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: writeRegister + input: + - args[0] + - args[1] + input_types: + - uint32_t + - uint32_t + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: reg + function_alias: reg + help: "[address] [32 bit value]\n\t[Mythen3][Gotthard2] Reads/writes to a 32 bit\ + \ register in hex. Advanced Function!\n\tGoes to stop server. Hence, can be called\ + \ while calling blocking acquire().\n\t[Eiger] +0x100 for only left, +0x200 for\ + \ only right." + infer_action: true +resetdacs: + actions: + PUT: + args: + - arg_types: + - special::hard + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + exceptions: + - condition: args[0] != "hard" + message: '"Unknown argument " + args[0] + ". Did you mean hard?"' + function: resetToDefaultDacs + input: + - '"1"' + input_types: + - bool + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: resetToDefaultDacs + input: + - '"0"' + input_types: + - bool + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: resetdacs + function_alias: resetdacs + help: "[(optional) hard] \n\t[Eiger][Jungfrau][Moench][Gotthard][Gotthard2][Mythen3]Reset\ + \ dac values to the defaults. A 'hard' optional reset will reset the dacs to the\ + \ hardcoded defaults in on-board detector server." + infer_action: true +resetfpga: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: resetFPGA + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: resetfpga + function_alias: resetfpga + help: "\n\t[Jungfrau][Moench][Ctb] Reset FPGA." + infer_action: true + template: true +roi: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getROI + input: [] + input_types: [] + output: + - t + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: false + exceptions: + - condition: det_id == -1 && det->size() > 1 + message: '"Cannot execute ROI at multi module level"' + extra_variables: + - name: t + type: defs::ROI + value: defs::ROI(StringTo(args[0]), StringTo(args[1])) + function: setROI + input: + - t + input_types: + - defs::ROI + output: + - t + require_det_id: true + store_result_in_t: false + command_name: roi + function_alias: roi + help: "[xmin] [xmax] \n\t[Gotthard] Region of interest in detector.\n\tOptions:\ + \ Only a single ROI per module. \n\tEither all channels or a single adc or 2 chips\ + \ (256 channels). Default is all channels enabled (-1 -1). " + infer_action: true +romode: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getReadoutMode + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::readoutMode + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setReadoutMode + input: + - args[0] + input_types: + - defs::readoutMode + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: romode + function_alias: romode + help: "[analog|digital|analog_digital|transceiver|digital_transceiver]\n\t[CTB]\ + \ Readout mode. Default is analog." + infer_action: true + template: true +row: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRow + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRow + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: row + function_alias: row + help: "[value]\n\tSet Detector row (udp header) to value. \n\tGui uses it to rearrange\ + \ for complete image" + infer_action: true + template: true +runclk: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRUNClock + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRUNClock + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: runclk + function_alias: runclk + help: "[n_clk in MHz]\n\t[Ctb] Run clock in MHz." + infer_action: true + template: true +runtime: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getActualTime + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getActualTime + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + command_name: runtime + function_alias: runtime + help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB]\ + \ Time from detector start up.\n\t[Gotthard2] not in burst and auto mode." + infer_action: true + template: true +rx_arping: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxArping + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxArping + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_arping + function_alias: rx_arping + help: "[0, 1]\n\tStarts a thread in slsReceiver to arping the interface it is listening\ + \ to every minute. Useful in 10G mode." + infer_action: true + template: true +rx_clearroi: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: clearRxROI + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: false + store_result_in_t: false + command_name: rx_clearroi + function_alias: rx_clearroi + help: Resets Region of interest in receiver. Default is all channels/pixels enabled. + infer_action: true + template: true +rx_dbitlist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: rx_dbitlist + function_alias: rx_dbitlist + help: '' + infer_action: true + is_description: true +rx_dbitoffset: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxDbitOffset + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxDbitOffset + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_dbitoffset + function_alias: rx_dbitoffset + help: "[n_bytes]\n\t[Ctb] Offset in bytes in digital data to skip in receiver." + infer_action: true + template: true +rx_discardpolicy: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxFrameDiscardPolicy + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::frameDiscardPolicy + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxFrameDiscardPolicy + input: + - args[0] + input_types: + - defs::frameDiscardPolicy + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_discardpolicy + function_alias: rx_discardpolicy + help: "[nodiscard (default)|discardempty|discardpartial(fastest)]\n\tFrame discard\ + \ policy of receiver. nodiscard does not discard frames, discardempty discards\ + \ empty frames, discardpartial discards partial frames." + infer_action: true + template: true +rx_fifodepth: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxFifoDepth + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxFifoDepth + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_fifodepth + function_alias: rx_fifodepth + help: "[n_frames]\n\tSet the number of frames in the receiver fifo depth (buffer\ + \ between listener and writer threads)." + infer_action: true + template: true +rx_frameindex: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxCurrentFrameIndex + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: rx_frameindex + function_alias: rx_frameindex + help: "\n\tCurrent frame index received for each port in receiver during acquisition." + infer_action: true + template: true +rx_framescaught: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFramesCaught + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: rx_framescaught + function_alias: rx_framescaught + help: "\n\tNumber of frames caught by each port in receiver." + infer_action: true + template: true +rx_framesperfile: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFramesPerFile + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setFramesPerFile + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_framesperfile + function_alias: rx_framesperfile + help: "[n_frames]\n\tNumber of frames per file in receiver in an acquisition. Default\ + \ depends on detector type. 0 is infinite or all frames in single file." + infer_action: true + template: true +rx_hostname: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: rx_hostname + function_alias: rx_hostname + help: '' + infer_action: true + is_description: true +rx_jsonaddheader: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: rx_jsonaddheader + function_alias: rx_jsonaddheader + help: '' + infer_action: true + is_description: true +rx_jsonpara: + actions: + GET: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getAdditionalJsonParameter + input: + - args[0] + input_types: + - std::string + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + function: setAdditionalJsonParameter + input: + - args[0] + - '""' + input_types: + - std::string + - std::string + output: + - args[0] + - '" deleted"' + require_det_id: true + store_result_in_t: false + - arg_types: + - std::string + - std::string + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + function: setAdditionalJsonParameter + input: + - args[0] + - args[1] + input_types: + - std::string + - std::string + output: + - '"{"' + - args[0] + - '": "' + - args[1] + - '"}"' + require_det_id: true + store_result_in_t: false + command_name: rx_jsonpara + function_alias: rx_jsonpara + help: "[key1] [value1]\n\t[Receiver] Additional json header parameter streamed out\ + \ from receiver. If not found in header, the pair is appended. An empty values\ + \ deletes parameter. Max 20 characters for each key/value." + infer_action: true +rx_lastclient: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxLastClientIP + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: rx_lastclient + function_alias: rx_lastclient + help: "\n\tClient IP Address that last communicated with the receiver." + infer_action: true + template: true +rx_lock: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxLock + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxLock + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_lock + function_alias: rx_lock + help: "[0, 1]\n\tLock receiver to one client IP, 1 locks, 0 unlocks. Default is\ + \ unlocked." + infer_action: true + template: true +rx_missingpackets: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumMissingPackets + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: rx_missingpackets + function_alias: rx_missingpackets + help: "\n\tNumber of missing packets for receiver. If negative, they are packets\ + \ in excess." + infer_action: true + template: true +rx_padding: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getPartialFramesPadding + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setPartialFramesPadding + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_padding + function_alias: rx_padding + help: "[0, 1]\n\tPartial frames padding enable in the receiver. Default: enabled.\ + \ Disabling is fastest." + infer_action: true + template: true +rx_printconfig: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: printRxConfiguration + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: rx_printconfig + function_alias: rx_printconfig + help: "\n\tPrints the receiver configuration." + infer_action: true + template: true +rx_realudpsocksize: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxRealUDPSocketBufferSize + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: rx_realudpsocksize + function_alias: rx_realudpsocksize + help: "\n\tActual udp socket buffer size. Double the size of rx_udpsocksize due\ + \ to kernel bookkeeping." + infer_action: true + template: true +rx_roi: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 2 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + - arg_types: + - int + - int + - int + - int + argc: 4 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: rx_roi + function_alias: rx_roi + help: '' + infer_action: true + is_description: true +rx_silent: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxSilentMode + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxSilentMode + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_silent + function_alias: rx_silent + help: "[0, 1]\n\tSwitch on or off receiver text output during acquisition." + infer_action: true + template: true +rx_start: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: startReceiver + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: false + store_result_in_t: false + command_name: rx_start + function_alias: rx_start + help: "\n\tStarts receiver listener for detector data packets and create a data\ + \ file (if file write enabled)." + infer_action: true + template: true +rx_status: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getReceiverStatus + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: 'true' + message: '"Cannot put. Did you mean to use command: \"rx_start\" or \"rx_stop\"?"' + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: rx_status + function_alias: rx_status + help: "[running, idle, transmitting]\n\tReceiver listener status." + infer_action: true +rx_stop: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: stopReceiver + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: false + store_result_in_t: false + command_name: rx_stop + function_alias: rx_stop + help: "\n\tStops receiver listener for detector data packets and closes current\ + \ data file (if file write enabled)." + infer_action: true + template: true +rx_tcpport: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxPort + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint16_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: false + function: setRxPort + input: + - args[0] + input_types: + - uint16_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_tcpport + function_alias: rx_tcpport + help: "[port]\n\tTCP port for client-receiver communication. Default is 1954. Must\ + \ be different if multiple receivers on same pc. Must be first command to set\ + \ a receiver parameter. Multi command will automatically increment for individual\ + \ modules." + infer_action: true + template: true +rx_threads: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxThreadIds + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: rx_threads + function_alias: rx_threads + help: "\n\tGet kernel thread ids from the receiver in order of [parent, tcp, listener\ + \ 0, processor 0, streamer 0, listener 1, processor 1, streamer 1, arping]. If\ + \ no streamer yet or there is no second interface, it gives 0 in its place." + infer_action: true + template: true +rx_udpsocksize: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxUDPSocketBufferSize + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxUDPSocketBufferSize + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_udpsocksize + function_alias: rx_udpsocksize + help: "[n_size]\n\tUDP socket buffer size in receiver. Tune rmem_default and rmem_max\ + \ accordingly. Max value is INT_MAX/2." + infer_action: true + template: true +rx_version: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getReceiverVersion + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: rx_version + function_alias: rx_version + help: "\n\tReceiver version" + infer_action: true + template: true +rx_zmqfreq: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxZmqFrequency + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxZmqFrequency + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_zmqfreq + function_alias: rx_zmqfreq + help: "[nth frame]\n\tFrequency of frames streamed out from receiver via zmq\n\t\ + Default: 1, Means every frame is streamed out. \n\tIf 2, every second frame is\ + \ streamed out. \n\tIf 0, streaming timer is the timeout, after which current\ + \ frame is sent out. (default timeout is 500 ms). Usually used for gui purposes." + infer_action: true + template: true +rx_zmqhwm: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxZmqHwm + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setRxZmqHwm + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: rx_zmqhwm + function_alias: rx_zmqhwm + help: "[n_value]\n\tReceiver's zmq send high water mark. Default is the zmq library's\ + \ default (1000). This is a high number and can be set to 2 for gui purposes.\ + \ One must also set the client's receive high water mark to similar value. Final\ + \ effect is sum of them. Also restarts receiver zmq streaming if enabled. Can\ + \ set to -1 to set default value." + infer_action: true + template: true +rx_zmqip: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxZmqIP + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - IpAddr + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setRxZmqIP + input: + - IpAddr(args[0]) + input_types: + - IpAddr + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_zmqip + function_alias: rx_zmqip + help: "[x.x.x.x]\n\tZmq Ip Address from which data is to be streamed out of the\ + \ receiver. Also restarts receiver zmq streaming if enabled. Default is from rx_hostname.\ + \ Modified only when using an intermediate process between receiver." + infer_action: true + template: true +rx_zmqport: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxZmqPort + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint16_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: false + function: setRxZmqPort + input: + - args[0] + input_types: + - uint16_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_zmqport + function_alias: rx_zmqport + help: "[port]\n\tZmq port for data to be streamed out of the receiver. Also restarts\ + \ receiver zmq streaming if enabled. Default is 30001. Modified only when using\ + \ an intermediate process between receiver and client(gui). Must be different\ + \ for every detector (and udp port). Multi command will automatically increment\ + \ for individual modules." + infer_action: true + template: true +rx_zmqstartfnum: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxZmqStartingFrame + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxZmqStartingFrame + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_zmqstartfnum + function_alias: rx_zmqstartfnum + help: "[fnum]\n\tThe starting frame index to stream out. 0 by default, which streams\ + \ the first frame in an acquisition, and then depending on the rx zmq frequency/\ + \ timer" + infer_action: true + template: true +rx_zmqstream: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getRxZmqDataStream + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setRxZmqDataStream + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: rx_zmqstream + function_alias: rx_zmqstream + help: "[0, 1]\n\tEnable/ disable data streaming from receiver via zmq (eg. to GUI\ + \ or to another process for further processing). This creates/ destroys zmq streamer\ + \ threads in receiver. \n\tSwitching to Gui automatically enables data streaming\ + \ in receiver. \n\tSwitching back to command line acquire will require disabling\ + \ data streaming in receiver for fast applications. " + infer_action: true + template: true +samples: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: samples + function_alias: samples + help: '' + infer_action: true + is_description: true +savepattern: + actions: + PUT: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + function: savePattern + input: + - args[0] + input_types: + - std::string + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: savepattern + function_alias: savepattern + help: "\n\t[Ctb][Mythen3] Saves pattern to file (ascii). \n\t[Ctb] Also executes\ + \ pattern." + infer_action: true + template: true +scan: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getScan + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: StringTo(args[0]) != 0 + message: '"Unknown argument " + args[0] + ". Did you mean 0 to disable scan?"' + function: setScan + input: + - defs::scanParameters() + input_types: + - auto + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + - arg_types: + - defs::dacIndex + - int + - int + - int + argc: 4 + cast_input: + - false + check_det_id: true + convert_det_id: true + function: setScan + input: + - defs::scanParameters(StringTo(args[0]), StringTo(args[1]), + StringTo(args[2]), StringTo(args[3])) + input_types: + - auto + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + - arg_types: + - defs::dacIndex + - int + - int + - int + - std::string + argc: 5 + cast_input: + - false + check_det_id: true + convert_det_id: true + function: setScan + input: + - defs::scanParameters(StringTo(args[0]), StringTo(args[1]), + StringTo(args[2]), StringTo(args[3]), t) + input_types: + - auto + output: + - ToString(args) + require_det_id: false + separate_time_units: + input: args[4] + output: + - t + - unit + store_result_in_t: false + command_name: scan + function_alias: scan + help: "[dac_name|0|trimbits] [start_val] [stop_val] [step_size] [dac settling time\ + \ ns|us|ms|s]\n\tEnables/ disables scans for dac and trimbits \n\tEnabling scan\ + \ sets number of frames to number of steps in receiver. \n\tTo cancel scan configuration,\ + \ set dac to '0', which also sets number of frames to 1. \n\t[Eiger][Mythen3]\ + \ Use trimbits as dac name for a trimbit scan." + infer_action: true +scanerrmsg: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getScanErrorMessage + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: scanerrmsg + function_alias: scanerrmsg + help: "\n\tGets Scan error message if scan ended in error for non blocking acquisitions." + infer_action: true + template: true +selinterface: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSelectedUDPInterface + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: selectUDPInterface + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: selinterface + function_alias: selinterface + help: "[0, 1]\n\t[Jungfrau][Moench] The udp interface to stream data from detector.\ + \ Effective only when number of interfaces is 1. Default: 0 (outer)" + infer_action: true + template: true +serialnumber: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSerialNumber + input: [] + input_types: [] + output: + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + command_name: serialnumber + function_alias: serialnumber + help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][CTB]\nSerial number\ + \ of detector." + infer_action: true + template: true +setbit: + actions: + PUT: + args: + - arg_types: + - uint32_t + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + exceptions: + - condition: StringTo(args[1]) < 0 || StringTo(args[1]) > 31 + message: '"Bit number out of range: " + args[1]' + function: setBit + input: + - args[0] + - args[1] + input_types: + - uint32_t + - int + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: setbit + function_alias: setbit + help: "[reg address in hex] [bit index]\n\tSets bit in address." + infer_action: true + template: true +settings: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSettings + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::detectorSettings + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setSettings + input: + - args[0] + input_types: + - defs::detectorSettings + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: settings + function_alias: settings + help: "[standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain,\ + \ highgain0, fixgain1, fixgain2, forceswitchg1, forceswitchg2, verylowgain, g1_hg,\ + \ g1_lg, g2_hc_hg, g2_hc_lg, g2_lc_hg, g2_lc_lg, g4_hg, g4_lg, gain0]\n\t Detector\ + \ Settings\n\t[Jungfrau] - [ gain0 | highgain0]\n\t[Gotthard] - [dynamicgain |\ + \ highgain | lowgain | mediumgain | veryhighgain]\n\t[Gotthard] Also loads default\ + \ dacs on to the detector.\n\t[Gotthard2] - [dynamicgain | fixgain1 | fixgain2]\n\ + \t[Mythen3] - [standard | fast | highgain] Also changes vrshaper and vrpreamp.\ + \ \n\t[Eiger] Use threshold or thresholdnotb. \n\t[Eiger] threshold and settings\ + \ loaded from file found in settingspath. \n\t[Moench] - [g1_hg | g1_lg | g2_hc_hg\ + \ | g2_hc_lg | g2_lc_hg | g2_lc_lg | g4_hg | g4_lg]" + infer_action: true + template: true +settingslist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSettingsList + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + command_name: settingslist + function_alias: settingslist + help: "\n\tList of settings implemented for this detector." + infer_action: true + template: true +settingspath: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSettingsPath + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setSettingsPath + input: + - args[0] + input_types: + - std::string + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: settingspath + function_alias: settingspath + help: "[path]\n\t[Eiger][Mythen3] Directory where settings files are loaded from/to." + infer_action: true + template: true +signalindex: + actions: + GET: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: getSignalIndex + input: + - args[0] + input_types: + - std::string + output: + - static_cast(t) + require_det_id: false + store_result_in_t: true + command_name: signalindex + function_alias: signalindex + help: "[name] \n\t\t[ChipTestBoard] Get the signal index for the given name." + infer_action: true + template: true +signallist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: getSignalNames + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: -1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: '"This detector already has fixed dac names. Cannot change them."' + function: setSignalNames + input: + - args + input_types: + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: signallist + function_alias: signallist + help: "[signalname1 signalname2 .. signalname63] \n\t\t[ChipTestBoard] Set the list\ + \ of signal names for this board." + infer_action: true + template: true +signalname: + actions: + GET: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: getSignalName + input: + - args[0] + input_types: + - int + output: + - args[0] + - ''' ''' + - t + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - std::string + argc: 2 + cast_input: + - true + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: setSignalName + input: + - args[0] + - args[1] + input_types: + - int + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: signalname + function_alias: signalname + help: "[0-63][name] \n\t\t[ChipTestBoard] Set the signal at the given position to\ + \ the given name." + infer_action: true + template: true +slowadc: + actions: + GET: + args: + - arg_types: + - int + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + command_name: slowadc + function_alias: slowadc + help: '' + infer_action: true + is_description: true +slowadcindex: + actions: + GET: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + extra_variables: + - name: index + type: defs::dacIndex + value: defs::SLOW_ADC0 + function: getSlowADCIndex + input: + - args[0] + input_types: + - std::string + output: + - ToString(static_cast(t) - index) + require_det_id: false + store_result_in_t: true + command_name: slowadcindex + function_alias: slowadcindex + help: "[name] \n\t\t[ChipTestBoard] Get the slowadc index for the given name." + infer_action: true + template: true +slowadclist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + function: getSlowADCNames + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: -1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: '"This detector already has fixed dac names. Cannot change them."' + function: setSlowADCNames + input: + - args + input_types: + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: slowadclist + function_alias: slowadclist + help: "[slowadcname1 slowadcname2 .. slowadcname7] \n\t\t[ChipTestBoard] Set the\ + \ list of slowadc names for this board." + infer_action: true + template: true +slowadcname: + actions: + GET: + args: + - arg_types: + - defs::dacIndex + argc: 1 + cast_input: + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + extra_variables: + - name: index + type: defs::dacIndex + value: defs::SLOW_ADC0 + function: getSlowADCName + input: + - static_cast(StringTo(args[0]) + index) + input_types: + - defs::dacIndex + output: + - args[0] + - ''' ''' + - t + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::dacIndex + - std::string + argc: 2 + cast_input: + - false + - false + check_det_id: true + convert_det_id: true + exceptions: + - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + message: cmd + " only allowed for CTB." + extra_variables: + - name: index + type: defs::dacIndex + value: defs::SLOW_ADC0 + function: setSlowADCName + input: + - static_cast(StringTo(args[0]) + index) + - args[1] + input_types: + - defs::dacIndex + - std::string + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: slowadcname + function_alias: slowadcname + help: "[0-7][name] \n\t\t[ChipTestBoard] Set the slowadc at the given position to\ + \ the given name." + infer_action: true + template: true +slowadcvalues: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + ctb_output_list: + GETFCN: getSlowADC + GETFCNLIST: getSlowADCList + GETFCNNAME: getSlowADCNames + printable_name: '*name_it++' + suffix: mV + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + command_name: slowadcvalues + function_alias: slowadcvalues + help: "[name] \n\t\t[ChipTestBoard] Get values of all slow adcs." + infer_action: true +start: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: startDetector + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: start + function_alias: start + help: "\n\tStarts detector acquisition. Status changes to RUNNING or WAITING and\ + \ automatically returns to idle at the end of acquisition. If the acquisition\ + \ was abruptly stopped, some detectors come back to STOPPED." + infer_action: true + template: true +status: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDetectorStatus + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: 'true' + message: '"Cannot put. Did you mean to use command: \"start\" or \"stop\"?"' + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: status + function_alias: status + help: "[running, error, transmitting, finished, waiting, idle]\n\tDetector status.\ + \ Goes to stop server." + infer_action: true +stop: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: stopDetector + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: stop + function_alias: stop + help: "\n\tAbort detector acquisition. Status changes to IDLE or STOPPED. Goes to\ + \ stop server." + infer_action: true + template: true +stopport: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getStopPort + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint16_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setStopPort + input: + - args[0] + input_types: + - uint16_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: stopport + function_alias: stopport + help: "[n]\n\tPort number of the stop server on detector for detector-client tcp\ + \ interface. Default is 1953. Normally unchanged." + infer_action: true + template: true +storagecell_delay: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getStorageCellDelay + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getStorageCellDelay + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setStorageCellDelay + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + function: setStorageCellDelay + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: storagecell_delay + function_alias: storagecell_delay + help: "[duration (0-1638375 ns)] [(optional unit) ns|us|ms|s]\n\t[Jungfrau] Additional\ + \ time delay between 2 consecutive exposures in burst mode (resolution of 25ns).\ + \ Only applicable for chipv1.0. For advanced users only." + infer_action: true + template: true +storagecell_start: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getStorageCellStart + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setStorageCellStart + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: storagecell_start + function_alias: storagecell_start + help: "[0-max]\n\t[Jungfrau] Storage cell that stores the first acquisition of the\ + \ series. max is 15 (default) for chipv1.0 and 3 (default) for chipv1.1. For advanced\ + \ users only." + infer_action: true + template: true +subdeadtime: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSubDeadTime + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSubDeadTime + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setSubDeadTime + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + function: setSubDeadTime + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: subdeadtime + function_alias: subdeadtime + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Eiger] Dead time of EIGER subframes\ + \ in 32 bit mode. Subperiod = subexptime + subdeadtime." + infer_action: true + template: true +subexptime: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSubExptime + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + - arg_types: + - special::time_unit + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSubExptime + input: [] + input_types: [] + output: + - OutString(t , args[0]) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setSubExptime + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + require_det_id: true + separate_time_units: + input: args[0] + output: + - converted_time + - unit + store_result_in_t: false + - arg_types: + - int + - special::time_unit + argc: 2 + cast_input: + - false + check_det_id: false + convert_det_id: true + convert_to_time: + input: + - args[0] + - args[1] + output: converted_time + function: setSubExptime + input: + - converted_time + input_types: + - time::ns + output: + - args[0] + - args[1] + require_det_id: true + store_result_in_t: false + command_name: subexptime + function_alias: subexptime + help: "[duration] [(optional unit) ns|us|ms|s]\n\t[Eiger] Exposure time of EIGER\ + \ subframes in 32 bit mode." + infer_action: true + template: true +sync: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSynchronization + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setSynchronization + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: sync + function_alias: sync + help: "[0, 1]\n\t[Jungfrau][Moench] Enables or disables synchronization between\ + \ modules. Sync mode requires at least one master configured. Also requires flatband\ + \ cabling between master and slave with termination board." + infer_action: true + template: true +syncclk: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSYNCClock + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: syncclk + function_alias: syncclk + help: "[n_clk in MHz]\n\t[Ctb] Sync clock in MHz." + infer_action: true + template: true +temp_10ge: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::TEMPERATURE_10GE + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_10ge + function_alias: temp_10ge + help: "[n_value]\n\t[Eiger]Temperature close to the 10GbE" + infer_action: true + template: true +temp_adc: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::TEMPERATURE_ADC + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_adc + function_alias: temp_adc + help: "[n_value]\n\t[Jungfrau][Moench][Gotthard] ADC Temperature" + infer_action: true + template: true +temp_control: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTemperatureControl + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTemperatureControl + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: temp_control + function_alias: temp_control + help: "[0, 1]\n\t[Jungfrau][Moench] Temperature control enable. Default is 0 (disabled).\ + \ If temperature crosses threshold temperature and temperature control is enabled,\ + \ power to chip will be switched off and temperature event occurs. To power on\ + \ chip again, temperature has to be less than threshold temperature and temperature\ + \ event has to be cleared." + infer_action: true + template: true +temp_dcdc: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::TEMPERATURE_DCDC + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_dcdc + function_alias: temp_dcdc + help: "[n_value]\n\t[Eiger]Temperature close to the dc dc converter" + infer_action: true + template: true +temp_event: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTemperatureEvent + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: StringTo(args[0]) != 0 + message: '"Unknown argument for temp event: ( " + args[0] + " ). Did you + mean 0 to reset event?"' + function: resetTemperatureEvent + input: [] + input_types: [] + output: + - '"cleared"' + require_det_id: true + store_result_in_t: false + command_name: temp_event + function_alias: temp_event + help: "[0]\n\t[Jungfrau][Moench] 1, if a temperature event occured. To clear this\ + \ event, set it to 0.\n\tIf temperature crosses threshold temperature and temperature\ + \ control is enabled, power to chip will be switched off and temperature event\ + \ occurs. To power on chip again, temperature has to be less than threshold temperature\ + \ and temperature event has to be cleared." + infer_action: true +temp_fpga: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::TEMPERATURE_FPGA + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_fpga + function_alias: temp_fpga + help: "[n_value]\n\t[Eiger][Jungfrau][Moench][Gotthard][Mythen3][Gotthard2] FPGA\ + \ Temperature" + infer_action: true + template: true +temp_fpgaext: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::TEMPERATURE_FPGAEXT + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_fpgaext + function_alias: temp_fpgaext + help: "[n_value]\n\t[Eiger]Temperature close to the FPGA" + infer_action: true + template: true +temp_fpgafl: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::TEMPERATURE_FPGA2 + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_fpgafl + function_alias: temp_fpgafl + help: "[n_value]\n\t[Eiger]Temperature of the left front end board fpga." + infer_action: true + template: true +temp_fpgafr: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::TEMPERATURE_FPGA3 + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_fpgafr + function_alias: temp_fpgafr + help: "[n_value]\n\t[Eiger]Temperature of the right front end board fpga." + infer_action: true + template: true +temp_slowadc: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::SLOW_ADC_TEMP + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_slowadc + function_alias: temp_slowadc + help: "[n_value]\n\t[Ctb]Temperature of the slow adc" + infer_action: true + template: true +temp_sodl: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::TEMPERATURE_SODL + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_sodl + function_alias: temp_sodl + help: "[n_value]\n\t[Eiger]Temperature close to the left so-dimm memory" + infer_action: true + template: true +temp_sodr: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getTemperature + input: + - defs::TEMPERATURE_SODR + input_types: + - int + output: + - OutString(t) + - "\" \xB0C\"" + require_det_id: true + store_result_in_t: true + command_name: temp_sodr + function_alias: temp_sodr + help: "[n_value]\n\t[Eiger]Temperature close to the right so-dimm memory" + infer_action: true + template: true +temp_threshold: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getThresholdTemperature + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setThresholdTemperature + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: temp_threshold + function_alias: temp_threshold + help: "[n_temp (in degrees)]\n\t[Jungfrau][Moench] Threshold temperature in degrees.\ + \ If temperature crosses threshold temperature and temperature control is enabled,\ + \ power to chip will be switched off and temperature event occurs. To power on\ + \ chip again, temperature has to be less than threshold temperature and temperature\ + \ event has to be cleared." + infer_action: true + template: true +templist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTemperatureList + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + command_name: templist + function_alias: templist + help: "\n\tList of temperature commands implemented for this detector." + infer_action: true + template: true +tempvalues: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + ctb_output_list: + GETFCN: getTemperature + GETFCNLIST: getTemperatureList + GETFCNNAME: '' + printable_name: '*it' + suffix: "\xB0C" + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + command_name: tempvalues + function_alias: tempvalues + help: "\n\tGets the values for every temperature for this detector." + infer_action: true +tengiga: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTenGiga + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTenGiga + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: tengiga + function_alias: tengiga + help: "[0, 1]\n\t[Eiger][Ctb][Mythen3] 10GbE Enable." + infer_action: true + template: true +threshold: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + - arg_types: + - int + - defs::detectorSettings + argc: 2 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + - arg_types: + - int + - int + - int + argc: 3 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + - arg_types: + - int + - int + - int + - defs::detectorSettings + argc: 4 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: threshold + function_alias: threshold + help: '' + infer_action: true + is_description: true +thresholdnotb: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + - arg_types: + - int + - defs::detectorSettings + argc: 2 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + - arg_types: + - int + - int + - int + argc: 3 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + - arg_types: + - int + - int + - int + - defs::detectorSettings + argc: 4 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: thresholdnotb + duplicate_function: true + function_alias: threshold + help: '' + infer_action: true + is_description: true +timing: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTimingMode + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::timingMode + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTimingMode + input: + - args[0] + input_types: + - defs::timingMode + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: timing + function_alias: timing + help: "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Moench][Gotthard][Ctb][Gotthard2]\ + \ [auto|trigger]\n\t[Mythen3] [auto|trigger|gating|trigger_gating]\n\t[Eiger]\ + \ [auto|trigger|gating|burst_trigger]" + infer_action: true + template: true +timinglist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTimingModeList + input: [] + input_types: [] + output: + - ToString(t) + require_det_id: false + store_result_in_t: true + command_name: timinglist + function_alias: timinglist + help: "\n\tGets the list of timing modes for this detector." + infer_action: true + template: true +timingsource: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTimingSource + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::timingSourceType + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTimingSource + input: + - args[0] + input_types: + - defs::timingSourceType + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: timingsource + function_alias: timingsource + help: "[internal|external]\n\t[Gotthard2] Timing source. Internal is crystal and\ + \ external is system timing. Default is internal." + infer_action: true + template: true +top: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTop + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTop + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: top + function_alias: top + help: "[0, 1]\n\t[Eiger] Sets half module to top (1), else bottom." + infer_action: true + template: true +transceiverenable: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTransceiverEnableMask + input: [] + input_types: [] + output: + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint32_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTransceiverEnableMask + input: + - args[0] + input_types: + - uint32_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: transceiverenable + function_alias: transceiverenable + help: "[bitmask]\n\t[Ctb] Transceiver Enable Mask. Enable for each 4 Transceiver\ + \ channel." + infer_action: true + template: true +trigger: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: true + convert_det_id: true + extra_variables: + - name: block + type: bool + value: 'false' + function: sendSoftwareTrigger + input: + - block + input_types: + - bool + output: + - '"successful"' + require_det_id: false + store_result_in_t: false + command_name: trigger + function_alias: trigger + help: "\n\t[Eiger][Mythen3][Jungfrau][Moench] Sends software trigger signal to detector" + infer_action: true + template: true +triggers: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfTriggers + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int64_t + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setNumberOfTriggers + input: + - args[0] + input_types: + - int64_t + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: triggers + function_alias: triggers + help: "[n_triggers]\n\tNumber of triggers per aquire. Set timing mode to use triggers." + infer_action: true + template: true +triggersl: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfTriggersLeft + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: triggersl + function_alias: triggersl + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of triggers\ + \ left in acquisition. Only when external trigger used." + infer_action: true + template: true +trimbits: + actions: + GET: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: saveTrimbits + input: + - args[0] + input_types: + - std::string + output: + - args[0] + require_det_id: true + store_result_in_t: false + PUT: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: loadTrimbits + input: + - args[0] + input_types: + - std::string + output: + - args[0] + require_det_id: true + store_result_in_t: false + command_name: trimbits + function_alias: trimbits + help: "[fname]\n\t[Eiger][Mythen3] Put will load the trimbit file to detector. If\ + \ no extension specified, serial number of each module is attached. Get will save\ + \ the trimbits from the detector to file with serial number added to file name." + infer_action: true +trimen: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: trimen + function_alias: trimen + help: '' + infer_action: true + is_description: true +trimval: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getAllTrimbits + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setAllTrimbits + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: trimval + function_alias: trimval + help: "[n_trimval]\n\t[Eiger][Mythen3] All trimbits set to this value. Returns -1\ + \ if all trimbits are different values." + infer_action: true + template: true +tsamples: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberOfTransceiverSamples + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setNumberOfTransceiverSamples + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: tsamples + function_alias: tsamples + help: "[n_value]\n\t[CTB] Number of transceiver samples expected." + infer_action: true + template: true +txdelay: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: getTransmissionDelay + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: true + convert_det_id: true + function: setTransmissionDelay + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: false + store_result_in_t: false + command_name: txdelay + function_alias: txdelay + help: "[n_delay]\n\t[Eiger][Jungfrau][Moench][Mythen3] Set transmission delay for\ + \ all modules in the detector using the step size provided.Sets up \n\t\t[Eiger]\ + \ txdelay_left to (2 * mod_index * n_delay), \n\t\t[Eiger] txdelay_right to ((2\ + \ * mod_index + 1) * n_delay) and \n\t\t[Eiger] txdelay_frame to (2 *num_modules\ + \ * n_delay) \n\t\t[Jungfrau][Moench][Mythen3] txdelay_frame to (num_modules\ + \ * n_delay) \nfor every module." + infer_action: true +txdelay_frame: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTransmissionDelayFrame + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTransmissionDelayFrame + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: txdelay_frame + function_alias: txdelay_frame + help: "[n_delay]\n\t[Eiger][Jungfrau][Moench][Mythen3] Transmission delay of first\ + \ udp packet being streamed out of the module.\n\t[Jungfrau][Moench] [0-31] Each\ + \ value represents 1 ms\n\t[Eiger] Additional delay to txdelay_left and txdelay_right.\ + \ Each value represents 10ns. Typical value is 50000.\n\t[Mythen3] [0-16777215]\ + \ Each value represents 8 ns (125 MHz clock), max is 134 ms." + infer_action: true + template: true +txdelay_left: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTransmissionDelayLeft + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTransmissionDelayLeft + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: txdelay_left + function_alias: txdelay_left + help: "[n_delay]\n\t[Eiger] Transmission delay of first packet in an image being\ + \ streamed out of the module's left UDP port. Each value represents 10ns. Typical\ + \ value is 50000." + infer_action: true + template: true +txdelay_right: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getTransmissionDelayRight + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setTransmissionDelayRight + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: txdelay_right + function_alias: txdelay_right + help: "[n_delay]\n\t[Eiger] Transmission delay of first packet in an image being\ + \ streamed out of the module's right UDP port. Each value represents 10ns. Typical\ + \ value is 50000." + infer_action: true + template: true +type: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDetectorType + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: type + function_alias: type + help: "\n\tReturns detector type. Can be Eiger, Jungfrau, Gotthard, Moench, Mythen3,\ + \ Gotthard2, ChipTestBoard" + infer_action: true + template: true +udp_cleardst: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: clearUDPDestinations + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: udp_cleardst + function_alias: udp_cleardst + help: "\n\tClears udp destination details on the detector." + infer_action: true + template: true +udp_dstip: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: udp_dstip + function_alias: udp_dstip + help: '' + infer_action: true + is_description: true +udp_dstip2: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: udp_dstip2 + function_alias: udp_dstip2 + help: '' + infer_action: true + is_description: true +udp_dstlist: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + exceptions: + - condition: det_id == -1 + message: '"Can execute udp_dstlist only at module level."' + - condition: rx_id < 0 || rx_id >= MAX_UDP_DESTINATION + message: '"Invalid receiver index " + std::to_string(rx_id) + " to set round + robin entry."' + function: getDestinationUDPList + input: + - rx_id + input_types: + - auto + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: -1 + cast_input: + - false + check_det_id: false + convert_det_id: false + exceptions: + - condition: det_id == -1 + message: '"Can execute udp_dstlist only at module level."' + - condition: rx_id < 0 || rx_id >= MAX_UDP_DESTINATION + message: '"Invalid receiver index " + std::to_string(rx_id) + " to set round + robin entry."' + - condition: args.empty() + message: '"udp_dstlist require at least one argument."' + function: setDestinationUDPList + input: + - getUdpEntry() + input_types: + - auto + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: udp_dstlist + function_alias: udp_dstlist + help: "[ip=x.x.x.x] [(optional)ip2=x.x.x.x] \n\t\t[mac=xx:xx:xx:xx:xx:xx] [(optional)mac2=xx:xx:xx:xx:xx:xx]\n\ + \t\t[port=value] [(optional)port2=value]\n\t\tThe order of ip, mac and port does\ + \ not matter. entry_value can be >0 only for [Eiger][Jungfrau][Moench][Mythen3][Gotthard2]\ + \ where round robin is implemented. If 'auto' used, then ip is set to ip of rx_hostname." + infer_action: true +udp_dstmac: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDestinationUDPMAC + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - MacAddr + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setDestinationUDPMAC + input: + - MacAddr(args[0]) + input_types: + - MacAddr + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: udp_dstmac + function_alias: udp_dstmac + help: "[x:x:x:x:x:x]\n\tMac address of the receiver (destination) udp interface.\ + \ Not mandatory to set as udp_dstip retrieves it from slsReceiver process, but\ + \ must be set if you use a custom receiver (not slsReceiver). Use router mac if\ + \ router between detector and receiver." + infer_action: true + template: true +udp_dstmac2: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDestinationUDPMAC2 + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - MacAddr + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setDestinationUDPMAC2 + input: + - MacAddr(args[0]) + input_types: + - MacAddr + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: udp_dstmac2 + function_alias: udp_dstmac2 + help: "[x:x:x:x:x:x]\n\t[Jungfrau][Moench] Mac address of the receiver (destination)\ + \ udp interface 2. Not mandatory to set as udp_dstip2 retrieves it from slsReceiver\ + \ process but must be set if you use a custom receiver (not slsReceiver). \n\t\ + \ [Jungfrau][Moench] top half or inner interface \n\t [Gotthard2] veto debugging.\ + \ Use router mac if router between detector and receiver." + infer_action: true + template: true +udp_dstport: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDestinationUDPPort + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint16_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: false + function: setDestinationUDPPort + input: + - args[0] + input_types: + - uint16_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: udp_dstport + function_alias: udp_dstport + help: "[n]\n\tPort number of the receiver (destination) udp interface. Default is\ + \ 50001. \n\tIf multi command, ports for each module is calculated (incremented\ + \ by 1 if no 2nd interface)" + infer_action: true + template: true +udp_dstport2: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getDestinationUDPPort2 + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint16_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: false + function: setDestinationUDPPort2 + input: + - args[0] + input_types: + - uint16_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: udp_dstport2 + function_alias: udp_dstport2 + help: "[n]\n\t[Jungfrau][Moench][Eiger][Gotthard2] Port number of the receiver (destination)\ + \ udp interface 2. Default is 50002. \n\tIf multi command, ports for each module\ + \ is calculated (incremented by 2) \n\t[Jungfrau][Moench] top half or inner interface\ + \ \n\t[Eiger] right half \n\t[Gotthard2] veto debugging" + infer_action: true + template: true +udp_firstdst: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getFirstUDPDestination + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setFirstUDPDestination + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: udp_firstdst + function_alias: udp_firstdst + help: "\n[0 - 31 (or number of udp destinations)]\n\t[Jungfrau][Moench][Gotthard2]\n\ + [0-63]\n\t[Mythen3]\n\n\t One can set which is the first destination that the\ + \ detector will stream images out from in a round robin fashion. The entry must\ + \ not have been empty. Default: 0" + infer_action: true + template: true +udp_numdst: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getNumberofUDPDestinations + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: udp_numdst + function_alias: udp_numdst + help: "\n\t[Jungfrau][Moench][Eiger][Mythen3][Gotthard2] One can enter upto 32 (64\ + \ for Mythen3) destinations that the detector will stream images out in a round\ + \ robin fashion. This is get only command. Default: 1" + infer_action: true + template: true +udp_reconfigure: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: reconfigureUDPDestination + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: udp_reconfigure + function_alias: udp_reconfigure + help: "\n\tReconfigures Detector with UDP destination. More for debugging as the\ + \ configuration is done automatically when the detector has sufficient UDP details." + infer_action: true + template: true +udp_srcip: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: udp_srcip + function_alias: udp_srcip + help: '' + infer_action: true + is_description: true +udp_srcip2: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - std::string + argc: 1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: udp_srcip2 + function_alias: udp_srcip2 + help: '' + infer_action: true + is_description: true +udp_srcmac: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSourceUDPMAC + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - MacAddr + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setSourceUDPMAC + input: + - MacAddr(args[0]) + input_types: + - MacAddr + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: udp_srcmac + function_alias: udp_srcmac + help: "[x:x:x:x:x:x]\n\tMac address of the detector (source) udp interface. \n\t\ + [Eiger] Do not set as detector will replace with its own DHCP Mac (1G) or DHCP\ + \ Mac + 1 (10G)." + infer_action: true + template: true +udp_srcmac2: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getSourceUDPMAC2 + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - MacAddr + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setSourceUDPMAC2 + input: + - MacAddr(args[0]) + input_types: + - MacAddr + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: udp_srcmac2 + function_alias: udp_srcmac2 + help: "[x:x:x:x:x:x]\n\t[Jungfrau][Moench] Mac address of the top half or inner\ + \ (source) udp interface. " + infer_action: true + template: true +udp_validate: + actions: + PUT: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: validateUDPConfiguration + input: [] + input_types: [] + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: udp_validate + function_alias: udp_validate + help: "\n\tValidates that UDP configuration in the detector is valid. If not configured,\ + \ it will throw with error message requesting missing udp information." + infer_action: true + template: true +update: + actions: + PUT: + args: + - arg_types: + - special::path + - special::path + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + exceptions: + - condition: args[args.size() - 1].find(".pof") == std::string::npos && args[args.size() + - 1].find(".rbf") == std::string::npos + message: '"Programming file must be a pof/rbf file."' + function: updateFirmwareAndServer + input: + - args[0] + - args[1] + input_types: + - std::string + - std::string + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: update + function_alias: update + help: "\n\tWithout tftp: [server_name (incl fullpath)] [fname.pof (incl full path)]\ + \ This does not use tftp.\n\t\t[Jungfrau][Moench][Gotthard][CTB] Updates the firmware,\ + \ detector server, deletes old server, creates the symbolic link and then reboots\ + \ detector controller. \n\t\t[Mythen3][Gotthard2] will require a script to start\ + \ up the shorter named server link at start up. \n\t\tserver_name is full path\ + \ name of detector server binary\n\t\tfname is full path of programming file" + infer_action: true +updatedetectorserver: + actions: + PUT: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: updateDetectorServer + input: + - args[0] + input_types: + - std::string + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: updatedetectorserver + function_alias: updatedetectorserver + help: "[server_name with full path]\n\t[Jungfrau][Moench][Eiger][Ctb][Mythen3][Gotthard2]\ + \ Copies detector server via TCP (without tftp). Makes a symbolic link with a\ + \ shorter name (without vx.x.x). Then, detector controller reboots (except Eiger).\n\ + \t[Jungfrau][Moench][Ctb]Also changes respawn server to the link, which is effective\ + \ after a reboot." + infer_action: true +updatekernel: + actions: + PUT: + args: + - arg_types: + - special::path + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: updateKernel + input: + - args[0] + input_types: + - std::string + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: updatekernel + function_alias: updatekernel + help: "[kernel_name with full path]\n\t[Jungfrau][Moench][Ctb][Mythen3][Gotthard2]\ + \ Advanced Command!! You could damage the detector. Please use with caution.\n\ + \tUpdates the kernel image. Then, detector controller reboots with new kernel." + infer_action: true +updatemode: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getUpdateMode + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setUpdateMode + input: + - args[0] + input_types: + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: updatemode + function_alias: updatemode + help: "[0|1]\n\tRestart the detector server in update mode or not. This is useful\ + \ when server-firmware compatibility is at its worst and server cannot start up\ + \ normally" + infer_action: true + template: true +user: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: true + convert_det_id: true + function: getUserDetails + input: [] + input_types: [] + output: + - t + require_det_id: false + store_result_in_t: true + command_name: user + function_alias: user + help: "\n\tUser details from shared memory (hostname, type, PID, User, Date)." + infer_action: true +v_a: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPower + input: + - defs::V_POWER_A + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: setPower + input: + - defs::V_POWER_A + - args[0] + input_types: + - int + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: v_a + function_alias: v_a + help: "[n_value]\n\t[Ctb] Power supply a in mV." + infer_action: true + template: true +v_b: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPower + input: + - defs::V_POWER_B + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: setPower + input: + - defs::V_POWER_B + - args[0] + input_types: + - int + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: v_b + function_alias: v_b + help: "[n_value]\n\t[Ctb] Power supply b in mV." + infer_action: true + template: true +v_c: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPower + input: + - defs::V_POWER_C + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: setPower + input: + - defs::V_POWER_C + - args[0] + input_types: + - int + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: v_c + function_alias: v_c + help: "[n_value]\n\t[Ctb] Power supply c in mV." + infer_action: true + template: true +v_chip: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPower + input: + - defs::V_POWER_CHIP + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: setPower + input: + - defs::V_POWER_CHIP + - args[0] + input_types: + - int + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: v_chip + function_alias: v_chip + help: "[n_value]\n\t[Ctb] Power supply chip in mV. Do not use it unless you are\ + \ completely sure you will not fry the board." + infer_action: true + template: true +v_d: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPower + input: + - defs::V_POWER_D + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: setPower + input: + - defs::V_POWER_D + - args[0] + input_types: + - int + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: v_d + function_alias: v_d + help: "[n_value]\n\t[Ctb] Power supply d in mV." + infer_action: true + template: true +v_io: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPower + input: + - defs::V_POWER_IO + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: setPower + input: + - defs::V_POWER_IO + - args[0] + input_types: + - int + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: v_io + function_alias: v_io + help: "[n_value]\n\t[Ctb] Power supply io in mV. Minimum 1200 mV. Must be the first\ + \ power regulator to be set after fpga reset (on-board detector server start up)." + infer_action: true + template: true +v_limit: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getPower + input: + - defs::V_LIMIT + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: setPower + input: + - defs::V_LIMIT + - args[0] + input_types: + - int + - int + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: v_limit + function_alias: v_limit + help: "[n_value]\n\t[Ctb] Soft limit for power supplies (ctb only) and DACS in mV." + infer_action: true + template: true +vchip_comp_adc: + actions: + GET: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: getOnChipDAC + input: + - defs::VB_COMP_ADC + - args[0] + input_types: + - int + - int + output: + - args[0] + - ''' ''' + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: 2 + cast_input: + - false + - true + - true + check_det_id: false + convert_det_id: true + function: setOnChipDAC + input: + - defs::VB_COMP_ADC + - args[0] + - args[1] + input_types: + - int + - int + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: vchip_comp_adc + function_alias: vchip_comp_adc + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac\ + \ for comparator current of ADC." + infer_action: true + template: true +vchip_comp_fe: + actions: + GET: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: getOnChipDAC + input: + - defs::VB_COMP_FE + - args[0] + input_types: + - int + - int + output: + - args[0] + - ''' ''' + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: 2 + cast_input: + - false + - true + - true + check_det_id: false + convert_det_id: true + function: setOnChipDAC + input: + - defs::VB_COMP_FE + - args[0] + - args[1] + input_types: + - int + - int + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: vchip_comp_fe + function_alias: vchip_comp_fe + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac\ + \ for comparator current of analogue front end." + infer_action: true + template: true +vchip_cs: + actions: + GET: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: getOnChipDAC + input: + - defs::VB_CS + - args[0] + input_types: + - int + - int + output: + - args[0] + - ''' ''' + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: 2 + cast_input: + - false + - true + - true + check_det_id: false + convert_det_id: true + function: setOnChipDAC + input: + - defs::VB_CS + - args[0] + - args[1] + input_types: + - int + - int + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: vchip_cs + function_alias: vchip_cs + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac\ + \ for current injection into preamplifier." + infer_action: true + template: true +vchip_opa_1st: + actions: + GET: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: getOnChipDAC + input: + - defs::VB_OPA_1ST + - args[0] + input_types: + - int + - int + output: + - args[0] + - ''' ''' + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: 2 + cast_input: + - false + - true + - true + check_det_id: false + convert_det_id: true + function: setOnChipDAC + input: + - defs::VB_OPA_1ST + - args[0] + - args[1] + input_types: + - int + - int + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: vchip_opa_1st + function_alias: vchip_opa_1st + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac\ + \ for opa current for driving the other DACs in chip." + infer_action: true + template: true +vchip_opa_fd: + actions: + GET: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: getOnChipDAC + input: + - defs::VB_OPA_FD + - args[0] + input_types: + - int + - int + output: + - args[0] + - ''' ''' + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: 2 + cast_input: + - false + - true + - true + check_det_id: false + convert_det_id: true + function: setOnChipDAC + input: + - defs::VB_OPA_FD + - args[0] + - args[1] + input_types: + - int + - int + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: vchip_opa_fd + function_alias: vchip_opa_fd + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac\ + \ current for CDS opa stage." + infer_action: true + template: true +vchip_ref_comp_fe: + actions: + GET: + args: + - arg_types: + - int + - int + argc: 1 + cast_input: + - false + - true + check_det_id: false + convert_det_id: true + function: getOnChipDAC + input: + - defs::VREF_COMP_FE + - args[0] + input_types: + - int + - int + output: + - args[0] + - ''' ''' + - OutStringHex(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + - int + argc: 2 + cast_input: + - false + - true + - true + check_det_id: false + convert_det_id: true + function: setOnChipDAC + input: + - defs::VREF_COMP_FE + - args[0] + - args[1] + input_types: + - int + - int + - int + output: + - args[0] + - ''' ''' + - args[1] + require_det_id: true + store_result_in_t: false + command_name: vchip_ref_comp_fe + function_alias: vchip_ref_comp_fe + help: "[chip index 0-9, -1 for all][10 bit hex value] \n\t[Gotthard2] On chip Dac\ + \ for reference voltage of the comparator of analogue front end." + infer_action: true + template: true +versions: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + command_name: versions + function_alias: versions + help: '' + infer_action: true + is_description: true +veto: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getVeto + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - bool + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setVeto + input: + - args[0] + input_types: + - bool + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: veto + function_alias: veto + help: "[0, 1]\n\t[Gotthard2] Enable or disable veto data data from chip. Default\ + \ is 0." + infer_action: true + template: true +vetoalg: + actions: + GET: + args: + - arg_types: + - defs::streamingInterface + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + exceptions: + - condition: interface == defs::streamingInterface::NONE + message: '"Must specify an interface to set algorithm"' + extra_variables: + - name: interface + type: defs::streamingInterface + value: StringTo(args[0]) + function: getVetoAlgorithm + input: + - interface + input_types: + - defs::streamingInterface + output: + - OutString(t) + - ''' ''' + - ToString(interface) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - defs::vetoAlgorithm + - defs::streamingInterface + argc: 2 + cast_input: + - false + - false + check_det_id: false + convert_det_id: true + exceptions: + - condition: interface == defs::streamingInterface::NONE + message: '"Must specify an interface to set algorithm"' + extra_variables: + - name: alg + type: defs::vetoAlgorithm + value: StringTo(args[0]) + - name: interface + type: defs::streamingInterface + value: StringTo(args[1]) + function: setVetoAlgorithm + input: + - alg + - interface + input_types: + - defs::vetoAlgorithm + - defs::streamingInterface + output: + - ToString(alg) + - ''' ''' + - ToString(interface) + require_det_id: true + store_result_in_t: false + command_name: vetoalg + function_alias: vetoalg + help: "[hits|raw] [lll|10gbe]\n\t[Gotthard2] Set the veto algorithm. Default is\ + \ hits." + infer_action: true +vetofile: + actions: + GET: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: 'true' + message: '"Cannot get vetofile. Did you mean vetophoton?"' + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - std::string + argc: 2 + cast_input: + - true + - false + check_det_id: false + convert_det_id: true + function: setVetoFile + input: + - args[0] + - args[1] + input_types: + - int + - std::string + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: vetofile + function_alias: vetofile + help: "[chip index 0-9, -1 for all] [file name] \n\t[Gotthard2] Set veto reference\ + \ for each 128 channels for specific chip. The file should have 128 rows of gain\ + \ index and 12 bit value in dec" + infer_action: true +vetophoton: + actions: + GET: + args: + - arg_types: + - int + - std::string + argc: 2 + cast_input: + - true + - false + check_det_id: false + convert_det_id: true + function: getVetoPhoton + input: + - args[0] + - args[1] + input_types: + - int + - std::string + output: + - '"saved to file "' + - args[1] + require_det_id: true + store_result_in_t: false + PUT: + args: + - arg_types: + - int + - int + - int + - std::string + argc: 4 + cast_input: + - true + - true + - true + - false + check_det_id: false + convert_det_id: true + function: setVetoPhoton + input: + - args[0] + - args[1] + - args[2] + - args[3] + input_types: + - int + - int + - int + - std::string + output: + - ToString(args) + require_det_id: true + store_result_in_t: false + command_name: vetophoton + function_alias: vetophoton + help: "[ichip] [#photons] [energy in keV] [reference file]\n\t[Gotthard2] Set veto\ + \ reference for 128 channels for chip ichip according to reference file and #photons\ + \ and energy in keV.\n[ichip] [output file]\n\t Get gain indices and veto reference\ + \ for 128 channels for chip ichip, saved to file." + infer_action: true +vetoref: + actions: + GET: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + exceptions: + - condition: 'true' + message: '"Cannot get vetoref. Did you mean vetophoton?"' + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + - int + argc: 2 + cast_input: + - true + - true + check_det_id: false + convert_det_id: true + function: setVetoReference + input: + - args[0] + - args[1] + input_types: + - int + - int + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: vetoref + function_alias: vetoref + help: "[gain index] [12 bit value]\n\t[Gotthard2] Set veto reference for all 128\ + \ channels for all chips." + infer_action: true +vetostream: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: [] + argc: -1 + cast_input: [] + check_det_id: false + convert_det_id: true + function: '' + input: [] + input_types: [] + output: [] + require_det_id: false + store_result_in_t: false + command_name: vetostream + function_alias: vetostream + help: '' + infer_action: true + is_description: true +virtual: + actions: + PUT: + args: + - arg_types: + - int + - uint16_t + argc: 2 + cast_input: + - true + - true + check_det_id: true + convert_det_id: true + function: setVirtualDetectorServers + input: + - args[0] + - args[1] + input_types: + - int + - uint16_t + output: + - ToString(args) + require_det_id: false + store_result_in_t: false + command_name: virtual + function_alias: virtualFunction + help: "[n_servers] [starting_port_number]\n\tConnecs to n virtual server at local\ + \ host starting at specific control port. Every virtual server will have a stop\ + \ port (control port + 1)" + infer_action: true +vm_a: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredPower + input: + - defs::V_POWER_A + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: vm_a + function_alias: vm_a + help: "\n\t[Ctb] Measured voltage of power supply a in mV." + infer_action: true + template: true +vm_b: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredPower + input: + - defs::V_POWER_B + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: vm_b + function_alias: vm_b + help: "\n\t[Ctb] Measured voltage of power supply b in mV." + infer_action: true + template: true +vm_c: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredPower + input: + - defs::V_POWER_C + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: vm_c + function_alias: vm_c + help: "\n\t[Ctb] Measured voltage of power supply c in mV." + infer_action: true + template: true +vm_d: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredPower + input: + - defs::V_POWER_D + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: vm_d + function_alias: vm_d + help: "\n\t[Ctb] Measured voltage of power supply d in mV." + infer_action: true + template: true +vm_io: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: getMeasuredPower + input: + - defs::V_POWER_IO + input_types: + - int + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + command_name: vm_io + function_alias: vm_io + help: "\n\t[Ctb] Measured voltage of power supply io in mV." + infer_action: true + template: true +zmqhwm: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getClientZmqHwm + input: [] + input_types: [] + output: + - t + require_det_id: false + store_result_in_t: true + PUT: + args: + - arg_types: + - int + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: true + function: setClientZmqHwm + input: + - args[0] + input_types: + - int + output: + - det->getClientZmqHwm() + require_det_id: false + store_result_in_t: false + command_name: zmqhwm + function_alias: zmqhwm + help: "[n_limit] \n\tClient's zmq receive high water mark. Default is the zmq library's\ + \ default (1000), can also be set here using -1. \n\tThis is a high number and\ + \ can be set to 2 for gui purposes. \n\tOne must also set the receiver's send\ + \ high water mark to similar value. Final effect is sum of them.\n\t Setting it\ + \ via command line is useful only before zmq enabled (before opening gui)." + infer_action: true +zmqip: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getClientZmqIp + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - IpAddr + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: setClientZmqIp + input: + - IpAddr(args[0]) + input_types: + - IpAddr + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: zmqip + function_alias: zmqip + help: "[x.x.x.x]\n\tIp Address to listen to zmq data streamed out from receiver\ + \ or intermediate process. Default connects to receiver zmq Ip Address (from rx_hostname).\ + \ Modified only when using an intermediate process between receiver and client(gui).\ + \ Also restarts client zmq streaming if enabled." + infer_action: true + template: true +zmqport: + actions: + GET: + args: + - arg_types: [] + argc: 0 + cast_input: [] + check_det_id: false + convert_det_id: true + function: getClientZmqPort + input: [] + input_types: [] + output: + - OutString(t) + require_det_id: true + store_result_in_t: true + PUT: + args: + - arg_types: + - uint16_t + argc: 1 + cast_input: + - true + check_det_id: false + convert_det_id: false + function: setClientZmqPort + input: + - args[0] + input_types: + - uint16_t + output: + - args.front() + require_det_id: true + store_result_in_t: false + command_name: zmqport + function_alias: zmqport + help: "[port]\n\tZmq port in client(gui) or intermediate process for data to be\ + \ streamed to from receiver. Default connects to receiver zmq streaming out port\ + \ (30001). Modified only when using an intermediate process between receiver and\ + \ client(gui). Also restarts client zmq streaming if enabled. Must be different\ + \ for every detector (and udp port). Multi command will automatically increment\ + \ for individual modules." + infer_action: true + template: true diff --git a/slsDetectorSoftware/generator/gen_commands.py b/slsDetectorSoftware/generator/gen_commands.py new file mode 100644 index 000000000..764f087a4 --- /dev/null +++ b/slsDetectorSoftware/generator/gen_commands.py @@ -0,0 +1,276 @@ +import argparse +import os +import subprocess +from pathlib import Path + +import yaml + +from autocomplete.autocomplete import type_info +from cpp_codegen.codegen import codegen, if_block, for_block, function, else_block +from infer_action.check_infer import check_infer +from autocomplete.autocomplete import type_values + +GEN_PATH = Path(__file__).parent + +COMMANDS_PATH = GEN_PATH / 'extended_commands.yaml' +DEPRECATED_COMMANDS_PATH = GEN_PATH / 'deprecated_commands.yaml' +CPP_INPUT_PATH = GEN_PATH / 'Caller.in.cpp' +HEADER_INPUT_PATH = GEN_PATH / 'Caller.in.h' +CPP_OUTPUT_PATH = GEN_PATH.parent / 'src' / 'Caller.cpp' +HEADER_OUTPUT_PATH = GEN_PATH.parent / 'src' / 'Caller.h' + +INFER_HEADER_INPUT_PATH = GEN_PATH / 'inferAction.in.h' +INFER_CPP_INPUT_PATH = GEN_PATH / 'inferAction.in.cpp' +INFER_HEADER_OUTPUT_PATH = GEN_PATH.parent / 'src' / 'inferAction.h' +INFER_CPP_OUTPUT_PATH = GEN_PATH.parent / 'src' / 'inferAction.cpp' + + +def generate( + commands_path=COMMANDS_PATH, + cpp_input_path=CPP_INPUT_PATH, + header_input_path=HEADER_INPUT_PATH, + cpp_output_path=CPP_OUTPUT_PATH, + header_output_path=HEADER_OUTPUT_PATH, + infer_header_input_path=INFER_HEADER_INPUT_PATH, + infer_cpp_input_path=INFER_CPP_INPUT_PATH, + infer_header_output_path=INFER_HEADER_OUTPUT_PATH, + infer_cpp_output_path=INFER_CPP_OUTPUT_PATH, + +): + commands_config = yaml.unsafe_load(commands_path.open('r')) + deprecated_commands_config = yaml.unsafe_load(DEPRECATED_COMMANDS_PATH.open('r')) + type_dist, non_dist = check_infer(commands=commands_config) + + codegen.open(cpp_output_path) + # write call function + codegen.write_opening(cpp_input_path) + + # iterate over the commands and generate code for each + print(f"[X] found {len(commands_config)} commands") + print('[*] generating code for commands') + for command_name, command in commands_config.items(): + if 'is_description' in command and command['is_description']: + continue + with function('std::string', 'Caller::' + command['function_alias'], [('int', 'action')]) as fn: + codegen.write_line('std::ostringstream os;') + + # print help + codegen.write_line('// print help') + with if_block('action == slsDetectorDefs::HELP_ACTION'): + if command["help"].startswith('code:'): + codegen.write_line(command["help"].strip('code:')) + else: + codegen.write_line(f'os << "Command: {command_name}" << std::endl;') + codegen.write_line(f'os << R"V0G0N({command["help"]} )V0G0N" << std::endl;') + codegen.write_line('return os.str();') + + # check if action and arguments are valid + + codegen.write_line('// check if action and arguments are valid') + first = True + for action, action_params in command['actions'].items(): + + with if_block(f'action == {codegen.actions_dict[action]}', elseif=not first): + + check_argc = True + for arg in action_params['args']: + if arg['argc'] == -1: + check_argc = False + break + # check number of arguments + condition = "1" if check_argc else "0" + + if check_argc: + for arg in action_params['args']: + condition += f' && args.size() != {arg["argc"]}' + + with if_block(condition): + codegen.write_line(f'throw RuntimeError("Wrong number of arguments for action {action}");') + + for arg in action_params['args']: + if not check_argc: + continue + with if_block(f'args.size() == {arg["argc"]}'): + # check argument types + if 'extra_variables' in arg: + for var in arg['extra_variables']: + codegen.write_line(f'{var["type"]} {var["name"]} = {var["value"]};') + + if 'separate_time_units' in arg and arg['separate_time_units']: + codegen.write_line(f'try {{') + # TODO: refactor this repeating code + codegen.write_line(f'std::string tmp_time({arg["separate_time_units"]["input"]});') + codegen.write_line(f'std::string {arg["separate_time_units"]["output"][1]}' + f' = RemoveUnit(tmp_time);') + codegen.write_line(f'auto {arg["separate_time_units"]["output"][0]} = ' + f'StringTo < time::ns > (tmp_time,' + f' {arg["separate_time_units"]["output"][1]});') + codegen.write_line( + f'}} catch (...) {{ throw RuntimeError("Could not convert argument to time::ns");}}') + + elif 'convert_to_time' in arg and arg['convert_to_time']: + codegen.write_line(f'try {{') + + codegen.write_line( + f'StringTo < time::ns > ({", ".join(arg["convert_to_time"]["input"])});') + codegen.write_line( + f'}} catch (...) {{ throw RuntimeError("Could not convert arguments to time::ns");}}') + + for i in range(len(arg['input'])): + if not arg['cast_input'][i]: + continue + codegen.write_line(f'try {{') + codegen.write_line(f'StringTo<{arg["input_types"][i]}>({arg["input"][i]});') + codegen.write_line(f'}} catch (...) {{') + codegen.write_line( + f' throw RuntimeError("Could not convert argument {i} to {arg["input_types"][i]}");') + codegen.write_line(f'}}') + first = False + with else_block(): + codegen.write_line( + f'throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions are {list(command["actions"].keys())}");') + + # generate code for each action + codegen.write_line('// generate code for each action') + for action, action_params in command['actions'].items(): + if 'detectors' in action_params: + codegen.write_line('auto detector_type = det->getDetectorType().squash();') + + with if_block(f'action == {codegen.actions_dict[action]}'): + if 'detectors' in action_params: + first = True + for detector, detector_params in action_params['detectors'].items(): + with if_block(f'detector_type == defs::{detector}', elseif=not first): + codegen.write_arg(detector_params, action, command_name) + + else_block().__enter__() + + if not action_params: + codegen.write_line(f'throw RuntimeError("detector not supported for action: {action}");') + else: + tmp_args = [] + if 'args' in action_params: + tmp_args = action_params['args'] + codegen.write_arg(tmp_args, action, command_name) + + if 'detectors' in action_params: + else_block().__exit__() + + codegen.write_line('return os.str();') + + # close sls namespace + codegen.write_closing() + codegen.close() + print('[X] .cpp code generated') + deprecated_commands = [] + codegen.write_header(header_input_path, header_output_path, commands_config, deprecated_commands_config) + print('[X] header code generated') + + + codegen.write_infer_header(infer_header_input_path, infer_header_output_path, commands_config) #TODO: add deprecated commands + print('[X] infer header code generated') + codegen.open(infer_cpp_output_path) + + codegen.write_infer_cpp(infer_cpp_input_path, infer_cpp_output_path, commands_config, non_dist, type_dist) + codegen.close() + print('[X] infer cpp code generated') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='generate c++ code for cli commands from the commands.yaml file', + ) + parser.add_argument('-f', '--format', action='store_true', default=False, dest='format', + help='format header and cpp file using clang-format') + parser.add_argument('-p', '--parse', action='store_true', default=False, dest='parse', + help='parse the commands.yaml file into extended_commands.yaml') + parser.add_argument('-c', '--check', action='store_true', default=False, dest='check', + help='check missing commands') + parser.add_argument('-g', '--generate', action='store_true', default=False, dest='generate', help='generate code (C++ or bash if -a is used)') + parser.add_argument('-a', '--autocomplete', action='store_true', default=False, dest='autocomplete', + help='print bash autocomplete values') + cli_args = parser.parse_args() + + if cli_args.autocomplete: + from autocomplete.autocomplete import generate_type_values, generate_bash_autocomplete + if cli_args.generate: + generate_bash_autocomplete() + print('[X] bash autocomplete generated') + generate_bash_autocomplete( + output_path=Path(__file__).parent / 'autocomplete' / 'zsh_autocomplete.sh', + input_path=Path(__file__).parent / 'autocomplete' / 'zsh_autocomplete.in.sh' + ) + print('[X] zsh autocomplete generated') + exit(0) + else: + ret = generate_type_values() + print(ret) + exit(0) + + if cli_args.check: + from commands_parser.commands_parser import command_parser + + commands_config = yaml.unsafe_load(COMMANDS_PATH.open('r')) + + # infer action based on number of arguments and types + type_dist, non_dist = check_infer(commands=commands_config) + + command_parser.verify_format() + command_parser.parse_all_commands() + # generate list of commands found in sls_detector_get + glist_path = GEN_PATH / 'glist' + ret = subprocess.run([f"sls_detector_get list | tail -n +2 | sort > {glist_path.absolute()}"], shell=True, + capture_output=True, check=True) + if ret.stderr != b'': + print('[!] glist generation failed and glist not found') + exit(1) + + if not COMMANDS_PATH.exists(): + print('[!] extended_commands.yaml not found') + exit(1) + detglist = set(command['command_name'] for __, command in commands_config.items()) + detglist.add('free') + detglist.add('list') + + g_path = GEN_PATH / 'glist' + if not g_path.exists(): + print('[!] glist not found') + exit(1) + glist = set(g_path.read_text().split('\n')) + if "" in glist: + glist.remove("") + if "" in detglist: + detglist.remove("") + + not_found = set() + for command in glist: + if command not in detglist: + not_found.add(command) + print() + if len(not_found) > 0: + print(f'[!] found {len(not_found)} missing') + print(f"not_found: {not_found}") + else: + print(f'[X] found no missing commands') + + for command in detglist: + if command not in glist: + print(f'[!] command {command} found in commands.yaml but not found in g list') + + exit(0) + + if cli_args.parse: + from commands_parser.commands_parser import command_parser + + command_parser.verify_format() + command_parser.parse_all_commands() + + if cli_args.generate: + generate() + + if cli_args.format: + files = [CPP_OUTPUT_PATH, HEADER_OUTPUT_PATH, INFER_HEADER_OUTPUT_PATH, INFER_CPP_OUTPUT_PATH] + for file in files: + os.system(f'clang-format -i {file.absolute()}') + #os.system(f'clang-format -i --style="{{Standard: C++11}}" {file.absolute()}') + print('[X] code formatted') diff --git a/slsDetectorSoftware/generator/inferAction.in.cpp b/slsDetectorSoftware/generator/inferAction.in.cpp new file mode 100644 index 000000000..6d74f968f --- /dev/null +++ b/slsDetectorSoftware/generator/inferAction.in.cpp @@ -0,0 +1,19 @@ +#include "inferAction.h" +#include "sls/sls_detector_defs.h" +namespace sls { + +int InferAction::infer(sls::CmdParser &parser, std::ostream &os) { + args = parser.arguments(); + cmd = parser.command(); + auto it = functions.find(parser.command()); + if (it != functions.end()) { + return ((*this).*(it->second))(); + } else { + throw RuntimeError("det not implemented for command: " + + parser.command()); + } +} + +// THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1) - DO NOT REMOVE + +} // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/generator/inferAction.in.h b/slsDetectorSoftware/generator/inferAction.in.h new file mode 100644 index 000000000..c9e298009 --- /dev/null +++ b/slsDetectorSoftware/generator/inferAction.in.h @@ -0,0 +1,30 @@ +#include "CmdParser.h" +#include +#include +#include + +namespace sls { +class InferAction { + public: + InferAction() {} + int infer(sls::CmdParser &parser, std::ostream &os = std::cout); + std::vector args; + std::string cmd; + + // generated functions + // THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1) - DO NOT REMOVE + // int frames(); + + private: + using FunctionMap = std::map; + FunctionMap functions{ + // generated functions + + // THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (2) - DO NOT REMOVE + + // {"frames",&InferAction::frames} + + }; +}; + +} // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/generator/infer_action/check_infer.py b/slsDetectorSoftware/generator/infer_action/check_infer.py new file mode 100644 index 000000000..fe88eedcc --- /dev/null +++ b/slsDetectorSoftware/generator/infer_action/check_infer.py @@ -0,0 +1,64 @@ +from pathlib import Path + +import argparse +import yaml + + +def check_infer(EXTENDED_COMMANDS_PATH=Path(__file__).parent.parent / "extended_commands.yaml", commands=None): + if commands is None: + # load yaml file + with EXTENDED_COMMANDS_PATH.open('r') as f: + commands = yaml.safe_load(f) + + type_distinguishable = {} + non_distinguishable = {} + + for command_name, command in commands.items(): + # todo: remove this (added for debug) + # if command_name != 'badchannels': + # continue + if len(command["actions"]) == 1: + action = list(command["actions"].items())[0][1] + for arg in action['args']: + if arg['argc'] == -1: + non_distinguishable[(command_name, arg['argc'])] = ([], arg['arg_types']) + continue + + + get_argcs = {} + get_args = command['actions']['GET']['args'] + for arg in get_args: + if arg['argc'] != -1: + get_argcs[arg["argc"]] = arg['arg_types'] + else: + non_distinguishable[(command_name, arg['argc'])] = ([], arg['arg_types']) + put_args = command['actions']['PUT']['args'] + for arg in put_args: + if arg['argc'] == -1: + non_distinguishable[(command_name, arg['argc'])] = ([], arg['arg_types']) + elif arg['argc'] in get_argcs: + if arg['arg_types'] != get_argcs[arg['argc']]: + type_distinguishable[(command_name, arg['argc'])] = (get_argcs[arg['argc']], arg['arg_types']) + else: + non_distinguishable[(command_name, arg['argc'])] = (get_argcs[arg['argc']], arg['arg_types']) + + return type_distinguishable, non_distinguishable + + +if __name__ == "__main__": + argparse = argparse.ArgumentParser() + argparse.add_argument("--print", choices=['all', 'type', 'impossible'], default="all", help="command name") + args = argparse.parse_args() + + type_distinguishable, non_distinguishable = check_infer() + if args.print == 'type' or args.print == 'all': + print("type distinguishable:") + print("command_name: argc get_arg_type put_arg_type\n") + for (command_name, argc), (get_arg_types, put_arg_types) in type_distinguishable.items(): + print(f"{command_name}: {argc} {get_arg_types} {put_arg_types}") + + if args.print == 'impossible' or args.print == 'all': + print("\n\nimpossible to distinguish:") + print("command_name: argc get_arg_type put_arg_type") + for (command_name, argc), (get_arg_types, put_arg_types) in non_distinguishable.items(): + print(f"{command_name}: {argc} {get_arg_types} {put_arg_types}") diff --git a/slsDetectorSoftware/generator/readme.md b/slsDetectorSoftware/generator/readme.md new file mode 100644 index 000000000..d98510675 --- /dev/null +++ b/slsDetectorSoftware/generator/readme.md @@ -0,0 +1,288 @@ +# Generator +used to generate C++ cli commands. and bash autocompletion scripts. +## Autocomplete + +### Overview + +Looks through the `dump.json` file for the different values of an enum and stores them in the dictionary `type_values`. +```sh +# To print the different values for enums +python gen_commands.py -a +``` + +also the autocomplete.py generates shell autocompletion scripts for both bash and zsh. It uses the template file `bash_autocomplete.in.sh` and adds the necessary code in an output file `bash_autocomplete.sh` (same for zsh). +To use the bash autocompletion the `bash_autocomplete.sh` must be sourced. + +```sh +source bash_autocomplete.sh +# g will give the list of all commands +# p 0: will also give the list of all commands +# g exp will autocomplete to g exptime +# g exptime will return "s ms us ns" +# p timing will return "auto,burst_trigger,gating..." +``` + +**Note:** +The dump.json is the AST of the file `slsDetectorPackage/slsSupportLib/src/ToString.cpp`. + +```sh +# to generate the dump.json file +cd slsSupportLib/src/ToString.cpp +clang++ -Xclang -ast-dump=json -Xclang -ast-dump-filter -Xclang StringTo -c ToString.cpp -I ../include/ -std=gnu++11 +# clang version used: 14.0.0-1ubuntu1.1 +``` + +the `dump.json` file produced by clang is not a correct json file because we used the `-ast-dump-filter`. autocomplete.py can be used to fix the format of `dump.json` and produce a new file called `fixed.json` that is json format. +``` +# to convert dump.json into correct json format. +python autocomplete.py -f # produces the file fixed.json +``` + +### Code components + +- `type_values` is a dictionary that contains the different values for commands args. It is populated with enum values that stard with defs:: or slsDetectorDefs:: (eg. defs::burstMode). Also it contains values added manually such as "mv,mV" and those start with special:: +- `generate_type_values` parses the AST file to find the part that contains if statements. and extracts the different possible values for an enum. +- `generate_bash_autocomplete` generates autocompletion scripts for bash or zsh. the difference between zsh and bash scripts can be found in the template files. (bash handles 0: completion differently than zsh more details can be found in the comments of the template files ) +- `fix_json` fixes the file 'autocomplete/dump.json' and outputs a new corrected file in 'autocomplete/fixed.json' + +## Command Parser + +Definitely the most important component of all the generator module. + +command_parser exist to keep the commands.yaml file concise and easy to read and produce a complete version of the commands.yaml for the code generator to work on. + +The goal is that the code generator works on a version of commands.yaml that is easy to iterate over and generate code. +``` +# complete version +some_command: + help: "do this" + infer_action: true + actions: + GET: + args: + - argc: 0 + function: "getCommand" + ... + - argc: 1 + function: "getCommand" + ... + detectors: + MYTHEN3: + - argc: 0 + function: "getCommandMythen" + ... + PUT: + args: + - argc: 2 + function: "setCommand" + ... + - argc: 3 + function: "setCommand" + ... + +``` + +the complete vesion can only have `args` or `detectors` field inside an action (GET or PUT). **Each element in the args array have a different argc**. and in each element in the args array we can find all the information needed to generate the code for that one argc case. for example in the code `if(action == 'GET')` and `if (args.size() == 1)` then we can generate the code for that one case independetly. + + +commands.yaml has a lot on ~inheritance~. examples show best what it is: + +> fields insides an action will be passed to args and detectors + +> the extended args for default actions will be used for detectors + +> any field can be overriden + +``` +resetdacs: + help: "[(optional) hard] ..." + actions: + PUT: + function: resetToDefaultDacs + require_det_id: true + output: [ '"successful"' ] + input_types: [ bool ] + args: + - argc: 1 + arg_types: [ special::hard ] + input: [ '"1"' ] + - argc: 0 + input: [ '"0"' ] + +# this will be converted to + +resetdacs: + actions: + PUT: + args: + - arg_types: + - special::hard + argc: 1 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: resetToDefaultDacs + input: + - '"1"' + input_types: + - bool + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + - arg_types: [] + argc: 0 + cast_input: + - false + check_det_id: false + convert_det_id: true + function: resetToDefaultDacs + input: + - '"0"' + input_types: + - bool + output: + - '"successful"' + require_det_id: true + store_result_in_t: false + command_name: resetdacs + function_alias: resetdacs + help: "[(optional) hard] ..." + infer_action: true + +``` + +command_parser does not have a specific schema for the commands.yaml this is by design so it can be very extensible and future-proof. This also can have problems when there is typos (writing intput instead of input...) + +command_parser first verifies the commands.yaml and checks if there's some obvious problems in it. + +templates found in commands.yaml were taken from the CmdProxy code they were added for debugging purposes when writing the generator. + + +tricky things: +-- +- if input array has n elements and cast_input array is empty. command_parser will fill it with n false values. +- store_result_in_t will be added by default as true to GET action. but as false to PUT action. (unless it is written in the action) +- infer_action by default is true +- commands that have is_description true won't be verified +- function_alias is the name of the function in the c++ code. by default it is the command name. errors came up with the command virtual as virtual is a reserved keyword in c++ +- command_name is the string of the command that will be typed in cli. (frames, exptime, ...). by default it is the command name. pattern is a special keyword in yaml. problems came up with the command pattern +- arg_types is by default input_types unless otherwise specified +- when the parent has specific detector behaviour and the child does not. writing an empty detector section in the action would not inherit any detector specific fields (check exptime1) +- commands can inherit other commands (check exptime1 and exptime2) +- argc: -1 means that the command has an unknown number of arguments + + +### Code Walkthrough +the code is well commented it is well explained in the script + +### Tests +tests for command_parser can be found in `generator/tests/command_parser/` +``` +pip install -r requirements.txt +python -m pytests +``` + +verification is not well tested + + + +## codegen + +Now for C++ code generation. After parsing the commands.yaml file and producing the extended_commands.yaml `gen_commands.py` will iterate over the commands and generate `Caller.h`, `Caller.cpp`, `inferAction.cpp` and `inferAction.h` . + +### infer action + +the generated code will produce 5 new targets: "detg detp deta deth det" + +`detg` will set the action as GET +`detp` will the action as PUT + +`det` will guess the action depending on the number of arguments + +the codegen module will generate a function for every command that will return the action based on the number of arguments + +```cpp +int InferAction::activate() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} +``` + +the `inferAction` class will be called from `CmdApp.cpp` to infer the action and the command function will be called with the appropriate action. + +some commands have the same number of argument count for both get and put. These commands can be found using the the `check_infer.py` script. in the generated code it will say that "det is disabled" +```bash +# to see these commands +python infer_action/check_infer.py +``` + +### Caller.cpp code + +in this level we only use the extended_commands.yaml file. +the `generate()` function in `gen_commands.py` will iterate over all of the commands and : +- write the function signature +- write the help +- write c++ code to check the inputs: check argument count and check if we are able to convert the arguments into the required types +- iterate over actions and arguments +- iterate over the detectors and write code for each one of them (if mythen3 ... if eiger ... else default code... ) and call `codegen.write_arg()` to write the argument for a single argument + +codegen.write_arg() +- +write_arg in codegen reads the argument fields and generate c++ code accordingly. + +## fields explanations +- arg_types:[array of types] it is only used for autocompletion no C++ code is dependent on it +- is_description:[boolean] same as above +- template:[boolean] only used in commands.yaml and it won't present in extended_commands.yaml. it is inspired by the CmdProxy.h code +- help:[string] command help +- input:[array of variable names] the input arguments that will be passed to the function +- input_types:[array of types] the types of the input arguments given to the function +- cast_input:[array of boolean] if true it will cast the corresponding input to the type in input_types +- output:[array] outputs that will be printed (eg. ["123", "'a'"] will be os<<123<<'a') +- function: the function that will be called +- function_alias: the name of the function in the c++ code (more on it in tricky things) +- command_name: the string of the command that will be typed in cli. (more on it in tricky things) +- require_det_id: if true it will require a detector id to be passed as the last argument +- check_det_id: if true it will check the detector id and throw an error if it is not valid +- convert_det_id: if true it will convert the detector id to the correct type `std::vector{ det_id }` +- store_result_in_t: if true it will store the result of the function in the variable t (more on it in tricky things) +- infer_action: if true it will infer the action (only if det is used) +- detectors: the detectors that have specific behaviour +- args: the arguments of the command +- argc: the number of arguments +- extra_variables[array]: each element takes three parameters: value, name, type and creates that variable in the beginning of the argument code +- exceptions[array]: each element takes two parameters: condition, message +- pattern_command: takes three arguments: nGetArgs, nPutArgs and command_name and it will write this code + ```cpp + int level = -1, iArg = 0, nGetArgs = $nGetArgs$, nPutArgs = $nPutArgs$; + GetLevelAndUpdateArgIndex(action, $command_name$, level, iArg, nGetArgs,nPutArgs); + ``` +- separate_time_units: takes three parameters: input, output[0], output[1] each one is a variable name + ```cpp + std::string tmp_time($input$); + std::string $output[1]$ = RemoveUnit(tmp_time); + auto $output[0]$ = StringTo(tmp_time, $output[1]$); + ``` +- convert_to_time: takes three parameters: input[0], input[1], output + ```cpp + auto output = StringTo(input[0], input[1]); + ``` +- ctb_output_list: **maybe it should be removed?** takes 5 parameters: GETFCNLIST, GETFCNNAME, GETFCN, suffix, printable_name + + + + + + + diff --git a/slsDetectorSoftware/generator/requirements.txt b/slsDetectorSoftware/generator/requirements.txt new file mode 100644 index 000000000..049320b14 --- /dev/null +++ b/slsDetectorSoftware/generator/requirements.txt @@ -0,0 +1,6 @@ +coverage==7.3.1 +iniconfig==2.0.0 +packaging==23.1 +pluggy==1.3.0 +pytest==7.4.2 +PyYAML==6.0.1 diff --git a/slsDetectorSoftware/generator/tests/command_parser/data/basic.yaml b/slsDetectorSoftware/generator/tests/command_parser/data/basic.yaml new file mode 100644 index 000000000..b684b39e5 --- /dev/null +++ b/slsDetectorSoftware/generator/tests/command_parser/data/basic.yaml @@ -0,0 +1,16 @@ +basic: + infer_action: false + help: "xx11" + actions: + GET: + function: 'func1' + output: [ OutString(t) ] + args: + - argc: 0 + PUT: + function: 'func2' + output: [ 'args.front()' ] + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + argc: 1 diff --git a/slsDetectorSoftware/generator/tests/command_parser/data/basic_inheritance.yaml b/slsDetectorSoftware/generator/tests/command_parser/data/basic_inheritance.yaml new file mode 100644 index 000000000..cb9365809 --- /dev/null +++ b/slsDetectorSoftware/generator/tests/command_parser/data/basic_inheritance.yaml @@ -0,0 +1,66 @@ +--- +template: + infer_action: false + help: "" + actions: + GET: + function: 'func1' + args: + - argc: 0 + output: [ OutString(t) ] + PUT: + function: 'func2' + output: [ 'args.front()' ] + input: [ 'args[0]' ] + input_types: [ int ] + cast_input: [ true ] + argc: 1 + +basic: + help: "xx11" + inherit_actions: template + actions: + GET: + function: 'x' + argc: 2 + args: + - check_det_id: true + + +template2: + infer_action: false + template: true + help: "" + actions: + GET: + convert_to_time: + input: [ 'args[0]', 'args[1]' ] + output: converted_time + separate_time_units: + input: 'args[0]' + output: [ converted_time, unit ] + function: 'func1' + output: [ OutString(t) ] + args: + - argc: 0 + - argc: 99 + PUT: + function: funcTemplatePUT + args: + - argc: 19 + function: 'func19' + - argc: 91 + +basic2: + inherit_actions: template2 + actions: + GET: + function: 'x' + argc: 2 + args: + - check_det_id: true + input: [ 'args[0]', a,b,c ] + input_types: [ int, int, int, int ] + PUT: + function: 'y' + diff --git a/slsDetectorSoftware/generator/tests/command_parser/data/detectors.yaml b/slsDetectorSoftware/generator/tests/command_parser/data/detectors.yaml new file mode 100644 index 000000000..3e12394eb --- /dev/null +++ b/slsDetectorSoftware/generator/tests/command_parser/data/detectors.yaml @@ -0,0 +1,208 @@ +basic: + infer_action: false + help: "xx11" + actions: + GET: + function: 'func1' + output: [ OutString(t) ] + args: + - argc: 0 + - argc : 1 + output: [ testytest ] + detectors: + MYTHEN3: + function: 'do_mythen3' + CHIPTESTBOARD: + args: + - argc: 55 + output: [ ctbOutput ] + PUT: + detectors: + EIGER: + function: 'do_eiger' + argc: 99 + output: [ eigerOutput ] + + +# classes of tests: +# classes of template tests: has args or has detectors => 4 cases noted (0,0) ... (1,1) +# classes of childs: has args or has detectors => 4 cases noted (0,0) ... (1,1) +# => 16 cases +# example: case_0111: template (0,1) and child (1,1) +#################### exhaustive testing over chosen classes of tests + +template_01: + infer_action: true + help: "vv12" + template: true + + actions: + GET: + detectors: + MYTHEN3: + function: 'do_mythen3' + argc: 99 + CHIPTESTBOARD: + function: 'do_ctb' + argc: 98 + +case_0100: + inherit_actions: template_01 + help: "0100" + +case_0101: + inherit_actions: template_01 + help: "0101" + actions: + GET: + function: 'get_function' + detectors: + MYTHEN3: + function: 'do_mythen23' + argc: 420 + +case_0110: + inherit_actions: template_01 + help: "0110" + actions: + GET: + argc: 111 + function: 'get_function' + +case_0110v2: + inherit_actions: template_01 + help: "0110v2" + actions: + GET: + args: + - argc: 111 + function: 'get_function' + + +case_0111: + inherit_actions: template_01 + help: "0111" + actions: + GET: + args: + - argc: 111 + function: 'get_function' + detectors: + MYTHEN3: + function: 'do_mythen23' + argc: 420 + +##### cases 10** tests +template_10: + template: true + actions: + GET: + args: + - argc: 0 + - argc : 1 + output: [ testytest ] + +case_1000: + inherit_actions: template_10 + help: "1000" + +case_1001: + inherit_actions: template_10 + help: "1001" + actions: + GET: + detectors: + MYTHEN3: + args: + - function: 'do_mythen23' + argc: 420 + - function: 'do_mythen3' + argc: 99 + + + +case_1010: + inherit_actions: template_10 + help: "1010" + actions: + GET: + args: + - argc: 111 + function: 'get_function' + +case_1011: + inherit_actions: template_10 + help: "1011" + actions: + GET: + args: + - argc: 111 + function: 'get_function' + detectors: + MYTHEN3: + function: 'do_mythen23' + +##### cases 11** tests +template_11: + template: true + actions: + GET: + args: + - argc: 0 + - argc : 1 + output: [ testytest ] + detectors: + EIGER: + function: 'do_eiger' + args: + - argc: 99 + output: [ eigerOutput ] + POTATO: + function: 'do_potato' + + +case_1100: + inherit_actions: template_11 + help: "1100" + +case_1101: + inherit_actions: template_11 + help: "1101" + actions: + GET: + detectors: + MYTHEN3: + function: 'do_mythen3' + POTATO: + function: 'do_potato' + args: + - argc: 101 + function: 'potato_function' + - argc: 202 + +case_1110: + inherit_actions: template_11 + help: "1110" + actions: + GET: + argc: 77 + function: 'get_function' + + + +case_1111: + inherit_actions: template_11 + help: "1111" + actions: + GET: + argc: 77 + function: 'get_function' + detectors: + MYTHEN3: + function: 'do_mythen3' + POTATO: + function: 'do_potato' + args: + - argc: 101 + function: 'potato_function' + - argc: 202 \ No newline at end of file diff --git a/slsDetectorSoftware/generator/tests/command_parser/functional_tests/test_commands_parser_basic.py b/slsDetectorSoftware/generator/tests/command_parser/functional_tests/test_commands_parser_basic.py new file mode 100644 index 000000000..53d0e1d0a --- /dev/null +++ b/slsDetectorSoftware/generator/tests/command_parser/functional_tests/test_commands_parser_basic.py @@ -0,0 +1,101 @@ +from pathlib import Path + +import yaml + +from commands_parser.commands_parser import CommandParser + +data_path = Path(__file__).parent.parent / "data" + + +def test_basic_propagation(tmp_path): + output_file = tmp_path / "basic.yaml" + command_parser = CommandParser(commands_file=data_path / "basic.yaml", output_file=output_file) + command_parser.verify_format() + command_parser.parse_all_commands() + + assert output_file.exists() + command = yaml.unsafe_load(output_file.open('r'))['basic'] + assert command['help'] == "xx11" + assert len(command['actions']) == 2 + # test 'GET' action + assert 'args' in command['actions']['GET'] + assert len(command['actions']['GET'].keys()) == 1 # only 'args' key + assert len(command['actions']['GET']['args']) == 1 # only one argument + assert command['actions']['GET']['args'][0]['argc'] == 0 + assert command['actions']['GET']['args'][0]['function'] == 'func1' + assert command['actions']['GET']['args'][0]['output'] == ['OutString(t)'] + assert command['actions']['GET']['args'][0]['input'] == [] + assert command['actions']['GET']['args'][0]['cast_input'] == [] + assert command['actions']['GET']['args'][0]['require_det_id'] is False + # test PUT action + assert 'args' in command['actions']['PUT'] + assert len(command['actions']['PUT'].keys()) == 1 # only 'args' key + assert len(command['actions']['PUT']['args']) == 1 # only one argument + assert command['actions']['PUT']['args'][0]['argc'] == 1 + assert command['actions']['PUT']['args'][0]['function'] == 'func2' + assert command['actions']['PUT']['args'][0]['cast_input'] == [True] + assert command['actions']['PUT']['args'][0]['output'] == ['args.front()'] + assert command['actions']['PUT']['args'][0]['input_types'] == ['int'] + assert command['actions']['PUT']['args'][0]['require_det_id'] is False + + +def test_basic_inheritance(tmp_path): + output_file = tmp_path / "basic_inheritance.yaml" + command_parser = CommandParser(commands_file=data_path / "basic_inheritance.yaml", output_file=output_file) + command_parser.verify_format() + command_parser.parse_all_commands() + assert output_file.exists() + command = yaml.unsafe_load(output_file.open('r'))['basic'] + assert command['help'] == "xx11" + assert command['actions'].keys() == {'GET', 'PUT'} + # test 'GET' action + assert 'args' in command['actions']['GET'] + assert command['actions']['GET'].keys() == {'args'} # only 'args' key + assert len(command['actions']['GET']['args']) == 1 # only one argument + assert command['actions']['GET']['args'][0]['argc'] == 2 + assert command['actions']['GET']['args'][0]['function'] == 'x' + assert command['actions']['GET']['args'][0]['output'] == [] # test overwriting args when they are present in child + assert command['actions']['GET']['args'][0]['input'] == [] + assert command['actions']['GET']['args'][0]['cast_input'] == [] + assert command['actions']['GET']['args'][0]['require_det_id'] is False + # test PUT action + assert 'args' in command['actions']['PUT'] + assert command['actions']['PUT'].keys() == {'args'} # only 'args' key + assert len(command['actions']['PUT']['args']) == 1 # only one argument + assert command['actions']['PUT']['args'][0]['argc'] == 1 + assert command['actions']['PUT']['args'][0]['function'] == 'func2' + assert command['actions']['PUT']['args'][0]['cast_input'] == [True] + assert command['actions']['PUT']['args'][0]['output'] == ['args.front()'] + assert command['actions']['PUT']['args'][0]['input_types'] == ['int'] + assert command['actions']['PUT']['args'][0]['require_det_id'] is False + + +def test_basic_inheritance2(tmp_path): + output_file = tmp_path / "basic_inheritance.yaml" + command_parser = CommandParser(commands_file=data_path / "basic_inheritance.yaml", output_file=output_file) + command_parser.verify_format() + command_parser.parse_all_commands() + assert output_file.exists() + command = yaml.unsafe_load(output_file.open('r'))['basic2'] + # check GET + assert len(command['actions']['GET']['args']) == 1 + assert command['actions']['GET'].keys() == {'args'} + arg = command['actions']['GET']['args'][0] + assert arg['argc'] == 2 + assert arg['output'] == ['OutString(t)'] + # check that length of cast input is equal to length of input_types and input + assert len(arg['input']) == len(arg['input_types']) == len(arg['cast_input']) == 4 + assert arg['function'] == 'x' + assert 'convert_to_time' in arg + assert arg['convert_to_time'].keys() == {'input', 'output'} + assert 'separate_time_units' in arg + assert arg['separate_time_units'].keys() == {'input', 'output'} + + # check PUT + assert command['actions']['PUT'].keys() == {'args'} + assert len(command['actions']['PUT']['args']) == 2 + assert command['actions']['PUT']['args'][0]['argc'] == 19 + assert command['actions']['PUT']['args'][0]['function'] == 'y' + assert command['actions']['PUT']['args'][1]['argc'] == 91 + assert command['actions']['PUT']['args'][1]['function'] == 'y' + diff --git a/slsDetectorSoftware/generator/tests/command_parser/functional_tests/test_commands_parser_detector.py b/slsDetectorSoftware/generator/tests/command_parser/functional_tests/test_commands_parser_detector.py new file mode 100644 index 000000000..cfbff4b9f --- /dev/null +++ b/slsDetectorSoftware/generator/tests/command_parser/functional_tests/test_commands_parser_detector.py @@ -0,0 +1,309 @@ +import json +from pathlib import Path + +import pytest as pytest +import yaml + +from commands_parser.commands_parser import CommandParser + +data_path = Path(__file__).parent.parent / "data" + + +@pytest.fixture() +def detector_file_commands(tmp_path): + output_file = tmp_path / "detectors.yaml" + command_parser = CommandParser(commands_file=data_path / "detectors.yaml", output_file=output_file) + command_parser.verify_format() + + def func(command): + return command_parser.parse_command(command) + + return func + + +def test_basic_propagation(tmp_path, detector_file_commands): + command = detector_file_commands('basic') + + assert command['help'] == "xx11" + + # GET + assert command['actions']['GET'].keys() == {'detectors', 'args'} + assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3', 'CHIPTESTBOARD'} + mythen = command['actions']['GET']['detectors']['MYTHEN3'] + assert len(mythen) == 2 + assert mythen[0]['argc'] == 0 + assert mythen[1]['argc'] == 1 + assert mythen[0]['function'] == mythen[1]['function'] == 'do_mythen3' + assert mythen[0]['output'] == ['OutString(t)'] + assert mythen[1]['output'] == ['testytest'] + + ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD'] + assert len(ctb) == 1 + assert ctb[0]['argc'] == 55 + assert ctb[0]['function'] == 'func1' + + # PUT + assert command['actions']['PUT'].keys() == {'detectors'} + assert command['actions']['PUT']['detectors'].keys() == {'EIGER'} + eiger = command['actions']['PUT']['detectors']['EIGER'] + assert len(eiger) == 1 + assert eiger[0]['argc'] == 99 + assert eiger[0]['function'] == 'do_eiger' + assert eiger[0]['output'] == ['eigerOutput'] + +# 16 test cases for inheritance +# 1st bit: parent has args +# 2nd bit: parent has detectors +# 3rd bit: child has args +# 4th bit: child has detectors +# each test case is a combination of the above bits +# all the possible combinations are tested + +def test_inheritance_0100(tmp_path, detector_file_commands): + command = detector_file_commands('case_0100') + assert command['help'] == "0100" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'detectors'} + assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3', 'CHIPTESTBOARD'} + mythen = command['actions']['GET']['detectors']['MYTHEN3'] + assert len(mythen) == 1 + assert mythen[0]['argc'] == 99 + assert mythen[0]['function'] == 'do_mythen3' + + +def test_inheritance_0101(tmp_path, detector_file_commands): + command = detector_file_commands('case_0101') + assert command['help'] == "0101" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'detectors'} + assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3', 'CHIPTESTBOARD'} + mythen = command['actions']['GET']['detectors']['MYTHEN3'] + assert len(mythen) == 1 + assert mythen[0]['argc'] == 420 + assert mythen[0]['function'] == 'do_mythen23' + ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD'] + assert len(ctb) == 1 + assert ctb[0]['argc'] == 98 + assert ctb[0]['function'] == 'do_ctb' + + +def test_inheritance_0110(tmp_path, detector_file_commands): + command = detector_file_commands('case_0110') + assert command['help'] == "0110" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args', 'detectors'} + assert command['actions']['GET']['args'][0]['argc'] == 111 + mythen = command['actions']['GET']['detectors']['MYTHEN3'] + assert len(mythen) == 1 + assert mythen[0]['argc'] == 99 + assert mythen[0]['function'] == 'do_mythen3' + ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD'] + assert len(ctb) == 1 + assert ctb[0]['argc'] == 98 + assert ctb[0]['function'] == 'do_ctb' + + +def test_inheritance_0110v2(tmp_path, detector_file_commands): + command = detector_file_commands('case_0110v2') + assert command['help'] == "0110v2" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args', 'detectors'} + assert command['actions']['GET']['args'][0]['argc'] == 111 + mythen = command['actions']['GET']['detectors']['MYTHEN3'] + assert len(mythen) == 1 + assert mythen[0]['argc'] == 99 + assert mythen[0]['function'] == 'do_mythen3' + ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD'] + assert len(ctb) == 1 + assert ctb[0]['argc'] == 98 + assert ctb[0]['function'] == 'do_ctb' + + +def test_inheritacnce_0111(tmp_path, detector_file_commands): + command = detector_file_commands('case_0111') + assert command['help'] == "0111" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args', 'detectors'} + assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3', 'CHIPTESTBOARD'} + mythen = command['actions']['GET']['detectors']['MYTHEN3'] + assert len(mythen) == 1 + assert command['actions']['GET']['args'][0]['argc'] == 111 + assert len(mythen) == 1 + assert mythen[0]['argc'] == 420 + assert mythen[0]['function'] == 'do_mythen23' + ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD'] + assert len(ctb) == 1 + assert ctb[0]['argc'] == 98 + assert ctb[0]['function'] == 'do_ctb' + + +# cases 1000, 1001, 1010, 1011 +def test_inheritance_1000(tmp_path, detector_file_commands): + command = detector_file_commands('case_1000') + assert command['help'] == "1000" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args'} + assert len(command['actions']['GET']['args']) == 2 + assert command['actions']['GET']['args'][0]['argc'] == 0 + assert command['actions']['GET']['args'][0]['output'] == [] + + assert command['actions']['GET']['args'][1]['argc'] == 1 + assert command['actions']['GET']['args'][1]['output'] == ['testytest'] + + +def test_inheritance_1001(tmp_path, detector_file_commands): + command = detector_file_commands('case_1001') + assert command['help'] == "1001" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args', 'detectors'} + assert len(command['actions']['GET']['args']) == 2 + assert command['actions']['GET']['args'][0]['argc'] == 0 + assert command['actions']['GET']['args'][0]['output'] == [] + assert command['actions']['GET']['args'][1]['argc'] == 1 + assert command['actions']['GET']['args'][1]['output'] == ['testytest'] + + assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3'} + assert len(command['actions']['GET']['detectors']['MYTHEN3']) == 2 + assert command['actions']['GET']['detectors']['MYTHEN3'][0]['argc'] == 420 + assert command['actions']['GET']['detectors']['MYTHEN3'][0]['function'] == 'do_mythen23' + assert command['actions']['GET']['detectors']['MYTHEN3'][1]['argc'] == 99 + assert command['actions']['GET']['detectors']['MYTHEN3'][1]['function'] == 'do_mythen3' + + +def test_inheritance_1010(tmp_path, detector_file_commands): + command = detector_file_commands('case_1010') + assert command['help'] == "1010" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args'} + assert len(command['actions']['GET']['args']) == 1 + assert command['actions']['GET']['args'][0]['argc'] == 111 + assert command['actions']['GET']['args'][0]['function'] == 'get_function' + + +def test_inheritance_1011(tmp_path, detector_file_commands): + command = detector_file_commands('case_1011') + assert command['help'] == "1011" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args', 'detectors'} + assert len(command['actions']['GET']['args']) == 1 + assert command['actions']['GET']['args'][0]['argc'] == 111 + assert command['actions']['GET']['args'][0]['function'] == 'get_function' + + assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3'} + assert len(command['actions']['GET']['detectors']['MYTHEN3']) == 1 + assert command['actions']['GET']['detectors']['MYTHEN3'][0]['argc'] == 111 + assert command['actions']['GET']['detectors']['MYTHEN3'][0]['function'] == 'do_mythen23' + + +# cases 1100, 1101, 1110, 1111 + +def test_inheritance_1100(tmp_path, detector_file_commands): + command = detector_file_commands('case_1100') + assert command['help'] == "1100" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args', 'detectors'} + assert len(command['actions']['GET']['args']) == 2 + assert command['actions']['GET']['args'][0]['argc'] == 0 + assert command['actions']['GET']['args'][0]['output'] == [] + + assert command['actions']['GET']['args'][1]['argc'] == 1 + assert command['actions']['GET']['args'][1]['output'] == ['testytest'] + + assert command['actions']['GET']['detectors'].keys() == {'EIGER', 'POTATO'} + assert len(command['actions']['GET']['detectors']['EIGER']) == 1 + assert command['actions']['GET']['detectors']['EIGER'][0]['argc'] == 99 + assert command['actions']['GET']['detectors']['EIGER'][0]['function'] == 'do_eiger' + assert command['actions']['GET']['detectors']['EIGER'][0]['output'] == ['eigerOutput'] + + assert len(command['actions']['GET']['detectors']['POTATO']) == 2 + assert command['actions']['GET']['detectors']['POTATO'][0]['argc'] == 0 + assert command['actions']['GET']['detectors']['POTATO'][0]['function'] == 'do_potato' + + +def test_inheritance_1101(tmp_path, detector_file_commands): + command = detector_file_commands('case_1101') + assert command['help'] == "1101" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args', 'detectors'} + assert len(command['actions']['GET']['args']) == 2 + assert command['actions']['GET']['args'][0]['argc'] == 0 + assert command['actions']['GET']['args'][0]['output'] == [] + assert command['actions']['GET']['args'][1]['argc'] == 1 + assert command['actions']['GET']['args'][1]['output'] == ['testytest'] + + assert command['actions']['GET']['detectors'].keys() == {'EIGER', 'MYTHEN3', 'POTATO'} + assert len(command['actions']['GET']['detectors']['MYTHEN3']) == 2 + assert command['actions']['GET']['detectors']['MYTHEN3'][0]['argc'] == 0 + assert command['actions']['GET']['detectors']['MYTHEN3'][0]['function'] == 'do_mythen3' + assert command['actions']['GET']['detectors']['MYTHEN3'][1]['argc'] == 1 + assert command['actions']['GET']['detectors']['MYTHEN3'][1]['function'] == 'do_mythen3' + + assert len(command['actions']['GET']['detectors']['EIGER']) == 1 + assert command['actions']['GET']['detectors']['EIGER'][0]['argc'] == 99 + assert command['actions']['GET']['detectors']['EIGER'][0]['function'] == 'do_eiger' + assert command['actions']['GET']['detectors']['EIGER'][0]['output'] == ['eigerOutput'] + + assert len(command['actions']['GET']['detectors']['POTATO']) == 2 + assert command['actions']['GET']['detectors']['POTATO'][0]['argc'] == 101 + assert command['actions']['GET']['detectors']['POTATO'][0]['function'] == 'potato_function' + assert command['actions']['GET']['detectors']['POTATO'][1]['argc'] == 202 + assert command['actions']['GET']['detectors']['POTATO'][1]['function'] == 'do_potato' + + +def test_inheritance_1110(tmp_path, detector_file_commands): + command = detector_file_commands('case_1110') + assert command['help'] == "1110" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args', 'detectors'} + assert len(command['actions']['GET']['args']) == 1 + assert command['actions']['GET']['args'][0]['argc'] == 77 + assert command['actions']['GET']['args'][0]['function'] == 'get_function' + + assert command['actions']['GET']['detectors'].keys() == {'EIGER', 'POTATO'} + assert len(command['actions']['GET']['detectors']['EIGER']) == 1 + assert command['actions']['GET']['detectors']['EIGER'][0]['argc'] == 99 + assert command['actions']['GET']['detectors']['EIGER'][0]['function'] == 'do_eiger' + + assert len(command['actions']['GET']['detectors']['POTATO']) == 2 + assert command['actions']['GET']['detectors']['POTATO'][0]['argc'] == 0 + assert command['actions']['GET']['detectors']['POTATO'][0]['function'] == 'do_potato' + assert command['actions']['GET']['detectors']['POTATO'][1]['argc'] == 1 + assert command['actions']['GET']['detectors']['POTATO'][1]['function'] == 'do_potato' + + +def test_inheritance_1111(tmp_path, detector_file_commands): + command = detector_file_commands('case_1111') + assert command['help'] == "1111" + assert 'actions' in command + assert command['actions'].keys() == {'GET'} + assert command['actions']['GET'].keys() == {'args', 'detectors'} + assert len(command['actions']['GET']['args']) == 1 + assert command['actions']['GET']['args'][0]['argc'] == 77 + assert command['actions']['GET']['args'][0]['function'] == 'get_function' + + assert command['actions']['GET']['detectors'].keys() == {'EIGER', 'MYTHEN3', 'POTATO'} + assert len(command['actions']['GET']['detectors']['MYTHEN3']) == 1 + assert command['actions']['GET']['detectors']['MYTHEN3'][0]['argc'] == 77 + assert command['actions']['GET']['detectors']['MYTHEN3'][0]['function'] == 'do_mythen3' + + assert len(command['actions']['GET']['detectors']['EIGER']) == 1 + assert command['actions']['GET']['detectors']['EIGER'][0]['argc'] == 99 + assert command['actions']['GET']['detectors']['EIGER'][0]['function'] == 'do_eiger' + + assert len(command['actions']['GET']['detectors']['POTATO']) == 2 + assert command['actions']['GET']['detectors']['POTATO'][0]['argc'] == 101 + assert command['actions']['GET']['detectors']['POTATO'][0]['function'] == 'potato_function' + assert command['actions']['GET']['detectors']['POTATO'][1]['argc'] == 202 + assert command['actions']['GET']['detectors']['POTATO'][1]['function'] == 'do_potato' diff --git a/slsDetectorSoftware/generator/tests/test_parse_and_generate.py b/slsDetectorSoftware/generator/tests/test_parse_and_generate.py new file mode 100644 index 000000000..333c667b8 --- /dev/null +++ b/slsDetectorSoftware/generator/tests/test_parse_and_generate.py @@ -0,0 +1,29 @@ +from pathlib import Path +from commands_parser.commands_parser import CommandParser +import gen_commands + +data_path = Path(__file__).parent.parent + + +def test_parse_and_generate(tmp_path): + """ + tests that the parse and generate functions work without errors + :param tmp_path: + :return: + """ + output_file = tmp_path / "detectors.yaml" + command_parser = CommandParser(commands_file=data_path / "commands.yaml", output_file=output_file) + command_parser.verify_format() + command_parser.parse_all_commands() + assert output_file.exists() + + GEN_PATH = Path(__file__).parent.parent + gen_commands.generate( + output_file, + GEN_PATH / "Caller.in.cpp", + GEN_PATH / "Caller.in.h", + tmp_path / "Caller.cpp", + tmp_path / "Caller.h", + ) + assert (tmp_path / "Caller.cpp").exists() + assert (tmp_path / "Caller.h").exists() diff --git a/slsDetectorSoftware/generator/very_special_functions.txt b/slsDetectorSoftware/generator/very_special_functions.txt new file mode 100644 index 000000000..63ee9c104 --- /dev/null +++ b/slsDetectorSoftware/generator/very_special_functions.txt @@ -0,0 +1,28 @@ +hostname (find +) +acquire +versions (maybe with few tweaks) +threshold (+++++) +trimen (maybe with few tweaks) +badchannels (somewhat special) +currentsource (special) +dacvalues (can be done with the ctb_output_list) +udp_srcip (could be done if I add condition functionality for logging) +udp_srcip2 (same as above) +udp_dstip (same as above) +udp_dstip2 +rx_hostname (split('+')) +rx_roi (can be done if there;s condition support?) +ratecorr (can be done if there's condition support?) +burstmode (very special) +vetostream +counters +gaincaps (has for loop and condition) +samples (ask Dhanya if it is okay to change the order of calling the ctb functions in PUT) +slowadc (has for loop) +rx_dbitlist (very special) +rx_jsonaddheader (very special) +execcommand (has for loop) +thresholdnotb +# notes +# ReceiverStatus error on put is not done +# ask about burstmode function diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 7467789aa..4f346effa 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -71,7 +71,6 @@ class Detector { /** Gets shared memory ID */ int getShmId() const; - /** package git branch */ std::string getPackageVersion() const; std::string getClientVersion() const; diff --git a/slsDetectorSoftware/src/Caller.cpp b/slsDetectorSoftware/src/Caller.cpp new file mode 100644 index 000000000..29897ea8c --- /dev/null +++ b/slsDetectorSoftware/src/Caller.cpp @@ -0,0 +1,18155 @@ +#include "Caller.h" +#include "sls/logger.h" +#include "sls/string_utils.h" +#include + +namespace sls { + +std::string Caller::activate(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: activate" << std::endl; + os << R"V0G0N([0, 1] + [Eiger] 1 is default. 0 deactivates readout and does not send data. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getActive(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setActive(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adcclk(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcclk" << std::endl; + os << R"V0G0N([n_clk in MHz] + [Ctb] ADC clock frequency in MHz. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getADCClock(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setADCClock(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adcenable(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcenable" << std::endl; + os << R"V0G0N([bitmask] + [Ctb] ADC Enable Mask for 1Gb Enable for each 32 ADC channel. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getADCEnableMask(std::vector{det_id}); + os << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setADCEnableMask(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adcenable10g(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcenable10g" << std::endl; + os << R"V0G0N([bitmask] + [Ctb] ADC Enable Mask for 10Gb mode for each 32 ADC channel. However, if any of a consecutive 4 bits are enabled, the complete 4 bits are enabled. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTenGigaADCEnableMask(std::vector{det_id}); + os << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTenGigaADCEnableMask(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adcindex(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcindex" << std::endl; + os << R"V0G0N([name] + [ChipTestBoard] Get the adc index for the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute adcindex at module level"); + } + auto t = det->getAdcIndex(args[0]); + os << static_cast(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adcinvert(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcinvert" << std::endl; + os << R"V0G0N([bitmask] + [Ctb][Jungfrau][Moench] ADC Inversion Mask. + [Jungfrau][Moench] Inversions on top of the default mask. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getADCInvert(std::vector{det_id}); + os << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setADCInvert(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adclist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adclist" << std::endl; + os << R"V0G0N([adcname1 adcname2 .. adcname32] + [ChipTestBoard] Set the list of adc names for this board. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute adclist at module level"); + } + auto t = det->getAdcNames(); + os << ToString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (cmd == "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError("This detector already has fixed dac names. " + "Cannot change them."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute adclist at module level"); + } + det->setAdcNames(args); + os << ToString(args) << '\n'; + } + + return os.str(); +} + +std::string Caller::adcname(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcname" << std::endl; + os << R"V0G0N([0-31][name] + [ChipTestBoard] Set the adc at the given position to the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute adcname at module level"); + } + auto arg0 = StringTo(args[0]); + auto t = det->getAdcName(arg0); + os << args[0] << ' ' << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute adcname at module level"); + } + auto arg0 = StringTo(args[0]); + det->setAdcName(arg0, args[1]); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adcphase(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcphase" << std::endl; + os << R"V0G0N([n_value] [(optional)deg] + [Jungfrau][Moench][Ctb][Gotthard] Phase shift of ADC clock. + [Jungfrau][Moench] Absolute phase shift. If deg used, then shift in degrees. Changing Speed also resets adcphase to recommended defaults. + [Ctb] Absolute phase shift. If deg used, then shift in degrees. Changing adcclk also resets adcphase and sets it to previous values. + [Gotthard] Relative phase shift. Cannot get )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + } + + if (args.size() == 1) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + if (args.size() == 2) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2) { + throw RuntimeError( + "adcphase not implemented for this detector"); + } + auto t = det->getADCPhase(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2) { + throw RuntimeError( + "adcphase not implemented for this detector"); + } + if (args[0] != "deg") { + throw RuntimeError("Unknown adcphase argument " + args[0] + + ". Did you mean deg? "); + } + auto t = det->getADCPhaseInDegrees(std::vector{det_id}); + os << OutString(t) << " deg" << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2) { + throw RuntimeError( + "adcphase not implemented for this detector"); + } + auto arg0 = StringTo(args[0]); + det->setADCPhase(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + + if (args.size() == 2) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2) { + throw RuntimeError( + "adcphase not implemented for this detector"); + } + if (args[1] != "deg") { + throw RuntimeError("Unknown adcphase 2nd argument " + args[1] + + ". Did you mean deg?"); + } + auto arg0 = StringTo(args[0]); + det->setADCPhaseInDegrees(arg0, std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adcpipeline(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcpipeline" << std::endl; + os << R"V0G0N([n_value] + [Ctb][Moench] Pipeline for ADC clock. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getADCPipeline(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setADCPipeline(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adcreg(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcreg" << std::endl; + os << R"V0G0N([address] [value] + [Jungfrau][Moench][Ctb][Gotthard] Writes to an adc register in hex. Advanced user Function! )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to uint32_t"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->writeAdcRegister(arg0, arg1, std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::adcvpp(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: adcvpp" << std::endl; + os << R"V0G0N([dac or mV value][(optional unit) mV] + [Ctb] Vpp of ADC. + 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V. + Advanced User function! )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + try { + StringTo("0"); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + if (args.size() == 1) { + try { + StringTo("1"); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo("0"); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to bool"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo("1"); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto arg0 = StringTo("0"); + auto t = det->getADCVpp(arg0, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + if ((args[0] != "mv") && (args[0] != "mV")) { + throw RuntimeError("Unknown argument " + args[0] + + ". Did you mean mV?"); + } + auto arg0 = StringTo("1"); + auto t = det->getADCVpp(arg0, std::vector{det_id}); + os << OutString(t) << " mV" << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo("0"); + det->setADCVpp(arg0, arg1, std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + if ((args[1] != "mv") && (args[1] != "mV")) { + throw RuntimeError("Unknown argument " + args[1] + + ". Did you mean mV?"); + } + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo("1"); + det->setADCVpp(arg0, arg1, std::vector{det_id}); + os << args[0] << " mV" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::apulse(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: apulse" << std::endl; + os << R"V0G0N([0, 1] + [Mythen3] Enables or disables analog pulsing. Default is disabled )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getAnalogPulsing(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setAnalogPulsing(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::asamples(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: asamples" << std::endl; + os << R"V0G0N([n_samples] + [CTB] Number of analog samples expected. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfAnalogSamples(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setNumberOfAnalogSamples(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::autocompdisable(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: autocompdisable" << std::endl; + os << R"V0G0N([0, 1] + [Jungfrau] Auto comparator disable mode. By default, the on-chip gain switching is active during the entire exposure.This mode disables the on - chip gain switching comparator automatically after 93.75% (only for chipv1.0) of exposure time (only for longer than 100us). It is possible to set the duration for chipv1.1 using compdisabletime command. + Default is 0 or this mode disabled(comparator enabled throughout). 1 enables mode. 0 disables mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getAutoComparatorDisable(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setAutoComparatorDisable(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::blockingtrigger(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: blockingtrigger" << std::endl; + os << R"V0G0N( + [Eiger][Jungfrau][Moench] Sends software trigger signal to detector and blocks till the frames are sent out for that trigger. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + bool block = true; + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + bool block = true; + if (det_id != -1) { + throw RuntimeError( + "Cannot execute blockingtrigger at module level"); + } + det->sendSoftwareTrigger(block); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::burstperiod(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: burstperiod" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Gotthard2] Period between 2 bursts. Only in burst mode and auto timing mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getBurstPeriod(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getBurstPeriod(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setBurstPeriod(converted_time, std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + auto converted_time = StringTo(args[0], args[1]); + det->setBurstPeriod(converted_time, std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::bursts(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: bursts" << std::endl; + os << R"V0G0N([n_bursts] + [Gotthard2] Number of bursts per aquire. Only in auto timing mode and burst mode. Use timing command to set timing mode and burstmode command to set burst mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int64_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfBursts(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute bursts at module level"); + } + auto arg0 = StringTo(args[0]); + det->setNumberOfBursts(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::burstsl(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: burstsl" << std::endl; + os << R"V0G0N( + [Gotthard2] Number of bursts left in acquisition. Only in burst auto mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfBurstsLeft(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::bustest(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: bustest" << std::endl; + os << R"V0G0N( + [Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Bus test, ie. Writes different values in a R/W register and confirms the writes to check bus. + Advanced User function! )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->executeBusTest(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::cdsgain(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: cdsgain" << std::endl; + os << R"V0G0N([0, 1] + [Gotthard2] Enable or disable CDS gain. Default is disabled. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getCDSGain(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setCDSGain(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::chipversion(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: chipversion" << std::endl; + os << R"V0G0N( + [Jungfrau] Returns chip version. Can be 1.0 or 1.1 )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getChipVersion(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::clearbit(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: clearbit" << std::endl; + os << R"V0G0N([reg address in hex] [bit index] + Clears bit in address. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + if (StringTo(args[1]) < 0 || StringTo(args[1]) > 31) { + throw RuntimeError("Bit number out of range: " + args[1]); + } + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->clearBit(arg0, arg1, std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::clearbusy(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: clearbusy" << std::endl; + os << R"V0G0N( + If acquisition aborted during acquire command, use this to clear acquiring flag in shared memory before starting next acquisition )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError("Cannot execute clearbusy at module level"); + } + det->clearAcquiringFlag(); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::clearroi(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: clearroi" << std::endl; + os << R"V0G0N([Gotthard] Resets Region of interest in detector. All channels enabled. Default is all channels enabled. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->clearROI(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::clientversion(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: clientversion" << std::endl; + os << R"V0G0N( + Client software version )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getClientVersion(); + os << t << '\n'; + } + } + + return os.str(); +} + +std::string Caller::clkdiv(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: clkdiv" << std::endl; + os << R"V0G0N([n_clock (0-5)] [n_divider] + [Gotthard2][Mythen3] Clock Divider of clock n_clock. Must be greater than 1. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { + throw RuntimeError("clkdiv not implemented for this detector."); + } + auto arg0 = StringTo(args[0]); + auto t = det->getClockDivider(arg0, std::vector{det_id}); + os << args[0] << ' ' << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { + throw RuntimeError("clkdiv not implemented for this detector."); + } + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setClockDivider(arg0, arg1, std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::clkfreq(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: clkfreq" << std::endl; + os << R"V0G0N([n_clock (0-5)] [freq_in_Hz] + [Gotthard2][Mythen3] Frequency of clock n_clock in Hz. Use clkdiv to set frequency. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { + throw RuntimeError( + "clkfreq not implemented for this detector."); + } + auto arg0 = StringTo(args[0]); + auto t = det->getClockFrequency(arg0, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::clkphase(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: clkphase" << std::endl; + os << R"V0G0N([n_clock (0-5)] [phase] [deg (optional)] + [Gotthard2][Mythen3] Phase of clock n_clock. If deg, then phase shift in degrees, else absolute phase shift values. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + if (args.size() == 2) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2 && args.size() != 3) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + if (args.size() == 3) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { + throw RuntimeError( + "clkphase not implemented for this detector."); + } + auto arg0 = StringTo(args[0]); + auto t = det->getClockPhase(arg0, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 2) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { + throw RuntimeError( + "clkphase not implemented for this detector."); + } + if (args[1] != "deg") { + throw RuntimeError("Cannot scan argument" + args[1] + + ". Did you mean deg?"); + } + auto arg0 = StringTo(args[0]); + auto t = + det->getClockPhaseinDegrees(arg0, std::vector{det_id}); + os << OutString(t) << " deg" << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { + throw RuntimeError( + "clkphase not implemented for this detector."); + } + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setClockPhase(arg0, arg1, std::vector{det_id}); + os << args[1] << '\n'; + } + + if (args.size() == 3) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { + throw RuntimeError( + "clkphase not implemented for this detector."); + } + if (args[2] != "deg") { + throw RuntimeError("Cannot scan argument" + args[2] + + ". Did you mean deg?"); + } + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setClockPhaseinDegrees(arg0, arg1, std::vector{det_id}); + os << args[1] << " " << args[2] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::column(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: column" << std::endl; + os << R"V0G0N([value] + Set Detector column (udp header) to value. + Gui uses it to rearrange for complete image )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getColumn(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setColumn(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::compdisabletime(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: compdisabletime" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Jungfrau] Time before end of exposure when comparator is disabled. It is only possible for chipv1.1. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getComparatorDisableTime(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getComparatorDisableTime(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setComparatorDisableTime(converted_time, + std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + auto converted_time = StringTo(args[0], args[1]); + det->setComparatorDisableTime(converted_time, + std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::confadc(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: confadc" << std::endl; + os << R"V0G0N([chip index 0-9, -1 for all] [adc index 0-31, -1 for all] [7 bit configuration value in hex] + [Gotthard2] Sets configuration for specific chip and adc, but configures 1 chip (all adcs for that chip) at a time. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 3) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 3) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo(args[2]); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + auto t = + det->getADCConfiguration(arg0, arg1, std::vector{det_id}); + os << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 3) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + auto arg2 = StringTo(args[2]); + det->setADCConfiguration(arg0, arg1, arg2, + std::vector{det_id}); + os << '[' << args[0] << ", " << args[1] << ", " + << ToStringHex(StringTo(args[2])) << "]" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::config(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: config" << std::endl; + os << R"V0G0N( + Frees shared memory before loading configuration file. Set up once. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute config at module level"); + } + det->loadConfig(args[0]); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::dac(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + return GetHelpDacWrapper(cmd, args); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::dacIndex dacIndex = + (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + !is_int(args[0])) + ? det->getDacIndex(args[0]) + : StringTo(args[0]); + try { + StringTo("0"); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to bool"); + } + } + + if (args.size() == 2) { + defs::dacIndex dacIndex = + (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + !is_int(args[0])) + ? det->getDacIndex(args[0]) + : StringTo(args[0]); + try { + StringTo("1"); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to bool"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2 && args.size() != 3) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + defs::dacIndex dacIndex = + (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + !is_int(args[0])) + ? det->getDacIndex(args[0]) + : StringTo(args[0]); + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo("0"); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to bool"); + } + } + + if (args.size() == 3) { + defs::dacIndex dacIndex = + (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + !is_int(args[0])) + ? det->getDacIndex(args[0]) + : StringTo(args[0]); + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo("1"); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::dacIndex dacIndex = + (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + !is_int(args[0])) + ? det->getDacIndex(args[0]) + : StringTo(args[0]); + if (is_int(args[0]) && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError( + "Dac indices can only be used for chip test board. Use " + "daclist to get list of dac names for current detector."); + } + auto arg1 = StringTo("0"); + auto t = det->getDAC(dacIndex, arg1, std::vector{det_id}); + os << args[0] << ' ' << OutString(t) << '\n'; + } + + if (args.size() == 2) { + defs::dacIndex dacIndex = + (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + !is_int(args[0])) + ? det->getDacIndex(args[0]) + : StringTo(args[0]); + if (is_int(args[0]) && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError( + "Dac indices can only be used for chip test board. Use " + "daclist to get list of dac names for current detector."); + } + if (args[1] != "mv" && args[1] != "mV") { + throw RuntimeError("Unknown argument " + args[1] + + ". Did you mean mV?"); + } + auto arg1 = StringTo("1"); + auto t = det->getDAC(dacIndex, arg1, std::vector{det_id}); + os << args[0] << ' ' << OutString(t) << " mV" << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + defs::dacIndex dacIndex = + (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + !is_int(args[0])) + ? det->getDacIndex(args[0]) + : StringTo(args[0]); + if (is_int(args[0]) && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError( + "Dac indices can only be used for chip test board. Use " + "daclist to get list of dac names for current detector."); + } + auto arg1 = StringTo(args[1]); + auto arg2 = StringTo("0"); + det->setDAC(dacIndex, arg1, arg2, std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + + if (args.size() == 3) { + defs::dacIndex dacIndex = + (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + !is_int(args[0])) + ? det->getDacIndex(args[0]) + : StringTo(args[0]); + if (is_int(args[0]) && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError( + "Dac indices can only be used for chip test board. Use " + "daclist to get list of dac names for current detector."); + } + auto arg1 = StringTo(args[1]); + auto arg2 = StringTo("1"); + det->setDAC(dacIndex, arg1, arg2, std::vector{det_id}); + os << args[0] << ' ' << args[1] << " mV" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::dacindex(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: dacindex" << std::endl; + os << R"V0G0N([name] + [ChipTestBoard] Get the dac index for the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::dacIndex index = defs::DAC_0; + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::dacIndex index = defs::DAC_0; + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute dacindex at module level"); + } + auto t = det->getDacIndex(args[0]); + os << ToString(static_cast(t) - index) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::daclist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: daclist" << std::endl; + os << R"V0G0N([dacname1 dacname2 .. dacname18] + [ChipTestBoard] Set the list of dac names for this detector. + [All] Gets the list of dac names for every dac for this detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute daclist at module level"); + } + auto t = det->getDacNames(); + os << ToString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (cmd == "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError("This detector already has fixed dac names. " + "Cannot change them."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute daclist at module level"); + } + det->setDacNames(args); + os << ToString(args) << '\n'; + } + + return os.str(); +} + +std::string Caller::dacname(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: dacname" << std::endl; + os << R"V0G0N([0-17][name] + [ChipTestBoard] Set the dac at the given position to the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::dacIndex index = defs::DAC_0; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + defs::dacIndex index = defs::DAC_0; + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::dacIndex index = defs::DAC_0; + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute dacname at module level"); + } + auto t = det->getDacName( + static_cast(StringTo(args[0]) + index)); + os << args[0] << ' ' << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + defs::dacIndex index = defs::DAC_0; + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute dacname at module level"); + } + det->setDacName( + static_cast(StringTo(args[0]) + index), + args[1]); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::datastream(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: datastream" << std::endl; + os << R"V0G0N([left|right] [0, 1] + [Eiger] Enables or disables data streaming from left or/and right side of detector for 10 GbE mode. 1 (enabled) by default. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::portPosition"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::portPosition"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + auto t = det->getDataStream(arg0, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setDataStream(arg0, arg1, std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::dbitclk(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: dbitclk" << std::endl; + os << R"V0G0N([n_clk in MHz] + [Ctb] Clock for latching the digital bits in MHz. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDBITClock(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setDBITClock(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::dbitphase(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: dbitphase" << std::endl; + os << R"V0G0N([n_value] [(optional)deg] + [Ctb][Jungfrau] Phase shift of clock to latch digital bits. Absolute phase shift. If deg used, then shift in degrees. + [Ctb]Changing dbitclk also resets dbitphase and sets to previous values. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + } + + if (args.size() == 1) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + if (args.size() == 2) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2 || det_type == defs::MOENCH) { + throw RuntimeError( + "dbitphase not implemented for this detector"); + } + auto t = det->getDBITPhase(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2 || det_type == defs::MOENCH) { + throw RuntimeError( + "dbitphase not implemented for this detector"); + } + if (args[0] != "deg") { + throw RuntimeError("Unknown dbitphase argument " + args[0] + + ". Did you mean deg? "); + } + auto t = det->getDBITPhaseInDegrees(std::vector{det_id}); + os << OutString(t) << " deg" << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2 || det_type == defs::MOENCH) { + throw RuntimeError( + "dbitphase not implemented for this detector"); + } + auto arg0 = StringTo(args[0]); + det->setDBITPhase(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + + if (args.size() == 2) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2 || det_type == defs::MOENCH) { + throw RuntimeError( + "dbitphase not implemented for this detector"); + } + if (args[1] != "deg") { + throw RuntimeError("Unknown dbitphase 2nd argument " + args[1] + + ". Did you mean deg? "); + } + auto arg0 = StringTo(args[0]); + det->setDBITPhaseInDegrees(arg0, std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::dbitpipeline(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: dbitpipeline" << std::endl; + os << R"V0G0N([n_value] + [Ctb][Gotthard2] Pipeline of the clock for latching digital bits. + [Gotthard2] Options: 0-7 + [CTB] Options: 0-255 )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDBITPipeline(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setDBITPipeline(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::defaultdac(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: defaultdac" << std::endl; + os << R"V0G0N([dac name][value][(optional)setting] + Sets the default for that dac to this value. + [Jungfrau][Moench][Mythen3] When settings is provided, it sets the default value only for that setting )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::dacIndex"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::dacIndex"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 1 to defs::detectorSettings"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2 && args.size() != 3) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::dacIndex"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + if (args.size() == 3) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::dacIndex"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo(args[2]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 2 to defs::detectorSettings"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + auto t = det->getDefaultDac(arg0, std::vector{det_id}); + os << args[0] << ' ' << OutString(t) << '\n'; + } + + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + auto t = det->getDefaultDac(arg0, arg1, std::vector{det_id}); + os << args[0] << ' ' << args[1] << ' ' << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setDefaultDac(arg0, arg1, std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + + if (args.size() == 3) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + auto arg2 = StringTo(args[2]); + det->setDefaultDac(arg0, arg1, arg2, std::vector{det_id}); + os << args[0] << ' ' << args[2] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::defaultpattern(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: defaultpattern" << std::endl; + os << R"V0G0N( + [Mythen3] Loads and runs default pattern in pattern generator. It is to go back to initial settings. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->loadDefaultPattern(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::delay(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: delay" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb][Moench] Delay after trigger )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDelayAfterTrigger(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getDelayAfterTrigger(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setDelayAfterTrigger(converted_time, std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + auto converted_time = StringTo(args[0], args[1]); + det->setDelayAfterTrigger(converted_time, std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::delayl(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: delayl" << std::endl; + os << R"V0G0N( + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Delay Left in Acquisition. + [Gotthard2] only in continuous mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDelayAfterTriggerLeft(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getDelayAfterTriggerLeft(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::detectorserverversion(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: detectorserverversion" << std::endl; + os << R"V0G0N( + On-board detector server software version )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDetectorServerVersion(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::detsize(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: detsize" << std::endl; + os << R"V0G0N([nx] [ny] + Detector size, ie. Number of channels in x and y dim. This is used to calculate module coordinates included in UDP data. + By default, it adds module in y dimension for 2d detectors and in x dimension for 1d detectors packet header. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDetectorSize(); + os << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + det->setDetectorSize( + defs::xy(StringTo(args[0]), StringTo(args[1]))); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::diodelay(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: diodelay" << std::endl; + os << R"V0G0N([0-775] + [Ctb] Delay for diode. Delay is in ps and max of 775 ps. Resolution is 25 ps. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint64_t"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setDigitalIODelay(arg0, arg1, std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::dpulse(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: dpulse" << std::endl; + os << R"V0G0N([0, 1] + [Mythen3] Enables or disables digital pulsing. Default is disabled )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDigitalPulsing(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setDigitalPulsing(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::dr(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: dr" << std::endl; + os << R"V0G0N([value] + Dynamic Range or number of bits per pixel in detector. + [Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets clkdivider to 2, else to 0. + [Mythen3] Options: 8, 16, 32 + [Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16 )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDynamicRange(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute dr at module level"); + } + auto arg0 = StringTo(args[0]); + det->setDynamicRange(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::drlist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: drlist" << std::endl; + os << R"V0G0N( + Gets the list of dynamic ranges for this detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDynamicRangeList(); + os << ToString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::dsamples(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: dsamples" << std::endl; + os << R"V0G0N([n_value] + [CTB] Number of digital samples expected. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfDigitalSamples(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setNumberOfDigitalSamples(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::exptime(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: exptime" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Eiger][Jungfrau][Moench][Gotthard][Gotthard2][Ctb] Exposure time + [Mythen3] Exposure time of all gate signals in auto and trigger mode (internal gating). To specify gate index, use exptime1, exptime2, exptime3. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + auto detector_type = det->getDetectorType().squash(); + if (action == slsDetectorDefs::GET_ACTION) { + if (detector_type == defs::MYTHEN3) { + if (args.size() == 0) { + auto t = det->getExptimeForAllGates(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getExptimeForAllGates(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + + } + + else { + + if (args.size() == 0) { + auto t = det->getExptime(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getExptime(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setExptime(converted_time, std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + auto converted_time = StringTo(args[0], args[1]); + det->setExptime(converted_time, std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::exptime1(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: exptime1" << std::endl; + os << R"V0G0N([n_value] + [Mythen3] Exposure time of gate signal 1 in auto and trigger mode (internal gating). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + int gateIndex = 0; + } + + if (args.size() == 1) { + int gateIndex = 0; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + int gateIndex = 0; + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + int gateIndex = 0; + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + int gateIndex = 0; + auto t = det->getExptime(gateIndex, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + int gateIndex = 0; + auto t = det->getExptime(gateIndex, std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + int gateIndex = 0; + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setExptime(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + int gateIndex = 0; + auto converted_time = StringTo(args[0], args[1]); + det->setExptime(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::exptime2(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: exptime2" << std::endl; + os << R"V0G0N([n_value] + [Mythen3] Exposure time of gate signal 2 in auto and trigger mode (internal gating). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + int gateIndex = 1; + } + + if (args.size() == 1) { + int gateIndex = 1; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + int gateIndex = 1; + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + int gateIndex = 1; + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + int gateIndex = 1; + auto t = det->getExptime(gateIndex, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + int gateIndex = 1; + auto t = det->getExptime(gateIndex, std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + int gateIndex = 1; + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setExptime(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + int gateIndex = 1; + auto converted_time = StringTo(args[0], args[1]); + det->setExptime(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::exptime3(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: exptime3" << std::endl; + os << R"V0G0N([n_value] + [Mythen3] Exposure time of gate signal 3 in auto and trigger mode (internal gating). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + int gateIndex = 2; + } + + if (args.size() == 1) { + int gateIndex = 2; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + int gateIndex = 2; + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + int gateIndex = 2; + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + int gateIndex = 2; + auto t = det->getExptime(gateIndex, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + int gateIndex = 2; + auto t = det->getExptime(gateIndex, std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + int gateIndex = 2; + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setExptime(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + int gateIndex = 2; + auto converted_time = StringTo(args[0], args[1]); + det->setExptime(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::exptimel(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: exptimel" << std::endl; + os << R"V0G0N([(optional unit) ns|us|ms|s] + [Gotthard] Exposure time left for current frame. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getExptimeLeft(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getExptimeLeft(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::extrastoragecells(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: extrastoragecells" << std::endl; + os << R"V0G0N([0-15] + [Jungfrau] Only for chipv1.0. Number of additional storage cells. Default is 0. For advanced users only. + The #images = #frames x #triggers x (#extrastoragecells + 1). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfAdditionalStorageCells( + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError( + "Cannot execute extrastoragecells at module level"); + } + auto arg0 = StringTo(args[0]); + det->setNumberOfAdditionalStorageCells(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::extsampling(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: extsampling" << std::endl; + os << R"V0G0N([0, 1] + [Ctb] Enable for external sampling signal for digital data to signal by extsampling src command. For advanced users only. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getExternalSampling(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setExternalSampling(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::extsamplingsrc(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: extsamplingsrc" << std::endl; + os << R"V0G0N([0-63] + [Ctb] Sampling source signal for digital data. For advanced users only. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getExternalSamplingSource(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setExternalSamplingSource(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::extsig(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: extsig" << std::endl; + os << R"V0G0N([n_signal] [signal_type] + [Gotthard][Mythen3] External signal mode for trigger timing mode. + [Gotthard] [0] [trigger_in_rising_edge|trigger_in_falling_edge] + [Mythen3] [0-7] [trigger_in_rising_edge|trigger_in_falling_edge|inversion_on|inversion_off] + where 0 is master input trigger signal, 1-3 is master input gate signals, 4 is busy out signal and 5-7 is master output gate signals. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 1 to defs::externalSignalFlag"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + auto t = + det->getExternalSignalFlags(arg0, std::vector{det_id}); + os << args[0] << ' ' << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setExternalSignalFlags(arg0, arg1, std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::fformat(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: fformat" << std::endl; + os << R"V0G0N([binary|hdf5] + File format of data file. For HDF5, package must be compiled with HDF5 flags. Default is binary. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::fileFormat"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFileFormat(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setFileFormat(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::filtercells(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: filtercells" << std::endl; + os << R"V0G0N([0-12] + [Jungfrau] Set Filter Cell. Only for chipv1.1. Advanced user Command )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfFilterCells(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setNumberOfFilterCells(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::filterresistor(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: filterresistor" << std::endl; + os << R"V0G0N([value] [Gotthard2][Jungfrau] Set filter resistor. Increasing values for increasing resistance. + [Gotthard2] Options: [0|1|2|3]. Default is 0. + [Jungfrau] Options: [0|1]. Default is 1. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFilterResistor(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setFilterResistor(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::findex(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: findex" << std::endl; + os << R"V0G0N([n_value] + File or Acquisition index. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint64_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getAcquisitionIndex(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setAcquisitionIndex(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::firmwaretest(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: firmwaretest" << std::endl; + os << R"V0G0N( + [Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Firmware test, ie. reads a read fixed pattern from a register. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->executeFirmwareTest(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::firmwareversion(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: firmwareversion" << std::endl; + os << R"V0G0N( + Firmware version of detector in format [0xYYMMDD] or an increasing 2 digit number for Eiger. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + auto detector_type = det->getDetectorType().squash(); + if (action == slsDetectorDefs::GET_ACTION) { + if (detector_type == defs::EIGER) { + if (args.size() == 0) { + auto t = det->getFirmwareVersion(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + } + + else { + + if (args.size() == 0) { + auto t = det->getFirmwareVersion(std::vector{det_id}); + os << OutStringHex(t) << '\n'; + } + } + } + + return os.str(); +} + +std::string Caller::fliprows(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: fliprows" << std::endl; + os << R"V0G0N([0, 1] + [Eiger] flips rows paramater sent to slsreceiver to stream as json parameter to flip rows in gui + [Jungfrau][Moench] flips rows in the detector itself. For bottom module and number of interfaces must be set to 2. slsReceiver and slsDetectorGui does not handle. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFlipRows(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setFlipRows(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::flowcontrol10g(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: flowcontrol10g" << std::endl; + os << R"V0G0N([0, 1] + [Eiger][Jungfrau][Moench] 10GbE Flow Control. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTenGigaFlowControl(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTenGigaFlowControl(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::fmaster(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: fmaster" << std::endl; + os << R"V0G0N([0, 1] + Enable or disable receiver master file. Default is 1. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError("Cannot execute fmaster at module level"); + } + auto t = det->getMasterFileWrite(); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute fmaster at module level"); + } + auto arg0 = StringTo(args[0]); + det->setMasterFileWrite(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::fname(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: fname" << std::endl; + os << R"V0G0N([name] + File name prefix for output data file. Default is run. File name: [file name prefix]_d[detector index]_f[sub file index]_[acquisition/file index].raw. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFileNamePrefix(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setFileNamePrefix(args[0], std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::foverwrite(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: foverwrite" << std::endl; + os << R"V0G0N([0, 1] + Enable or disable file overwriting. Default is 1. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFileOverWrite(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setFileOverWrite(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::fpath(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: fpath" << std::endl; + os << R"V0G0N([path] + Directory where output data files are written in receiver. Default is '/'. + If path does not exist, it will try to create it. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFilePath(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setFilePath(args[0], std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::framecounter(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: framecounter" << std::endl; + os << R"V0G0N( + [Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames from start run control. + [Gotthard2] only in continuous mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfFramesFromStart(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::frames(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: frames" << std::endl; + os << R"V0G0N([n_frames] + Number of frames per acquisition. In trigger mode, number of frames per trigger. + Cannot be set in modular level. + In scan mode, number of frames is set to number of steps. + [Gotthard2] Burst mode has a maximum of 2720 frames. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int64_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfFrames(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute frames at module level"); + } + auto arg0 = StringTo(args[0]); + det->setNumberOfFrames(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::framesl(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: framesl" << std::endl; + os << R"V0G0N( + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames left in acquisition. + [Gotthard2] only in continuous auto mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfFramesLeft(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::frametime(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: frametime" << std::endl; + os << R"V0G0N([(optional unit) ns|us|ms|s] + [Jungfrau][Moench][Mythen3][Gotthard2][CTB] Timestamp at a frame start. + [Gotthard2] not in burst and auto mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasurementTime(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getMeasurementTime(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::fwrite(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: fwrite" << std::endl; + os << R"V0G0N([0, 1] + Enable or disable receiver file write. Default is 1. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFileWrite(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setFileWrite(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::gainmode(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: gainmode" << std::endl; + os << R"V0G0N([dynamicgain|forceswitchg1|forceswitchg2|fixg1|fixg2|fixg0] + [Jungfrau] Gain mode. + CAUTION: Do not use fixg0 without caution, you can damage the detector!!! )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::gainMode"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getGainMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setGainMode(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::gappixels(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: gappixels" << std::endl; + os << R"V0G0N([0, 1] + [Eiger][Jungfrau][Moench] Include Gap pixels in client data call back in Detecor api. Will not be in detector streaming, receiver file or streaming. Default is 0. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError("Cannot execute gappixels at module level"); + } + auto t = det->getGapPixelsinCallback(); + os << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute gappixels at module level"); + } + auto arg0 = StringTo(args[0]); + det->setGapPixelsinCallback(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::gatedelay(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: gatedelay" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Mythen3] Gate Delay of all gate signals in auto and trigger mode (internal gating). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + int gateIndex = -1; + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + int gateIndex = -1; + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getGateDelayForAllGates(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getGateDelayForAllGates(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + int gateIndex = -1; + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setGateDelay(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + int gateIndex = -1; + auto converted_time = StringTo(args[0], args[1]); + det->setGateDelay(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::gatedelay1(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: gatedelay1" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Mythen3] Gate Delay of gate signal 1 in auto and trigger mode (internal gating). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + int gateIndex = 0; + } + + if (args.size() == 1) { + int gateIndex = 0; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + int gateIndex = 0; + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + int gateIndex = 0; + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + int gateIndex = 0; + auto t = det->getGateDelay(gateIndex, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + int gateIndex = 0; + auto t = det->getGateDelay(gateIndex, std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + int gateIndex = 0; + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setGateDelay(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + int gateIndex = 0; + auto converted_time = StringTo(args[0], args[1]); + det->setGateDelay(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::gatedelay2(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: gatedelay2" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Mythen3] Gate Delay of gate signal 2 in auto and trigger mode (internal gating). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + int gateIndex = 1; + } + + if (args.size() == 1) { + int gateIndex = 1; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + int gateIndex = 1; + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + int gateIndex = 1; + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + int gateIndex = 1; + auto t = det->getGateDelay(gateIndex, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + int gateIndex = 1; + auto t = det->getGateDelay(gateIndex, std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + int gateIndex = 1; + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setGateDelay(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + int gateIndex = 1; + auto converted_time = StringTo(args[0], args[1]); + det->setGateDelay(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::gatedelay3(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: gatedelay3" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Mythen3] Gate Delay of gate signal 3 in auto and trigger mode (internal gating). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + int gateIndex = 2; + } + + if (args.size() == 1) { + int gateIndex = 2; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + int gateIndex = 2; + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + int gateIndex = 2; + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + int gateIndex = 2; + auto t = det->getGateDelay(gateIndex, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + int gateIndex = 2; + auto t = det->getGateDelay(gateIndex, std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + int gateIndex = 2; + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setGateDelay(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + int gateIndex = 2; + auto converted_time = StringTo(args[0], args[1]); + det->setGateDelay(gateIndex, converted_time, + std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::gates(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: gates" << std::endl; + os << R"V0G0N([n_gates] + [Mythen3] Number of external gates in gating or trigger_gating mode (external gating). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfGates(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setNumberOfGates(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::getbit(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: getbit" << std::endl; + os << R"V0G0N([reg address in hex] [bit index] + Gets bit in address. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 2) { + if (StringTo(args[1]) < 0 || StringTo(args[1]) > 31) { + throw RuntimeError("Bit number out of range: " + args[1]); + } + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + auto t = det->getBit(arg0, arg1, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::hardwareversion(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: hardwareversion" << std::endl; + os << R"V0G0N( + [Jungfrau][Gotthard2][Myhten3][Gotthard][Ctb][Moench] Hardware version of detector. + [Eiger] Hardware version of front FPGA on detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getHardwareVersion(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::highvoltage(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: highvoltage" << std::endl; + os << R"V0G0N([n_value] + High voltage to the sensor in Voltage. + [Gotthard] [0|90|110|120|150|180|200] + [Eiger][Mythen3][Gotthard2] 0-200 + [Jungfrau][Moench][Ctb] [0|60-200] )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getHighVoltage(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setHighVoltage(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::im_a(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: im_a" << std::endl; + os << R"V0G0N( + [Ctb] Measured current of power supply a in mA. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredCurrent(defs::I_POWER_A, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::im_b(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: im_b" << std::endl; + os << R"V0G0N( + [Ctb] Measured current of power supply b in mA. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredCurrent(defs::I_POWER_B, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::im_c(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: im_c" << std::endl; + os << R"V0G0N( + [Ctb] Measured current of power supply c in mA. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredCurrent(defs::I_POWER_C, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::im_d(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: im_d" << std::endl; + os << R"V0G0N( + [Ctb] Measured current of power supply d in mA. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredCurrent(defs::I_POWER_D, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::im_io(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: im_io" << std::endl; + os << R"V0G0N( + [Ctb] Measured current of power supply io in mA. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredCurrent(defs::I_POWER_IO, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::imagetest(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: imagetest" << std::endl; + os << R"V0G0N([0, 1] + [Gotthard] 1 adds channel intensity with precalculated values when taking an acquisition. Default is 0. + [Eiger][Jungfrau][Moench] Only for Virtual servers. If 0, each pixel intensity incremented by 1. If 1, all pixels almost saturated. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getImageTestMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setImageTestMode(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::initialchecks(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: initialchecks" << std::endl; + os << R"V0G0N([0, 1] + [Mythen3][Gotthard2] Enable or disable intial compatibility and other checks at detector start up. It is enabled by default. Must come before 'hostname' command to take effect. Can be used to reprogram fpga when current firmware is incompatible. + Advanced User function! )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError( + "Cannot execute initialchecks at module level"); + } + auto t = det->getInitialChecks(); + os << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError( + "Cannot execute initialchecks at module level"); + } + auto arg0 = StringTo(args[0]); + det->setInitialChecks(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::inj_ch(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: inj_ch" << std::endl; + os << R"V0G0N([offset] [increment] + [Gotthard2] Inject channels with current source for calibration. Offset is starting channel that is injected, increment determines succeeding channels to be injected. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getInjectChannel(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setInjectChannel(arg0, arg1, std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::interpolation(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: interpolation" << std::endl; + os << R"V0G0N([0, 1] + [Mythen3] Enables or disables interpolation. Default is disabled. Interpolation mode enables all counters and disables vth3. Disabling sets back counter mask and vth3. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getInterpolation(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setInterpolation(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::interruptsubframe(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: interruptsubframe" << std::endl; + os << R"V0G0N([0, 1] + [Eiger] 1 interrupts last subframe at required exposure time. 0 will wait for last sub frame to finish exposing. 0 is default. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getInterruptSubframe(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setInterruptSubframe(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::kernelversion(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: kernelversion" << std::endl; + os << R"V0G0N( + Get kernel version on the detector including time and date. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getKernelVersion(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::lastclient(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: lastclient" << std::endl; + os << R"V0G0N( + Client IP Address that last communicated with the detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getLastClientIP(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::led(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: led" << std::endl; + os << R"V0G0N([0, 1] + [Ctb] Switches on/off all LEDs. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getLEDEnable(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setLEDEnable(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::lock(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: lock" << std::endl; + os << R"V0G0N([0, 1] + Lock detector to one IP, 1: locks. Default is unlocked )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDetectorLock(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setDetectorLock(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::master(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: master" << std::endl; + os << R"V0G0N([0, 1] + [Eiger][Gotthard2][Jungfrau][Moench] Sets (half) module to master and other(s) to slaves. + [Gotthard][Gotthard2][Mythen3][Eiger][Jungfrau][Moench] Gets if the current (half) module is master. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMaster(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setMaster(arg0, det_id); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::maxadcphaseshift(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: maxadcphaseshift" << std::endl; + os << R"V0G0N( + [Jungfrau][Moench][CTB] Absolute maximum Phase shift of ADC clock. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMaxADCPhaseShift(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::maxclkphaseshift(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: maxclkphaseshift" << std::endl; + os << R"V0G0N([n_clock (0-5)] + [Gotthard2][Mythen3] Absolute Maximum Phase shift of clock n_clock. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::detectorType type = + det->getDetectorType().squash(defs::GENERIC); + ; + if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { + throw RuntimeError( + "maxclkphaseshift not implemented for this detector."); + } + auto arg0 = StringTo(args[0]); + auto t = det->getMaxClockPhaseShift(arg0, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::maxdbitphaseshift(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: maxdbitphaseshift" << std::endl; + os << R"V0G0N( + [CTB][Jungfrau] Absolute maximum Phase shift of of the clock to latch digital bits. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMaxDBITPhaseShift(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::measuredperiod(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: measuredperiod" << std::endl; + os << R"V0G0N([(optional unit) ns|us|ms|s] + [Eiger] Measured frame period between last frame and previous one. Can be measured with minimum 2 frames in an acquisition. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredPeriod(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getMeasuredPeriod(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::measuredsubperiod(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: measuredsubperiod" << std::endl; + os << R"V0G0N([(optional unit) ns|us|ms|s] + [Eiger] Measured sub frame period between last sub frame and previous one. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredSubFramePeriod(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getMeasuredSubFramePeriod(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::moduleid(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: moduleid" << std::endl; + os << R"V0G0N( + [Gotthard2][Eiger][Mythen3][Jungfrau][Moench] 16 bit value (ideally unique) that is streamed out in the UDP header of the detector. Picked up from a file on the module. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getModuleId(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::nextframenumber(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: nextframenumber" << std::endl; + os << R"V0G0N([n_value] + [Eiger][Jungfrau][Moench][CTB] Next frame number. Stopping acquisition might result in different frame numbers for different modules. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint64_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNextFrameNumber(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setNextFrameNumber(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::nmod(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: nmod" << std::endl; + os << R"V0G0N( + Number of modules in shared memory. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->size(); + os << ToString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::numinterfaces(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: numinterfaces" << std::endl; + os << R"V0G0N([1, 2] + [Jungfrau][Moench] Number of udp interfaces to stream data from detector. Default: 1. + Also enables second interface in receiver for listening (Writes a file per interface if writing enabled). + Also restarts client and receiver zmq sockets if zmq streaming enabled. + [Eiger] Only gets with result 2. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberofUDPInterfaces(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setNumberofUDPInterfaces(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::overflow(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: overflow" << std::endl; + os << R"V0G0N([0, 1] + [Eiger] Enable or disable show overflow flag in 32 bit mode. Default is disabled. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getOverFlowMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setOverFlowMode(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::packageversion(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: packageversion" << std::endl; + os << R"V0G0N( + Package version. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPackageVersion(); + os << t << '\n'; + } + } + + return os.str(); +} + +std::string Caller::parallel(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: parallel" << std::endl; + os << R"V0G0N([0, 1] + [Eiger][Mythen3][Gotthard2][Moench] Enable or disable parallel mode. + [Mythen3] If exptime is too short, the acquisition will return ERROR status and take fewer frames than expected. + [Mythen3][Eiger][Moench] Default: Non parallel. + [Gotthard2] Default: Parallel. Non parallel mode works only in continuous mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getParallelMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setParallelMode(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::parameters(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: parameters" << std::endl; + os << R"V0G0N( + Sets detector measurement parameters to those contained in fname. Set up per measurement. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute parameters at module level"); + } + det->loadParameters(args[0]); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::partialreset(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: partialreset" << std::endl; + os << R"V0G0N([0, 1] + [Eiger] Sets up detector to do partial or complete reset at start of acquisition. 0 complete reset, 1 partial reset. Default is complete reset. Advanced function! )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPartialReset(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setPartialReset(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::patfname(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patfname" << std::endl; + os << R"V0G0N( + [Ctb][Mythen3] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default file )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPatterFileName(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::patioctrl(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patioctrl" << std::endl; + os << R"V0G0N([64 bit mask] + [Ctb] 64 bit mask defining input (0) and output (1) signals. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint64_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPatternIOControl(std::vector{det_id}); + os << OutStringHex(t, 16) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setPatternIOControl(arg0, std::vector{det_id}); + os << ToStringHex(arg0, 16) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::patlimits(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patlimits" << std::endl; + os << R"V0G0N([start addr] [stop addr] + [Ctb][Mythen3] Limits of complete pattern )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + auto arg0 = StringTo("-1"); + auto t = det->getPatternLoopAddresses(arg0, std::vector{det_id}); + os << OutStringHex(t, 4) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + auto arg0 = StringTo("-1"); + auto arg1 = StringTo(args[0]); + auto arg2 = StringTo(args[1]); + det->setPatternLoopAddresses(arg0, arg1, arg2, + std::vector{det_id}); + os << '[' << ToStringHex(arg1, 4) << ", " << ToStringHex(arg2, 4) << ']' + << '\n'; + } + + return os.str(); +} + +std::string Caller::patloop(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patloop" << std::endl; + os << R"V0G0N([0-6] [start addr] [stop addr] + [Ctb][Mythen3] Limits of the loop level provided. + [Mythen3] Level options: 0-3 only. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; + GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternLoopAddresses(level, std::vector{det_id}); + os << level << ' ' << OutStringHex(t, 4) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; + GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, + nPutArgs); + int start = StringTo(args[iArg++]); + int stop = StringTo(args[iArg++]); + det->setPatternLoopAddresses(level, start, stop, + std::vector{det_id}); + os << level << ' ' << '[' << ToStringHex(start, 4) << ", " + << ToStringHex(stop, 4) << ']' << '\n'; + } + + return os.str(); +} + +std::string Caller::patloop0(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patloop0" << std::endl; + os << R"V0G0N(Depreciated command. Use patloop. )V0G0N" << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; + GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternLoopAddresses(level, std::vector{det_id}); + os << OutStringHex(t, 4) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; + GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, + nPutArgs); + int start = StringTo(args[iArg++]); + int stop = StringTo(args[iArg++]); + det->setPatternLoopAddresses(level, start, stop, + std::vector{det_id}); + os << '[' << ToStringHex(start, 4) << ", " << ToStringHex(stop, 4) + << ']' << '\n'; + } + + return os.str(); +} + +std::string Caller::patloop1(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patloop1" << std::endl; + os << R"V0G0N(Depreciated command. Use patloop. )V0G0N" << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; + GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternLoopAddresses(level, std::vector{det_id}); + os << OutStringHex(t, 4) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; + GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, + nPutArgs); + int start = StringTo(args[iArg++]); + int stop = StringTo(args[iArg++]); + det->setPatternLoopAddresses(level, start, stop, + std::vector{det_id}); + os << '[' << ToStringHex(start, 4) << ", " << ToStringHex(stop, 4) + << ']' << '\n'; + } + + return os.str(); +} + +std::string Caller::patloop2(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patloop2" << std::endl; + os << R"V0G0N(Depreciated command. Use patloop. )V0G0N" << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; + GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternLoopAddresses(level, std::vector{det_id}); + os << OutStringHex(t, 4) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; + GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, + nPutArgs); + int start = StringTo(args[iArg++]); + int stop = StringTo(args[iArg++]); + det->setPatternLoopAddresses(level, start, stop, + std::vector{det_id}); + os << '[' << ToStringHex(start, 4) << ", " << ToStringHex(stop, 4) + << ']' << '\n'; + } + + return os.str(); +} + +std::string Caller::patmask(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patmask" << std::endl; + os << R"V0G0N([64 bit mask] + [Ctb][Mythen3] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint64_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPatternMask(std::vector{det_id}); + os << OutStringHex(t, 16) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setPatternMask(arg0, std::vector{det_id}); + os << ToStringHex(arg0, 16) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::patnloop(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patnloop" << std::endl; + os << R"V0G0N([0-6] [n_cycles] + [Ctb][Mythen3] Number of cycles of the loop level provided. + [Mythen3] Level options: 0-3 only. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternLoopCycles(level, std::vector{det_id}); + os << level << ' ' << OutString(t) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, + nPutArgs); + std::string nloops = args[iArg++]; + auto arg1 = StringTo(nloops); + det->setPatternLoopCycles(level, arg1, std::vector{det_id}); + os << level << ' ' << nloops << '\n'; + } + + return os.str(); +} + +std::string Caller::patnloop0(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patnloop0" << std::endl; + os << R"V0G0N(Depreciated command. Use patnloop. )V0G0N" << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternLoopCycles(level, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, + nPutArgs); + std::string nloops = args[iArg++]; + auto arg1 = StringTo(nloops); + det->setPatternLoopCycles(level, arg1, std::vector{det_id}); + os << nloops << '\n'; + } + + return os.str(); +} + +std::string Caller::patnloop1(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patnloop1" << std::endl; + os << R"V0G0N(Depreciated command. Use patnloop. )V0G0N" << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternLoopCycles(level, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, + nPutArgs); + std::string nloops = args[iArg++]; + auto arg1 = StringTo(nloops); + det->setPatternLoopCycles(level, arg1, std::vector{det_id}); + os << nloops << '\n'; + } + + return os.str(); +} + +std::string Caller::patnloop2(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patnloop2" << std::endl; + os << R"V0G0N(Depreciated command. Use patnloop. )V0G0N" << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternLoopCycles(level, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, + nPutArgs); + std::string nloops = args[iArg++]; + auto arg1 = StringTo(nloops); + det->setPatternLoopCycles(level, arg1, std::vector{det_id}); + os << nloops << '\n'; + } + + return os.str(); +} + +std::string Caller::patsetbit(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patsetbit" << std::endl; + os << R"V0G0N([64 bit mask] + [Ctb][Mythen3] Sets the mask applied to every pattern to the selected bits. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint64_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPatternBitMask(std::vector{det_id}); + os << OutStringHex(t, 16) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setPatternBitMask(arg0, std::vector{det_id}); + os << ToStringHex(arg0, 16) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::pattern(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patternX" << std::endl; + os << R"V0G0N([fname] + [Mythen3][Ctb] Loads ASCII pattern file directly to server (instead of executing line by line) )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setPattern(args[0], std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::patternstart(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patternstart" << std::endl; + os << R"V0G0N( + [Mythen3] Starts Pattern )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->startPattern(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::patwait(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patwait" << std::endl; + os << R"V0G0N([0-6] [addr] + [Ctb][Mythen3] Wait address for loop level provided. + [Mythen3] Level options: 0-3 only. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternWaitAddr(level, std::vector{det_id}); + os << level << ' ' << OutStringHex(t, 4) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, + nPutArgs); + int addr = StringTo(args[iArg++]); + det->setPatternWaitAddr(level, addr, std::vector{det_id}); + os << level << ' ' << ToStringHex(addr, 4) << '\n'; + } + + return os.str(); +} + +std::string Caller::patwait0(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patwait0" << std::endl; + os << R"V0G0N(Depreciated command. Use patwait. )V0G0N" << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternWaitAddr(level, std::vector{det_id}); + os << OutStringHex(t, 4) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, + nPutArgs); + int addr = StringTo(args[iArg++]); + det->setPatternWaitAddr(level, addr, std::vector{det_id}); + os << ToStringHex(addr, 4) << '\n'; + } + + return os.str(); +} + +std::string Caller::patwait1(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patwait1" << std::endl; + os << R"V0G0N(Depreciated command. Use patwait. )V0G0N" << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternWaitAddr(level, std::vector{det_id}); + os << OutStringHex(t, 4) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, + nPutArgs); + int addr = StringTo(args[iArg++]); + det->setPatternWaitAddr(level, addr, std::vector{det_id}); + os << ToStringHex(addr, 4) << '\n'; + } + + return os.str(); +} + +std::string Caller::patwait2(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patwait2" << std::endl; + os << R"V0G0N(Depreciated command. Use patwait. )V0G0N" << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternWaitAddr(level, std::vector{det_id}); + os << OutStringHex(t, 4) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, + nPutArgs); + int addr = StringTo(args[iArg++]); + det->setPatternWaitAddr(level, addr, std::vector{det_id}); + os << ToStringHex(addr, 4) << '\n'; + } + + return os.str(); +} + +std::string Caller::patwaittime(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patwaittime" << std::endl; + os << R"V0G0N([0-6] [n_clk] + [Ctb][Mythen3] Wait time in clock cycles for the loop provided. + [Mythen3] Level options: 0-3 only. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternWaitTime(level, std::vector{det_id}); + os << level << ' ' << OutString(t) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, + nPutArgs); + uint64_t waittime = StringTo(args[iArg++]); + det->setPatternWaitTime(level, waittime, std::vector{det_id}); + os << level << ' ' << waittime << '\n'; + } + + return os.str(); +} + +std::string Caller::patwaittime0(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patwaittime0" << std::endl; + os << R"V0G0N(Depreciated command. Use patwaittime. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternWaitTime(level, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, + nPutArgs); + uint64_t waittime = StringTo(args[iArg++]); + det->setPatternWaitTime(level, waittime, std::vector{det_id}); + os << waittime << '\n'; + } + + return os.str(); +} + +std::string Caller::patwaittime1(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patwaittime1" << std::endl; + os << R"V0G0N(Depreciated command. Use patwaittime. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternWaitTime(level, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, + nPutArgs); + uint64_t waittime = StringTo(args[iArg++]); + det->setPatternWaitTime(level, waittime, std::vector{det_id}); + os << waittime << '\n'; + } + + return os.str(); +} + +std::string Caller::patwaittime2(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patwaittime2" << std::endl; + os << R"V0G0N(Depreciated command. Use patwaittime. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, + nPutArgs); + auto t = det->getPatternWaitTime(level, std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (action == slsDetectorDefs::PUT_ACTION) { + int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; + GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, + nPutArgs); + uint64_t waittime = StringTo(args[iArg++]); + det->setPatternWaitTime(level, waittime, std::vector{det_id}); + os << waittime << '\n'; + } + + return os.str(); +} + +std::string Caller::patword(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: patword" << std::endl; + os << R"V0G0N([step or address] [64 bit mask] + [Ctb][Mythen3] 64 bit pattern at address of pattern memory. + [Ctb] read is same as executing pattern )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to uint64_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + auto t = det->getPatternWord(arg0, std::vector{det_id}); + os << '[' << ToStringHex(arg0, 4) << ", " << OutStringHex(t, 16) + << "]" << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setPatternWord(arg0, arg1, std::vector{det_id}); + os << '[' << ToStringHex(arg0, 4) << ", " << ToStringHex(arg1, 16) + << "]" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::pedestalmode(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: pedestalmode" << std::endl; + os << R"V0G0N( [frames] [loops] + [Jungfrau] Enable pedestal mode. + The number of frames or triggers is overwritten by: + (#pedestal_frames x #pedestal_loops x 2). + In auto timing mode or in trigger mode with #frames > 1, + #frames is overwritten and #triggers = 1, + else #triggers is overwritten and #frames = 1. + One cannot set #frames, #triggers or timing mode in pedestal mode (exception thrown). + +pedestalmode [0] + [Jungfrau] Disable pedestal mode. + Disabling pedestal mode will set back the normal mode values of #frames and #triggers. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + if (args.size() == 2) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPedestalMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (args[0] != "0") { + throw RuntimeError( + "Unknown argument " + args[0] + + ". Did you mean 0 to disable pedestal mode?"); + } + det->setPedestalMode(defs::pedestalParameters()); + os << ToString(args) << '\n'; + } + + if (args.size() == 2) { + det->setPedestalMode(defs::pedestalParameters( + StringTo(args[0]), StringTo(args[1]))); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::period(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: period" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + Period between frames )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPeriod(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getPeriod(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setPeriod(converted_time, std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + auto converted_time = StringTo(args[0], args[1]); + det->setPeriod(converted_time, std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::periodl(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: periodl" << std::endl; + os << R"V0G0N( + [Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Period left for current frame. + [Gotthard2] only in continuous mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPeriodLeft(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getPeriodLeft(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::polarity(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: polarity" << std::endl; + os << R"V0G0N([pos|neg] + [Mythen3] Sets negative or positive polarity. Default is positive )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::polarity"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPolarity(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setPolarity(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::port(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: port" << std::endl; + os << R"V0G0N([n] + Port number of the control server on detector for detector-client tcp interface. Default is 1952. Normally unchanged. Set different ports for virtual servers on same pc. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint16_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getControlPort(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setControlPort(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::powerchip(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: powerchip" << std::endl; + os << R"V0G0N([0, 1] + [Jungfrau][Moench][Mythen3][Gotthard2] Power the chip. + [Jungfrau][Moench] Default is 0. Get will return power status. Can be off if temperature event occured (temperature over temp_threshold with temp_control enabled. Will configure chip (only chip v1.1) + [Mythen3][Gotthard2] Default is 1. If module not connected or wrong module, powerchip will fail. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPowerChip(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setPowerChip(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::powerindex(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: powerindex" << std::endl; + os << R"V0G0N([name] + [ChipTestBoard] Get the power index for the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::dacIndex index = defs::V_POWER_A; + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::dacIndex index = defs::V_POWER_A; + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute powerindex at module level"); + } + auto t = det->getPowerIndex(args[0]); + os << ToString(static_cast(t) - index) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::powerlist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: powerlist" << std::endl; + os << R"V0G0N([powername1 powername2 .. powername4] + [ChipTestBoard] Set the list of power names for this board. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute powerlist at module level"); + } + auto t = det->getPowerNames(); + os << ToString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (cmd == "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError("This detector already has fixed dac names. " + "Cannot change them."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute powerlist at module level"); + } + det->setPowerNames(args); + os << ToString(args) << '\n'; + } + + return os.str(); +} + +std::string Caller::powername(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: powername" << std::endl; + os << R"V0G0N([0-4][name] + [ChipTestBoard] Set the power at the given position to the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::dacIndex index = defs::V_POWER_A; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + defs::dacIndex index = defs::V_POWER_A; + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::dacIndex index = defs::V_POWER_A; + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute powername at module level"); + } + auto t = det->getPowerName( + static_cast(StringTo(args[0]) + index)); + os << args[0] << ' ' << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + defs::dacIndex index = defs::V_POWER_A; + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute powername at module level"); + } + det->setPowerName( + static_cast(StringTo(args[0]) + index), + args[1]); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::powervalues(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: powervalues" << std::endl; + os << R"V0G0N([name] + [ChipTestBoard] Get values of all powers. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + + std::string suffix = " mV"; + auto t = det->getPowerList(); + + auto names = det->getPowerNames(); + auto name_it = names.begin(); + os << '['; + if (t.size() > 0) { + + auto it = t.cbegin(); + os << ToString(*name_it++) << ' '; + os << OutString(det->getPower(*it++, std::vector{det_id})) + << suffix; + while (it != t.cend()) { + os << ", " << ToString(*name_it++) << ' '; + os << OutString( + det->getPower(*it++, std::vector{det_id})) + << suffix; + } + } + + os << "]\n"; + } + } + + return os.str(); +} + +std::string Caller::programfpga(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: programfpga" << std::endl; + os << R"V0G0N([fname.pof | fname.rbf (full path)][(opitonal)--force-delete-normal-file] + [Jungfrau][Moench][Ctb] Programs FPGA from pof file (full path). Then, detector controller is rebooted. + Use --force-delete-normal-file argument, if normal file found in device tree, it must be deleted, a new device drive created and programming continued. + [Mythen3][Gotthard2] Programs FPGA from rbf file (full path). Then, detector controller is rebooted. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo("0"); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to bool"); + } + } + + if (args.size() == 2) { + try { + StringTo("1"); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to bool"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo("0"); + det->programFPGA(args[0], arg1, std::vector{det_id}); + os << "successful" << '\n'; + } + + if (args.size() == 2) { + if (args[1] != "--force-delete-normal-file") { + throw RuntimeError("Could not scan second argument. Did you " + "mean --force-delete-normal-file?"); + } + auto arg1 = StringTo("1"); + det->programFPGA(args[0], arg1, std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::pulse(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: pulse" << std::endl; + os << R"V0G0N([n_times] [x] [y] + [Eiger] Pulse pixel n number of times at coordinates (x, y). Advanced User! )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 3) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 3) { + defs::xy c = + defs::xy(StringTo(args[1]), StringTo(args[2])); + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 3) { + defs::xy c = + defs::xy(StringTo(args[1]), StringTo(args[2])); + auto arg0 = StringTo(args[0]); + det->pulsePixel(arg0, c, std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::pulsechip(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: pulsechip" << std::endl; + os << R"V0G0N([n_times] + [Eiger] Pulse chip n times. If n is -1, resets to normal mode (reset chip completely at start of acquisition, where partialreset = 0). Advanced User! )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->pulseChip(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::pulsenmove(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: pulsenmove" << std::endl; + os << R"V0G0N([n_times] [x] [y] + [Eiger] Pulse pixel n number of times and moves relatively by (x, y). Advanced User! )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 3) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 3) { + defs::xy c = + defs::xy(StringTo(args[1]), StringTo(args[2])); + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 3) { + defs::xy c = + defs::xy(StringTo(args[1]), StringTo(args[2])); + auto arg0 = StringTo(args[0]); + det->pulsePixelNMove(arg0, c, std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::pumpprobe(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: pumpprobe" << std::endl; + os << R"V0G0N([0, 1] + [Mythen3] Enables or disables pump probe mode. Default is disabled. Pump probe mode only enables vth2. Disabling sets back to previous value. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPumpProbe(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setPumpProbe(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::quad(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: quad" << std::endl; + os << R"V0G0N([0, 1] + [Eiger] Sets detector size to a quad. 0 (disabled) is default. (Specific hardware required). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getQuad(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute quad at module level"); + } + auto arg0 = StringTo(args[0]); + det->setQuad(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::readnrows(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: readnrows" << std::endl; + os << R"V0G0N( + [1-256] + [Eiger] Number of rows to readout per half module starting from the centre. Options: 0 - 256. 256 is default. The permissible values depend on dynamic range and 10Gbe enabled. + [8-512 (multiple of 8)] + [Jungfrau] Number of rows per module starting from the centre. Options: 8 - 512, must be multiples of 8. Default is 512. + [Moench] Number of rows per module starting from the centre. Options:16 - 400, must be multiples of 16. Default is 400. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getReadNRows(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setReadNRows(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::readout(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: readout" << std::endl; + os << R"V0G0N( + [Mythen3] Starts detector readout. Status changes to TRANSMITTING and automatically returns to idle at the end of readout. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError("Cannot execute readout at module level"); + } + det->startDetectorReadout(); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::readoutspeed(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: readoutspeed" << std::endl; + os << R"V0G0N( + [0 or full_speed|1 or half_speed|2 or quarter_speed] + [Eiger][Jungfrau][Moench] Readout speed of chip. + [Eiger][Moench] Default speed is full_speed. + [Jungfrau] Default speed is half_speed. full_speed option only available from v2.0 boards and is recommended to set number of interfaces to 2. Also overwrites adcphase to recommended default. + [144|108] + [Gotthard2] Readout speed of chip in MHz. Default is 108. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::speedLevel"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + throw RuntimeError( + "ReadoutSpeed not implemented. Did you mean runclk?"); + } + auto t = det->getReadoutSpeed(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + throw RuntimeError( + "ReadoutSpeed not implemented. Did you mean runclk?"); + } + auto arg0 = StringTo(args[0]); + det->setReadoutSpeed(arg0, std::vector{det_id}); + os << ToString(StringTo(args[0])) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::readoutspeedlist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: readoutspeedlist" << std::endl; + os << R"V0G0N( + List of readout speed levels implemented for this detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getReadoutSpeedList(); + os << ToString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rebootcontroller(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rebootcontroller" << std::endl; + os << R"V0G0N( + [Jungfrau][Moench][Ctb][Gotthard][Mythen3][Gotthard2] Reboot controller of detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->rebootController(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::reg(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: reg" << std::endl; + os << R"V0G0N([address] [32 bit value] + [Mythen3][Gotthard2] Reads/writes to a 32 bit register in hex. Advanced Function! + Goes to stop server. Hence, can be called while calling blocking acquire(). + [Eiger] +0x100 for only left, +0x200 for only right. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to uint32_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + auto t = det->readRegister(arg0, std::vector{det_id}); + os << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->writeRegister(arg0, arg1, std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::resetdacs(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: resetdacs" << std::endl; + os << R"V0G0N([(optional) hard] + [Eiger][Jungfrau][Moench][Gotthard][Gotthard2][Mythen3]Reset dac values to the defaults. A 'hard' optional reset will reset the dacs to the hardcoded defaults in on-board detector server. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (args[0] != "hard") { + throw RuntimeError("Unknown argument " + args[0] + + ". Did you mean hard?"); + } + det->resetToDefaultDacs("1", std::vector{det_id}); + os << "successful" << '\n'; + } + + if (args.size() == 0) { + det->resetToDefaultDacs("0", std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::resetfpga(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: resetfpga" << std::endl; + os << R"V0G0N( + [Jungfrau][Moench][Ctb] Reset FPGA. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->resetFPGA(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::roi(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: roi" << std::endl; + os << R"V0G0N([xmin] [xmax] + [Gotthard] Region of interest in detector. + Options: Only a single ROI per module. + Either all channels or a single adc or 2 chips (256 channels). Default is all channels enabled (-1 -1). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + defs::ROI t = + defs::ROI(StringTo(args[0]), StringTo(args[1])); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getROI(std::vector{det_id}); + os << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + defs::ROI t = + defs::ROI(StringTo(args[0]), StringTo(args[1])); + if (det_id == -1 && det->size() > 1) { + throw RuntimeError("Cannot execute ROI at multi module level"); + } + det->setROI(t, det_id); + os << t << '\n'; + } + } + + return os.str(); +} + +std::string Caller::romode(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: romode" << std::endl; + os << R"V0G0N([analog|digital|analog_digital|transceiver|digital_transceiver] + [CTB] Readout mode. Default is analog. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::readoutMode"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getReadoutMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setReadoutMode(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::row(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: row" << std::endl; + os << R"V0G0N([value] + Set Detector row (udp header) to value. + Gui uses it to rearrange for complete image )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRow(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRow(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::runclk(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: runclk" << std::endl; + os << R"V0G0N([n_clk in MHz] + [Ctb] Run clock in MHz. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRUNClock(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRUNClock(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::runtime(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: runtime" << std::endl; + os << R"V0G0N([(optional unit) ns|us|ms|s] + [Jungfrau][Moench][Mythen3][Gotthard2][CTB] Time from detector start up. + [Gotthard2] not in burst and auto mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getActualTime(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getActualTime(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_arping(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_arping" << std::endl; + os << R"V0G0N([0, 1] + Starts a thread in slsReceiver to arping the interface it is listening to every minute. Useful in 10G mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxArping(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxArping(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_clearroi(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_clearroi" << std::endl; + os << R"V0G0N(Resets Region of interest in receiver. Default is all channels/pixels enabled. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError( + "Cannot execute rx_clearroi at module level"); + } + det->clearRxROI(); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_dbitoffset(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_dbitoffset" << std::endl; + os << R"V0G0N([n_bytes] + [Ctb] Offset in bytes in digital data to skip in receiver. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxDbitOffset(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxDbitOffset(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_discardpolicy(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_discardpolicy" << std::endl; + os << R"V0G0N([nodiscard (default)|discardempty|discardpartial(fastest)] + Frame discard policy of receiver. nodiscard does not discard frames, discardempty discards empty frames, discardpartial discards partial frames. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::frameDiscardPolicy"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxFrameDiscardPolicy(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxFrameDiscardPolicy(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_fifodepth(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_fifodepth" << std::endl; + os << R"V0G0N([n_frames] + Set the number of frames in the receiver fifo depth (buffer between listener and writer threads). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxFifoDepth(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxFifoDepth(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_frameindex(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_frameindex" << std::endl; + os << R"V0G0N( + Current frame index received for each port in receiver during acquisition. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxCurrentFrameIndex(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_framescaught(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_framescaught" << std::endl; + os << R"V0G0N( + Number of frames caught by each port in receiver. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFramesCaught(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_framesperfile(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_framesperfile" << std::endl; + os << R"V0G0N([n_frames] + Number of frames per file in receiver in an acquisition. Default depends on detector type. 0 is infinite or all frames in single file. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFramesPerFile(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setFramesPerFile(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_jsonpara(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_jsonpara" << std::endl; + os << R"V0G0N([key1] [value1] + [Receiver] Additional json header parameter streamed out from receiver. If not found in header, the pair is appended. An empty values deletes parameter. Max 20 characters for each key/value. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + if (args.size() == 2) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto t = det->getAdditionalJsonParameter(args[0], + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setAdditionalJsonParameter(args[0], "", + std::vector{det_id}); + os << args[0] << " deleted" << '\n'; + } + + if (args.size() == 2) { + det->setAdditionalJsonParameter(args[0], args[1], + std::vector{det_id}); + os << "{" << args[0] << ": " << args[1] << "}" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_lastclient(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_lastclient" << std::endl; + os << R"V0G0N( + Client IP Address that last communicated with the receiver. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxLastClientIP(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_lock(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_lock" << std::endl; + os << R"V0G0N([0, 1] + Lock receiver to one client IP, 1 locks, 0 unlocks. Default is unlocked. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxLock(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxLock(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_missingpackets(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_missingpackets" << std::endl; + os << R"V0G0N( + Number of missing packets for receiver. If negative, they are packets in excess. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumMissingPackets(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_padding(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_padding" << std::endl; + os << R"V0G0N([0, 1] + Partial frames padding enable in the receiver. Default: enabled. Disabling is fastest. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPartialFramesPadding(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setPartialFramesPadding(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_printconfig(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_printconfig" << std::endl; + os << R"V0G0N( + Prints the receiver configuration. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->printRxConfiguration(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_realudpsocksize(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_realudpsocksize" << std::endl; + os << R"V0G0N( + Actual udp socket buffer size. Double the size of rx_udpsocksize due to kernel bookkeeping. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = + det->getRxRealUDPSocketBufferSize(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_silent(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_silent" << std::endl; + os << R"V0G0N([0, 1] + Switch on or off receiver text output during acquisition. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxSilentMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxSilentMode(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_start(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_start" << std::endl; + os << R"V0G0N( + Starts receiver listener for detector data packets and create a data file (if file write enabled). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError("Cannot execute rx_start at module level"); + } + det->startReceiver(); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_status(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_status" << std::endl; + os << R"V0G0N([running, idle, transmitting] + Receiver listener status. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getReceiverStatus(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (true) { + throw RuntimeError("Cannot put. Did you mean to use command: " + "\"rx_start\" or \"rx_stop\"?"); + } + } + + return os.str(); +} + +std::string Caller::rx_stop(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_stop" << std::endl; + os << R"V0G0N( + Stops receiver listener for detector data packets and closes current data file (if file write enabled). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError("Cannot execute rx_stop at module level"); + } + det->stopReceiver(); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_tcpport(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_tcpport" << std::endl; + os << R"V0G0N([port] + TCP port for client-receiver communication. Default is 1954. Must be different if multiple receivers on same pc. Must be first command to set a receiver parameter. Multi command will automatically increment for individual modules. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint16_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxPort(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxPort(arg0, det_id); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_threads(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_threads" << std::endl; + os << R"V0G0N( + Get kernel thread ids from the receiver in order of [parent, tcp, listener 0, processor 0, streamer 0, listener 1, processor 1, streamer 1, arping]. If no streamer yet or there is no second interface, it gives 0 in its place. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxThreadIds(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_udpsocksize(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_udpsocksize" << std::endl; + os << R"V0G0N([n_size] + UDP socket buffer size in receiver. Tune rmem_default and rmem_max accordingly. Max value is INT_MAX/2. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxUDPSocketBufferSize(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxUDPSocketBufferSize(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_version(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_version" << std::endl; + os << R"V0G0N( + Receiver version )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getReceiverVersion(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_zmqfreq(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_zmqfreq" << std::endl; + os << R"V0G0N([nth frame] + Frequency of frames streamed out from receiver via zmq + Default: 1, Means every frame is streamed out. + If 2, every second frame is streamed out. + If 0, streaming timer is the timeout, after which current frame is sent out. (default timeout is 500 ms). Usually used for gui purposes. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxZmqFrequency(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxZmqFrequency(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_zmqhwm(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_zmqhwm" << std::endl; + os << R"V0G0N([n_value] + Receiver's zmq send high water mark. Default is the zmq library's default (1000). This is a high number and can be set to 2 for gui purposes. One must also set the client's receive high water mark to similar value. Final effect is sum of them. Also restarts receiver zmq streaming if enabled. Can set to -1 to set default value. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxZmqHwm(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute rx_zmqhwm at module level"); + } + auto arg0 = StringTo(args[0]); + det->setRxZmqHwm(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_zmqip(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_zmqip" << std::endl; + os << R"V0G0N([x.x.x.x] + Zmq Ip Address from which data is to be streamed out of the receiver. Also restarts receiver zmq streaming if enabled. Default is from rx_hostname. Modified only when using an intermediate process between receiver. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxZmqIP(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setRxZmqIP(IpAddr(args[0]), std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_zmqport(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_zmqport" << std::endl; + os << R"V0G0N([port] + Zmq port for data to be streamed out of the receiver. Also restarts receiver zmq streaming if enabled. Default is 30001. Modified only when using an intermediate process between receiver and client(gui). Must be different for every detector (and udp port). Multi command will automatically increment for individual modules. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint16_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxZmqPort(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxZmqPort(arg0, det_id); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_zmqstartfnum(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_zmqstartfnum" << std::endl; + os << R"V0G0N([fnum] + The starting frame index to stream out. 0 by default, which streams the first frame in an acquisition, and then depending on the rx zmq frequency/ timer )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxZmqStartingFrame(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxZmqStartingFrame(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::rx_zmqstream(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: rx_zmqstream" << std::endl; + os << R"V0G0N([0, 1] + Enable/ disable data streaming from receiver via zmq (eg. to GUI or to another process for further processing). This creates/ destroys zmq streamer threads in receiver. + Switching to Gui automatically enables data streaming in receiver. + Switching back to command line acquire will require disabling data streaming in receiver for fast applications. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getRxZmqDataStream(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setRxZmqDataStream(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::savepattern(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: savepattern" << std::endl; + os << R"V0G0N( + [Ctb][Mythen3] Saves pattern to file (ascii). + [Ctb] Also executes pattern. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError( + "Cannot execute savepattern at module level"); + } + det->savePattern(args[0]); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::scan(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: scan" << std::endl; + os << R"V0G0N([dac_name|0|trimbits] [start_val] [stop_val] [step_size] [dac settling time ns|us|ms|s] + Enables/ disables scans for dac and trimbits + Enabling scan sets number of frames to number of steps in receiver. + To cancel scan configuration, set dac to '0', which also sets number of frames to 1. + [Eiger][Mythen3] Use trimbits as dac name for a trimbit scan. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 4 && args.size() != 5) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + if (args.size() == 4) { + } + + if (args.size() == 5) { + try { + std::string tmp_time(args[4]); + std::string unit = RemoveUnit(tmp_time); + auto t = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getScan(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (StringTo(args[0]) != 0) { + throw RuntimeError("Unknown argument " + args[0] + + ". Did you mean 0 to disable scan?"); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute scan at module level"); + } + det->setScan(defs::scanParameters()); + os << ToString(args) << '\n'; + } + + if (args.size() == 4) { + if (det_id != -1) { + throw RuntimeError("Cannot execute scan at module level"); + } + det->setScan(defs::scanParameters( + StringTo(args[0]), StringTo(args[1]), + StringTo(args[2]), StringTo(args[3]))); + os << ToString(args) << '\n'; + } + + if (args.size() == 5) { + std::string tmp_time(args[4]); + std::string unit = RemoveUnit(tmp_time); + auto t = StringTo(tmp_time, unit); + if (det_id != -1) { + throw RuntimeError("Cannot execute scan at module level"); + } + det->setScan(defs::scanParameters( + StringTo(args[0]), StringTo(args[1]), + StringTo(args[2]), StringTo(args[3]), t)); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::scanerrmsg(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: scanerrmsg" << std::endl; + os << R"V0G0N( + Gets Scan error message if scan ended in error for non blocking acquisitions. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getScanErrorMessage(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::selinterface(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: selinterface" << std::endl; + os << R"V0G0N([0, 1] + [Jungfrau][Moench] The udp interface to stream data from detector. Effective only when number of interfaces is 1. Default: 0 (outer) )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSelectedUDPInterface(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->selectUDPInterface(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::serialnumber(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: serialnumber" << std::endl; + os << R"V0G0N( + [Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][CTB] +Serial number of detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSerialNumber(std::vector{det_id}); + os << OutStringHex(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::setbit(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: setbit" << std::endl; + os << R"V0G0N([reg address in hex] [bit index] + Sets bit in address. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + if (StringTo(args[1]) < 0 || StringTo(args[1]) > 31) { + throw RuntimeError("Bit number out of range: " + args[1]); + } + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setBit(arg0, arg1, std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::settings(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: settings" << std::endl; + os << R"V0G0N([standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain, highgain0, fixgain1, fixgain2, forceswitchg1, forceswitchg2, verylowgain, g1_hg, g1_lg, g2_hc_hg, g2_hc_lg, g2_lc_hg, g2_lc_lg, g4_hg, g4_lg, gain0] + Detector Settings + [Jungfrau] - [ gain0 | highgain0] + [Gotthard] - [dynamicgain | highgain | lowgain | mediumgain | veryhighgain] + [Gotthard] Also loads default dacs on to the detector. + [Gotthard2] - [dynamicgain | fixgain1 | fixgain2] + [Mythen3] - [standard | fast | highgain] Also changes vrshaper and vrpreamp. + [Eiger] Use threshold or thresholdnotb. + [Eiger] threshold and settings loaded from file found in settingspath. + [Moench] - [g1_hg | g1_lg | g2_hc_hg | g2_hc_lg | g2_lc_hg | g2_lc_lg | g4_hg | g4_lg] )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::detectorSettings"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSettings(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setSettings(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::settingslist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: settingslist" << std::endl; + os << R"V0G0N( + List of settings implemented for this detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSettingsList(); + os << ToString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::settingspath(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: settingspath" << std::endl; + os << R"V0G0N([path] + [Eiger][Mythen3] Directory where settings files are loaded from/to. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSettingsPath(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setSettingsPath(args[0], std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::signalindex(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: signalindex" << std::endl; + os << R"V0G0N([name] + [ChipTestBoard] Get the signal index for the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError( + "Cannot execute signalindex at module level"); + } + auto t = det->getSignalIndex(args[0]); + os << static_cast(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::signallist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: signallist" << std::endl; + os << R"V0G0N([signalname1 signalname2 .. signalname63] + [ChipTestBoard] Set the list of signal names for this board. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute signallist at module level"); + } + auto t = det->getSignalNames(); + os << ToString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (cmd == "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError("This detector already has fixed dac names. " + "Cannot change them."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute signallist at module level"); + } + det->setSignalNames(args); + os << ToString(args) << '\n'; + } + + return os.str(); +} + +std::string Caller::signalname(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: signalname" << std::endl; + os << R"V0G0N([0-63][name] + [ChipTestBoard] Set the signal at the given position to the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute signalname at module level"); + } + auto arg0 = StringTo(args[0]); + auto t = det->getSignalName(arg0); + os << args[0] << ' ' << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute signalname at module level"); + } + auto arg0 = StringTo(args[0]); + det->setSignalName(arg0, args[1]); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::slowadcindex(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: slowadcindex" << std::endl; + os << R"V0G0N([name] + [ChipTestBoard] Get the slowadc index for the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::dacIndex index = defs::SLOW_ADC0; + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::dacIndex index = defs::SLOW_ADC0; + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError( + "Cannot execute slowadcindex at module level"); + } + auto t = det->getSlowADCIndex(args[0]); + os << ToString(static_cast(t) - index) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::slowadclist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: slowadclist" << std::endl; + os << R"V0G0N([slowadcname1 slowadcname2 .. slowadcname7] + [ChipTestBoard] Set the list of slowadc names for this board. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError( + "Cannot execute slowadclist at module level"); + } + auto t = det->getSlowADCNames(); + os << ToString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (cmd != "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (cmd == "daclist" && + det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError("This detector already has fixed dac names. " + "Cannot change them."); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute slowadclist at module level"); + } + det->setSlowADCNames(args); + os << ToString(args) << '\n'; + } + + return os.str(); +} + +std::string Caller::slowadcname(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: slowadcname" << std::endl; + os << R"V0G0N([0-7][name] + [ChipTestBoard] Set the slowadc at the given position to the given name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::dacIndex index = defs::SLOW_ADC0; + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + defs::dacIndex index = defs::SLOW_ADC0; + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::dacIndex index = defs::SLOW_ADC0; + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError( + "Cannot execute slowadcname at module level"); + } + auto t = det->getSlowADCName( + static_cast(StringTo(args[0]) + index)); + os << args[0] << ' ' << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + defs::dacIndex index = defs::SLOW_ADC0; + if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + throw RuntimeError(cmd + " only allowed for CTB."); + } + if (det_id != -1) { + throw RuntimeError( + "Cannot execute slowadcname at module level"); + } + det->setSlowADCName( + static_cast(StringTo(args[0]) + index), + args[1]); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::slowadcvalues(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: slowadcvalues" << std::endl; + os << R"V0G0N([name] + [ChipTestBoard] Get values of all slow adcs. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + + std::string suffix = " mV"; + auto t = det->getSlowADCList(); + + auto names = det->getSlowADCNames(); + auto name_it = names.begin(); + os << '['; + if (t.size() > 0) { + + auto it = t.cbegin(); + os << ToString(*name_it++) << ' '; + os << OutString( + det->getSlowADC(*it++, std::vector{det_id})) + << suffix; + while (it != t.cend()) { + os << ", " << ToString(*name_it++) << ' '; + os << OutString( + det->getSlowADC(*it++, std::vector{det_id})) + << suffix; + } + } + + os << "]\n"; + } + } + + return os.str(); +} + +std::string Caller::start(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: start" << std::endl; + os << R"V0G0N( + Starts detector acquisition. Status changes to RUNNING or WAITING and automatically returns to idle at the end of acquisition. If the acquisition was abruptly stopped, some detectors come back to STOPPED. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->startDetector(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::status(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: status" << std::endl; + os << R"V0G0N([running, error, transmitting, finished, waiting, idle] + Detector status. Goes to stop server. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDetectorStatus(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (true) { + throw RuntimeError("Cannot put. Did you mean to use command: " + "\"start\" or \"stop\"?"); + } + } + + return os.str(); +} + +std::string Caller::stop(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: stop" << std::endl; + os << R"V0G0N( + Abort detector acquisition. Status changes to IDLE or STOPPED. Goes to stop server. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->stopDetector(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::stopport(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: stopport" << std::endl; + os << R"V0G0N([n] + Port number of the stop server on detector for detector-client tcp interface. Default is 1953. Normally unchanged. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint16_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getStopPort(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setStopPort(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::storagecell_delay(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: storagecell_delay" << std::endl; + os << R"V0G0N([duration (0-1638375 ns)] [(optional unit) ns|us|ms|s] + [Jungfrau] Additional time delay between 2 consecutive exposures in burst mode (resolution of 25ns). Only applicable for chipv1.0. For advanced users only. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getStorageCellDelay(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getStorageCellDelay(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setStorageCellDelay(converted_time, std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + auto converted_time = StringTo(args[0], args[1]); + det->setStorageCellDelay(converted_time, std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::storagecell_start(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: storagecell_start" << std::endl; + os << R"V0G0N([0-max] + [Jungfrau] Storage cell that stores the first acquisition of the series. max is 15 (default) for chipv1.0 and 3 (default) for chipv1.1. For advanced users only. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getStorageCellStart(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setStorageCellStart(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::subdeadtime(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: subdeadtime" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Eiger] Dead time of EIGER subframes in 32 bit mode. Subperiod = subexptime + subdeadtime. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSubDeadTime(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getSubDeadTime(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setSubDeadTime(converted_time, std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + auto converted_time = StringTo(args[0], args[1]); + det->setSubDeadTime(converted_time, std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::subexptime(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: subexptime" << std::endl; + os << R"V0G0N([duration] [(optional unit) ns|us|ms|s] + [Eiger] Exposure time of EIGER subframes in 32 bit mode. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + } catch (...) { + throw RuntimeError("Could not convert argument to time::ns"); + } + } + + if (args.size() == 2) { + try { + StringTo(args[0], args[1]); + } catch (...) { + throw RuntimeError("Could not convert arguments to time::ns"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSubExptime(std::vector{det_id}); + os << OutString(t) << '\n'; + } + + if (args.size() == 1) { + auto t = det->getSubExptime(std::vector{det_id}); + os << OutString(t, args[0]) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + std::string tmp_time(args[0]); + std::string unit = RemoveUnit(tmp_time); + auto converted_time = StringTo(tmp_time, unit); + det->setSubExptime(converted_time, std::vector{det_id}); + os << args[0] << '\n'; + } + + if (args.size() == 2) { + auto converted_time = StringTo(args[0], args[1]); + det->setSubExptime(converted_time, std::vector{det_id}); + os << args[0] << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::sync(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: sync" << std::endl; + os << R"V0G0N([0, 1] + [Jungfrau][Moench] Enables or disables synchronization between modules. Sync mode requires at least one master configured. Also requires flatband cabling between master and slave with termination board. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSynchronization(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute sync at module level"); + } + auto arg0 = StringTo(args[0]); + det->setSynchronization(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::syncclk(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: syncclk" << std::endl; + os << R"V0G0N([n_clk in MHz] + [Ctb] Sync clock in MHz. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSYNCClock(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_10ge(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_10ge" << std::endl; + os << R"V0G0N([n_value] + [Eiger]Temperature close to the 10GbE )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::TEMPERATURE_10GE, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_adc(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_adc" << std::endl; + os << R"V0G0N([n_value] + [Jungfrau][Moench][Gotthard] ADC Temperature )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::TEMPERATURE_ADC, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_control(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_control" << std::endl; + os << R"V0G0N([0, 1] + [Jungfrau][Moench] Temperature control enable. Default is 0 (disabled). If temperature crosses threshold temperature and temperature control is enabled, power to chip will be switched off and temperature event occurs. To power on chip again, temperature has to be less than threshold temperature and temperature event has to be cleared. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperatureControl(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTemperatureControl(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_dcdc(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_dcdc" << std::endl; + os << R"V0G0N([n_value] + [Eiger]Temperature close to the dc dc converter )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::TEMPERATURE_DCDC, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_event(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_event" << std::endl; + os << R"V0G0N([0] + [Jungfrau][Moench] 1, if a temperature event occured. To clear this event, set it to 0. + If temperature crosses threshold temperature and temperature control is enabled, power to chip will be switched off and temperature event occurs. To power on chip again, temperature has to be less than threshold temperature and temperature event has to be cleared. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperatureEvent(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (StringTo(args[0]) != 0) { + throw RuntimeError("Unknown argument for temp event: ( " + + args[0] + + " ). Did you mean 0 to reset event?"); + } + det->resetTemperatureEvent(std::vector{det_id}); + os << "cleared" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_fpga(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_fpga" << std::endl; + os << R"V0G0N([n_value] + [Eiger][Jungfrau][Moench][Gotthard][Mythen3][Gotthard2] FPGA Temperature )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::TEMPERATURE_FPGA, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_fpgaext(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_fpgaext" << std::endl; + os << R"V0G0N([n_value] + [Eiger]Temperature close to the FPGA )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::TEMPERATURE_FPGAEXT, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_fpgafl(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_fpgafl" << std::endl; + os << R"V0G0N([n_value] + [Eiger]Temperature of the left front end board fpga. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::TEMPERATURE_FPGA2, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_fpgafr(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_fpgafr" << std::endl; + os << R"V0G0N([n_value] + [Eiger]Temperature of the right front end board fpga. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::TEMPERATURE_FPGA3, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_slowadc(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_slowadc" << std::endl; + os << R"V0G0N([n_value] + [Ctb]Temperature of the slow adc )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::SLOW_ADC_TEMP, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_sodl(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_sodl" << std::endl; + os << R"V0G0N([n_value] + [Eiger]Temperature close to the left so-dimm memory )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::TEMPERATURE_SODL, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_sodr(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_sodr" << std::endl; + os << R"V0G0N([n_value] + [Eiger]Temperature close to the right so-dimm memory )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperature(defs::TEMPERATURE_SODR, + std::vector{det_id}); + os << OutString(t) << " °C" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::temp_threshold(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: temp_threshold" << std::endl; + os << R"V0G0N([n_temp (in degrees)] + [Jungfrau][Moench] Threshold temperature in degrees. If temperature crosses threshold temperature and temperature control is enabled, power to chip will be switched off and temperature event occurs. To power on chip again, temperature has to be less than threshold temperature and temperature event has to be cleared. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getThresholdTemperature(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setThresholdTemperature(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::templist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: templist" << std::endl; + os << R"V0G0N( + List of temperature commands implemented for this detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTemperatureList(); + os << ToString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::tempvalues(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: tempvalues" << std::endl; + os << R"V0G0N( + Gets the values for every temperature for this detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + + std::string suffix = " °C"; + auto t = det->getTemperatureList(); + os << '['; + if (t.size() > 0) { + + auto it = t.cbegin(); + os << ToString(*it) << ' '; + os << OutString( + det->getTemperature(*it++, std::vector{det_id})) + << suffix; + while (it != t.cend()) { + os << ", " << ToString(*it) << ' '; + os << OutString(det->getTemperature( + *it++, std::vector{det_id})) + << suffix; + } + } + + os << "]\n"; + } + } + + return os.str(); +} + +std::string Caller::tengiga(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: tengiga" << std::endl; + os << R"V0G0N([0, 1] + [Eiger][Ctb][Mythen3] 10GbE Enable. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTenGiga(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTenGiga(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::timing(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: timing" << std::endl; + os << R"V0G0N([auto|trigger|gating|burst_trigger] + Timing Mode of detector. + [Jungfrau][Moench][Gotthard][Ctb][Gotthard2] [auto|trigger] + [Mythen3] [auto|trigger|gating|trigger_gating] + [Eiger] [auto|trigger|gating|burst_trigger] )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::timingMode"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTimingMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTimingMode(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::timinglist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: timinglist" << std::endl; + os << R"V0G0N( + Gets the list of timing modes for this detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTimingModeList(); + os << ToString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::timingsource(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: timingsource" << std::endl; + os << R"V0G0N([internal|external] + [Gotthard2] Timing source. Internal is crystal and external is system timing. Default is internal. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError( + "Could not convert argument 0 to defs::timingSourceType"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTimingSource(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTimingSource(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::top(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: top" << std::endl; + os << R"V0G0N([0, 1] + [Eiger] Sets half module to top (1), else bottom. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTop(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTop(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::transceiverenable(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: transceiverenable" << std::endl; + os << R"V0G0N([bitmask] + [Ctb] Transceiver Enable Mask. Enable for each 4 Transceiver channel. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint32_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTransceiverEnableMask(std::vector{det_id}); + os << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTransceiverEnableMask(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::trigger(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: trigger" << std::endl; + os << R"V0G0N( + [Eiger][Mythen3][Jungfrau][Moench] Sends software trigger signal to detector )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + bool block = false; + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + bool block = false; + if (det_id != -1) { + throw RuntimeError("Cannot execute trigger at module level"); + } + det->sendSoftwareTrigger(block); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::triggers(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: triggers" << std::endl; + os << R"V0G0N([n_triggers] + Number of triggers per aquire. Set timing mode to use triggers. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int64_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfTriggers(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute triggers at module level"); + } + auto arg0 = StringTo(args[0]); + det->setNumberOfTriggers(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::triggersl(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: triggersl" << std::endl; + os << R"V0G0N( + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of triggers left in acquisition. Only when external trigger used. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberOfTriggersLeft(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::trimbits(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: trimbits" << std::endl; + os << R"V0G0N([fname] + [Eiger][Mythen3] Put will load the trimbit file to detector. If no extension specified, serial number of each module is attached. Get will save the trimbits from the detector to file with serial number added to file name. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + det->saveTrimbits(args[0], std::vector{det_id}); + os << args[0] << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->loadTrimbits(args[0], std::vector{det_id}); + os << args[0] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::trimval(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: trimval" << std::endl; + os << R"V0G0N([n_trimval] + [Eiger][Mythen3] All trimbits set to this value. Returns -1 if all trimbits are different values. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getAllTrimbits(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setAllTrimbits(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::tsamples(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: tsamples" << std::endl; + os << R"V0G0N([n_value] + [CTB] Number of transceiver samples expected. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = + det->getNumberOfTransceiverSamples(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setNumberOfTransceiverSamples(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::txdelay(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: txdelay" << std::endl; + os << R"V0G0N([n_delay] + [Eiger][Jungfrau][Moench][Mythen3] Set transmission delay for all modules in the detector using the step size provided.Sets up + [Eiger] txdelay_left to (2 * mod_index * n_delay), + [Eiger] txdelay_right to ((2 * mod_index + 1) * n_delay) and + [Eiger] txdelay_frame to (2 *num_modules * n_delay) + [Jungfrau][Moench][Mythen3] txdelay_frame to (num_modules * n_delay) +for every module. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError("Cannot execute txdelay at module level"); + } + auto t = det->getTransmissionDelay(); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + if (det_id != -1) { + throw RuntimeError("Cannot execute txdelay at module level"); + } + auto arg0 = StringTo(args[0]); + det->setTransmissionDelay(arg0); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::txdelay_frame(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: txdelay_frame" << std::endl; + os << R"V0G0N([n_delay] + [Eiger][Jungfrau][Moench][Mythen3] Transmission delay of first udp packet being streamed out of the module. + [Jungfrau][Moench] [0-31] Each value represents 1 ms + [Eiger] Additional delay to txdelay_left and txdelay_right. Each value represents 10ns. Typical value is 50000. + [Mythen3] [0-16777215] Each value represents 8 ns (125 MHz clock), max is 134 ms. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTransmissionDelayFrame(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTransmissionDelayFrame(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::txdelay_left(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: txdelay_left" << std::endl; + os << R"V0G0N([n_delay] + [Eiger] Transmission delay of first packet in an image being streamed out of the module's left UDP port. Each value represents 10ns. Typical value is 50000. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTransmissionDelayLeft(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTransmissionDelayLeft(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::txdelay_right(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: txdelay_right" << std::endl; + os << R"V0G0N([n_delay] + [Eiger] Transmission delay of first packet in an image being streamed out of the module's right UDP port. Each value represents 10ns. Typical value is 50000. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getTransmissionDelayRight(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setTransmissionDelayRight(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::type(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: type" << std::endl; + os << R"V0G0N( + Returns detector type. Can be Eiger, Jungfrau, Gotthard, Moench, Mythen3, Gotthard2, ChipTestBoard )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDetectorType(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_cleardst(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_cleardst" << std::endl; + os << R"V0G0N( + Clears udp destination details on the detector. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->clearUDPDestinations(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_dstlist(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_dstlist" << std::endl; + os << R"V0G0N([ip=x.x.x.x] [(optional)ip2=x.x.x.x] + [mac=xx:xx:xx:xx:xx:xx] [(optional)mac2=xx:xx:xx:xx:xx:xx] + [port=value] [(optional)port2=value] + The order of ip, mac and port does not matter. entry_value can be >0 only for [Eiger][Jungfrau][Moench][Mythen3][Gotthard2] where round robin is implemented. If 'auto' used, then ip is set to ip of rx_hostname. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (det_id == -1) { + throw RuntimeError( + "Can execute udp_dstlist only at module level."); + } + if (rx_id < 0 || rx_id >= MAX_UDP_DESTINATION) { + throw RuntimeError("Invalid receiver index " + + std::to_string(rx_id) + + " to set round robin entry."); + } + auto t = + det->getDestinationUDPList(rx_id, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (det_id == -1) { + throw RuntimeError("Can execute udp_dstlist only at module level."); + } + if (rx_id < 0 || rx_id >= MAX_UDP_DESTINATION) { + throw RuntimeError("Invalid receiver index " + + std::to_string(rx_id) + + " to set round robin entry."); + } + if (args.empty()) { + throw RuntimeError("udp_dstlist require at least one argument."); + } + det->setDestinationUDPList(getUdpEntry(), det_id); + os << ToString(args) << '\n'; + } + + return os.str(); +} + +std::string Caller::udp_dstmac(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_dstmac" << std::endl; + os << R"V0G0N([x:x:x:x:x:x] + Mac address of the receiver (destination) udp interface. Not mandatory to set as udp_dstip retrieves it from slsReceiver process, but must be set if you use a custom receiver (not slsReceiver). Use router mac if router between detector and receiver. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDestinationUDPMAC(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setDestinationUDPMAC(MacAddr(args[0]), + std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_dstmac2(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_dstmac2" << std::endl; + os << R"V0G0N([x:x:x:x:x:x] + [Jungfrau][Moench] Mac address of the receiver (destination) udp interface 2. Not mandatory to set as udp_dstip2 retrieves it from slsReceiver process but must be set if you use a custom receiver (not slsReceiver). + [Jungfrau][Moench] top half or inner interface + [Gotthard2] veto debugging. Use router mac if router between detector and receiver. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDestinationUDPMAC2(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setDestinationUDPMAC2(MacAddr(args[0]), + std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_dstport(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_dstport" << std::endl; + os << R"V0G0N([n] + Port number of the receiver (destination) udp interface. Default is 50001. + If multi command, ports for each module is calculated (incremented by 1 if no 2nd interface) )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint16_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDestinationUDPPort(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setDestinationUDPPort(arg0, det_id); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_dstport2(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_dstport2" << std::endl; + os << R"V0G0N([n] + [Jungfrau][Moench][Eiger][Gotthard2] Port number of the receiver (destination) udp interface 2. Default is 50002. + If multi command, ports for each module is calculated (incremented by 2) + [Jungfrau][Moench] top half or inner interface + [Eiger] right half + [Gotthard2] veto debugging )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint16_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getDestinationUDPPort2(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setDestinationUDPPort2(arg0, det_id); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_firstdst(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_firstdst" << std::endl; + os << R"V0G0N( +[0 - 31 (or number of udp destinations)] + [Jungfrau][Moench][Gotthard2] +[0-63] + [Mythen3] + + One can set which is the first destination that the detector will stream images out from in a round robin fashion. The entry must not have been empty. Default: 0 )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getFirstUDPDestination(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setFirstUDPDestination(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_numdst(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_numdst" << std::endl; + os << R"V0G0N( + [Jungfrau][Moench][Eiger][Mythen3][Gotthard2] One can enter upto 32 (64 for Mythen3) destinations that the detector will stream images out in a round robin fashion. This is get only command. Default: 1 )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getNumberofUDPDestinations(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_reconfigure(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_reconfigure" << std::endl; + os << R"V0G0N( + Reconfigures Detector with UDP destination. More for debugging as the configuration is done automatically when the detector has sufficient UDP details. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->reconfigureUDPDestination(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_srcmac(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_srcmac" << std::endl; + os << R"V0G0N([x:x:x:x:x:x] + Mac address of the detector (source) udp interface. + [Eiger] Do not set as detector will replace with its own DHCP Mac (1G) or DHCP Mac + 1 (10G). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSourceUDPMAC(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setSourceUDPMAC(MacAddr(args[0]), std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_srcmac2(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_srcmac2" << std::endl; + os << R"V0G0N([x:x:x:x:x:x] + [Jungfrau][Moench] Mac address of the top half or inner (source) udp interface. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getSourceUDPMAC2(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setSourceUDPMAC2(MacAddr(args[0]), std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::udp_validate(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: udp_validate" << std::endl; + os << R"V0G0N( + Validates that UDP configuration in the detector is valid. If not configured, it will throw with error message requesting missing udp information. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 0) { + det->validateUDPConfiguration(std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::update(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: update" << std::endl; + os << R"V0G0N( + Without tftp: [server_name (incl fullpath)] [fname.pof (incl full path)] This does not use tftp. + [Jungfrau][Moench][Gotthard][CTB] Updates the firmware, detector server, deletes old server, creates the symbolic link and then reboots detector controller. + [Mythen3][Gotthard2] will require a script to start up the shorter named server link at start up. + server_name is full path name of detector server binary + fname is full path of programming file )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + if (args[args.size() - 1].find(".pof") == std::string::npos && + args[args.size() - 1].find(".rbf") == std::string::npos) { + throw RuntimeError("Programming file must be a pof/rbf file."); + } + det->updateFirmwareAndServer(args[0], args[1], + std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::updatedetectorserver(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: updatedetectorserver" << std::endl; + os << R"V0G0N([server_name with full path] + [Jungfrau][Moench][Eiger][Ctb][Mythen3][Gotthard2] Copies detector server via TCP (without tftp). Makes a symbolic link with a shorter name (without vx.x.x). Then, detector controller reboots (except Eiger). + [Jungfrau][Moench][Ctb]Also changes respawn server to the link, which is effective after a reboot. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->updateDetectorServer(args[0], std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::updatekernel(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: updatekernel" << std::endl; + os << R"V0G0N([kernel_name with full path] + [Jungfrau][Moench][Ctb][Mythen3][Gotthard2] Advanced Command!! You could damage the detector. Please use with caution. + Updates the kernel image. Then, detector controller reboots with new kernel. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->updateKernel(args[0], std::vector{det_id}); + os << "successful" << '\n'; + } + } + + return os.str(); +} + +std::string Caller::updatemode(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: updatemode" << std::endl; + os << R"V0G0N([0|1] + Restart the detector server in update mode or not. This is useful when server-firmware compatibility is at its worst and server cannot start up normally )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getUpdateMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setUpdateMode(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::user(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: user" << std::endl; + os << R"V0G0N( + User details from shared memory (hostname, type, PID, User, Date). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + if (det_id != -1) { + throw RuntimeError("Cannot execute user at module level"); + } + auto t = det->getUserDetails(); + os << t << '\n'; + } + } + + return os.str(); +} + +std::string Caller::v_a(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: v_a" << std::endl; + os << R"V0G0N([n_value] + [Ctb] Power supply a in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPower(defs::V_POWER_A, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + det->setPower(defs::V_POWER_A, arg1, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::v_b(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: v_b" << std::endl; + os << R"V0G0N([n_value] + [Ctb] Power supply b in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPower(defs::V_POWER_B, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + det->setPower(defs::V_POWER_B, arg1, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::v_c(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: v_c" << std::endl; + os << R"V0G0N([n_value] + [Ctb] Power supply c in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPower(defs::V_POWER_C, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + det->setPower(defs::V_POWER_C, arg1, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::v_chip(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: v_chip" << std::endl; + os << R"V0G0N([n_value] + [Ctb] Power supply chip in mV. Do not use it unless you are completely sure you will not fry the board. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = + det->getPower(defs::V_POWER_CHIP, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + det->setPower(defs::V_POWER_CHIP, arg1, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::v_d(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: v_d" << std::endl; + os << R"V0G0N([n_value] + [Ctb] Power supply d in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPower(defs::V_POWER_D, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + det->setPower(defs::V_POWER_D, arg1, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::v_io(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: v_io" << std::endl; + os << R"V0G0N([n_value] + [Ctb] Power supply io in mV. Minimum 1200 mV. Must be the first power regulator to be set after fpga reset (on-board detector server start up). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPower(defs::V_POWER_IO, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + det->setPower(defs::V_POWER_IO, arg1, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::v_limit(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: v_limit" << std::endl; + os << R"V0G0N([n_value] + [Ctb] Soft limit for power supplies (ctb only) and DACS in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getPower(defs::V_LIMIT, std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + det->setPower(defs::V_LIMIT, arg1, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vchip_comp_adc(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vchip_comp_adc" << std::endl; + os << R"V0G0N([chip index 0-9, -1 for all][10 bit hex value] + [Gotthard2] On chip Dac for comparator current of ADC. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + auto t = det->getOnChipDAC(defs::VB_COMP_ADC, arg1, + std::vector{det_id}); + os << args[0] << ' ' << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg1 = StringTo(args[0]); + auto arg2 = StringTo(args[1]); + det->setOnChipDAC(defs::VB_COMP_ADC, arg1, arg2, + std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vchip_comp_fe(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vchip_comp_fe" << std::endl; + os << R"V0G0N([chip index 0-9, -1 for all][10 bit hex value] + [Gotthard2] On chip Dac for comparator current of analogue front end. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + auto t = det->getOnChipDAC(defs::VB_COMP_FE, arg1, + std::vector{det_id}); + os << args[0] << ' ' << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg1 = StringTo(args[0]); + auto arg2 = StringTo(args[1]); + det->setOnChipDAC(defs::VB_COMP_FE, arg1, arg2, + std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vchip_cs(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vchip_cs" << std::endl; + os << R"V0G0N([chip index 0-9, -1 for all][10 bit hex value] + [Gotthard2] On chip Dac for current injection into preamplifier. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + auto t = + det->getOnChipDAC(defs::VB_CS, arg1, std::vector{det_id}); + os << args[0] << ' ' << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg1 = StringTo(args[0]); + auto arg2 = StringTo(args[1]); + det->setOnChipDAC(defs::VB_CS, arg1, arg2, + std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vchip_opa_1st(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vchip_opa_1st" << std::endl; + os << R"V0G0N([chip index 0-9, -1 for all][10 bit hex value] + [Gotthard2] On chip Dac for opa current for driving the other DACs in chip. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + auto t = det->getOnChipDAC(defs::VB_OPA_1ST, arg1, + std::vector{det_id}); + os << args[0] << ' ' << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg1 = StringTo(args[0]); + auto arg2 = StringTo(args[1]); + det->setOnChipDAC(defs::VB_OPA_1ST, arg1, arg2, + std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vchip_opa_fd(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vchip_opa_fd" << std::endl; + os << R"V0G0N([chip index 0-9, -1 for all][10 bit hex value] + [Gotthard2] On chip Dac current for CDS opa stage. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + auto t = det->getOnChipDAC(defs::VB_OPA_FD, arg1, + std::vector{det_id}); + os << args[0] << ' ' << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg1 = StringTo(args[0]); + auto arg2 = StringTo(args[1]); + det->setOnChipDAC(defs::VB_OPA_FD, arg1, arg2, + std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vchip_ref_comp_fe(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vchip_ref_comp_fe" << std::endl; + os << R"V0G0N([chip index 0-9, -1 for all][10 bit hex value] + [Gotthard2] On chip Dac for reference voltage of the comparator of analogue front end. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + auto arg1 = StringTo(args[0]); + auto t = det->getOnChipDAC(defs::VREF_COMP_FE, arg1, + std::vector{det_id}); + os << args[0] << ' ' << OutStringHex(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg1 = StringTo(args[0]); + auto arg2 = StringTo(args[1]); + det->setOnChipDAC(defs::VREF_COMP_FE, arg1, arg2, + std::vector{det_id}); + os << args[0] << ' ' << args[1] << '\n'; + } + } + + return os.str(); +} + +std::string Caller::veto(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: veto" << std::endl; + os << R"V0G0N([0, 1] + [Gotthard2] Enable or disable veto data data from chip. Default is 0. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to bool"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getVeto(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setVeto(arg0, std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vetoalg(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vetoalg" << std::endl; + os << R"V0G0N([hits|raw] [lll|10gbe] + [Gotthard2] Set the veto algorithm. Default is hits. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 1) { + defs::streamingInterface interface = + StringTo(args[0]); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + defs::vetoAlgorithm alg = StringTo(args[0]); + defs::streamingInterface interface = + StringTo(args[1]); + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 1) { + defs::streamingInterface interface = + StringTo(args[0]); + if (interface == defs::streamingInterface::NONE) { + throw RuntimeError( + "Must specify an interface to set algorithm"); + } + auto t = det->getVetoAlgorithm(interface, std::vector{det_id}); + os << OutString(t) << ' ' << ToString(interface) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + defs::vetoAlgorithm alg = StringTo(args[0]); + defs::streamingInterface interface = + StringTo(args[1]); + if (interface == defs::streamingInterface::NONE) { + throw RuntimeError( + "Must specify an interface to set algorithm"); + } + det->setVetoAlgorithm(alg, interface, std::vector{det_id}); + os << ToString(alg) << ' ' << ToString(interface) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vetofile(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vetofile" << std::endl; + os << R"V0G0N([chip index 0-9, -1 for all] [file name] + [Gotthard2] Set veto reference for each 128 channels for specific chip. The file should have 128 rows of gain index and 12 bit value in dec )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (true) { + throw RuntimeError("Cannot get vetofile. Did you mean vetophoton?"); + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + det->setVetoFile(arg0, args[1], std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vetophoton(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vetophoton" << std::endl; + os << R"V0G0N([ichip] [#photons] [energy in keV] [reference file] + [Gotthard2] Set veto reference for 128 channels for chip ichip according to reference file and #photons and energy in keV. +[ichip] [output file] + Get gain indices and veto reference for 128 channels for chip ichip, saved to file. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 4) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 4) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + try { + StringTo(args[2]); + } catch (...) { + throw RuntimeError("Could not convert argument 2 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + det->getVetoPhoton(arg0, args[1], std::vector{det_id}); + os << "saved to file " << args[1] << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 4) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + auto arg2 = StringTo(args[2]); + det->setVetoPhoton(arg0, arg1, arg2, args[3], + std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vetoref(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vetoref" << std::endl; + os << R"V0G0N([gain index] [12 bit value] + [Gotthard2] Set veto reference for all 128 channels for all chips. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (true) { + throw RuntimeError("Cannot get vetoref. Did you mean vetophoton?"); + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setVetoReference(arg0, arg1); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::virtualFunction(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: virtual" << std::endl; + os << R"V0G0N([n_servers] [starting_port_number] + Connecs to n virtual server at local host starting at specific control port. Every virtual server will have a stop port (control port + 1) )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 2) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 2) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + try { + StringTo(args[1]); + } catch (...) { + throw RuntimeError("Could not convert argument 1 to uint16_t"); + } + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 2) { + if (det_id != -1) { + throw RuntimeError("Cannot execute virtual at module level"); + } + auto arg0 = StringTo(args[0]); + auto arg1 = StringTo(args[1]); + det->setVirtualDetectorServers(arg0, arg1); + os << ToString(args) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vm_a(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vm_a" << std::endl; + os << R"V0G0N( + [Ctb] Measured voltage of power supply a in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredPower(defs::V_POWER_A, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vm_b(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vm_b" << std::endl; + os << R"V0G0N( + [Ctb] Measured voltage of power supply b in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredPower(defs::V_POWER_B, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vm_c(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vm_c" << std::endl; + os << R"V0G0N( + [Ctb] Measured voltage of power supply c in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredPower(defs::V_POWER_C, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vm_d(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vm_d" << std::endl; + os << R"V0G0N( + [Ctb] Measured voltage of power supply d in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredPower(defs::V_POWER_D, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::vm_io(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: vm_io" << std::endl; + os << R"V0G0N( + [Ctb] Measured voltage of power supply io in mV. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else { + + throw RuntimeError( + "INTERNAL ERROR: Invalid action: supported actions are ['GET']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getMeasuredPower(defs::V_POWER_IO, + std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + return os.str(); +} + +std::string Caller::zmqhwm(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: zmqhwm" << std::endl; + os << R"V0G0N([n_limit] + Client's zmq receive high water mark. Default is the zmq library's default (1000), can also be set here using -1. + This is a high number and can be set to 2 for gui purposes. + One must also set the receiver's send high water mark to similar value. Final effect is sum of them. + Setting it via command line is useful only before zmq enabled (before opening gui). )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to int"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getClientZmqHwm(); + os << t << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setClientZmqHwm(arg0); + os << det->getClientZmqHwm() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::zmqip(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: zmqip" << std::endl; + os << R"V0G0N([x.x.x.x] + Ip Address to listen to zmq data streamed out from receiver or intermediate process. Default connects to receiver zmq Ip Address (from rx_hostname). Modified only when using an intermediate process between receiver and client(gui). Also restarts client zmq streaming if enabled. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getClientZmqIp(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + det->setClientZmqIp(IpAddr(args[0]), std::vector{det_id}); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +std::string Caller::zmqport(int action) { + + std::ostringstream os; + // print help + if (action == slsDetectorDefs::HELP_ACTION) { + os << "Command: zmqport" << std::endl; + os << R"V0G0N([port] + Zmq port in client(gui) or intermediate process for data to be streamed to from receiver. Default connects to receiver zmq streaming out port (30001). Modified only when using an intermediate process between receiver and client(gui). Also restarts client zmq streaming if enabled. Must be different for every detector (and udp port). Multi command will automatically increment for individual modules. )V0G0N" + << std::endl; + return os.str(); + } + + // check if action and arguments are valid + if (action == slsDetectorDefs::GET_ACTION) { + if (1 && args.size() != 0) { + throw RuntimeError("Wrong number of arguments for action GET"); + } + + if (args.size() == 0) { + } + + } + + else if (action == slsDetectorDefs::PUT_ACTION) { + if (1 && args.size() != 1) { + throw RuntimeError("Wrong number of arguments for action PUT"); + } + + if (args.size() == 1) { + try { + StringTo(args[0]); + } catch (...) { + throw RuntimeError("Could not convert argument 0 to uint16_t"); + } + } + + } + + else { + + throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions " + "are ['GET', 'PUT']"); + } + + // generate code for each action + if (action == slsDetectorDefs::GET_ACTION) { + if (args.size() == 0) { + auto t = det->getClientZmqPort(std::vector{det_id}); + os << OutString(t) << '\n'; + } + } + + if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() == 1) { + auto arg0 = StringTo(args[0]); + det->setClientZmqPort(arg0, det_id); + os << args.front() << '\n'; + } + } + + return os.str(); +} + +} // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/src/Caller.h b/slsDetectorSoftware/src/Caller.h new file mode 100644 index 000000000..679f76526 --- /dev/null +++ b/slsDetectorSoftware/src/Caller.h @@ -0,0 +1,878 @@ +// This file is used as input to generate the caller class + +#include "CmdParser.h" +#include "HelpDacs.h" +#include "sls/Detector.h" + +#include +#include +#include +namespace sls { + +class Caller { + public: + Caller(Detector *ptr) : det(ptr) {} + void call(const std::string &command, + const std::vector &arguments, int detector_id, + int action, std::ostream &os = std::cout, int receiver_id = -1); + + IpAddr getDstIpFromAuto(); + IpAddr getSrcIpFromAuto(); + UdpDestination getUdpEntry(); + void GetLevelAndUpdateArgIndex(int action, + std::string levelSeparatedCommand, + int &level, int &iArg, size_t nGetArgs, + size_t nPutArgs); + void WrongNumberOfParameters(size_t expected); + + template std::string OutStringHex(const V &value) { + if (value.equal()) + return ToStringHex(value.front()); + return ToStringHex(value); + } + + template std::string OutStringHex(const V &value, int width) { + if (value.equal()) + return ToStringHex(value.front(), width); + return ToStringHex(value, width); + } + + template std::string OutString(const Result &value) { + if (value.equal()) + return ToString(value.front()); + return ToString(value); + } + + template std::string OutString(const V &value) { + return ToString(value); + } + + template + std::string OutString(const V &value, const std::string &unit) { + if (value.equal()) + return ToString(value.front(), unit); + return ToString(value, unit); + } + + std::vector getAllCommands(); + std::string list(int action); + + std::string acquire(int action); + std::string activate(int action); + std::string adcclk(int action); + std::string adcenable(int action); + std::string adcenable10g(int action); + std::string adcindex(int action); + std::string adcinvert(int action); + std::string adclist(int action); + std::string adcname(int action); + std::string adcphase(int action); + std::string adcpipeline(int action); + std::string adcreg(int action); + std::string adcvpp(int action); + std::string apulse(int action); + std::string asamples(int action); + std::string autocompdisable(int action); + std::string badchannels(int action); + std::string blockingtrigger(int action); + std::string burstmode(int action); + std::string burstperiod(int action); + std::string bursts(int action); + std::string burstsl(int action); + std::string bustest(int action); + std::string cdsgain(int action); + std::string chipversion(int action); + std::string clearbit(int action); + std::string clearbusy(int action); + std::string clearroi(int action); + std::string clientversion(int action); + std::string clkdiv(int action); + std::string clkfreq(int action); + std::string clkphase(int action); + std::string column(int action); + std::string compdisabletime(int action); + std::string confadc(int action); + std::string config(int action); + std::string counters(int action); + std::string currentsource(int action); + std::string dac(int action); + std::string dacindex(int action); + std::string daclist(int action); + std::string dacname(int action); + std::string dacvalues(int action); + std::string datastream(int action); + std::string dbitclk(int action); + std::string dbitphase(int action); + std::string dbitpipeline(int action); + std::string defaultdac(int action); + std::string defaultpattern(int action); + std::string delay(int action); + std::string delayl(int action); + std::string detectorserverversion(int action); + std::string detsize(int action); + std::string diodelay(int action); + std::string dpulse(int action); + std::string dr(int action); + std::string drlist(int action); + std::string dsamples(int action); + std::string execcommand(int action); + std::string exptime(int action); + std::string exptime1(int action); + std::string exptime2(int action); + std::string exptime3(int action); + std::string exptimel(int action); + std::string extrastoragecells(int action); + std::string extsampling(int action); + std::string extsamplingsrc(int action); + std::string extsig(int action); + std::string fformat(int action); + std::string filtercells(int action); + std::string filterresistor(int action); + std::string findex(int action); + std::string firmwaretest(int action); + std::string firmwareversion(int action); + std::string fliprows(int action); + std::string flowcontrol10g(int action); + std::string fmaster(int action); + std::string fname(int action); + std::string foverwrite(int action); + std::string fpath(int action); + std::string framecounter(int action); + std::string frames(int action); + std::string framesl(int action); + std::string frametime(int action); + std::string free(int action); + std::string fwrite(int action); + std::string gaincaps(int action); + std::string gainmode(int action); + std::string gappixels(int action); + std::string gatedelay(int action); + std::string gatedelay1(int action); + std::string gatedelay2(int action); + std::string gatedelay3(int action); + std::string gates(int action); + std::string getbit(int action); + std::string hardwareversion(int action); + std::string highvoltage(int action); + std::string hostname(int action); + std::string im_a(int action); + std::string im_b(int action); + std::string im_c(int action); + std::string im_d(int action); + std::string im_io(int action); + std::string imagetest(int action); + std::string initialchecks(int action); + std::string inj_ch(int action); + std::string interpolation(int action); + std::string interruptsubframe(int action); + std::string kernelversion(int action); + std::string lastclient(int action); + std::string led(int action); + std::string lock(int action); + std::string master(int action); + std::string maxadcphaseshift(int action); + std::string maxclkphaseshift(int action); + std::string maxdbitphaseshift(int action); + std::string measuredperiod(int action); + std::string measuredsubperiod(int action); + std::string moduleid(int action); + std::string nextframenumber(int action); + std::string nmod(int action); + std::string numinterfaces(int action); + std::string overflow(int action); + std::string packageversion(int action); + std::string parallel(int action); + std::string parameters(int action); + std::string partialreset(int action); + std::string patfname(int action); + std::string patioctrl(int action); + std::string patlimits(int action); + std::string patloop(int action); + std::string patloop0(int action); + std::string patloop1(int action); + std::string patloop2(int action); + std::string patmask(int action); + std::string patnloop(int action); + std::string patnloop0(int action); + std::string patnloop1(int action); + std::string patnloop2(int action); + std::string patsetbit(int action); + std::string pattern(int action); + std::string patternstart(int action); + std::string patwait(int action); + std::string patwait0(int action); + std::string patwait1(int action); + std::string patwait2(int action); + std::string patwaittime(int action); + std::string patwaittime0(int action); + std::string patwaittime1(int action); + std::string patwaittime2(int action); + std::string patword(int action); + std::string pedestalmode(int action); + std::string period(int action); + std::string periodl(int action); + std::string polarity(int action); + std::string port(int action); + std::string powerchip(int action); + std::string powerindex(int action); + std::string powerlist(int action); + std::string powername(int action); + std::string powervalues(int action); + std::string programfpga(int action); + std::string pulse(int action); + std::string pulsechip(int action); + std::string pulsenmove(int action); + std::string pumpprobe(int action); + std::string quad(int action); + std::string ratecorr(int action); + std::string readnrows(int action); + std::string readout(int action); + std::string readoutspeed(int action); + std::string readoutspeedlist(int action); + std::string rebootcontroller(int action); + std::string reg(int action); + std::string resetdacs(int action); + std::string resetfpga(int action); + std::string roi(int action); + std::string romode(int action); + std::string row(int action); + std::string runclk(int action); + std::string runtime(int action); + std::string rx_arping(int action); + std::string rx_clearroi(int action); + std::string rx_dbitlist(int action); + std::string rx_dbitoffset(int action); + std::string rx_discardpolicy(int action); + std::string rx_fifodepth(int action); + std::string rx_frameindex(int action); + std::string rx_framescaught(int action); + std::string rx_framesperfile(int action); + std::string rx_hostname(int action); + std::string rx_jsonaddheader(int action); + std::string rx_jsonpara(int action); + std::string rx_lastclient(int action); + std::string rx_lock(int action); + std::string rx_missingpackets(int action); + std::string rx_padding(int action); + std::string rx_printconfig(int action); + std::string rx_realudpsocksize(int action); + std::string rx_roi(int action); + std::string rx_silent(int action); + std::string rx_start(int action); + std::string rx_status(int action); + std::string rx_stop(int action); + std::string rx_tcpport(int action); + std::string rx_threads(int action); + std::string rx_udpsocksize(int action); + std::string rx_version(int action); + std::string rx_zmqfreq(int action); + std::string rx_zmqhwm(int action); + std::string rx_zmqip(int action); + std::string rx_zmqport(int action); + std::string rx_zmqstartfnum(int action); + std::string rx_zmqstream(int action); + std::string samples(int action); + std::string savepattern(int action); + std::string scan(int action); + std::string scanerrmsg(int action); + std::string selinterface(int action); + std::string serialnumber(int action); + std::string setbit(int action); + std::string settings(int action); + std::string settingslist(int action); + std::string settingspath(int action); + std::string signalindex(int action); + std::string signallist(int action); + std::string signalname(int action); + std::string slowadc(int action); + std::string slowadcindex(int action); + std::string slowadclist(int action); + std::string slowadcname(int action); + std::string slowadcvalues(int action); + std::string start(int action); + std::string status(int action); + std::string stop(int action); + std::string stopport(int action); + std::string storagecell_delay(int action); + std::string storagecell_start(int action); + std::string subdeadtime(int action); + std::string subexptime(int action); + std::string sync(int action); + std::string syncclk(int action); + std::string temp_10ge(int action); + std::string temp_adc(int action); + std::string temp_control(int action); + std::string temp_dcdc(int action); + std::string temp_event(int action); + std::string temp_fpga(int action); + std::string temp_fpgaext(int action); + std::string temp_fpgafl(int action); + std::string temp_fpgafr(int action); + std::string temp_slowadc(int action); + std::string temp_sodl(int action); + std::string temp_sodr(int action); + std::string temp_threshold(int action); + std::string templist(int action); + std::string tempvalues(int action); + std::string tengiga(int action); + std::string threshold(int action); + std::string timing(int action); + std::string timinglist(int action); + std::string timingsource(int action); + std::string top(int action); + std::string transceiverenable(int action); + std::string trigger(int action); + std::string triggers(int action); + std::string triggersl(int action); + std::string trimbits(int action); + std::string trimen(int action); + std::string trimval(int action); + std::string tsamples(int action); + std::string txdelay(int action); + std::string txdelay_frame(int action); + std::string txdelay_left(int action); + std::string txdelay_right(int action); + std::string type(int action); + std::string udp_cleardst(int action); + std::string udp_dstip(int action); + std::string udp_dstip2(int action); + std::string udp_dstlist(int action); + std::string udp_dstmac(int action); + std::string udp_dstmac2(int action); + std::string udp_dstport(int action); + std::string udp_dstport2(int action); + std::string udp_firstdst(int action); + std::string udp_numdst(int action); + std::string udp_reconfigure(int action); + std::string udp_srcip(int action); + std::string udp_srcip2(int action); + std::string udp_srcmac(int action); + std::string udp_srcmac2(int action); + std::string udp_validate(int action); + std::string update(int action); + std::string updatedetectorserver(int action); + std::string updatekernel(int action); + std::string updatemode(int action); + std::string user(int action); + std::string v_a(int action); + std::string v_b(int action); + std::string v_c(int action); + std::string v_chip(int action); + std::string v_d(int action); + std::string v_io(int action); + std::string v_limit(int action); + std::string vchip_comp_adc(int action); + std::string vchip_comp_fe(int action); + std::string vchip_cs(int action); + std::string vchip_opa_1st(int action); + std::string vchip_opa_fd(int action); + std::string vchip_ref_comp_fe(int action); + std::string versions(int action); + std::string veto(int action); + std::string vetoalg(int action); + std::string vetofile(int action); + std::string vetophoton(int action); + std::string vetoref(int action); + std::string vetostream(int action); + std::string virtualFunction(int action); + std::string vm_a(int action); + std::string vm_b(int action); + std::string vm_c(int action); + std::string vm_d(int action); + std::string vm_io(int action); + std::string zmqhwm(int action); + std::string zmqip(int action); + std::string zmqport(int action); + + std::vector args; + std::string cmd; + Detector *det; + int det_id{-1}; + int rx_id{-1}; + + private: + bool ReplaceIfDepreciated(std::string &command); + using FunctionMap = std::map; + using StringMap = std::map; + Detector *ptr; // pointer to the detector that executes the command + + FunctionMap functions{ + {"list", &Caller::list}, + + {"acquire", &Caller::acquire}, + {"activate", &Caller::activate}, + {"adcclk", &Caller::adcclk}, + {"adcenable", &Caller::adcenable}, + {"adcenable10g", &Caller::adcenable10g}, + {"adcindex", &Caller::adcindex}, + {"adcinvert", &Caller::adcinvert}, + {"adclist", &Caller::adclist}, + {"adcname", &Caller::adcname}, + {"adcphase", &Caller::adcphase}, + {"adcpipeline", &Caller::adcpipeline}, + {"adcreg", &Caller::adcreg}, + {"adcvpp", &Caller::adcvpp}, + {"apulse", &Caller::apulse}, + {"asamples", &Caller::asamples}, + {"autocompdisable", &Caller::autocompdisable}, + {"badchannels", &Caller::badchannels}, + {"blockingtrigger", &Caller::blockingtrigger}, + {"burstmode", &Caller::burstmode}, + {"burstperiod", &Caller::burstperiod}, + {"bursts", &Caller::bursts}, + {"burstsl", &Caller::burstsl}, + {"bustest", &Caller::bustest}, + {"cdsgain", &Caller::cdsgain}, + {"chipversion", &Caller::chipversion}, + {"clearbit", &Caller::clearbit}, + {"clearbusy", &Caller::clearbusy}, + {"clearroi", &Caller::clearroi}, + {"clientversion", &Caller::clientversion}, + {"clkdiv", &Caller::clkdiv}, + {"clkfreq", &Caller::clkfreq}, + {"clkphase", &Caller::clkphase}, + {"column", &Caller::column}, + {"compdisabletime", &Caller::compdisabletime}, + {"confadc", &Caller::confadc}, + {"config", &Caller::config}, + {"counters", &Caller::counters}, + {"currentsource", &Caller::currentsource}, + {"dac", &Caller::dac}, + {"dacindex", &Caller::dacindex}, + {"daclist", &Caller::daclist}, + {"dacname", &Caller::dacname}, + {"dacvalues", &Caller::dacvalues}, + {"datastream", &Caller::datastream}, + {"dbitclk", &Caller::dbitclk}, + {"dbitphase", &Caller::dbitphase}, + {"dbitpipeline", &Caller::dbitpipeline}, + {"defaultdac", &Caller::defaultdac}, + {"defaultpattern", &Caller::defaultpattern}, + {"delay", &Caller::delay}, + {"delayl", &Caller::delayl}, + {"detectorserverversion", &Caller::detectorserverversion}, + {"detsize", &Caller::detsize}, + {"diodelay", &Caller::diodelay}, + {"dpulse", &Caller::dpulse}, + {"dr", &Caller::dr}, + {"drlist", &Caller::drlist}, + {"dsamples", &Caller::dsamples}, + {"execcommand", &Caller::execcommand}, + {"exptime", &Caller::exptime}, + {"exptime1", &Caller::exptime1}, + {"exptime2", &Caller::exptime2}, + {"exptime3", &Caller::exptime3}, + {"exptimel", &Caller::exptimel}, + {"extrastoragecells", &Caller::extrastoragecells}, + {"extsampling", &Caller::extsampling}, + {"extsamplingsrc", &Caller::extsamplingsrc}, + {"extsig", &Caller::extsig}, + {"fformat", &Caller::fformat}, + {"filtercells", &Caller::filtercells}, + {"filterresistor", &Caller::filterresistor}, + {"findex", &Caller::findex}, + {"firmwaretest", &Caller::firmwaretest}, + {"firmwareversion", &Caller::firmwareversion}, + {"fliprows", &Caller::fliprows}, + {"flowcontrol10g", &Caller::flowcontrol10g}, + {"fmaster", &Caller::fmaster}, + {"fname", &Caller::fname}, + {"foverwrite", &Caller::foverwrite}, + {"fpath", &Caller::fpath}, + {"framecounter", &Caller::framecounter}, + {"frames", &Caller::frames}, + {"framesl", &Caller::framesl}, + {"frametime", &Caller::frametime}, + {"free", &Caller::free}, + {"fwrite", &Caller::fwrite}, + {"gaincaps", &Caller::gaincaps}, + {"gainmode", &Caller::gainmode}, + {"gappixels", &Caller::gappixels}, + {"gatedelay", &Caller::gatedelay}, + {"gatedelay1", &Caller::gatedelay1}, + {"gatedelay2", &Caller::gatedelay2}, + {"gatedelay3", &Caller::gatedelay3}, + {"gates", &Caller::gates}, + {"getbit", &Caller::getbit}, + {"hardwareversion", &Caller::hardwareversion}, + {"highvoltage", &Caller::highvoltage}, + {"hostname", &Caller::hostname}, + {"im_a", &Caller::im_a}, + {"im_b", &Caller::im_b}, + {"im_c", &Caller::im_c}, + {"im_d", &Caller::im_d}, + {"im_io", &Caller::im_io}, + {"imagetest", &Caller::imagetest}, + {"initialchecks", &Caller::initialchecks}, + {"inj_ch", &Caller::inj_ch}, + {"interpolation", &Caller::interpolation}, + {"interruptsubframe", &Caller::interruptsubframe}, + {"kernelversion", &Caller::kernelversion}, + {"lastclient", &Caller::lastclient}, + {"led", &Caller::led}, + {"lock", &Caller::lock}, + {"master", &Caller::master}, + {"maxadcphaseshift", &Caller::maxadcphaseshift}, + {"maxclkphaseshift", &Caller::maxclkphaseshift}, + {"maxdbitphaseshift", &Caller::maxdbitphaseshift}, + {"measuredperiod", &Caller::measuredperiod}, + {"measuredsubperiod", &Caller::measuredsubperiod}, + {"moduleid", &Caller::moduleid}, + {"nextframenumber", &Caller::nextframenumber}, + {"nmod", &Caller::nmod}, + {"numinterfaces", &Caller::numinterfaces}, + {"overflow", &Caller::overflow}, + {"packageversion", &Caller::packageversion}, + {"parallel", &Caller::parallel}, + {"parameters", &Caller::parameters}, + {"partialreset", &Caller::partialreset}, + {"patfname", &Caller::patfname}, + {"patioctrl", &Caller::patioctrl}, + {"patlimits", &Caller::patlimits}, + {"patloop", &Caller::patloop}, + {"patloop0", &Caller::patloop0}, + {"patloop1", &Caller::patloop1}, + {"patloop2", &Caller::patloop2}, + {"patmask", &Caller::patmask}, + {"patnloop", &Caller::patnloop}, + {"patnloop0", &Caller::patnloop0}, + {"patnloop1", &Caller::patnloop1}, + {"patnloop2", &Caller::patnloop2}, + {"patsetbit", &Caller::patsetbit}, + {"patternX", &Caller::pattern}, + {"patternstart", &Caller::patternstart}, + {"patwait", &Caller::patwait}, + {"patwait0", &Caller::patwait0}, + {"patwait1", &Caller::patwait1}, + {"patwait2", &Caller::patwait2}, + {"patwaittime", &Caller::patwaittime}, + {"patwaittime0", &Caller::patwaittime0}, + {"patwaittime1", &Caller::patwaittime1}, + {"patwaittime2", &Caller::patwaittime2}, + {"patword", &Caller::patword}, + {"pedestalmode", &Caller::pedestalmode}, + {"period", &Caller::period}, + {"periodl", &Caller::periodl}, + {"polarity", &Caller::polarity}, + {"port", &Caller::port}, + {"powerchip", &Caller::powerchip}, + {"powerindex", &Caller::powerindex}, + {"powerlist", &Caller::powerlist}, + {"powername", &Caller::powername}, + {"powervalues", &Caller::powervalues}, + {"programfpga", &Caller::programfpga}, + {"pulse", &Caller::pulse}, + {"pulsechip", &Caller::pulsechip}, + {"pulsenmove", &Caller::pulsenmove}, + {"pumpprobe", &Caller::pumpprobe}, + {"quad", &Caller::quad}, + {"ratecorr", &Caller::ratecorr}, + {"readnrows", &Caller::readnrows}, + {"readout", &Caller::readout}, + {"readoutspeed", &Caller::readoutspeed}, + {"readoutspeedlist", &Caller::readoutspeedlist}, + {"rebootcontroller", &Caller::rebootcontroller}, + {"reg", &Caller::reg}, + {"resetdacs", &Caller::resetdacs}, + {"resetfpga", &Caller::resetfpga}, + {"roi", &Caller::roi}, + {"romode", &Caller::romode}, + {"row", &Caller::row}, + {"runclk", &Caller::runclk}, + {"runtime", &Caller::runtime}, + {"rx_arping", &Caller::rx_arping}, + {"rx_clearroi", &Caller::rx_clearroi}, + {"rx_dbitlist", &Caller::rx_dbitlist}, + {"rx_dbitoffset", &Caller::rx_dbitoffset}, + {"rx_discardpolicy", &Caller::rx_discardpolicy}, + {"rx_fifodepth", &Caller::rx_fifodepth}, + {"rx_frameindex", &Caller::rx_frameindex}, + {"rx_framescaught", &Caller::rx_framescaught}, + {"rx_framesperfile", &Caller::rx_framesperfile}, + {"rx_hostname", &Caller::rx_hostname}, + {"rx_jsonaddheader", &Caller::rx_jsonaddheader}, + {"rx_jsonpara", &Caller::rx_jsonpara}, + {"rx_lastclient", &Caller::rx_lastclient}, + {"rx_lock", &Caller::rx_lock}, + {"rx_missingpackets", &Caller::rx_missingpackets}, + {"rx_padding", &Caller::rx_padding}, + {"rx_printconfig", &Caller::rx_printconfig}, + {"rx_realudpsocksize", &Caller::rx_realudpsocksize}, + {"rx_roi", &Caller::rx_roi}, + {"rx_silent", &Caller::rx_silent}, + {"rx_start", &Caller::rx_start}, + {"rx_status", &Caller::rx_status}, + {"rx_stop", &Caller::rx_stop}, + {"rx_tcpport", &Caller::rx_tcpport}, + {"rx_threads", &Caller::rx_threads}, + {"rx_udpsocksize", &Caller::rx_udpsocksize}, + {"rx_version", &Caller::rx_version}, + {"rx_zmqfreq", &Caller::rx_zmqfreq}, + {"rx_zmqhwm", &Caller::rx_zmqhwm}, + {"rx_zmqip", &Caller::rx_zmqip}, + {"rx_zmqport", &Caller::rx_zmqport}, + {"rx_zmqstartfnum", &Caller::rx_zmqstartfnum}, + {"rx_zmqstream", &Caller::rx_zmqstream}, + {"samples", &Caller::samples}, + {"savepattern", &Caller::savepattern}, + {"scan", &Caller::scan}, + {"scanerrmsg", &Caller::scanerrmsg}, + {"selinterface", &Caller::selinterface}, + {"serialnumber", &Caller::serialnumber}, + {"setbit", &Caller::setbit}, + {"settings", &Caller::settings}, + {"settingslist", &Caller::settingslist}, + {"settingspath", &Caller::settingspath}, + {"signalindex", &Caller::signalindex}, + {"signallist", &Caller::signallist}, + {"signalname", &Caller::signalname}, + {"slowadc", &Caller::slowadc}, + {"slowadcindex", &Caller::slowadcindex}, + {"slowadclist", &Caller::slowadclist}, + {"slowadcname", &Caller::slowadcname}, + {"slowadcvalues", &Caller::slowadcvalues}, + {"start", &Caller::start}, + {"status", &Caller::status}, + {"stop", &Caller::stop}, + {"stopport", &Caller::stopport}, + {"storagecell_delay", &Caller::storagecell_delay}, + {"storagecell_start", &Caller::storagecell_start}, + {"subdeadtime", &Caller::subdeadtime}, + {"subexptime", &Caller::subexptime}, + {"sync", &Caller::sync}, + {"syncclk", &Caller::syncclk}, + {"temp_10ge", &Caller::temp_10ge}, + {"temp_adc", &Caller::temp_adc}, + {"temp_control", &Caller::temp_control}, + {"temp_dcdc", &Caller::temp_dcdc}, + {"temp_event", &Caller::temp_event}, + {"temp_fpga", &Caller::temp_fpga}, + {"temp_fpgaext", &Caller::temp_fpgaext}, + {"temp_fpgafl", &Caller::temp_fpgafl}, + {"temp_fpgafr", &Caller::temp_fpgafr}, + {"temp_slowadc", &Caller::temp_slowadc}, + {"temp_sodl", &Caller::temp_sodl}, + {"temp_sodr", &Caller::temp_sodr}, + {"temp_threshold", &Caller::temp_threshold}, + {"templist", &Caller::templist}, + {"tempvalues", &Caller::tempvalues}, + {"tengiga", &Caller::tengiga}, + {"threshold", &Caller::threshold}, + {"thresholdnotb", &Caller::threshold}, + {"timing", &Caller::timing}, + {"timinglist", &Caller::timinglist}, + {"timingsource", &Caller::timingsource}, + {"top", &Caller::top}, + {"transceiverenable", &Caller::transceiverenable}, + {"trigger", &Caller::trigger}, + {"triggers", &Caller::triggers}, + {"triggersl", &Caller::triggersl}, + {"trimbits", &Caller::trimbits}, + {"trimen", &Caller::trimen}, + {"trimval", &Caller::trimval}, + {"tsamples", &Caller::tsamples}, + {"txdelay", &Caller::txdelay}, + {"txdelay_frame", &Caller::txdelay_frame}, + {"txdelay_left", &Caller::txdelay_left}, + {"txdelay_right", &Caller::txdelay_right}, + {"type", &Caller::type}, + {"udp_cleardst", &Caller::udp_cleardst}, + {"udp_dstip", &Caller::udp_dstip}, + {"udp_dstip2", &Caller::udp_dstip2}, + {"udp_dstlist", &Caller::udp_dstlist}, + {"udp_dstmac", &Caller::udp_dstmac}, + {"udp_dstmac2", &Caller::udp_dstmac2}, + {"udp_dstport", &Caller::udp_dstport}, + {"udp_dstport2", &Caller::udp_dstport2}, + {"udp_firstdst", &Caller::udp_firstdst}, + {"udp_numdst", &Caller::udp_numdst}, + {"udp_reconfigure", &Caller::udp_reconfigure}, + {"udp_srcip", &Caller::udp_srcip}, + {"udp_srcip2", &Caller::udp_srcip2}, + {"udp_srcmac", &Caller::udp_srcmac}, + {"udp_srcmac2", &Caller::udp_srcmac2}, + {"udp_validate", &Caller::udp_validate}, + {"update", &Caller::update}, + {"updatedetectorserver", &Caller::updatedetectorserver}, + {"updatekernel", &Caller::updatekernel}, + {"updatemode", &Caller::updatemode}, + {"user", &Caller::user}, + {"v_a", &Caller::v_a}, + {"v_b", &Caller::v_b}, + {"v_c", &Caller::v_c}, + {"v_chip", &Caller::v_chip}, + {"v_d", &Caller::v_d}, + {"v_io", &Caller::v_io}, + {"v_limit", &Caller::v_limit}, + {"vchip_comp_adc", &Caller::vchip_comp_adc}, + {"vchip_comp_fe", &Caller::vchip_comp_fe}, + {"vchip_cs", &Caller::vchip_cs}, + {"vchip_opa_1st", &Caller::vchip_opa_1st}, + {"vchip_opa_fd", &Caller::vchip_opa_fd}, + {"vchip_ref_comp_fe", &Caller::vchip_ref_comp_fe}, + {"versions", &Caller::versions}, + {"veto", &Caller::veto}, + {"vetoalg", &Caller::vetoalg}, + {"vetofile", &Caller::vetofile}, + {"vetophoton", &Caller::vetophoton}, + {"vetoref", &Caller::vetoref}, + {"vetostream", &Caller::vetostream}, + {"virtual", &Caller::virtualFunction}, + {"vm_a", &Caller::vm_a}, + {"vm_b", &Caller::vm_b}, + {"vm_c", &Caller::vm_c}, + {"vm_d", &Caller::vm_d}, + {"vm_io", &Caller::vm_io}, + {"zmqhwm", &Caller::zmqhwm}, + {"zmqip", &Caller::zmqip}, + {"zmqport", &Caller::zmqport} + + }; + + StringMap depreciated_functions{ + + {"detectorversion", "firmwareversion"}, + {"softwareversion", "detectorserverversion"}, + {"receiverversion", "rx_version"}, + {"detectornumber", "serialnumber"}, + {"thisversion", "clientversion"}, + {"detsizechan", "detsize"}, + {"trimdir", "settingspath"}, + {"settingsdir", "settingspath"}, + {"flippeddatax", "fliprows"}, + {"cycles", "triggers"}, + {"cyclesl", "triggersl"}, + {"clkdivider", "readoutspeed"}, + {"speed", "readoutspeed"}, + {"vhighvoltage", "highvoltage"}, + {"digitest", "imagetest"}, + {"filter", "filterresistor"}, + {"readnlines", "readnrows"}, + {"vtr", "vtrim"}, + {"vrf", "vrpreamp"}, + {"vrs", "vrshaper"}, + {"vcall", "vcal"}, + {"vis", "vishaper"}, + {"vshaper", "vrshaper"}, + {"vpreamp", "vrpreamp"}, + {"vshaperneg", "vrshaper_n"}, + {"viinsh", "vishaper"}, + {"vpl", "vcal_n"}, + {"vph", "vcal_p"}, + {"vthreshold", "dac"}, + {"vsvp", "dac"}, + {"vsvn", "dac"}, + {"vtrim", "dac"}, + {"vrpreamp", "dac"}, + {"vrshaper", "dac"}, + {"vtgstv", "dac"}, + {"vcmp_ll", "dac"}, + {"vcmp_lr", "dac"}, + {"vcal", "dac"}, + {"vcmp_rl", "dac"}, + {"vcmp_rr", "dac"}, + {"rxb_rb", "dac"}, + {"rxb_lb", "dac"}, + {"vcp", "dac"}, + {"vcn", "dac"}, + {"vishaper", "dac"}, + {"iodelay", "dac"}, + {"vref_ds", "dac"}, + {"vcascn_pb", "dac"}, + {"vcascp_pb", "dac"}, + {"vout_cm", "dac"}, + {"vcasc_out", "dac"}, + {"vin_cm", "dac"}, + {"vref_comp", "dac"}, + {"ib_test_c", "dac"}, + {"vrshaper_n", "dac"}, + {"vipre", "dac"}, + {"vdcsh", "dac"}, + {"vth1", "dac"}, + {"vth2", "dac"}, + {"vth3", "dac"}, + {"vcal_n", "dac"}, + {"vcal_p", "dac"}, + {"vcassh", "dac"}, + {"vcas", "dac"}, + {"vicin", "dac"}, + {"vipre_out", "dac"}, + {"vref_h_adc", "dac"}, + {"vb_comp_fe", "dac"}, + {"vb_comp_adc", "dac"}, + {"vcom_cds", "dac"}, + {"vref_rstore", "dac"}, + {"vb_opa_1st", "dac"}, + {"vref_comp_fe", "dac"}, + {"vcom_adc1", "dac"}, + {"vref_prech", "dac"}, + {"vref_l_adc", "dac"}, + {"vref_cds", "dac"}, + {"vb_cs", "dac"}, + {"vb_opa_fd", "dac"}, + {"vcom_adc2", "dac"}, + {"vb_ds", "dac"}, + {"vb_comp", "dac"}, + {"vb_pixbuf", "dac"}, + {"vin_com", "dac"}, + {"vdd_prot", "dac"}, + {"vbp_colbuf", "dac"}, + {"vb_sda", "dac"}, + {"vcasc_sfp", "dac"}, + {"vipre_cds", "dac"}, + {"ibias_sfp", "dac"}, + {"defaultdacs", "resetdacs"}, + {"busy", "clearbusy"}, + {"receiver", "rx_status"}, + {"framescaught", "rx_framescaught"}, + {"startingfnum", "nextframenumber"}, + {"detectorip", "udp_srcip"}, + {"detectorip2", "udp_srcip2"}, + {"detectormac", "udp_srcmac"}, + {"detectormac2", "udp_srcmac2"}, + {"rx_udpip", "udp_dstip"}, + {"rx_udpip2", "udp_dstip2"}, + {"rx_udpmac", "udp_dstmac"}, + {"rx_udpmac2", "udp_dstmac2"}, + {"rx_udpport", "udp_dstport"}, + {"rx_udpport2", "udp_dstport2"}, + {"flowcontrol_10g", "flowcontrol10g"}, + {"txndelay_frame", "txdelay_frame"}, + {"txndelay_left", "txdelay_left"}, + {"txndelay_right", "txdelay_right"}, + {"r_silent", "rx_silent"}, + {"r_discardpolicy", "rx_discardpolicy"}, + {"r_padding", "rx_padding"}, + {"r_lock", "rx_lock"}, + {"r_lastclient", "rx_lastclient"}, + {"fileformat", "fformat"}, + {"outdir", "fpath"}, + {"index", "findex"}, + {"enablefwrite", "fwrite"}, + {"masterfile", "fmaster"}, + {"overwrite", "foverwrite"}, + {"r_framesperfile", "rx_framesperfile"}, + {"r_readfreq", "rx_zmqfreq"}, + {"rx_readfreq", "rx_zmqfreq"}, + {"rx_datastream", "rx_zmqstream"}, + {"resmat", "partialreset"}, + {"storagecells", "extrastoragecells"}, + {"auto_comp_disable", "autocompdisable"}, + {"comp_disable_time", "compdisabletime"}, + {"adc", "slowadc"}, + {"flags", "romode"}, + {"i_a", "im_a"}, + {"i_b", "im_b"}, + {"i_c", "im_c"}, + {"i_d", "im_d"}, + {"i_io", "im_io"}, + {"copydetectorserver", "updatedetectorserver"}, + {"nframes", "framecounter"}, + {"now", "runtime"}, + {"timestamp", "frametime"}, + {"frameindex", "rx_frameindex"}, + + }; +}; + +} // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/src/CallerSpecial.cpp b/slsDetectorSoftware/src/CallerSpecial.cpp new file mode 100644 index 000000000..c64314f8e --- /dev/null +++ b/slsDetectorSoftware/src/CallerSpecial.cpp @@ -0,0 +1,1149 @@ +#include "Caller.h" +#include "sls/bit_utils.h" +#include "sls/file_utils.h" +#include "sls/logger.h" +#include "sls/string_utils.h" +#include +namespace sls { +// some helper functions to print + +std::vector Caller::getAllCommands() { + std::vector ret; + for (auto it : functions) + ret.push_back(it.first); + return ret; +} + +void Caller::call(const std::string &command, + const std::vector &arguments, int detector_id, + int action, std::ostream &os, int receiver_id) { + cmd = command; + args = arguments; // copy args before replacing + std::string temp; + while (temp != cmd) { + temp = cmd; + ReplaceIfDepreciated(cmd); + } + + det_id = detector_id; + rx_id = receiver_id; + auto it = functions.find(cmd); + if (it != functions.end()) { + auto ret = ((*this).*(it->second))(action); + os << cmd << ' ' << ret; + } else { + throw RuntimeError(cmd + + " Unknown command, use list to list all commands"); + } +} + +bool Caller::ReplaceIfDepreciated(std::string &command) { + auto d_it = depreciated_functions.find(command); + if (d_it != depreciated_functions.end()) { + + // insert old command into arguments (for dacs) + if (d_it->second == "dac") { + args.insert(args.begin(), command); + LOG(logWARNING) + << command + << " is deprecated and will be removed. Please migrate to: " + << d_it->second << " " << command; + } else { + LOG(logWARNING) + << command + << " is deprecated and will be removed. Please migrate to: " + << d_it->second; + } + command = d_it->second; + return true; + } + return false; +} + +std::string Caller::list(int action) { + std::string ret = "free\n"; + for (auto &f : functions) { + ret += f.first + "\n"; + } + + return ret; +} + +/* Network Configuration (Detector<->Receiver) */ + +IpAddr Caller::getDstIpFromAuto() { + std::string rxHostname = + det->getRxHostname(std::vector{det_id}).squash("none"); + // Hostname could be ip try to decode otherwise look up the hostname + auto val = IpAddr{rxHostname}; + if (val == 0) { + val = HostnameToIp(rxHostname.c_str()); + } + return val; +} + +IpAddr Caller::getSrcIpFromAuto() { + if (det->getDetectorType().squash() == defs::GOTTHARD) { + throw RuntimeError( + "Cannot use 'auto' for udp_srcip for GotthardI Detector."); + } + std::string hostname = + det->getHostname(std::vector{det_id}).squash("none"); + // Hostname could be ip try to decode otherwise look up the hostname + auto val = IpAddr{hostname}; + if (val == 0) { + val = HostnameToIp(hostname.c_str()); + } + return val; +} + +UdpDestination Caller::getUdpEntry() { + UdpDestination udpDestination{}; + udpDestination.entry = rx_id; + + for (auto it : args) { + size_t pos = it.find('='); + std::string key = it.substr(0, pos); + std::string value = it.substr(pos + 1); + if (key == "ip") { + if (value == "auto") { + auto val = getDstIpFromAuto(); + LOG(logINFO) << "Setting udp_dstip of detector " << det_id + << " to " << val; + udpDestination.ip = val; + } else { + udpDestination.ip = IpAddr(value); + } + } else if (key == "ip2") { + if (value == "auto") { + auto val = getDstIpFromAuto(); + LOG(logINFO) << "Setting udp_dstip2 of detector " << det_id + << " to " << val; + udpDestination.ip2 = val; + } else { + udpDestination.ip2 = IpAddr(value); + } + } else if (key == "mac") { + udpDestination.mac = MacAddr(value); + } else if (key == "mac2") { + udpDestination.mac2 = MacAddr(value); + } else if (key == "port") { + udpDestination.port = StringTo(value); + } else if (key == "port2") { + udpDestination.port2 = StringTo(value); + } + } + return udpDestination; +} +void Caller::WrongNumberOfParameters(size_t expected) { + if (expected == 0) { + throw RuntimeError("Command " + cmd + + " expected no parameter/s but got " + + std::to_string(args.size()) + "\n"); + } + throw RuntimeError("Command " + cmd + " expected (or >=) " + + std::to_string(expected) + " parameter/s but got " + + std::to_string(args.size()) + "\n"); +} + +void Caller::GetLevelAndUpdateArgIndex(int action, + std::string levelSeparatedCommand, + int &level, int &iArg, size_t nGetArgs, + size_t nPutArgs) { + if (cmd == levelSeparatedCommand) { + ++nGetArgs; + ++nPutArgs; + } else { + LOG(logWARNING) << "This command is deprecated and will be removed. " + "Please migrate to " + << levelSeparatedCommand; + } + if (action == defs::GET_ACTION && args.size() != nGetArgs) { + WrongNumberOfParameters(nGetArgs); + } else if (action == defs::PUT_ACTION && args.size() != nPutArgs) { + WrongNumberOfParameters(nPutArgs); + } + if (cmd == levelSeparatedCommand) { + level = StringTo(args[iArg++]); + } else { + level = cmd[cmd.find_first_of("012")] - '0'; + } +} + +std::string Caller::free(int action) { + // This function is purely for help, actual functionality is in the caller + return "free\n\tFree detector shared memory\n"; +} + +std::string Caller::hostname(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "\n\tFrees shared memory and sets hostname (or IP address) of " + "all modules concatenated by +.\n\t Virtual servers can already " + "use the port in hostname separated by ':' and ports incremented " + "by 2 to accomodate the stop server as well." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto t = det->getHostname(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.empty()) { + WrongNumberOfParameters(1); + } + if (det_id != -1) { + throw RuntimeError("Cannot execute this at module level"); + } + // only args[0], but many hostames concatenated with + + if (args[0].find('+') != std::string::npos) { + auto t = split(args[0], '+'); + det->setHostname(t); + os << ToString(t) << '\n'; + } + // either hostnames separated by space, or single hostname + else { + det->setHostname(args); + os << ToString(args) << '\n'; + } + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::acquire(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << cmd + << "\n\tAcquire the number of frames set up.\n\tBlocking command, " + "where control server is blocked and cannot accept other " + "commands until acquisition is done. \n\t- sets acquiring " + "flag\n\t- starts the receiver listener (if enabled)\n\t- starts " + "detector acquisition for number of frames set\n\t- monitors " + "detector status from running to idle\n\t- stops the receiver " + "listener (if enabled)\n\t- increments file index if file write " + "enabled\n\t- resets acquiring flag" + << '\n'; + } else { + if (det->empty()) { + throw RuntimeError("This shared memory has no detectors added."); + } + if (det_id >= 0) { + throw RuntimeError("Individual detectors not allowed for readout."); + } + + det->acquire(); + + if (det->getUseReceiverFlag().squash(false)) { + os << "\nAcquired "; + os << det->getFramesCaught() << '\n'; + } + } + return os.str(); +} +std::string Caller::versions(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "\n\tPrint all versions and detector type" << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + bool eiger = (det->getDetectorType().squash() == defs::EIGER); + auto t = det->getFirmwareVersion(std::vector{det_id}); + os << "\nType : " << OutString(det->getDetectorType()) + << "\nRelease : " << det->getPackageVersion() << std::hex + << "\nClient : " << det->getClientVersion(); + + if (eiger) { + os << "\nFirmware (Beb) : " + << OutString(det->getFirmwareVersion(std::vector{det_id})); + os << "\nFirmware (Febl) : " + << OutString(det->getFrontEndFirmwareVersion( + defs::FRONT_LEFT, std::vector{det_id})); + os << "\nFirmware (Febr) : " + << OutString(det->getFrontEndFirmwareVersion( + defs::FRONT_RIGHT, std::vector{det_id})); + } else { + os << "\nFirmware : " + << OutStringHex( + det->getFirmwareVersion(std::vector{det_id})); + } + + os << "\nServer : " + << OutString(det->getDetectorServerVersion(std::vector{det_id})) + << "\nKernel : " + << OutString(det->getKernelVersion({std::vector{det_id}})) + << "\nHardware : " + << OutString(det->getHardwareVersion(std::vector{det_id})); + + if (det->getUseReceiverFlag().squash(true)) { + os << "\nReceiver : " + << OutString(det->getReceiverVersion(std::vector{det_id})); + } + os << std::dec << '\n'; + } else if (action == defs::PUT_ACTION) { + throw RuntimeError("cannot put"); + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::threshold(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[eV] [(optinal settings)" + "\n\t[Eiger][Mythen3] Threshold in eV. It loads trim files from " + "settingspath."; + if (cmd == "thresholdnotb") { + os << "Trimbits are not loaded."; + } + os << "\n\nthreshold [eV1] [eV2] [eV3] [(optional settings)]" + "\n\t[Mythen3] Threshold in eV for each counter. It loads trim " + "files from settingspath. An energy of -1 will pick up values " + " from detector."; + if (cmd == "thresholdnotb") { + os << "Trimbits are not loaded."; + } + os << '\n'; + } else if (action == defs::GET_ACTION) { + if (cmd == "thresholdnotb") { + throw RuntimeError("cannot get"); + } + if (!args.empty()) { + WrongNumberOfParameters(0); + } + defs::detectorType type = det->getDetectorType().squash(); + if (type == defs::EIGER) { + auto t = det->getThresholdEnergy(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (type == defs::MYTHEN3) { + auto t = det->getAllThresholdEnergy(std::vector{det_id}); + os << OutString(t) << '\n'; + } else { + throw RuntimeError("Not implemented for this detector\n"); + } + } else if (action == defs::PUT_ACTION) { + defs::detectorType type = det->getDetectorType().squash(); + if (type == defs::EIGER && args.size() != 1 && args.size() != 2) { + WrongNumberOfParameters(1); + } + if (type == defs::MYTHEN3 && (args.size() < 1 || args.size() > 4)) { + WrongNumberOfParameters(1); + } + + bool trimbits = (cmd == "thresholdnotb") ? false : true; + std::array energy = {StringTo(args[0]), 0, 0}; + energy[1] = energy[0]; + energy[2] = energy[0]; + defs::detectorSettings sett = defs::STANDARD; + + // check if argument has settings or get it + if (args.size() == 2 || args.size() == 4) { + sett = StringTo(args[args.size() - 1]); + } else { + sett = det->getSettings(std::vector{det_id}) + .tsquash("Inconsistent settings between detectors"); + } + + // get other threshold values + if (args.size() > 2) { + energy[1] = StringTo(args[1]); + energy[2] = StringTo(args[2]); + } + switch (type) { + case defs::EIGER: + det->setThresholdEnergy(energy[0], sett, trimbits, + std::vector{det_id}); + break; + case defs::MYTHEN3: + det->setThresholdEnergy(energy, sett, trimbits, + std::vector{det_id}); + break; + default: + throw RuntimeError("Not implemented for this detector\n"); + } + os << ToString(args) << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} + +std::string Caller::trimen(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[trim_ev1] [trim_Ev2 (optional)] [trim_ev3 (optional)] " + "...\n\t[Eiger][Mythen3] Number of trim energies and list of " + "trim " + "energies, where corresponding default trim files exist in " + "corresponding trim folders." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto t = det->getTrimEnergies(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + std::vector t(args.size()); + if (!args.empty()) { + for (size_t i = 0; i < t.size(); ++i) { + t[i] = StringTo(args[i]); + } + } + det->setTrimEnergies(t, std::vector{det_id}); + os << ToString(args) << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::badchannels(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[fname|none|0]\n\t[Gotthard2][Mythen3] Sets the bad channels " + "(from file of bad channel numbers) to be masked out. None or 0 " + "unsets all the badchannels.\n\t[Mythen3] Also does trimming" + << '\n'; + } else if (action == defs::GET_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + det->getBadChannels(args[0], std::vector{det_id}); + os << "successfully retrieved" << '\n'; + } else if (action == defs::PUT_ACTION) { + bool parse = false; + if (args.size() == 0) { + WrongNumberOfParameters(1); + } else if (args.size() == 1) { + if (args[0] == "none" || args[0] == "0") { + det->setBadChannels(std::vector{}, + std::vector{det_id}); + } else if (args[0].find(".") != std::string::npos) { + det->setBadChannels(args[0], std::vector{det_id}); + } else { + parse = true; + } + } + // parse multi args or single one with range or single value + if (parse || args.size() > 1) { + // get channels + auto list = getChannelsFromStringList(args); + det->setBadChannels(list, std::vector{det_id}); + } + os << "successfully loaded" << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::udp_srcip(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[x.x.x.x] or auto\n\tIp address of the detector (source) udp " + "interface. Must be same subnet as destination udp " + "ip.\n\t[Eiger] Set only for 10G. For 1G, detector will replace " + "with its own DHCP IP address. \n\tOne can also set this to " + "'auto' for 1 GbE data and virtual detectors. It will set to IP " + "of detector. Not available for GotthardI" + << '\n'; + } else if (action == defs::GET_ACTION) { + auto t = det->getSourceUDPIP(std::vector{det_id}); + if (!args.empty()) { + WrongNumberOfParameters(0); + } + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + IpAddr val; + if (args[0] == "auto") { + val = getSrcIpFromAuto(); + LOG(logINFO) << "Setting udp_srcip of detector " << det_id << " to " + << val; + } else { + val = IpAddr(args[0]); + } + det->setSourceUDPIP(val, std::vector{det_id}); + os << val << '\n'; + + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::udp_srcip2(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[x.x.x.x] or auto\n\t[Jungfrau][Moench][Gotthard2] Ip address " + "of the " + "detector (source) udp interface 2. Must be same subnet as " + "destination udp ip2.\n\t [Jungfrau][Moench] top half or inner " + "interface\n\t [Gotthard2] veto debugging. \n\tOne can also set " + "this to 'auto' for 1 GbE data and virtual detectors. It will " + "set to IP of detector." + << '\n'; + } else if (action == defs::GET_ACTION) { + auto t = det->getSourceUDPIP2(std::vector{det_id}); + if (!args.empty()) { + WrongNumberOfParameters(0); + } + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + IpAddr val; + if (args[0] == "auto") { + val = getSrcIpFromAuto(); + LOG(logINFO) << "Setting udp_srcip2 of detector " << det_id + << " to " << val; + } else { + val = IpAddr(args[0]); + } + det->setSourceUDPIP2(val, std::vector{det_id}); + os << val << '\n'; + + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::udp_dstip(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[x.x.x.x] or auto\n\tIp address of the receiver (destination) " + "udp interface. If 'auto' used, then ip is set to ip of " + "rx_hostname." + << '\n'; + } else if (action == defs::GET_ACTION) { + auto t = det->getDestinationUDPIP(std::vector{det_id}); + if (!args.empty()) { + WrongNumberOfParameters(0); + } + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + if (args[0] == "auto") { + auto val = getDstIpFromAuto(); + LOG(logINFO) << "Setting udp_dstip of detector " << det_id << " to " + << val; + det->setDestinationUDPIP(val, std::vector{det_id}); + os << val << '\n'; + } else { + auto val = IpAddr(args[0]); + det->setDestinationUDPIP(val, std::vector{det_id}); + os << args.front() << '\n'; + } + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::udp_dstip2(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[x.x.x.x] or auto\n\t[Jungfrau][Moench][Gotthard2] Ip address " + "of the " + "receiver (destination) udp interface 2. If 'auto' used, then ip " + "is set to ip of rx_hostname.\n\t[Jungfrau][Moench] bottom half " + "\n\t[Gotthard2] veto debugging. " + << '\n'; + } else if (action == defs::GET_ACTION) { + auto t = det->getDestinationUDPIP2(std::vector{det_id}); + if (!args.empty()) { + WrongNumberOfParameters(0); + } + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + if (args[0] == "auto") { + auto val = getDstIpFromAuto(); + LOG(logINFO) << "Setting udp_dstip2 of detector " << det_id + << " to " << val; + det->setDestinationUDPIP2(val, std::vector{det_id}); + os << val << '\n'; + } else { + auto val = IpAddr(args[0]); + det->setDestinationUDPIP2(val, std::vector{det_id}); + os << args.front() << '\n'; + } + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::rx_hostname(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[hostname or ip address]\n\t" + "[hostname or ip address]:[tcp port]\n\t" + "[hostname1]:[tcp_port1]+[hostname2]:[tcp_port2]+\n\t" + "Receiver hostname or IP. If port included, then the receiver " + "tcp port.\n\t" + "Used for TCP control communication between client and receiver " + "to configure receiver. Also updates receiver with detector " + "parameters. Also resets any prior receiver property (not on " + "detector). " + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto t = det->getRxHostname(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() < 1) { + WrongNumberOfParameters(1); + } + // multiple arguments + if (args.size() > 1) { + // multiple in mulitple + if (args[0].find('+') != std::string::npos) { + throw RuntimeError( + "Cannot add multiple receivers at module level"); + } + if (det_id != -1) { + throw RuntimeError( + "Cannot add multiple receivers at module level"); + } + det->setRxHostname(args); + os << ToString(args) << '\n'; + } + // single argument + else { + // multiple receivers concatenated with + + if (args[0].find('+') != std::string::npos) { + if (det_id != -1) { + throw RuntimeError( + "Cannot add multiple receivers at module level"); + } + auto t = split(args[0], '+'); + det->setRxHostname(t); + os << ToString(t) << '\n'; + } + // single receiver + else { + det->setRxHostname(args[0], std::vector{det_id}); + os << ToString(args) << '\n'; + } + } + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::rx_roi(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[xmin] [xmax] [ymin] [ymax]\n\tRegion of interest in " + "receiver.\n\tOnly allowed at multi module level and without gap " + "pixels." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + if (det_id == -1) { + auto t = det->getRxROI(); + os << t << '\n'; + } else { + auto t = det->getIndividualRxROIs(std::vector{det_id}); + os << t << '\n'; + } + } else if (action == defs::PUT_ACTION) { + defs::ROI t; + // 2 or 4 arguments + if (args.size() != 2 && args.size() != 4) { + WrongNumberOfParameters(2); + } + if (args.size() == 2 || args.size() == 4) { + t.xmin = StringTo(args[0]); + t.xmax = StringTo(args[1]); + } + if (args.size() == 4) { + t.ymin = StringTo(args[2]); + t.ymax = StringTo(args[3]); + } + // only multi level + if (det_id != -1) { + throw RuntimeError("Cannot execute receiver ROI at module level"); + } + det->setRxROI(t); + os << t << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::ratecorr(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[n_rate (in ns)]\n\t[Eiger] Dead time correction constant in " + "ns. -1 will set to default tau of settings from trimbit file. 0 " + "will unset rate correction." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto t = det->getRateCorrection(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + int tau = StringTo(args[0]); + if (tau == -1) { + det->setDefaultRateCorrection(std::vector{det_id}); + auto t = det->getRateCorrection(std::vector{det_id}); + os << OutString(t) << '\n'; + } else { + auto t = StringTo(args[0], "ns"); + det->setRateCorrection(t, std::vector{det_id}); + os << args.front() << "ns\n"; + } + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::burstmode(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[burst_internal or 0, burst_external or 1, cw_internal or 2, " + "cw_external or 3]\n\t[Gotthard2] Default is burst_internal " + "type. Also changes clkdiv 2, 3, 4" + << '\n'; + } else { + if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto t = det->getBurstMode(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + defs::burstMode t; + try { + int ival = StringTo(args[0]); + switch (ival) { + case 0: + t = defs::BURST_INTERNAL; + break; + case 1: + t = defs::BURST_EXTERNAL; + break; + case 2: + t = defs::CONTINUOUS_INTERNAL; + break; + case 3: + t = defs::CONTINUOUS_EXTERNAL; + break; + default: + throw RuntimeError("Unknown burst mode " + args[0]); + } + } catch (...) { + t = StringTo(args[0]); + } + det->setBurstMode(t, std::vector{det_id}); + os << ToString(t) << '\n'; // no args to convert 0,1,2 as well + } else { + throw RuntimeError("Unknown action"); + } + } + return os.str(); +} +std::string Caller::vetostream(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[none|lll|10gbe|...]\n\t[Gotthard2] Enable or disable the 2 " + "veto streaming interfaces available. Can include more than one " + "interface. \n\tDefault: none. lll (low latency link) is the " + "default interface to work with. \n\t10GbE is for debugging and " + "also enables second interface in receiver for listening to veto " + "packets (writes a separate file if writing enabled). Also " + "restarts client and receiver zmq sockets if zmq streaming " + "enabled." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto t = det->getVetoStream(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.empty()) { + WrongNumberOfParameters(1); + } + defs::streamingInterface interface = defs::streamingInterface::NONE; + for (const auto &arg : args) { + if (arg == "none") { + if (args.size() > 1) { + throw RuntimeError( + std::string( + "cannot have other arguments with 'none'. args: ") + + ToString(args)); + } + break; + } + interface = interface | (StringTo(arg)); + } + det->setVetoStream(interface, std::vector{det_id}); + os << ToString(interface) << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::counters(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[i0] [i1] [i2]... \n\t[Mythen3] List of counters indices " + "enabled. Each element in list can be 0 - 2 and must be non " + "repetitive. Enabling counters sets vth dacs to remembered " + "values and disabling sets them to disabled values." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto mask = det->getCounterMask(std::vector{det_id}).squash(-1); + os << ToString(getSetBits(mask)) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.empty()) { + WrongNumberOfParameters(1); + } + if (std::any_of(args.cbegin(), args.cend(), [](std::string s) { + return (StringTo(s) < 0 || StringTo(s) > 2); + })) { + throw RuntimeError("Invalid counter indices list. Example: 0 1 2"); + } + // convert vector to counter enable mask + uint32_t mask = 0; + for (size_t i = 0; i < args.size(); ++i) { + int val = StringTo(args[i]); + // already enabled earlier + if (mask & (1 << val)) { + std::ostringstream oss; + oss << "Duplicate counter values (" << val << ") in arguments"; + throw RuntimeError(oss.str()); + } + mask |= (1 << val); + } + det->setCounterMask(mask, std::vector{det_id}); + os << ToString(args) << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::samples(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[n_samples]\n\t[CTB] Number of samples (analog, digitial and " + "transceiver) expected.\n" + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto a = det->getNumberOfAnalogSamples(std::vector{det_id}); + // get also digital samples for ctb and compare with analog + if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + auto d = det->getNumberOfDigitalSamples(std::vector{det_id}); + auto t = + det->getNumberOfTransceiverSamples(std::vector{det_id}); + int as = a.squash(-1); + int ds = d.squash(-1); + int ts = t.squash(-1); + if (as == -1 || ds == -1 || ts == -1 || as != ds || + as != ts) { // check if a == d? + throw RuntimeError( + "Different samples. Use asamples, dsamples or tsamples."); + } + } + os << OutString(a) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + det->setNumberOfAnalogSamples(StringTo(args[0]), + std::vector{det_id}); + // set also digital samples for ctb + if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + det->setNumberOfDigitalSamples(StringTo(args[0]), + std::vector{det_id}); + det->setNumberOfTransceiverSamples(StringTo(args[0]), + std::vector{det_id}); + } + os << args.front() << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::slowadc(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[n_channel (0-7 for channel]\n\t[Ctb] Slow " + "ADC channel in mV" + << '\n'; + } else if (action == defs::GET_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(0); + } + int nchan = StringTo(args[0]); + if (nchan < 0 || nchan > 7) { + throw RuntimeError("Unknown adc argument " + args[0]); + } + auto t = det->getSlowADC( + static_cast(nchan + defs::SLOW_ADC0), + std::vector{det_id}); + Result result(t.size()); + for (unsigned int i = 0; i < t.size(); ++i) { + result[i] = t[i] / 1000.00; + } + os << OutString(result) << " mV\n"; + + } else if (action == defs::PUT_ACTION) { + throw RuntimeError("cannot put"); + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::rx_dbitlist(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[all] or [i0] [i1] [i2]... \n\t[Ctb] List of digital signal " + "bits read out. If all is used instead of a list, all digital " + "bits (64) enabled. Each element in list can be 0 - 63 and must " + "be non repetitive." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto t = det->getRxDbitList(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.empty()) { + WrongNumberOfParameters(1); + } + std::vector t; + if (args[0] == "all") { + t.resize(64); + for (unsigned int i = 0; i < 64; ++i) { + t[i] = i; + } + } else { + unsigned int ntrim = args.size(); + t.resize(ntrim); + for (unsigned int i = 0; i < ntrim; ++i) { + t[i] = StringTo(args[i]); + } + } + det->setRxDbitList(t, std::vector{det_id}); + os << ToString(args) << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::rx_jsonaddheader(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[key1] [value1] [key2] [value2]...[keyn] [valuen]\n\tAdditional " + "json header to be streamed out from receiver via zmq. Default " + "is empty. Max 20 characters for each key/value. Use only if to " + "be processed by an intermediate user process listening to " + "receiver zmq packets. Empty value deletes header. " + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) { + WrongNumberOfParameters(0); + } + auto t = det->getAdditionalJsonHeader(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + // arguments can be empty + std::map json; + for (size_t i = 0; i < args.size(); i = i + 2) { + // last value is empty + if (i + 1 >= args.size()) { + json[args[i]] = ""; + } else { + json[args[i]] = args[i + 1]; + } + } + det->setAdditionalJsonHeader(json, std::vector{det_id}); + os << ToString(json) << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::execcommand(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[command]\n\tExecutes command on detector server console." + << '\n'; + } else if (action == defs::GET_ACTION) { + throw RuntimeError("Cannot get."); + } else if (action == defs::PUT_ACTION) { + std::string command; + for (auto &i : args) { + command += (i + ' '); + } + auto t = det->executeCommand(command, std::vector{det_id}); + os << OutString(t) << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::dacvalues(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[(optional unit) mV] \n\tGets the values for every " + "dac for this detector." + << '\n'; + } else if (action == defs::GET_ACTION) { + bool mv = false; + if (args.size() == 1) { + if ((args[0] != "mv") && (args[0] != "mV")) { + throw RuntimeError("Unknown argument " + args[0] + + ". Did you mean mV?"); + } + mv = true; + } else if (args.size() > 1) { + WrongNumberOfParameters(1); + } + auto t = det->getDacList(); + auto names = det->getDacNames(); + auto name_it = names.begin(); + os << '['; + auto it = t.cbegin(); + os << ToString(*name_it++) << ' '; + os << OutString(det->getDAC(*it++, mv, std::vector{det_id})) + << (!args.empty() ? " mV" : ""); + while (it != t.cend()) { + os << ", " << ToString(*name_it++) << ' '; + os << OutString(det->getDAC(*it++, mv, std::vector{det_id})) + << (!args.empty() ? " mV" : ""); + } + os << "]\n"; + } else if (action == defs::PUT_ACTION) { + throw RuntimeError("Cannot put"); + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::currentsource(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "\n\t[0|1]\n\t\t[Gotthard2] Enable or disable current source. " + "Default " + "is disabled.\n\t[0|1] [fix|nofix] [select source] [(only for " + "chipv1.1)normal|low]\n\t\t[Jungfrau] Disable or enable current " + "source with some parameters. The select source is 0-63 for " + "chipv1.0 and a 64 bit mask for chipv1.1. To disable, one needs " + "only one argument '0'." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (args.size() != 0) { + WrongNumberOfParameters(0); + } + auto t = det->getCurrentSource(std::vector{det_id}); + os << OutString(t) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() == 1) { + det->setCurrentSource( + defs::currentSrcParameters(StringTo(args[0]))); + } else if (args.size() >= 3) { + // scan fix + bool fix = false; + if (args[1] == "fix") { + fix = true; + } else if (args[1] == "nofix") { + fix = false; + } else { + throw RuntimeError("Invalid argument: " + args[1] + + ". Did you mean fix or nofix?"); + } + if (args.size() == 3) { + det->setCurrentSource(defs::currentSrcParameters( + fix, StringTo(args[2]))); + } else if (args.size() == 4) { + bool normalCurrent = false; + if (args[3] == "normal") { + normalCurrent = true; + } else if (args[3] == "low") { + normalCurrent = false; + } else { + throw RuntimeError("Invalid argument: " + args[3] + + ". Did you mean normal or low?"); + } + det->setCurrentSource(defs::currentSrcParameters( + fix, StringTo(args[2]), normalCurrent)); + } else { + throw RuntimeError( + "Invalid number of parareters for this command."); + } + } else { + throw RuntimeError( + "Invalid number of parareters for this command."); + } + os << ToString(args) << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +std::string Caller::gaincaps(int action) { + std::ostringstream os; + if (action == defs::HELP_ACTION) { + os << "[cap1, cap2, ...]\n\t[Mythen3] gain, options: C10pre, C15sh, " + "C30sh, C50sh, C225ACsh, C15pre" + << '\n'; + } else if (action == defs::GET_ACTION) { + if (!args.empty()) + WrongNumberOfParameters(0); + + auto tmp = det->getGainCaps(); + Result csr; + for (auto val : tmp) { + if (val) + csr.push_back(static_cast(val)); + } + + os << OutString(csr) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() < 1) { + WrongNumberOfParameters(1); + } + int caps = 0; + for (const auto &arg : args) { + if (arg != "0") + caps |= StringTo(arg); + } + + det->setGainCaps(caps); + os << OutString(args) << '\n'; + } else { + throw RuntimeError("Unknown action"); + } + return os.str(); +} +} // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/src/CmdLineApp.cpp b/slsDetectorSoftware/src/CmdApp.cpp similarity index 68% rename from slsDetectorSoftware/src/CmdLineApp.cpp rename to slsDetectorSoftware/src/CmdApp.cpp index c1955f528..9a616e19b 100644 --- a/slsDetectorSoftware/src/CmdLineApp.cpp +++ b/slsDetectorSoftware/src/CmdApp.cpp @@ -1,22 +1,12 @@ -// SPDX-License-Identifier: LGPL-3.0-or-other -// Copyright (C) 2021 Contributors to the SLS Detector Package - -/* -This file is used to generate the command line binaries -(sls_detector_get/put/acquire/help). By defines in CMake -we get the different files. - -*/ -#include "sls/Detector.h" - +#include "Caller.h" #include "CmdParser.h" -#include "CmdProxy.h" -#include "sls/sls_detector_defs.h" +#include "inferAction.h" +#include "sls/Detector.h" +#include "sls/logger.h" #include "sls/versionAPI.h" -#include //strcmp + #include int main(int argc, char *argv[]) { - // To genereate sepereate binaries for put, get, acquire and help #ifdef PUT int action = slsDetectorDefs::PUT_ACTION; @@ -33,6 +23,9 @@ int main(int argc, char *argv[]) { #ifdef HELP int action = slsDetectorDefs::HELP_ACTION; #endif +#ifdef INFER + int action = -1; +#endif // Check for --version in the arguments for (int i = 1; i < argc; ++i) { @@ -45,14 +38,12 @@ int main(int argc, char *argv[]) { sls::CmdParser parser; parser.Parse(argc, argv); - // If we called sls_detector_acquire, add the acquire command if (action == slsDetectorDefs::READOUT_ACTION) parser.setCommand("acquire"); if (parser.isHelp()) action = slsDetectorDefs::HELP_ACTION; else { - // Free shared memory should work also without a detector // if we have an option for verify in the detector constructor // we could avoid this but clutter the code @@ -65,22 +56,30 @@ int main(int argc, char *argv[]) { } } - // prevent mem size check if (parser.command() == "config" && action == slsDetectorDefs::PUT_ACTION) { sls::freeSharedMemory(parser.multi_id()); } + sls::InferAction inferAction = sls::InferAction(); + try { - std::unique_ptr det{nullptr}; - if (action != slsDetectorDefs::HELP_ACTION) { - det = sls::make_unique(parser.multi_id()); + if (action == -1) { + action = inferAction.infer(parser); + std::string actionString = + (action == slsDetectorDefs::GET_ACTION) ? "GET" : "PUT"; + std::cout << "inferred action: " << actionString << std::endl; } - sls::CmdProxy proxy(det.get()); - proxy.Call(parser.command(), parser.arguments(), parser.detector_id(), - action, std::cout, parser.receiver_id()); - } catch (const sls::RuntimeError &e) { + + std::unique_ptr d{nullptr}; + if (action != slsDetectorDefs::HELP_ACTION) { + d = sls::make_unique(parser.multi_id()); + } + sls::Caller c(d.get()); + + c.call(parser.command(), parser.arguments(), parser.detector_id(), + action, std::cout, parser.receiver_id()); + } catch (sls::RuntimeError &e) { exit(EXIT_FAILURE); } - exit(EXIT_SUCCESS); } \ No newline at end of file diff --git a/slsDetectorSoftware/src/CmdParser.h b/slsDetectorSoftware/src/CmdParser.h index 47a1703ea..701b95a45 100644 --- a/slsDetectorSoftware/src/CmdParser.h +++ b/slsDetectorSoftware/src/CmdParser.h @@ -20,7 +20,6 @@ reason that the header file is not exposed. #include namespace sls { - class CmdParser { public: void Parse(int argc, const char *const argv[]); diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp deleted file mode 100644 index d56bd0f96..000000000 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ /dev/null @@ -1,3431 +0,0 @@ - -// SPDX-License-Identifier: LGPL-3.0-or-other -// Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" -#include "HelpDacs.h" -#include "sls/TimeHelper.h" -#include "sls/ToString.h" -#include "sls/bit_utils.h" -#include "sls/container_utils.h" -#include "sls/file_utils.h" -#include "sls/logger.h" -#include "sls/sls_detector_defs.h" - -#include -#include -#include -#include - -namespace sls { - -using defs = slsDetectorDefs; - -std::ostream &operator<<(std::ostream &os, - const std::vector &vec) { - if (!vec.empty()) { - auto it = vec.begin(); - os << *it++; - while (it != vec.end()) - os << ' ' << *it++; - } - return os; -} - -void CmdProxy::Call(const std::string &command, - const std::vector &arguments, int detector_id, - int action, std::ostream &os, int receiver_id) { - cmd = command; - args = arguments; - det_id = detector_id; - rx_id = receiver_id; - - std::string temp; - while (temp != cmd) { - temp = cmd; - ReplaceIfDepreciated(cmd); - } - - auto it = functions.find(cmd); - if (it != functions.end()) { - os << ((*this).*(it->second))(action); - } else { - throw RuntimeError(cmd + - " Unknown command, use list to list all commands"); - } -} - -bool CmdProxy::ReplaceIfDepreciated(std::string &command) { - auto d_it = depreciated_functions.find(command); - if (d_it != depreciated_functions.end()) { - LOG(logWARNING) - << command - << " is deprecated and will be removed. Please migrate to: " - << d_it->second; - // insert old command into arguments (for dacs) - if (d_it->second == "dac") { - args.insert(args.begin(), command); - } - command = d_it->second; - return true; - } - return false; -} - -std::vector CmdProxy::GetProxyCommands() { - std::vector commands; - for (const auto &it : functions) - commands.emplace_back(it.first); - std::sort(begin(commands), end(commands)); - return commands; -} - -std::map CmdProxy::GetDepreciatedCommands() { - return depreciated_functions; -} - -void CmdProxy::WrongNumberOfParameters(size_t expected) { - if (expected == 0) { - throw RuntimeError("Command " + cmd + - " expected no parameter/s but got " + - std::to_string(args.size()) + "\n"); - } - throw RuntimeError("Command " + cmd + " expected (or >=) " + - std::to_string(expected) + " parameter/s but got " + - std::to_string(args.size()) + "\n"); -} - -/************************************************ - * * - * COMMANDS * - * * - ************************************************/ - -std::string CmdProxy::ListCommands(int action) { - if (action == defs::HELP_ACTION) - return "list\n\tlists all available commands, list deprecated - " - "list deprecated commands\n"; - - if (args.empty()) { - auto commands = GetProxyCommands(); - std::cout << "These " << commands.size() << " commands are available\n"; - for (auto &c : commands) - std::cout << c << '\n'; - return ""; - } else if (args.size() == 1) { - if (args[0] == "deprecated") { - std::cout << "The following " << depreciated_functions.size() - << " commands are deprecated\n"; - const size_t field_width = 20; - for (const auto &it : depreciated_functions) { - std::cout << std::right << std::setw(field_width) << it.first - << " -> " << it.second << '\n'; - } - return ""; - } else if (args[0] == "migrated") { - std::cout << "The following " << functions.size() - << " commands have been migrated to the new API\n"; - for (const auto &it : functions) { - std::cout << it.first << '\n'; - } - return ""; - } else { - throw RuntimeError( - "Could not decode argument. Possible options: deprecated"); - } - } else { - WrongNumberOfParameters(1); - return ""; - } -} - -/* configuration */ - -std::string CmdProxy::Hostname(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\tFrees shared memory and sets hostname (or IP address) of " - "all modules concatenated by +.\n\t Virtual servers can already " - "use the port in hostname separated by ':' and ports incremented " - "by 2 to accomodate the stop server as well." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getHostname(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.empty()) { - WrongNumberOfParameters(1); - } - if (det_id != -1) { - throw RuntimeError("Cannot execute this at module level"); - } - // only args[0], but many hostames concatenated with + - if (args[0].find('+') != std::string::npos) { - auto t = split(args[0], '+'); - det->setHostname(t); - os << ToString(t) << '\n'; - } - // either hostnames separated by space, or single hostname - else { - det->setHostname(args); - os << ToString(args) << '\n'; - } - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::VirtualServer(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_servers] [starting_port_number]\n\tConnecs to n virtual " - "server at local host starting at specific control port. Every " - "virtual server will have a stop port (control port + 1)" - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("cannot get"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - if (det_id != -1) { - throw RuntimeError("Cannot execute this at module level"); - } - det->setVirtualDetectorServers(StringTo(args[0]), - StringTo(args[1])); - os << ToString(args); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::Acquire(int action) { - std::ostringstream os; - if (action == defs::HELP_ACTION) { - os << cmd - << "\n\tAcquire the number of frames set up.\n\tBlocking command, " - "where control server is blocked and cannot accept other " - "commands until acquisition is done. \n\t- sets acquiring " - "flag\n\t- starts the receiver listener (if enabled)\n\t- starts " - "detector acquisition for number of frames set\n\t- monitors " - "detector status from running to idle\n\t- stops the receiver " - "listener (if enabled)\n\t- increments file index if file write " - "enabled\n\t- resets acquiring flag" - << '\n'; - } else { - if (det->empty()) { - throw RuntimeError("This shared memory has no detectors added."); - } - if (det_id >= 0) { - throw RuntimeError("Individual detectors not allowed for readout."); - } - - det->acquire(); - - if (det->getUseReceiverFlag().squash(false)) { - os << "\nAcquired "; - os << det->getFramesCaught() << '\n'; - } - } - return os.str(); -} - -std::string CmdProxy::Free(int action) { - // This function is purely for help, actual functionality is in the caller - return "free\n\tFree detector shared memory\n"; -} - -std::string CmdProxy::FirmwareVersion(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\tFimware version of detector in format [0xYYMMDD] or an " - "increasing 2 digit number for Eiger." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getFirmwareVersion(std::vector{det_id}); - if (det->getDetectorType().squash() == defs::EIGER) { - os << OutString(t) << '\n'; - } else { - os << OutStringHex(t) << '\n'; - } - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("cannot put"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::Versions(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\tPrint all versions and detector type" << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - bool eiger = (det->getDetectorType().squash() == defs::EIGER); - auto t = det->getFirmwareVersion(std::vector{det_id}); - os << "\nType : " << OutString(det->getDetectorType()) - << "\nRelease : " << det->getPackageVersion() << std::hex - << "\nClient : " << det->getClientVersion(); - - if (eiger) { - os << "\nFirmware (Beb) : " - << OutString(det->getFirmwareVersion(std::vector{det_id})); - os << "\nFirmware (Febl) : " - << OutString(det->getFrontEndFirmwareVersion( - defs::FRONT_LEFT, std::vector{det_id})); - os << "\nFirmware (Febr) : " - << OutString(det->getFrontEndFirmwareVersion( - defs::FRONT_RIGHT, std::vector{det_id})); - } else { - os << "\nFirmware : " - << OutStringHex( - det->getFirmwareVersion(std::vector{det_id})); - } - - os << "\nServer : " - << OutString(det->getDetectorServerVersion(std::vector{det_id})) - << "\nKernel : " - << OutString(det->getKernelVersion({std::vector{det_id}})) - << "\nHardware : " - << OutString(det->getHardwareVersion(std::vector{det_id})); - - if (det->getUseReceiverFlag().squash(true)) { - os << "\nReceiver : " - << OutString(det->getReceiverVersion(std::vector{det_id})); - } - os << std::dec << '\n'; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("cannot put"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::PackageVersion(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\tPackage version (git branch)." << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - os << det->getPackageVersion() << '\n'; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("cannot put"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::ClientVersion(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\tClient software version" << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - os << det->getClientVersion() << '\n'; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("cannot put"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::DetectorSize(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[nx] [ny]\n\tDetector size, ie. Number of channels in x and y " - "dim. This is used to calculate module coordinates included in " - "UDP data. \n\tBy default, it adds module in y dimension for 2d " - "detectors and in x dimension for 1d detectors packet header." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getDetectorSize(); - os << t << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - defs::xy t; - t.x = StringTo(args[0]); - t.y = StringTo(args[1]); - det->setDetectorSize(t); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::Threshold(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[eV] [(optinal settings)" - "\n\t[Eiger][Mythen3] Threshold in eV. It loads trim files from " - "settingspath."; - if (cmd == "thresholdnotb") { - os << "Trimbits are not loaded."; - } - os << "\n\nthreshold [eV1] [eV2] [eV3] [(optional settings)]" - "\n\t[Mythen3] Threshold in eV for each counter. It loads trim " - "files from settingspath. An energy of -1 will pick up values " - " from detector."; - if (cmd == "thresholdnotb") { - os << "Trimbits are not loaded."; - } - os << '\n'; - } else if (action == defs::GET_ACTION) { - if (cmd == "thresholdnotb") { - throw RuntimeError("cannot get"); - } - if (!args.empty()) { - WrongNumberOfParameters(0); - } - defs::detectorType type = det->getDetectorType().squash(); - if (type == defs::EIGER) { - auto t = det->getThresholdEnergy(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (type == defs::MYTHEN3) { - auto t = det->getAllThresholdEnergy(std::vector{det_id}); - os << OutString(t) << '\n'; - } else { - throw RuntimeError("Not implemented for this detector\n"); - } - } else if (action == defs::PUT_ACTION) { - defs::detectorType type = det->getDetectorType().squash(); - if (type == defs::EIGER && args.size() != 1 && args.size() != 2) { - WrongNumberOfParameters(1); - } - if (type == defs::MYTHEN3 && (args.size() < 1 || args.size() > 4)) { - WrongNumberOfParameters(1); - } - - bool trimbits = (cmd == "thresholdnotb") ? false : true; - std::array energy = {StringTo(args[0]), 0, 0}; - energy[1] = energy[0]; - energy[2] = energy[0]; - defs::detectorSettings sett = defs::STANDARD; - - // check if argument has settings or get it - if (args.size() == 2 || args.size() == 4) { - sett = StringTo(args[args.size() - 1]); - } else { - sett = det->getSettings(std::vector{det_id}) - .tsquash("Inconsistent settings between detectors"); - } - - // get other threshold values - if (args.size() > 2) { - energy[1] = StringTo(args[1]); - energy[2] = StringTo(args[2]); - } - switch (type) { - case defs::EIGER: - det->setThresholdEnergy(energy[0], sett, trimbits, - std::vector{det_id}); - break; - case defs::MYTHEN3: - det->setThresholdEnergy(energy, sett, trimbits, - std::vector{det_id}); - break; - default: - throw RuntimeError("Not implemented for this detector\n"); - } - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::Trimbits(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[fname]\n\t[Eiger][Mythen3] Put will load the trimbit file to " - "detector. If no extension specified, serial number of each " - "module is attached. Get will save the trimbits from the " - "detector to file with serial number added to file name." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->saveTrimbits(args[0], std::vector{det_id}); - os << args << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->loadTrimbits(args[0], std::vector{det_id}); - os << args << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::TrimEnergies(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[trim_ev1] [trim_Ev2 (optional)] [trim_ev3 (optional)] " - "...\n\t[Eiger][Mythen3] Number of trim energies and list of " - "trim " - "energies, where corresponding default trim files exist in " - "corresponding trim folders." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getTrimEnergies(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - std::vector t(args.size()); - if (!args.empty()) { - for (size_t i = 0; i < t.size(); ++i) { - t[i] = StringTo(args[i]); - } - } - det->setTrimEnergies(t, std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::GapPixels(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[0, 1]\n\t[Eiger][Jungfrau][Moench] Include Gap pixels in " - "client data " - "call back in Detecor api. Will not be in detector streaming, " - "receiver file or streaming. Default is 0. " - << '\n'; - } else if (action == defs::GET_ACTION) { - if (det_id != -1) { - throw RuntimeError("Cannot get gap pixels at module level"); - } - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getGapPixelsinCallback(); - os << t << '\n'; - } else if (action == defs::PUT_ACTION) { - if (det_id != -1) { - throw RuntimeError("Cannot add gap pixels at module level"); - } - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->setGapPixelsinCallback(StringTo(args[0])); - os << args.front() << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::BadChannels(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[fname|none|0]\n\t[Gotthard2][Mythen3] Sets the bad channels " - "(from file of bad channel numbers) to be masked out. None or 0 " - "unsets all the badchannels.\n\t[Mythen3] Also does trimming" - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->getBadChannels(args[0], std::vector{det_id}); - os << "successfully retrieved" << '\n'; - } else if (action == defs::PUT_ACTION) { - bool parse = false; - if (args.size() == 0) { - WrongNumberOfParameters(1); - } else if (args.size() == 1) { - if (args[0] == "none" || args[0] == "0") { - det->setBadChannels(std::vector{}, - std::vector{det_id}); - } else if (args[0].find(".") != std::string::npos) { - det->setBadChannels(args[0], std::vector{det_id}); - } else { - parse = true; - } - } - // parse multi args or single one with range or single value - if (parse || args.size() > 1) { - // get channels - auto list = getChannelsFromStringList(args); - det->setBadChannels(list, std::vector{det_id}); - } - os << "successfully loaded" << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* acquisition parameters */ - -std::string CmdProxy::Exptime(int action) { - int gateIndex = -1; - if (cmd == "exptime") { - gateIndex = -1; - } else if (cmd == "exptime1") { - gateIndex = 0; - } else if (cmd == "exptime2") { - gateIndex = 1; - } else if (cmd == "exptime3") { - gateIndex = 2; - } else { - throw RuntimeError("Unknown command, use list to list all commands"); - } - - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - if (cmd == "exptime") { - os << "[duration] [(optional unit) " - "ns|us|ms|s]\n\t[Eiger][Jungfrau][Moench][Gotthard][" - "Gotthard2][Ctb] Exposure time" - "\n\t[Mythen3] Exposure time of all gate signals in auto and " - "trigger mode (internal gating). To specify gate index, use " - "exptime1, exptime2, exptime3." - << '\n'; - } else if (cmd == "exptime1") { - os << "[n_value]\n\t[Mythen3] Exposure time of gate signal 1 in " - "auto and trigger mode (internal gating)." - << '\n'; - } else if (cmd == "exptime2") { - os << "[n_value]\n\t[Mythen3] Exposure time of gate signal 2 in " - "auto and trigger mode (internal gating)." - << '\n'; - } else { - os << "[n_value]\n\t[Mythen3] Exposure time of gate signal 3 in " - "auto and trigger mode (internal gating)." - << '\n'; - } - } else if (action == defs::GET_ACTION) { - if (args.size() > 1) { - WrongNumberOfParameters(1); - } - // vector of exptimes - if (gateIndex == -1 && - det->getDetectorType().squash() == defs::MYTHEN3) { - auto t = det->getExptimeForAllGates(std::vector{det_id}); - if (args.empty()) { - os << OutString(t) << '\n'; - } else if (args.size() == 1) { - os << OutString(t, args[0]) << '\n'; - } - } - // single exptime - else { - Result t; - if (gateIndex == -1) { - t = det->getExptime(std::vector{det_id}); - } else { - t = det->getExptime(gateIndex, std::vector{det_id}); - } - if (args.empty()) { - os << OutString(t) << '\n'; - } else if (args.size() == 1) { - os << OutString(t, args[0]) << '\n'; - } - } - } else if (action == defs::PUT_ACTION) { - defs::detectorType type = det->getDetectorType().squash(); - if (args.size() == 1) { - std::string time_str(args[0]); - std::string unit = RemoveUnit(time_str); - auto t = StringTo(time_str, unit); - if (type == defs::MYTHEN3) { - det->setExptime(gateIndex, t, std::vector{det_id}); - } else { - det->setExptime(t, std::vector{det_id}); - } - } else if (args.size() == 2) { - auto t = StringTo(args[0], args[1]); - if (type == defs::MYTHEN3) { - det->setExptime(gateIndex, t, std::vector{det_id}); - } else { - det->setExptime(t, std::vector{det_id}); - } - } else { - WrongNumberOfParameters(2); - } - /* TODO: os << args << '\n'; (doesnt work for vectors in .h)*/ - if (args.size() > 1) { - os << args[0] << args[1] << '\n'; - } else { - os << args[0] << '\n'; - } - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::ReadoutSpeed(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\t[0 or full_speed|1 or half_speed|2 or " - "quarter_speed]\n\t\t[Eiger][Jungfrau][Moench] Readout speed of " - "chip.\n\t\t[Eiger][Moench] Default speed is " - "full_speed.\n\t\t[Jungfrau] Default speed is half_speed. " - "full_speed option only available from v2.0 boards and is " - "recommended to set number of interfaces to 2. Also overwrites " - "adcphase to recommended default.\n\t [144|108]\n\t\t[Gotthard2] " - "Readout speed of chip in MHz. Default is 108." - << '\n'; - } else { - defs::detectorType type = det->getDetectorType().squash(); - if (type == defs::CHIPTESTBOARD) { - throw RuntimeError( - "ReadoutSpeed not implemented. Did you mean runclk?"); - } - if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getReadoutSpeed(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - defs::speedLevel t = StringTo(args[0]); - det->setReadoutSpeed(t, std::vector{det_id}); - os << ToString(t) << '\n'; // no args to convert 0,1,2 as well - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::Adcphase(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_value] " - "[(optional)deg]\n\t[Jungfrau][Moench][Ctb][Gotthard] " - "Phase shift of ADC clock. \n\t[Jungfrau][Moench] Absolute phase " - "shift. " - "If deg used, then shift in degrees. Changing Speed also resets " - "adcphase to recommended defaults.\n\t[Ctb] Absolute " - "phase shift. If deg used, then shift in degrees. Changing " - "adcclk also resets adcphase and sets it to previous " - "values.\n\t[Gotthard] Relative phase shift. Cannot get" - << '\n'; - } else { - auto det_type = det->getDetectorType().squash(defs::GENERIC); - if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || - det_type == defs::GOTTHARD2) { - throw RuntimeError("adcphase not implemented for this detector"); - } - if (action == defs::GET_ACTION) { - Result t; - if (args.empty()) { - t = det->getADCPhase(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (args.size() == 1) { - if (args[0] != "deg") { - throw RuntimeError("Unknown adcphase argument " + - args[0] + ". Did you mean deg? "); - } - t = det->getADCPhaseInDegrees(std::vector{det_id}); - os << OutString(t) << " deg\n"; - } else { - WrongNumberOfParameters(0); - } - } else if (action == defs::PUT_ACTION) { - if (args.size() == 1) { - det->setADCPhase(StringTo(args[0]), - std::vector{det_id}); - os << args.front() << '\n'; - } else if (args.size() == 2) { - if (args[1] != "deg") { - throw RuntimeError("Unknown adcphase 2nd argument " + - args[1] + ". Did you mean deg?"); - } - det->setADCPhaseInDegrees(StringTo(args[0]), - std::vector{det_id}); - os << args[0] << " " << args[1] << '\n'; - } else { - WrongNumberOfParameters(1); - } - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::Dbitphase(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_value] [(optional)deg]\n\t[Ctb][Jungfrau] Phase shift of " - "clock to latch digital bits. Absolute phase shift. If deg used, " - "then shift in degrees. \n\t[Ctb]Changing dbitclk also resets " - "dbitphase and sets to previous values." - << '\n'; - } else { - auto det_type = det->getDetectorType().squash(defs::GENERIC); - if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || - det_type == defs::GOTTHARD2 || det_type == defs::MOENCH) { - throw RuntimeError("dbitphase not implemented for this detector"); - } - if (action == defs::GET_ACTION) { - Result t; - if (args.empty()) { - t = det->getDBITPhase(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (args.size() == 1) { - if (args[0] != "deg") { - throw RuntimeError("Unknown dbitphase argument " + args[0] + - ". Did you mean deg? "); - } - t = det->getDBITPhaseInDegrees(std::vector{det_id}); - os << OutString(t) << " deg\n"; - } else { - WrongNumberOfParameters(0); - } - } else if (action == defs::PUT_ACTION) { - if (args.size() == 1) { - det->setDBITPhase(StringTo(args[0]), - std::vector{det_id}); - os << args.front() << '\n'; - } else if (args.size() == 2) { - if (args[1] != "deg") { - throw RuntimeError("Unknown dbitphase 2nd argument " + - args[1] + ". Did you mean deg? "); - } - det->setDBITPhaseInDegrees(StringTo(args[0]), - std::vector{det_id}); - os << args[0] << " " << args[1] << '\n'; - } else { - WrongNumberOfParameters(1); - } - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::ClockFrequency(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_clock (0-5)] [freq_in_Hz]\n\t[Gotthard2][Mythen3] Frequency " - "of clock n_clock in Hz. Use clkdiv to set frequency." - << '\n'; - } else { - defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); - if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { - throw RuntimeError("clkfreq not implemented for this detector."); - } - if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - auto t = det->getClockFrequency(StringTo(args[0]), - std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("cannot put"); - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::ClockPhase(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_clock (0-5)] [phase] [deg " - "(optional)]\n\t[Gotthard2][Mythen3] Phase of clock n_clock. If " - "deg, then phase shift in degrees, else absolute phase shift " - "values." - << '\n'; - } else { - defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); - if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { - throw RuntimeError("clkphase not implemented for this detector."); - } - if (action == defs::GET_ACTION) { - if (args.size() == 1) { - auto t = det->getClockPhase(StringTo(args[0]), - std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (args.size() == 2) { - if (args[1] != "deg") { - throw RuntimeError("Cannot scan argument" + args[1] + - ". Did you mean deg?"); - } - auto t = det->getClockPhaseinDegrees(StringTo(args[0]), - {det_id}); - os << OutString(t) << " deg\n"; - } else { - WrongNumberOfParameters(1); - } - } else if (action == defs::PUT_ACTION) { - if (args.size() == 2) { - det->setClockPhase(StringTo(args[0]), - StringTo(args[1]), - std::vector{det_id}); - os << args[1] << '\n'; - } else if (args.size() == 3) { - if (args[2] != "deg") { - throw RuntimeError("Cannot scan argument" + args[2] + - ". Did you mean deg?"); - } - det->setClockPhaseinDegrees(StringTo(args[0]), - StringTo(args[1]), - std::vector{det_id}); - os << args[1] << " " << args[2] << '\n'; - } else { - WrongNumberOfParameters(1); - } - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::MaxClockPhaseShift(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_clock (0-5)]\n\t[Gotthard2][Mythen3] Absolute Maximum Phase " - "shift of clock n_clock." - << '\n'; - } else { - defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); - if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { - throw RuntimeError( - "maxclkphaseshift not implemented for this detector."); - } - if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - auto t = det->getMaxClockPhaseShift(StringTo(args[0]), - std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("Cannot put"); - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::ClockDivider(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_clock (0-5)] [n_divider]\n\t[Gotthard2][Mythen3] Clock " - "Divider of clock n_clock. Must be greater than 1." - << '\n'; - } else { - defs::detectorType type = det->getDetectorType().squash(defs::GENERIC); - if (type != defs::GOTTHARD2 && type != defs::MYTHEN3) { - throw RuntimeError("clkdiv not implemented for this detector."); - } - if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - auto t = det->getClockDivider(StringTo(args[0]), - std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->setClockDivider(StringTo(args[0]), StringTo(args[1]), - {det_id}); - os << args[1] << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::ExternalSignal(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_signal] [signal_type] External signal mode for trigger " - "timing mode." - "\n\t[Gotthard] [0] " - "[trigger_in_rising_edge|trigger_in_falling_edge]" - "\n\t[Mythen3] [0-7] " - "[trigger_in_rising_edge|trigger_in_falling_edge|inversion_on|" - "inversion_off]\n\t where 0 is master input trigger signal, 1-3 " - "is master input gate signals, 4 is busy out signal and 5-7 is " - "master output gate signals." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - auto t = det->getExternalSignalFlags(StringTo(args[0]), - std::vector{det_id}); - os << args[0] << " " << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->setExternalSignalFlags( - StringTo(args[0]), - StringTo(args[1]), - std::vector{det_id}); - os << args[0] << " " << args[1] << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::CurrentSource(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\t[0|1]\n\t\t[Gotthard2] Enable or disable current source. " - "Default " - "is disabled.\n\t[0|1] [fix|nofix] [select source] [(only for " - "chipv1.1)normal|low]\n\t\t[Jungfrau] Disable or enable current " - "source with some parameters. The select source is 0-63 for " - "chipv1.0 and a 64 bit mask for chipv1.1. To disable, one needs " - "only one argument '0'." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 0) { - WrongNumberOfParameters(0); - } - auto t = det->getCurrentSource(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() == 1) { - det->setCurrentSource( - defs::currentSrcParameters(StringTo(args[0]))); - } else if (args.size() >= 3) { - // scan fix - bool fix = false; - if (args[1] == "fix") { - fix = true; - } else if (args[1] == "nofix") { - fix = false; - } else { - throw RuntimeError("Invalid argument: " + args[1] + - ". Did you mean fix or nofix?"); - } - if (args.size() == 3) { - det->setCurrentSource(defs::currentSrcParameters( - fix, StringTo(args[2]))); - } else if (args.size() == 4) { - bool normalCurrent = false; - if (args[3] == "normal") { - normalCurrent = true; - } else if (args[3] == "low") { - normalCurrent = false; - } else { - throw RuntimeError("Invalid argument: " + args[3] + - ". Did you mean normal or low?"); - } - det->setCurrentSource(defs::currentSrcParameters( - fix, StringTo(args[2]), normalCurrent)); - } else { - throw RuntimeError( - "Invalid number of parareters for this command."); - } - } else { - throw RuntimeError( - "Invalid number of parareters for this command."); - } - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/** temperature */ -std::string CmdProxy::TemperatureValues(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\tGets the values for every temperature for this detector." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 0) { - WrongNumberOfParameters(0); - } - auto t = det->getTemperatureList(); - os << '['; - if (t.size() > 0) { - auto it = t.cbegin(); - os << ToString(*it) << ' '; - os << OutString( - det->getTemperature(*it++, std::vector{det_id})) - << " °C"; - while (it != t.cend()) { - os << ", " << ToString(*it) << ' '; - os << OutString( - det->getTemperature(*it++, std::vector{det_id})) - << " °C"; - } - } - os << "]\n"; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("Cannot put"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* list */ - -/* dacs */ -std::string CmdProxy::Dac(int action) { - std::ostringstream os; - os << cmd << ' '; - - if (action == defs::HELP_ACTION) { - if (args.size() == 0) { - os << GetHelpDac(std::to_string(0)) << '\n'; - } else { - os << args[0] << ' ' << GetHelpDac(args[0]) << '\n'; - } - return os.str(); - } - - auto type = det->getDetectorType().squash(); - - // dac indices only for ctb - if (args.size() > 0 && action != defs::HELP_ACTION) { - if (is_int(args[0]) && type != defs::CHIPTESTBOARD) { - throw RuntimeError( - "Dac indices can only be used for chip test board. Use daclist " - "to get list of dac names for current detector."); - } - } - - if (action == defs::GET_ACTION) { - if (args.empty()) - WrongNumberOfParameters(1); // This prints slightly wrong - - defs::dacIndex dacIndex{}; - // TODO! Remove if - if (type == defs::CHIPTESTBOARD && !is_int(args[0])) { - dacIndex = det->getDacIndex(args[0]); - } else { - dacIndex = StringTo(args[0]); - } - - bool mV = false; - - if (args.size() == 2) { - if ((args[1] != "mv") && (args[1] != "mV")) { - throw RuntimeError("Unknown argument " + args[1] + - ". Did you mean mV?"); - } - mV = true; - } else if (args.size() > 2) { - WrongNumberOfParameters(1); - } - auto t = det->getDAC(dacIndex, mV, std::vector{det_id}); - os << args[0] << ' ' << OutString(t) << (mV ? " mV\n" : "\n"); - } else if (action == defs::PUT_ACTION) { - if (args.empty()) - WrongNumberOfParameters(1); // This prints slightly wrong - - defs::dacIndex dacIndex{}; - if (type == defs::CHIPTESTBOARD && !is_int(args[0])) - dacIndex = det->getDacIndex(args[0]); - else - dacIndex = StringTo(args[0]); - bool mV = false; - if (args.size() == 3) { - if ((args[2] != "mv") && (args[2] != "mV")) { - throw RuntimeError("Unknown argument " + args[2] + - ". Did you mean mV?"); - } - mV = true; - } else if (args.size() > 3 || args.size() < 2) { - WrongNumberOfParameters(2); - } - det->setDAC(dacIndex, StringTo(args[1]), mV, - std::vector{det_id}); - os << args[0] << ' ' << args[1] << (mV ? " mV\n" : "\n"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::DacValues(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[(optional unit) mV] \n\tGets the values for every " - "dac for this detector." - << '\n'; - } else if (action == defs::GET_ACTION) { - bool mv = false; - if (args.size() == 1) { - if ((args[0] != "mv") && (args[0] != "mV")) { - throw RuntimeError("Unknown argument " + args[0] + - ". Did you mean mV?"); - } - mv = true; - } else if (args.size() > 1) { - WrongNumberOfParameters(1); - } - auto t = det->getDacList(); - auto names = det->getDacNames(); - auto name_it = names.begin(); - os << '['; - auto it = t.cbegin(); - os << ToString(*name_it++) << ' '; - os << OutString(det->getDAC(*it++, mv, std::vector{det_id})) - << (!args.empty() ? " mV" : ""); - while (it != t.cend()) { - os << ", " << ToString(*name_it++) << ' '; - os << OutString(det->getDAC(*it++, mv, std::vector{det_id})) - << (!args.empty() ? " mV" : ""); - } - os << "]\n"; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("Cannot put"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::ResetDacs(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[(optional) hard] " - "\n\t[Eiger][Jungfrau][Moench][Gotthard][Gotthard2][" - "Mythen3]Reset dac values to the defaults. A 'hard' optional " - "reset will reset the dacs to the hardcoded defaults in on-board " - "detector server." - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("Cannot get"); - } else if (action == defs::PUT_ACTION) { - bool hardReset = false; - if (args.size() == 1) { - if (args[0] != "hard") { - throw RuntimeError("Unknown argument " + args[0] + - ". Did you mean hard?"); - } - hardReset = true; - } else if (args.size() > 1) { - WrongNumberOfParameters(1); - } - det->resetToDefaultDacs(hardReset, std::vector{det_id}); - os << "successful\n"; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::DefaultDac(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[dac name][value][(optional)setting]\n\tSets the default for " - "that dac to this value.\n\t[Jungfrau][Moench][Mythen3] When " - "settings is " - "provided, it sets the default value only for that setting" - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() < 1) { - WrongNumberOfParameters(1); - } - // optional settings - if (args.size() == 2) { - auto t = det->getDefaultDac( - StringTo(args[0]), - StringTo(args[1]), - std::vector{det_id}); - os << args[0] << ' ' << args[1] << ' ' << OutString(t) << '\n'; - } else { - auto t = det->getDefaultDac(StringTo(args[0]), - std::vector{det_id}); - os << args[0] << ' ' << OutString(t) << '\n'; - } - } else if (action == defs::PUT_ACTION) { - if (args.size() < 2) { - WrongNumberOfParameters(2); - } - // optional settings - if (args.size() == 3) { - det->setDefaultDac( - StringTo(args[0]), StringTo(args[1]), - StringTo(args[2]), - std::vector{det_id}); - os << args[0] << ' ' << args[2] << ' ' << args[1] << '\n'; - } else { - det->setDefaultDac(StringTo(args[0]), - StringTo(args[1])); - os << args[0] << ' ' << args[1] << '\n'; - } - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} -/* acquisition */ - -std::string CmdProxy::ReceiverStatus(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "running, idle, transmitting]\n\tReceiver listener status." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getReceiverStatus(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError( - "Cannot put. Did you mean to use command 'rx_start' or 'rx_stop'?"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::DetectorStatus(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[running, error, transmitting, finished, waiting, " - "idle]\n\tDetector status. Goes to stop server. " - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getDetectorStatus(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError( - "Cannot put. Did you mean to use command 'start' or 'stop'?"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::Scan(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[dac_name|0|trimbits] [start_val] [stop_val] " - "[step_size] [dac settling time ns|us|ms|s]\n\tEnables/ disables " - "scans for dac and trimbits \n\tEnabling scan sets number of " - "frames to number of steps in receiver. \n\tTo cancel scan " - "configuration, set dac to '0', which also sets number of frames " - "to 1. \n\t[Eiger][Mythen3] Use trimbits as dac name for a " - "trimbit scan." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 0) { - WrongNumberOfParameters(0); - } - auto t = det->getScan(); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (det_id != -1) { - throw RuntimeError("Cannot configure scan at module level"); - } - // disable - if (args.size() == 1) { - if (StringTo(args[0]) != 0) { - throw RuntimeError("Did you mean '0' to disable?"); - } - det->setScan(defs::scanParameters()); - } - // enable without settling time - else if (args.size() == 4) { - det->setScan(defs::scanParameters( - StringTo(args[0]), StringTo(args[1]), - StringTo(args[2]), StringTo(args[3]))); - } - // enable with all parameters - else if (args.size() == 5) { - std::string time_str(args[4]); - std::string unit = RemoveUnit(time_str); - auto t = StringTo(time_str, unit); - det->setScan(defs::scanParameters( - StringTo(args[0]), StringTo(args[1]), - StringTo(args[2]), StringTo(args[3]), t)); - } else { - WrongNumberOfParameters(4); - } - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::Trigger(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - if (cmd == "trigger") { - os << "\n\t[Eiger][Mythen3][Jungfrau][Moench] Sends software " - "trigger " - "signal to detector"; - } else if (cmd == "blockingtrigger") { - os << "\n\t[Eiger][Jungfrau][Moench] Sends software trigger signal " - "to " - "detector and blocks till the frames are sent out for that " - "trigger."; - } else { - throw RuntimeError("unknown command " + cmd); - } - os << '\n'; - } else if (action == slsDetectorDefs::GET_ACTION) { - throw RuntimeError("Cannot get"); - } else if (action == slsDetectorDefs::PUT_ACTION) { - if (det_id != -1) { - throw RuntimeError("Cannot execute this at module level"); - } - if (!args.empty()) { - WrongNumberOfParameters(0); - } - bool block = false; - if (cmd == "blockingtrigger") { - block = true; - } - det->sendSoftwareTrigger(block); - os << "successful\n"; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* Network Configuration (Detector<->Receiver) */ - -IpAddr CmdProxy::getDstIpFromAuto() { - std::string rxHostname = - det->getRxHostname(std::vector{det_id}).squash("none"); - // Hostname could be ip try to decode otherwise look up the hostname - auto val = IpAddr{rxHostname}; - if (val == 0) { - val = HostnameToIp(rxHostname.c_str()); - } - return val; -} - -IpAddr CmdProxy::getSrcIpFromAuto() { - if (det->getDetectorType().squash() == defs::GOTTHARD) { - throw RuntimeError( - "Cannot use 'auto' for udp_srcip for GotthardI Detector."); - } - std::string hostname = - det->getHostname(std::vector{det_id}).squash("none"); - // Hostname could be ip try to decode otherwise look up the hostname - auto val = IpAddr{hostname}; - if (val == 0) { - val = HostnameToIp(hostname.c_str()); - } - return val; -} - -UdpDestination CmdProxy::getUdpEntry() { - UdpDestination udpDestination{}; - udpDestination.entry = rx_id; - - for (auto it : args) { - size_t pos = it.find('='); - std::string key = it.substr(0, pos); - std::string value = it.substr(pos + 1); - if (key == "ip") { - if (value == "auto") { - auto val = getDstIpFromAuto(); - LOG(logINFO) << "Setting udp_dstip of detector " << det_id - << " to " << val; - udpDestination.ip = val; - } else { - udpDestination.ip = IpAddr(value); - } - } else if (key == "ip2") { - if (value == "auto") { - auto val = getDstIpFromAuto(); - LOG(logINFO) << "Setting udp_dstip2 of detector " << det_id - << " to " << val; - udpDestination.ip2 = val; - } else { - udpDestination.ip2 = IpAddr(value); - } - } else if (key == "mac") { - udpDestination.mac = MacAddr(value); - } else if (key == "mac2") { - udpDestination.mac2 = MacAddr(value); - } else if (key == "port") { - udpDestination.port = StringTo(value); - } else if (key == "port2") { - udpDestination.port2 = StringTo(value); - } - } - return udpDestination; -} - -std::string CmdProxy::UDPDestinationList(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[ip=x.x.x.x] [(optional)ip2=x.x.x.x] " - "\n\t[mac=xx:xx:xx:xx:xx:xx] " - "[(optional)mac2=xx:xx:xx:xx:xx:xx]\n\t[port=value] " - "[(optional)port2=value\n\tThe order of ip, mac and port does " - "not matter. entry_value can be >0 only for " - "[Eiger][Jungfrau][Moench][Mythen3][Gotthard2] where round robin " - "is " - "implemented. If 'auto' used, then ip is set to ip of " - "rx_hostname." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - if (det_id == -1) { - throw RuntimeError("udp_dstlist must be at module level."); - } - if (rx_id < 0 || rx_id >= MAX_UDP_DESTINATION) { - throw RuntimeError(std::string("Invalid receiver index ") + - std::to_string(rx_id) + - std::string(" to set round robin entry.")); - } - auto t = det->getDestinationUDPList(rx_id, std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.empty()) { - WrongNumberOfParameters(1); - } - if (det_id == -1) { - throw RuntimeError("udp_dstlist must be at module level."); - } - if (rx_id < 0 || rx_id >= MAX_UDP_DESTINATION) { - throw RuntimeError( - "Invalid receiver index to set round robin entry."); - } - auto t = getUdpEntry(); - det->setDestinationUDPList(t, det_id); - os << ToString(args) << std::endl; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::UDPSourceIP(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[x.x.x.x] or auto\n\tIp address of the detector (source) udp " - "interface. Must be same subnet as destination udp " - "ip.\n\t[Eiger] Set only for 10G. For 1G, detector will replace " - "with its own DHCP IP address. \n\tOne can also set this to " - "'auto' for 1 GbE data and virtual detectors. It will set to IP " - "of detector. Not available for GotthardI" - << '\n'; - } else if (action == defs::GET_ACTION) { - auto t = det->getSourceUDPIP(std::vector{det_id}); - if (!args.empty()) { - WrongNumberOfParameters(0); - } - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - IpAddr val; - if (args[0] == "auto") { - val = getSrcIpFromAuto(); - LOG(logINFO) << "Setting udp_srcip of detector " << det_id << " to " - << val; - } else { - val = IpAddr(args[0]); - } - det->setSourceUDPIP(val, std::vector{det_id}); - os << val << '\n'; - - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::UDPSourceIP2(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[x.x.x.x] or auto\n\t[Jungfrau][Moench][Gotthard2] Ip address " - "of the " - "detector (source) udp interface 2. Must be same subnet as " - "destination udp ip2.\n\t [Jungfrau][Moench] top half or inner " - "interface\n\t [Gotthard2] veto debugging. \n\tOne can also set " - "this to 'auto' for 1 GbE data and virtual detectors. It will " - "set to IP of detector." - << '\n'; - } else if (action == defs::GET_ACTION) { - auto t = det->getSourceUDPIP2(std::vector{det_id}); - if (!args.empty()) { - WrongNumberOfParameters(0); - } - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - IpAddr val; - if (args[0] == "auto") { - val = getSrcIpFromAuto(); - LOG(logINFO) << "Setting udp_srcip2 of detector " << det_id - << " to " << val; - } else { - val = IpAddr(args[0]); - } - det->setSourceUDPIP2(val, std::vector{det_id}); - os << val << '\n'; - - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::UDPDestinationIP(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[x.x.x.x] or auto\n\tIp address of the receiver (destination) " - "udp interface. If 'auto' used, then ip is set to ip of " - "rx_hostname." - << '\n'; - } else if (action == defs::GET_ACTION) { - auto t = det->getDestinationUDPIP(std::vector{det_id}); - if (!args.empty()) { - WrongNumberOfParameters(0); - } - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - if (args[0] == "auto") { - auto val = getDstIpFromAuto(); - LOG(logINFO) << "Setting udp_dstip of detector " << det_id << " to " - << val; - det->setDestinationUDPIP(val, std::vector{det_id}); - os << val << '\n'; - } else { - auto val = IpAddr(args[0]); - det->setDestinationUDPIP(val, std::vector{det_id}); - os << args.front() << '\n'; - } - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::UDPDestinationIP2(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[x.x.x.x] or auto\n\t[Jungfrau][Moench][Gotthard2] Ip address " - "of the " - "receiver (destination) udp interface 2. If 'auto' used, then ip " - "is set to ip of rx_hostname.\n\t[Jungfrau][Moench] bottom half " - "\n\t[Gotthard2] veto debugging. " - << '\n'; - } else if (action == defs::GET_ACTION) { - auto t = det->getDestinationUDPIP2(std::vector{det_id}); - if (!args.empty()) { - WrongNumberOfParameters(0); - } - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - if (args[0] == "auto") { - auto val = getDstIpFromAuto(); - LOG(logINFO) << "Setting udp_dstip2 of detector " << det_id - << " to " << val; - det->setDestinationUDPIP2(val, std::vector{det_id}); - os << val << '\n'; - } else { - auto val = IpAddr(args[0]); - det->setDestinationUDPIP2(val, std::vector{det_id}); - os << args.front() << '\n'; - } - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::TransmissionDelay(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_delay]\n\t[Eiger][Jungfrau][Moench][Mythen3] Set " - "transmission delay " - "for all modules in the detector using the step size " - "provided.Sets up \n\t\t[Eiger] txdelay_left to (2 * mod_index * " - "n_delay), \n\t\t[Eiger] txdelay_right to ((2 * mod_index + 1) * " - "n_delay) and \n\t\t[Eiger] txdelay_frame to (2 *num_modules * " - "n_delay) \n\t\t[Jungfrau][Moench][Mythen3] txdelay_frame to " - "(num_modules * n_delay) \nfor every module." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (det_id != -1) { - throw RuntimeError("Cannot execute this at module level"); - } - if (args.size() != 0) { - WrongNumberOfParameters(0); - } - auto t = det->getTransmissionDelay(); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (det_id != -1) { - throw RuntimeError("Cannot execute this at module level"); - } - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->setTransmissionDelay(StringTo(args[0])); - os << args.front() << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* Receiver Config */ -std::string CmdProxy::ReceiverHostname(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[hostname or ip address]\n\t" - "[hostname or ip address]:[tcp port]\n\t" - "[hostname1]:[tcp_port1]+[hostname2]:[tcp_port2]+\n\t" - "Receiver hostname or IP. If port included, then the receiver " - "tcp port.\n\t" - "Used for TCP control communication between client and receiver " - "to configure receiver. Also updates receiver with detector " - "parameters. Also resets any prior receiver property (not on " - "detector). " - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getRxHostname(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() < 1) { - WrongNumberOfParameters(1); - } - // multiple arguments - if (args.size() > 1) { - // multiple in mulitple - if (args[0].find('+') != std::string::npos) { - throw RuntimeError( - "Cannot add multiple receivers at module level"); - } - if (det_id != -1) { - throw RuntimeError( - "Cannot add multiple receivers at module level"); - } - det->setRxHostname(args); - os << ToString(args) << '\n'; - } - // single argument - else { - // multiple receivers concatenated with + - if (args[0].find('+') != std::string::npos) { - if (det_id != -1) { - throw RuntimeError( - "Cannot add multiple receivers at module level"); - } - auto t = split(args[0], '+'); - det->setRxHostname(t); - os << ToString(t) << '\n'; - } - // single receiver - else { - det->setRxHostname(args[0], std::vector{det_id}); - os << ToString(args) << '\n'; - } - } - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::Rx_ROI(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[xmin] [xmax] [ymin] [ymax]\n\tRegion of interest in " - "receiver.\n\tOnly allowed at multi module level and without gap " - "pixels." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - if (det_id == -1) { - auto t = det->getRxROI(); - os << t << '\n'; - } else { - auto t = det->getIndividualRxROIs(std::vector{det_id}); - os << t << '\n'; - } - } else if (action == defs::PUT_ACTION) { - defs::ROI t; - // 2 or 4 arguments - if (args.size() != 2 && args.size() != 4) { - WrongNumberOfParameters(2); - } - if (args.size() == 2 || args.size() == 4) { - t.xmin = StringTo(args[0]); - t.xmax = StringTo(args[1]); - } - if (args.size() == 4) { - t.ymin = StringTo(args[2]); - t.ymax = StringTo(args[3]); - } - // only multi level - if (det_id != -1) { - throw RuntimeError("Cannot execute receiver ROI at module level"); - } - det->setRxROI(t); - os << t << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* File */ - -/* ZMQ Streaming Parameters (Receiver<->Client) */ - -std::string CmdProxy::ZMQHWM(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_limit] \n\tClient's zmq receive high water mark. Default is " - "the zmq library's default (1000), can also be set here using " - "-1. \n\tThis is a high number and can be set to 2 for gui " - "purposes. \n\tOne must also set the receiver's send high water " - "mark to similar value. Final effect is sum of them.\n\t Setting " - "it via command line is useful only before zmq enabled (before " - "opening gui)." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getClientZmqHwm(); - os << t << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - int t = StringTo(args[0]); - det->setClientZmqHwm(t); - os << det->getClientZmqHwm() << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* Eiger Specific */ - -std::string CmdProxy::RateCorrection(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_rate (in ns)]\n\t[Eiger] Dead time correction constant in " - "ns. -1 will set to default tau of settings from trimbit file. 0 " - "will unset rate correction." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getRateCorrection(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - int tau = StringTo(args[0]); - if (tau == -1) { - det->setDefaultRateCorrection(std::vector{det_id}); - auto t = det->getRateCorrection(std::vector{det_id}); - os << OutString(t) << '\n'; - } else { - auto t = StringTo(args[0], "ns"); - det->setRateCorrection(t, std::vector{det_id}); - os << args.front() << "ns\n"; - } - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::PulsePixel(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_times] [x] [y]\n\t[Eiger] Pulse pixel n number of times at " - "coordinates (x, y). Advanced User!" - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("cannot get"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 3) { - WrongNumberOfParameters(3); - } - int n = StringTo(args[0]); - defs::xy c; - c.x = StringTo(args[1]); - c.y = StringTo(args[2]); - det->pulsePixel(n, c, std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::PulsePixelAndMove(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_times] [x] [y]\n\t[Eiger] Pulse pixel n number of times and " - "moves relatively by (x, y). Advanced User!" - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("cannot get"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 3) { - WrongNumberOfParameters(3); - } - int n = StringTo(args[0]); - defs::xy c; - c.x = StringTo(args[1]); - c.y = StringTo(args[2]); - det->pulsePixelNMove(n, c, std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::PulseChip(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_times] \n\t[Eiger] Pulse chip n times. If n is -1, resets to " - "normal mode (reset chip completely at start of acquisition, " - "where partialreset = 0). Advanced User!" - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("cannot get"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->pulseChip(StringTo(args[0]), std::vector{det_id}); - os << args.front() << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::Quad(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[0, 1]\n\t[Eiger] Sets detector size to a quad. 0 (disabled) is " - "default. (Specific hardware required)." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getQuad(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (det_id != -1) { - throw RuntimeError("Cannot execute quad at module level"); - } - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->setQuad(StringTo(args[0])); - os << args.front() << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::DataStream(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[left|right] [0, 1]\n\t[Eiger] Enables or disables data " - "streaming from left or/and right side of detector for 10 GbE " - "mode. " - "1 (enabled) " - "by default." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - auto t = det->getDataStream(StringTo(args[0]), - std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->setDataStream(StringTo(args[0]), - StringTo(args[1]), std::vector{det_id}); - os << args << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* Jungfrau Specific */ - -std::string CmdProxy::TemperatureEvent(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[0]\n\t[Jungfrau][Moench] 1, if a temperature event occured. To " - "clear " - "this event, set it to 0.\n\tIf temperature crosses threshold " - "temperature and temperature control is enabled, power to chip " - "will be switched off and temperature event occurs. To power on " - "chip again, temperature has to be less than threshold " - "temperature and temperature event has to be cleared." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getTemperatureEvent(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - if (StringTo(args[0]) != 0) { - throw RuntimeError("Unknown argument for temp event. Did you " - "mean 0 to reset event?"); - } - det->resetTemperatureEvent(std::vector{det_id}); - os << "cleared" << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::PedestalMode(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << " [frames] [loops]\n\t\t[Jungfrau] " - "Enable pedestal mode. \n\t\tThe number of frames or triggers is " - "overwritten by: \n\t\t(#pedestal_frames x #pedestal_loops x 2). " - "\n\t\tIn auto timing mode or in trigger mode with #frames > 1, " - "\n\t\t#frames is overwritten and #triggers = 1, \n\t\telse " - "#triggers is overwritten and #frames = 1. \n\t\tOne cannot set " - "#frames, #triggers or timing mode in pedestal mode (exception " - "thrown).\n\n"; - os << cmd - << " [0]\n\t\t[Jungfrau] Disable pedestal " - "mode.\n\t\tDisabling pedestal mode will set back the normal " - "mode values of #frames and #triggers." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 0) { - WrongNumberOfParameters(0); - } - auto t = det->getPedestalMode(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - // disable - if (args.size() == 1) { - if (args[0] != "0") { - throw RuntimeError( - "Unknown argument " + args[0] + - ". Did you mean '0' to disable pedestal mode?"); - } - det->setPedestalMode(defs::pedestalParameters()); - } - // enable - else if (args.size() == 2) { - uint8_t frames = StringTo(args[0]); - uint16_t loops = StringTo(args[1]); - det->setPedestalMode(defs::pedestalParameters(frames, loops)); - } else { - throw RuntimeError( - "Invalid number of parareters for this command."); - } - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* Gotthard Specific */ - -std::string CmdProxy::ROI(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[xmin] [xmax] \n\t[Gotthard] Region of interest in detector.\n\t" - "Options: Only a single ROI per module. \n\tEither all channels " - "or a single adc or 2 chips (256 channels). Default is all " - "channels enabled (-1 -1). " - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getROI(std::vector{det_id}); - os << t << '\n'; - } else if (action == defs::PUT_ACTION) { - if (det_id == -1 && det->size() > 1) { - throw RuntimeError("Cannot execute ROI at multi module level"); - } - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - defs::ROI t(StringTo(args[0]), StringTo(args[1])); - det->setROI(t, det_id); - os << t << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* Gotthard2 Specific */ - -std::string CmdProxy::InjectChannel(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[offset] [increment]\n\t[Gotthard2] Inject channels with " - "current source for calibration. Offset is starting channel that " - "is injected, increment determines succeeding channels to be " - "injected." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getInjectChannel(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->setInjectChannel(StringTo(args[0]), StringTo(args[1]), - {det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::VetoPhoton(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[ichip] [#photons] [energy in keV] [reference " - "file]\n\t[Gotthard2] Set veto reference for 128 channels for " - "chip ichip according to reference file and #photons and energy " - "in keV.\n[ichip] [output file]\n\t Get gain indices and veto " - "reference for 128 channels for chip ichip, saved to file." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->getVetoPhoton(StringTo(args[0]), args[1], - std::vector{det_id}); - os << "saved to file " << args[1] << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 4) { - WrongNumberOfParameters(4); - } - det->setVetoPhoton(StringTo(args[0]), StringTo(args[1]), - StringTo(args[2]), args[3], - std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::VetoReference(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[gain index] [12 bit value] \n\t[Gotthard2] Set veto " - "reference for all 128 channels for all chips." - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("cannot get vetoref. Did you mean vetophoton?"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->setVetoReference(StringTo(args[0]), StringTo(args[1]), - {det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::VetoFile(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[chip index 0-10, -1 for all] [file name] \n\t[Gotthard2] Set " - "veto reference for each 128 channels for specific chip. The " - "file should have 128 rows of gain index and 12 bit value in dec" - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("cannot get vetofile. Did you mean vetophoton?"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->setVetoFile(StringTo(args[0]), args[1], - std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::BurstMode(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[burst_internal or 0, burst_external or 1, cw_internal or 2, " - "cw_external or 3]\n\t[Gotthard2] Default is burst_internal " - "type. Also changes clkdiv 2, 3, 4" - << '\n'; - } else { - if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getBurstMode(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - defs::burstMode t; - try { - int ival = StringTo(args[0]); - switch (ival) { - case 0: - t = defs::BURST_INTERNAL; - break; - case 1: - t = defs::BURST_EXTERNAL; - break; - case 2: - t = defs::CONTINUOUS_INTERNAL; - break; - case 3: - t = defs::CONTINUOUS_EXTERNAL; - break; - default: - throw RuntimeError("Unknown burst mode " + args[0]); - } - } catch (...) { - t = StringTo(args[0]); - } - det->setBurstMode(t, std::vector{det_id}); - os << ToString(t) << '\n'; // no args to convert 0,1,2 as well - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::VetoStreaming(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[none|lll|10gbe|...]\n\t[Gotthard2] Enable or disable the 2 " - "veto streaming interfaces available. Can include more than one " - "interface. \n\tDefault: none. lll (low latency link) is the " - "default interface to work with. \n\t10GbE is for debugging and " - "also enables second interface in receiver for listening to veto " - "packets (writes a separate file if writing enabled). Also " - "restarts client and receiver zmq sockets if zmq streaming " - "enabled." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getVetoStream(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.empty()) { - WrongNumberOfParameters(1); - } - defs::streamingInterface interface = defs::streamingInterface::NONE; - for (const auto &arg : args) { - if (arg == "none") { - if (args.size() > 1) { - throw RuntimeError( - std::string( - "cannot have other arguments with 'none'. args: ") + - ToString(args)); - } - break; - } - interface = interface | (StringTo(arg)); - } - det->setVetoStream(interface, std::vector{det_id}); - os << ToString(interface) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::VetoAlgorithm(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[hits|raw] [lll|10gbe]\n\t[Gotthard2] Set the veto " - "algorithm. Default is hits." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - defs::streamingInterface interface = - StringTo(args[0]); - if (interface == defs::streamingInterface::NONE) { - throw RuntimeError("Must specify an interface to set algorithm"); - } - auto t = det->getVetoAlgorithm(interface, std::vector{det_id}); - os << OutString(t) << ' ' << ToString(interface) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - defs::vetoAlgorithm alg = StringTo(args[0]); - defs::streamingInterface interface = - StringTo(args[1]); - if (interface == defs::streamingInterface::NONE) { - throw RuntimeError("Must specify an interface to set algorithm"); - } - det->setVetoAlgorithm(alg, interface, std::vector{det_id}); - os << ToString(alg) << ' ' << ToString(interface) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::ConfigureADC(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[chip index 0-9, -1 for all] [adc index 0-31, -1 for all] [7 " - "bit configuration value in hex]\n\t[Gotthard2] Sets " - "configuration for specific chip and adc, but configures 1 chip " - "(all adcs for that chip) at a time." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - auto t = det->getADCConfiguration(StringTo(args[0]), - StringTo(args[1]), - std::vector{det_id}); - os << OutStringHex(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 3) { - WrongNumberOfParameters(3); - } - int value = StringTo(args[2]); - det->setADCConfiguration(StringTo(args[0]), StringTo(args[1]), - value, std::vector{det_id}); - os << '[' << args[0] << ", " << args[1] << ", " << ToStringHex(value) - << "]\n"; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* Mythen3 Specific */ - -std::string CmdProxy::Counters(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[i0] [i1] [i2]... \n\t[Mythen3] List of counters indices " - "enabled. Each element in list can be 0 - 2 and must be non " - "repetitive. Enabling counters sets vth dacs to remembered " - "values and disabling sets them to disabled values." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto mask = det->getCounterMask(std::vector{det_id}).squash(-1); - os << ToString(getSetBits(mask)) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.empty()) { - WrongNumberOfParameters(1); - } - if (std::any_of(args.cbegin(), args.cend(), [](std::string s) { - return (StringTo(s) < 0 || StringTo(s) > 2); - })) { - throw RuntimeError("Invalid counter indices list. Example: 0 1 2"); - } - // convert vector to counter enable mask - uint32_t mask = 0; - for (size_t i = 0; i < args.size(); ++i) { - int val = StringTo(args[i]); - // already enabled earlier - if (mask & (1 << val)) { - std::ostringstream oss; - oss << "Duplicate counter values (" << val << ") in arguments"; - throw RuntimeError(oss.str()); - } - mask |= (1 << val); - } - det->setCounterMask(mask, std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::GateDelay(int action) { - int gateIndex = -1; - if (cmd == "gatedelay") { - gateIndex = -1; - } else if (cmd == "gatedelay1") { - gateIndex = 0; - } else if (cmd == "gatedelay2") { - gateIndex = 1; - } else if (cmd == "gatedelay3") { - gateIndex = 2; - } else { - throw RuntimeError("Unknown command, use list to list all commands"); - } - - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - if (cmd == "gatedelay") { - os << "[duration] [(optional unit) ns|us|ms|s]\n\t[Mythen3] Gate " - "Delay of all gate signals in auto and trigger mode " - "(internal gating)." - << '\n'; - } else if (cmd == "gatedelay1") { - os << "[n_value]\n\t[Mythen3] Gate Delay of gate signal 1 in auto " - "and trigger mode (internal gating)." - << '\n'; - } else if (cmd == "gatedelay2") { - os << "[n_value]\n\t[Mythen3] Gate Delay of gate signal 2 in auto " - "and trigger mode (internal gating)." - << '\n'; - } else { - os << "[n_value]\n\t[Mythen3] Gate Delay of gate signal 3 in auto " - "and trigger mode (internal gating)." - << '\n'; - } - } else if (action == defs::GET_ACTION) { - if (args.size() > 1) { - WrongNumberOfParameters(1); - } - // vector of gate delays - if (gateIndex == -1) { - auto t = det->getGateDelayForAllGates(std::vector{det_id}); - if (args.empty()) { - os << OutString(t) << '\n'; - } else if (args.size() == 1) { - os << OutString(t, args[0]) << '\n'; - } - } - // single gate delay - else { - auto t = det->getGateDelay(gateIndex, std::vector{det_id}); - if (args.empty()) { - os << OutString(t) << '\n'; - } else if (args.size() == 1) { - os << OutString(t, args[0]) << '\n'; - } - } - } else if (action == defs::PUT_ACTION) { - if (args.size() == 1) { - std::string time_str(args[0]); - std::string unit = RemoveUnit(time_str); - auto t = StringTo(time_str, unit); - det->setGateDelay(gateIndex, t, std::vector{det_id}); - } else if (args.size() == 2) { - auto t = StringTo(args[0], args[1]); - det->setGateDelay(gateIndex, t, std::vector{det_id}); - } else { - WrongNumberOfParameters(2); - } - /* TODO: os << args << '\n'; (doesnt work for vectors in .h)*/ - if (args.size() > 1) { - os << args[0] << args[1] << '\n'; - } else { - os << args[0] << '\n'; - } - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::GainCaps(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[cap1, cap2, ...]\n\t[Mythen3] gain, options: C10pre, C15sh, " - "C30sh, C50sh, C225ACsh, C15pre" - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) - WrongNumberOfParameters(0); - - auto tmp = det->getGainCaps(); - Result csr; - for (auto val : tmp) { - if (val) - csr.push_back(static_cast(val)); - } - - os << OutString(csr) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() < 1) { - WrongNumberOfParameters(1); - } - int caps = 0; - for (const auto &arg : args) { - if (arg != "0") - caps |= StringTo(arg); - } - - det->setGainCaps(caps); - os << OutString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* CTB Specific */ - -std::string CmdProxy::Samples(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_samples]\n\t[CTB] Number of samples (analog, digitial and " - "transceiver) expected.\n" - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto a = det->getNumberOfAnalogSamples(std::vector{det_id}); - // get also digital samples for ctb and compare with analog - if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { - auto d = det->getNumberOfDigitalSamples(std::vector{det_id}); - auto t = - det->getNumberOfTransceiverSamples(std::vector{det_id}); - int as = a.squash(-1); - int ds = d.squash(-1); - int ts = t.squash(-1); - if (as == -1 || ds == -1 || ts == -1 || as != ds || - as != ts) { // check if a == d? - throw RuntimeError( - "Different samples. Use asamples, dsamples or tsamples."); - } - } - os << OutString(a) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->setNumberOfAnalogSamples(StringTo(args[0]), - std::vector{det_id}); - // set also digital samples for ctb - if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { - det->setNumberOfDigitalSamples(StringTo(args[0]), - std::vector{det_id}); - det->setNumberOfTransceiverSamples(StringTo(args[0]), - std::vector{det_id}); - } - os << args.front() << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* CTB Specific */ -std::string CmdProxy::AdcVpp(int action) { - std::ostringstream os; - os << cmd << ' '; - - if (action == defs::HELP_ACTION) { - os << "[dac or mV value][(optional unit) mV] \n\t[Ctb] Vpp of " - "ADC.\n\t 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> " - "2V. \n\tAdvanced User function!\n" - << '\n'; - return os.str(); - } - - if (action == defs::GET_ACTION) { - bool mV = false; - - if (args.size() == 1) { - if ((args[0] != "mv") && (args[0] != "mV")) { - throw RuntimeError("Unknown argument " + args[0] + - ". Did you mean mV?"); - } - mV = true; - } else if (args.size() > 1) { - WrongNumberOfParameters(1); - } - auto t = det->getADCVpp(mV, std::vector{det_id}); - os << OutString(t) << (mV ? " mV\n" : "\n"); - } else if (action == defs::PUT_ACTION) { - bool mV = false; - if (args.size() == 2) { - if ((args[1] != "mv") && (args[1] != "mV")) { - throw RuntimeError("Unknown argument " + args[1] + - ". Did you mean mV?"); - } - mV = true; - } else if (args.size() > 2 || args.size() < 1) { - WrongNumberOfParameters(1); - } - det->setADCVpp(StringTo(args[0]), mV, std::vector{det_id}); - os << args[0] << (mV ? " mV\n" : "\n"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::SlowADC(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[n_channel (0-7 for channel]\n\t[Ctb] Slow " - "ADC channel in mV" - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(0); - } - int nchan = StringTo(args[0]); - if (nchan < 0 || nchan > 7) { - throw RuntimeError("Unknown adc argument " + args[0]); - } - auto t = det->getSlowADC( - static_cast(nchan + defs::SLOW_ADC0), - std::vector{det_id}); - Result result(t.size()); - for (unsigned int i = 0; i < t.size(); ++i) { - result[i] = t[i] / 1000.00; - } - os << OutString(result) << " mV\n"; - - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("cannot put"); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::ReceiverDbitList(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[all] or [i0] [i1] [i2]... \n\t[Ctb] List of digital signal " - "bits read out. If all is used instead of a list, all digital " - "bits (64) enabled. Each element in list can be 0 - 63 and must " - "be non repetitive." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getRxDbitList(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.empty()) { - WrongNumberOfParameters(1); - } - std::vector t; - if (args[0] == "all") { - t.resize(64); - for (unsigned int i = 0; i < 64; ++i) { - t[i] = i; - } - } else { - unsigned int ntrim = args.size(); - t.resize(ntrim); - for (unsigned int i = 0; i < ntrim; ++i) { - t[i] = StringTo(args[i]); - } - } - det->setRxDbitList(t, std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::DigitalIODelay(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[64 bit bitmask] [0-775]\n\t[Ctb] Delay for digital IO pins " - "selected by the bitmask. Delay is in ps and max of 775 ps. " - "Resolution is 25 ps." - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("Cannot get"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->setDigitalIODelay(StringTo(args[0]), - StringTo(args[1]), - std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* Pattern */ - -std::string CmdProxy::Pattern(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[fname]\n\t[Mythen3][Ctb] Loads ASCII pattern file " - "directly to server (instead of executing line by line)" - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("Cannot get"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->setPattern(args[0], std::vector{det_id}); - os << args.front() << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::PatternWord(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[step or address] [64 bit mask]\n\t[Ctb][Mythen3] 64 " - "bit pattern at address of pattern memory.\n\t[Ctb] read " - "is same as executing pattern" - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - int addr = StringTo(args[0]); - auto t = det->getPatternWord(addr, std::vector{det_id}); - os << '[' << ToStringHex(addr, 4) << ", " << OutStringHex(t, 16) - << "]\n"; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - int addr = StringTo(args[0]); - uint64_t word = StringTo(args[1]); - det->setPatternWord(addr, word, std::vector{det_id}); - os << '[' << ToStringHex(addr, 4) << ", " << ToStringHex(word, 16) - << "]\n"; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -void CmdProxy::GetLevelAndUpdateArgIndex(int action, - std::string levelSeparatedCommand, - int &level, int &iArg, size_t nGetArgs, - size_t nPutArgs) { - if (cmd == levelSeparatedCommand) { - ++nGetArgs; - ++nPutArgs; - } else { - LOG(logWARNING) << "This command is deprecated and will be removed. " - "Please migrate to " - << levelSeparatedCommand; - } - if (action == defs::GET_ACTION && args.size() != nGetArgs) { - WrongNumberOfParameters(nGetArgs); - } else if (action == defs::PUT_ACTION && args.size() != nPutArgs) { - WrongNumberOfParameters(nPutArgs); - } - if (cmd == levelSeparatedCommand) { - level = StringTo(args[iArg++]); - } else { - level = cmd[cmd.find_first_of("012")] - '0'; - } -} - -std::string CmdProxy::PatternLoopAddresses(int action) { - if (cmd != "patlimits" && cmd != "patloop0" && cmd != "patloop1" && - cmd != "patloop2" && cmd != "patloop") { - throw RuntimeError("Unknown command, use list to list all commands"); - } - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - if (cmd == "patlimits") { - os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits " - "of complete pattern." - << '\n'; - } else if (cmd == "patloop") { - os << "[0-6] [start addr] [stop addr] \n\t[Ctb][Mythen3] " - "Limits of the loop level provided." - << "\n\t[Mythen3] Level options: 0-3 only." << '\n'; - } else { - os << "Depreciated command. Use patloop." << '\n'; - } - } else { - int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 2; - if (cmd != "patlimits") { - GetLevelAndUpdateArgIndex(action, "patloop", level, iArg, nGetArgs, - nPutArgs); - if (cmd != "patloop0" && cmd != "patloop1" && cmd != "patloop2") - os << level << ' '; - } - if (action == defs::GET_ACTION) { - auto t = - det->getPatternLoopAddresses(level, std::vector{det_id}); - os << OutStringHex(t, 4) << '\n'; - } else if (action == defs::PUT_ACTION) { - int start = StringTo(args[iArg++]); - int stop = StringTo(args[iArg++]); - det->setPatternLoopAddresses(level, start, stop, - std::vector{det_id}); - os << '[' << ToStringHex(start, 4) << ", " << ToStringHex(stop, 4) - << "]\n"; - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::PatternLoopCycles(int action) { - if (cmd != "patnloop0" && cmd != "patnloop1" && cmd != "patnloop2" && - cmd != "patnloop") { - throw RuntimeError("Unknown command, use list to list all commands"); - } - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - if (cmd == "patnloop") { - os << "[0-6] [n_cycles] \n\t[Ctb][Mythen3] Number of " - "cycles of " - "the loop level provided." - << "\n\t[Mythen3] Level options: 0-3 only." << '\n'; - } else { - os << "Depreciated command. Use patnloop." << '\n'; - } - } else { - int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; - GetLevelAndUpdateArgIndex(action, "patnloop", level, iArg, nGetArgs, - nPutArgs); - if (cmd != "patnloop0" && cmd != "patnloop1" && cmd != "patnloop2") - os << level << ' '; - if (action == defs::GET_ACTION) { - auto t = det->getPatternLoopCycles(level, std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - int nloops = StringTo(args[iArg++]); - det->setPatternLoopCycles(level, nloops, std::vector{det_id}); - os << nloops << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::PatternWaitAddress(int action) { - if (cmd != "patwait0" && cmd != "patwait1" && cmd != "patwait2" && - cmd != "patwait") { - throw RuntimeError("Unknown command, use list to list all commands"); - } - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - if (cmd == "patwait") { - os << "[0-6] [addr] \n\t[Ctb][Mythen3] Wait address for " - "loop level provided." - << "\n\t[Mythen3] Level options: 0-3 only."; - } else { - os << "Depreciated command. Use patwait."; - } - os << '\n'; - } else { - int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; - GetLevelAndUpdateArgIndex(action, "patwait", level, iArg, nGetArgs, - nPutArgs); - if (cmd != "patwait0" && cmd != "patwait1" && cmd != "patwait2") - os << level << ' '; - if (action == defs::GET_ACTION) { - auto t = det->getPatternWaitAddr(level, std::vector{det_id}); - os << OutStringHex(t, 4) << '\n'; - } else if (action == defs::PUT_ACTION) { - int addr = StringTo(args[iArg++]); - det->setPatternWaitAddr(level, addr, std::vector{det_id}); - os << ToStringHex(addr, 4) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::PatternWaitTime(int action) { - if (cmd != "patwaittime0" && cmd != "patwaittime1" && - cmd != "patwaittime2" && cmd != "patwaittime") { - throw RuntimeError("Unknown command, use list to list all commands"); - } - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - if (cmd == "patwaittime") { - os << "[0-6] [n_clk] \n\t[Ctb][Mythen3] Wait time in clock " - "cycles for the loop provided." - << "\n\t[Mythen3] Level options: 0-3 only." << '\n'; - } else { - os << "Depreciated command. Use patwaittime." << '\n'; - } - } else { - int level = -1, iArg = 0, nGetArgs = 0, nPutArgs = 1; - GetLevelAndUpdateArgIndex(action, "patwaittime", level, iArg, nGetArgs, - nPutArgs); - if (cmd != "patwaittime0" && cmd != "patwaittime1" && - cmd != "patwaittime2") - os << level << ' '; - if (action == defs::GET_ACTION) { - auto t = det->getPatternWaitTime(level, std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - uint64_t waittime = StringTo(args[iArg++]); - det->setPatternWaitTime(level, waittime, {det_id}); - os << waittime << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -/* Advanced */ - -std::string CmdProxy::AdditionalJsonHeader(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[key1] [value1] [key2] [value2]...[keyn] [valuen]\n\tAdditional " - "json header to be streamed out from receiver via zmq. Default " - "is empty. Max 20 characters for each key/value. Use only if to " - "be processed by an intermediate user process listening to " - "receiver zmq packets. Empty value deletes header. " - << '\n'; - } else if (action == defs::GET_ACTION) { - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getAdditionalJsonHeader(std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - // arguments can be empty - std::map json; - for (size_t i = 0; i < args.size(); i = i + 2) { - // last value is empty - if (i + 1 >= args.size()) { - json[args[i]] = ""; - } else { - json[args[i]] = args[i + 1]; - } - } - det->setAdditionalJsonHeader(json, std::vector{det_id}); - os << ToString(json) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::JsonParameter(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[key1] [value1]\n\tAdditional json header parameter streamed " - "out from receiver. If not found in header, the pair is " - "appended. An empty values deletes parameter. Max 20 characters " - "for each key/value." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - auto t = - det->getAdditionalJsonParameter(args[0], std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - switch (args.size()) { - case 1: - det->setAdditionalJsonParameter(args[0], "", - std::vector{det_id}); - break; - case 2: - det->setAdditionalJsonParameter(args[0], args[1], - std::vector{det_id}); - break; - default: - WrongNumberOfParameters(1); - } - if (args.size() == 1) { - os << args[0] << " deleted" << '\n'; - } else { - os << "{" << args[0] << ": " << args[1] << "}" << '\n'; - } - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::ProgramFpga(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[fname.pof | fname.rbf (full " - "path)][(opitonal)--force-delete-normal-file]\n\t[Jungfrau][" - "Moench][Ctb] " - "Programs FPGA from pof file (full path). Then, detector " - "controller is rebooted. \n\t\tUse --force-delete-normal-file " - "argument, if normal file found in device tree, it must be " - "deleted, a new device drive created and programming " - "continued.\n\t[Mythen3][Gotthard2] Programs FPGA from rbf file " - "(full path). Then, detector controller is rebooted." - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("Cannot get"); - } else if (action == defs::PUT_ACTION) { - bool forceDeteleNormalFile = false; - if (args.size() == 2) { - if (args[1] != "--force-delete-normal-file") { - throw RuntimeError("Could not scan second argument. Did you " - "mean --force-delete-normal-file?"); - } - forceDeteleNormalFile = true; - } else if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->programFPGA(args[0], forceDeteleNormalFile, - std::vector{det_id}); - os << "successful\n"; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::UpdateDetectorServer(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[server_name with full " - "path]\n\t[Jungfrau][Moench][Eiger][Ctb][Mythen3][Gotthard2] " - "Copies detector server via TCP (without tftp). Makes a symbolic " - "link with a shorter name (without vx.x.x). Then, detector " - "controller reboots (except " - "Eiger).\n\t[Jungfrau][Moench][Ctb]Also changes respawn server " - "to the link, which is effective after a reboot." - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("Cannot get"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->updateDetectorServer(args[0], std::vector{det_id}); - os << "successful\n"; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::UpdateKernel(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[kernel_name with full " - "path]\n\t[Jungfrau][Moench][Ctb][Mythen3][Gotthard2] Advanced " - "Command!! You could damage the detector. Please use with " - "caution.\n\tUpdates the kernel image. Then, detector controller " - "reboots with new kernel." - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("Cannot get"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->updateKernel(args[0], std::vector{det_id}); - os << "successful\n"; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::UpdateFirmwareAndDetectorServer(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\tWithout tftp: [server_name (incl fullpath)] [fname.pof " - "(incl full path)] This does not use " - "tftp.\n\t\t[Jungfrau][Moench][Gotthard][CTB] Updates the " - "firmware, detector server, deletes old server, creates the " - "symbolic link and then reboots detector controller. " - "\n\t\t[Mythen3][Gotthard2] will require a script to start up " - "the shorter named server link at start up. \n\t\tserver_name is " - "full path name of detector server binary\n\t\tfname is full " - "path of programming file" - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("Cannot get"); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - int fpos = args.size() - 1; - if (args[fpos].find(".pof") == std::string::npos && - args[fpos].find(".rbf") == std::string::npos) { - throw RuntimeError("Programming file must be a pof/rbf file."); - } - det->updateFirmwareAndServer(args[0], args[1], - std::vector{det_id}); - os << "successful\n"; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::Register(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[address] [32 bit value]\n\tReads/writes to a 32 bit register " - "in hex. Advanced Function!\n\tGoes to stop server. Hence, can " - "be called while calling blocking acquire(). \n\t[Eiger] +0x100 " - "for only left, +0x200 for only right." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - auto t = det->readRegister(StringTo(args[0]), - std::vector{det_id}); - os << OutStringHex(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->writeRegister(StringTo(args[0]), - StringTo(args[1]), - std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::AdcRegister(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[address] [value]\n\t[Jungfrau][Moench][Ctb][Gotthard] Writes " - "to an adc register in hex. Advanced user Function!" - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("Cannot get."); - } else if (action == defs::PUT_ACTION) { - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - det->writeAdcRegister(StringTo(args[0]), - StringTo(args[1]), - std::vector{det_id}); - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::BitOperations(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - if (cmd == "setbit") { - os << "[reg address in hex] [bit index]\n\tSets bit in address." - << '\n'; - } else if (cmd == "clearbit") { - os << "[reg address in hex] [bit index]\n\tClears bit in address." - << '\n'; - } else if (cmd == "getbit") { - os << "[reg address in hex] [bit index]\n\tGets bit in address." - << '\n'; - } else { - throw RuntimeError( - "Unknown command, use list to list all commands"); - } - } else { - if (cmd != "setbit" && cmd != "clearbit" && cmd != "getbit") { - throw RuntimeError( - "Unknown command, use list to list all commands"); - } - if (args.size() != 2) { - WrongNumberOfParameters(2); - } - auto addr = StringTo(args[0]); - auto bitnr = StringTo(args[1]); - if (bitnr < 0 || bitnr > 31) { - return std::string("Bit number out of range") + - std::to_string(bitnr); - } - if (action == defs::GET_ACTION) { - if (cmd == "setbit" || cmd == "clearbit") { - throw RuntimeError("Cannot get"); - } - auto t = det->getBit(addr, bitnr, std::vector{det_id}); - os << OutString(t) << '\n'; - } else if (action == defs::PUT_ACTION) { - if (cmd == "getbit") { - throw RuntimeError("Cannot put"); - } - if (cmd == "setbit") { - det->setBit(addr, bitnr, std::vector{det_id}); - } else if (cmd == "clearbit") { - det->clearBit(addr, bitnr, std::vector{det_id}); - } - os << ToString(args) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - } - return os.str(); -} - -std::string CmdProxy::InitialChecks(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[0, 1]\n\tEnable or disable intial compatibility and other " - "checks at detector start up. It is enabled by default. Must " - "come before 'hostname' command to take effect. Can be used to " - "reprogram fpga when current firmware is " - "incompatible.\n\tAdvanced User function!" - << '\n'; - } else if (action == defs::GET_ACTION) { - if (det_id != -1) { - throw RuntimeError( - "Cannot enable/disable initial checks at module level"); - } - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getInitialChecks(); - os << t << '\n'; - } else if (action == defs::PUT_ACTION) { - if (det_id != -1) { - throw RuntimeError( - "Cannot get initial checks enable at module level"); - } - if (args.size() != 1) { - WrongNumberOfParameters(1); - } - det->setInitialChecks(StringTo(args[0])); - os << args.front() << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -/* Insignificant */ - -std::string CmdProxy::ExecuteCommand(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "[command]\n\tExecutes command on detector server console." - << '\n'; - } else if (action == defs::GET_ACTION) { - throw RuntimeError("Cannot get."); - } else if (action == defs::PUT_ACTION) { - std::string command; - for (auto &i : args) { - command += (i + ' '); - } - auto t = det->executeCommand(command, std::vector{det_id}); - os << OutString(t) << '\n'; - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -std::string CmdProxy::UserDetails(int action) { - std::ostringstream os; - os << cmd << ' '; - if (action == defs::HELP_ACTION) { - os << "\n\tUser details from shared memory (hostname, type, PID, User, " - "Date)." - << '\n'; - } else if (action == defs::GET_ACTION) { - if (det_id != -1) { - throw RuntimeError("Cannot execute this at module level"); - } - if (!args.empty()) { - WrongNumberOfParameters(0); - } - auto t = det->getUserDetails(); - os << t << '\n'; - } else if (action == defs::PUT_ACTION) { - throw RuntimeError("Cannot put."); - } else { - throw RuntimeError("Unknown action"); - } - return os.str(); -} - -} // namespace sls diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h deleted file mode 100644 index 60f3454c0..000000000 --- a/slsDetectorSoftware/src/CmdProxy.h +++ /dev/null @@ -1,2656 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-other -// Copyright (C) 2021 Contributors to the SLS Detector Package -#pragma once - -#include "sls/Detector.h" -#include "sls/Result.h" -#include "sls/network_utils.h" -#include "sls/sls_detector_exceptions.h" -#include -#include -#include -#include - -namespace sls { - -/** Macro to make an integer command. - * CMDNAME name of the function that does the command - * GETFCN Detector function to get - * SETFCN Detector function to set - * CONV Function to convert from string to the correct integer type - * HLPSTR Help string for --help and docs - */ - -#define TIME_COMMAND(CMDNAME, GETFCN, SETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - auto t = det->GETFCN(std::vector{det_id}); \ - if (args.empty()) { \ - os << OutString(t) << '\n'; \ - } else if (args.size() == 1) { \ - os << OutString(t, args[0]) << '\n'; \ - } else { \ - WrongNumberOfParameters(1); \ - } \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() == 1) { \ - std::string time_str(args[0]); \ - std::string unit = RemoveUnit(time_str); \ - auto t = StringTo(time_str, unit); \ - det->SETFCN(t, std::vector{det_id}); \ - } else if (args.size() == 2) { \ - auto t = StringTo(args[0], args[1]); \ - det->SETFCN(t, std::vector{det_id}); \ - } else { \ - WrongNumberOfParameters(2); \ - } \ - /* TODO: os << args << '\n'; (doesnt work for vectors in .h)*/ \ - if (args.size() > 1) { \ - os << args[0] << args[1] << '\n'; \ - } else { \ - os << args[0] << '\n'; \ - } \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** time get only */ -#define TIME_GET_COMMAND(CMDNAME, GETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - auto t = det->GETFCN(std::vector{det_id}); \ - if (args.empty()) { \ - os << OutString(t) << '\n'; \ - } else if (args.size() == 1) { \ - os << OutString(t, args[0]) << '\n'; \ - } else { \ - WrongNumberOfParameters(1); \ - } \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("cannot put"); \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** string */ -#define STRING_COMMAND(CMDNAME, GETFCN, SETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(std::vector{det_id}); \ - os << OutString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - det->SETFCN(args[0], std::vector{det_id}); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** int or enum hex with 16 bit width (64 bit)*/ -#define INTEGER_COMMAND_HEX_WIDTH16(CMDNAME, GETFCN, SETFCN, CONV, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(std::vector{det_id}); \ - os << OutStringHex(t, 16) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto val = CONV(args[0]); \ - det->SETFCN(val, std::vector{det_id}); \ - os << ToStringHex(val, 16) << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** int or enum hex */ -#define INTEGER_COMMAND_HEX(CMDNAME, GETFCN, SETFCN, CONV, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(std::vector{det_id}); \ - os << OutStringHex(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto val = CONV(args[0]); \ - det->SETFCN(val, std::vector{det_id}); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** int or enum */ -#define INTEGER_COMMAND_VEC_ID(CMDNAME, GETFCN, SETFCN, CONV, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(std::vector{det_id}); \ - os << OutString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto val = CONV(args[0]); \ - det->SETFCN(val, std::vector{det_id}); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -#define INTEGER_COMMAND_VEC_ID_GET(CMDNAME, GETFCN, SETFCN, CONV, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(std::vector{det_id}); \ - os << OutString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto val = CONV(args[0]); \ - det->SETFCN(val, det_id); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** int or enum */ -#define INTEGER_COMMAND_SINGLE_ID(CMDNAME, GETFCN, SETFCN, CONV, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(det_id); \ - os << OutString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto val = CONV(args[0]); \ - det->SETFCN(val, det_id); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** int, set no id, get id */ -#define INTEGER_COMMAND_SET_NOID_GET_ID(CMDNAME, GETFCN, SETFCN, CONV, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(std::vector{det_id}); \ - os << OutString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (det_id != -1) { \ - throw RuntimeError("Cannot execute this at module level"); \ - } \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto val = CONV(args[0]); \ - det->SETFCN(val); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** int, no id */ -#define INTEGER_COMMAND_NOID(CMDNAME, GETFCN, SETFCN, CONV, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (det_id != -1) { \ - throw RuntimeError("Cannot execute this at module level"); \ - } \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(); \ - os << OutString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto val = CONV(args[0]); \ - det->SETFCN(val); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** int with index */ -#define INTEGER_IND_COMMAND(CMDNAME, GETFCN, SETFCN, CONV, INDEX, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(INDEX, std::vector{det_id}); \ - os << OutString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto val = CONV(args[0]); \ - det->SETFCN(INDEX, val, std::vector{det_id}); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** int with user index */ -#define INTEGER_USER_IND_COMMAND(CMDNAME, GETFCN, SETFCN, CONV, INDEX, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto t = det->GETFCN(INDEX, StringTo(args[0]), \ - std::vector{det_id}); \ - os << args[0] << ' ' << OutStringHex(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 2) { \ - WrongNumberOfParameters(2); \ - } \ - auto val = CONV(args[1]); \ - det->SETFCN(INDEX, StringTo(args[0]), val, \ - std::vector{det_id}); \ - os << args[0] << ' ' << args[1] << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** set only, no arguments, no id */ -#define EXECUTE_SET_COMMAND_NOID(CMDNAME, SETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (det_id != -1) { \ - throw RuntimeError("Cannot execute this at module level"); \ - } \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - throw RuntimeError("Cannot get"); \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - det->SETFCN(); \ - os << "successful\n"; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** set only, no arguments */ -#define EXECUTE_SET_COMMAND(CMDNAME, SETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - throw RuntimeError("Cannot get"); \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - det->SETFCN(std::vector{det_id}); \ - os << "successful\n"; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** set only, 1 argument, no id */ -#define EXECUTE_SET_COMMAND_NOID_1ARG(CMDNAME, SETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (det_id != -1) { \ - throw RuntimeError("Cannot execute this at module level"); \ - } \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - throw RuntimeError("Cannot get"); \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - det->SETFCN(args[0]); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** set only, 1 argument */ -#define EXECUTE_SET_COMMAND_1ARG(CMDNAME, SETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - throw RuntimeError("Cannot get"); \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - det->SETFCN(args[0], std::vector{det_id}); \ - os << args.front() << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** get only */ -#define GET_COMMAND(CMDNAME, GETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(std::vector{det_id}); \ - os << OutString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** get only no id (vector, not result) */ -#define GET_COMMAND_NOID(CMDNAME, GETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(); \ - os << ToString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -/** get only hex*/ -#define GET_COMMAND_HEX(CMDNAME, GETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(std::vector{det_id}); \ - os << OutStringHex(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -#define GET_IND_COMMAND(CMDNAME, GETFCN, VAL, APPEND, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) \ - os << HLPSTR << '\n'; \ - else if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(VAL, std::vector{det_id}); \ - os << OutString(t) << APPEND << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -#define CTB_NAMED_LIST(CMDNAME, GETFCN, SETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) { \ - os << HLPSTR << '\n'; \ - return os.str(); \ - } \ - if (cmd != "daclist" && \ - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { \ - throw RuntimeError(cmd + " only allowed for CTB."); \ - } \ - if (det_id != -1) { \ - throw RuntimeError("Cannot configure " + cmd + \ - " at module level"); \ - } \ - if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - auto t = det->GETFCN(); \ - os << ToString(t) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (cmd == "daclist" && \ - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { \ - throw RuntimeError("This detector already has fixed dac " \ - "names. Cannot change them."); \ - } \ - det->SETFCN(args); \ - os << ToString(args) << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -#define CTB_VALUES(CMDNAME, GETFCN, GETFCNLIST, GETFCNNAME, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) { \ - os << HLPSTR << '\n'; \ - return os.str(); \ - } \ - if (action == slsDetectorDefs::GET_ACTION) { \ - if (!args.empty()) { \ - WrongNumberOfParameters(0); \ - } \ - std::string suffix = " mV"; \ - auto t = det->GETFCNLIST(); \ - auto names = det->GETFCNNAME(); \ - auto name_it = names.begin(); \ - os << '['; \ - auto it = t.cbegin(); \ - os << ToString(*name_it++) << ' '; \ - os << OutString(det->GETFCN(*it++, std::vector{det_id})) \ - << suffix; \ - while (it != t.cend()) { \ - os << ", " << ToString(*name_it++) << ' '; \ - os << OutString(det->GETFCN(*it++, std::vector{det_id})) \ - << suffix; \ - } \ - os << "]\n"; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -#define CTB_SINGLE_DACNAME(CMDNAME, GETFCN, SETFCN, STARTINDEX, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) { \ - os << HLPSTR << '\n'; \ - return os.str(); \ - } \ - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { \ - throw RuntimeError(cmd + " only allowed for CTB."); \ - } \ - if (det_id != -1) { \ - throw RuntimeError("Cannot configure " + cmd + \ - " at module level"); \ - } \ - defs::dacIndex index = defs::DAC_0; \ - if (args.size() > 0) { \ - index = static_cast(StringTo(args[0]) + \ - STARTINDEX); \ - } \ - if (action == slsDetectorDefs::GET_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto t = det->GETFCN(index); \ - os << args[0] << ' ' << t << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 2) { \ - WrongNumberOfParameters(2); \ - } \ - det->SETFCN(index, args[1]); \ - os << ToString(args) << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -#define CTB_GET_DACINDEX(CMDNAME, GETFCN, STARTINDEX, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) { \ - os << HLPSTR << '\n'; \ - return os.str(); \ - } \ - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { \ - throw RuntimeError(cmd + " only allowed for CTB."); \ - } \ - if (det_id != -1) { \ - throw RuntimeError("Cannot configure " + cmd + \ - " at module level"); \ - } \ - if (action == slsDetectorDefs::GET_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto t = det->GETFCN(args[0]); \ - os << ToString(static_cast(t) - STARTINDEX) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -#define CTB_SINGLE_NAME(CMDNAME, GETFCN, SETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) { \ - os << HLPSTR << '\n'; \ - return os.str(); \ - } \ - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { \ - throw RuntimeError(cmd + " only allowed for CTB."); \ - } \ - if (det_id != -1) { \ - throw RuntimeError("Cannot configure " + cmd + \ - " at module level"); \ - } \ - if (action == slsDetectorDefs::GET_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto t = det->GETFCN(StringTo(args[0])); \ - os << args[0] << ' ' << t << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - if (args.size() != 2) { \ - WrongNumberOfParameters(2); \ - } \ - det->SETFCN(StringTo(args[0]), args[1]); \ - os << ToString(args) << '\n'; \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -#define CTB_GET_INDEX(CMDNAME, GETFCN, HLPSTR) \ - std::string CMDNAME(const int action) { \ - std::ostringstream os; \ - os << cmd << ' '; \ - if (action == slsDetectorDefs::HELP_ACTION) { \ - os << HLPSTR << '\n'; \ - return os.str(); \ - } \ - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { \ - throw RuntimeError(cmd + " only allowed for CTB."); \ - } \ - if (det_id != -1) { \ - throw RuntimeError("Cannot configure " + cmd + \ - " at module level"); \ - } \ - if (action == slsDetectorDefs::GET_ACTION) { \ - if (args.size() != 1) { \ - WrongNumberOfParameters(1); \ - } \ - auto t = det->GETFCN(args[0]); \ - os << ToString(static_cast(t)) << '\n'; \ - } else if (action == slsDetectorDefs::PUT_ACTION) { \ - throw RuntimeError("Cannot put"); \ - } else { \ - throw RuntimeError("Unknown action"); \ - } \ - return os.str(); \ - } - -class CmdProxy { - public: - explicit CmdProxy(Detector *ptr) : det(ptr) {} - - void Call(const std::string &command, - const std::vector &arguments, int detector_id = -1, - int action = -1, std::ostream &os = std::cout, - int receiver_id = -1); - - bool ReplaceIfDepreciated(std::string &command); - size_t GetFunctionMapSize() const noexcept { return functions.size(); }; - std::vector GetProxyCommands(); - std::map GetDepreciatedCommands(); - - private: - Detector *det; - std::string cmd; - std::vector args; - int det_id{-1}; - int rx_id{-1}; - - template std::string OutStringHex(const V &value) { - if (value.equal()) - return ToStringHex(value.front()); - return ToStringHex(value); - } - - template std::string OutStringHex(const V &value, int width) { - if (value.equal()) - return ToStringHex(value.front(), width); - return ToStringHex(value, width); - } - - template std::string OutString(const Result &value) { - if (value.equal()) - return ToString(value.front()); - return ToString(value); - } - - template std::string OutString(const V &value) { - return ToString(value); - } - - template - std::string OutString(const V &value, const std::string &unit) { - if (value.equal()) - return ToString(value.front(), unit); - return ToString(value, unit); - } - - using FunctionMap = std::map; - using StringMap = std::map; - - StringMap depreciated_functions{ - /* configuration */ - {"detectorversion", "firmwareversion"}, - {"softwareversion", "detectorserverversion"}, - {"receiverversion", "rx_version"}, - {"detectornumber", "serialnumber"}, - {"thisversion", "clientversion"}, - {"detsizechan", "detsize"}, - {"trimdir", "settingspath"}, - {"settingsdir", "settingspath"}, - {"flippeddatax", "fliprows"}, - - /* acquisition parameters */ - {"cycles", "triggers"}, - {"cyclesl", "triggersl"}, - {"clkdivider", "readoutspeed"}, - {"speed", "readoutspeed"}, - {"vhighvoltage", "highvoltage"}, - {"digitest", "imagetest"}, - {"filter", "filterresistor"}, - {"readnlines", "readnrows"}, - - /** temperature */ - - /** super old dacs */ - {"vtr", "vtrim"}, - {"vrf", "vrpreamp"}, - {"vrs", "vrshaper"}, - {"vcall", "vcal"}, - {"vis", "vishaper"}, - {"vshaper", "vrshaper"}, - {"vpreamp", "vrpreamp"}, - {"vshaperneg", "vrshaper_n"}, - {"viinsh", "vishaper"}, - {"vpl", "vcal_n"}, - {"vph", "vcal_p"}, - /** dacs */ - {"vthreshold", "dac"}, - {"vsvp", "dac"}, - {"vsvn", "dac"}, - {"vtrim", "dac"}, - {"vrpreamp", "dac"}, - {"vrshaper", "dac"}, - {"vtgstv", "dac"}, - {"vcmp_ll", "dac"}, - {"vcmp_lr", "dac"}, - {"vcal", "dac"}, - {"vcmp_rl", "dac"}, - {"vcmp_rr", "dac"}, - {"rxb_rb", "dac"}, - {"rxb_lb", "dac"}, - {"vcp", "dac"}, - {"vcn", "dac"}, - {"vishaper", "dac"}, - {"iodelay", "dac"}, - {"vref_ds", "dac"}, - {"vcascn_pb", "dac"}, - {"vcascp_pb", "dac"}, - {"vout_cm", "dac"}, - {"vcasc_out", "dac"}, - {"vin_cm", "dac"}, - {"vref_comp", "dac"}, - {"ib_test_c", "dac"}, - {"vrshaper_n", "dac"}, - {"vipre", "dac"}, - {"vdcsh", "dac"}, - {"vth1", "dac"}, - {"vth2", "dac"}, - {"vth3", "dac"}, - {"vcal_n", "dac"}, - {"vcal_p", "dac"}, - {"vcassh", "dac"}, - {"vcas", "dac"}, - {"vicin", "dac"}, - {"vipre_out", "dac"}, - {"vref_h_adc", "dac"}, - {"vb_comp_fe", "dac"}, - {"vb_comp_adc", "dac"}, - {"vcom_cds", "dac"}, - {"vref_rstore", "dac"}, - {"vb_opa_1st", "dac"}, - {"vref_comp_fe", "dac"}, - {"vcom_adc1", "dac"}, - {"vref_prech", "dac"}, - {"vref_l_adc", "dac"}, - {"vref_cds", "dac"}, - {"vb_cs", "dac"}, - {"vb_opa_fd", "dac"}, - {"vcom_adc2", "dac"}, - {"vb_ds", "dac"}, - {"vb_comp", "dac"}, - {"vb_pixbuf", "dac"}, - {"vin_com", "dac"}, - {"vdd_prot", "dac"}, - {"vbp_colbuf", "dac"}, - {"vb_sda", "dac"}, - {"vcasc_sfp", "dac"}, - {"vipre_cds", "dac"}, - {"ibias_sfp", "dac"}, - - {"defaultdacs", "resetdacs"}, - - /* acquisition */ - {"busy", "clearbusy"}, - {"receiver", "rx_status"}, - {"framescaught", "rx_framescaught"}, - {"startingfnum", "nextframenumber"}, - - /* Network Configuration (Detector<->Receiver) */ - {"detectorip", "udp_srcip"}, - {"detectorip2", "udp_srcip2"}, - {"detectormac", "udp_srcmac"}, - {"detectormac2", "udp_srcmac2"}, - {"rx_udpip", "udp_dstip"}, - {"rx_udpip2", "udp_dstip2"}, - {"rx_udpmac", "udp_dstmac"}, - {"rx_udpmac2", "udp_dstmac2"}, - {"rx_udpport", "udp_dstport"}, - {"rx_udpport2", "udp_dstport2"}, - {"flowcontrol_10g", "flowcontrol10g"}, - {"txndelay_frame", "txdelay_frame"}, - {"txndelay_left", "txdelay_left"}, - {"txndelay_right", "txdelay_right"}, - - /* Receiver Config */ - {"r_silent", "rx_silent"}, - {"r_discardpolicy", "rx_discardpolicy"}, - {"r_padding", "rx_padding"}, - {"r_lock", "rx_lock"}, - {"r_lastclient", "rx_lastclient"}, - - /* File */ - {"fileformat", "fformat"}, - {"outdir", "fpath"}, - {"index", "findex"}, - {"enablefwrite", "fwrite"}, - {"masterfile", "fmaster"}, - {"overwrite", "foverwrite"}, - {"r_framesperfile", "rx_framesperfile"}, - - /* ZMQ Streaming Parameters (Receiver<->Client) */ - {"r_readfreq", "rx_zmqfreq"}, - {"rx_readfreq", "rx_zmqfreq"}, - {"rx_datastream", "rx_zmqstream"}, - - /* Eiger Specific */ - {"resmat", "partialreset"}, - - /* Jungfrau Specific */ - {"storagecells", "extrastoragecells"}, - {"auto_comp_disable", "autocompdisable"}, - {"comp_disable_time", "compdisabletime"}, - - /* Gotthard Specific */ - /* Gotthard2 Specific */ - /* Mythen3 Specific */ - /* CTB Specific */ - {"adc", "slowadc"}, - {"flags", "romode"}, - {"i_a", "im_a"}, - {"i_b", "im_b"}, - {"i_c", "im_c"}, - {"i_d", "im_d"}, - {"i_io", "im_io"}, - - /* Pattern */ - /* Moench */ - - /* Advanced */ - {"copydetectorserver", "updatedetectorserver"}, - - /* Insignificant */ - {"nframes", "framecounter"}, - {"now", "runtime"}, - {"timestamp", "frametime"}, - {"frameindex", "rx_frameindex"} - - }; - - // Initialize maps for translating name and function - FunctionMap functions{ - {"list", &CmdProxy::ListCommands}, - - /* configuration */ - {"config", &CmdProxy::config}, - {"free", &CmdProxy::Free}, - {"parameters", &CmdProxy::parameters}, - {"hostname", &CmdProxy::Hostname}, - {"virtual", &CmdProxy::VirtualServer}, - {"versions", &CmdProxy::Versions}, - {"packageversion", &CmdProxy::PackageVersion}, - {"clientversion", &CmdProxy::ClientVersion}, - {"firmwareversion", &CmdProxy::FirmwareVersion}, - {"hardwareversion", &CmdProxy::hardwareversion}, - {"detectorserverversion", &CmdProxy::detectorserverversion}, - {"kernelversion", &CmdProxy::kernelversion}, - {"rx_version", &CmdProxy::rx_version}, - {"serialnumber", &CmdProxy::serialnumber}, - {"moduleid", &CmdProxy::moduleid}, - {"type", &CmdProxy::type}, - {"nmod", &CmdProxy::nmod}, - {"detsize", &CmdProxy::DetectorSize}, - {"settingslist", &CmdProxy::settingslist}, - {"settings", &CmdProxy::settings}, - {"threshold", &CmdProxy::Threshold}, - {"thresholdnotb", &CmdProxy::Threshold}, - {"settingspath", &CmdProxy::settingspath}, - {"trimbits", &CmdProxy::Trimbits}, - {"trimval", &CmdProxy::trimval}, - {"trimen", &CmdProxy::TrimEnergies}, - {"gappixels", &CmdProxy::GapPixels}, - {"fliprows", &CmdProxy::fliprows}, - {"master", &CmdProxy::master}, - {"sync", &CmdProxy::sync}, - {"badchannels", &CmdProxy::BadChannels}, - {"row", &CmdProxy::row}, - {"column", &CmdProxy::column}, - - /* acquisition parameters */ - {"acquire", &CmdProxy::Acquire}, - {"frames", &CmdProxy::frames}, - {"triggers", &CmdProxy::triggers}, - {"exptime", &CmdProxy::Exptime}, - {"period", &CmdProxy::period}, - {"delay", &CmdProxy::delay}, - {"framesl", &CmdProxy::framesl}, - {"triggersl", &CmdProxy::triggersl}, - {"delayl", &CmdProxy::delayl}, - {"periodl", &CmdProxy::periodl}, - {"dr", &CmdProxy::dr}, - {"drlist", &CmdProxy::drlist}, - {"timing", &CmdProxy::timing}, - {"timinglist", &CmdProxy::timinglist}, - {"readoutspeed", &CmdProxy::ReadoutSpeed}, - {"readoutspeedlist", &CmdProxy::readoutspeedlist}, - {"adcphase", &CmdProxy::Adcphase}, - {"maxadcphaseshift", &CmdProxy::maxadcphaseshift}, - {"dbitphase", &CmdProxy::Dbitphase}, - {"maxdbitphaseshift", &CmdProxy::maxdbitphaseshift}, - {"clkfreq", &CmdProxy::ClockFrequency}, - {"clkphase", &CmdProxy::ClockPhase}, - {"maxclkphaseshift", &CmdProxy::MaxClockPhaseShift}, - {"clkdiv", &CmdProxy::ClockDivider}, - {"highvoltage", &CmdProxy::highvoltage}, - {"powerchip", &CmdProxy::powerchip}, - {"imagetest", &CmdProxy::imagetest}, - {"extsig", &CmdProxy::ExternalSignal}, - {"parallel", &CmdProxy::parallel}, - {"filterresistor", &CmdProxy::filterresistor}, - {"currentsource", &CmdProxy::CurrentSource}, - {"dbitpipeline", &CmdProxy::dbitpipeline}, - {"readnrows", &CmdProxy::readnrows}, - - /** temperature */ - {"templist", &CmdProxy::templist}, - {"tempvalues", &CmdProxy::TemperatureValues}, - {"temp_adc", &CmdProxy::temp_adc}, - {"temp_fpga", &CmdProxy::temp_fpga}, - {"temp_fpgaext", &CmdProxy::temp_fpgaext}, - {"temp_10ge", &CmdProxy::temp_10ge}, - {"temp_dcdc", &CmdProxy::temp_dcdc}, - {"temp_sodl", &CmdProxy::temp_sodl}, - {"temp_sodr", &CmdProxy::temp_sodr}, - {"temp_fpgafl", &CmdProxy::temp_fpgafl}, - {"temp_fpgafr", &CmdProxy::temp_fpgafr}, - {"temp_slowadc", &CmdProxy::temp_slowadc}, - - /* lists */ - {"daclist", &CmdProxy::daclist}, - {"dacname", &CmdProxy::dacname}, - {"dacindex", &CmdProxy::dacindex}, - {"adclist", &CmdProxy::adclist}, - {"adcname", &CmdProxy::adcname}, - {"adcindex", &CmdProxy::adcindex}, - {"signallist", &CmdProxy::signallist}, - {"signalname", &CmdProxy::signalname}, - {"signalindex", &CmdProxy::signalindex}, - {"powerlist", &CmdProxy::powerlist}, - {"powername", &CmdProxy::powername}, - {"powerindex", &CmdProxy::powerindex}, - {"powervalues", &CmdProxy::powervalues}, - {"slowadclist", &CmdProxy::slowadclist}, - {"slowadcname", &CmdProxy::slowadcname}, - {"slowadcindex", &CmdProxy::slowadcindex}, - {"slowadcvalues", &CmdProxy::slowadcvalues}, - - /* dacs */ - {"dac", &CmdProxy::Dac}, - {"dacvalues", &CmdProxy::DacValues}, - {"resetdacs", &CmdProxy::ResetDacs}, - {"defaultdac", &CmdProxy::DefaultDac}, - - /* on chip dacs */ - {"vchip_comp_fe", &CmdProxy::vchip_comp_fe}, - {"vchip_opa_1st", &CmdProxy::vchip_opa_1st}, - {"vchip_opa_fd", &CmdProxy::vchip_opa_fd}, - {"vchip_comp_adc", &CmdProxy::vchip_comp_adc}, - {"vchip_ref_comp_fe", &CmdProxy::vchip_ref_comp_fe}, - {"vchip_cs", &CmdProxy::vchip_cs}, - - /* acquisition */ - {"clearbusy", &CmdProxy::clearbusy}, - {"rx_start", &CmdProxy::rx_start}, - {"rx_stop", &CmdProxy::rx_stop}, - {"start", &CmdProxy::start}, - {"readout", &CmdProxy::readout}, - {"stop", &CmdProxy::stop}, - {"rx_status", &CmdProxy::ReceiverStatus}, - {"status", &CmdProxy::DetectorStatus}, - {"rx_framescaught", &CmdProxy::rx_framescaught}, - {"rx_missingpackets", &CmdProxy::rx_missingpackets}, - {"rx_frameindex", &CmdProxy::rx_frameindex}, - {"nextframenumber", &CmdProxy::nextframenumber}, - {"trigger", &CmdProxy::Trigger}, - {"scan", &CmdProxy::Scan}, - {"scanerrmsg", &CmdProxy::scanerrmsg}, - - /* Network Configuration (Detector<->Receiver) */ - {"numinterfaces", &CmdProxy::numinterfaces}, - {"selinterface", &CmdProxy::selinterface}, - {"udp_dstlist", &CmdProxy::UDPDestinationList}, - {"udp_numdst", &CmdProxy::udp_numdst}, - {"udp_cleardst", &CmdProxy::udp_cleardst}, - {"udp_firstdst", &CmdProxy::udp_firstdst}, - {"udp_srcip", &CmdProxy::UDPSourceIP}, - {"udp_srcip2", &CmdProxy::UDPSourceIP2}, - {"udp_dstip", &CmdProxy::UDPDestinationIP}, - {"udp_dstip2", &CmdProxy::UDPDestinationIP2}, - {"udp_srcmac", &CmdProxy::udp_srcmac}, - {"udp_srcmac2", &CmdProxy::udp_srcmac2}, - {"udp_dstmac", &CmdProxy::udp_dstmac}, - {"udp_dstmac2", &CmdProxy::udp_dstmac2}, - {"udp_dstport", &CmdProxy::udp_dstport}, - {"udp_dstport2", &CmdProxy::udp_dstport2}, - {"udp_reconfigure", &CmdProxy::udp_reconfigure}, - {"udp_validate", &CmdProxy::udp_validate}, - {"rx_printconfig", &CmdProxy::rx_printconfig}, - {"tengiga", &CmdProxy::tengiga}, - {"flowcontrol10g", &CmdProxy::flowcontrol10g}, - {"txdelay_frame", &CmdProxy::txdelay_frame}, - {"txdelay_left", &CmdProxy::txdelay_left}, - {"txdelay_right", &CmdProxy::txdelay_right}, - {"txdelay", &CmdProxy::TransmissionDelay}, - - /* Receiver Config */ - {"rx_hostname", &CmdProxy::ReceiverHostname}, - {"rx_tcpport", &CmdProxy::rx_tcpport}, - {"rx_fifodepth", &CmdProxy::rx_fifodepth}, - {"rx_silent", &CmdProxy::rx_silent}, - {"rx_discardpolicy", &CmdProxy::rx_discardpolicy}, - {"rx_padding", &CmdProxy::rx_padding}, - {"rx_udpsocksize", &CmdProxy::rx_udpsocksize}, - {"rx_realudpsocksize", &CmdProxy::rx_realudpsocksize}, - {"rx_lock", &CmdProxy::rx_lock}, - {"rx_lastclient", &CmdProxy::rx_lastclient}, - {"rx_threads", &CmdProxy::rx_threads}, - {"rx_arping", &CmdProxy::rx_arping}, - {"rx_roi", &CmdProxy::Rx_ROI}, - {"rx_clearroi", &CmdProxy::rx_clearroi}, - - /* File */ - {"fformat", &CmdProxy::fformat}, - {"fpath", &CmdProxy::fpath}, - {"fname", &CmdProxy::fname}, - {"findex", &CmdProxy::findex}, - {"fwrite", &CmdProxy::fwrite}, - {"fmaster", &CmdProxy::fmaster}, - {"foverwrite", &CmdProxy::foverwrite}, - {"rx_framesperfile", &CmdProxy::rx_framesperfile}, - - /* ZMQ Streaming Parameters (Receiver<->Client) */ - {"rx_zmqstream", &CmdProxy::rx_zmqstream}, - {"rx_zmqfreq", &CmdProxy::rx_zmqfreq}, - {"rx_zmqstartfnum", &CmdProxy::rx_zmqstartfnum}, - {"rx_zmqport", &CmdProxy::rx_zmqport}, - {"zmqport", &CmdProxy::zmqport}, - {"rx_zmqip", &CmdProxy::rx_zmqip}, - {"zmqip", &CmdProxy::zmqip}, - {"zmqhwm", &CmdProxy::ZMQHWM}, - {"rx_zmqhwm", &CmdProxy::rx_zmqhwm}, - - /* Eiger Specific */ - {"blockingtrigger", &CmdProxy::Trigger}, - {"subexptime", &CmdProxy::subexptime}, - {"subdeadtime", &CmdProxy::subdeadtime}, - {"overflow", &CmdProxy::overflow}, - {"ratecorr", &CmdProxy::RateCorrection}, - {"interruptsubframe", &CmdProxy::interruptsubframe}, - {"measuredperiod", &CmdProxy::measuredperiod}, - {"measuredsubperiod", &CmdProxy::measuredsubperiod}, - {"activate", &CmdProxy::activate}, - {"partialreset", &CmdProxy::partialreset}, - {"pulse", &CmdProxy::PulsePixel}, - {"pulsenmove", &CmdProxy::PulsePixelAndMove}, - {"pulsechip", &CmdProxy::PulseChip}, - {"quad", &CmdProxy::Quad}, - {"datastream", &CmdProxy::DataStream}, - {"top", &CmdProxy::top}, - - /* Jungfrau Specific */ - {"chipversion", &CmdProxy::chipversion}, - {"temp_threshold", &CmdProxy::temp_threshold}, - {"temp_control", &CmdProxy::temp_control}, - {"temp_event", &CmdProxy::TemperatureEvent}, - {"autocompdisable", &CmdProxy::autocompdisable}, - {"compdisabletime", &CmdProxy::compdisabletime}, - {"extrastoragecells", &CmdProxy::extrastoragecells}, - {"storagecell_start", &CmdProxy::storagecell_start}, - {"storagecell_delay", &CmdProxy::storagecell_delay}, - {"gainmode", &CmdProxy::gainmode}, - {"filtercells", &CmdProxy::filtercells}, - {"pedestalmode", &CmdProxy::PedestalMode}, - - /* Gotthard Specific */ - {"roi", &CmdProxy::ROI}, - {"clearroi", &CmdProxy::clearroi}, - {"exptimel", &CmdProxy::exptimel}, - - /* Gotthard2 Specific */ - {"bursts", &CmdProxy::bursts}, - {"burstperiod", &CmdProxy::burstperiod}, - {"burstsl", &CmdProxy::burstsl}, - {"inj_ch", &CmdProxy::InjectChannel}, - {"vetophoton", &CmdProxy::VetoPhoton}, - {"vetoref", &CmdProxy::VetoReference}, - {"vetofile", &CmdProxy::VetoFile}, - {"burstmode", &CmdProxy::BurstMode}, - {"cdsgain", &CmdProxy::cdsgain}, - {"timingsource", &CmdProxy::timingsource}, - {"veto", &CmdProxy::veto}, - {"vetostream", &CmdProxy::VetoStreaming}, - {"vetoalg", &CmdProxy::VetoAlgorithm}, - {"confadc", &CmdProxy::ConfigureADC}, - - /* Mythen3 Specific */ - {"counters", &CmdProxy::Counters}, - {"gates", &CmdProxy::gates}, - {"exptime1", &CmdProxy::Exptime}, - {"exptime2", &CmdProxy::Exptime}, - {"exptime3", &CmdProxy::Exptime}, - {"gatedelay", &CmdProxy::GateDelay}, - {"gatedelay1", &CmdProxy::GateDelay}, - {"gatedelay2", &CmdProxy::GateDelay}, - {"gatedelay3", &CmdProxy::GateDelay}, - {"gaincaps", &CmdProxy::GainCaps}, - {"polarity", &CmdProxy::polarity}, - {"interpolation", &CmdProxy::interpolation}, - {"pumpprobe", &CmdProxy::pumpprobe}, - {"apulse", &CmdProxy::apulse}, - {"dpulse", &CmdProxy::dpulse}, - - /* CTB Specific */ - {"samples", &CmdProxy::Samples}, - {"asamples", &CmdProxy::asamples}, - {"adcclk", &CmdProxy::adcclk}, - {"runclk", &CmdProxy::runclk}, - {"syncclk", &CmdProxy::syncclk}, - {"v_limit", &CmdProxy::v_limit}, - {"adcenable", &CmdProxy::adcenable}, - {"adcenable10g", &CmdProxy::adcenable10g}, - {"transceiverenable", &CmdProxy::transceiverenable}, - {"dsamples", &CmdProxy::dsamples}, - {"tsamples", &CmdProxy::tsamples}, - {"romode", &CmdProxy::romode}, - {"dbitclk", &CmdProxy::dbitclk}, - {"adcvpp", &CmdProxy::AdcVpp}, - {"v_a", &CmdProxy::v_a}, - {"v_b", &CmdProxy::v_b}, - {"v_c", &CmdProxy::v_c}, - {"v_d", &CmdProxy::v_d}, - {"v_io", &CmdProxy::v_io}, - {"v_chip", &CmdProxy::v_chip}, - {"vm_a", &CmdProxy::vm_a}, - {"vm_b", &CmdProxy::vm_b}, - {"vm_c", &CmdProxy::vm_c}, - {"vm_d", &CmdProxy::vm_d}, - {"vm_io", &CmdProxy::vm_io}, - {"im_a", &CmdProxy::im_a}, - {"im_b", &CmdProxy::im_b}, - {"im_c", &CmdProxy::im_c}, - {"im_d", &CmdProxy::im_d}, - {"im_io", &CmdProxy::im_io}, - {"slowadc", &CmdProxy::SlowADC}, - {"extsampling", &CmdProxy::extsampling}, - {"extsamplingsrc", &CmdProxy::extsamplingsrc}, - {"rx_dbitlist", &CmdProxy::ReceiverDbitList}, - {"rx_dbitoffset", &CmdProxy::rx_dbitoffset}, - {"diodelay", &CmdProxy::DigitalIODelay}, - {"led", &CmdProxy::led}, - - /* Pattern */ - {"pattern", &CmdProxy::Pattern}, - {"patfname", &CmdProxy::patfname}, - {"savepattern", &CmdProxy::savepattern}, - {"defaultpattern", &CmdProxy::defaultpattern}, - {"patioctrl", &CmdProxy::patioctrl}, - {"patword", &CmdProxy::PatternWord}, - {"patlimits", &CmdProxy::PatternLoopAddresses}, - {"patloop", &CmdProxy::PatternLoopAddresses}, - {"patloop0", &CmdProxy::PatternLoopAddresses}, - {"patloop1", &CmdProxy::PatternLoopAddresses}, - {"patloop2", &CmdProxy::PatternLoopAddresses}, - {"patnloop", &CmdProxy::PatternLoopCycles}, - {"patnloop0", &CmdProxy::PatternLoopCycles}, - {"patnloop1", &CmdProxy::PatternLoopCycles}, - {"patnloop2", &CmdProxy::PatternLoopCycles}, - {"patwait", &CmdProxy::PatternWaitAddress}, - {"patwait0", &CmdProxy::PatternWaitAddress}, - {"patwait1", &CmdProxy::PatternWaitAddress}, - {"patwait2", &CmdProxy::PatternWaitAddress}, - {"patwaittime", &CmdProxy::PatternWaitTime}, - {"patwaittime0", &CmdProxy::PatternWaitTime}, - {"patwaittime1", &CmdProxy::PatternWaitTime}, - {"patwaittime2", &CmdProxy::PatternWaitTime}, - {"patmask", &CmdProxy::patmask}, - {"patsetbit", &CmdProxy::patsetbit}, - {"patternstart", &CmdProxy::patternstart}, - - /* Moench */ - - /* Advanced */ - {"adcpipeline", &CmdProxy::adcpipeline}, - {"rx_jsonaddheader", &CmdProxy::AdditionalJsonHeader}, - {"rx_jsonpara", &CmdProxy::JsonParameter}, - {"programfpga", &CmdProxy::ProgramFpga}, - {"resetfpga", &CmdProxy::resetfpga}, - {"updatedetectorserver", &CmdProxy::UpdateDetectorServer}, - {"updatekernel", &CmdProxy::UpdateKernel}, - {"rebootcontroller", &CmdProxy::rebootcontroller}, - {"update", &CmdProxy::UpdateFirmwareAndDetectorServer}, - {"updatemode", &CmdProxy::updatemode}, - {"reg", &CmdProxy::Register}, - {"adcreg", &CmdProxy::AdcRegister}, - {"setbit", &CmdProxy::BitOperations}, - {"clearbit", &CmdProxy::BitOperations}, - {"getbit", &CmdProxy::BitOperations}, - {"firmwaretest", &CmdProxy::firmwaretest}, - {"bustest", &CmdProxy::bustest}, - {"initialchecks", &CmdProxy::InitialChecks}, - {"adcinvert", &CmdProxy::adcinvert}, - - /* Insignificant */ - {"port", &CmdProxy::port}, - {"stopport", &CmdProxy::stopport}, - {"lock", &CmdProxy::lock}, - {"lastclient", &CmdProxy::lastclient}, - {"execcommand", &CmdProxy::ExecuteCommand}, - {"framecounter", &CmdProxy::framecounter}, - {"runtime", &CmdProxy::runtime}, - {"frametime", &CmdProxy::frametime}, - {"user", &CmdProxy::UserDetails} - - }; - - void WrongNumberOfParameters(size_t expected); - - /* Commands */ - std::string ListCommands(int action); - /* configuration */ - std::string Free(int action); - // std::string config2(int action); - std::string Hostname(int action); - std::string VirtualServer(int action); - std::string FirmwareVersion(int action); - std::string Versions(int action); - std::string PackageVersion(int action); - std::string ClientVersion(int action); - std::string DetectorSize(int action); - std::string Threshold(int action); - std::string Trimbits(int action); - std::string TrimEnergies(int action); - std::string GapPixels(int action); - std::string BadChannels(int action); - /* acquisition parameters */ - std::string Acquire(int action); - std::string Exptime(int action); - std::string ReadoutSpeed(int action); - std::string Adcphase(int action); - std::string Dbitphase(int action); - std::string ClockFrequency(int action); - std::string ClockPhase(int action); - std::string MaxClockPhaseShift(int action); - std::string ClockDivider(int action); - std::string ExternalSignal(int action); - std::string CurrentSource(int action); - /** temperature */ - std::string TemperatureValues(int action); - /* list */ - /* dacs */ - std::string Dac(int action); - std::string DacValues(int action); - std::string ResetDacs(int action); - std::string DefaultDac(int action); - /* acquisition */ - std::string ReceiverStatus(int action); - std::string DetectorStatus(int action); - std::string RxMissingPackets(int action); - std::string Scan(int action); - std::string Trigger(int action); - /* Network Configuration (Detector<->Receiver) */ - IpAddr getDstIpFromAuto(); - IpAddr getSrcIpFromAuto(); - UdpDestination getUdpEntry(); - std::string UDPDestinationList(int action); - std::string UDPSourceIP(int action); - std::string UDPSourceIP2(int action); - std::string UDPDestinationIP(int action); - std::string UDPDestinationIP2(int action); - std::string TransmissionDelay(int action); - /* Receiver Config */ - std::string ReceiverHostname(int action); - std::string Rx_ROI(int action); - /* File */ - /* ZMQ Streaming Parameters (Receiver<->Client) */ - std::string ZMQHWM(int action); - /* Eiger Specific */ - std::string RateCorrection(int action); - std::string PulsePixel(int action); - std::string PulsePixelAndMove(int action); - std::string PulseChip(int action); - std::string Quad(int action); - std::string DataStream(int action); - /* Jungfrau Specific */ - std::string TemperatureEvent(int action); - std::string PedestalMode(int action); - /* Gotthard Specific */ - std::string ROI(int action); - /* Gotthard2 Specific */ - std::string InjectChannel(int action); - std::string VetoPhoton(int action); - std::string VetoReference(int action); - std::string VetoFile(int action); - std::string BurstMode(int action); - std::string VetoStreaming(int action); - std::string VetoAlgorithm(int action); - std::string ConfigureADC(int action); - /* Mythen3 Specific */ - std::string Counters(int action); - std::string GateDelay(int action); - std::string GainCaps(int action); - /* CTB/ Moench Specific */ - std::string Samples(int action); - /* CTB Specific */ - std::string AdcVpp(int action); - std::string SlowADC(int action); - std::string ReceiverDbitList(int action); - std::string DigitalIODelay(int action); - /* Pattern */ - std::string Pattern(int action); - std::string PatternWord(int action); - void GetLevelAndUpdateArgIndex(int action, - std::string levelSeparatedCommand, - int &level, int &iArg, size_t nGetArgs, - size_t nPutArgs); - std::string PatternLoopAddresses(int action); - std::string PatternLoopCycles(int action); - std::string PatternWaitAddress(int action); - std::string PatternWaitTime(int action); - /* Moench */ - std::string AdditionalJsonHeader(int action); - std::string JsonParameter(int action); - /* Advanced */ - std::string ProgramFpga(int action); - std::string UpdateDetectorServer(int action); - std::string UpdateKernel(int action); - std::string UpdateFirmwareAndDetectorServer(int action); - std::string Register(int action); - std::string AdcRegister(int action); - std::string BitOperations(int action); - std::string InitialChecks(int action); - /* Insignificant */ - std::string ExecuteCommand(int action); - std::string UserDetails(int action); - - /* configuration */ - EXECUTE_SET_COMMAND_NOID_1ARG( - config, loadConfig, - "[fname]\n\tFrees shared memory before loading configuration file. " - "Set up once."); - - EXECUTE_SET_COMMAND_NOID_1ARG(parameters, loadParameters, - "[fname]\n\tSets detector measurement " - "parameters to those contained in " - "fname. Set up per measurement."); - - GET_COMMAND(detectorserverversion, getDetectorServerVersion, - "\n\tOn-board detector server software version"); - - GET_COMMAND(hardwareversion, getHardwareVersion, - "\n\t[Jungfrau][Gotthard2][Myhten3][Gotthard][Ctb][Moench] " - "Hardware version of detector. \n\t[Eiger] Hardware version of " - "front FPGA on detector."); - - GET_COMMAND( - kernelversion, getKernelVersion, - "\n\tGet kernel version on the detector including time and date."); - - GET_COMMAND(rx_version, getReceiverVersion, "\n\tReceiver version"); - - GET_COMMAND_HEX(serialnumber, getSerialNumber, - "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][CTB]" - "Serial number of detector."); - - GET_COMMAND( - moduleid, getModuleId, - "\n\t[Gotthard2][Eiger][Mythen3][Jungfrau][Moench] 16 bit value " - "(ideally unique) that is streamed out in the UDP header of " - "the detector. Picked up from a file on the module."); - - GET_COMMAND(type, getDetectorType, - "\n\tReturns detector type. Can be Eiger, Jungfrau, Gotthard, " - "Moench, Mythen3, Gotthard2, ChipTestBoard"); - - GET_COMMAND_NOID(nmod, size, "\n\tNumber of modules in shared memory."); - - GET_COMMAND_NOID(settingslist, getSettingsList, - "\n\tList of settings implemented for this detector."); - - INTEGER_COMMAND_VEC_ID( - settings, getSettings, setSettings, - StringTo, - "[standard, fast, highgain, dynamicgain, lowgain, " - "mediumgain, veryhighgain, highgain0, " - "fixgain1, fixgain2, forceswitchg1, forceswitchg2, " - "verylowgain, g1_hg, g1_lg, g2_hc_hg, g2_hc_lg, " - "g2_lc_hg, g2_lc_lg, g4_hg, g4_lg, gain0]" - "\n\t Detector Settings" - "\n\t[Jungfrau] - [ gain0 | highgain0]" - "\n\t[Gotthard] - [dynamicgain | highgain | lowgain | " - "mediumgain | veryhighgain]" - "\n\t[Gotthard] Also loads default dacs on to the detector." - "\n\t[Gotthard2] - [dynamicgain | fixgain1 | fixgain2]" - "\n\t[Mythen3] - [standard | fast | highgain] Also changes vrshaper " - "and vrpreamp. \n\t[Eiger] Use threshold or thresholdnotb. \n\t[Eiger] " - "threshold and settings loaded from file found in settingspath. " - "\n\t[Moench] - [g1_hg | g1_lg | g2_hc_hg | g2_hc_lg | " - "g2_lc_hg | g2_lc_lg | g4_hg | g4_lg]"); - - STRING_COMMAND(settingspath, getSettingsPath, setSettingsPath, - "[path]\n\t[Eiger][Mythen3] Directory where settings files " - "are loaded from/to."); - - INTEGER_COMMAND_VEC_ID( - trimval, getAllTrimbits, setAllTrimbits, StringTo, - "[n_trimval]\n\t[Eiger][Mythen3] All trimbits set to this " - "value. Returns -1 if all trimbits are different values."); - - INTEGER_COMMAND_VEC_ID( - fliprows, getFlipRows, setFlipRows, StringTo, - "[0, 1]\n\t[Eiger] flips rows paramater sent to slsreceiver " - "to stream as json parameter to flip rows in gui " - "\n\t[Jungfrau][Moench] flips " - "rows in the detector itself. For bottom module and number of " - "interfaces must be set to 2. slsReceiver and slsDetectorGui " - "does not handle."); - - INTEGER_COMMAND_VEC_ID_GET(master, getMaster, setMaster, StringTo, - "[0, 1]\n\t[Eiger][Gotthard2][Jungfrau][Moench] " - "Sets (half) module to master " - "and other(s) to " - "slaves.\n\t[Gotthard][Gotthard2][Mythen3][" - "Eiger][Jungfrau][Moench] Gets if " - "the current (half) module is master."); - - INTEGER_COMMAND_SET_NOID_GET_ID( - sync, getSynchronization, setSynchronization, StringTo, - "[0, 1]\n\t[Jungfrau][Moench] Enables or disables " - "synchronization between modules. Sync mode requires at least one " - "master configured. Also requires flatband cabling between master and " - "slave with termination board."); - - INTEGER_COMMAND_VEC_ID(row, getRow, setRow, StringTo, - "[value]\n\tSet Detector row (udp header) to value. " - "\n\tGui uses it to rearrange for complete image"); - - INTEGER_COMMAND_VEC_ID( - column, getColumn, setColumn, StringTo, - "[value]\n\tSet Detector column (udp header) to value. \n\tGui uses it " - "to rearrange for complete image"); - - /* acquisition parameters */ - - INTEGER_COMMAND_SET_NOID_GET_ID( - frames, getNumberOfFrames, setNumberOfFrames, StringTo, - "[n_frames]\n\tNumber of frames per acquisition. In " - "trigger mode, number of frames per trigger. \n\tCannot be set in " - "modular level. \n\tIn scan mode, number of frames is set to " - "number of steps.\n\t[Gotthard2] Burst mode has a maximum of 2720 " - "frames."); - - INTEGER_COMMAND_SET_NOID_GET_ID( - triggers, getNumberOfTriggers, setNumberOfTriggers, StringTo, - "[n_triggers]\n\tNumber of triggers per aquire. Set " - "timing mode to use triggers."); - - TIME_COMMAND( - period, getPeriod, setPeriod, - "[duration] [(optional unit) ns|us|ms|s]\n\tPeriod between frames"); - - TIME_COMMAND(delay, getDelayAfterTrigger, setDelayAfterTrigger, - "[duration] [(optional unit) " - "ns|us|ms|s]\n\t[Jungfrau][Moench][Gotthard][Mythen3][" - "Gotthard2][Ctb][Moench] Delay after trigger"); - - GET_COMMAND(framesl, getNumberOfFramesLeft, - "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] " - "Number of frames left in acquisition." - "\n\t[Gotthard2] only in continuous auto mode."); - - GET_COMMAND(triggersl, getNumberOfTriggersLeft, - "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] " - "Number of triggers left in acquisition. Only when external " - "trigger used."); - - TIME_GET_COMMAND(delayl, getDelayAfterTriggerLeft, - "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB]" - " DelayLeft Delay Left in Acquisition." - "\n\t[Gotthard2] only in continuous mode."); - - TIME_GET_COMMAND(periodl, getPeriodLeft, - "\n\t[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2]" - " Period left for current frame." - "\n\t[Gotthard2] only in continuous mode."); - - INTEGER_COMMAND_SET_NOID_GET_ID( - dr, getDynamicRange, setDynamicRange, StringTo, - "[value]\n\tDynamic Range or number of bits per " - "pixel in detector.\n\t" - "[Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets " - "clkdivider to 2, else to 0.\n\t" - "[Mythen3] Options: 8, 16, 32\n\t" - "[Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16"); - - GET_COMMAND_NOID(drlist, getDynamicRangeList, - "\n\tGets the list of dynamic ranges for this detector."); - - INTEGER_COMMAND_VEC_ID( - timing, getTimingMode, setTimingMode, - StringTo, - "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of " - "detector.\n\t[Jungfrau][Moench][Gotthard][Ctb][Gotthard2] " - "[auto|trigger]\n\t[Mythen3] " - "[auto|trigger|gating|trigger_gating]\n\t[Eiger] " - "[auto|trigger|gating|burst_trigger]"); - - GET_COMMAND_NOID(timinglist, getTimingModeList, - "\n\tGets the list of timing modes for this detector."); - - GET_COMMAND_NOID( - readoutspeedlist, getReadoutSpeedList, - "\n\tList of readout speed levels implemented for this detector."); - - GET_COMMAND(maxadcphaseshift, getMaxADCPhaseShift, - "\n\t[Jungfrau][Moench][CTB] Absolute maximum Phase shift of " - "ADC clock."); - - GET_COMMAND(maxdbitphaseshift, getMaxDBITPhaseShift, - "\n\t[CTB][Jungfrau] Absolute maximum Phase shift of of the " - "clock to latch digital bits."); - - INTEGER_COMMAND_VEC_ID(highvoltage, getHighVoltage, setHighVoltage, - StringTo, - "[n_value]\n\tHigh voltage to the sensor in Voltage." - "\n\t[Gotthard] [0|90|110|120|150|180|200]" - "\n\t[Eiger][Mythen3][Gotthard2] 0-200" - "\n\t[Jungfrau][Moench][Ctb] [0|60-200]"); - - INTEGER_COMMAND_VEC_ID( - powerchip, getPowerChip, setPowerChip, StringTo, - "[0, 1]\n\t[Jungfrau][Moench][Mythen3][Gotthard2] Power " - "the chip. \n\t[Jungfrau][Moench] Default is 0. Get " - "will return power status. Can be off if temperature event occured " - "(temperature over temp_threshold with temp_control " - "enabled. Will configure chip (only chip v1.1)\n\t[Mythen3][Gotthard2] " - "Default is 1. If module not connected or wrong module, powerchip will " - "fail."); - - INTEGER_COMMAND_VEC_ID( - imagetest, getImageTestMode, setImageTestMode, StringTo, - "[0, 1]\n\t[Gotthard] 1 adds channel intensity with precalculated " - "values when taking an acquisition. Default is 0." - "\n\t[Eiger][Jungfrau][Moench] Only for Virtual servers. If 0, each " - "pixel intensity incremented by 1. If 1, all pixels almost saturated."); - - INTEGER_COMMAND_VEC_ID( - parallel, getParallelMode, setParallelMode, StringTo, - "[0, 1]\n\t[Eiger][Mythen3][Gotthard2][Moench] Enable or disable " - "parallel " - "mode.\n\t[Mythen3] If exptime is too short, the " - "acquisition will return ERROR status and take fewer " - "frames than expected.\n\t[Mythen3][Eiger][Moench] Default: Non " - "parallel.\n\t[Gotthard2] Default: Parallel. Non parallel mode works " - "only in continuous mode."); - - INTEGER_COMMAND_VEC_ID( - filterresistor, getFilterResistor, setFilterResistor, StringTo, - "[value] [Gotthard2][Jungfrau] Set filter resistor. Increasing " - "values for increasing resistance.\n\t[Gotthard2] Options: " - "[0|1|2|3]. Default is 0.\n\t[Jungfrau] Options: [0|1]. Default is 1."); - - INTEGER_COMMAND_VEC_ID(dbitpipeline, getDBITPipeline, setDBITPipeline, - StringTo, - "[n_value]\n\t[Ctb][Gotthard2] Pipeline of the " - "clock for latching digital bits.\n\t[Gotthard2] " - "Options: 0-7\n\t[CTB] Options: 0-255"); - - INTEGER_COMMAND_VEC_ID( - readnrows, getReadNRows, setReadNRows, StringTo, - "\n\t[1-256]\n\t\t[Eiger] Number of rows to readout per half " - "module starting from the centre. Options: 0 - 256. 256 is default. " - "The permissible values depend on dynamic range and 10Gbe " - "enabled.\n\t[8-512 (multiple of 8)]\n\t\t[Jungfrau] Number of rows " - "per module starting from the centre. Options: 8 - 512, must be " - "multiples of 8. Default is 512.\n\t\t[Moench] Number of rows per " - "module starting from the centre. Options:16 - 400, must be multiples " - "of 16. Default is 400."); - - /** temperature */ - GET_COMMAND_NOID( - templist, getTemperatureList, - "\n\tList of temperature commands implemented for this detector."); - - GET_IND_COMMAND( - temp_adc, getTemperature, slsDetectorDefs::TEMPERATURE_ADC, " °C", - "[n_value]\n\t[Jungfrau][Moench][Gotthard] ADC Temperature"); - - GET_IND_COMMAND(temp_fpga, getTemperature, - slsDetectorDefs::TEMPERATURE_FPGA, " °C", - "[n_value]\n\t[Eiger][Jungfrau][Moench][Gotthard][Mythen3][" - "Gotthard2] FPGA Temperature"); - - GET_IND_COMMAND(temp_fpgaext, getTemperature, - slsDetectorDefs::TEMPERATURE_FPGAEXT, " °C", - "[n_value]\n\t[Eiger]Temperature close to the FPGA"); - - GET_IND_COMMAND(temp_10ge, getTemperature, - slsDetectorDefs::TEMPERATURE_10GE, " °C", - "[n_value]\n\t[Eiger]Temperature close to the 10GbE"); - - GET_IND_COMMAND( - temp_dcdc, getTemperature, slsDetectorDefs::TEMPERATURE_DCDC, " °C", - "[n_value]\n\t[Eiger]Temperature close to the dc dc converter"); - - GET_IND_COMMAND( - temp_sodl, getTemperature, slsDetectorDefs::TEMPERATURE_SODL, " °C", - "[n_value]\n\t[Eiger]Temperature close to the left so-dimm memory"); - - GET_IND_COMMAND(temp_sodr, getTemperature, - slsDetectorDefs::TEMPERATURE_SODR, " °C", - "[n_value]\n\t[Eiger]Temperature close to the right " - "so-dimm memory"); - - GET_IND_COMMAND(temp_fpgafl, getTemperature, - slsDetectorDefs::TEMPERATURE_FPGA2, " °C", - "[n_value]\n\t[Eiger]Temperature of the left front end " - "board fpga."); - - GET_IND_COMMAND(temp_fpgafr, getTemperature, - slsDetectorDefs::TEMPERATURE_FPGA3, " °C", - "[n_value]\n\t[Eiger]Temperature of the left front end " - "board fpga."); - - GET_IND_COMMAND(temp_slowadc, getTemperature, - slsDetectorDefs::SLOW_ADC_TEMP, " °C", - "[n_value]\n\t[Ctb]Temperature of the slow adc"); - - /* lists */ - CTB_NAMED_LIST(daclist, getDacNames, setDacNames, - "[dacname1 dacname2 .. dacname18] \n\t\t[ChipTestBoard] Set " - "the list of dac names for this detector.\n\t\t[All] Gets " - "the list of dac names for every dac for this detector."); - - CTB_SINGLE_DACNAME(dacname, getDacName, setDacName, defs::DAC_0, - "\n\t[0-17][name] \n\t\t[ChipTestBoard] Set " - "the dac at the given position to the given name."); - - CTB_GET_DACINDEX(dacindex, getDacIndex, defs::DAC_0, - "\n\t[name] \n\t\t[ChipTestBoard] Get " - "the dac index for the given name."); - - CTB_NAMED_LIST(adclist, getAdcNames, setAdcNames, - "[adcname1 adcname2 .. adcname32] \n\t\t[ChipTestBoard] Set " - "the list of adc names for this board."); - - CTB_SINGLE_NAME(adcname, getAdcName, setAdcName, - "[0-31][name] \n\t\t[ChipTestBoard] Set " - "the adc at the given position to the given name."); - - CTB_GET_INDEX(adcindex, getAdcIndex, - "[name] \n\t\t[ChipTestBoard] Get " - "the adc index for the given name."); - - CTB_NAMED_LIST(signallist, getSignalNames, setSignalNames, - "[signalname1 signalname2 .. signalname63] " - "\n\t\t[ChipTestBoard] Set " - "the list of signal names for this board."); - - CTB_SINGLE_NAME(signalname, getSignalName, setSignalName, - "[0-63][name] \n\t\t[ChipTestBoard] Set " - "the signal at the given position to the given name."); - - CTB_GET_INDEX(signalindex, getSignalIndex, - "[name] \n\t\t[ChipTestBoard] Get " - "the signal index for the given name."); - - CTB_NAMED_LIST(powerlist, getPowerNames, setPowerNames, - "[powername1 powername2 .. powername4] " - "\n\t\t[ChipTestBoard] Set " - "the list of power names for this board."); - - CTB_SINGLE_DACNAME(powername, getPowerName, setPowerName, defs::V_POWER_A, - "[0-4][name] \n\t\t[ChipTestBoard] Set " - "the power at the given position to the given name."); - - CTB_GET_DACINDEX(powerindex, getPowerIndex, defs::V_POWER_A, - "[name] \n\t\t[ChipTestBoard] Get " - "the power index for the given name."); - - CTB_VALUES(powervalues, getPower, getPowerList, getPowerNames, - "[name] \n\t\t[ChipTestBoard] Get values of all powers."); - - CTB_VALUES(slowadcvalues, getSlowADC, getSlowADCList, getSlowADCNames, - "[name] \n\t\t[ChipTestBoard] Get values of all slow adcs."); - - CTB_NAMED_LIST( - slowadclist, getSlowADCNames, setSlowADCNames, - "[slowadcname1 slowadcname2 .. slowadcname7] " - "\n\t\t[ChipTestBoard] Set the list of slowadc names for this board."); - - CTB_SINGLE_DACNAME(slowadcname, getSlowADCName, setSlowADCName, - defs::SLOW_ADC0, - "[0-7][name] \n\t\t[ChipTestBoard] Set " - "the slowadc at the given position to the given name."); - - CTB_GET_DACINDEX(slowadcindex, getSlowADCIndex, defs::SLOW_ADC0, - "[name] \n\t\t[ChipTestBoard] Get " - "the slowadc index for the given name."); - - /* dacs */ - - /* on chip dacs */ - INTEGER_USER_IND_COMMAND( - vchip_comp_fe, getOnChipDAC, setOnChipDAC, StringTo, - defs::VB_COMP_FE, - "[chip index 0-10, -1 for all][10 bit hex value] \n\t[Gotthard2] " - "On chip Dac for comparator current of analogue front end."); - - INTEGER_USER_IND_COMMAND( - vchip_opa_1st, getOnChipDAC, setOnChipDAC, StringTo, - defs::VB_OPA_1ST, - "[chip index 0-10, -1 for all][10 bit hex value] \n\t[Gotthard2] " - "On " - "chip Dac for opa current for driving the other DACs in chip."); - - INTEGER_USER_IND_COMMAND(vchip_opa_fd, getOnChipDAC, setOnChipDAC, - StringTo, defs::VB_OPA_FD, - "[chip index 0-10, -1 for all][10 bit hex " - "value] \n\t[Gotthard2] On " - "chip Dac current for CDS opa stage."); - - INTEGER_USER_IND_COMMAND(vchip_comp_adc, getOnChipDAC, setOnChipDAC, - StringTo, defs::VB_COMP_ADC, - "[chip index 0-10, -1 for all][10 bit hex " - "value] \n\t[Gotthard2] On " - "chip Dac for comparator current of ADC."); - - INTEGER_USER_IND_COMMAND(vchip_ref_comp_fe, getOnChipDAC, setOnChipDAC, - StringTo, defs::VREF_COMP_FE, - "[chip index 0-10, -1 for all][10 bit hex " - "value] \n\t[Gotthard2] On " - "chip Dac for reference voltage of the " - "comparator of analogue front " - "end."); - - INTEGER_USER_IND_COMMAND( - vchip_cs, getOnChipDAC, setOnChipDAC, StringTo, defs::VB_CS, - "[chip index 0-10, -1 for all][10 bit hex value] \n\t[Gotthard2] " - "On chip Dac for current injection into preamplifier."); - - /* acquisition */ - - EXECUTE_SET_COMMAND_NOID( - clearbusy, clearAcquiringFlag, - "\n\tIf acquisition aborted during acquire command, use this to " - "clear acquiring flag in shared memory before starting next " - "acquisition"); - - EXECUTE_SET_COMMAND_NOID(rx_start, startReceiver, - "\n\tStarts receiver listener for detector " - "data packets and create a " - "data file (if file write enabled)."); - - EXECUTE_SET_COMMAND_NOID( - rx_stop, stopReceiver, - "\n\tStops receiver listener for detector data packets and closes " - "current data file (if file write enabled)."); - - EXECUTE_SET_COMMAND( - start, startDetector, - "\n\tStarts detector acquisition. Status changes to RUNNING or " - "WAITING and automatically returns to idle at the end of acquisition. " - "If the acquisition was abruptly stopped, some detectors come back to " - "STOPPED."); - - EXECUTE_SET_COMMAND_NOID( - readout, startDetectorReadout, - "\n\t[Mythen3] Starts detector readout. Status changes to " - "TRANSMITTING and automatically returns to idle at the end of " - "readout."); - - EXECUTE_SET_COMMAND(stop, stopDetector, - "\n\tAbort detector acquisition. Status changes " - "to IDLE or STOPPED. Goes to stop server."); - - GET_COMMAND(rx_framescaught, getFramesCaught, - "\n\tNumber of frames caught by each port in receiver."); - - GET_COMMAND(rx_missingpackets, getNumMissingPackets, - "\n\tNumber of missing packets for each port in receiver. If " - "negative, they are packets in excess. "); - - GET_COMMAND(rx_frameindex, getRxCurrentFrameIndex, - "\n\tCurrent frame index received for each port in receiver " - "during acquisition."); - - INTEGER_COMMAND_VEC_ID( - nextframenumber, getNextFrameNumber, setNextFrameNumber, - StringTo, - "[n_value]\n\t[Eiger][Jungfrau][Moench][CTB] Next frame number. " - "Stopping acquisition might result in different frame numbers for " - "different modules."); - - GET_COMMAND(scanerrmsg, getScanErrorMessage, - "\n\tGets Scan error message if scan ended in error for non " - "blocking acquisitions."); - - /* Network Configuration (Detector<->Receiver) */ - - INTEGER_COMMAND_VEC_ID( - numinterfaces, getNumberofUDPInterfaces, setNumberofUDPInterfaces, - StringTo, - "[1, 2]\n\t[Jungfrau][Moench] Number of udp interfaces to stream " - "data from detector. Default: 1.\n\tAlso enables second interface " - "in receiver for listening (Writes a file per interface if writing " - "enabled).\n\tAlso restarts client and receiver zmq sockets if zmq " - "streaming enabled.\n\t[Eiger] Only gets with result 2."); - - INTEGER_COMMAND_VEC_ID(selinterface, getSelectedUDPInterface, - selectUDPInterface, StringTo, - "[0, 1]\n\t[Jungfrau][Moench] The udp interface " - "to stream data from detector. Effective only when " - "number of interfaces is 1. Default: 0 (outer)"); - - GET_COMMAND( - udp_numdst, getNumberofUDPDestinations, - "\n\t[Jungfrau][Moench][Eiger][Mythen3][Gotthard2] One can enter " - "upto 32 (64 for Mythen3) destinations that the detector will stream " - "images out in a round robin fashion. This is get only command. " - "Default: 1"); - - EXECUTE_SET_COMMAND(udp_cleardst, clearUDPDestinations, - "\n\tClears udp destination details on the detector."); - - INTEGER_COMMAND_VEC_ID( - udp_firstdst, getFirstUDPDestination, setFirstUDPDestination, - StringTo, - "\n[0 - 31 (or number of udp " - "destinations)]\n\t[Jungfrau][Moench][Gotthard2]\n[0-63]\n\t[" - "Mythen3]\n\n\t One can set which is the first destination that the " - "detector will stream images out from in a round robin fashion. The " - "entry must not have been empty. Default: 0"); - - INTEGER_COMMAND_VEC_ID( - udp_srcmac, getSourceUDPMAC, setSourceUDPMAC, MacAddr, - "[x:x:x:x:x:x]\n\tMac address of the detector (source) udp " - "interface. \n\t[Eiger] Do not set as detector will replace with " - "its own DHCP Mac (1G) or DHCP Mac + 1 (10G)."); - - INTEGER_COMMAND_VEC_ID( - udp_srcmac2, getSourceUDPMAC2, setSourceUDPMAC2, MacAddr, - "[x:x:x:x:x:x]\n\t[Jungfrau][Moench] Mac address of the top " - "half or inner (source) udp interface. "); - - INTEGER_COMMAND_VEC_ID( - udp_dstmac, getDestinationUDPMAC, setDestinationUDPMAC, MacAddr, - "[x:x:x:x:x:x]\n\tMac address of the receiver (destination) udp " - "interface. Not mandatory to set as udp_dstip retrieves it from " - "slsReceiver process, but must be set if you use a custom receiver " - "(not slsReceiver). Use router mac if router between detector and " - "receiver."); - - INTEGER_COMMAND_VEC_ID( - udp_dstmac2, getDestinationUDPMAC2, setDestinationUDPMAC2, MacAddr, - "[x:x:x:x:x:x]\n\t[Jungfrau][Moench] Mac address of the receiver " - "(destination) udp interface 2. Not mandatory to set as udp_dstip2 " - "retrieves it from slsReceiver process but must be set if you use a " - "custom receiver (not slsReceiver). \n\t [Jungfrau][Moench] top half " - "or inner interface \n\t [Gotthard2] veto debugging. Use router mac if " - "router between detector and receiver."); - - INTEGER_COMMAND_VEC_ID_GET( - udp_dstport, getDestinationUDPPort, setDestinationUDPPort, - StringTo, - "[n]\n\tPort number of the receiver (destination) udp " - "interface. Default is 50001. \n\tIf multi command, ports for each " - "module is calculated (incremented by 1 if no 2nd interface)"); - - INTEGER_COMMAND_VEC_ID_GET( - udp_dstport2, getDestinationUDPPort2, setDestinationUDPPort2, - StringTo, - "[n]\n\t[Jungfrau][Moench][Eiger][Gotthard2] Port number of the " - "receiver (destination) udp interface 2. Default is 50002. " - "\n\tIf multi command, ports for each module is calculated " - "(incremented by 2) \n\t[Jungfrau][Moench] top half or inner " - "interface \n\t[Eiger] right half \n\t[Gotthard2] veto debugging"); - - EXECUTE_SET_COMMAND( - udp_reconfigure, reconfigureUDPDestination, - "\n\tReconfigures Detector with UDP destination. More for " - "debugging as the configuration is done automatically when the " - "detector has sufficient UDP details."); - - EXECUTE_SET_COMMAND( - udp_validate, validateUDPConfiguration, - "\n\tValidates that UDP configuration in the detector is " - "valid. If not configured, it will throw with error message " - "requesting missing udp information."); - - GET_COMMAND(rx_printconfig, printRxConfiguration, - "\n\tPrints the receiver configuration."); - - INTEGER_COMMAND_VEC_ID(tengiga, getTenGiga, setTenGiga, StringTo, - "[0, 1]\n\t[Eiger][Ctb][Mythen3] 10GbE Enable."); - - INTEGER_COMMAND_VEC_ID( - flowcontrol10g, getTenGigaFlowControl, setTenGigaFlowControl, - StringTo, - "[0, 1]\n\t[Eiger][Jungfrau][Moench] 10GbE Flow Control."); - - INTEGER_COMMAND_VEC_ID( - txdelay_frame, getTransmissionDelayFrame, setTransmissionDelayFrame, - StringTo, - "[n_delay]\n\t[Eiger][Jungfrau][Moench][Mythen3] Transmission " - "delay of first udp packet being streamed out of the " - "module.\n\t[Jungfrau][Moench] [0-31] Each value represents 1 " - "ms\n\t[Eiger] Additional delay to txdelay_left and txdelay_right. " - "Each value represents 10ns. Typical value is 50000.\n\t[Mythen3] " - "[0-16777215] Each value represents 8 ns (125 MHz clock), max is 134 " - "ms."); - - INTEGER_COMMAND_VEC_ID( - txdelay_left, getTransmissionDelayLeft, setTransmissionDelayLeft, - StringTo, - "[n_delay]\n\t[Eiger] Transmission delay of first packet in an " - "image being streamed out of the module's left UDP port. Each value " - "represents 10ns. Typical value is 50000."); - - INTEGER_COMMAND_VEC_ID( - txdelay_right, getTransmissionDelayRight, setTransmissionDelayRight, - StringTo, - "[n_delay]\n\t[Eiger] Transmission delay of first packet in an " - "image being streamed out of the module's right UDP port. Each value " - "represents 10ns. Typical value is 50000."); - - /* Receiver Config */ - - INTEGER_COMMAND_VEC_ID_GET( - rx_tcpport, getRxPort, setRxPort, StringTo, - "[port]\n\tTCP port for client-receiver communication. Default is " - "1954. Must be different if multiple receivers on same pc. Must be " - "first command to set a receiver parameter. Multi command will " - "automatically increment for individual modules."); - - INTEGER_COMMAND_VEC_ID( - rx_fifodepth, getRxFifoDepth, setRxFifoDepth, StringTo, - "[n_frames]\n\tSet the number of frames in the receiver " - "fifo depth (buffer between listener and writer threads)."); - - INTEGER_COMMAND_VEC_ID(rx_silent, getRxSilentMode, setRxSilentMode, - StringTo, - "[0, 1]\n\tSwitch on or off receiver text " - "output during acquisition."); - - INTEGER_COMMAND_VEC_ID( - rx_discardpolicy, getRxFrameDiscardPolicy, setRxFrameDiscardPolicy, - StringTo, - "[nodiscard (default)|discardempty|discardpartial(fastest)]\n\tFrame " - "discard policy of receiver. nodiscard does not discard frames, " - "discardempty discards empty frames, discardpartial discards partial " - "frames."); - - INTEGER_COMMAND_VEC_ID(rx_padding, getPartialFramesPadding, - setPartialFramesPadding, StringTo, - "[0, 1]\n\tPartial frames padding enable in the " - "receiver. Default: enabled. Disabling is fastest."); - - INTEGER_COMMAND_VEC_ID(rx_udpsocksize, getRxUDPSocketBufferSize, - setRxUDPSocketBufferSize, StringTo, - "[n_size]\n\tUDP socket buffer size in " - "receiver. Tune rmem_default and rmem_max " - "accordingly. Max value is INT_MAX/2."); - - GET_COMMAND(rx_realudpsocksize, getRxRealUDPSocketBufferSize, - "\n\tActual udp socket buffer size. Double the size of " - "rx_udpsocksize due to kernel bookkeeping."); - - INTEGER_COMMAND_VEC_ID(rx_lock, getRxLock, setRxLock, StringTo, - "[0, 1]\n\tLock receiver to one client IP, 1 locks, " - "0 unlocks. Default is unlocked."); - - GET_COMMAND( - rx_lastclient, getRxLastClientIP, - "\n\tClient IP Address that last communicated with the receiver."); - - GET_COMMAND( - rx_threads, getRxThreadIds, - "\n\tGet kernel thread ids from the receiver in order of [parent, " - "tcp, listener 0, processor 0, streamer 0, listener 1, processor 1, " - "streamer 1, arping]. If no streamer yet or there is no second " - "interface, it gives 0 in its place."); - - INTEGER_COMMAND_VEC_ID( - rx_arping, getRxArping, setRxArping, StringTo, - "[0, 1]\n\tStarts a thread in slsReceiver to arping " - "the interface it is listening to every minute. Useful in 10G mode."); - - EXECUTE_SET_COMMAND_NOID(rx_clearroi, clearRxROI, - "Resets Region of interest in receiver. Default " - "is all channels/pixels enabled."); - - /* File */ - - INTEGER_COMMAND_VEC_ID( - fformat, getFileFormat, setFileFormat, - StringTo, - "[binary|hdf5]\n\tFile format of data file. For " - "HDF5, package must be compiled with HDF5 flags. Default is binary."); - - STRING_COMMAND(fpath, getFilePath, setFilePath, - "[path]\n\tDirectory where output data files are written in " - "receiver. Default is '/'. \n\tIf path does not exist, it " - "will try to create it."); - - STRING_COMMAND(fname, getFileNamePrefix, setFileNamePrefix, - "[name]\n\tFile name prefix for output data file. Default " - "is run. File name: [file name prefix]_d[detector " - "index]_f[sub file index]_[acquisition/file index].raw."); - - INTEGER_COMMAND_VEC_ID(findex, getAcquisitionIndex, setAcquisitionIndex, - StringTo, - "[n_value]\n\tFile or Acquisition index."); - - INTEGER_COMMAND_VEC_ID( - fwrite, getFileWrite, setFileWrite, StringTo, - "[0, 1]\n\tEnable or disable receiver file write. Default is 1."); - - INTEGER_COMMAND_NOID( - fmaster, getMasterFileWrite, setMasterFileWrite, StringTo, - "[0, 1]\n\tEnable or disable receiver master file. Default is 1."); - - INTEGER_COMMAND_VEC_ID( - foverwrite, getFileOverWrite, setFileOverWrite, StringTo, - "[0, 1]\n\tEnable or disable file overwriting. Default is 1."); - - INTEGER_COMMAND_VEC_ID( - rx_framesperfile, getFramesPerFile, setFramesPerFile, StringTo, - "[n_frames]\n\tNumber of frames per file in receiver in an " - "acquisition. Default depends on detector type. 0 is infinite or " - "all " - "frames in single file."); - - /* ZMQ Streaming Parameters (Receiver<->Client) */ - - INTEGER_COMMAND_VEC_ID( - rx_zmqstream, getRxZmqDataStream, setRxZmqDataStream, StringTo, - "[0, 1]\n\tEnable/ disable data streaming from receiver via zmq " - "(eg. to GUI or to another process for further processing). This " - "creates/ destroys zmq streamer threads in receiver. \n\tSwitching to " - "Gui automatically enables data streaming in receiver. \n\tSwitching " - "back to command line acquire will require disabling data streaming in " - "receiver for fast applications. "); - - INTEGER_COMMAND_VEC_ID( - rx_zmqfreq, getRxZmqFrequency, setRxZmqFrequency, StringTo, - "[nth frame]\n\tFrequency of frames streamed out from receiver via " - "zmq\n\tDefault: 1, Means every frame is streamed out. \n\tIf 2, " - "every second frame is streamed out. \n\tIf 0, streaming timer is the " - "timeout, after which current frame is sent out. (default timeout is " - "500 ms). Usually used for gui purposes."); - - INTEGER_COMMAND_VEC_ID( - rx_zmqstartfnum, getRxZmqStartingFrame, setRxZmqStartingFrame, - StringTo, - "[fnum]\n\tThe starting frame index to stream out. 0 by " - "default, which streams the first frame in an acquisition, " - "and then depending on the rx zmq frequency/ timer"); - - INTEGER_COMMAND_VEC_ID_GET( - rx_zmqport, getRxZmqPort, setRxZmqPort, StringTo, - "[port]\n\tZmq port for data to be streamed out of the receiver. " - "Also restarts receiver zmq streaming if enabled. Default is 30001. " - "Modified only when using an intermediate process between receiver and " - "client(gui). Must be different for every detector (and udp port). " - "Multi command will automatically increment for individual modules."); - - INTEGER_COMMAND_VEC_ID_GET( - zmqport, getClientZmqPort, setClientZmqPort, StringTo, - "[port]\n\tZmq port in client(gui) or intermediate process for " - "data to be streamed to from receiver. Default connects to receiver " - "zmq streaming out port (30001). Modified only when using an " - "intermediate process between receiver and client(gui). Also restarts " - "client zmq streaming if enabled. Must be different for every detector " - "(and udp port). Multi command will automatically increment for " - "individual modules."); - - INTEGER_COMMAND_VEC_ID( - rx_zmqip, getRxZmqIP, setRxZmqIP, IpAddr, - "[x.x.x.x]\n\tZmq Ip Address from which data is to be streamed out " - "of the receiver. Also restarts receiver zmq streaming if enabled. " - "Default is from rx_hostname. Modified only when using an intermediate " - "process between receiver."); - - INTEGER_COMMAND_VEC_ID( - zmqip, getClientZmqIp, setClientZmqIp, IpAddr, - "[x.x.x.x]\n\tIp Address to listen to zmq data streamed out from " - "receiver or intermediate process. Default connects to receiver zmq Ip " - "Address (from rx_hostname). Modified only when using an intermediate " - "process between receiver and client(gui). Also restarts client zmq " - "streaming if enabled."); - - INTEGER_COMMAND_SET_NOID_GET_ID( - rx_zmqhwm, getRxZmqHwm, setRxZmqHwm, StringTo, - "[n_value]\n\tReceiver's zmq send high water mark. Default is the " - "zmq library's default (1000). This is a high number and can be set to " - "2 for gui purposes. One must also set the client's receive high water " - "mark to similar value. Final effect is sum of them. Also restarts " - "receiver zmq streaming if enabled. Can set to -1 to set default " - "value."); - - /* Eiger Specific */ - - TIME_COMMAND(subexptime, getSubExptime, setSubExptime, - "[duration] [(optional unit) ns|us|ms|s]\n\t[Eiger] Exposure " - "time of EIGER subframes in 32 bit mode."); - - TIME_COMMAND(subdeadtime, getSubDeadTime, setSubDeadTime, - "[duration] [(optional unit) ns|us|ms|s]\n\t[Eiger] Dead time " - "of EIGER subframes in 32 bit mode. Subperiod = subexptime + " - "subdeadtime."); - - INTEGER_COMMAND_VEC_ID( - overflow, getOverFlowMode, setOverFlowMode, StringTo, - "[0, 1]\n\t[Eiger] Enable or disable show overflow flag in " - "32 bit mode. Default is disabled."); - - INTEGER_COMMAND_VEC_ID( - interruptsubframe, getInterruptSubframe, setInterruptSubframe, - StringTo, - "[0, 1]\n\t[Eiger] 1 interrupts last subframe at required " - "exposure time. 0 will wait for last sub frame to finish " - "exposing. 0 is default."); - - TIME_GET_COMMAND(measuredperiod, getMeasuredPeriod, - "[(optional unit) ns|us|ms|s]\n\t[Eiger] Measured frame " - "period between last frame and previous one. Can be " - "measured with minimum 2 frames in an acquisition."); - - TIME_GET_COMMAND(measuredsubperiod, getMeasuredSubFramePeriod, - "[(optional unit) ns|us|ms|s]\n\t[Eiger] Measured sub " - "frame period between last sub frame and previous one."); - - INTEGER_COMMAND_VEC_ID(activate, getActive, setActive, StringTo, - "[0, 1] \n\t[Eiger] 1 is default. 0 deactivates " - "readout and does not send data."); - - INTEGER_COMMAND_VEC_ID( - partialreset, getPartialReset, setPartialReset, StringTo, - "[0, 1]\n\t[Eiger] Sets up detector to do " - "partial or complete reset at start of acquisition. 0 complete reset, " - "1 partial reset. Default is complete reset. Advanced function!"); - - INTEGER_COMMAND_VEC_ID( - top, getTop, setTop, StringTo, - "[0, 1]\n\t[Eiger] Sets half module to top (1), else bottom."); - - /* Jungfrau Specific */ - - GET_COMMAND(chipversion, getChipVersion, - "\n\t[Jungfrau] Returns chip version. Can be 1.0 or 1.1"); - - INTEGER_COMMAND_VEC_ID( - temp_threshold, getThresholdTemperature, setThresholdTemperature, - StringTo, - "[n_temp (in degrees)]\n\t[Jungfrau][Moench] Threshold temperature " - "in degrees. If temperature crosses threshold temperature and " - "temperature control is enabled, power to chip will be switched off " - "and temperature event occurs. To power on chip again, temperature has " - "to be less than threshold temperature and temperature event has to be " - "cleared."); - - INTEGER_COMMAND_VEC_ID( - temp_control, getTemperatureControl, setTemperatureControl, - StringTo, - "[0, 1]\n\t[Jungfrau][Moench] Temperature control enable. Default " - "is 0 (disabled). If temperature crosses threshold temperature and " - "temperature control is enabled, power to chip will be switched off " - "and temperature event occurs. To power on chip again, temperature has " - "to be less than threshold temperature and temperature event has to be " - "cleared."); - - INTEGER_COMMAND_VEC_ID( - autocompdisable, getAutoComparatorDisable, setAutoComparatorDisable, - StringTo, - "[0, 1]\n\t[Jungfrau] Auto comparator disable mode. By " - "default, the on-chip gain switching is active during the entire " - "exposure.This mode disables the on - chip gain switching " - "comparator automatically after 93.75% (only for chipv1.0) of exposure " - "time (only for longer than 100us). It is possible to set the duration " - "for chipv1.1 using compdisabletime command.\n\tDefault is 0 or this " - "mode disabled(comparator enabled throughout). 1 enables mode. 0 " - "disables mode. "); - - TIME_COMMAND(compdisabletime, getComparatorDisableTime, - setComparatorDisableTime, - "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau] Time " - "before end of exposure when comparator is disabled. It is " - "only possible for chipv1.1."); - - INTEGER_COMMAND_SET_NOID_GET_ID( - extrastoragecells, getNumberOfAdditionalStorageCells, - setNumberOfAdditionalStorageCells, StringTo, - "[0-15]\n\t[Jungfrau] Only for chipv1.0. Number of additional " - "storage cells. Default is 0. For advanced users only. \n\tThe #images " - "= #frames x #triggers x (#extrastoragecells + 1)."); - - INTEGER_COMMAND_VEC_ID( - storagecell_start, getStorageCellStart, setStorageCellStart, - StringTo, - "[0-max]\n\t[Jungfrau] Storage cell that stores " - "the first acquisition of the series. max is 15 (default) for chipv1.0 " - "and 3 (default) for chipv1.1. For advanced users only."); - - TIME_COMMAND(storagecell_delay, getStorageCellDelay, setStorageCellDelay, - "[duration (0-1638375 ns)] [(optional unit) " - "ns|us|ms|s]\n\t[Jungfrau] Additional time delay between 2 " - "consecutive exposures in burst mode (resolution of 25ns). " - "Only applicable for chipv1.0. For advanced users only."); - - INTEGER_COMMAND_VEC_ID( - gainmode, getGainMode, setGainMode, StringTo, - "[dynamicgain|forceswitchg1|forceswitchg2|fixg1|fixg2|fixg0]\n\t[" - "Jungfrau] Gain mode.\n\tCAUTION: Do not use fixg0 without " - "caution, you can damage the detector!!!"); - - INTEGER_COMMAND_VEC_ID(filtercells, getNumberOfFilterCells, - setNumberOfFilterCells, StringTo, - "[0-12]\n\t[Jungfrau] Set Filter Cell. Only for " - "chipv1.1. Advanced user Command"); - - /* Gotthard Specific */ - TIME_GET_COMMAND(exptimel, getExptimeLeft, - "[(optional unit) ns|us|ms|s]\n\t[Gotthard] Exposure time " - "left for current frame. "); - - EXECUTE_SET_COMMAND(clearroi, clearROI, - "[Gotthard] Resets Region of interest in detector. All " - "channels enabled. Default is all channels enabled."); - - /* Gotthard2 Specific */ - INTEGER_COMMAND_SET_NOID_GET_ID( - bursts, getNumberOfBursts, setNumberOfBursts, StringTo, - "[n_bursts]\n\t[Gotthard2] Number of bursts per aquire. Only in auto " - "timing mode and burst mode. Use timing command to set timing mode and " - "burstmode command to set burst mode."); - - TIME_COMMAND(burstperiod, getBurstPeriod, setBurstPeriod, - "[duration] [(optional unit) ns|us|ms|s]\n\t[Gotthard2] " - "Period between 2 bursts. Only in burst mode and auto " - "timing mode."); - - GET_COMMAND(burstsl, getNumberOfBurstsLeft, - "\n\t[Gotthard2] Number of bursts left in acquisition. Only in " - "burst auto mode."); - - INTEGER_COMMAND_VEC_ID( - cdsgain, getCDSGain, setCDSGain, StringTo, - "[0, 1]\n\t[Gotthard2] Enable or disable CDS gain. Default " - "is disabled."); - - INTEGER_COMMAND_VEC_ID( - timingsource, getTimingSource, setTimingSource, - StringTo, - "[internal|external]\n\t[Gotthard2] Timing source. Internal is " - "crystal and external is system timing. Default is internal."); - - INTEGER_COMMAND_VEC_ID(veto, getVeto, setVeto, StringTo, - "[0, 1]\n\t[Gotthard2] Enable or disable veto data " - "data from chip. Default is 0."); - - /* Mythen3 Specific */ - - INTEGER_COMMAND_VEC_ID( - gates, getNumberOfGates, setNumberOfGates, StringTo, - "[n_gates]\n\t[Mythen3] Number of external gates in gating " - "or trigger_gating mode (external gating)."); - - INTEGER_COMMAND_VEC_ID(polarity, getPolarity, setPolarity, - StringTo, - "[pos|neg]\n\t[Mythen3] Sets negative or positive " - "polarity. Default is positive"); - - INTEGER_COMMAND_VEC_ID(interpolation, getInterpolation, setInterpolation, - StringTo, - "[0, 1]\n\t[Mythen3] Enables or disables " - "interpolation. Default is disabled. Interpolation " - "mode enables all counters and disables vth3. " - "Disabling sets back counter mask and vth3."); - - INTEGER_COMMAND_VEC_ID( - pumpprobe, getPumpProbe, setPumpProbe, StringTo, - "[0, 1]\n\t[Mythen3] Enables or disables pump probe " - "mode. Default is disabled. Pump probe mode only enables vth2. " - "Disabling sets back to previous value."); - - INTEGER_COMMAND_VEC_ID(apulse, getAnalogPulsing, setAnalogPulsing, - StringTo, - "[0, 1]\n\t[Mythen3] Enables or disables analog " - "pulsing. Default is disabled"); - - INTEGER_COMMAND_VEC_ID(dpulse, getDigitalPulsing, setDigitalPulsing, - StringTo, - "[0, 1]\n\t[Mythen3] Enables or disables digital " - "pulsing. Default is disabled"); - - /* CTB/ Moench Specific */ - - INTEGER_COMMAND_VEC_ID( - asamples, getNumberOfAnalogSamples, setNumberOfAnalogSamples, - StringTo, - "[n_samples]\n\t[CTB] Number of analog samples expected."); - - INTEGER_COMMAND_VEC_ID( - adcclk, getADCClock, setADCClock, StringTo, - "[n_clk in MHz]\n\t[Ctb] ADC clock frequency in MHz."); - - INTEGER_COMMAND_VEC_ID(runclk, getRUNClock, setRUNClock, StringTo, - "[n_clk in MHz]\n\t[Ctb] Run clock in MHz."); - - GET_COMMAND(syncclk, getSYNCClock, - "[n_clk in MHz]\n\t[Ctb] Sync clock in MHz."); - - INTEGER_IND_COMMAND(v_limit, getPower, setPower, StringTo, - defs::V_LIMIT, - "[n_value]\n\t[Ctb] Soft limit for power " - "supplies (ctb only) and DACS in mV."); - - INTEGER_COMMAND_HEX(adcenable, getADCEnableMask, setADCEnableMask, - StringTo, - "[bitmask]\n\t[Ctb] ADC Enable Mask for 1Gb " - "Enable for each 32 ADC channel."); - - INTEGER_COMMAND_HEX( - adcenable10g, getTenGigaADCEnableMask, setTenGigaADCEnableMask, - StringTo, - "[bitmask]\n\t[Ctb] ADC Enable Mask for 10Gb mode for each 32 " - "ADC channel. However, if any of a consecutive 4 bits are enabled, " - "the complete 4 bits are enabled."); - - INTEGER_COMMAND_HEX(transceiverenable, getTransceiverEnableMask, - setTransceiverEnableMask, StringTo, - "[bitmask]\n\t[Ctb] Transceiver Enable Mask. Enable " - "for each 4 Transceiver channel."); - - INTEGER_COMMAND_VEC_ID( - dsamples, getNumberOfDigitalSamples, setNumberOfDigitalSamples, - StringTo, - "[n_value]\n\t[CTB] Number of digital samples expected."); - - INTEGER_COMMAND_VEC_ID( - tsamples, getNumberOfTransceiverSamples, setNumberOfTransceiverSamples, - StringTo, - "[n_value]\n\t[CTB] Number of transceiver samples expected."); - - INTEGER_COMMAND_VEC_ID( - romode, getReadoutMode, setReadoutMode, - StringTo, - "[analog|digital|analog_digital|transceiver|digital_transceiver]\n\t[" - "CTB] Readout mode. Default is analog."); - - INTEGER_COMMAND_VEC_ID(dbitclk, getDBITClock, setDBITClock, StringTo, - "[n_clk in MHz]\n\t[Ctb] Clock for latching the " - "digital bits in MHz."); - - INTEGER_IND_COMMAND(v_a, getPower, setPower, StringTo, defs::V_POWER_A, - "[n_value]\n\t[Ctb] Power supply a in mV."); - - INTEGER_IND_COMMAND(v_b, getPower, setPower, StringTo, defs::V_POWER_B, - "[n_value]\n\t[Ctb] Power supply b in mV."); - - INTEGER_IND_COMMAND(v_c, getPower, setPower, StringTo, defs::V_POWER_C, - "[n_value]\n\t[Ctb] Power supply c in mV."); - - INTEGER_IND_COMMAND(v_d, getPower, setPower, StringTo, defs::V_POWER_D, - "[n_value]\n\t[Ctb] Power supply d in mV."); - - INTEGER_IND_COMMAND( - v_io, getPower, setPower, StringTo, defs::V_POWER_IO, - "[n_value]\n\t[Ctb] Power supply io in mV. Minimum 1200 mV. Must " - "be the first power regulator to be set after fpga reset (on-board " - "detector server start up)."); - - INTEGER_IND_COMMAND( - v_chip, getPower, setPower, StringTo, defs::V_POWER_CHIP, - "[n_value]\n\t[Ctb] Power supply chip in mV. Do not use it " - "unless " - "you are completely sure you will not fry the board."); - - GET_IND_COMMAND(vm_a, getMeasuredPower, defs::V_POWER_A, "", - "\n\t[Ctb] Measured voltage of power supply a in mV."); - - GET_IND_COMMAND(vm_b, getMeasuredPower, defs::V_POWER_B, "", - "\n\t[Ctb] Measured voltage of power supply b in mV."); - - GET_IND_COMMAND(vm_c, getMeasuredPower, defs::V_POWER_C, "", - "\n\t[Ctb] Measured voltage of power supply c in mV."); - - GET_IND_COMMAND(vm_d, getMeasuredPower, defs::V_POWER_D, "", - "\n\t[Ctb] Measured voltage of power supply d in mV."); - - GET_IND_COMMAND(vm_io, getMeasuredPower, defs::V_POWER_IO, "", - "\n\t[Ctb] Measured voltage of power supply io in mV."); - - GET_IND_COMMAND(im_a, getMeasuredCurrent, defs::I_POWER_A, "", - "\n\t[Ctb] Measured current of power supply a in mA."); - - GET_IND_COMMAND(im_b, getMeasuredCurrent, defs::I_POWER_B, "", - "\n\t[Ctb] Measured current of power supply b in mA."); - - GET_IND_COMMAND(im_c, getMeasuredCurrent, defs::I_POWER_C, "", - "\n\t[Ctb] Measured current of power supply c in mA."); - - GET_IND_COMMAND(im_d, getMeasuredCurrent, defs::I_POWER_D, "", - "\n\t[Ctb] Measured current of power supply d in mA."); - - GET_IND_COMMAND(im_io, getMeasuredCurrent, defs::I_POWER_IO, "", - "\n\t[Ctb] Measured current of power supply io in mA."); - - INTEGER_COMMAND_VEC_ID( - extsampling, getExternalSampling, setExternalSampling, StringTo, - "[0, 1]\n\t[Ctb] Enable for external sampling signal for digital " - "data to signal by extsampling src command. For advanced users only."); - - INTEGER_COMMAND_VEC_ID( - extsamplingsrc, getExternalSamplingSource, setExternalSamplingSource, - StringTo, - "[0-63]\n\t[Ctb] Sampling source signal for digital data. " - "For advanced users only."); - - INTEGER_COMMAND_VEC_ID( - rx_dbitoffset, getRxDbitOffset, setRxDbitOffset, StringTo, - "[n_bytes]\n\t[Ctb] Offset in bytes in digital data to " - "skip in receiver."); - - INTEGER_COMMAND_VEC_ID(led, getLEDEnable, setLEDEnable, StringTo, - "[0, 1]\n\t[Ctb] Switches on/off all LEDs."); - - /* Pattern */ - - GET_COMMAND(patfname, getPatterFileName, - "\n\t[Ctb][Mythen3] Gets the pattern file name including " - "path of the last pattern uploaded. Returns an empty if " - "nothing was uploaded or via a server default file"); - - EXECUTE_SET_COMMAND_NOID_1ARG( - savepattern, savePattern, - "[fname]\n\t[Ctb][Mythen3] Saves pattern to file (ascii). " - "\n\t[Ctb] Also executes pattern."); - - EXECUTE_SET_COMMAND( - defaultpattern, loadDefaultPattern, - "\n\t[Mythen3] Loads and runs default pattern in pattern " - "generator. It is to go back to initial settings."); - - INTEGER_COMMAND_HEX_WIDTH16(patioctrl, getPatternIOControl, - setPatternIOControl, StringTo, - "[64 bit mask]\n\t[Ctb] 64 bit mask " - "defining input (0) and output (1) signals."); - - INTEGER_COMMAND_HEX_WIDTH16( - patmask, getPatternMask, setPatternMask, StringTo, - "[64 bit mask]\n\t[Ctb][Mythen3] Selects the bits that will " - "have a pattern mask applied to the selected patmask for every " - "pattern."); - - INTEGER_COMMAND_HEX_WIDTH16( - patsetbit, getPatternBitMask, setPatternBitMask, StringTo, - "[64 bit mask]\n\t[Ctb][Mythen3] Sets the mask applied to " - "every pattern to the selected bits."); - - EXECUTE_SET_COMMAND(patternstart, startPattern, - "\n\t[Mythen3] Starts Pattern"); - - /* Moench */ - /* Advanced */ - - INTEGER_COMMAND_VEC_ID( - adcpipeline, getADCPipeline, setADCPipeline, StringTo, - "[n_value]\n\t[Ctb][Moench] Pipeline for ADC clock."); - - EXECUTE_SET_COMMAND(resetfpga, resetFPGA, - "\n\t[Jungfrau][Moench][Ctb] Reset FPGA."); - - EXECUTE_SET_COMMAND(rebootcontroller, rebootController, - "\n\t[Jungfrau][Moench][Ctb][Gotthard][Mythen3][" - "Gotthard2] Reboot controller of detector."); - - INTEGER_COMMAND_VEC_ID( - updatemode, getUpdateMode, setUpdateMode, StringTo, - "[0|1]\n\tRestart the detector server in update " - "mode or not. This is useful when server-firmware compatibility is at " - "its worst and server cannot start up normally"); - - EXECUTE_SET_COMMAND( - firmwaretest, executeFirmwareTest, - "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] " - "Firmware test, ie. reads a read fixed pattern from a register."); - - EXECUTE_SET_COMMAND( - bustest, executeBusTest, - "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Bus " - "test, ie. Writes different values in a R/W register and confirms the " - "writes to check bus.\n\tAdvanced User function!"); - - INTEGER_COMMAND_HEX( - adcinvert, getADCInvert, setADCInvert, StringTo, - "[bitmask]\n\t[Ctb][Jungfrau][Moench] ADC Inversion " - "Mask.\n\t[Jungfrau][Moench] Inversions on top of the default mask."); - - /* Insignificant */ - - INTEGER_COMMAND_VEC_ID( - port, getControlPort, setControlPort, StringTo, - "[n]\n\tPort number of the control server on detector for " - "detector-client tcp interface. Default is 1952. Normally unchanged. " - "Set different ports for virtual servers on same pc."); - - INTEGER_COMMAND_VEC_ID( - stopport, getStopPort, setStopPort, StringTo, - "[n]\n\tPort number of the stop server on detector for detector-client " - "tcp interface. Default is 1953. Normally unchanged."); - - INTEGER_COMMAND_VEC_ID( - lock, getDetectorLock, setDetectorLock, StringTo, - "[0, 1]\n\tLock detector to one IP, 1: locks. Default is unlocked"); - - GET_COMMAND( - lastclient, getLastClientIP, - "\n\tClient IP Address that last communicated with the detector."); - - GET_COMMAND( - framecounter, getNumberOfFramesFromStart, - "\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames from " - "start run control.\n\t[Gotthard2] only in continuous mode."); - - TIME_GET_COMMAND(runtime, getActualTime, - "[(optional unit) " - "ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][" - "CTB] Time from detector start up.\n\t[Gotthard2] not in " - "burst and auto mode."); - - TIME_GET_COMMAND(frametime, getMeasurementTime, - "[(optional unit) " - "ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][" - "CTB] Timestamp at a frame start.\n\t[Gotthard2] not in " - "burst and auto mode."); -}; - -} // namespace sls diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 4ac8f2d44..56eb77fa9 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -4,7 +4,7 @@ #include "sls/detectorData.h" #include "CmdParser.h" -#include "CmdProxy.h" +#include "Caller.h" #include "CtbConfig.h" #include "DetectorImpl.h" #include "Module.h" @@ -91,11 +91,11 @@ void Detector::loadParameters(const std::string &fname) { } void Detector::loadParameters(const std::vector ¶meters) { - CmdProxy proxy(this); + Caller caller(this); CmdParser parser; for (const auto ¤t_line : parameters) { parser.Parse(current_line); - proxy.Call(parser.command(), parser.arguments(), parser.detector_id(), + caller.call(parser.command(), parser.arguments(), parser.detector_id(), defs::PUT_ACTION, std::cout, parser.receiver_id()); } } diff --git a/slsDetectorSoftware/src/HelpDacs.cpp b/slsDetectorSoftware/src/HelpDacs.cpp new file mode 100644 index 000000000..9ce150bd1 --- /dev/null +++ b/slsDetectorSoftware/src/HelpDacs.cpp @@ -0,0 +1,319 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#include "sls/string_utils.h" +#include "sls/sls_detector_defs.h" +#include + +namespace sls { + +std::string GetHelpDac(std::string dac) { + if (sls::is_int(dac)) { + return std::string("[dac name] [dac or mV value] [(optional unit) mV] " + "\n\t[Ctb] Use dac index for dac name."); + } + if (dac == "vthreshold") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger][Mythen3] " + "Detector threshold voltage for single photon counters.\n\t[Eiger] " + "Sets vcmp_ll, vcmp_lr, vcmp_rl, vcmp_rr and vcp to the same " + "value. \n\t[Mythen3] Sets vth1, vth2 and vth3 to the same value " + "for enabled counters."); + } + if (dac == "vsvp") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ?? "); + } + if (dac == "vsvn") { + return std::string("[dac or mV value][(optional unit) mV] \n\t[Eiger] " + "Dac for ?? \n\t[Mythen3] voltage to define " + "feedback resistance of the first shaper"); + } + if (dac == "vtrim") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ?? " + "\n\t[Mythen3] Dac for the voltage defining the trim bit size."); + } + if (dac == "vrpreamp") { + return std::string("[dac or mV value][(optional unit) mV] \n\t[Eiger] " + "Dac for ?? \n\t[Mythen3] voltage to define the " + "preamplifier feedback resistance."); + } + if (dac == "vrshaper") { + return std::string("[dac or mV value][(optional unit) mV] \n\t[Eiger] " + "Dac for ?? \n\t[Mythen3] voltage to define " + "feedback resistance of the first shaper"); + } + if (dac == "vtgstv") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "vcmp_ll") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "vcmp_lr") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "vcal") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "vcmp_rl") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "vcmp_rr") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "rxb_rb") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "rxb_lb") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "vcp") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "vcn") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "vishaper") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "iodelay") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); + } + if (dac == "vref_ds") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Gotthard][Jungfrau] Dac for ??"); + } + if (dac == "vcascn_pb") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard] Dac for ??"); + } + if (dac == "vcascp_pb") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard] Dac for ??"); + } + if (dac == "vout_cm") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Gotthard] Dac for ??\n\t[Moench] Dac for 5"); + } + if (dac == "vcasc_out") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard] Dac for ??"); + } + if (dac == "vin_cm") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Gotthard] Dac for ??\n\t[Moench] Dac for 2"); + } + if (dac == "vref_comp") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Gotthard][Jungfrau] Dac for ??"); + } + if (dac == "ib_test_c") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard] Dac for ??"); + } + if (dac == "vrshaper_n") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] voltage to " + "define feedback resistance of the second shaper."); + } + if (dac == "vipre") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " + "preamplifier's input transistor current.\n\t[Moench] Dac for 1"); + } + if (dac == "vdcsh") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " + "reference (DC) voltage for the shaper."); + } + if (dac == "vth1") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for first " + "detector threshold voltage. Overwrites even if counter disabled."); + } + if (dac == "vth2") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for " + "second detector threshold voltage. Overwrites even if counter " + "disabled."); + } + if (dac == "vth3") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for third " + "detector threshold voltage. Overwrites even if counter disabled."); + } + if (dac == "vcal_n") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " + "low voltage for analog pulsing."); + } + if (dac == "vcal_p") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " + "high voltage for analog pulsing."); + } + if (dac == "vcassh") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " + "shaper's cascode voltage."); + } + if (dac == "vcas") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " + "preamplifier's cascode voltage."); + } + if (dac == "vicin") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " + "bias current for the comparator."); + } + if (dac == "vipre_out") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for " + "preamplifier's output transistor current."); + } + if (dac == "vref_h_adc") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "reference voltage high of ADC."); + } + if (dac == "vb_comp_fe") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "comparator current of analogue front end."); + } + if (dac == "vb_comp_adc") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "comparator current of ADC."); + } + if (dac == "vcom_cds") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "common mode voltage of CDS stage."); + } + if (dac == "vref_rstore") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Gotthard2] Dac for reference charging voltage " + "of temparory storage cell in high gain."); + } + if (dac == "vb_opa_1st") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] dac dac for " + "opa current for driving the other DACs in chip."); + } + if (dac == "vref_comp_fe") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "reference voltage of the comparator of analogue front end."); + } + if (dac == "vcom_adc1") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "common mode voltage of ADC DAC bank 1."); + } + if (dac == "vref_prech") { + return std::string( + "[dac or mV value][(optional unit) mV] " + "\n\t[Gotthard2][Jungfrau] " + "Dac for reference votlage for precharing the preamplifier."); + } + if (dac == "vref_l_adc") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "reference voltage low for ADC."); + } + if (dac == "vref_cds") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "reference voltage of CDS applied to the temporary storage cell in " + "medium and low gain."); + } + if (dac == "vb_cs") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "current injection into preamplifier."); + } + if (dac == "vb_opa_fd") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "current for CDS opa stage."); + } + if (dac == "vcom_adc2") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " + "common mode voltage of ADC DAC bank 2."); + } + if (dac == "vb_ds") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau] Dac for ??"); + } + if (dac == "vb_comp") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau] Dac for ??"); + } + if (dac == "vb_pixbuf") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau] Dac for ??"); + } + if (dac == "vin_com") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau] Dac for ??"); + } + if (dac == "vdd_prot") { + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau] Dac for ??"); + } + if (dac == "vbp_colbuf") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 0"); + } + if (dac == "vb_sda") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 3"); + } + if (dac == "vcasc_sfp") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 4"); + } + if (dac == "vipre_cds") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 6"); + } + if (dac == "ibias_sfp") { + return std::string( + "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 7"); + } + + // clang-format off + if (dac == "vtgstv") { return std::string(""); } + // clang-format on + + throw sls::RuntimeError("Unknown dac command"); +} + +std::string GetHelpDacWrapper(const std::string &cmd, + const std::vector &args) { + std::ostringstream os; + os << cmd << ' '; + if (args.size() == 0) { + os << GetHelpDac(std::to_string(0)) << '\n'; + } else { + os << args[0] << ' ' << GetHelpDac(args[0]) << '\n'; + } + return os.str(); +} + +} // namespace sls diff --git a/slsDetectorSoftware/src/HelpDacs.h b/slsDetectorSoftware/src/HelpDacs.h index 75c87710e..4c2c8cd9e 100644 --- a/slsDetectorSoftware/src/HelpDacs.h +++ b/slsDetectorSoftware/src/HelpDacs.h @@ -1,305 +1,13 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "sls/string_utils.h" +#include +#include namespace sls { -std::string GetHelpDac(std::string dac) { - if (sls::is_int(dac)) { - return std::string("[dac name] [dac or mV value] [(optional unit) mV] " - "\n\t[Ctb] Use dac index for dac name."); - } - if (dac == "vthreshold") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger][Mythen3] " - "Detector threshold voltage for single photon counters.\n\t[Eiger] " - "Sets vcmp_ll, vcmp_lr, vcmp_rl, vcmp_rr and vcp to the same " - "value. \n\t[Mythen3] Sets vth1, vth2 and vth3 to the same value " - "for enabled counters."); - } - if (dac == "vsvp") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ?? "); - } - if (dac == "vsvn") { - return std::string("[dac or mV value][(optional unit) mV] \n\t[Eiger] " - "Dac for ?? \n\t[Mythen3] voltage to define " - "feedback resistance of the first shaper"); - } - if (dac == "vtrim") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ?? " - "\n\t[Mythen3] Dac for the voltage defining the trim bit size."); - } - if (dac == "vrpreamp") { - return std::string("[dac or mV value][(optional unit) mV] \n\t[Eiger] " - "Dac for ?? \n\t[Mythen3] voltage to define the " - "preamplifier feedback resistance."); - } - if (dac == "vrshaper") { - return std::string("[dac or mV value][(optional unit) mV] \n\t[Eiger] " - "Dac for ?? \n\t[Mythen3] voltage to define " - "feedback resistance of the first shaper"); - } - if (dac == "vtgstv") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "vcmp_ll") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "vcmp_lr") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "vcal") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "vcmp_rl") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "vcmp_rr") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "rxb_rb") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "rxb_lb") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "vcp") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "vcn") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "vishaper") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "iodelay") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Eiger] Dac for ??"); - } - if (dac == "vref_ds") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard][Jungfrau] Dac for ??"); - } - if (dac == "vcascn_pb") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard] Dac for ??"); - } - if (dac == "vcascp_pb") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard] Dac for ??"); - } - if (dac == "vout_cm") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard] Dac for ??\n\t[Moench] Dac for 5"); - } - if (dac == "vcasc_out") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard] Dac for ??"); - } - if (dac == "vin_cm") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard] Dac for ??\n\t[Moench] Dac for 2"); - } - if (dac == "vref_comp") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard][Jungfrau] Dac for ??"); - } - if (dac == "ib_test_c") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard] Dac for ??"); - } - if (dac == "vrshaper_n") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] voltage to " - "define feedback resistance of the second shaper."); - } - if (dac == "vipre") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " - "preamplifier's input transistor current.\n\t[Moench] Dac for 1"); - } - if (dac == "vdcsh") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " - "reference (DC) voltage for the shaper."); - } - if (dac == "vth1") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for first " - "detector threshold voltage. Overwrites even if counter disabled."); - } - if (dac == "vth2") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for " - "second detector threshold voltage. Overwrites even if counter " - "disabled."); - } - if (dac == "vth3") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for third " - "detector threshold voltage. Overwrites even if counter disabled."); - } - if (dac == "vcal_n") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " - "low voltage for analog pulsing."); - } - if (dac == "vcal_p") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " - "high voltage for analog pulsing."); - } - if (dac == "vcassh") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " - "shaper's cascode voltage."); - } - if (dac == "vcas") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " - "preamplifier's cascode voltage."); - } - if (dac == "vicin") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " - "bias current for the comparator."); - } - if (dac == "vipre_out") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for " - "preamplifier's output transistor current."); - } - if (dac == "vref_h_adc") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "reference voltage high of ADC."); - } - if (dac == "vb_comp_fe") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "comparator current of analogue front end."); - } - if (dac == "vb_comp_adc") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "comparator current of ADC."); - } - if (dac == "vcom_cds") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "common mode voltage of CDS stage."); - } - if (dac == "vref_rstore") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard2] Dac for reference charging voltage " - "of temparory storage cell in high gain."); - } - if (dac == "vb_opa_1st") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] dac dac for " - "opa current for driving the other DACs in chip."); - } - if (dac == "vref_comp_fe") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "reference voltage of the comparator of analogue front end."); - } - if (dac == "vcom_adc1") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "common mode voltage of ADC DAC bank 1."); - } - if (dac == "vref_prech") { - return std::string( - "[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard2][Jungfrau] " - "Dac for reference votlage for precharing the preamplifier."); - } - if (dac == "vref_l_adc") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "reference voltage low for ADC."); - } - if (dac == "vref_cds") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "reference voltage of CDS applied to the temporary storage cell in " - "medium and low gain."); - } - if (dac == "vb_cs") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "current injection into preamplifier."); - } - if (dac == "vb_opa_fd") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "current for CDS opa stage."); - } - if (dac == "vcom_adc2") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2] Dac for " - "common mode voltage of ADC DAC bank 2."); - } - if (dac == "vb_ds") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Jungfrau] Dac for ??"); - } - if (dac == "vb_comp") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Jungfrau] Dac for ??"); - } - if (dac == "vb_pixbuf") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Jungfrau] Dac for ??"); - } - if (dac == "vin_com") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Jungfrau] Dac for ??"); - } - if (dac == "vdd_prot") { - return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Jungfrau] Dac for ??"); - } - if (dac == "vbp_colbuf") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 0"); - } - if (dac == "vb_sda") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 3"); - } - if (dac == "vcasc_sfp") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 4"); - } - if (dac == "vipre_cds") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 6"); - } - if (dac == "ibias_sfp") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 7"); - } +std::string GetHelpDac(std::string dac); - // clang-format off - if (dac == "vtgstv") { return std::string(""); } - // clang-format on - - throw sls::RuntimeError("Unknown dac command"); -} +std::string GetHelpDacWrapper(const std::string &cmd, + const std::vector &args); } // namespace sls diff --git a/slsDetectorSoftware/src/inferAction.cpp b/slsDetectorSoftware/src/inferAction.cpp new file mode 100644 index 000000000..c10087bd2 --- /dev/null +++ b/slsDetectorSoftware/src/inferAction.cpp @@ -0,0 +1,4592 @@ +#include "inferAction.h" + +#include "sls/sls_detector_defs.h" + +namespace sls { + +int InferAction::infer(sls::CmdParser &parser, std::ostream &os) { + + args = parser.arguments(); + + cmd = parser.command(); + + auto it = functions.find(parser.command()); + + if (it != functions.end()) { + + return ((*this).*(it->second))(); + + } else { + + throw RuntimeError("det not implemented for command: " + + + parser.command()); + } +} + +int InferAction::acquire() { + + if (args.size() == 0) { + throw RuntimeError("det is disabled for command: acquire with number " + "of arguments 0. Use detg or detp"); + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::activate() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adcclk() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adcenable() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adcenable10g() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adcindex() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adcinvert() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adclist() { + + throw RuntimeError( + "det is disabled for command: adclist. Use detg or detp"); +} + +int InferAction::adcname() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adcphase() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: adcphase with number " + "of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adcpipeline() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adcreg() { + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::adcvpp() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: adcvpp with number of " + "arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::apulse() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::asamples() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::autocompdisable() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::badchannels() { + + throw RuntimeError( + "det is disabled for command: badchannels. Use detg or detp"); +} + +int InferAction::blockingtrigger() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::burstmode() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::burstperiod() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: burstperiod with " + "number of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::bursts() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::burstsl() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::bustest() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::cdsgain() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::chipversion() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::clearbit() { + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::clearbusy() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::clearroi() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::clientversion() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::clkdiv() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::clkfreq() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::clkphase() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + throw RuntimeError("det is disabled for command: clkphase with number " + "of arguments 2. Use detg or detp"); + } + + if (args.size() == 3) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::column() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::compdisabletime() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: compdisabletime with " + "number of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::confadc() { + + if (args.size() == 2) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 3) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::config() { + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::counters() { + + throw RuntimeError( + "det is disabled for command: counters. Use detg or detp"); +} + +int InferAction::currentsource() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 3) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 4) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::dac() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + throw RuntimeError("det is disabled for command: dac with number of " + "arguments 2. Use detg or detp"); + } + + if (args.size() == 3) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::dacindex() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::daclist() { + + throw RuntimeError( + "det is disabled for command: daclist. Use detg or detp"); +} + +int InferAction::dacname() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::dacvalues() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::datastream() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::dbitclk() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::dbitphase() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: dbitphase with number " + "of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::dbitpipeline() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::defaultdac() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + throw RuntimeError("det is disabled for command: defaultdac with " + "number of arguments 2. Use detg or detp"); + } + + if (args.size() == 3) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::defaultpattern() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::delay() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: delay with number of " + "arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::delayl() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::detectorserverversion() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::detsize() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::diodelay() { + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::dpulse() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::dr() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::drlist() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::dsamples() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::execcommand() { + + throw RuntimeError( + "det is disabled for command: execcommand. Use detg or detp"); +} + +int InferAction::exptime() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: exptime with number " + "of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::exptime1() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: exptime1 with number " + "of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::exptime2() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: exptime2 with number " + "of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::exptime3() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: exptime3 with number " + "of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::exptimel() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::extrastoragecells() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::extsampling() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::extsamplingsrc() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::extsig() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::fformat() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::filtercells() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::filterresistor() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::findex() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::firmwaretest() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::firmwareversion() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::fliprows() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::flowcontrol10g() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::fmaster() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::fname() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::foverwrite() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::fpath() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::framecounter() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::frames() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::framesl() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::frametime() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::free() { + + if (args.size() == 0) { + throw RuntimeError("det is disabled for command: free with number of " + "arguments 0. Use detg or detp"); + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::fwrite() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::gaincaps() { + + throw RuntimeError( + "det is disabled for command: gaincaps. Use detg or detp"); +} + +int InferAction::gainmode() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::gappixels() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::gatedelay() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: gatedelay with number " + "of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::gatedelay1() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: gatedelay1 with " + "number of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::gatedelay2() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: gatedelay2 with " + "number of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::gatedelay3() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: gatedelay3 with " + "number of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::gates() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::getbit() { + + if (args.size() == 2) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::hardwareversion() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::highvoltage() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::hostname() { + + throw RuntimeError( + "det is disabled for command: hostname. Use detg or detp"); +} + +int InferAction::im_a() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::im_b() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::im_c() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::im_d() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::im_io() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::imagetest() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::initialchecks() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::inj_ch() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::interpolation() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::interruptsubframe() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::kernelversion() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::lastclient() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::led() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::lock() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::master() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::maxadcphaseshift() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::maxclkphaseshift() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::maxdbitphaseshift() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::measuredperiod() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::measuredsubperiod() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::moduleid() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::nextframenumber() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::nmod() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::numinterfaces() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::overflow() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::packageversion() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::parallel() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::parameters() { + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::partialreset() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::patfname() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::patioctrl() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::patlimits() { + + throw RuntimeError( + "det is disabled for command: patlimits. Use detg or detp"); +} + +int InferAction::patloop() { + + throw RuntimeError( + "det is disabled for command: patloop. Use detg or detp"); +} + +int InferAction::patloop0() { + + throw RuntimeError( + "det is disabled for command: patloop0. Use detg or detp"); +} + +int InferAction::patloop1() { + + throw RuntimeError( + "det is disabled for command: patloop1. Use detg or detp"); +} + +int InferAction::patloop2() { + + throw RuntimeError( + "det is disabled for command: patloop2. Use detg or detp"); +} + +int InferAction::patmask() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::patnloop() { + + throw RuntimeError( + "det is disabled for command: patnloop. Use detg or detp"); +} + +int InferAction::patnloop0() { + + throw RuntimeError( + "det is disabled for command: patnloop0. Use detg or detp"); +} + +int InferAction::patnloop1() { + + throw RuntimeError( + "det is disabled for command: patnloop1. Use detg or detp"); +} + +int InferAction::patnloop2() { + + throw RuntimeError( + "det is disabled for command: patnloop2. Use detg or detp"); +} + +int InferAction::patsetbit() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::pattern() { + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::patternstart() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::patwait() { + + throw RuntimeError( + "det is disabled for command: patwait. Use detg or detp"); +} + +int InferAction::patwait0() { + + throw RuntimeError( + "det is disabled for command: patwait0. Use detg or detp"); +} + +int InferAction::patwait1() { + + throw RuntimeError( + "det is disabled for command: patwait1. Use detg or detp"); +} + +int InferAction::patwait2() { + + throw RuntimeError( + "det is disabled for command: patwait2. Use detg or detp"); +} + +int InferAction::patwaittime() { + + throw RuntimeError( + "det is disabled for command: patwaittime. Use detg or detp"); +} + +int InferAction::patwaittime0() { + + throw RuntimeError( + "det is disabled for command: patwaittime0. Use detg or detp"); +} + +int InferAction::patwaittime1() { + + throw RuntimeError( + "det is disabled for command: patwaittime1. Use detg or detp"); +} + +int InferAction::patwaittime2() { + + throw RuntimeError( + "det is disabled for command: patwaittime2. Use detg or detp"); +} + +int InferAction::patword() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::pedestalmode() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::period() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: period with number of " + "arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::periodl() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::polarity() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::port() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::powerchip() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::powerindex() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::powerlist() { + + throw RuntimeError( + "det is disabled for command: powerlist. Use detg or detp"); +} + +int InferAction::powername() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::powervalues() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::programfpga() { + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::pulse() { + + if (args.size() == 3) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::pulsechip() { + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::pulsenmove() { + + if (args.size() == 3) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::pumpprobe() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::quad() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::ratecorr() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::readnrows() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::readout() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::readoutspeed() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::readoutspeedlist() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rebootcontroller() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::reg() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::resetdacs() { + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::resetfpga() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::roi() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::romode() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::row() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::runclk() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::runtime() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_arping() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_clearroi() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_dbitlist() { + + throw RuntimeError( + "det is disabled for command: rx_dbitlist. Use detg or detp"); +} + +int InferAction::rx_dbitoffset() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_discardpolicy() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_fifodepth() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_frameindex() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_framescaught() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_framesperfile() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_hostname() { + + throw RuntimeError( + "det is disabled for command: rx_hostname. Use detg or detp"); +} + +int InferAction::rx_jsonaddheader() { + + throw RuntimeError( + "det is disabled for command: rx_jsonaddheader. Use detg or detp"); +} + +int InferAction::rx_jsonpara() { + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: rx_jsonpara with " + "number of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_lastclient() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_lock() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_missingpackets() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_padding() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_printconfig() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_realudpsocksize() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_roi() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 4) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_silent() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_start() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_status() { + + throw RuntimeError( + "det is disabled for command: rx_status. Use detg or detp"); +} + +int InferAction::rx_stop() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_tcpport() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_threads() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_udpsocksize() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_version() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_zmqfreq() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_zmqhwm() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_zmqip() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_zmqport() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_zmqstartfnum() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::rx_zmqstream() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::samples() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::savepattern() { + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::scan() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 4) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 5) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::scanerrmsg() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::selinterface() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::serialnumber() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::setbit() { + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::settings() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::settingslist() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::settingspath() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::signalindex() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::signallist() { + + throw RuntimeError( + "det is disabled for command: signallist. Use detg or detp"); +} + +int InferAction::signalname() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::slowadc() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::slowadcindex() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::slowadclist() { + + throw RuntimeError( + "det is disabled for command: slowadclist. Use detg or detp"); +} + +int InferAction::slowadcname() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::slowadcvalues() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::start() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::status() { + + throw RuntimeError("det is disabled for command: status. Use detg or detp"); +} + +int InferAction::stop() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::stopport() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::storagecell_delay() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: storagecell_delay " + "with number of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::storagecell_start() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::subdeadtime() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: subdeadtime with " + "number of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::subexptime() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: subexptime with " + "number of arguments 1. Use detg or detp"); + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::sync() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::syncclk() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_10ge() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_adc() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_control() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_dcdc() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_event() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_fpga() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_fpgaext() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_fpgafl() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_fpgafr() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_slowadc() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_sodl() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_sodr() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::temp_threshold() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::templist() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::tempvalues() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::tengiga() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::threshold() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 3) { + return slsDetectorDefs::PUT_ACTION; + } + + if (args.size() == 4) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::timing() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::timinglist() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::timingsource() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::top() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::transceiverenable() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::trigger() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::triggers() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::triggersl() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::trimbits() { + + if (args.size() == 1) { + throw RuntimeError("det is disabled for command: trimbits with number " + "of arguments 1. Use detg or detp"); + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::trimen() { + + throw RuntimeError("det is disabled for command: trimen. Use detg or detp"); +} + +int InferAction::trimval() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::tsamples() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::txdelay() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::txdelay_frame() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::txdelay_left() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::txdelay_right() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::type() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_cleardst() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_dstip() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_dstip2() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_dstlist() { + + throw RuntimeError( + "det is disabled for command: udp_dstlist. Use detg or detp"); +} + +int InferAction::udp_dstmac() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_dstmac2() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_dstport() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_dstport2() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_firstdst() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_numdst() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_reconfigure() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_srcip() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_srcip2() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_srcmac() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_srcmac2() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::udp_validate() { + + if (args.size() == 0) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::update() { + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::updatedetectorserver() { + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::updatekernel() { + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::updatemode() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::user() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::v_a() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::v_b() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::v_c() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::v_chip() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::v_d() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::v_io() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::v_limit() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vchip_comp_adc() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vchip_comp_fe() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vchip_cs() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vchip_opa_1st() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vchip_opa_fd() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vchip_ref_comp_fe() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::versions() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::veto() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vetoalg() { + + if (args.size() == 1) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vetofile() { + + throw RuntimeError( + "det is disabled for command: vetofile. Use detg or detp"); +} + +int InferAction::vetophoton() { + + if (args.size() == 2) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 4) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vetoref() { + + throw RuntimeError( + "det is disabled for command: vetoref. Use detg or detp"); +} + +int InferAction::vetostream() { + + throw RuntimeError( + "det is disabled for command: vetostream. Use detg or detp"); +} + +int InferAction::virtualFunction() { + + if (args.size() == 2) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vm_a() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vm_b() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vm_c() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vm_d() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::vm_io() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::zmqhwm() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::zmqip() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +int InferAction::zmqport() { + + if (args.size() == 0) { + return slsDetectorDefs::GET_ACTION; + } + + if (args.size() == 1) { + return slsDetectorDefs::PUT_ACTION; + } + + else { + + throw RuntimeError("Could not infer action: Wrong number of arguments"); + } +} + +} // namespace sls diff --git a/slsDetectorSoftware/src/inferAction.h b/slsDetectorSoftware/src/inferAction.h new file mode 100644 index 000000000..84de19490 --- /dev/null +++ b/slsDetectorSoftware/src/inferAction.h @@ -0,0 +1,681 @@ +#include "CmdParser.h" +#include +#include +#include + +namespace sls { +class InferAction { + public: + InferAction() {} + int infer(sls::CmdParser &parser, std::ostream &os = std::cout); + std::vector args; + std::string cmd; + + // generated functions + int acquire(); + int activate(); + int adcclk(); + int adcenable(); + int adcenable10g(); + int adcindex(); + int adcinvert(); + int adclist(); + int adcname(); + int adcphase(); + int adcpipeline(); + int adcreg(); + int adcvpp(); + int apulse(); + int asamples(); + int autocompdisable(); + int badchannels(); + int blockingtrigger(); + int burstmode(); + int burstperiod(); + int bursts(); + int burstsl(); + int bustest(); + int cdsgain(); + int chipversion(); + int clearbit(); + int clearbusy(); + int clearroi(); + int clientversion(); + int clkdiv(); + int clkfreq(); + int clkphase(); + int column(); + int compdisabletime(); + int confadc(); + int config(); + int counters(); + int currentsource(); + int dac(); + int dacindex(); + int daclist(); + int dacname(); + int dacvalues(); + int datastream(); + int dbitclk(); + int dbitphase(); + int dbitpipeline(); + int defaultdac(); + int defaultpattern(); + int delay(); + int delayl(); + int detectorserverversion(); + int detsize(); + int diodelay(); + int dpulse(); + int dr(); + int drlist(); + int dsamples(); + int execcommand(); + int exptime(); + int exptime1(); + int exptime2(); + int exptime3(); + int exptimel(); + int extrastoragecells(); + int extsampling(); + int extsamplingsrc(); + int extsig(); + int fformat(); + int filtercells(); + int filterresistor(); + int findex(); + int firmwaretest(); + int firmwareversion(); + int fliprows(); + int flowcontrol10g(); + int fmaster(); + int fname(); + int foverwrite(); + int fpath(); + int framecounter(); + int frames(); + int framesl(); + int frametime(); + int free(); + int fwrite(); + int gaincaps(); + int gainmode(); + int gappixels(); + int gatedelay(); + int gatedelay1(); + int gatedelay2(); + int gatedelay3(); + int gates(); + int getbit(); + int hardwareversion(); + int highvoltage(); + int hostname(); + int im_a(); + int im_b(); + int im_c(); + int im_d(); + int im_io(); + int imagetest(); + int initialchecks(); + int inj_ch(); + int interpolation(); + int interruptsubframe(); + int kernelversion(); + int lastclient(); + int led(); + int lock(); + int master(); + int maxadcphaseshift(); + int maxclkphaseshift(); + int maxdbitphaseshift(); + int measuredperiod(); + int measuredsubperiod(); + int moduleid(); + int nextframenumber(); + int nmod(); + int numinterfaces(); + int overflow(); + int packageversion(); + int parallel(); + int parameters(); + int partialreset(); + int patfname(); + int patioctrl(); + int patlimits(); + int patloop(); + int patloop0(); + int patloop1(); + int patloop2(); + int patmask(); + int patnloop(); + int patnloop0(); + int patnloop1(); + int patnloop2(); + int patsetbit(); + int pattern(); + int patternstart(); + int patwait(); + int patwait0(); + int patwait1(); + int patwait2(); + int patwaittime(); + int patwaittime0(); + int patwaittime1(); + int patwaittime2(); + int patword(); + int pedestalmode(); + int period(); + int periodl(); + int polarity(); + int port(); + int powerchip(); + int powerindex(); + int powerlist(); + int powername(); + int powervalues(); + int programfpga(); + int pulse(); + int pulsechip(); + int pulsenmove(); + int pumpprobe(); + int quad(); + int ratecorr(); + int readnrows(); + int readout(); + int readoutspeed(); + int readoutspeedlist(); + int rebootcontroller(); + int reg(); + int resetdacs(); + int resetfpga(); + int roi(); + int romode(); + int row(); + int runclk(); + int runtime(); + int rx_arping(); + int rx_clearroi(); + int rx_dbitlist(); + int rx_dbitoffset(); + int rx_discardpolicy(); + int rx_fifodepth(); + int rx_frameindex(); + int rx_framescaught(); + int rx_framesperfile(); + int rx_hostname(); + int rx_jsonaddheader(); + int rx_jsonpara(); + int rx_lastclient(); + int rx_lock(); + int rx_missingpackets(); + int rx_padding(); + int rx_printconfig(); + int rx_realudpsocksize(); + int rx_roi(); + int rx_silent(); + int rx_start(); + int rx_status(); + int rx_stop(); + int rx_tcpport(); + int rx_threads(); + int rx_udpsocksize(); + int rx_version(); + int rx_zmqfreq(); + int rx_zmqhwm(); + int rx_zmqip(); + int rx_zmqport(); + int rx_zmqstartfnum(); + int rx_zmqstream(); + int samples(); + int savepattern(); + int scan(); + int scanerrmsg(); + int selinterface(); + int serialnumber(); + int setbit(); + int settings(); + int settingslist(); + int settingspath(); + int signalindex(); + int signallist(); + int signalname(); + int slowadc(); + int slowadcindex(); + int slowadclist(); + int slowadcname(); + int slowadcvalues(); + int start(); + int status(); + int stop(); + int stopport(); + int storagecell_delay(); + int storagecell_start(); + int subdeadtime(); + int subexptime(); + int sync(); + int syncclk(); + int temp_10ge(); + int temp_adc(); + int temp_control(); + int temp_dcdc(); + int temp_event(); + int temp_fpga(); + int temp_fpgaext(); + int temp_fpgafl(); + int temp_fpgafr(); + int temp_slowadc(); + int temp_sodl(); + int temp_sodr(); + int temp_threshold(); + int templist(); + int tempvalues(); + int tengiga(); + int threshold(); + int timing(); + int timinglist(); + int timingsource(); + int top(); + int transceiverenable(); + int trigger(); + int triggers(); + int triggersl(); + int trimbits(); + int trimen(); + int trimval(); + int tsamples(); + int txdelay(); + int txdelay_frame(); + int txdelay_left(); + int txdelay_right(); + int type(); + int udp_cleardst(); + int udp_dstip(); + int udp_dstip2(); + int udp_dstlist(); + int udp_dstmac(); + int udp_dstmac2(); + int udp_dstport(); + int udp_dstport2(); + int udp_firstdst(); + int udp_numdst(); + int udp_reconfigure(); + int udp_srcip(); + int udp_srcip2(); + int udp_srcmac(); + int udp_srcmac2(); + int udp_validate(); + int update(); + int updatedetectorserver(); + int updatekernel(); + int updatemode(); + int user(); + int v_a(); + int v_b(); + int v_c(); + int v_chip(); + int v_d(); + int v_io(); + int v_limit(); + int vchip_comp_adc(); + int vchip_comp_fe(); + int vchip_cs(); + int vchip_opa_1st(); + int vchip_opa_fd(); + int vchip_ref_comp_fe(); + int versions(); + int veto(); + int vetoalg(); + int vetofile(); + int vetophoton(); + int vetoref(); + int vetostream(); + int virtualFunction(); + int vm_a(); + int vm_b(); + int vm_c(); + int vm_d(); + int vm_io(); + int zmqhwm(); + int zmqip(); + int zmqport(); + // int frames(); + + private: + using FunctionMap = std::map; + FunctionMap functions{ + // generated functions + + {"acquire", &InferAction::acquire}, + {"activate", &InferAction::activate}, + {"adcclk", &InferAction::adcclk}, + {"adcenable", &InferAction::adcenable}, + {"adcenable10g", &InferAction::adcenable10g}, + {"adcindex", &InferAction::adcindex}, + {"adcinvert", &InferAction::adcinvert}, + {"adclist", &InferAction::adclist}, + {"adcname", &InferAction::adcname}, + {"adcphase", &InferAction::adcphase}, + {"adcpipeline", &InferAction::adcpipeline}, + {"adcreg", &InferAction::adcreg}, + {"adcvpp", &InferAction::adcvpp}, + {"apulse", &InferAction::apulse}, + {"asamples", &InferAction::asamples}, + {"autocompdisable", &InferAction::autocompdisable}, + {"badchannels", &InferAction::badchannels}, + {"blockingtrigger", &InferAction::blockingtrigger}, + {"burstmode", &InferAction::burstmode}, + {"burstperiod", &InferAction::burstperiod}, + {"bursts", &InferAction::bursts}, + {"burstsl", &InferAction::burstsl}, + {"bustest", &InferAction::bustest}, + {"cdsgain", &InferAction::cdsgain}, + {"chipversion", &InferAction::chipversion}, + {"clearbit", &InferAction::clearbit}, + {"clearbusy", &InferAction::clearbusy}, + {"clearroi", &InferAction::clearroi}, + {"clientversion", &InferAction::clientversion}, + {"clkdiv", &InferAction::clkdiv}, + {"clkfreq", &InferAction::clkfreq}, + {"clkphase", &InferAction::clkphase}, + {"column", &InferAction::column}, + {"compdisabletime", &InferAction::compdisabletime}, + {"confadc", &InferAction::confadc}, + {"config", &InferAction::config}, + {"counters", &InferAction::counters}, + {"currentsource", &InferAction::currentsource}, + {"dac", &InferAction::dac}, + {"dacindex", &InferAction::dacindex}, + {"daclist", &InferAction::daclist}, + {"dacname", &InferAction::dacname}, + {"dacvalues", &InferAction::dacvalues}, + {"datastream", &InferAction::datastream}, + {"dbitclk", &InferAction::dbitclk}, + {"dbitphase", &InferAction::dbitphase}, + {"dbitpipeline", &InferAction::dbitpipeline}, + {"defaultdac", &InferAction::defaultdac}, + {"defaultpattern", &InferAction::defaultpattern}, + {"delay", &InferAction::delay}, + {"delayl", &InferAction::delayl}, + {"detectorserverversion", &InferAction::detectorserverversion}, + {"detsize", &InferAction::detsize}, + {"diodelay", &InferAction::diodelay}, + {"dpulse", &InferAction::dpulse}, + {"dr", &InferAction::dr}, + {"drlist", &InferAction::drlist}, + {"dsamples", &InferAction::dsamples}, + {"execcommand", &InferAction::execcommand}, + {"exptime", &InferAction::exptime}, + {"exptime1", &InferAction::exptime1}, + {"exptime2", &InferAction::exptime2}, + {"exptime3", &InferAction::exptime3}, + {"exptimel", &InferAction::exptimel}, + {"extrastoragecells", &InferAction::extrastoragecells}, + {"extsampling", &InferAction::extsampling}, + {"extsamplingsrc", &InferAction::extsamplingsrc}, + {"extsig", &InferAction::extsig}, + {"fformat", &InferAction::fformat}, + {"filtercells", &InferAction::filtercells}, + {"filterresistor", &InferAction::filterresistor}, + {"findex", &InferAction::findex}, + {"firmwaretest", &InferAction::firmwaretest}, + {"firmwareversion", &InferAction::firmwareversion}, + {"fliprows", &InferAction::fliprows}, + {"flowcontrol10g", &InferAction::flowcontrol10g}, + {"fmaster", &InferAction::fmaster}, + {"fname", &InferAction::fname}, + {"foverwrite", &InferAction::foverwrite}, + {"fpath", &InferAction::fpath}, + {"framecounter", &InferAction::framecounter}, + {"frames", &InferAction::frames}, + {"framesl", &InferAction::framesl}, + {"frametime", &InferAction::frametime}, + {"free", &InferAction::free}, + {"fwrite", &InferAction::fwrite}, + {"gaincaps", &InferAction::gaincaps}, + {"gainmode", &InferAction::gainmode}, + {"gappixels", &InferAction::gappixels}, + {"gatedelay", &InferAction::gatedelay}, + {"gatedelay1", &InferAction::gatedelay1}, + {"gatedelay2", &InferAction::gatedelay2}, + {"gatedelay3", &InferAction::gatedelay3}, + {"gates", &InferAction::gates}, + {"getbit", &InferAction::getbit}, + {"hardwareversion", &InferAction::hardwareversion}, + {"highvoltage", &InferAction::highvoltage}, + {"hostname", &InferAction::hostname}, + {"im_a", &InferAction::im_a}, + {"im_b", &InferAction::im_b}, + {"im_c", &InferAction::im_c}, + {"im_d", &InferAction::im_d}, + {"im_io", &InferAction::im_io}, + {"imagetest", &InferAction::imagetest}, + {"initialchecks", &InferAction::initialchecks}, + {"inj_ch", &InferAction::inj_ch}, + {"interpolation", &InferAction::interpolation}, + {"interruptsubframe", &InferAction::interruptsubframe}, + {"kernelversion", &InferAction::kernelversion}, + {"lastclient", &InferAction::lastclient}, + {"led", &InferAction::led}, + {"lock", &InferAction::lock}, + {"master", &InferAction::master}, + {"maxadcphaseshift", &InferAction::maxadcphaseshift}, + {"maxclkphaseshift", &InferAction::maxclkphaseshift}, + {"maxdbitphaseshift", &InferAction::maxdbitphaseshift}, + {"measuredperiod", &InferAction::measuredperiod}, + {"measuredsubperiod", &InferAction::measuredsubperiod}, + {"moduleid", &InferAction::moduleid}, + {"nextframenumber", &InferAction::nextframenumber}, + {"nmod", &InferAction::nmod}, + {"numinterfaces", &InferAction::numinterfaces}, + {"overflow", &InferAction::overflow}, + {"packageversion", &InferAction::packageversion}, + {"parallel", &InferAction::parallel}, + {"parameters", &InferAction::parameters}, + {"partialreset", &InferAction::partialreset}, + {"patfname", &InferAction::patfname}, + {"patioctrl", &InferAction::patioctrl}, + {"patlimits", &InferAction::patlimits}, + {"patloop", &InferAction::patloop}, + {"patloop0", &InferAction::patloop0}, + {"patloop1", &InferAction::patloop1}, + {"patloop2", &InferAction::patloop2}, + {"patmask", &InferAction::patmask}, + {"patnloop", &InferAction::patnloop}, + {"patnloop0", &InferAction::patnloop0}, + {"patnloop1", &InferAction::patnloop1}, + {"patnloop2", &InferAction::patnloop2}, + {"patsetbit", &InferAction::patsetbit}, + {"patternX", &InferAction::pattern}, + {"patternstart", &InferAction::patternstart}, + {"patwait", &InferAction::patwait}, + {"patwait0", &InferAction::patwait0}, + {"patwait1", &InferAction::patwait1}, + {"patwait2", &InferAction::patwait2}, + {"patwaittime", &InferAction::patwaittime}, + {"patwaittime0", &InferAction::patwaittime0}, + {"patwaittime1", &InferAction::patwaittime1}, + {"patwaittime2", &InferAction::patwaittime2}, + {"patword", &InferAction::patword}, + {"pedestalmode", &InferAction::pedestalmode}, + {"period", &InferAction::period}, + {"periodl", &InferAction::periodl}, + {"polarity", &InferAction::polarity}, + {"port", &InferAction::port}, + {"powerchip", &InferAction::powerchip}, + {"powerindex", &InferAction::powerindex}, + {"powerlist", &InferAction::powerlist}, + {"powername", &InferAction::powername}, + {"powervalues", &InferAction::powervalues}, + {"programfpga", &InferAction::programfpga}, + {"pulse", &InferAction::pulse}, + {"pulsechip", &InferAction::pulsechip}, + {"pulsenmove", &InferAction::pulsenmove}, + {"pumpprobe", &InferAction::pumpprobe}, + {"quad", &InferAction::quad}, + {"ratecorr", &InferAction::ratecorr}, + {"readnrows", &InferAction::readnrows}, + {"readout", &InferAction::readout}, + {"readoutspeed", &InferAction::readoutspeed}, + {"readoutspeedlist", &InferAction::readoutspeedlist}, + {"rebootcontroller", &InferAction::rebootcontroller}, + {"reg", &InferAction::reg}, + {"resetdacs", &InferAction::resetdacs}, + {"resetfpga", &InferAction::resetfpga}, + {"roi", &InferAction::roi}, + {"romode", &InferAction::romode}, + {"row", &InferAction::row}, + {"runclk", &InferAction::runclk}, + {"runtime", &InferAction::runtime}, + {"rx_arping", &InferAction::rx_arping}, + {"rx_clearroi", &InferAction::rx_clearroi}, + {"rx_dbitlist", &InferAction::rx_dbitlist}, + {"rx_dbitoffset", &InferAction::rx_dbitoffset}, + {"rx_discardpolicy", &InferAction::rx_discardpolicy}, + {"rx_fifodepth", &InferAction::rx_fifodepth}, + {"rx_frameindex", &InferAction::rx_frameindex}, + {"rx_framescaught", &InferAction::rx_framescaught}, + {"rx_framesperfile", &InferAction::rx_framesperfile}, + {"rx_hostname", &InferAction::rx_hostname}, + {"rx_jsonaddheader", &InferAction::rx_jsonaddheader}, + {"rx_jsonpara", &InferAction::rx_jsonpara}, + {"rx_lastclient", &InferAction::rx_lastclient}, + {"rx_lock", &InferAction::rx_lock}, + {"rx_missingpackets", &InferAction::rx_missingpackets}, + {"rx_padding", &InferAction::rx_padding}, + {"rx_printconfig", &InferAction::rx_printconfig}, + {"rx_realudpsocksize", &InferAction::rx_realudpsocksize}, + {"rx_roi", &InferAction::rx_roi}, + {"rx_silent", &InferAction::rx_silent}, + {"rx_start", &InferAction::rx_start}, + {"rx_status", &InferAction::rx_status}, + {"rx_stop", &InferAction::rx_stop}, + {"rx_tcpport", &InferAction::rx_tcpport}, + {"rx_threads", &InferAction::rx_threads}, + {"rx_udpsocksize", &InferAction::rx_udpsocksize}, + {"rx_version", &InferAction::rx_version}, + {"rx_zmqfreq", &InferAction::rx_zmqfreq}, + {"rx_zmqhwm", &InferAction::rx_zmqhwm}, + {"rx_zmqip", &InferAction::rx_zmqip}, + {"rx_zmqport", &InferAction::rx_zmqport}, + {"rx_zmqstartfnum", &InferAction::rx_zmqstartfnum}, + {"rx_zmqstream", &InferAction::rx_zmqstream}, + {"samples", &InferAction::samples}, + {"savepattern", &InferAction::savepattern}, + {"scan", &InferAction::scan}, + {"scanerrmsg", &InferAction::scanerrmsg}, + {"selinterface", &InferAction::selinterface}, + {"serialnumber", &InferAction::serialnumber}, + {"setbit", &InferAction::setbit}, + {"settings", &InferAction::settings}, + {"settingslist", &InferAction::settingslist}, + {"settingspath", &InferAction::settingspath}, + {"signalindex", &InferAction::signalindex}, + {"signallist", &InferAction::signallist}, + {"signalname", &InferAction::signalname}, + {"slowadc", &InferAction::slowadc}, + {"slowadcindex", &InferAction::slowadcindex}, + {"slowadclist", &InferAction::slowadclist}, + {"slowadcname", &InferAction::slowadcname}, + {"slowadcvalues", &InferAction::slowadcvalues}, + {"start", &InferAction::start}, + {"status", &InferAction::status}, + {"stop", &InferAction::stop}, + {"stopport", &InferAction::stopport}, + {"storagecell_delay", &InferAction::storagecell_delay}, + {"storagecell_start", &InferAction::storagecell_start}, + {"subdeadtime", &InferAction::subdeadtime}, + {"subexptime", &InferAction::subexptime}, + {"sync", &InferAction::sync}, + {"syncclk", &InferAction::syncclk}, + {"temp_10ge", &InferAction::temp_10ge}, + {"temp_adc", &InferAction::temp_adc}, + {"temp_control", &InferAction::temp_control}, + {"temp_dcdc", &InferAction::temp_dcdc}, + {"temp_event", &InferAction::temp_event}, + {"temp_fpga", &InferAction::temp_fpga}, + {"temp_fpgaext", &InferAction::temp_fpgaext}, + {"temp_fpgafl", &InferAction::temp_fpgafl}, + {"temp_fpgafr", &InferAction::temp_fpgafr}, + {"temp_slowadc", &InferAction::temp_slowadc}, + {"temp_sodl", &InferAction::temp_sodl}, + {"temp_sodr", &InferAction::temp_sodr}, + {"temp_threshold", &InferAction::temp_threshold}, + {"templist", &InferAction::templist}, + {"tempvalues", &InferAction::tempvalues}, + {"tengiga", &InferAction::tengiga}, + {"threshold", &InferAction::threshold}, + {"thresholdnotb", &InferAction::threshold}, + {"timing", &InferAction::timing}, + {"timinglist", &InferAction::timinglist}, + {"timingsource", &InferAction::timingsource}, + {"top", &InferAction::top}, + {"transceiverenable", &InferAction::transceiverenable}, + {"trigger", &InferAction::trigger}, + {"triggers", &InferAction::triggers}, + {"triggersl", &InferAction::triggersl}, + {"trimbits", &InferAction::trimbits}, + {"trimen", &InferAction::trimen}, + {"trimval", &InferAction::trimval}, + {"tsamples", &InferAction::tsamples}, + {"txdelay", &InferAction::txdelay}, + {"txdelay_frame", &InferAction::txdelay_frame}, + {"txdelay_left", &InferAction::txdelay_left}, + {"txdelay_right", &InferAction::txdelay_right}, + {"type", &InferAction::type}, + {"udp_cleardst", &InferAction::udp_cleardst}, + {"udp_dstip", &InferAction::udp_dstip}, + {"udp_dstip2", &InferAction::udp_dstip2}, + {"udp_dstlist", &InferAction::udp_dstlist}, + {"udp_dstmac", &InferAction::udp_dstmac}, + {"udp_dstmac2", &InferAction::udp_dstmac2}, + {"udp_dstport", &InferAction::udp_dstport}, + {"udp_dstport2", &InferAction::udp_dstport2}, + {"udp_firstdst", &InferAction::udp_firstdst}, + {"udp_numdst", &InferAction::udp_numdst}, + {"udp_reconfigure", &InferAction::udp_reconfigure}, + {"udp_srcip", &InferAction::udp_srcip}, + {"udp_srcip2", &InferAction::udp_srcip2}, + {"udp_srcmac", &InferAction::udp_srcmac}, + {"udp_srcmac2", &InferAction::udp_srcmac2}, + {"udp_validate", &InferAction::udp_validate}, + {"update", &InferAction::update}, + {"updatedetectorserver", &InferAction::updatedetectorserver}, + {"updatekernel", &InferAction::updatekernel}, + {"updatemode", &InferAction::updatemode}, + {"user", &InferAction::user}, + {"v_a", &InferAction::v_a}, + {"v_b", &InferAction::v_b}, + {"v_c", &InferAction::v_c}, + {"v_chip", &InferAction::v_chip}, + {"v_d", &InferAction::v_d}, + {"v_io", &InferAction::v_io}, + {"v_limit", &InferAction::v_limit}, + {"vchip_comp_adc", &InferAction::vchip_comp_adc}, + {"vchip_comp_fe", &InferAction::vchip_comp_fe}, + {"vchip_cs", &InferAction::vchip_cs}, + {"vchip_opa_1st", &InferAction::vchip_opa_1st}, + {"vchip_opa_fd", &InferAction::vchip_opa_fd}, + {"vchip_ref_comp_fe", &InferAction::vchip_ref_comp_fe}, + {"versions", &InferAction::versions}, + {"veto", &InferAction::veto}, + {"vetoalg", &InferAction::vetoalg}, + {"vetofile", &InferAction::vetofile}, + {"vetophoton", &InferAction::vetophoton}, + {"vetoref", &InferAction::vetoref}, + {"vetostream", &InferAction::vetostream}, + {"virtual", &InferAction::virtualFunction}, + {"vm_a", &InferAction::vm_a}, + {"vm_b", &InferAction::vm_b}, + {"vm_c", &InferAction::vm_c}, + {"vm_d", &InferAction::vm_d}, + {"vm_io", &InferAction::vm_io}, + {"zmqhwm", &InferAction::zmqhwm}, + {"zmqip", &InferAction::zmqip}, + {"zmqport", &InferAction::zmqport} + + // {"frames",&InferAction::frames} + + }; +}; + +} // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/tests/CMakeLists.txt b/slsDetectorSoftware/tests/CMakeLists.txt index 14a522639..ddd9abbb3 100755 --- a/slsDetectorSoftware/tests/CMakeLists.txt +++ b/slsDetectorSoftware/tests/CMakeLists.txt @@ -1,24 +1,32 @@ # SPDX-License-Identifier: LGPL-3.0-or-other # Copyright (C) 2021 Contributors to the SLS Detector Package + + target_sources(tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/test-SharedMemory.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-slsDetector.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-rx.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-pattern.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-eiger.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-jungfrau.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-mythen3.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-gotthard2.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-gotthard.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-chiptestboard.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-moench.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-global.cpp + + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-rx.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-pattern.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-eiger.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-jungfrau.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-mythen3.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-gotthard2.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-gotthard.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-chiptestboard.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-moench.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller-global.cpp + + ${CMAKE_CURRENT_SOURCE_DIR}/test-Result.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdParser.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-Module.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-Pattern.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-CtbConfig.cpp + + + ) target_include_directories(tests diff --git a/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp similarity index 56% rename from slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp rename to slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp index 314b48e60..bcdc91af4 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" +#include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" #include "sls/sls_detector_defs.h" @@ -9,7 +9,7 @@ #include "sls/Result.h" #include "sls/ToString.h" #include "sls/versionAPI.h" -#include "test-CmdProxy-global.h" +#include "test-Caller-global.h" #include "tests/globals.h" namespace sls { @@ -19,9 +19,9 @@ using test::PUT; /* dacs */ -TEST_CASE("dacname", "[.cmd]") { +TEST_CASE("CALLER::dacname", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -30,32 +30,32 @@ TEST_CASE("dacname", "[.cmd]") { auto prev = det.getDacName(ind); // 1 arg throw - REQUIRE_THROWS(proxy.Call("dacname", {"2", "3", "bname"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dacname", {"2", "3", "bname"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("dacname", {"18", "bname"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dacname", {"18", "bname"}, -1, PUT)); { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("dacname", {str_dac_index, "bname"}, -1, PUT, oss)); + caller.call("dacname", {str_dac_index, "bname"}, -1, PUT, oss)); } { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("dacname", {str_dac_index}, -1, GET, oss)); + caller.call("dacname", {str_dac_index}, -1, GET, oss)); REQUIRE(oss.str() == std::string("dacname ") + str_dac_index + " bname\n"); } det.setDacName(ind, prev); } else { - REQUIRE_THROWS(proxy.Call("dacname", {"2", "b"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("dacname", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("dacname", {"2", "b"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dacname", {"2"}, -1, GET)); } } -TEST_CASE("dacindex", "[.cmd]") { +TEST_CASE("CALLER::dacindex", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -63,30 +63,30 @@ TEST_CASE("dacindex", "[.cmd]") { std::string str_dac_index = "2"; // 1 arg throw - REQUIRE_THROWS(proxy.Call("dacindex", {"2", "2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dacindex", {"2", "2"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("dacindex", {"18"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dacindex", {"18"}, -1, PUT)); auto dacname = det.getDacName(ind); { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("dacindex", {dacname}, -1, GET, oss)); + REQUIRE_NOTHROW(caller.call("dacindex", {dacname}, -1, GET, oss)); REQUIRE(oss.str() == std::string("dacindex ") + str_dac_index + '\n'); } } else { - REQUIRE_THROWS(proxy.Call("dacindex", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("dacindex", {"2"}, -1, GET)); } } -TEST_CASE("adclist", "[.cmd]") { +TEST_CASE("CALLER::adclist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev = det.getAdcNames(); - REQUIRE_THROWS(proxy.Call("adclist", {"a", "s", "d"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adclist", {"a", "s", "d"}, -1, PUT)); std::vector names; for (int iarg = 0; iarg != 32; ++iarg) { @@ -94,25 +94,25 @@ TEST_CASE("adclist", "[.cmd]") { } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("adclist", names, -1, PUT, oss)); + REQUIRE_NOTHROW(caller.call("adclist", names, -1, PUT, oss)); } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("adclist", {}, -1, GET, oss)); + REQUIRE_NOTHROW(caller.call("adclist", {}, -1, GET, oss)); REQUIRE(oss.str() == std::string("adclist ") + ToString(names) + '\n'); } det.setAdcNames(prev); } else { - REQUIRE_THROWS(proxy.Call("adclist", {"a", "b"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("adclist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adclist", {"a", "b"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adclist", {}, -1, GET)); } } -TEST_CASE("adcname", "[.cmd]") { +TEST_CASE("CALLER::adcname", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -121,32 +121,32 @@ TEST_CASE("adcname", "[.cmd]") { auto prev = det.getAdcName(ind); // 1 arg throw - REQUIRE_THROWS(proxy.Call("adcname", {"2", "3", "bname"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adcname", {"2", "3", "bname"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("adcname", {"32", "bname"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adcname", {"32", "bname"}, -1, PUT)); { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("adcname", {str_adc_index, "bname"}, -1, PUT, oss)); + caller.call("adcname", {str_adc_index, "bname"}, -1, PUT, oss)); } { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("adcname", {str_adc_index}, -1, GET, oss)); + caller.call("adcname", {str_adc_index}, -1, GET, oss)); REQUIRE(oss.str() == std::string("adcname ") + str_adc_index + " bname\n"); } det.setAdcName(ind, prev); } else { - REQUIRE_THROWS(proxy.Call("adcname", {"2", "b"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("adcname", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("adcname", {"2", "b"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adcname", {"2"}, -1, GET)); } } -TEST_CASE("adcindex", "[.cmd]") { +TEST_CASE("CALLER::adcindex", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -154,30 +154,30 @@ TEST_CASE("adcindex", "[.cmd]") { std::string str_adc_index = "2"; // 1 arg throw - REQUIRE_THROWS(proxy.Call("adcindex", {"2", "2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adcindex", {"2", "2"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("adcindex", {"32"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adcindex", {"32"}, -1, PUT)); auto adcname = det.getAdcName(ind); { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("adcindex", {adcname}, -1, GET, oss)); + REQUIRE_NOTHROW(caller.call("adcindex", {adcname}, -1, GET, oss)); REQUIRE(oss.str() == std::string("adcindex ") + str_adc_index + '\n'); } } else { - REQUIRE_THROWS(proxy.Call("adcindex", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("adcindex", {"2"}, -1, GET)); } } -TEST_CASE("signallist", "[.cmd]") { +TEST_CASE("CALLER::signallist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev = det.getSignalNames(); - REQUIRE_THROWS(proxy.Call("signallist", {"a", "s", "d"}, -1, PUT)); + REQUIRE_THROWS(caller.call("signallist", {"a", "s", "d"}, -1, PUT)); std::vector names; for (int iarg = 0; iarg != 64; ++iarg) { @@ -185,25 +185,25 @@ TEST_CASE("signallist", "[.cmd]") { } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("signallist", names, -1, PUT, oss)); + REQUIRE_NOTHROW(caller.call("signallist", names, -1, PUT, oss)); } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("signallist", {}, -1, GET, oss)); + REQUIRE_NOTHROW(caller.call("signallist", {}, -1, GET, oss)); REQUIRE(oss.str() == std::string("signallist ") + ToString(names) + '\n'); } det.setSignalNames(prev); } else { - REQUIRE_THROWS(proxy.Call("signallist", {"a", "b"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("signallist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("signallist", {"a", "b"}, -1, PUT)); + REQUIRE_THROWS(caller.call("signallist", {}, -1, GET)); } } -TEST_CASE("signalname", "[.cmd]") { +TEST_CASE("CALLER::signalname", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -212,32 +212,32 @@ TEST_CASE("signalname", "[.cmd]") { auto prev = det.getSignalName(ind); // 1 arg throw - REQUIRE_THROWS(proxy.Call("signalname", {"2", "3", "bname"}, -1, PUT)); + REQUIRE_THROWS(caller.call("signalname", {"2", "3", "bname"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("signalname", {"64", "bname"}, -1, PUT)); + REQUIRE_THROWS(caller.call("signalname", {"64", "bname"}, -1, PUT)); { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call( + REQUIRE_NOTHROW(caller.call( "signalname", {str_signal_index, "bname"}, -1, PUT, oss)); } { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("signalname", {str_signal_index}, -1, GET, oss)); + caller.call("signalname", {str_signal_index}, -1, GET, oss)); REQUIRE(oss.str() == std::string("signalname ") + str_signal_index + " bname\n"); } det.setSignalName(ind, prev); } else { - REQUIRE_THROWS(proxy.Call("signalname", {"2", "b"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("signalname", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("signalname", {"2", "b"}, -1, PUT)); + REQUIRE_THROWS(caller.call("signalname", {"2"}, -1, GET)); } } -TEST_CASE("signalindex", "[.cmd]") { +TEST_CASE("CALLER::signalindex", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -245,31 +245,31 @@ TEST_CASE("signalindex", "[.cmd]") { std::string str_signal_index = "2"; // 1 arg throw - REQUIRE_THROWS(proxy.Call("signalindex", {"2", "2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("signalindex", {"2", "2"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("signalindex", {"64"}, -1, PUT)); + REQUIRE_THROWS(caller.call("signalindex", {"64"}, -1, PUT)); auto signalname = det.getSignalName(ind); { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("signalindex", {signalname}, -1, GET, oss)); + caller.call("signalindex", {signalname}, -1, GET, oss)); REQUIRE(oss.str() == std::string("signalindex ") + str_signal_index + '\n'); } } else { - REQUIRE_THROWS(proxy.Call("signalindex", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("signalindex", {"2"}, -1, GET)); } } -TEST_CASE("powerlist", "[.cmd]") { +TEST_CASE("CALLER::powerlist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev = det.getPowerNames(); - REQUIRE_THROWS(proxy.Call("powerlist", {"a", "s", "d"}, -1, PUT)); + REQUIRE_THROWS(caller.call("powerlist", {"a", "s", "d"}, -1, PUT)); std::vector names; for (int iarg = 0; iarg != 5; ++iarg) { @@ -277,25 +277,25 @@ TEST_CASE("powerlist", "[.cmd]") { } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("powerlist", names, -1, PUT, oss)); + REQUIRE_NOTHROW(caller.call("powerlist", names, -1, PUT, oss)); } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("powerlist", {}, -1, GET, oss)); + REQUIRE_NOTHROW(caller.call("powerlist", {}, -1, GET, oss)); REQUIRE(oss.str() == std::string("powerlist ") + ToString(names) + '\n'); } det.setPowerNames(prev); } else { - REQUIRE_THROWS(proxy.Call("powerlist", {"a", "b"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("powerlist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("powerlist", {"a", "b"}, -1, PUT)); + REQUIRE_THROWS(caller.call("powerlist", {}, -1, GET)); } } -TEST_CASE("powername", "[.cmd]") { +TEST_CASE("CALLER::powername", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -304,32 +304,32 @@ TEST_CASE("powername", "[.cmd]") { auto prev = det.getPowerName(ind); // 1 arg throw - REQUIRE_THROWS(proxy.Call("powername", {"2", "3", "bname"}, -1, PUT)); + REQUIRE_THROWS(caller.call("powername", {"2", "3", "bname"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("powername", {"5", "bname"}, -1, PUT)); + REQUIRE_THROWS(caller.call("powername", {"5", "bname"}, -1, PUT)); { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("powername", {str_power_index, "bname"}, - -1, PUT, oss)); + REQUIRE_NOTHROW(caller.call("powername", {str_power_index, "bname"}, + -1, PUT, oss)); } { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("powername", {str_power_index}, -1, GET, oss)); + caller.call("powername", {str_power_index}, -1, GET, oss)); REQUIRE(oss.str() == std::string("powername ") + str_power_index + " bname\n"); } det.setPowerName(ind, prev); } else { - REQUIRE_THROWS(proxy.Call("powername", {"2", "b"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("powername", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("powername", {"2", "b"}, -1, PUT)); + REQUIRE_THROWS(caller.call("powername", {"2"}, -1, GET)); } } -TEST_CASE("powerindex", "[.cmd]") { +TEST_CASE("CALLER::powerindex", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -337,59 +337,55 @@ TEST_CASE("powerindex", "[.cmd]") { std::string str_power_index = "2"; // 1 arg throw - REQUIRE_THROWS(proxy.Call("powerindex", {"2", "2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("powerindex", {"2", "2"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("powerindex", {"5"}, -1, PUT)); + REQUIRE_THROWS(caller.call("powerindex", {"5"}, -1, PUT)); auto powername = det.getPowerName(ind); { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("powerindex", {powername}, -1, GET, oss)); + caller.call("powerindex", {powername}, -1, GET, oss)); REQUIRE(oss.str() == std::string("powerindex ") + str_power_index + '\n'); } } else { - REQUIRE_THROWS(proxy.Call("powerindex", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("powerindex", {"2"}, -1, GET)); } } -TEST_CASE("powervalues", "[.cmd]") { +TEST_CASE("CALLER::powervalues", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - + Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("powervalues", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("powervalues", {}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("powervalues", {}, -1, GET)); + REQUIRE_THROWS(caller.call("powervalues", {}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("powervalues", {}, -1, GET)); + REQUIRE_THROWS(caller.call("powervalues", {}, -1, GET)); } } -TEST_CASE("slowadcvalues", "[.cmd]") { +TEST_CASE("CALLER::slowadcvalues", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - + Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("slowadcvalues", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("slowadcvalues", {}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("slowadcvalues", {}, -1, GET)); + REQUIRE_THROWS(caller.call("slowadcvalues", {}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("slowadcvalues", {}, -1, GET)); + REQUIRE_THROWS(caller.call("slowadcvalues", {}, -1, GET)); } } -TEST_CASE("slowadclist", "[.cmd]") { +TEST_CASE("CALLER::slowadclist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev = det.getSlowADCNames(); - REQUIRE_THROWS(proxy.Call("slowadclist", {"a", "s", "d"}, -1, PUT)); + REQUIRE_THROWS(caller.call("slowadclist", {"a", "s", "d"}, -1, PUT)); std::vector names; for (int iarg = 0; iarg != 8; ++iarg) { @@ -397,25 +393,25 @@ TEST_CASE("slowadclist", "[.cmd]") { } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("slowadclist", names, -1, PUT, oss)); + REQUIRE_NOTHROW(caller.call("slowadclist", names, -1, PUT, oss)); } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("slowadclist", {}, -1, GET, oss)); + REQUIRE_NOTHROW(caller.call("slowadclist", {}, -1, GET, oss)); REQUIRE(oss.str() == std::string("slowadclist ") + ToString(names) + '\n'); } det.setSlowADCNames(prev); } else { - REQUIRE_THROWS(proxy.Call("slowadclist", {"a", "b"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("slowadclist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("slowadclist", {"a", "b"}, -1, PUT)); + REQUIRE_THROWS(caller.call("slowadclist", {}, -1, GET)); } } -TEST_CASE("slowadcname", "[.cmd]") { +TEST_CASE("CALLER::slowadcname", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -424,32 +420,33 @@ TEST_CASE("slowadcname", "[.cmd]") { auto prev = det.getSlowADCName(ind); // 1 arg throw - REQUIRE_THROWS(proxy.Call("slowadcname", {"2", "3", "bname"}, -1, PUT)); + REQUIRE_THROWS( + caller.call("slowadcname", {"2", "3", "bname"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("slowadcname", {"8", "bname"}, -1, PUT)); + REQUIRE_THROWS(caller.call("slowadcname", {"8", "bname"}, -1, PUT)); { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call( + REQUIRE_NOTHROW(caller.call( "slowadcname", {str_slowadc_index, "bname"}, -1, PUT, oss)); } { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("slowadcname", {str_slowadc_index}, -1, GET, oss)); + caller.call("slowadcname", {str_slowadc_index}, -1, GET, oss)); REQUIRE(oss.str() == std::string("slowadcname ") + str_slowadc_index + " bname\n"); } det.setSlowADCName(ind, prev); } else { - REQUIRE_THROWS(proxy.Call("slowadcname", {"2", "b"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("slowadcname", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("slowadcname", {"2", "b"}, -1, PUT)); + REQUIRE_THROWS(caller.call("slowadcname", {"2"}, -1, GET)); } } -TEST_CASE("slowadcindex", "[.cmd]") { +TEST_CASE("CALLER::slowadcindex", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -457,142 +454,142 @@ TEST_CASE("slowadcindex", "[.cmd]") { std::string str_slowadc_index = "2"; // 1 arg throw - REQUIRE_THROWS(proxy.Call("slowadcindex", {"2", "2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("slowadcindex", {"2", "2"}, -1, PUT)); // invalid index - REQUIRE_THROWS(proxy.Call("slowadcindex", {"8"}, -1, PUT)); + REQUIRE_THROWS(caller.call("slowadcindex", {"8"}, -1, PUT)); auto slowadcname = det.getSlowADCName(ind); { std::ostringstream oss; REQUIRE_NOTHROW( - proxy.Call("slowadcindex", {slowadcname}, -1, GET, oss)); + caller.call("slowadcindex", {slowadcname}, -1, GET, oss)); REQUIRE(oss.str() == std::string("slowadcindex ") + str_slowadc_index + '\n'); } } else { - REQUIRE_THROWS(proxy.Call("slowadcindex", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("slowadcindex", {"2"}, -1, GET)); } } /* dacs */ -TEST_CASE("dac", "[.cmd][.dacs]") { +TEST_CASE("CALLER::dac", "[.cmdcall][.dacs]") { // dac 0 to dac 17 Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { for (int i = 0; i < 18; ++i) { SECTION("dac " + std::to_string(i)) { - test_dac(static_cast(i), "dac", 0); + test_dac_caller(static_cast(i), "dac", 0); } } // eiger - // REQUIRE_THROWS(proxy.Call("dac", {"vthreshold"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vsvp"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vsvn"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vtrim"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vrpreamp"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vrshaper"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vtgstv"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vcmp_ll"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vcmp_lr"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vcal"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rl"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rr"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"rxb_rb"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"rxb_lb"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vcp"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vcn"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vishaper"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"iodelay"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vthreshold"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vsvp"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vsvn"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vtrim"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vrpreamp"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vrshaper"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vtgstv"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vcmp_ll"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vcmp_lr"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vcal"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vcmp_rl"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vcmp_rr"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"rxb_rb"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"rxb_lb"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vcp"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vcn"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vishaper"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"iodelay"}, -1, GET)); // jungfrau - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vdd_prot"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vin_com"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_prech"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_pixbuf"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_comp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vdd_prot"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vin_com"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_prech"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_pixbuf"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_ds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_ds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_comp"}, -1, GET)); // gotthard - REQUIRE_THROWS(proxy.Call("dac", {"vref_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcascn_pb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcascp_pb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vout_cm"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcasc_out"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vin_cm"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"ib_test_c"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_ds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcascn_pb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcascp_pb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vout_cm"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcasc_out"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vin_cm"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_comp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"ib_test_c"}, -1, GET)); // mythen3 - REQUIRE_THROWS(proxy.Call("dac", {"vrpreamp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper_n"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vipre"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vishaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vdcsh"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth2"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth3"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal_n"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal_p"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtrim"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcassh"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcas"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vicin"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vipre_out"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrpreamp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrshaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrshaper_n"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vipre"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vishaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vdcsh"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vth1"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vth2"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vth3"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcal_n"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcal_p"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vtrim"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcassh"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcas"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vicin"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vipre_out"}, -1, GET)); // gotthard2 - REQUIRE_THROWS(proxy.Call("dac", {"vref_h_Signal"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp_fe"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_cds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_rstore"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_opa_1st"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp_fe"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_adc1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_l_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_cds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_cs"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_opa_fd"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_adc2"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_h_Signal"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_comp_fe"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_comp_adc"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcom_cds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_rstore"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_opa_1st"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_comp_fe"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcom_adc1"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_l_adc"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_cds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_cs"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_opa_fd"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcom_adc2"}, -1, GET)); } } -TEST_CASE("adcvpp", "[.cmd]") { +TEST_CASE("CALLER::adcvpp", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getADCVpp(false); { std::ostringstream oss; - proxy.Call("adcvpp", {"1"}, -1, PUT, oss); + caller.call("adcvpp", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "adcvpp 1\n"); } { std::ostringstream oss; - proxy.Call("adcvpp", {"1140", "mv"}, -1, PUT, oss); + caller.call("adcvpp", {"1140", "mv"}, -1, PUT, oss); REQUIRE(oss.str() == "adcvpp 1140 mV\n"); } { std::ostringstream oss; - proxy.Call("adcvpp", {"mv"}, -1, GET, oss); + caller.call("adcvpp", {"mv"}, -1, GET, oss); REQUIRE(oss.str() == "adcvpp 1140 mV\n"); } for (int i = 0; i != det.size(); ++i) { det.setADCVpp(prev_val[i], false, {i}); } } else { - REQUIRE_THROWS(proxy.Call("adcvpp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adcvpp", {}, -1, GET)); } } /* CTB Specific */ -TEST_CASE("samples", "[.cmd]") { +TEST_CASE("CALLER::samples", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { @@ -603,27 +600,27 @@ TEST_CASE("samples", "[.cmd]") { } { std::ostringstream oss; - proxy.Call("samples", {"25"}, -1, PUT, oss); + caller.call("samples", {"25"}, -1, PUT, oss); REQUIRE(oss.str() == "samples 25\n"); } { std::ostringstream oss; - proxy.Call("samples", {"450"}, -1, PUT, oss); + caller.call("samples", {"450"}, -1, PUT, oss); REQUIRE(oss.str() == "samples 450\n"); } { std::ostringstream oss; - proxy.Call("samples", {}, -1, GET, oss); + caller.call("samples", {}, -1, GET, oss); REQUIRE(oss.str() == "samples 450\n"); } { std::ostringstream oss; - proxy.Call("asamples", {}, -1, GET, oss); + caller.call("asamples", {}, -1, GET, oss); REQUIRE(oss.str() == "asamples 450\n"); } if (det_type == defs::CHIPTESTBOARD) { std::ostringstream oss; - proxy.Call("dsamples", {}, -1, GET, oss); + caller.call("dsamples", {}, -1, GET, oss); REQUIRE(oss.str() == "dsamples 450\n"); } for (int i = 0; i != det.size(); ++i) { @@ -633,60 +630,60 @@ TEST_CASE("samples", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("samples", {}, -1, GET)); + REQUIRE_THROWS(caller.call("samples", {}, -1, GET)); } } -TEST_CASE("asamples", "[.cmd]") { +TEST_CASE("CALLER::asamples", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getNumberOfAnalogSamples(); { std::ostringstream oss; - proxy.Call("asamples", {"25"}, -1, PUT, oss); + caller.call("asamples", {"25"}, -1, PUT, oss); REQUIRE(oss.str() == "asamples 25\n"); } { std::ostringstream oss; - proxy.Call("asamples", {"450"}, -1, PUT, oss); + caller.call("asamples", {"450"}, -1, PUT, oss); REQUIRE(oss.str() == "asamples 450\n"); } { std::ostringstream oss; - proxy.Call("asamples", {}, -1, GET, oss); + caller.call("asamples", {}, -1, GET, oss); REQUIRE(oss.str() == "asamples 450\n"); } for (int i = 0; i != det.size(); ++i) { det.setNumberOfAnalogSamples(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("asamples", {}, -1, GET)); + REQUIRE_THROWS(caller.call("asamples", {}, -1, GET)); } } -TEST_CASE("adcclk", "[.cmd]") { +TEST_CASE("CALLER::adcclk", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getADCClock(); { std::ostringstream oss; - proxy.Call("adcclk", {"20"}, -1, PUT, oss); + caller.call("adcclk", {"20"}, -1, PUT, oss); REQUIRE(oss.str() == "adcclk 20\n"); } { std::ostringstream oss; - proxy.Call("adcclk", {"10"}, -1, PUT, oss); + caller.call("adcclk", {"10"}, -1, PUT, oss); REQUIRE(oss.str() == "adcclk 10\n"); } { std::ostringstream oss; - proxy.Call("adcclk", {}, -1, GET, oss); + caller.call("adcclk", {}, -1, GET, oss); REQUIRE(oss.str() == "adcclk 10\n"); } for (int i = 0; i != det.size(); ++i) { @@ -694,30 +691,30 @@ TEST_CASE("adcclk", "[.cmd]") { } } else { // clock index might work - // REQUIRE_THROWS(proxy.Call("adcclk", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("adcclk", {}, -1, GET)); } } -TEST_CASE("runclk", "[.cmd]") { +TEST_CASE("CALLER::runclk", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getRUNClock(); { std::ostringstream oss; - proxy.Call("runclk", {"20"}, -1, PUT, oss); + caller.call("runclk", {"20"}, -1, PUT, oss); REQUIRE(oss.str() == "runclk 20\n"); } { std::ostringstream oss; - proxy.Call("runclk", {"10"}, -1, PUT, oss); + caller.call("runclk", {"10"}, -1, PUT, oss); REQUIRE(oss.str() == "runclk 10\n"); } { std::ostringstream oss; - proxy.Call("runclk", {}, -1, GET, oss); + caller.call("runclk", {}, -1, GET, oss); REQUIRE(oss.str() == "runclk 10\n"); } for (int i = 0; i != det.size(); ++i) { @@ -725,47 +722,47 @@ TEST_CASE("runclk", "[.cmd]") { } } else { // clock index might work - // REQUIRE_THROWS(proxy.Call("runclk", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("runclk", {}, -1, GET)); } } -TEST_CASE("syncclk", "[.cmd]") { +TEST_CASE("CALLER::syncclk", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("syncclk", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("syncclk", {}, -1, GET)); } else { // clock index might work - // REQUIRE_THROWS(proxy.Call("syncclk", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("syncclk", {}, -1, GET)); } } -TEST_CASE("v_limit", "[.cmd]") { +TEST_CASE("CALLER::v_limit", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getPower(defs::V_LIMIT); { std::ostringstream oss; - proxy.Call("v_limit", {"1500"}, -1, PUT, oss); + caller.call("v_limit", {"1500"}, -1, PUT, oss); REQUIRE(oss.str() == "v_limit 1500\n"); } { std::ostringstream oss; - proxy.Call("v_limit", {"0"}, -1, PUT, oss); + caller.call("v_limit", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "v_limit 0\n"); } { std::ostringstream oss; - proxy.Call("v_limit", {"0"}, -1, PUT, oss); + caller.call("v_limit", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "v_limit 0\n"); } { std::ostringstream oss; - proxy.Call("v_limit", {}, -1, GET, oss); + caller.call("v_limit", {}, -1, GET, oss); REQUIRE(oss.str() == "v_limit 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -775,165 +772,165 @@ TEST_CASE("v_limit", "[.cmd]") { det.setPower(defs::V_LIMIT, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("v_limit", {}, -1, GET)); + REQUIRE_THROWS(caller.call("v_limit", {}, -1, GET)); } } -TEST_CASE("adcenable", "[.cmd]") { +TEST_CASE("CALLER::adcenable", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getADCEnableMask(); { std::ostringstream oss; - proxy.Call("adcenable", {"0x8d0aa0d8"}, -1, PUT, oss); + caller.call("adcenable", {"0x8d0aa0d8"}, -1, PUT, oss); REQUIRE(oss.str() == "adcenable 0x8d0aa0d8\n"); } { std::ostringstream oss; - proxy.Call("adcenable", {"0xffffffff"}, -1, PUT, oss); + caller.call("adcenable", {"0xffffffff"}, -1, PUT, oss); REQUIRE(oss.str() == "adcenable 0xffffffff\n"); } { std::ostringstream oss; - proxy.Call("adcenable", {}, -1, GET, oss); + caller.call("adcenable", {}, -1, GET, oss); REQUIRE(oss.str() == "adcenable 0xffffffff\n"); } for (int i = 0; i != det.size(); ++i) { det.setADCEnableMask(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("adcenable", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adcenable", {}, -1, GET)); } } -TEST_CASE("adcenable10g", "[.cmd]") { +TEST_CASE("CALLER::adcenable10g", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getTenGigaADCEnableMask(); { std::ostringstream oss; - proxy.Call("adcenable10g", {"0xff0000ff"}, -1, PUT, oss); + caller.call("adcenable10g", {"0xff0000ff"}, -1, PUT, oss); REQUIRE(oss.str() == "adcenable10g 0xff0000ff\n"); } { std::ostringstream oss; - proxy.Call("adcenable10g", {"0xffffffff"}, -1, PUT, oss); + caller.call("adcenable10g", {"0xffffffff"}, -1, PUT, oss); REQUIRE(oss.str() == "adcenable10g 0xffffffff\n"); } { std::ostringstream oss; - proxy.Call("adcenable10g", {}, -1, GET, oss); + caller.call("adcenable10g", {}, -1, GET, oss); REQUIRE(oss.str() == "adcenable10g 0xffffffff\n"); } for (int i = 0; i != det.size(); ++i) { det.setTenGigaADCEnableMask(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("adcenable10g", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adcenable10g", {}, -1, GET)); } } -TEST_CASE("transceiverenable", "[.cmd]") { +TEST_CASE("CALLER::transceiverenable", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getTransceiverEnableMask(); { std::ostringstream oss; - proxy.Call("transceiverenable", {"0x3"}, -1, PUT, oss); + caller.call("transceiverenable", {"0x3"}, -1, PUT, oss); REQUIRE(oss.str() == "transceiverenable 0x3\n"); } { std::ostringstream oss; - proxy.Call("transceiverenable", {"0xf"}, -1, PUT, oss); + caller.call("transceiverenable", {"0xf"}, -1, PUT, oss); REQUIRE(oss.str() == "transceiverenable 0xf\n"); } { std::ostringstream oss; - proxy.Call("transceiverenable", {}, -1, GET, oss); + caller.call("transceiverenable", {}, -1, GET, oss); REQUIRE(oss.str() == "transceiverenable 0xf\n"); } for (int i = 0; i != det.size(); ++i) { det.setTransceiverEnableMask(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("transceiverenable", {}, -1, GET)); + REQUIRE_THROWS(caller.call("transceiverenable", {}, -1, GET)); } } /* CTB Specific */ -TEST_CASE("dsamples", "[.cmd]") { +TEST_CASE("CALLER::dsamples", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getNumberOfDigitalSamples(); { std::ostringstream oss; - proxy.Call("dsamples", {"1"}, -1, PUT, oss); + caller.call("dsamples", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "dsamples 1\n"); } { std::ostringstream oss; - proxy.Call("dsamples", {"450"}, -1, PUT, oss); + caller.call("dsamples", {"450"}, -1, PUT, oss); REQUIRE(oss.str() == "dsamples 450\n"); } { std::ostringstream oss; - proxy.Call("dsamples", {}, -1, GET, oss); + caller.call("dsamples", {}, -1, GET, oss); REQUIRE(oss.str() == "dsamples 450\n"); } for (int i = 0; i != det.size(); ++i) { det.setNumberOfDigitalSamples(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("dsamples", {}, -1, GET)); + REQUIRE_THROWS(caller.call("dsamples", {}, -1, GET)); } } -TEST_CASE("tsamples", "[.cmd]") { +TEST_CASE("CALLER::tsamples", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getNumberOfTransceiverSamples(); { std::ostringstream oss; - proxy.Call("tsamples", {"1"}, -1, PUT, oss); + caller.call("tsamples", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "tsamples 1\n"); } { std::ostringstream oss; - proxy.Call("tsamples", {"450"}, -1, PUT, oss); + caller.call("tsamples", {"450"}, -1, PUT, oss); REQUIRE(oss.str() == "tsamples 450\n"); } { std::ostringstream oss; - proxy.Call("tsamples", {}, -1, GET, oss); + caller.call("tsamples", {}, -1, GET, oss); REQUIRE(oss.str() == "tsamples 450\n"); } for (int i = 0; i != det.size(); ++i) { det.setNumberOfTransceiverSamples(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("tsamples", {}, -1, GET)); + REQUIRE_THROWS(caller.call("tsamples", {}, -1, GET)); } } -TEST_CASE("romode", "[.cmd]") { +TEST_CASE("CALLER::romode", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_romode = det.getReadoutMode(); @@ -945,32 +942,32 @@ TEST_CASE("romode", "[.cmd]") { det.setNumberOfTransceiverSamples(5000); { std::ostringstream oss; - proxy.Call("romode", {"digital"}, -1, PUT, oss); + caller.call("romode", {"digital"}, -1, PUT, oss); REQUIRE(oss.str() == "romode digital\n"); } { std::ostringstream oss; - proxy.Call("romode", {"analog_digital"}, -1, PUT, oss); + caller.call("romode", {"analog_digital"}, -1, PUT, oss); REQUIRE(oss.str() == "romode analog_digital\n"); } { std::ostringstream oss; - proxy.Call("romode", {"analog"}, -1, PUT, oss); + caller.call("romode", {"analog"}, -1, PUT, oss); REQUIRE(oss.str() == "romode analog\n"); } { std::ostringstream oss; - proxy.Call("romode", {}, -1, GET, oss); + caller.call("romode", {}, -1, GET, oss); REQUIRE(oss.str() == "romode analog\n"); } { std::ostringstream oss; - proxy.Call("romode", {"transceiver"}, -1, PUT, oss); + caller.call("romode", {"transceiver"}, -1, PUT, oss); REQUIRE(oss.str() == "romode transceiver\n"); } { std::ostringstream oss; - proxy.Call("romode", {"digital_transceiver"}, -1, PUT, oss); + caller.call("romode", {"digital_transceiver"}, -1, PUT, oss); REQUIRE(oss.str() == "romode digital_transceiver\n"); } for (int i = 0; i != det.size(); ++i) { @@ -980,30 +977,30 @@ TEST_CASE("romode", "[.cmd]") { det.setNumberOfTransceiverSamples(prev_tsamples[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("romode", {}, -1, GET)); + REQUIRE_THROWS(caller.call("romode", {}, -1, GET)); } } -TEST_CASE("dbitclk", "[.cmd]") { +TEST_CASE("CALLER::dbitclk", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getRUNClock(); { std::ostringstream oss; - proxy.Call("dbitclk", {"20"}, -1, PUT, oss); + caller.call("dbitclk", {"20"}, -1, PUT, oss); REQUIRE(oss.str() == "dbitclk 20\n"); } { std::ostringstream oss; - proxy.Call("dbitclk", {"10"}, -1, PUT, oss); + caller.call("dbitclk", {"10"}, -1, PUT, oss); REQUIRE(oss.str() == "dbitclk 10\n"); } { std::ostringstream oss; - proxy.Call("dbitclk", {}, -1, GET, oss); + caller.call("dbitclk", {}, -1, GET, oss); REQUIRE(oss.str() == "dbitclk 10\n"); } for (int i = 0; i != det.size(); ++i) { @@ -1011,353 +1008,354 @@ TEST_CASE("dbitclk", "[.cmd]") { } } else { // clock index might work - // REQUIRE_THROWS(proxy.Call("dbitclk", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("dbitclk", {}, -1, GET)); } } -TEST_CASE("v_a", "[.cmd]") { +TEST_CASE("CALLER::v_a", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getPower(defs::V_POWER_A); { std::ostringstream oss1, oss2; - proxy.Call("v_a", {"700"}, -1, PUT, oss1); + caller.call("v_a", {"700"}, -1, PUT, oss1); REQUIRE(oss1.str() == "v_a 700\n"); - proxy.Call("v_a", {}, -1, GET, oss2); + caller.call("v_a", {}, -1, GET, oss2); REQUIRE(oss2.str() == "v_a 700\n"); } for (int i = 0; i != det.size(); ++i) { det.setPower(defs::V_POWER_A, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("v_a", {}, -1, GET)); + REQUIRE_THROWS(caller.call("v_a", {}, -1, GET)); } } -TEST_CASE("v_b", "[.cmd]") { +TEST_CASE("CALLER::v_b", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getPower(defs::V_POWER_B); { std::ostringstream oss1, oss2; - proxy.Call("v_b", {"700"}, -1, PUT, oss1); + caller.call("v_b", {"700"}, -1, PUT, oss1); REQUIRE(oss1.str() == "v_b 700\n"); - proxy.Call("v_b", {}, -1, GET, oss2); + caller.call("v_b", {}, -1, GET, oss2); REQUIRE(oss2.str() == "v_b 700\n"); } for (int i = 0; i != det.size(); ++i) { det.setPower(defs::V_POWER_B, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("v_b", {}, -1, GET)); + REQUIRE_THROWS(caller.call("v_b", {}, -1, GET)); } } -TEST_CASE("v_c", "[.cmd]") { +TEST_CASE("CALLER::v_c", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getPower(defs::V_POWER_C); { std::ostringstream oss1, oss2; - proxy.Call("v_c", {"700"}, -1, PUT, oss1); + caller.call("v_c", {"700"}, -1, PUT, oss1); REQUIRE(oss1.str() == "v_c 700\n"); - proxy.Call("v_c", {}, -1, GET, oss2); + caller.call("v_c", {}, -1, GET, oss2); REQUIRE(oss2.str() == "v_c 700\n"); } for (int i = 0; i != det.size(); ++i) { det.setPower(defs::V_POWER_C, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("v_c", {}, -1, GET)); + REQUIRE_THROWS(caller.call("v_c", {}, -1, GET)); } } -TEST_CASE("v_d", "[.cmd]") { +TEST_CASE("CALLER::v_d", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getPower(defs::V_POWER_D); { std::ostringstream oss1, oss2; - proxy.Call("v_d", {"700"}, -1, PUT, oss1); + caller.call("v_d", {"700"}, -1, PUT, oss1); REQUIRE(oss1.str() == "v_d 700\n"); - proxy.Call("v_d", {}, -1, GET, oss2); + caller.call("v_d", {}, -1, GET, oss2); REQUIRE(oss2.str() == "v_d 700\n"); } for (int i = 0; i != det.size(); ++i) { det.setPower(defs::V_POWER_D, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("v_d", {}, -1, GET)); + REQUIRE_THROWS(caller.call("v_d", {}, -1, GET)); } } -TEST_CASE("v_io", "[.cmd]") { +TEST_CASE("CALLER::v_io", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { // better not to play with setting it - REQUIRE_NOTHROW(proxy.Call("v_io", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("v_io", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("v_io", {}, -1, GET)); + REQUIRE_THROWS(caller.call("v_io", {}, -1, GET)); } } -TEST_CASE("v_chip", "[.cmd]") { +TEST_CASE("CALLER::v_chip", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { // better not to play with setting it - REQUIRE_NOTHROW(proxy.Call("v_chip", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("v_chip", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("v_chip", {}, -1, GET)); + REQUIRE_THROWS(caller.call("v_chip", {}, -1, GET)); } } -TEST_CASE("vm_a", "[.cmd]") { +TEST_CASE("CALLER::vm_a", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("vm_a", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("vm_a", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("vm_a", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vm_a", {}, -1, GET)); } } -TEST_CASE("vm_b", "[.cmd]") { +TEST_CASE("CALLER::vm_b", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("vm_b", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("vm_b", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("vm_b", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vm_b", {}, -1, GET)); } } -TEST_CASE("vm_c", "[.cmd]") { +TEST_CASE("CALLER::vm_c", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("vm_c", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("vm_c", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("vm_c", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vm_c", {}, -1, GET)); } } -TEST_CASE("vm_d", "[.cmd]") { +TEST_CASE("CALLER::vm_d", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("vm_d", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("vm_d", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("vm_d", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vm_d", {}, -1, GET)); } } -TEST_CASE("vm_io", "[.cmd]") { +TEST_CASE("CALLER::vm_io", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("vm_io", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("vm_io", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("vm_io", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vm_io", {}, -1, GET)); } } -TEST_CASE("im_a", "[.cmd]") { +TEST_CASE("CALLER::im_a", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("im_a", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("im_a", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("im_a", {}, -1, GET)); + REQUIRE_THROWS(caller.call("im_a", {}, -1, GET)); } } -TEST_CASE("im_b", "[.cmd]") { +TEST_CASE("CALLER::im_b", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("im_b", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("im_b", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("im_b", {}, -1, GET)); + REQUIRE_THROWS(caller.call("im_b", {}, -1, GET)); } } -TEST_CASE("im_c", "[.cmd]") { +TEST_CASE("CALLER::im_c", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("im_c", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("im_c", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("im_c", {}, -1, GET)); + REQUIRE_THROWS(caller.call("im_c", {}, -1, GET)); } } -TEST_CASE("im_d", "[.cmd]") { +TEST_CASE("CALLER::im_d", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("im_d", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("im_d", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("im_d", {}, -1, GET)); + REQUIRE_THROWS(caller.call("im_d", {}, -1, GET)); } } -TEST_CASE("im_io", "[.cmd]") { +TEST_CASE("CALLER::im_io", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("im_io", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("im_io", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("im_io", {}, -1, GET)); + REQUIRE_THROWS(caller.call("im_io", {}, -1, GET)); } } -TEST_CASE("adc", "[.cmd]") { +TEST_CASE("CALLER::adc", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { for (int i = 0; i <= 7; ++i) { - REQUIRE_NOTHROW(proxy.Call("adc", {std::to_string(i)}, -1, GET)); - REQUIRE_THROWS(proxy.Call("adc", {"0"}, -1, PUT)); + REQUIRE_NOTHROW( + caller.call("slowadc", {std::to_string(i)}, -1, GET)); + REQUIRE_THROWS(caller.call("slowadc", {"0"}, -1, PUT)); } } else { - REQUIRE_THROWS(proxy.Call("adc", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("slowadc", {"0"}, -1, GET)); } } -TEST_CASE("extsampling", "[.cmd]") { +TEST_CASE("CALLER::extsampling", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getExternalSampling(); { std::ostringstream oss; - proxy.Call("extsampling", {"1"}, -1, PUT, oss); + caller.call("extsampling", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "extsampling 1\n"); } { std::ostringstream oss; - proxy.Call("extsampling", {"0"}, -1, PUT, oss); + caller.call("extsampling", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "extsampling 0\n"); } { std::ostringstream oss; - proxy.Call("extsampling", {}, -1, GET, oss); + caller.call("extsampling", {}, -1, GET, oss); REQUIRE(oss.str() == "extsampling 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setExternalSampling(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("extsampling", {}, -1, GET)); + REQUIRE_THROWS(caller.call("extsampling", {}, -1, GET)); } } -TEST_CASE("extsamplingsrc", "[.cmd]") { +TEST_CASE("CALLER::extsamplingsrc", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getExternalSamplingSource(); { std::ostringstream oss; - proxy.Call("extsamplingsrc", {"63"}, -1, PUT, oss); + caller.call("extsamplingsrc", {"63"}, -1, PUT, oss); REQUIRE(oss.str() == "extsamplingsrc 63\n"); } { std::ostringstream oss; - proxy.Call("extsamplingsrc", {"0"}, -1, PUT, oss); + caller.call("extsamplingsrc", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "extsamplingsrc 0\n"); } { std::ostringstream oss; - proxy.Call("extsamplingsrc", {}, -1, GET, oss); + caller.call("extsamplingsrc", {}, -1, GET, oss); REQUIRE(oss.str() == "extsamplingsrc 0\n"); } - REQUIRE_THROWS(proxy.Call("extsamplingsrc", {"64"}, -1, PUT)); + REQUIRE_THROWS(caller.call("extsamplingsrc", {"64"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setExternalSamplingSource(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("extsamplingsrc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("extsamplingsrc", {}, -1, GET)); } } -TEST_CASE("diodelay", "[.cmd]") { +TEST_CASE("CALLER::diodelay", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { { std::ostringstream oss; - proxy.Call("diodelay", {"0x01010", "0"}, -1, PUT, oss); + caller.call("diodelay", {"0x01010", "0"}, -1, PUT, oss); REQUIRE(oss.str() == "diodelay [0x01010, 0]\n"); } { std::ostringstream oss; - proxy.Call("diodelay", {"0x01010", "775"}, -1, PUT, oss); + caller.call("diodelay", {"0x01010", "775"}, -1, PUT, oss); REQUIRE(oss.str() == "diodelay [0x01010, 775]\n"); } - REQUIRE_THROWS(proxy.Call("diodelay", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("diodelay", {"0x01010", "776"}, -1, GET)); + REQUIRE_THROWS(caller.call("diodelay", {}, -1, GET)); + REQUIRE_THROWS(caller.call("diodelay", {"0x01010", "776"}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("diodelay", {"0x01010", "775"}, -1, PUT)); + REQUIRE_THROWS(caller.call("diodelay", {"0x01010", "775"}, -1, PUT)); } } -TEST_CASE("led", "[.cmd]") { +TEST_CASE("CALLER::led", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getLEDEnable(); { std::ostringstream oss; - proxy.Call("led", {"1"}, -1, PUT, oss); + caller.call("led", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "led 1\n"); } { std::ostringstream oss; - proxy.Call("led", {"0"}, -1, PUT, oss); + caller.call("led", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "led 0\n"); } { std::ostringstream oss; - proxy.Call("led", {}, -1, GET, oss); + caller.call("led", {}, -1, GET, oss); REQUIRE(oss.str() == "led 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setLEDEnable(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("led", {}, -1, GET)); + REQUIRE_THROWS(caller.call("led", {}, -1, GET)); } } diff --git a/slsDetectorSoftware/tests/test-CmdProxy-eiger.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-eiger.cpp similarity index 52% rename from slsDetectorSoftware/tests/test-CmdProxy-eiger.cpp rename to slsDetectorSoftware/tests/Caller/test-Caller-eiger.cpp index ebab79135..1df82c68f 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-eiger.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-eiger.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" +#include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" #include "sls/sls_detector_defs.h" @@ -9,7 +9,7 @@ #include #include "sls/versionAPI.h" -#include "test-CmdProxy-global.h" +#include "test-Caller-global.h" #include "tests/globals.h" namespace sls { @@ -19,137 +19,143 @@ using test::PUT; /** temperature */ -TEST_CASE("temp_fpgaext", "[.cmd]") { +TEST_CASE("CALLER::temp_fpgaext", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_NOTHROW(proxy.Call("temp_fpgaext", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("temp_fpgaext", {}, -1, GET)); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("temp_fpgaext", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("temp_fpgaext", {}, 0, GET, oss)); std::string s = (oss.str()).erase(0, strlen("temp_fpgaext ")); REQUIRE(std::stoi(s) != -1); } else { - REQUIRE_THROWS(proxy.Call("temp_fpgaext", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_fpgaext", {}, -1, GET)); } } -TEST_CASE("temp_10ge", "[.cmd]") { +TEST_CASE("CALLER::temp_10ge", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_NOTHROW(proxy.Call("temp_10ge", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("temp_10ge", {}, -1, GET)); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("temp_10ge", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("temp_10ge", {}, 0, GET, oss)); std::string s = (oss.str()).erase(0, strlen("temp_10ge ")); REQUIRE(std::stoi(s) != -1); } else { - REQUIRE_THROWS(proxy.Call("temp_10ge", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_10ge", {}, -1, GET)); } } -TEST_CASE("temp_dcdc", "[.cmd]") { +TEST_CASE("CALLER::temp_dcdc", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_NOTHROW(proxy.Call("temp_dcdc", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("temp_dcdc", {}, -1, GET)); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("temp_dcdc", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("temp_dcdc", {}, 0, GET, oss)); std::string s = (oss.str()).erase(0, strlen("temp_dcdc ")); REQUIRE(std::stoi(s) != -1); } else { - REQUIRE_THROWS(proxy.Call("temp_dcdc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_dcdc", {}, -1, GET)); } } -TEST_CASE("temp_sodl", "[.cmd]") { +TEST_CASE("CALLER::temp_sodl", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_NOTHROW(proxy.Call("temp_sodl", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("temp_sodl", {}, -1, GET)); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("temp_sodl", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("temp_sodl", {}, 0, GET, oss)); std::string s = (oss.str()).erase(0, strlen("temp_sodl ")); REQUIRE(std::stoi(s) != -1); } else { - REQUIRE_THROWS(proxy.Call("temp_sodl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_sodl", {}, -1, GET)); } } -TEST_CASE("temp_sodr", "[.cmd]") { +TEST_CASE("CALLER::temp_sodr", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_NOTHROW(proxy.Call("temp_sodr", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("temp_sodr", {}, -1, GET)); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("temp_sodr", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("temp_sodr", {}, 0, GET, oss)); std::string s = (oss.str()).erase(0, strlen("temp_sodr ")); REQUIRE(std::stoi(s) != -1); } else { - REQUIRE_THROWS(proxy.Call("temp_sodr", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_sodr", {}, -1, GET)); } } -TEST_CASE("temp_fpgafl", "[.cmd]") { +TEST_CASE("CALLER::temp_fpgafl", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_NOTHROW(proxy.Call("temp_fpgafl", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("temp_fpgafl", {}, -1, GET)); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("temp_fpgafl", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("temp_fpgafl", {}, 0, GET, oss)); std::string s = (oss.str()).erase(0, strlen("temp_fpgafl ")); REQUIRE(std::stoi(s) != -1); } else { - REQUIRE_THROWS(proxy.Call("temp_fpgafl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_fpgafl", {}, -1, GET)); } } -TEST_CASE("temp_fpgafr", "[.cmd]") { +TEST_CASE("CALLER::temp_fpgafr", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_NOTHROW(proxy.Call("temp_fpgafr", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("temp_fpgafr", {}, -1, GET)); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("temp_fpgafr", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("temp_fpgafr", {}, 0, GET, oss)); std::string s = (oss.str()).erase(0, strlen("temp_fpgafr ")); REQUIRE(std::stoi(s) != -1); } else { - REQUIRE_THROWS(proxy.Call("temp_fpgafr", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_fpgafr", {}, -1, GET)); } } /* dacs */ -TEST_CASE("Setting and reading back EIGER dacs", "[.cmd][.dacs]") { +TEST_CASE("CALLER::Setting and reading back EIGER dacs", "[.cmdcall][.dacs]") { // vsvp, vtr, vrf, vrs, vsvn, vtgstv, vcmp_ll, vcmp_lr, vcal, vcmp_rl, // rxb_rb, rxb_lb, vcmp_rr, vcp, vcn, vis, vthreshold Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - SECTION("vsvp") { test_dac(defs::VSVP, "vsvp", 5); } - SECTION("vtrim") { test_dac(defs::VTRIM, "vtrim", 1200); } - SECTION("vrpreamp") { test_dac(defs::VRPREAMP, "vrpreamp", 1500); } - SECTION("vrshaper") { test_dac(defs::VRSHAPER, "vrshaper", 1510); } - SECTION("vsvn") { test_dac(defs::VSVN, "vsvn", 3800); } - SECTION("vtgstv") { test_dac(defs::VTGSTV, "vtgstv", 2550); } - SECTION("vcmp_ll") { test_dac(defs::VCMP_LL, "vcmp_ll", 1400); } - SECTION("vcmp_lr") { test_dac(defs::VCMP_LR, "vcmp_lr", 1400); } - SECTION("vcal") { test_dac(defs::VCAL, "vcal", 1400); } - SECTION("vcmp_rl") { test_dac(defs::VCMP_RL, "vcmp_rl", 1400); } - SECTION("rxb_rb") { test_dac(defs::RXB_RB, "rxb_rb", 1400); } - SECTION("rxb_lb") { test_dac(defs::RXB_LB, "rxb_lb", 1400); } - SECTION("vcmp_rr") { test_dac(defs::VCMP_RR, "vcmp_rr", 1400); } - SECTION("vcp") { test_dac(defs::VCP, "vcp", 1400); } - SECTION("vcn") { test_dac(defs::VCN, "vcn", 1400); } - SECTION("vishaper") { test_dac(defs::VISHAPER, "vishaper", 1400); } - SECTION("iodelay") { test_dac(defs::IO_DELAY, "iodelay", 1400); } + SECTION("vsvp") { test_dac_caller(defs::VSVP, "vsvp", 5); } + SECTION("vtrim") { test_dac_caller(defs::VTRIM, "vtrim", 1200); } + SECTION("vrpreamp") { + test_dac_caller(defs::VRPREAMP, "vrpreamp", 1500); + } + SECTION("vrshaper") { + test_dac_caller(defs::VRSHAPER, "vrshaper", 1510); + } + SECTION("vsvn") { test_dac_caller(defs::VSVN, "vsvn", 3800); } + SECTION("vtgstv") { test_dac_caller(defs::VTGSTV, "vtgstv", 2550); } + SECTION("vcmp_ll") { test_dac_caller(defs::VCMP_LL, "vcmp_ll", 1400); } + SECTION("vcmp_lr") { test_dac_caller(defs::VCMP_LR, "vcmp_lr", 1400); } + SECTION("vcal") { test_dac_caller(defs::VCAL, "vcal", 1400); } + SECTION("vcmp_rl") { test_dac_caller(defs::VCMP_RL, "vcmp_rl", 1400); } + SECTION("rxb_rb") { test_dac_caller(defs::RXB_RB, "rxb_rb", 1400); } + SECTION("rxb_lb") { test_dac_caller(defs::RXB_LB, "rxb_lb", 1400); } + SECTION("vcmp_rr") { test_dac_caller(defs::VCMP_RR, "vcmp_rr", 1400); } + SECTION("vcp") { test_dac_caller(defs::VCP, "vcp", 1400); } + SECTION("vcn") { test_dac_caller(defs::VCN, "vcn", 1400); } + SECTION("vishaper") { + test_dac_caller(defs::VISHAPER, "vishaper", 1400); + } + SECTION("iodelay") { test_dac_caller(defs::IO_DELAY, "iodelay", 1400); } SECTION("vthreshold") { // Read out individual vcmp to be able to reset after // the test is done @@ -161,12 +167,12 @@ TEST_CASE("Setting and reading back EIGER dacs", "[.cmd][.dacs]") { { std::ostringstream oss; - proxy.Call("vthreshold", {"1234"}, -1, PUT, oss); + caller.call("dac", {"vthreshold", "1234"}, -1, PUT, oss); REQUIRE(oss.str() == "dac vthreshold 1234\n"); } { std::ostringstream oss; - proxy.Call("vthreshold", {}, -1, GET, oss); + caller.call("dac", {"vthreshold"}, -1, GET, oss); REQUIRE(oss.str() == "dac vthreshold 1234\n"); } @@ -180,54 +186,54 @@ TEST_CASE("Setting and reading back EIGER dacs", "[.cmd][.dacs]") { } } // gotthard - REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcascn_pb", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcascp_pb", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vout_cm", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcasc_out", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vin_cm", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("ib_test_c", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_ds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcascn_pb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcascp_pb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vout_cm", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcasc_out", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vin_cm", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_comp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("ib_test_c", {}, -1, GET)); // mythen3 - // REQUIRE_THROWS(proxy.Call("vrpreamp", {}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("vrshaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vrshaper_n", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vipre", {}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("vishaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vdcsh", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vth1", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vth2", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vth3", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcal_n", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcal_p", {}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("vtrim", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcassh", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcas", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vicin", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vipre_out", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("vrpreamp", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("vrshaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrshaper_n", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vipre", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("vishaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vdcsh", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vth1", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vth2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vth3", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcal_n", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcal_p", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("vtrim", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcassh", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcas", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vicin", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vipre_out", {}, -1, GET)); // gotthard2 - REQUIRE_THROWS(proxy.Call("vref_h_adc", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_comp_fe", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_comp_adc", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcom_cds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_rstore", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_opa_1st", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_comp_fe", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcom_adc1", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_l_adc", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_cds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_cs", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_opa_fd", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcom_adc2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_h_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_comp_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcom_cds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_rstore", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_opa_1st", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcom_adc1", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_l_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_cds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_cs", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_opa_fd", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcom_adc2", {}, -1, GET)); // jungfrau - REQUIRE_THROWS(proxy.Call("vb_comp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vdd_prot", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vin_com", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_prech", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_pixbuf", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_ds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_comp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vdd_prot", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vin_com", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_prech", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_pixbuf", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_ds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_ds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_comp", {}, -1, GET)); } } @@ -235,116 +241,116 @@ TEST_CASE("Setting and reading back EIGER dacs", "[.cmd][.dacs]") { /* Network Configuration (Detector<->Receiver) */ -TEST_CASE("txdelay_left", "[.cmd]") { +TEST_CASE("CALLER::txdelay_left", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_val = det.getTransmissionDelayLeft(); { std::ostringstream oss1, oss2; - proxy.Call("txdelay_left", {"5000"}, -1, PUT, oss1); + caller.call("txdelay_left", {"5000"}, -1, PUT, oss1); REQUIRE(oss1.str() == "txdelay_left 5000\n"); - proxy.Call("txdelay_left", {}, -1, GET, oss2); + caller.call("txdelay_left", {}, -1, GET, oss2); REQUIRE(oss2.str() == "txdelay_left 5000\n"); } for (int i = 0; i != det.size(); ++i) { det.setTransmissionDelayLeft(prev_val[i]); } } else { - REQUIRE_THROWS(proxy.Call("txdelay_left", {}, -1, GET)); + REQUIRE_THROWS(caller.call("txdelay_left", {}, -1, GET)); } } -TEST_CASE("txdelay_right", "[.cmd]") { +TEST_CASE("CALLER::txdelay_right", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_val = det.getTransmissionDelayRight(); { std::ostringstream oss1, oss2; - proxy.Call("txdelay_right", {"5000"}, -1, PUT, oss1); + caller.call("txdelay_right", {"5000"}, -1, PUT, oss1); REQUIRE(oss1.str() == "txdelay_right 5000\n"); - proxy.Call("txdelay_right", {}, -1, GET, oss2); + caller.call("txdelay_right", {}, -1, GET, oss2); REQUIRE(oss2.str() == "txdelay_right 5000\n"); } for (int i = 0; i != det.size(); ++i) { det.setTransmissionDelayRight(prev_val[i]); } } else { - REQUIRE_THROWS(proxy.Call("txdelay_right", {}, -1, GET)); + REQUIRE_THROWS(caller.call("txdelay_right", {}, -1, GET)); } } /* Eiger Specific */ -TEST_CASE("subexptime", "[.cmd]") { +TEST_CASE("CALLER::subexptime", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto time = det.getSubExptime(); std::ostringstream oss1, oss2; - proxy.Call("subexptime", {"2.5us"}, -1, PUT, oss1); + caller.call("subexptime", {"2.5us"}, -1, PUT, oss1); REQUIRE(oss1.str() == "subexptime 2.5us\n"); - proxy.Call("subexptime", {}, -1, GET, oss2); + caller.call("subexptime", {}, -1, GET, oss2); REQUIRE(oss2.str() == "subexptime 2.5us\n"); for (int i = 0; i != det.size(); ++i) { det.setSubExptime(time[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("subexptime", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("subexptime", {"2.13"}, -1, PUT)); + REQUIRE_THROWS(caller.call("subexptime", {}, -1, GET)); + REQUIRE_THROWS(caller.call("subexptime", {"2.13"}, -1, PUT)); } } -TEST_CASE("subdeadtime", "[.cmd]") { +TEST_CASE("CALLER::subdeadtime", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto time = det.getSubDeadTime(); std::ostringstream oss1, oss2; - proxy.Call("subdeadtime", {"500us"}, -1, PUT, oss1); + caller.call("subdeadtime", {"500us"}, -1, PUT, oss1); REQUIRE(oss1.str() == "subdeadtime 500us\n"); - proxy.Call("subdeadtime", {}, -1, GET, oss2); + caller.call("subdeadtime", {}, -1, GET, oss2); REQUIRE(oss2.str() == "subdeadtime 500us\n"); for (int i = 0; i != det.size(); ++i) { det.setSubDeadTime(time[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("subdeadtime", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("subdeadtime", {"2.13"}, -1, PUT)); + REQUIRE_THROWS(caller.call("subdeadtime", {}, -1, GET)); + REQUIRE_THROWS(caller.call("subdeadtime", {"2.13"}, -1, PUT)); } } -TEST_CASE("overflow", "[.cmd]") { +TEST_CASE("CALLER::overflow", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto previous = det.getOverFlowMode(); std::ostringstream oss1, oss2, oss3; - proxy.Call("overflow", {"1"}, -1, PUT, oss1); + caller.call("overflow", {"1"}, -1, PUT, oss1); REQUIRE(oss1.str() == "overflow 1\n"); - proxy.Call("overflow", {}, -1, GET, oss2); + caller.call("overflow", {}, -1, GET, oss2); REQUIRE(oss2.str() == "overflow 1\n"); - proxy.Call("overflow", {"0"}, -1, PUT, oss3); + caller.call("overflow", {"0"}, -1, PUT, oss3); REQUIRE(oss3.str() == "overflow 0\n"); for (int i = 0; i != det.size(); ++i) { det.setOverFlowMode(previous[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("overflow", {}, -1, GET)); + REQUIRE_THROWS(caller.call("overflow", {}, -1, GET)); } } -TEST_CASE("ratecorr", "[.cmd]") { +TEST_CASE("CALLER::ratecorr", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_dr = det.getDynamicRange().tsquash("inconsistent dr to test"); @@ -352,19 +358,19 @@ TEST_CASE("ratecorr", "[.cmd]") { det.setDynamicRange(16); { std::ostringstream oss; - proxy.Call("ratecorr", {"120"}, -1, PUT, oss); + caller.call("ratecorr", {"120"}, -1, PUT, oss); REQUIRE(oss.str() == "ratecorr 120ns\n"); } { std::ostringstream oss; - proxy.Call("ratecorr", {}, -1, GET, oss); + caller.call("ratecorr", {}, -1, GET, oss); REQUIRE(oss.str() == "ratecorr 120ns\n"); } // may fail if default settings not loaded - // REQUIRE_NOTHROW(proxy.Call("ratecorr", {"-1"}, -1, PUT)); + // REQUIRE_NOTHROW(caller.call("ratecorr", {"-1"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("ratecorr", {"0"}, -1, PUT, oss); + caller.call("ratecorr", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "ratecorr 0ns\n"); } for (int i = 0; i != det.size(); ++i) { @@ -372,37 +378,37 @@ TEST_CASE("ratecorr", "[.cmd]") { } det.setDynamicRange(prev_dr); } else { - REQUIRE_THROWS(proxy.Call("ratecorr", {}, -1, GET)); + REQUIRE_THROWS(caller.call("ratecorr", {}, -1, GET)); } } -TEST_CASE("interruptsubframe", "[.cmd]") { +TEST_CASE("CALLER::interruptsubframe", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_val = det.getInterruptSubframe(); std::ostringstream oss1, oss2, oss3; - proxy.Call("interruptsubframe", {"1"}, -1, PUT, oss1); + caller.call("interruptsubframe", {"1"}, -1, PUT, oss1); REQUIRE(oss1.str() == "interruptsubframe 1\n"); - proxy.Call("interruptsubframe", {}, -1, GET, oss2); + caller.call("interruptsubframe", {}, -1, GET, oss2); REQUIRE(oss2.str() == "interruptsubframe 1\n"); - proxy.Call("interruptsubframe", {"0"}, -1, PUT, oss3); + caller.call("interruptsubframe", {"0"}, -1, PUT, oss3); REQUIRE(oss3.str() == "interruptsubframe 0\n"); for (int i = 0; i != det.size(); ++i) { det.setInterruptSubframe(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("interruptsubframe", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("interruptsubframe", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("interruptsubframe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("interruptsubframe", {"1"}, -1, PUT)); } } -TEST_CASE("measuredperiod", "[.cmd]") { +TEST_CASE("CALLER::measuredperiod", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_frames = det.getNumberOfFrames().tsquash( @@ -416,7 +422,7 @@ TEST_CASE("measuredperiod", "[.cmd]") { det.startDetector(); std::this_thread::sleep_for(std::chrono::seconds(3)); std::ostringstream oss; - proxy.Call("measuredperiod", {}, -1, GET, oss); + caller.call("measuredperiod", {}, -1, GET, oss); std::string st = oss.str(); std::string s; if (st.find('[') != std::string::npos) { @@ -433,13 +439,13 @@ TEST_CASE("measuredperiod", "[.cmd]") { det.setNumberOfFrames(prev_frames); det.setTimingMode(prev_timing); } else { - REQUIRE_THROWS(proxy.Call("measuredperiod", {}, -1, GET)); + REQUIRE_THROWS(caller.call("measuredperiod", {}, -1, GET)); } } -TEST_CASE("measuredsubperiod", "[.cmd]") { +TEST_CASE("CALLER::measuredsubperiod", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_frames = det.getNumberOfFrames().tsquash( @@ -455,7 +461,7 @@ TEST_CASE("measuredsubperiod", "[.cmd]") { det.startDetector(); std::this_thread::sleep_for(std::chrono::seconds(3)); std::ostringstream oss; - proxy.Call("measuredsubperiod", {}, -1, GET, oss); + caller.call("measuredsubperiod", {}, -1, GET, oss); std::string st = oss.str(); std::string s; if (st.find('[') != std::string::npos) { @@ -473,29 +479,29 @@ TEST_CASE("measuredsubperiod", "[.cmd]") { det.setTimingMode(prev_timing); det.setDynamicRange(prev_dr); } else { - REQUIRE_THROWS(proxy.Call("measuredsubperiod", {}, -1, GET)); + REQUIRE_THROWS(caller.call("measuredsubperiod", {}, -1, GET)); } } -TEST_CASE("activate", "[.cmd]") { +TEST_CASE("CALLER::activate", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_val = det.getActive(); { std::ostringstream oss; - proxy.Call("activate", {"1"}, -1, PUT, oss); + caller.call("activate", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "activate 1\n"); } { std::ostringstream oss; - proxy.Call("activate", {}, -1, GET, oss); + caller.call("activate", {}, -1, GET, oss); REQUIRE(oss.str() == "activate 1\n"); } { std::ostringstream oss; - proxy.Call("activate", {"0"}, -1, PUT, oss); + caller.call("activate", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "activate 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -503,137 +509,137 @@ TEST_CASE("activate", "[.cmd]") { } } else { - REQUIRE_THROWS(proxy.Call("activate", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("activate", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("activate", {}, -1, GET)); + REQUIRE_THROWS(caller.call("activate", {"1"}, -1, PUT)); } } -TEST_CASE("partialreset", "[.cmd]") { +TEST_CASE("CALLER::partialreset", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_val = det.getPartialReset(); std::ostringstream oss1, oss2, oss3; - proxy.Call("partialreset", {"1"}, -1, PUT, oss1); + caller.call("partialreset", {"1"}, -1, PUT, oss1); REQUIRE(oss1.str() == "partialreset 1\n"); - proxy.Call("partialreset", {}, -1, GET, oss2); + caller.call("partialreset", {}, -1, GET, oss2); REQUIRE(oss2.str() == "partialreset 1\n"); - proxy.Call("partialreset", {"0"}, -1, PUT, oss3); + caller.call("partialreset", {"0"}, -1, PUT, oss3); REQUIRE(oss3.str() == "partialreset 0\n"); for (int i = 0; i != det.size(); ++i) { det.setPartialReset(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("partialreset", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("partialreset", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("partialreset", {}, -1, GET)); + REQUIRE_THROWS(caller.call("partialreset", {"1"}, -1, PUT)); } } -TEST_CASE("pulse", "[.cmd]") { +TEST_CASE("CALLER::pulse", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_THROWS(proxy.Call("pulse", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pulse", {}, -1, GET)); std::ostringstream oss; - proxy.Call("pulse", {"1", "1", "5"}, -1, PUT, oss); + caller.call("pulse", {"1", "1", "5"}, -1, PUT, oss); REQUIRE(oss.str() == "pulse [1, 1, 5]\n"); } else { - REQUIRE_THROWS(proxy.Call("pulse", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("pulse", {"1", "1", "5"}, -1, PUT)); + REQUIRE_THROWS(caller.call("pulse", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pulse", {"1", "1", "5"}, -1, PUT)); } } -TEST_CASE("pulsenmove", "[.cmd]") { +TEST_CASE("CALLER::pulsenmove", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_THROWS(proxy.Call("pulsenmove", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pulsenmove", {}, -1, GET)); std::ostringstream oss; - proxy.Call("pulsenmove", {"1", "1", "5"}, -1, PUT, oss); + caller.call("pulsenmove", {"1", "1", "5"}, -1, PUT, oss); REQUIRE(oss.str() == "pulsenmove [1, 1, 5]\n"); } else { - REQUIRE_THROWS(proxy.Call("pulsenmove", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("pulsenmove", {"1", "1", "5"}, -1, PUT)); + REQUIRE_THROWS(caller.call("pulsenmove", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pulsenmove", {"1", "1", "5"}, -1, PUT)); } } -TEST_CASE("pulsechip", "[.cmd]") { +TEST_CASE("CALLER::pulsechip", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_THROWS(proxy.Call("pulsechip", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pulsechip", {}, -1, GET)); std::ostringstream oss; - proxy.Call("pulsechip", {"1"}, -1, PUT, oss); + caller.call("pulsechip", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "pulsechip 1\n"); } else { - REQUIRE_THROWS(proxy.Call("pulsechip", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("pulsechip", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("pulsechip", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pulsechip", {"1"}, -1, PUT)); } } -TEST_CASE("quad", "[.cmd]") { +TEST_CASE("CALLER::quad", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_val = det.getQuad().tsquash("inconsistent quad to test"); // Quad only works with a single half module EIGER std::ostringstream oss; - proxy.Call("quad", {}, -1, GET, oss); + caller.call("quad", {}, -1, GET, oss); REQUIRE(oss.str() == "quad 0\n"); det.setQuad(prev_val); } else { - REQUIRE_THROWS(proxy.Call("quad", {}, -1, GET)); + REQUIRE_THROWS(caller.call("quad", {}, -1, GET)); } } -TEST_CASE("datastream", "[.cmd]") { +TEST_CASE("CALLER::datastream", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_val_left = det.getDataStream(defs::LEFT); auto prev_val_right = det.getDataStream(defs::RIGHT); // no "left" or "right" - REQUIRE_THROWS(proxy.Call("datastream", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("datastream", {"1"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("datastream", {"left", "0"}, -1, PUT, oss); - REQUIRE(oss.str() == "datastream left 0\n"); + caller.call("datastream", {"left", "0"}, -1, PUT, oss); + REQUIRE(oss.str() == "datastream [left, 0]\n"); } { std::ostringstream oss; - proxy.Call("datastream", {"right", "0"}, -1, PUT, oss); - REQUIRE(oss.str() == "datastream right 0\n"); + caller.call("datastream", {"right", "0"}, -1, PUT, oss); + REQUIRE(oss.str() == "datastream [right, 0]\n"); } { std::ostringstream oss; - proxy.Call("datastream", {"left", "1"}, -1, PUT, oss); - REQUIRE(oss.str() == "datastream left 1\n"); + caller.call("datastream", {"left", "1"}, -1, PUT, oss); + REQUIRE(oss.str() == "datastream [left, 1]\n"); } { std::ostringstream oss; - proxy.Call("datastream", {"right", "1"}, -1, PUT, oss); - REQUIRE(oss.str() == "datastream right 1\n"); + caller.call("datastream", {"right", "1"}, -1, PUT, oss); + REQUIRE(oss.str() == "datastream [right, 1]\n"); } for (int i = 0; i != det.size(); ++i) { det.setDataStream(defs::LEFT, prev_val_left[i], {i}); det.setDataStream(defs::RIGHT, prev_val_right[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("datastream", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("datastream", {"1"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("datastream", {"left", "1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("datastream", {}, -1, GET)); + REQUIRE_THROWS(caller.call("datastream", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("datastream", {"left", "1"}, -1, PUT)); } } -TEST_CASE("top", "[.cmd]") { +TEST_CASE("CALLER::top", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto prev_val = det.getTop(); @@ -643,19 +649,19 @@ TEST_CASE("top", "[.cmd]") { } for (int i = 0; i != numModulesTested; ++i) { std::ostringstream oss1, oss2, oss3; - proxy.Call("top", {"1"}, i, PUT, oss1); + caller.call("top", {"1"}, i, PUT, oss1); REQUIRE(oss1.str() == "top 1\n"); - proxy.Call("top", {}, i, GET, oss2); + caller.call("top", {}, i, GET, oss2); REQUIRE(oss2.str() == "top 1\n"); - proxy.Call("top", {"0"}, i, PUT, oss3); + caller.call("top", {"0"}, i, PUT, oss3); REQUIRE(oss3.str() == "top 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setTop(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("top", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("top", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("top", {}, -1, GET)); + REQUIRE_THROWS(caller.call("top", {"1"}, -1, PUT)); } } diff --git a/slsDetectorSoftware/tests/test-CmdProxy-global.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp similarity index 65% rename from slsDetectorSoftware/tests/test-CmdProxy-global.cpp rename to slsDetectorSoftware/tests/Caller/test-Caller-global.cpp index fd92bc162..7900f3340 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-global.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-global.cpp @@ -1,7 +1,7 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "test-CmdProxy-global.h" -#include "CmdProxy.h" +#include "test-Caller-global.h" +#include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" #include "tests/globals.h" @@ -10,12 +10,11 @@ namespace sls { using test::GET; using test::PUT; - -void test_valid_port(const std::string &command, - const std::vector &arguments, int detector_id, - int action) { +void test_valid_port_caller(const std::string &command, + const std::vector &arguments, + int detector_id, int action) { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); std::vector arg(arguments); if (arg.empty()) @@ -25,33 +24,34 @@ void test_valid_port(const std::string &command, for (int i = 0; i != 3; ++i) { int port_number = test_values[i]; arg[arg.size() - 1] = std::to_string(port_number); - REQUIRE_THROWS(proxy.Call(command, arg, detector_id, action)); + REQUIRE_THROWS(caller.call(command, arg, detector_id, action)); /*REQUIRE_THROWS_WITH(proxy.Call(command, arguments, detector_id, action), "Invalid port range. Must be between 1 - 65535.");*/ } } -void test_dac(defs::dacIndex index, const std::string &dacname, int dacvalue) { +void test_dac_caller(defs::dacIndex index, const std::string &dacname, + int dacvalue) { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); std::ostringstream oss_set, oss_get; auto dacstr = std::to_string(dacvalue); auto previous = det.getDAC(index, false); // chip test board if (dacname == "dac") { auto dacIndexstr = std::to_string(static_cast(index)); - proxy.Call(dacname, {dacIndexstr, dacstr}, -1, PUT, oss_set); + caller.call(dacname, {dacIndexstr, dacstr}, -1, PUT, oss_set); REQUIRE(oss_set.str() == dacname + " " + dacIndexstr + " " + dacstr + "\n"); - proxy.Call(dacname, {dacIndexstr}, -1, GET, oss_get); + caller.call(dacname, {dacIndexstr}, -1, GET, oss_get); REQUIRE(oss_get.str() == dacname + " " + dacIndexstr + " " + dacstr + "\n"); } // other detectors else { - proxy.Call("dac", {dacname, dacstr}, -1, PUT, oss_set); + caller.call("dac", {dacname, dacstr}, -1, PUT, oss_set); REQUIRE(oss_set.str() == "dac " + dacname + " " + dacstr + "\n"); - proxy.Call("dac", {dacname}, -1, GET, oss_get); + caller.call("dac", {dacname}, -1, GET, oss_get); REQUIRE(oss_get.str() == "dac " + dacname + " " + dacstr + "\n"); } // Reset all dacs to previous value @@ -60,25 +60,25 @@ void test_dac(defs::dacIndex index, const std::string &dacname, int dacvalue) { } } -void test_onchip_dac(defs::dacIndex index, const std::string &dacname, - int dacvalue) { +void test_onchip_dac_caller(defs::dacIndex index, const std::string &dacname, + int dacvalue) { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call(dacname, {}, -1, GET)); + Caller caller(&det); + REQUIRE_THROWS(caller.call(dacname, {}, -1, GET)); REQUIRE_THROWS( - proxy.Call(dacname, {"10", "0x0"}, -1, PUT)); // chip index (-1 to 9) + caller.call(dacname, {"10", "0x0"}, -1, PUT)); // chip index (-1 to 9) REQUIRE_THROWS( - proxy.Call(dacname, {"-1", "0x400"}, -1, PUT)); // max val is 0x3ff + caller.call(dacname, {"-1", "0x400"}, -1, PUT)); // max val is 0x3ff int chipIndex = -1; // for now, it is -1 only auto prev_val = det.getOnChipDAC(index, chipIndex); auto dacValueStr = ToStringHex(dacvalue); auto chipIndexStr = std::to_string(chipIndex); std::ostringstream oss_set, oss_get; - proxy.Call(dacname, {chipIndexStr, dacValueStr}, -1, PUT, oss_set); + caller.call(dacname, {chipIndexStr, dacValueStr}, -1, PUT, oss_set); REQUIRE(oss_set.str() == dacname + " " + chipIndexStr + " " + dacValueStr + "\n"); - proxy.Call(dacname, {chipIndexStr}, -1, GET, oss_get); + caller.call(dacname, {chipIndexStr}, -1, GET, oss_get); REQUIRE(oss_get.str() == dacname + " " + chipIndexStr + " " + dacValueStr + "\n"); diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-global.h b/slsDetectorSoftware/tests/Caller/test-Caller-global.h new file mode 100644 index 000000000..98fa46860 --- /dev/null +++ b/slsDetectorSoftware/tests/Caller/test-Caller-global.h @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#pragma once +#include "sls/sls_detector_defs.h" + +namespace sls { +void test_valid_port_caller(const std::string &command, + const std::vector &arguments, + int detector_id, int action); + +void test_dac_caller(slsDetectorDefs::dacIndex index, + const std::string &dacname, int dacvalue); +void test_onchip_dac_caller(slsDetectorDefs::dacIndex index, + const std::string &dacname, int dacvalue); + +} // namespace sls diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-gotthard.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-gotthard.cpp new file mode 100644 index 000000000..67d2db2d8 --- /dev/null +++ b/slsDetectorSoftware/tests/Caller/test-Caller-gotthard.cpp @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#include "Caller.h" +#include "catch.hpp" +#include "sls/Detector.h" +#include "sls/sls_detector_defs.h" +#include + +#include "sls/Result.h" +#include "sls/ToString.h" +#include "sls/versionAPI.h" +#include "test-Caller-global.h" +#include "tests/globals.h" + +namespace sls { + +using test::GET; +using test::PUT; + +/* dacs */ + +TEST_CASE("Caller::Setting and reading back GOTTHARD dacs", + "[.cmdcall][.dacs]") { + // vref_ds, vcascn_pb, vcascp_pb, vout_cm, vcasc_out, vin_cm, vref_comp, + // ib_test_c + + Detector det; + Caller caller(&det); + auto det_type = det.getDetectorType().squash(); + if (det_type == defs::GOTTHARD) { + SECTION("vref_ds") { test_dac_caller(defs::VREF_DS, "vref_ds", 660); } + SECTION("vcascn_pb") { + test_dac_caller(defs::VCASCN_PB, "vcascn_pb", 650); + } + SECTION("vcascp_pb") { + test_dac_caller(defs::VCASCP_PB, "vcascp_pb", 1480); + } + SECTION("vout_cm") { test_dac_caller(defs::VOUT_CM, "vout_cm", 1520); } + SECTION("vcasc_out") { + test_dac_caller(defs::VCASC_OUT, "vcasc_out", 1320); + } + SECTION("vin_cm") { test_dac_caller(defs::VIN_CM, "vin_cm", 1350); } + SECTION("vref_comp") { + test_dac_caller(defs::VREF_COMP, "vref_comp", 350); + } + SECTION("ib_test_c") { + test_dac_caller(defs::IB_TESTC, "ib_test_c", 2001); + } + // eiger + REQUIRE_THROWS(caller.call("dac", {"vthreshold"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vsvp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vsvn"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vtrim"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrpreamp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrshaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vtgstv"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_ll"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_lr"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcal"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_rl"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_rr"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"rxb_rb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"rxb_lb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcn"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vishaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"iodelay"}, -1, GET)); + // jungfrau + REQUIRE_THROWS(caller.call("dac", {"vb_comp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vdd_prot"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vin_com"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_prech"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_pixbuf"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_ds"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vref_ds"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vref_comp"}, -1, GET)); + // mythen3 + REQUIRE_THROWS(caller.call("dac", {"vrpreamp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrshaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrshaper_n"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vipre"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vishaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vdcsh"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vth1"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vth2"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vth3"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcal_n"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcal_p"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vtrim"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcassh"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcas"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vicin"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vipre_out"}, -1, GET)); + // gotthard2 + REQUIRE_THROWS(caller.call("dac", {"vref_h_adc"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_comp_fe"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_comp_adc"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcom_cds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_rstore"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_opa_1st"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_comp_fe"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcom_adc1"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_l_adc"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_cds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_cs"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_opa_fd"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcom_adc2"}, -1, GET)); + } +} + +/* Gotthard Specific */ + +TEST_CASE("Caller::roi", "[.cmdcall]") { + Detector det; + Caller caller(&det); + auto det_type = det.getDetectorType().squash(); + + if (det_type == defs::GOTTHARD) { + if (det.size() > 1) { + REQUIRE_THROWS(caller.call("roi", {"0", "255"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("roi", {}, -1, GET)); + } else { + auto prev_val = det.getROI(); + { + std::ostringstream oss; + caller.call("roi", {"0", "255"}, -1, PUT, oss); + REQUIRE(oss.str() == "roi [0, 255]\n"); + } + { + std::ostringstream oss; + caller.call("roi", {"256", "511"}, -1, PUT, oss); + REQUIRE(oss.str() == "roi [256, 511]\n"); + } + REQUIRE_THROWS(caller.call("roi", {"0", "256"}, -1, PUT)); + for (int i = 0; i != det.size(); ++i) { + det.setROI(prev_val[i], i); + } + } + } else { + REQUIRE_THROWS(caller.call("roi", {}, -1, GET)); + } +} + +TEST_CASE("Caller::clearroi", "[.cmdcall]") { + Detector det; + Caller caller(&det); + auto det_type = det.getDetectorType().squash(); + + if (det_type == defs::GOTTHARD) { + auto prev_val = det.getROI(); + { + std::ostringstream oss; + caller.call("clearroi", {}, -1, PUT, oss); + REQUIRE(oss.str() == "clearroi successful\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setROI(prev_val[i], i); + } + } else { + REQUIRE_THROWS(caller.call("clearroi", {}, -1, PUT)); + } +} + +TEST_CASE("Caller::exptimel", "[.cmdcall]") { + Detector det; + Caller caller(&det); + auto det_type = det.getDetectorType().squash(); + if (det_type == defs::GOTTHARD) { + REQUIRE_NOTHROW(caller.call("exptimel", {}, -1, GET)); + } else { + REQUIRE_THROWS(caller.call("exptimel", {}, -1, GET)); + } +} + +} // namespace sls diff --git a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-gotthard2.cpp similarity index 52% rename from slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp rename to slsDetectorSoftware/tests/Caller/test-Caller-gotthard2.cpp index 4cc88d954..518e519d7 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-gotthard2.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" +#include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" #include "sls/sls_detector_defs.h" @@ -9,7 +9,7 @@ #include "sls/Result.h" #include "sls/ToString.h" #include "sls/versionAPI.h" -#include "test-CmdProxy-global.h" +#include "test-Caller-global.h" #include "tests/globals.h" namespace sls { @@ -18,21 +18,21 @@ using test::GET; using test::PUT; // time specific measurements for gotthard2 -TEST_CASE("timegotthard2", "[.cmd]") { +TEST_CASE("Caller::timegotthard2", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { // exptime auto prev_val = det.getExptime(); { std::ostringstream oss; - proxy.Call("exptime", {"220ns"}, -1, PUT, oss); + caller.call("exptime", {"220ns"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime 220ns\n"); } { std::ostringstream oss; - proxy.Call("exptime", {}, -1, GET, oss); + caller.call("exptime", {}, -1, GET, oss); REQUIRE(oss.str() == "exptime 221ns\n"); } for (int i = 0; i != det.size(); ++i) { @@ -42,12 +42,12 @@ TEST_CASE("timegotthard2", "[.cmd]") { prev_val = det.getBurstPeriod(); { std::ostringstream oss; - proxy.Call("burstperiod", {"220ns"}, -1, PUT, oss); + caller.call("burstperiod", {"220ns"}, -1, PUT, oss); REQUIRE(oss.str() == "burstperiod 220ns\n"); } { std::ostringstream oss; - proxy.Call("burstperiod", {}, -1, GET, oss); + caller.call("burstperiod", {}, -1, GET, oss); REQUIRE(oss.str() == "burstperiod 221ns\n"); } for (int i = 0; i != det.size(); ++i) { @@ -57,12 +57,12 @@ TEST_CASE("timegotthard2", "[.cmd]") { prev_val = det.getDelayAfterTrigger(); { std::ostringstream oss; - proxy.Call("delay", {"220ns"}, -1, PUT, oss); + caller.call("delay", {"220ns"}, -1, PUT, oss); REQUIRE(oss.str() == "delay 220ns\n"); } { std::ostringstream oss; - proxy.Call("delay", {}, -1, GET, oss); + caller.call("delay", {}, -1, GET, oss); REQUIRE(oss.str() == "delay 221ns\n"); } for (int i = 0; i != det.size(); ++i) { @@ -74,12 +74,12 @@ TEST_CASE("timegotthard2", "[.cmd]") { prev_val = det.getPeriod(); { std::ostringstream oss; - proxy.Call("period", {"220ns"}, -1, PUT, oss); + caller.call("period", {"220ns"}, -1, PUT, oss); REQUIRE(oss.str() == "period 220ns\n"); } { std::ostringstream oss; - proxy.Call("period", {}, -1, GET, oss); + caller.call("period", {}, -1, GET, oss); REQUIRE(oss.str() == "period 221ns\n"); } for (int i = 0; i != det.size(); ++i) { @@ -90,12 +90,12 @@ TEST_CASE("timegotthard2", "[.cmd]") { prev_val = det.getPeriod(); { std::ostringstream oss; - proxy.Call("period", {"220ns"}, -1, PUT, oss); + caller.call("period", {"220ns"}, -1, PUT, oss); REQUIRE(oss.str() == "period 220ns\n"); } { std::ostringstream oss; - proxy.Call("period", {}, -1, GET, oss); + caller.call("period", {}, -1, GET, oss); REQUIRE(oss.str() == "period 221ns\n"); } for (int i = 0; i != det.size(); ++i) { @@ -106,180 +106,200 @@ TEST_CASE("timegotthard2", "[.cmd]") { } /* dacs */ -TEST_CASE("Setting and reading back GOTTHARD2 dacs", "[.cmd][.dacs]") { +TEST_CASE("Caller::Setting and reading back GOTTHARD2 dacs", + "[.cmdcall][.dacs]") { // vref_h_adc, vb_comp_fe, vb_comp_adc, vcom_cds, // vref_restore, vb_opa_1st, vref_comp_fe, vcom_adc1, // vref_prech, vref_l_adc, vref_cds, vb_cs, // vb_opa_fd, vcom_adc2 Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { SECTION("vref_h_adc") { - test_dac(defs::VREF_H_ADC, "vref_h_adc", 2099); + test_dac_caller(defs::VREF_H_ADC, "vref_h_adc", 2099); + } + SECTION("vb_comp_fe") { + test_dac_caller(defs::VB_COMP_FE, "vb_comp_fe", 0); } - SECTION("vb_comp_fe") { test_dac(defs::VB_COMP_FE, "vb_comp_fe", 0); } SECTION("vb_comp_adc") { - test_dac(defs::VB_COMP_ADC, "vb_comp_adc", 0); + test_dac_caller(defs::VB_COMP_ADC, "vb_comp_adc", 0); + } + SECTION("vcom_cds") { + test_dac_caller(defs::VCOM_CDS, "vcom_cds", 1400); } - SECTION("vcom_cds") { test_dac(defs::VCOM_CDS, "vcom_cds", 1400); } SECTION("vref_rstore") { - test_dac(defs::VREF_RSTORE, "vref_rstore", 640); + test_dac_caller(defs::VREF_RSTORE, "vref_rstore", 640); + } + SECTION("vb_opa_1st") { + test_dac_caller(defs::VB_OPA_1ST, "vb_opa_1st", 0); } - SECTION("vb_opa_1st") { test_dac(defs::VB_OPA_1ST, "vb_opa_1st", 0); } SECTION("vref_comp_fe") { - test_dac(defs::VREF_COMP_FE, "vref_comp_fe", 0); + test_dac_caller(defs::VREF_COMP_FE, "vref_comp_fe", 0); + } + SECTION("vcom_adc1") { + test_dac_caller(defs::VCOM_ADC1, "vcom_adc1", 1400); } - SECTION("vcom_adc1") { test_dac(defs::VCOM_ADC1, "vcom_adc1", 1400); } SECTION("vref_prech") { - test_dac(defs::VREF_PRECH, "vref_prech", 1720); + test_dac_caller(defs::VREF_PRECH, "vref_prech", 1720); + } + SECTION("vref_l_adc") { + test_dac_caller(defs::VREF_L_ADC, "vref_l_adc", 700); + } + SECTION("vref_cds") { + test_dac_caller(defs::VREF_CDS, "vref_cds", 1200); + } + SECTION("vb_cs") { test_dac_caller(defs::VB_CS, "vb_cs", 2799); } + SECTION("vb_opa_fd") { + test_dac_caller(defs::VB_OPA_FD, "vb_opa_fd", 0); + } + SECTION("vcom_adc2") { + test_dac_caller(defs::VCOM_ADC2, "vcom_adc2", 1400); } - SECTION("vref_l_adc") { test_dac(defs::VREF_L_ADC, "vref_l_adc", 700); } - SECTION("vref_cds") { test_dac(defs::VREF_CDS, "vref_cds", 1200); } - SECTION("vb_cs") { test_dac(defs::VB_CS, "vb_cs", 2799); } - SECTION("vb_opa_fd") { test_dac(defs::VB_OPA_FD, "vb_opa_fd", 0); } - SECTION("vcom_adc2") { test_dac(defs::VCOM_ADC2, "vcom_adc2", 1400); } // eiger - REQUIRE_THROWS(proxy.Call("dac", {"vthreshold"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vsvp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vsvn"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtrim"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrpreamp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtgstv"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_ll"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_lr"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rl"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rr"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"rxb_rb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"rxb_lb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcn"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vishaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"iodelay"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vthreshold"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vsvp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vsvn"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vtrim"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrpreamp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrshaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vtgstv"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_ll"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_lr"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcal"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_rl"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_rr"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"rxb_rb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"rxb_lb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcn"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vishaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"iodelay"}, -1, GET)); // gotthard - REQUIRE_THROWS(proxy.Call("dac", {"vref_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcascn_pb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcascp_pb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vout_cm"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcasc_out"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vin_cm"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"ib_test_c"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_ds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcascn_pb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcascp_pb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vout_cm"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcasc_out"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vin_cm"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_comp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"ib_test_c"}, -1, GET)); // jungfrau - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vdd_prot"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vin_com"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vref_prech"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_pixbuf"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_comp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vdd_prot"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vin_com"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vref_prech"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_pixbuf"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_ds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_ds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_comp"}, -1, GET)); // mythen3 - REQUIRE_THROWS(proxy.Call("dac", {"vrpreamp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper_n"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vipre"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vishaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vdcsh"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth2"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth3"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal_n"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal_p"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtrim"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcassh"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcas"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vicin"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vipre_out"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrpreamp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrshaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vrshaper_n"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vipre"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vishaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vdcsh"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vth1"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vth2"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vth3"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcal_n"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcal_p"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vtrim"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcassh"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcas"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vicin"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vipre_out"}, -1, GET)); } } /* on chip dacs */ -TEST_CASE("vchip_comp_fe", "[.cmd][.onchipdacs]") { +TEST_CASE("Caller::vchip_comp_fe", "[.cmdcall][.onchipdacs]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { SECTION("vchip_comp_fe") { - test_onchip_dac(defs::VB_COMP_FE, "vchip_comp_fe", 0x137); + test_onchip_dac_caller(defs::VB_COMP_FE, "vchip_comp_fe", 0x137); } } else { - REQUIRE_THROWS(proxy.Call("vchip_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vchip_comp_fe", {}, -1, GET)); } } -TEST_CASE("vchip_opa_1st", "[.cmd][.onchipdacs]") { +TEST_CASE("Caller::vchip_opa_1st", "[.cmdcall][.onchipdacs]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { SECTION("vchip_opa_1st") { - test_onchip_dac(defs::VB_OPA_1ST, "vchip_opa_1st", 0x000); + test_onchip_dac_caller(defs::VB_OPA_1ST, "vchip_opa_1st", 0x000); } } else { - REQUIRE_THROWS(proxy.Call("vchip_opa_1st", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vchip_opa_1st", {}, -1, GET)); } } -TEST_CASE("vchip_opa_fd", "[.cmd][.onchipdacs]") { +TEST_CASE("Caller::vchip_opa_fd", "[.cmdcall][.onchipdacs]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { SECTION("vchip_opa_fd") { - test_onchip_dac(defs::VB_OPA_FD, "vchip_opa_fd", 0x134); + test_onchip_dac_caller(defs::VB_OPA_FD, "vchip_opa_fd", 0x134); } } else { - REQUIRE_THROWS(proxy.Call("vchip_opa_fd", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vchip_opa_fd", {}, -1, GET)); } } -TEST_CASE("vchip_comp_adc", "[.cmd][.onchipdacs]") { +TEST_CASE("Caller::vchip_comp_adc", "[.cmdcall][.onchipdacs]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { SECTION("vchip_comp_adc") { - test_onchip_dac(defs::VB_COMP_ADC, "vchip_comp_adc", 0x3FF); + test_onchip_dac_caller(defs::VB_COMP_ADC, "vchip_comp_adc", 0x3FF); } } else { - REQUIRE_THROWS(proxy.Call("vchip_comp_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vchip_comp_adc", {}, -1, GET)); } } -TEST_CASE("vchip_ref_comp_fe", "[.cmd][.onchipdacs]") { +TEST_CASE("Caller::vchip_ref_comp_fe", "[.cmdcall][.onchipdacs]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { SECTION("vchip_ref_comp_fe") { - test_onchip_dac(defs::VREF_COMP_FE, "vchip_ref_comp_fe", 0x100); + test_onchip_dac_caller(defs::VREF_COMP_FE, "vchip_ref_comp_fe", + 0x100); } } else { - REQUIRE_THROWS(proxy.Call("vchip_ref_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vchip_ref_comp_fe", {}, -1, GET)); } } -TEST_CASE("vchip_cs", "[.cmd][.onchipdacs]") { +TEST_CASE("Caller::vchip_cs", "[.cmdcall][.onchipdacs]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { - SECTION("vchip_cs") { test_onchip_dac(defs::VB_CS, "vchip_cs", 0x0D0); } + SECTION("vchip_cs") { + test_onchip_dac_caller(defs::VB_CS, "vchip_cs", 0x0D0); + } } else { - REQUIRE_THROWS(proxy.Call("vchip_cs", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vchip_cs", {}, -1, GET)); } } /* Gotthard2 Specific */ -TEST_CASE("bursts", "[.cmd]") { +TEST_CASE("Caller::bursts", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { auto prev_burst = @@ -295,26 +315,26 @@ TEST_CASE("bursts", "[.cmd]") { det.setTimingMode(defs::AUTO_TIMING); { std::ostringstream oss; - proxy.Call("bursts", {"3"}, -1, PUT, oss); + caller.call("bursts", {"3"}, -1, PUT, oss); REQUIRE(oss.str() == "bursts 3\n"); } { std::ostringstream oss; - proxy.Call("bursts", {}, -1, GET, oss); + caller.call("bursts", {}, -1, GET, oss); REQUIRE(oss.str() == "bursts 3\n"); } - REQUIRE_THROWS(proxy.Call("bursts", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("bursts", {"0"}, -1, PUT)); // trigger mode: reg set to 1, but bursts must be same det.setTimingMode(defs::TRIGGER_EXPOSURE); { std::ostringstream oss; - proxy.Call("bursts", {}, -1, GET, oss); + caller.call("bursts", {}, -1, GET, oss); REQUIRE(oss.str() == "bursts 3\n"); } det.setTimingMode(defs::AUTO_TIMING); { std::ostringstream oss; - proxy.Call("bursts", {}, -1, GET, oss); + caller.call("bursts", {}, -1, GET, oss); REQUIRE(oss.str() == "bursts 3\n"); } // continuous mode: reg set to #frames, @@ -323,19 +343,19 @@ TEST_CASE("bursts", "[.cmd]") { det.setNumberOfFrames(2); { std::ostringstream oss; - proxy.Call("bursts", {}, -1, GET, oss); + caller.call("bursts", {}, -1, GET, oss); REQUIRE(oss.str() == "bursts 3\n"); } det.setTimingMode(defs::TRIGGER_EXPOSURE); { std::ostringstream oss; - proxy.Call("bursts", {}, -1, GET, oss); + caller.call("bursts", {}, -1, GET, oss); REQUIRE(oss.str() == "bursts 3\n"); } det.setBurstMode(defs::BURST_INTERNAL); { std::ostringstream oss; - proxy.Call("bursts", {}, -1, GET, oss); + caller.call("bursts", {}, -1, GET, oss); REQUIRE(oss.str() == "bursts 3\n"); } // set to previous values @@ -347,122 +367,122 @@ TEST_CASE("bursts", "[.cmd]") { det.setBurstMode(prev_burstMode[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("bursts", {}, -1, GET)); + REQUIRE_THROWS(caller.call("bursts", {}, -1, GET)); } } -TEST_CASE("burstperiod", "[.cmd]") { +TEST_CASE("Caller::burstperiod", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { auto previous = det.getBurstPeriod(); std::ostringstream oss_set, oss_get; - proxy.Call("burstperiod", {"30ms"}, -1, PUT, oss_set); + caller.call("burstperiod", {"30ms"}, -1, PUT, oss_set); REQUIRE(oss_set.str() == "burstperiod 30ms\n"); - proxy.Call("burstperiod", {}, -1, GET, oss_get); + caller.call("burstperiod", {}, -1, GET, oss_get); REQUIRE(oss_get.str() == "burstperiod 30ms\n"); // Reset to previous value for (int i = 0; i != det.size(); ++i) { det.setBurstPeriod(previous[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("burstperiod", {}, -1, GET)); + REQUIRE_THROWS(caller.call("burstperiod", {}, -1, GET)); } } -TEST_CASE("burstsl", "[.cmd]") { +TEST_CASE("Caller::burstsl", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { - REQUIRE_NOTHROW(proxy.Call("burstsl", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("burstsl", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("burstsl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("burstsl", {}, -1, GET)); } } -TEST_CASE("inj_ch", "[.cmd]") { +TEST_CASE("Caller::inj_ch", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { REQUIRE_THROWS( - proxy.Call("inj_ch", {"-1", "1"}, -1, PUT)); // invalid offset + caller.call("inj_ch", {"-1", "1"}, -1, PUT)); // invalid offset REQUIRE_THROWS( - proxy.Call("inj_ch", {"0", "0"}, -1, PUT)); // invalid increment + caller.call("inj_ch", {"0", "0"}, -1, PUT)); // invalid increment { std::ostringstream oss; - proxy.Call("inj_ch", {"0", "1"}, -1, PUT, oss); + caller.call("inj_ch", {"0", "1"}, -1, PUT, oss); REQUIRE(oss.str() == "inj_ch [0, 1]\n"); } { std::ostringstream oss; - proxy.Call("inj_ch", {}, -1, GET, oss); + caller.call("inj_ch", {}, -1, GET, oss); REQUIRE(oss.str() == "inj_ch [0, 1]\n"); } } else { - REQUIRE_THROWS(proxy.Call("inj_ch", {}, -1, GET)); + REQUIRE_THROWS(caller.call("inj_ch", {}, -1, GET)); } } -TEST_CASE("vetophoton", "[.cmd]") { +TEST_CASE("Caller::vetophoton", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { - REQUIRE_THROWS(proxy.Call("vetophoton", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vetophoton", {"-1"}, -1, GET)); + REQUIRE_THROWS(caller.call("vetophoton", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vetophoton", {"-1"}, -1, GET)); REQUIRE_NOTHROW( - proxy.Call("vetophoton", {"-1", "/tmp/bla.txt"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vetophoton", {"12", "1", "39950"}, -1, - PUT)); // invalid chip index - REQUIRE_THROWS(proxy.Call("vetophoton", {"-1", "0"}, -1, - PUT)); // invalid photon number - REQUIRE_THROWS(proxy.Call("vetophoton", {"-1", "1", "39950"}, -1, - PUT)); // invald file + caller.call("vetophoton", {"-1", "/tmp/bla.txt"}, -1, GET)); + REQUIRE_THROWS(caller.call("vetophoton", {"12", "1", "39950"}, -1, + PUT)); // invalid chip index + REQUIRE_THROWS(caller.call("vetophoton", {"-1", "0"}, -1, + PUT)); // invalid photon number + REQUIRE_THROWS(caller.call("vetophoton", {"-1", "1", "39950"}, -1, + PUT)); // invald file } else { REQUIRE_THROWS( - proxy.Call("vetophoton", {"-1", "/tmp/bla.txt"}, -1, GET)); + caller.call("vetophoton", {"-1", "/tmp/bla.txt"}, -1, GET)); } } -TEST_CASE("vetoref", "[.cmd]") { +TEST_CASE("Caller::vetoref", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { - REQUIRE_THROWS(proxy.Call("vetoref", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vetoref", {"3", "0x3ff"}, -1, - PUT)); // invalid chip index - REQUIRE_NOTHROW(proxy.Call("vetoref", {"1", "0x010"}, -1, PUT)); + REQUIRE_THROWS(caller.call("vetoref", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vetoref", {"3", "0x3ff"}, -1, + PUT)); // invalid chip index + REQUIRE_NOTHROW(caller.call("vetoref", {"1", "0x010"}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("vetoref", {"3", "0x0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("vetoref", {"3", "0x0"}, -1, PUT)); } } -TEST_CASE("vetofile", "[.cmd]") { +TEST_CASE("Caller::vetofile", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { - REQUIRE_THROWS(proxy.Call("vetofile", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vetofile", {"12", "/tmp/bla.txt"}, -1, - PUT)); // invalid chip index + REQUIRE_THROWS(caller.call("vetofile", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vetofile", {"12", "/tmp/bla.txt"}, -1, + PUT)); // invalid chip index } else { - REQUIRE_THROWS(proxy.Call("vetofile", {"-1"}, -1, GET)); + REQUIRE_THROWS(caller.call("vetofile", {"-1"}, -1, GET)); } } -TEST_CASE("burstmode", "[.cmd]") { +TEST_CASE("Caller::burstmode", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { @@ -470,166 +490,166 @@ TEST_CASE("burstmode", "[.cmd]") { auto burststr = ToString(burst); { std::ostringstream oss; - proxy.Call("burstmode", {"burst_internal"}, -1, PUT, oss); + caller.call("burstmode", {"burst_internal"}, -1, PUT, oss); REQUIRE(oss.str() == "burstmode burst_internal\n"); } { std::ostringstream oss; - proxy.Call("burstmode", {"cw_internal"}, -1, PUT, oss); + caller.call("burstmode", {"cw_internal"}, -1, PUT, oss); REQUIRE(oss.str() == "burstmode cw_internal\n"); } { std::ostringstream oss; - proxy.Call("burstmode", {}, -1, GET, oss); + caller.call("burstmode", {}, -1, GET, oss); REQUIRE(oss.str() == "burstmode cw_internal\n"); } for (int i = 0; i != det.size(); ++i) { det.setBurstMode(burst[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("burstmode", {}, -1, GET)); + REQUIRE_THROWS(caller.call("burstmode", {}, -1, GET)); } } -TEST_CASE("cdsgain", "[.cmd]") { +TEST_CASE("Caller::cdsgain", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { auto prev_val = det.getCDSGain(); { std::ostringstream oss; - proxy.Call("cdsgain", {"1"}, -1, PUT, oss); + caller.call("cdsgain", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "cdsgain 1\n"); } { std::ostringstream oss; - proxy.Call("cdsgain", {"0"}, -1, PUT, oss); + caller.call("cdsgain", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "cdsgain 0\n"); } { std::ostringstream oss; - proxy.Call("cdsgain", {}, -1, GET, oss); + caller.call("cdsgain", {}, -1, GET, oss); REQUIRE(oss.str() == "cdsgain 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setCDSGain(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("cdsgain", {}, -1, GET)); + REQUIRE_THROWS(caller.call("cdsgain", {}, -1, GET)); } } -TEST_CASE("timingsource", "[.cmd]") { +TEST_CASE("Caller::timingsource", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { auto prev_val = det.getTimingSource(); /* { until its activated in fpga std::ostringstream oss; - proxy.Call("timingsource", {"external"}, -1, PUT, oss); + caller.call("timingsource", {"external"}, -1, PUT, oss); REQUIRE(oss.str() == "timingsource external\n"); }*/ { std::ostringstream oss; - proxy.Call("timingsource", {"internal"}, -1, PUT, oss); + caller.call("timingsource", {"internal"}, -1, PUT, oss); REQUIRE(oss.str() == "timingsource internal\n"); } { std::ostringstream oss; - proxy.Call("timingsource", {}, -1, GET, oss); + caller.call("timingsource", {}, -1, GET, oss); REQUIRE(oss.str() == "timingsource internal\n"); } for (int i = 0; i != det.size(); ++i) { det.setTimingSource(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("timingsource", {}, -1, GET)); + REQUIRE_THROWS(caller.call("timingsource", {}, -1, GET)); } } -TEST_CASE("veto", "[.cmd]") { +TEST_CASE("Caller::veto", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { auto prev_val = det.getVeto(); { std::ostringstream oss; - proxy.Call("veto", {"1"}, -1, PUT, oss); + caller.call("veto", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "veto 1\n"); } { std::ostringstream oss; - proxy.Call("veto", {"0"}, -1, PUT, oss); + caller.call("veto", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "veto 0\n"); } { std::ostringstream oss; - proxy.Call("veto", {}, -1, GET, oss); + caller.call("veto", {}, -1, GET, oss); REQUIRE(oss.str() == "veto 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setVeto(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("veto", {}, -1, GET)); + REQUIRE_THROWS(caller.call("veto", {}, -1, GET)); } } -TEST_CASE("vetostream", "[.cmd]") { +TEST_CASE("Caller::vetostream", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { auto prev_val = det.getVetoStream().tsquash("inconsistent veto stream to test"); { std::ostringstream oss; - proxy.Call("vetostream", {"none"}, -1, PUT, oss); + caller.call("vetostream", {"none"}, -1, PUT, oss); REQUIRE(oss.str() == "vetostream none\n"); } { std::ostringstream oss; - proxy.Call("vetostream", {}, -1, GET, oss); + caller.call("vetostream", {}, -1, GET, oss); REQUIRE(oss.str() == "vetostream none\n"); } { std::ostringstream oss; - proxy.Call("vetostream", {"lll"}, -1, PUT, oss); + caller.call("vetostream", {"lll"}, -1, PUT, oss); REQUIRE(oss.str() == "vetostream lll\n"); } { std::ostringstream oss; - proxy.Call("vetostream", {}, -1, GET, oss); + caller.call("vetostream", {}, -1, GET, oss); REQUIRE(oss.str() == "vetostream lll\n"); } { std::ostringstream oss; - proxy.Call("vetostream", {"lll", "10gbe"}, -1, PUT, oss); + caller.call("vetostream", {"lll", "10gbe"}, -1, PUT, oss); REQUIRE(oss.str() == "vetostream lll, 10gbe\n"); } { std::ostringstream oss; - proxy.Call("vetostream", {}, -1, GET, oss); + caller.call("vetostream", {}, -1, GET, oss); REQUIRE(oss.str() == "vetostream lll, 10gbe\n"); } - REQUIRE_THROWS(proxy.Call("vetostream", {"lll", "none"}, -1, PUT)); + REQUIRE_THROWS(caller.call("vetostream", {"lll", "none"}, -1, PUT)); det.setVetoStream(prev_val); } else { - REQUIRE_THROWS(proxy.Call("vetostream", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vetostream", {"none"}, -1, PUT)); + REQUIRE_THROWS(caller.call("vetostream", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vetostream", {"none"}, -1, PUT)); } - REQUIRE_THROWS(proxy.Call("vetostream", {"dfgd"}, -1, GET)); + REQUIRE_THROWS(caller.call("vetostream", {"dfgd"}, -1, GET)); } -TEST_CASE("vetoalg", "[.cmd]") { +TEST_CASE("Caller::vetoalg", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { auto prev_val_lll = @@ -638,37 +658,37 @@ TEST_CASE("vetoalg", "[.cmd]") { det.getVetoAlgorithm(defs::streamingInterface::ETHERNET_10GB); { std::ostringstream oss; - proxy.Call("vetoalg", {"hits", "lll"}, -1, PUT, oss); + caller.call("vetoalg", {"hits", "lll"}, -1, PUT, oss); REQUIRE(oss.str() == "vetoalg hits lll\n"); } { std::ostringstream oss; - proxy.Call("vetoalg", {"lll"}, -1, GET, oss); + caller.call("vetoalg", {"lll"}, -1, GET, oss); REQUIRE(oss.str() == "vetoalg hits lll\n"); } { std::ostringstream oss; - proxy.Call("vetoalg", {"hits", "10gbe"}, -1, PUT, oss); + caller.call("vetoalg", {"hits", "10gbe"}, -1, PUT, oss); REQUIRE(oss.str() == "vetoalg hits 10gbe\n"); } { std::ostringstream oss; - proxy.Call("vetoalg", {"10gbe"}, -1, GET, oss); + caller.call("vetoalg", {"10gbe"}, -1, GET, oss); REQUIRE(oss.str() == "vetoalg hits 10gbe\n"); } { std::ostringstream oss; - proxy.Call("vetoalg", {"raw", "lll"}, -1, PUT, oss); + caller.call("vetoalg", {"raw", "lll"}, -1, PUT, oss); REQUIRE(oss.str() == "vetoalg raw lll\n"); } { std::ostringstream oss; - proxy.Call("vetoalg", {"raw", "10gbe"}, -1, PUT, oss); + caller.call("vetoalg", {"raw", "10gbe"}, -1, PUT, oss); REQUIRE(oss.str() == "vetoalg raw 10gbe\n"); } REQUIRE_THROWS( - proxy.Call("vetoalg", {"default", "lll", "10gbe"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("vetoalg", {"hits", "none"}, -1, PUT)); + caller.call("vetoalg", {"default", "lll", "10gbe"}, -1, PUT)); + REQUIRE_THROWS(caller.call("vetoalg", {"hits", "none"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setVetoAlgorithm(prev_val_lll[i], defs::streamingInterface::LOW_LATENCY_LINK, @@ -677,15 +697,15 @@ TEST_CASE("vetoalg", "[.cmd]") { defs::streamingInterface::ETHERNET_10GB, {i}); } } else { - REQUIRE_THROWS(proxy.Call("vetoalg", {"lll"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vetoalg", {"none"}, -1, PUT)); + REQUIRE_THROWS(caller.call("vetoalg", {"lll"}, -1, GET)); + REQUIRE_THROWS(caller.call("vetoalg", {"none"}, -1, PUT)); } - REQUIRE_THROWS(proxy.Call("vetoalg", {"dfgd"}, -1, GET)); + REQUIRE_THROWS(caller.call("vetoalg", {"dfgd"}, -1, GET)); } -TEST_CASE("confadc", "[.cmd]") { +TEST_CASE("Caller::confadc", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { @@ -703,20 +723,20 @@ TEST_CASE("confadc", "[.cmd]") { } } - REQUIRE_THROWS(proxy.Call("confadc", {"11", "2", "0x7f"}, -1, - PUT)); // invalid chip index - REQUIRE_THROWS(proxy.Call("confadc", {"-1", "32", "0x7f"}, -1, - PUT)); // invalid adc index - REQUIRE_THROWS(proxy.Call("confadc", {"-1", "10", "0x80"}, -1, - PUT)); // invalid value + REQUIRE_THROWS(caller.call("confadc", {"11", "2", "0x7f"}, -1, + PUT)); // invalid chip index + REQUIRE_THROWS(caller.call("confadc", {"-1", "32", "0x7f"}, -1, + PUT)); // invalid adc index + REQUIRE_THROWS(caller.call("confadc", {"-1", "10", "0x80"}, -1, + PUT)); // invalid value { std::ostringstream oss; - proxy.Call("confadc", {"-1", "-1", "0x11"}, -1, PUT, oss); + caller.call("confadc", {"-1", "-1", "0x11"}, -1, PUT, oss); REQUIRE(oss.str() == "confadc [-1, -1, 0x11]\n"); } { std::ostringstream oss; - proxy.Call("confadc", {"2", "3"}, -1, GET, oss); + caller.call("confadc", {"2", "3"}, -1, GET, oss); REQUIRE(oss.str() == "confadc 0x11\n"); } @@ -728,7 +748,7 @@ TEST_CASE("confadc", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("confadc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("confadc", {}, -1, GET)); } } diff --git a/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-jungfrau.cpp similarity index 57% rename from slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp rename to slsDetectorSoftware/tests/Caller/test-Caller-jungfrau.cpp index 27b652f4d..767d3d270 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-jungfrau.cpp @@ -1,13 +1,13 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" +#include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" #include "sls/sls_detector_defs.h" #include #include "sls/versionAPI.h" -#include "test-CmdProxy-global.h" +#include "test-Caller-global.h" #include "tests/globals.h" namespace sls { @@ -17,275 +17,282 @@ using test::PUT; /* dacs */ -TEST_CASE("Setting and reading back Jungfrau dacs", "[.cmd][.dacs]") { +TEST_CASE("Caller::Setting and reading back Jungfrau dacs", + "[.cmdcall][.dacs]") { // vb_comp, vdd_prot, vin_com, vref_prech, vb_pixbuf, vb_ds, vref_ds, // vref_comp Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU) { - SECTION("vb_comp") { test_dac(defs::VB_COMP, "vb_comp", 1220); } - SECTION("vdd_prot") { test_dac(defs::VDD_PROT, "vdd_prot", 3000); } - SECTION("vin_com") { test_dac(defs::VIN_COM, "vin_com", 1053); } - SECTION("vref_prech") { - test_dac(defs::VREF_PRECH, "vref_prech", 1450); + SECTION("vb_comp") { test_dac_caller(defs::VB_COMP, "vb_comp", 1220); } + SECTION("vdd_prot") { + test_dac_caller(defs::VDD_PROT, "vdd_prot", 3000); + } + SECTION("vin_com") { test_dac_caller(defs::VIN_COM, "vin_com", 1053); } + SECTION("vref_prech") { + test_dac_caller(defs::VREF_PRECH, "vref_prech", 1450); + } + SECTION("vb_pixbuf") { + test_dac_caller(defs::VB_PIXBUF, "vb_pixbuf", 750); + } + SECTION("vb_ds") { test_dac_caller(defs::VB_DS, "vb_ds", 1000); } + SECTION("vref_ds") { test_dac_caller(defs::VREF_DS, "vref_ds", 480); } + SECTION("vref_comp") { + test_dac_caller(defs::VREF_COMP, "vref_comp", 420); } - SECTION("vb_pixbuf") { test_dac(defs::VB_PIXBUF, "vb_pixbuf", 750); } - SECTION("vb_ds") { test_dac(defs::VB_DS, "vb_ds", 1000); } - SECTION("vref_ds") { test_dac(defs::VREF_DS, "vref_ds", 480); } - SECTION("vref_comp") { test_dac(defs::VREF_COMP, "vref_comp", 420); } // eiger - REQUIRE_THROWS(proxy.Call("vthreshold", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vsvp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vsvn", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vtrim", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vrpreamp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vrshaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vtgstv", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcmp_ll", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcmp_lr", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcal", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcmp_rl", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcmp_rr", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("rxb_rb", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("rxb_lb", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcn", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vishaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("iodelay", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vthreshold", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vsvp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vsvn", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vtrim", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrpreamp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrshaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vtgstv", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcmp_ll", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcmp_lr", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcal", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcmp_rl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcmp_rr", {}, -1, GET)); + REQUIRE_THROWS(caller.call("rxb_rb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("rxb_lb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcn", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vishaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("iodelay", {}, -1, GET)); // gotthard - // REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcascn_pb", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcascp_pb", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vout_cm", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcasc_out", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vin_cm", {}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("ib_test_c", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("vref_ds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcascn_pb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcascp_pb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vout_cm", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcasc_out", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vin_cm", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("vref_comp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("ib_test_c", {}, -1, GET)); // mythen3 - REQUIRE_THROWS(proxy.Call("vrpreamp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vrshaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vrshaper_n", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vipre", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vishaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vdcsh", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vth1", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vth2", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vth3", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcal_n", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcal_p", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vtrim", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcassh", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcas", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vicin", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vipre_out", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrpreamp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrshaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrshaper_n", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vipre", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vishaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vdcsh", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vth1", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vth2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vth3", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcal_n", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcal_p", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vtrim", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcassh", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcas", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vicin", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vipre_out", {}, -1, GET)); // gotthard2 - REQUIRE_THROWS(proxy.Call("vref_h_adc", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_comp_fe", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_comp_adc", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcom_cds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_rstore", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_opa_1st", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_comp_fe", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcom_adc1", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_l_adc", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_cds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_cs", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_opa_fd", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcom_adc2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_h_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_comp_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcom_cds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_rstore", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_opa_1st", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcom_adc1", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_l_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_cds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_cs", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_opa_fd", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcom_adc2", {}, -1, GET)); } } /* Network Configuration (Detector<->Receiver) */ -TEST_CASE("selinterface", "[.cmd]") { +TEST_CASE("Caller::selinterface", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getSelectedUDPInterface().tsquash( "inconsistent selected interface to test"); { std::ostringstream oss; - proxy.Call("selinterface", {"1"}, -1, PUT, oss); + caller.call("selinterface", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "selinterface 1\n"); } { std::ostringstream oss; - proxy.Call("selinterface", {"0"}, -1, PUT, oss); + caller.call("selinterface", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "selinterface 0\n"); } { std::ostringstream oss; - proxy.Call("selinterface", {}, -1, GET, oss); + caller.call("selinterface", {}, -1, GET, oss); REQUIRE(oss.str() == "selinterface 0\n"); } det.selectUDPInterface(prev_val); - REQUIRE_THROWS(proxy.Call("selinterface", {"2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("selinterface", {"2"}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("selinterface", {}, -1, GET)); + REQUIRE_THROWS(caller.call("selinterface", {}, -1, GET)); } } /* Jungfrau/moench Specific */ -TEST_CASE("temp_threshold", "[.cmd]") { +TEST_CASE("Caller::temp_threshold", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getThresholdTemperature(); { std::ostringstream oss; - proxy.Call("temp_threshold", {"65"}, -1, PUT, oss); + caller.call("temp_threshold", {"65"}, -1, PUT, oss); REQUIRE(oss.str() == "temp_threshold 65\n"); } { std::ostringstream oss; - proxy.Call("temp_threshold", {"70"}, -1, PUT, oss); + caller.call("temp_threshold", {"70"}, -1, PUT, oss); REQUIRE(oss.str() == "temp_threshold 70\n"); } { std::ostringstream oss; - proxy.Call("temp_threshold", {}, -1, GET, oss); + caller.call("temp_threshold", {}, -1, GET, oss); REQUIRE(oss.str() == "temp_threshold 70\n"); } for (int i = 0; i != det.size(); ++i) { det.setThresholdTemperature(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("temp_threshold", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("temp_threshold", {"70"}, -1, PUT)); + REQUIRE_THROWS(caller.call("temp_threshold", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_threshold", {"70"}, -1, PUT)); } } -TEST_CASE("chipversion", "[.cmd]") { +TEST_CASE("Caller::chipversion", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU) { - REQUIRE_NOTHROW(proxy.Call("chipversion", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("chipversion", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("chipversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("chipversion", {}, -1, GET)); } - REQUIRE_THROWS(proxy.Call("chipversion", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("chipversion", {"0"}, -1, PUT)); } -TEST_CASE("temp_control", "[.cmd]") { +TEST_CASE("Caller::temp_control", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getTemperatureControl(); { std::ostringstream oss; - proxy.Call("temp_control", {"0"}, -1, PUT, oss); + caller.call("temp_control", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "temp_control 0\n"); } { std::ostringstream oss; - proxy.Call("temp_control", {"1"}, -1, PUT, oss); + caller.call("temp_control", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "temp_control 1\n"); } { std::ostringstream oss; - proxy.Call("temp_control", {}, -1, GET, oss); + caller.call("temp_control", {}, -1, GET, oss); REQUIRE(oss.str() == "temp_control 1\n"); } for (int i = 0; i != det.size(); ++i) { det.setTemperatureControl(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("temp_control", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("temp_control", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("temp_control", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_control", {"0"}, -1, PUT)); } } -TEST_CASE("temp_event", "[.cmd]") { +TEST_CASE("Caller::temp_event", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { { std::ostringstream oss; - proxy.Call("temp_event", {"0"}, -1, PUT, oss); + caller.call("temp_event", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "temp_event cleared\n"); } { std::ostringstream oss; - proxy.Call("temp_event", {}, -1, GET, oss); + caller.call("temp_event", {}, -1, GET, oss); REQUIRE(oss.str() == "temp_event 0\n"); } } else { - REQUIRE_THROWS(proxy.Call("temp_event", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("temp_event", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("temp_event", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_event", {"0"}, -1, PUT)); } } -TEST_CASE("autocompdisable", "[.cmd]") { +TEST_CASE("Caller::autocompdisable", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU) { auto prev_val = det.getAutoComparatorDisable(); { std::ostringstream oss; - proxy.Call("autocompdisable", {"0"}, -1, PUT, oss); + caller.call("autocompdisable", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "autocompdisable 0\n"); } { std::ostringstream oss; - proxy.Call("autocompdisable", {"1"}, -1, PUT, oss); + caller.call("autocompdisable", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "autocompdisable 1\n"); } { std::ostringstream oss; - proxy.Call("autocompdisable", {}, -1, GET, oss); + caller.call("autocompdisable", {}, -1, GET, oss); REQUIRE(oss.str() == "autocompdisable 1\n"); } for (int i = 0; i != det.size(); ++i) { det.setAutoComparatorDisable(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("autocompdisable", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("autocompdisable", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("autocompdisable", {}, -1, GET)); + REQUIRE_THROWS(caller.call("autocompdisable", {"0"}, -1, PUT)); } } -TEST_CASE("compdisabletime", "[.cmd]") { +TEST_CASE("Caller::compdisabletime", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU && det.getChipVersion().squash() * 10 == 11) { auto prev_val = det.getComparatorDisableTime(); { std::ostringstream oss; - proxy.Call("compdisabletime", {"125ns"}, -1, PUT, oss); + caller.call("compdisabletime", {"125ns"}, -1, PUT, oss); REQUIRE(oss.str() == "compdisabletime 125ns\n"); } { std::ostringstream oss; - proxy.Call("compdisabletime", {}, -1, GET, oss); + caller.call("compdisabletime", {}, -1, GET, oss); REQUIRE(oss.str() == "compdisabletime 125ns\n"); } { std::ostringstream oss; - proxy.Call("compdisabletime", {"0"}, -1, PUT, oss); + caller.call("compdisabletime", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "compdisabletime 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setComparatorDisableTime(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("compdisabletime", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("compdisabletime", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("compdisabletime", {}, -1, GET)); + REQUIRE_THROWS(caller.call("compdisabletime", {"0"}, -1, PUT)); } } -TEST_CASE("extrastoragecells", "[.cmd]") { +TEST_CASE("Caller::extrastoragecells", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU) { // chip version 1.0 @@ -294,86 +301,86 @@ TEST_CASE("extrastoragecells", "[.cmd]") { "inconsistent #additional storage cells to test"); { std::ostringstream oss; - proxy.Call("extrastoragecells", {"1"}, -1, PUT, oss); + caller.call("extrastoragecells", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "extrastoragecells 1\n"); } { std::ostringstream oss; - proxy.Call("extrastoragecells", {"15"}, -1, PUT, oss); + caller.call("extrastoragecells", {"15"}, -1, PUT, oss); REQUIRE(oss.str() == "extrastoragecells 15\n"); } { std::ostringstream oss; - proxy.Call("extrastoragecells", {"0"}, -1, PUT, oss); + caller.call("extrastoragecells", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "extrastoragecells 0\n"); } { std::ostringstream oss; - proxy.Call("extrastoragecells", {}, -1, GET, oss); + caller.call("extrastoragecells", {}, -1, GET, oss); REQUIRE(oss.str() == "extrastoragecells 0\n"); } - REQUIRE_THROWS(proxy.Call("extrastoragecells", {"16"}, -1, PUT)); + REQUIRE_THROWS(caller.call("extrastoragecells", {"16"}, -1, PUT)); det.setNumberOfAdditionalStorageCells(prev_val); } // chip version 1.1 else { // cannot set number of addl. storage cells - REQUIRE_THROWS(proxy.Call("extrastoragecells", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("extrastoragecells", {"1"}, -1, PUT)); } } else { - REQUIRE_THROWS(proxy.Call("extrastoragecells", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("extrastoragecells", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("extrastoragecells", {}, -1, GET)); + REQUIRE_THROWS(caller.call("extrastoragecells", {"0"}, -1, PUT)); } } -TEST_CASE("storagecell_start", "[.cmd]") { +TEST_CASE("Caller::storagecell_start", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU) { auto prev_val = det.getStorageCellStart(); { std::ostringstream oss; - proxy.Call("storagecell_start", {"1"}, -1, PUT, oss); + caller.call("storagecell_start", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "storagecell_start 1\n"); } // chip version 1.0 if (det.getChipVersion().squash() * 10 == 10) { std::ostringstream oss; - proxy.Call("storagecell_start", {"15"}, -1, PUT, oss); + caller.call("storagecell_start", {"15"}, -1, PUT, oss); REQUIRE(oss.str() == "storagecell_start 15\n"); } // chip version 1.1 else { // max is 3 - REQUIRE_THROWS(proxy.Call("storagecell_start", {"15"}, -1, PUT)); + REQUIRE_THROWS(caller.call("storagecell_start", {"15"}, -1, PUT)); std::ostringstream oss; - proxy.Call("storagecell_start", {"3"}, -1, PUT, oss); + caller.call("storagecell_start", {"3"}, -1, PUT, oss); REQUIRE(oss.str() == "storagecell_start 3\n"); } { std::ostringstream oss; - proxy.Call("storagecell_start", {"0"}, -1, PUT, oss); + caller.call("storagecell_start", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "storagecell_start 0\n"); } { std::ostringstream oss; - proxy.Call("storagecell_start", {}, -1, GET, oss); + caller.call("storagecell_start", {}, -1, GET, oss); REQUIRE(oss.str() == "storagecell_start 0\n"); } - REQUIRE_THROWS(proxy.Call("storagecell_start", {"16"}, -1, PUT)); + REQUIRE_THROWS(caller.call("storagecell_start", {"16"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setStorageCellStart(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("storagecell_start", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("storagecell_start", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("storagecell_start", {}, -1, GET)); + REQUIRE_THROWS(caller.call("storagecell_start", {"0"}, -1, PUT)); } } -TEST_CASE("storagecell_delay", "[.cmd]") { +TEST_CASE("Caller::storagecell_delay", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU) { // chip version 1.0 @@ -381,21 +388,21 @@ TEST_CASE("storagecell_delay", "[.cmd]") { auto prev_val = det.getStorageCellDelay(); { std::ostringstream oss; - proxy.Call("storagecell_delay", {"1.62ms"}, -1, PUT, oss); + caller.call("storagecell_delay", {"1.62ms"}, -1, PUT, oss); REQUIRE(oss.str() == "storagecell_delay 1.62ms\n"); } { std::ostringstream oss; - proxy.Call("storagecell_delay", {}, -1, GET, oss); + caller.call("storagecell_delay", {}, -1, GET, oss); REQUIRE(oss.str() == "storagecell_delay 1.62ms\n"); } { std::ostringstream oss; - proxy.Call("storagecell_delay", {"0"}, -1, PUT, oss); + caller.call("storagecell_delay", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "storagecell_delay 0\n"); } REQUIRE_THROWS( - proxy.Call("storagecell_delay", {"1638376ns"}, -1, PUT)); + caller.call("storagecell_delay", {"1638376ns"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setStorageCellDelay(prev_val[i], {i}); } @@ -404,66 +411,66 @@ TEST_CASE("storagecell_delay", "[.cmd]") { else { // cannot set storage cell delay REQUIRE_THROWS( - proxy.Call("storagecell_delay", {"1.62ms"}, -1, PUT)); + caller.call("storagecell_delay", {"1.62ms"}, -1, PUT)); } } else { - REQUIRE_THROWS(proxy.Call("storagecell_delay", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("storagecell_delay", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("storagecell_delay", {}, -1, GET)); + REQUIRE_THROWS(caller.call("storagecell_delay", {"0"}, -1, PUT)); } } -TEST_CASE("gainmode", "[.cmd]") { +TEST_CASE("Caller::gainmode", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU) { auto prev_val = det.getGainMode(); { std::ostringstream oss; - proxy.Call("gainmode", {"forceswitchg1"}, -1, PUT, oss); + caller.call("gainmode", {"forceswitchg1"}, -1, PUT, oss); REQUIRE(oss.str() == "gainmode forceswitchg1\n"); } { std::ostringstream oss; - proxy.Call("gainmode", {}, -1, GET, oss); + caller.call("gainmode", {}, -1, GET, oss); REQUIRE(oss.str() == "gainmode forceswitchg1\n"); } { std::ostringstream oss; - proxy.Call("gainmode", {"dynamic"}, -1, PUT, oss); + caller.call("gainmode", {"dynamic"}, -1, PUT, oss); REQUIRE(oss.str() == "gainmode dynamic\n"); } { std::ostringstream oss; - proxy.Call("gainmode", {"forceswitchg2"}, -1, PUT, oss); + caller.call("gainmode", {"forceswitchg2"}, -1, PUT, oss); REQUIRE(oss.str() == "gainmode forceswitchg2\n"); } { std::ostringstream oss; - proxy.Call("gainmode", {"fixg1"}, -1, PUT, oss); + caller.call("gainmode", {"fixg1"}, -1, PUT, oss); REQUIRE(oss.str() == "gainmode fixg1\n"); } { std::ostringstream oss; - proxy.Call("gainmode", {"fixg2"}, -1, PUT, oss); + caller.call("gainmode", {"fixg2"}, -1, PUT, oss); REQUIRE(oss.str() == "gainmode fixg2\n"); } { std::ostringstream oss; - proxy.Call("gainmode", {"fixg0"}, -1, PUT, oss); + caller.call("gainmode", {"fixg0"}, -1, PUT, oss); REQUIRE(oss.str() == "gainmode fixg0\n"); } for (int i = 0; i != det.size(); ++i) { det.setGainMode(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("gainmode", {}, -1, GET)); + REQUIRE_THROWS(caller.call("gainmode", {}, -1, GET)); } } -TEST_CASE("filtercells", "[.cmd]") { +TEST_CASE("Caller::filtercells", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU) { // chip version 1.1 @@ -471,25 +478,25 @@ TEST_CASE("filtercells", "[.cmd]") { auto prev_val = det.getNumberOfFilterCells(); { std::ostringstream oss; - proxy.Call("filtercells", {"1"}, -1, PUT, oss); + caller.call("filtercells", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "filtercells 1\n"); } { std::ostringstream oss; - proxy.Call("filtercells", {"12"}, -1, PUT, oss); + caller.call("filtercells", {"12"}, -1, PUT, oss); REQUIRE(oss.str() == "filtercells 12\n"); } { std::ostringstream oss; - proxy.Call("filtercells", {"0"}, -1, PUT, oss); + caller.call("filtercells", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "filtercells 0\n"); } { std::ostringstream oss; - proxy.Call("filtercells", {}, -1, GET, oss); + caller.call("filtercells", {}, -1, GET, oss); REQUIRE(oss.str() == "filtercells 0\n"); } - REQUIRE_THROWS(proxy.Call("filtercells", {"13"}, -1, PUT)); + REQUIRE_THROWS(caller.call("filtercells", {"13"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setNumberOfFilterCells(prev_val[i], {i}); } @@ -497,18 +504,17 @@ TEST_CASE("filtercells", "[.cmd]") { // chip version 1.0 else { // cannot set/get filter cell - REQUIRE_THROWS(proxy.Call("filtercells", {"1"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("filtercells", {}, -1, GET)); + REQUIRE_THROWS(caller.call("filtercells", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("filtercells", {}, -1, GET)); } } else { - REQUIRE_THROWS(proxy.Call("filtercells", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("filtercells", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("filtercells", {}, -1, GET)); + REQUIRE_THROWS(caller.call("filtercells", {"0"}, -1, PUT)); } } - -TEST_CASE("pedestalmode", "[.cmd]") { +TEST_CASE("Caller::pedestalmode", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU) { auto prev_val = det.getPedestalMode(); @@ -519,51 +525,51 @@ TEST_CASE("pedestalmode", "[.cmd]") { auto prev_timingmode = det.getTimingMode().tsquash("Inconsistent timing mode to test"); - REQUIRE_NOTHROW(proxy.Call("pedestalmode", {}, 0, GET)); - REQUIRE_NOTHROW(proxy.Call("pedestalmode", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("pedestalmode", {"0"}, -1, GET)); + REQUIRE_NOTHROW(caller.call("pedestalmode", {}, 0, GET)); + REQUIRE_NOTHROW(caller.call("pedestalmode", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pedestalmode", {"0"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("pedestalmode", {"256", "10"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("pedestalmode", {"-1", "10"}, 0, PUT)); - REQUIRE_THROWS(proxy.Call("pedestalmode", {"20", "65536"}, 0, PUT)); - REQUIRE_THROWS(proxy.Call("pedestalmode", {"20", "-1"}, 0, PUT)); + REQUIRE_THROWS(caller.call("pedestalmode", {"256", "10"}, -1, PUT)); + REQUIRE_THROWS(caller.call("pedestalmode", {"-1", "10"}, 0, PUT)); + REQUIRE_THROWS(caller.call("pedestalmode", {"20", "65536"}, 0, PUT)); + REQUIRE_THROWS(caller.call("pedestalmode", {"20", "-1"}, 0, PUT)); { std::ostringstream oss; - proxy.Call("pedestalmode", {"30", "1000"}, -1, PUT, oss); + caller.call("pedestalmode", {"30", "1000"}, -1, PUT, oss); REQUIRE(oss.str() == "pedestalmode [30, 1000]\n"); } // cannot change any of these in pedestal mode - REQUIRE_THROWS_WITH(proxy.Call("frames", {"200"}, -1, PUT), + REQUIRE_THROWS_WITH(caller.call("frames", {"200"}, -1, PUT), "Detector returned: Cannot set frames in pedestal " "mode. It is overwritten anyway.\n"); - REQUIRE_THROWS_WITH(proxy.Call("triggers", {"200"}, -1, PUT), + REQUIRE_THROWS_WITH(caller.call("triggers", {"200"}, -1, PUT), "Detector returned: Cannot set triggers in " "pedestal mode. It is overwritten anyway.\n"); REQUIRE_THROWS_WITH( - proxy.Call("timing", {"auto"}, -1, PUT), + caller.call("timing", {"auto"}, -1, PUT), "Detector returned: Cannot set timing mode in pedestal mode. " "Switch off pedestal mode to change timing mode.\n"); REQUIRE_THROWS_WITH( - proxy.Call("scan", {"vb_comp", "500", "1500", "10"}, -1, PUT), + caller.call("scan", {"vb_comp", "500", "1500", "10"}, -1, PUT), "Detector returned: Cannot set scan when in pedestal mode.\n"); REQUIRE_THROWS_WITH( - proxy.Call("scan", {"0"}, -1, PUT), + caller.call("scan", {"0"}, -1, PUT), "Detector returned: Cannot set scan when in pedestal mode.\n"); // should not throw to get these values though - REQUIRE_NOTHROW(proxy.Call("frames", {}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("triggers", {}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("timing", {}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("scan", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("frames", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("triggers", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("timing", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("scan", {}, -1, GET)); { std::ostringstream oss; - proxy.Call("pedestalmode", {"50", "500"}, -1, PUT, oss); + caller.call("pedestalmode", {"50", "500"}, -1, PUT, oss); REQUIRE(oss.str() == "pedestalmode [50, 500]\n"); } { std::ostringstream oss; - proxy.Call("pedestalmode", {}, -1, GET, oss); + caller.call("pedestalmode", {}, -1, GET, oss); REQUIRE(oss.str() == "pedestalmode [enabled, 50, 500]\n"); } { @@ -575,12 +581,12 @@ TEST_CASE("pedestalmode", "[.cmd]") { } { std::ostringstream oss; - proxy.Call("pedestalmode", {"0"}, -1, PUT, oss); + caller.call("pedestalmode", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "pedestalmode [0]\n"); } { std::ostringstream oss; - proxy.Call("pedestalmode", {}, -1, GET, oss); + caller.call("pedestalmode", {}, -1, GET, oss); REQUIRE(oss.str() == "pedestalmode [disabled]\n"); } @@ -592,7 +598,7 @@ TEST_CASE("pedestalmode", "[.cmd]") { // auto mode det.setTimingMode(defs::AUTO_TIMING); - REQUIRE_NOTHROW(proxy.Call( + REQUIRE_NOTHROW(caller.call( "pedestalmode", {std::to_string(pedestalFrames), std::to_string(pedestalLoops)}, -1, PUT)); @@ -602,7 +608,7 @@ TEST_CASE("pedestalmode", "[.cmd]") { REQUIRE(numTriggers == 1); // pedestal mode off - REQUIRE_NOTHROW(proxy.Call("pedestalmode", {"0"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("pedestalmode", {"0"}, -1, PUT)); numTriggers = det.getNumberOfTriggers().squash(-1); numFrames = det.getNumberOfFrames().squash(-1); REQUIRE(numFrames == origFrames); @@ -612,7 +618,7 @@ TEST_CASE("pedestalmode", "[.cmd]") { REQUIRE_NOTHROW(det.setTimingMode(defs::TRIGGER_EXPOSURE)); origFrames = 5; REQUIRE_NOTHROW(det.setNumberOfFrames(origFrames)); - REQUIRE_NOTHROW(proxy.Call( + REQUIRE_NOTHROW(caller.call( "pedestalmode", {std::to_string(pedestalFrames), std::to_string(pedestalLoops)}, -1, PUT)); @@ -622,7 +628,7 @@ TEST_CASE("pedestalmode", "[.cmd]") { REQUIRE(numTriggers == 1); // pedestal mode off - REQUIRE_NOTHROW(proxy.Call("pedestalmode", {"0"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("pedestalmode", {"0"}, -1, PUT)); numTriggers = det.getNumberOfTriggers().squash(-1); numFrames = det.getNumberOfFrames().squash(-1); REQUIRE(numFrames == origFrames); @@ -633,7 +639,7 @@ TEST_CASE("pedestalmode", "[.cmd]") { REQUIRE_NOTHROW(det.setNumberOfFrames(origFrames)); origTriggers = 10; REQUIRE_NOTHROW(det.setNumberOfTriggers(origTriggers)); - REQUIRE_NOTHROW(proxy.Call( + REQUIRE_NOTHROW(caller.call( "pedestalmode", {std::to_string(pedestalFrames), std::to_string(pedestalLoops)}, -1, PUT)); @@ -643,7 +649,7 @@ TEST_CASE("pedestalmode", "[.cmd]") { REQUIRE(numTriggers == expNumFrames); // pedestal mode off - REQUIRE_NOTHROW(proxy.Call("pedestalmode", {"0"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("pedestalmode", {"0"}, -1, PUT)); numTriggers = det.getNumberOfTriggers().squash(-1); numFrames = det.getNumberOfFrames().squash(-1); REQUIRE(numFrames == origFrames); @@ -656,26 +662,26 @@ TEST_CASE("pedestalmode", "[.cmd]") { det.setPedestalMode(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("pedestalmode", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("pedestalmode", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("pedestalmode", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pedestalmode", {"0"}, -1, PUT)); } } -TEST_CASE("sync", "[.cmd]") { +TEST_CASE("Caller::sync", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getSynchronization().tsquash( "inconsistent synchronization to test"); { std::ostringstream oss; - proxy.Call("sync", {"0"}, -1, PUT, oss); + caller.call("sync", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "sync 0\n"); } { std::ostringstream oss; - proxy.Call("sync", {"1"}, -1, PUT, oss); + caller.call("sync", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "sync 1\n"); } // setting to master or slave when synced @@ -689,10 +695,10 @@ TEST_CASE("sync", "[.cmd]") { break; } } - proxy.Call("master", {"1"}, 0, PUT); - proxy.Call("master", {"0"}, 0, PUT); + caller.call("master", {"1"}, 0, PUT); + caller.call("master", {"0"}, 0, PUT); std::ostringstream oss; - proxy.Call("status", {}, -1, GET, oss); + caller.call("status", {}, -1, GET, oss); REQUIRE(oss.str() != "status running\n"); // set all to slaves, and then master for (int i = 0; i != det.size(); ++i) { @@ -702,7 +708,7 @@ TEST_CASE("sync", "[.cmd]") { } { std::ostringstream oss; - proxy.Call("sync", {}, -1, GET, oss); + caller.call("sync", {}, -1, GET, oss); REQUIRE(oss.str() == "sync 1\n"); } // setting sync when running @@ -721,10 +727,10 @@ TEST_CASE("sync", "[.cmd]") { det.setPeriod(std::chrono::milliseconds(1000)); det.setSynchronization(1); det.startDetector(); - REQUIRE_THROWS(proxy.Call("sync", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("sync", {"0"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("sync", {}, -1, GET, oss); + caller.call("sync", {}, -1, GET, oss); REQUIRE(oss.str() == "sync 1\n"); } det.stopDetector(); @@ -735,8 +741,8 @@ TEST_CASE("sync", "[.cmd]") { } det.setSynchronization(prev_val); } else { - REQUIRE_THROWS(proxy.Call("sync", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("sync", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("sync", {}, -1, GET)); + REQUIRE_THROWS(caller.call("sync", {"0"}, -1, PUT)); } } diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-moench.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-moench.cpp new file mode 100644 index 000000000..19ebaa435 --- /dev/null +++ b/slsDetectorSoftware/tests/Caller/test-Caller-moench.cpp @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#include "Caller.h" +#include "catch.hpp" +#include "sls/Detector.h" +#include "sls/sls_detector_defs.h" +#include + +#include "sls/versionAPI.h" +#include "test-Caller-global.h" +#include "tests/globals.h" + +namespace sls { + +using test::GET; +using test::PUT; + +/* dacs */ + +TEST_CASE("Caller::Setting and reading back moench dacs", "[.cmdcall][.dacs]") { + // vbp_colbuf, vipre, vin_cm, vb_sda, vcasc_sfp, vout_cm, vipre_cds, + // ibias_sfp + Detector det; + Caller caller(&det); + auto det_type = det.getDetectorType().squash(); + if (det_type == defs::MOENCH) { + SECTION("vbp_colbuf") { + test_dac_caller(defs::VBP_COLBUF, "vbp_colbuf", 1300); + } + SECTION("vipre") { test_dac_caller(defs::VIPRE, "vipre", 1000); } + SECTION("vin_cm") { test_dac_caller(defs::VIN_CM, "vin_cm", 1400); } + SECTION("vb_sda") { test_dac_caller(defs::VB_SDA, "vb_sda", 680); } + SECTION("vcasc_sfp") { + test_dac_caller(defs::VCASC_SFP, "vcasc_sfp", 1428); + } + SECTION("vout_cm") { test_dac_caller(defs::VOUT_CM, "vout_cm", 1200); } + SECTION("vipre_cds") { + test_dac_caller(defs::VIPRE_CDS, "vipre_cds", 800); + } + SECTION("ibias_sfp") { + test_dac_caller(defs::IBIAS_SFP, "ibias_sfp", 900); + } + // eiger + REQUIRE_THROWS(caller.call("vthreshold", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vsvp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vsvn", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vtrim", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrpreamp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrshaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vtgstv", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcmp_ll", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcmp_lr", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcal", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcmp_rl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcmp_rr", {}, -1, GET)); + REQUIRE_THROWS(caller.call("rxb_rb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("rxb_lb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcn", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vishaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("iodelay", {}, -1, GET)); + // gotthard + REQUIRE_THROWS(caller.call("vref_ds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcascn_pb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcascp_pb", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("vout_cm", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcasc_out", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("vin_cm", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_comp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("ib_test_c", {}, -1, GET)); + // mythen3 + REQUIRE_THROWS(caller.call("vrpreamp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrshaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vrshaper_n", {}, -1, GET)); + // REQUIRE_THROWS(caller.call("vipre", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vishaper", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vdcsh", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vth1", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vth2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vth3", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcal_n", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcal_p", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vtrim", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcassh", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcas", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vicin", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vipre_out", {}, -1, GET)); + // gotthard2 + REQUIRE_THROWS(caller.call("vref_h_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_comp_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcom_cds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_rstore", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_opa_1st", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcom_adc1", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_l_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_cds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_cs", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_opa_fd", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vcom_adc2", {}, -1, GET)); + // jungfrau + REQUIRE_THROWS(caller.call("vb_comp", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vdd_prot", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vin_com", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_prech", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_pixbuf", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vb_ds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_ds", {}, -1, GET)); + REQUIRE_THROWS(caller.call("vref_comp", {}, -1, GET)); + } +} + +} // namespace sls diff --git a/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-mythen3.cpp similarity index 60% rename from slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp rename to slsDetectorSoftware/tests/Caller/test-Caller-mythen3.cpp index f08612096..13a678ec3 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-mythen3.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-mythen3.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" +#include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" #include "sls/sls_detector_defs.h" @@ -9,7 +9,7 @@ #include "sls/Result.h" #include "sls/ToString.h" #include "sls/versionAPI.h" -#include "test-CmdProxy-global.h" +#include "test-Caller-global.h" #include "tests/globals.h" namespace sls { @@ -19,32 +19,41 @@ using test::PUT; /* dacs */ -TEST_CASE("Setting and reading back MYTHEN3 dacs", "[.cmd][.dacs]") { +TEST_CASE("Caller::Setting and reading back MYTHEN3 dacs", + "[.cmdcall][.dacs]") { // vcassh, vth2, vshaper, vshaperneg, vipre_out, vth3, vth1, // vicin, vcas, vpreamp, vpl, vipre, viinsh, vph, vtrim, vdcsh, Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { - SECTION("vcassh") { test_dac(defs::VCASSH, "vcassh", 1200); } - SECTION("vth2") { test_dac(defs::VTH2, "vth2", 2800); } - SECTION("vrshaper") { test_dac(defs::VRSHAPER, "vrshaper", 1280); } - SECTION("vrshaper_n") { - test_dac(defs::VRSHAPER_N, "vrshaper_n", 2800); + SECTION("vcassh") { test_dac_caller(defs::VCASSH, "vcassh", 1200); } + SECTION("vth2") { test_dac_caller(defs::VTH2, "vth2", 2800); } + SECTION("vrshaper") { + test_dac_caller(defs::VRSHAPER, "vrshaper", 1280); } - SECTION("vipre_out") { test_dac(defs::VIPRE_OUT, "vipre_out", 1220); } - SECTION("vth3") { test_dac(defs::VTH3, "vth3", 2800); } - SECTION("vth1") { test_dac(defs::VTH1, "vth1", 2880); } - SECTION("vicin") { test_dac(defs::VICIN, "vicin", 1708); } - SECTION("vcas") { test_dac(defs::VCAS, "vcas", 1800); } - SECTION("vrpreamp") { test_dac(defs::VRPREAMP, "vrpreamp", 1100); } - SECTION("vcal_n") { test_dac(defs::VCAL_N, "vcal_n", 1100); } - SECTION("vipre") { test_dac(defs::VIPRE, "vipre", 2624); } - SECTION("vishaper") { test_dac(defs::VISHAPER, "vishaper", 1708); } - SECTION("vcal_p") { test_dac(defs::VCAL_P, "vcal_p", 1712); } - SECTION("vtrim") { test_dac(defs::VTRIM, "vtrim", 2800); } - SECTION("vdcsh") { test_dac(defs::VDCSH, "vdcsh", 800); } + SECTION("vrshaper_n") { + test_dac_caller(defs::VRSHAPER_N, "vrshaper_n", 2800); + } + SECTION("vipre_out") { + test_dac_caller(defs::VIPRE_OUT, "vipre_out", 1220); + } + SECTION("vth3") { test_dac_caller(defs::VTH3, "vth3", 2800); } + SECTION("vth1") { test_dac_caller(defs::VTH1, "vth1", 2880); } + SECTION("vicin") { test_dac_caller(defs::VICIN, "vicin", 1708); } + SECTION("vcas") { test_dac_caller(defs::VCAS, "vcas", 1800); } + SECTION("vrpreamp") { + test_dac_caller(defs::VRPREAMP, "vrpreamp", 1100); + } + SECTION("vcal_n") { test_dac_caller(defs::VCAL_N, "vcal_n", 1100); } + SECTION("vipre") { test_dac_caller(defs::VIPRE, "vipre", 2624); } + SECTION("vishaper") { + test_dac_caller(defs::VISHAPER, "vishaper", 1708); + } + SECTION("vcal_p") { test_dac_caller(defs::VCAL_P, "vcal_p", 1712); } + SECTION("vtrim") { test_dac_caller(defs::VTRIM, "vtrim", 2800); } + SECTION("vdcsh") { test_dac_caller(defs::VDCSH, "vdcsh", 800); } SECTION("vthreshold") { // Read out individual vcmp to be able to reset after // the test is done @@ -55,67 +64,68 @@ TEST_CASE("Setting and reading back MYTHEN3 dacs", "[.cmd][.dacs]") { { std::ostringstream oss; - proxy.Call("dac", {"vthreshold", "1234"}, -1, PUT, oss); + caller.call("dac", {"vthreshold", "1234"}, -1, PUT, oss); REQUIRE(oss.str() == "dac vthreshold 1234\n"); } { std::ostringstream oss; - proxy.Call("dac", {"vthreshold"}, -1, GET, oss); + caller.call("dac", {"vthreshold"}, -1, GET, oss); REQUIRE(oss.str() == "dac vthreshold 1234\n"); } // disabling counters change vth values - proxy.Call("counters", {"0"}, -1, PUT); + caller.call("counters", {"0"}, -1, PUT); { std::ostringstream oss1, oss2, oss3; - proxy.Call("dac", {"vth1"}, -1, GET, oss1); + caller.call("dac", {"vth1"}, -1, GET, oss1); REQUIRE(oss1.str() == "dac vth1 1234\n"); - proxy.Call("dac", {"vth2"}, -1, GET, oss2); + caller.call("dac", {"vth2"}, -1, GET, oss2); REQUIRE(oss2.str() == "dac vth2 2800\n"); - proxy.Call("dac", {"vth3"}, -1, GET, oss3); + caller.call("dac", {"vth3"}, -1, GET, oss3); REQUIRE(oss3.str() == "dac vth3 2800\n"); } // vthreshold changes vth for only enabled counters - REQUIRE_NOTHROW(proxy.Call("dac", {"vthreshold", "2100"}, -1, PUT)); + REQUIRE_NOTHROW( + caller.call("dac", {"vthreshold", "2100"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("dac", {"vthreshold"}, -1, GET, oss); + caller.call("dac", {"vthreshold"}, -1, GET, oss); REQUIRE(oss.str() == "dac vthreshold 2100\n"); std::ostringstream oss1, oss2, oss3; - proxy.Call("dac", {"vth1"}, -1, GET, oss1); + caller.call("dac", {"vth1"}, -1, GET, oss1); REQUIRE(oss1.str() == "dac vth1 2100\n"); - proxy.Call("dac", {"vth2"}, -1, GET, oss2); + caller.call("dac", {"vth2"}, -1, GET, oss2); REQUIRE(oss2.str() == "dac vth2 2800\n"); - proxy.Call("dac", {"vth3"}, -1, GET, oss3); + caller.call("dac", {"vth3"}, -1, GET, oss3); REQUIRE(oss3.str() == "dac vth3 2800\n"); } // vth overwrite vth even if counter disabled { std::ostringstream oss; - proxy.Call("dac", {"vth2", "2200"}, -1, PUT); - proxy.Call("dac", {"vth2"}, -1, GET, oss); + caller.call("dac", {"vth2", "2200"}, -1, PUT); + caller.call("dac", {"vth2"}, -1, GET, oss); REQUIRE(oss.str() == "dac vth2 2200\n"); } // counters enabled, sets remembered values - proxy.Call("counters", {"0", "1", "2"}, -1, PUT); + caller.call("counters", {"0", "1", "2"}, -1, PUT); { std::ostringstream oss1, oss2, oss3; - proxy.Call("dac", {"vth1"}, -1, GET, oss1); + caller.call("dac", {"vth1"}, -1, GET, oss1); REQUIRE(oss1.str() == "dac vth1 2100\n"); - proxy.Call("dac", {"vth2"}, -1, GET, oss2); + caller.call("dac", {"vth2"}, -1, GET, oss2); REQUIRE(oss2.str() == "dac vth2 2200\n"); - proxy.Call("dac", {"vth3"}, -1, GET, oss3); + caller.call("dac", {"vth3"}, -1, GET, oss3); REQUIRE(oss3.str() == "dac vth3 2100\n"); } // counters enabled, sets remembered values - proxy.Call("counters", {"0", "1"}, -1, PUT); + caller.call("counters", {"0", "1"}, -1, PUT); { std::ostringstream oss1, oss2, oss3; - proxy.Call("dac", {"vth1"}, -1, GET, oss1); + caller.call("dac", {"vth1"}, -1, GET, oss1); REQUIRE(oss1.str() == "dac vth1 2100\n"); - proxy.Call("dac", {"vth2"}, -1, GET, oss2); + caller.call("dac", {"vth2"}, -1, GET, oss2); REQUIRE(oss2.str() == "dac vth2 2200\n"); - proxy.Call("dac", {"vth3"}, -1, GET, oss3); + caller.call("dac", {"vth3"}, -1, GET, oss3); REQUIRE(oss3.str() == "dac vth3 2800\n"); } // Reset dacs after test @@ -126,81 +136,81 @@ TEST_CASE("Setting and reading back MYTHEN3 dacs", "[.cmd][.dacs]") { det.setDAC(defs::VTH3, vth3[i], false, {i}); } } - REQUIRE_THROWS(proxy.Call("dac", {"vsvp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vsvn"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vtrim"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vrpreamp"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vrshaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtgstv"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_ll"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_lr"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rl"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rr"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"rxb_rb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"rxb_lb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcn"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vishaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"iodelay"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcascn_pb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcascp_pb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vout_cm"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcasc_out"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vin_cm"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"ib_test_c"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_h_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp_fe"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_cds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_rstore"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_opa_1st"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp_fe"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_adc1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_prech"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_l_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_cds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_cs"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_opa_fd"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_adc2"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_pixbuf"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vin_com"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vdd_prot"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vsvp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vsvn"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vtrim"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vrpreamp"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vrshaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vtgstv"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_ll"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_lr"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcal"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_rl"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcmp_rr"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"rxb_rb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"rxb_lb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcn"}, -1, GET)); + // REQUIRE_THROWS(caller.call("dac", {"vishaper"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"iodelay"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_ds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcascn_pb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcascp_pb"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vout_cm"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcasc_out"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vin_cm"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_comp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"ib_test_c"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_h_adc"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_comp_fe"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_comp_adc"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcom_cds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_rstore"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_opa_1st"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_comp_fe"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcom_adc1"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_prech"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_l_adc"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vref_cds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_cs"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_opa_fd"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vcom_adc2"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_ds"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_comp"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vb_pixbuf"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vin_com"}, -1, GET)); + REQUIRE_THROWS(caller.call("dac", {"vdd_prot"}, -1, GET)); } } /* acquisition */ -TEST_CASE("readout", "[.cmd]") { +TEST_CASE("Caller::readout", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); // PUT only command - REQUIRE_THROWS(proxy.Call("readout", {}, -1, GET)); + REQUIRE_THROWS(caller.call("readout", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); if (det_type != defs::MYTHEN3) { - REQUIRE_THROWS(proxy.Call("readout", {}, -1, GET)); + REQUIRE_THROWS(caller.call("readout", {}, -1, GET)); } else { std::ostringstream oss; - proxy.Call("readout", {}, -1, PUT, oss); + caller.call("readout", {}, -1, PUT, oss); REQUIRE(oss.str() == "readout successful\n"); } } /* Mythen3 Specific */ -TEST_CASE("counters", "[.cmd]") { +TEST_CASE("Caller::counters", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { - REQUIRE_THROWS(proxy.Call("counters", {}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("counters", {"3"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("counters", {"0", "-1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("counters", {"0", "1", "1"}, -1, GET)); + REQUIRE_THROWS(caller.call("counters", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("counters", {"3"}, -1, GET)); + REQUIRE_THROWS(caller.call("counters", {"0", "-1"}, -1, GET)); + REQUIRE_THROWS(caller.call("counters", {"0", "1", "1"}, -1, GET)); auto mask = det.getCounterMask({0}).squash(-1); std::vector list_str; @@ -210,140 +220,140 @@ TEST_CASE("counters", "[.cmd]") { } } std::ostringstream oss_set, oss_set2, oss_set3, oss_get; - proxy.Call("counters", {"0", "2", "1"}, -1, PUT, oss_set); + caller.call("counters", {"0", "2", "1"}, -1, PUT, oss_set); REQUIRE(oss_set.str() == "counters [0, 2, 1]\n"); - proxy.Call("counters", {"0", "2"}, -1, PUT, oss_set2); + caller.call("counters", {"0", "2"}, -1, PUT, oss_set2); REQUIRE(oss_set2.str() == "counters [0, 2]\n"); // put back old value - proxy.Call("counters", list_str, -1, PUT, oss_set3); + caller.call("counters", list_str, -1, PUT, oss_set3); REQUIRE(oss_set3.str() == "counters " + ToString(list_str) + "\n"); - proxy.Call("counters", {}, -1, GET, oss_get); + caller.call("counters", {}, -1, GET, oss_get); REQUIRE(oss_get.str() == "counters " + ToString(list_str) + "\n"); } else { - REQUIRE_THROWS(proxy.Call("counters", {}, -1, GET)); + REQUIRE_THROWS(caller.call("counters", {}, -1, GET)); } } -TEST_CASE("gates", "[.cmd]") { +TEST_CASE("Caller::gates", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { auto prev_val = det.getNumberOfGates(); { std::ostringstream oss; - proxy.Call("gates", {"1000"}, -1, PUT, oss); + caller.call("gates", {"1000"}, -1, PUT, oss); REQUIRE(oss.str() == "gates 1000\n"); } { std::ostringstream oss; - proxy.Call("gates", {}, -1, GET, oss); + caller.call("gates", {}, -1, GET, oss); REQUIRE(oss.str() == "gates 1000\n"); } { std::ostringstream oss; - proxy.Call("gates", {"1"}, -1, PUT, oss); + caller.call("gates", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "gates 1\n"); } - REQUIRE_THROWS(proxy.Call("gates", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("gates", {"0"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setNumberOfGates(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("gates", {}, -1, GET)); + REQUIRE_THROWS(caller.call("gates", {}, -1, GET)); } } -TEST_CASE("exptime1", "[.cmd]") { +TEST_CASE("Caller::exptime1", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { auto prev_val = det.getExptime(0); { std::ostringstream oss; - proxy.Call("exptime1", {"1.25s"}, -1, PUT, oss); + caller.call("exptime1", {"1.25s"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime1 1.25s\n"); } { std::ostringstream oss; - proxy.Call("exptime1", {}, -1, GET, oss); + caller.call("exptime1", {}, -1, GET, oss); REQUIRE(oss.str() == "exptime1 1.25s\n"); } { std::ostringstream oss; - proxy.Call("exptime1", {"0"}, -1, PUT, oss); + caller.call("exptime1", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime1 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setExptime(0, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("exptime1", {}, -1, GET)); + REQUIRE_THROWS(caller.call("exptime1", {}, -1, GET)); } } -TEST_CASE("exptime2", "[.cmd]") { +TEST_CASE("Caller::exptime2", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { auto prev_val = det.getExptime(1); { std::ostringstream oss; - proxy.Call("exptime2", {"1.25s"}, -1, PUT, oss); + caller.call("exptime2", {"1.25s"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime2 1.25s\n"); } { std::ostringstream oss; - proxy.Call("exptime2", {}, -1, GET, oss); + caller.call("exptime2", {}, -1, GET, oss); REQUIRE(oss.str() == "exptime2 1.25s\n"); } { std::ostringstream oss; - proxy.Call("exptime2", {"0"}, -1, PUT, oss); + caller.call("exptime2", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime2 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setExptime(1, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("exptime2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("exptime2", {}, -1, GET)); } } -TEST_CASE("exptime3", "[.cmd]") { +TEST_CASE("Caller::exptime3", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { auto prev_val = det.getExptime(2); { std::ostringstream oss; - proxy.Call("exptime3", {"1.25s"}, -1, PUT, oss); + caller.call("exptime3", {"1.25s"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime3 1.25s\n"); } { std::ostringstream oss; - proxy.Call("exptime3", {}, -1, GET, oss); + caller.call("exptime3", {}, -1, GET, oss); REQUIRE(oss.str() == "exptime3 1.25s\n"); } { std::ostringstream oss; - proxy.Call("exptime3", {"0"}, -1, PUT, oss); + caller.call("exptime3", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime3 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setExptime(2, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("exptime3", {}, -1, GET)); + REQUIRE_THROWS(caller.call("exptime3", {}, -1, GET)); } } -TEST_CASE("gatedelay", "[.cmd]") { +TEST_CASE("Caller::gatedelay", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { auto prev_val = det.getExptimeForAllGates().tsquash( @@ -353,148 +363,148 @@ TEST_CASE("gatedelay", "[.cmd]") { } { std::ostringstream oss; - proxy.Call("gatedelay", {"0.05"}, -1, PUT, oss); + caller.call("gatedelay", {"0.05"}, -1, PUT, oss); REQUIRE(oss.str() == "gatedelay 0.05\n"); } if (det_type != defs::MYTHEN3) { std::ostringstream oss; - proxy.Call("gatedelay", {}, -1, GET, oss); + caller.call("gatedelay", {}, -1, GET, oss); REQUIRE(oss.str() == "gatedelay 50ms\n"); } { std::ostringstream oss; - proxy.Call("gatedelay", {"1s"}, -1, PUT, oss); + caller.call("gatedelay", {"1s"}, -1, PUT, oss); REQUIRE(oss.str() == "gatedelay 1s\n"); } { std::ostringstream oss; - proxy.Call("gatedelay", {"0"}, -1, PUT, oss); + caller.call("gatedelay", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "gatedelay 0\n"); } det.setGateDelay(-1, prev_val[0]); } else { - REQUIRE_THROWS(proxy.Call("gatedelay", {}, -1, GET)); + REQUIRE_THROWS(caller.call("gatedelay", {}, -1, GET)); } } -TEST_CASE("gatedelay1", "[.cmd]") { +TEST_CASE("Caller::gatedelay1", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { auto prev_val = det.getGateDelay(0); { std::ostringstream oss; - proxy.Call("gatedelay1", {"1.25s"}, -1, PUT, oss); + caller.call("gatedelay1", {"1.25s"}, -1, PUT, oss); REQUIRE(oss.str() == "gatedelay1 1.25s\n"); } { std::ostringstream oss; - proxy.Call("gatedelay1", {}, -1, GET, oss); + caller.call("gatedelay1", {}, -1, GET, oss); REQUIRE(oss.str() == "gatedelay1 1.25s\n"); } { std::ostringstream oss; - proxy.Call("gatedelay1", {"0"}, -1, PUT, oss); + caller.call("gatedelay1", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "gatedelay1 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setGateDelay(0, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("gatedelay1", {}, -1, GET)); + REQUIRE_THROWS(caller.call("gatedelay1", {}, -1, GET)); } } -TEST_CASE("gatedelay2", "[.cmd]") { +TEST_CASE("Caller::gatedelay2", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { auto prev_val = det.getGateDelay(1); { std::ostringstream oss; - proxy.Call("gatedelay2", {"1.25s"}, -1, PUT, oss); + caller.call("gatedelay2", {"1.25s"}, -1, PUT, oss); REQUIRE(oss.str() == "gatedelay2 1.25s\n"); } { std::ostringstream oss; - proxy.Call("gatedelay2", {}, -1, GET, oss); + caller.call("gatedelay2", {}, -1, GET, oss); REQUIRE(oss.str() == "gatedelay2 1.25s\n"); } { std::ostringstream oss; - proxy.Call("gatedelay2", {"0"}, -1, PUT, oss); + caller.call("gatedelay2", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "gatedelay2 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setGateDelay(1, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("gatedelay2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("gatedelay2", {}, -1, GET)); } } -TEST_CASE("gatedelay3", "[.cmd]") { +TEST_CASE("Caller::gatedelay3", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { auto prev_val = det.getGateDelay(2); { std::ostringstream oss; - proxy.Call("gatedelay3", {"1.25s"}, -1, PUT, oss); + caller.call("gatedelay3", {"1.25s"}, -1, PUT, oss); REQUIRE(oss.str() == "gatedelay3 1.25s\n"); } { std::ostringstream oss; - proxy.Call("gatedelay3", {}, -1, GET, oss); + caller.call("gatedelay3", {}, -1, GET, oss); REQUIRE(oss.str() == "gatedelay3 1.25s\n"); } { std::ostringstream oss; - proxy.Call("gatedelay3", {"0"}, -1, PUT, oss); + caller.call("gatedelay3", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "gatedelay3 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setGateDelay(2, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("gatedelay3", {}, -1, GET)); + REQUIRE_THROWS(caller.call("gatedelay3", {}, -1, GET)); } } -TEST_CASE("polarity", "[.cmd]") { +TEST_CASE("Caller::polarity", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); if (det.getDetectorType().squash() == defs::MYTHEN3) { auto prev_val = det.getPolarity(); { std::ostringstream oss; - proxy.Call("polarity", {"pos"}, -1, PUT, oss); + caller.call("polarity", {"pos"}, -1, PUT, oss); REQUIRE(oss.str() == "polarity pos\n"); } { std::ostringstream oss; - proxy.Call("polarity", {"neg"}, -1, PUT, oss); + caller.call("polarity", {"neg"}, -1, PUT, oss); REQUIRE(oss.str() == "polarity neg\n"); } { std::ostringstream oss; - proxy.Call("polarity", {}, -1, GET, oss); + caller.call("polarity", {}, -1, GET, oss); REQUIRE(oss.str() == "polarity neg\n"); } for (int i = 0; i != det.size(); ++i) { det.setPolarity(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("polarity", {}, -1, GET)); + REQUIRE_THROWS(caller.call("polarity", {}, -1, GET)); } } -TEST_CASE("interpolation", "[.cmd]") { +TEST_CASE("Caller::interpolation", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); if (det.getDetectorType().squash() == defs::MYTHEN3) { auto prev_interpolation = det.getInterpolation(); auto prev_mask = det.getCounterMask(); @@ -509,7 +519,7 @@ TEST_CASE("interpolation", "[.cmd]") { det.setCounterMask(fixedMask[i]); { std::ostringstream oss; - proxy.Call("interpolation", {"1"}, -1, PUT, oss); + caller.call("interpolation", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "interpolation 1\n"); REQUIRE(det.getCounterMask().tsquash( "inconsistent counter mask") == 7); @@ -519,7 +529,7 @@ TEST_CASE("interpolation", "[.cmd]") { } { std::ostringstream oss; - proxy.Call("interpolation", {"0"}, -1, PUT, oss); + caller.call("interpolation", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "interpolation 0\n"); REQUIRE(det.getCounterMask().tsquash( "inconsistent counter mask") == fixedMask[i]); @@ -533,7 +543,7 @@ TEST_CASE("interpolation", "[.cmd]") { { std::ostringstream oss; - proxy.Call("interpolation", {}, -1, GET, oss); + caller.call("interpolation", {}, -1, GET, oss); REQUIRE(oss.str() == "interpolation 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -542,13 +552,13 @@ TEST_CASE("interpolation", "[.cmd]") { det.setDAC(defs::VTH3, prev_vth3DacVal[i], 0, {i}); } } else { - REQUIRE_THROWS(proxy.Call("interpolation", {}, -1, GET)); + REQUIRE_THROWS(caller.call("interpolation", {}, -1, GET)); } } -TEST_CASE("pumpprobe", "[.cmd]") { +TEST_CASE("Caller::pumpprobe", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); if (det.getDetectorType().squash() == defs::MYTHEN3) { auto prev_val = det.getPumpProbe(); auto prev_interpolation = det.getInterpolation(); @@ -570,7 +580,7 @@ TEST_CASE("pumpprobe", "[.cmd]") { { // pump probe std::ostringstream oss; - proxy.Call("pumpprobe", {"1"}, -1, PUT, oss); + caller.call("pumpprobe", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "pumpprobe 1\n"); REQUIRE(det.getDAC(defs::VTH1, 0, {0}) .tsquash("inconsistent vth2 dac value") == @@ -583,11 +593,11 @@ TEST_CASE("pumpprobe", "[.cmd]") { disabledDacValue); } // interpolation and pump probe - REQUIRE_THROWS(proxy.Call("interpolation", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("interpolation", {"1"}, -1, PUT)); { // none std::ostringstream oss; - proxy.Call("pumpprobe", {"0"}, -1, PUT, oss); + caller.call("pumpprobe", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "pumpprobe 0\n"); REQUIRE(det.getCounterMask().tsquash( "inconsistent counter mask") == fixedMask[i]); @@ -607,7 +617,7 @@ TEST_CASE("pumpprobe", "[.cmd]") { } { std::ostringstream oss; - proxy.Call("pumpprobe", {}, -1, GET, oss); + caller.call("pumpprobe", {}, -1, GET, oss); REQUIRE(oss.str() == "pumpprobe 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -619,63 +629,63 @@ TEST_CASE("pumpprobe", "[.cmd]") { det.setDAC(defs::VTH3, prev_vth3DacVal[i], 0, {i}); } } else { - REQUIRE_THROWS(proxy.Call("pumpprobe", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pumpprobe", {}, -1, GET)); } } -TEST_CASE("apulse", "[.cmd]") { +TEST_CASE("Caller::apulse", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); if (det.getDetectorType().squash() == defs::MYTHEN3) { auto prev_val = det.getAnalogPulsing(); { std::ostringstream oss; - proxy.Call("apulse", {"1"}, -1, PUT, oss); + caller.call("apulse", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "apulse 1\n"); } { std::ostringstream oss; - proxy.Call("apulse", {"0"}, -1, PUT, oss); + caller.call("apulse", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "apulse 0\n"); } { std::ostringstream oss; - proxy.Call("apulse", {}, -1, GET, oss); + caller.call("apulse", {}, -1, GET, oss); REQUIRE(oss.str() == "apulse 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setAnalogPulsing(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("apulse", {}, -1, GET)); + REQUIRE_THROWS(caller.call("apulse", {}, -1, GET)); } } -TEST_CASE("dpulse", "[.cmd]") { +TEST_CASE("Caller::dpulse", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); if (det.getDetectorType().squash() == defs::MYTHEN3) { auto prev_val = det.getDigitalPulsing(); { std::ostringstream oss; - proxy.Call("dpulse", {"1"}, -1, PUT, oss); + caller.call("dpulse", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "dpulse 1\n"); } { std::ostringstream oss; - proxy.Call("dpulse", {"0"}, -1, PUT, oss); + caller.call("dpulse", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "dpulse 0\n"); } { std::ostringstream oss; - proxy.Call("dpulse", {}, -1, GET, oss); + caller.call("dpulse", {}, -1, GET, oss); REQUIRE(oss.str() == "dpulse 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setDigitalPulsing(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("dpulse", {}, -1, GET)); + REQUIRE_THROWS(caller.call("dpulse", {}, -1, GET)); } } diff --git a/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp similarity index 69% rename from slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp rename to slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp index 08fad83bc..fb5f75764 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" +#include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" #include "sls/sls_detector_defs.h" @@ -9,7 +9,7 @@ #include "sls/Result.h" #include "sls/ToString.h" #include "sls/versionAPI.h" -#include "test-CmdProxy-global.h" +#include "test-Caller-global.h" #include "tests/globals.h" namespace sls { @@ -19,93 +19,93 @@ using test::PUT; /* Pattern */ -TEST_CASE("patfname", "[.cmd]") { +TEST_CASE("Caller::patfname", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { - REQUIRE_THROWS(proxy.Call("patfname", {}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("patfname", {}, -1, GET)); + REQUIRE_THROWS(caller.call("patfname", {}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("patfname", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("patfname", {}, -1, GET)); + REQUIRE_THROWS(caller.call("patfname", {}, -1, GET)); } } -TEST_CASE("pattern", "[.cmd]") { +TEST_CASE("Caller::pattern", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { // no proper test for put - REQUIRE_THROWS(proxy.Call("pattern", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pattern", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("pattern", {}, -1, GET)); + REQUIRE_THROWS(caller.call("pattern", {}, -1, GET)); } } -TEST_CASE("savepattern", "[.cmd]") { +TEST_CASE("Caller::savepattern", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { REQUIRE_THROWS( - proxy.Call("savepattern", {"/tmp/pattern.txt"}, -1, GET)); + caller.call("savepattern", {"/tmp/pattern.txt"}, -1, GET)); if (det.size() == 1) { REQUIRE_NOTHROW( - proxy.Call("savepattern", {"/tmp/pattern.txt"}, -1, PUT)); + caller.call("savepattern", {"/tmp/pattern.txt"}, -1, PUT)); } } else { REQUIRE_THROWS( - proxy.Call("savepattern", {"/tmp/pattern.txt"}, -1, PUT)); + caller.call("savepattern", {"/tmp/pattern.txt"}, -1, PUT)); } } -TEST_CASE("defaultpattern", "[.cmd]") { +TEST_CASE("Caller::defaultpattern", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { - REQUIRE_THROWS(proxy.Call("defaultpattern", {}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("defaultpattern", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("defaultpattern", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("defaultpattern", {}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("defaultpattern", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("defaultpattern", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("defaultpattern", {}, -1, GET)); + REQUIRE_THROWS(caller.call("defaultpattern", {}, -1, PUT)); } } -TEST_CASE("patioctrl", "[.cmd]") { +TEST_CASE("Caller::patioctrl", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getPatternIOControl(); { std::ostringstream oss; - proxy.Call("patioctrl", {"0xc15004808d0a21a4"}, -1, PUT, oss); + caller.call("patioctrl", {"0xc15004808d0a21a4"}, -1, PUT, oss); REQUIRE(oss.str() == "patioctrl 0xc15004808d0a21a4\n"); } { std::ostringstream oss; - proxy.Call("patioctrl", {"0xaadf0"}, -1, PUT, oss); + caller.call("patioctrl", {"0xaadf0"}, -1, PUT, oss); REQUIRE(oss.str() == "patioctrl 0x00000000000aadf0\n"); } { std::ostringstream oss; - proxy.Call("patioctrl", {}, -1, GET, oss); + caller.call("patioctrl", {}, -1, GET, oss); REQUIRE(oss.str() == "patioctrl 0x00000000000aadf0\n"); } for (int i = 0; i != det.size(); ++i) { det.setPatternIOControl(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("patioctrl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("patioctrl", {}, -1, GET)); } } -TEST_CASE("patword", "[.cmd]") { +TEST_CASE("Caller::patword", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { @@ -114,19 +114,19 @@ TEST_CASE("patword", "[.cmd]") { auto prev_val = det.getPatternWord(addr); { std::ostringstream oss; - proxy.Call("patword", {saddr, "0xc15004808d0a21a4"}, -1, PUT, oss); + caller.call("patword", {saddr, "0xc15004808d0a21a4"}, -1, PUT, oss); REQUIRE(oss.str() == "patword [" + saddr + ", 0xc15004808d0a21a4]\n"); } { std::ostringstream oss; - proxy.Call("patword", {saddr, "0xaadf0"}, -1, PUT, oss); + caller.call("patword", {saddr, "0xaadf0"}, -1, PUT, oss); REQUIRE(oss.str() == "patword [" + saddr + ", 0x00000000000aadf0]\n"); } { std::ostringstream oss; - proxy.Call("patword", {saddr}, -1, GET, oss); + caller.call("patword", {saddr}, -1, GET, oss); REQUIRE(oss.str() == "patword [" + saddr + ", 0x00000000000aadf0]\n"); } @@ -134,25 +134,25 @@ TEST_CASE("patword", "[.cmd]") { det.setPatternWord(addr, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("patword", {"0x23"}, -1, GET)); + REQUIRE_THROWS(caller.call("patword", {"0x23"}, -1, GET)); } } -TEST_CASE("patlimits", "[.cmd]") { +TEST_CASE("Caller::patlimits", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternLoopAddresses(-1); { std::ostringstream oss; - proxy.Call("patlimits", {"0x20", "0x5c"}, -1, PUT, oss); + caller.call("patlimits", {"0x20", "0x5c"}, -1, PUT, oss); REQUIRE(oss.str() == "patlimits [0x0020, 0x005c]\n"); } { std::ostringstream oss; - proxy.Call("patlimits", {}, -1, GET, oss); + caller.call("patlimits", {}, -1, GET, oss); REQUIRE(oss.str() == "patlimits [0x0020, 0x005c]\n"); } for (int i = 0; i != det.size(); ++i) { @@ -160,13 +160,13 @@ TEST_CASE("patlimits", "[.cmd]") { {i}); } } else { - REQUIRE_THROWS(proxy.Call("patlimits", {}, -1, GET)); + REQUIRE_THROWS(caller.call("patlimits", {}, -1, GET)); } } -TEST_CASE("patloop", "[.cmd]") { +TEST_CASE("Caller::patloop", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { @@ -181,24 +181,24 @@ TEST_CASE("patloop", "[.cmd]") { std::string deprecatedCmd = "patloop" + sLoop; { // depreciated std::ostringstream oss; - proxy.Call(deprecatedCmd, {"0x20", "0x5c"}, -1, PUT, oss); + caller.call(deprecatedCmd, {"0x20", "0x5c"}, -1, PUT, oss); REQUIRE(oss.str() == deprecatedCmd + " [0x0020, 0x005c]\n"); } { // depreciated std::ostringstream oss; - proxy.Call(deprecatedCmd, {}, -1, GET, oss); + caller.call(deprecatedCmd, {}, -1, GET, oss); REQUIRE(oss.str() == deprecatedCmd + " [0x0020, 0x005c]\n"); } } { std::ostringstream oss; - proxy.Call("patloop", {sLoop, "0x20", "0x5c"}, -1, PUT, oss); + caller.call("patloop", {sLoop, "0x20", "0x5c"}, -1, PUT, oss); REQUIRE(oss.str() == "patloop " + sLoop + " [0x0020, 0x005c]\n"); } { std::ostringstream oss; - proxy.Call("patloop", {sLoop}, -1, GET, oss); + caller.call("patloop", {sLoop}, -1, GET, oss); REQUIRE(oss.str() == "patloop " + sLoop + " [0x0020, 0x005c]\n"); } @@ -208,13 +208,13 @@ TEST_CASE("patloop", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("patloop", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("patloop", {"0"}, -1, GET)); } } -TEST_CASE("patnloop", "[.cmd]") { +TEST_CASE("Caller::patnloop", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { @@ -229,23 +229,23 @@ TEST_CASE("patnloop", "[.cmd]") { std::string deprecatedCmd = "patnloop" + sLoop; { // depreciated std::ostringstream oss; - proxy.Call(deprecatedCmd, {"5"}, -1, PUT, oss); + caller.call(deprecatedCmd, {"5"}, -1, PUT, oss); REQUIRE(oss.str() == deprecatedCmd + " 5\n"); } { // depreciated std::ostringstream oss; - proxy.Call(deprecatedCmd, {}, -1, GET, oss); + caller.call(deprecatedCmd, {}, -1, GET, oss); REQUIRE(oss.str() == deprecatedCmd + " 5\n"); } } { std::ostringstream oss; - proxy.Call("patnloop", {sLoop, "5"}, -1, PUT, oss); + caller.call("patnloop", {sLoop, "5"}, -1, PUT, oss); REQUIRE(oss.str() == "patnloop " + sLoop + " 5\n"); } { std::ostringstream oss; - proxy.Call("patnloop", {sLoop}, -1, GET, oss); + caller.call("patnloop", {sLoop}, -1, GET, oss); REQUIRE(oss.str() == "patnloop " + sLoop + " 5\n"); } for (int iDet = 0; iDet != det.size(); ++iDet) { @@ -253,13 +253,13 @@ TEST_CASE("patnloop", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("patnloop", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("patnloop", {"0"}, -1, GET)); } } -TEST_CASE("patwait", "[.cmd]") { +TEST_CASE("Caller::patwait", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { @@ -274,23 +274,23 @@ TEST_CASE("patwait", "[.cmd]") { std::string deprecatedCmd = "patwait" + sLoop; { // depreciated std::ostringstream oss; - proxy.Call(deprecatedCmd, {"0x5c"}, -1, PUT, oss); + caller.call(deprecatedCmd, {"0x5c"}, -1, PUT, oss); REQUIRE(oss.str() == deprecatedCmd + " 0x005c\n"); } { // depreciated std::ostringstream oss; - proxy.Call(deprecatedCmd, {}, -1, GET, oss); + caller.call(deprecatedCmd, {}, -1, GET, oss); REQUIRE(oss.str() == deprecatedCmd + " 0x005c\n"); } } { std::ostringstream oss; - proxy.Call("patwait", {sLoop, "0x5c"}, -1, PUT, oss); + caller.call("patwait", {sLoop, "0x5c"}, -1, PUT, oss); REQUIRE(oss.str() == "patwait " + sLoop + " 0x005c\n"); } { std::ostringstream oss; - proxy.Call("patwait", {sLoop}, -1, GET, oss); + caller.call("patwait", {sLoop}, -1, GET, oss); REQUIRE(oss.str() == "patwait " + sLoop + " 0x005c\n"); } for (int iDet = 0; iDet != det.size(); ++iDet) { @@ -298,13 +298,13 @@ TEST_CASE("patwait", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("patwait", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("patwait", {"0"}, -1, GET)); } } -TEST_CASE("patwaittime", "[.cmd]") { +TEST_CASE("Caller::patwaittime", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { @@ -319,23 +319,23 @@ TEST_CASE("patwaittime", "[.cmd]") { std::string deprecatedCmd = "patwaittime" + sLoop; { // depreciated std::ostringstream oss; - proxy.Call(deprecatedCmd, {"8589936640"}, -1, PUT, oss); + caller.call(deprecatedCmd, {"8589936640"}, -1, PUT, oss); REQUIRE(oss.str() == deprecatedCmd + " 8589936640\n"); } { // depreciated std::ostringstream oss; - proxy.Call(deprecatedCmd, {}, -1, GET, oss); + caller.call(deprecatedCmd, {}, -1, GET, oss); REQUIRE(oss.str() == deprecatedCmd + " 8589936640\n"); } } { std::ostringstream oss; - proxy.Call("patwaittime", {sLoop, "8589936640"}, -1, PUT, oss); + caller.call("patwaittime", {sLoop, "8589936640"}, -1, PUT, oss); REQUIRE(oss.str() == "patwaittime " + sLoop + " 8589936640\n"); } { std::ostringstream oss; - proxy.Call("patwaittime", {sLoop}, -1, GET, oss); + caller.call("patwaittime", {sLoop}, -1, GET, oss); REQUIRE(oss.str() == "patwaittime " + sLoop + " 8589936640\n"); } for (int iDet = 0; iDet != det.size(); ++iDet) { @@ -343,69 +343,69 @@ TEST_CASE("patwaittime", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("patwaittime", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("patwaittime", {"0"}, -1, GET)); } } -TEST_CASE("patmask", "[.cmd]") { +TEST_CASE("Caller::patmask", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternMask(); { std::ostringstream oss; - proxy.Call("patmask", {"0x842f020204200dc0"}, -1, PUT, oss); + caller.call("patmask", {"0x842f020204200dc0"}, -1, PUT, oss); REQUIRE(oss.str() == "patmask 0x842f020204200dc0\n"); } { std::ostringstream oss; - proxy.Call("patmask", {}, -1, GET, oss); + caller.call("patmask", {}, -1, GET, oss); REQUIRE(oss.str() == "patmask 0x842f020204200dc0\n"); } for (int i = 0; i != det.size(); ++i) { det.setPatternMask(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("patmask", {}, -1, GET)); + REQUIRE_THROWS(caller.call("patmask", {}, -1, GET)); } } -TEST_CASE("patsetbit", "[.cmd]") { +TEST_CASE("Caller::patsetbit", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternBitMask(); { std::ostringstream oss; - proxy.Call("patsetbit", {"0x842f020204200dc0"}, -1, PUT, oss); + caller.call("patsetbit", {"0x842f020204200dc0"}, -1, PUT, oss); REQUIRE(oss.str() == "patsetbit 0x842f020204200dc0\n"); } { std::ostringstream oss; - proxy.Call("patsetbit", {}, -1, GET, oss); + caller.call("patsetbit", {}, -1, GET, oss); REQUIRE(oss.str() == "patsetbit 0x842f020204200dc0\n"); } for (int i = 0; i != det.size(); ++i) { det.setPatternBitMask(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("patsetbit", {}, -1, GET)); + REQUIRE_THROWS(caller.call("patsetbit", {}, -1, GET)); } } -TEST_CASE("patternstart", "[.cmd]") { +TEST_CASE("Caller::patternstart", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("patternstart", {}, -1, GET)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("patternstart", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { - REQUIRE_NOTHROW(proxy.Call("patternstart", {}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("patternstart", {}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("patternstart", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("patternstart", {}, -1, PUT)); } } diff --git a/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp similarity index 65% rename from slsDetectorSoftware/tests/test-CmdProxy-rx.cpp rename to slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp index 364335450..195c884d9 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp @@ -1,11 +1,12 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" +#include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" #include "sls/Version.h" #include "sls/sls_detector_defs.h" -#include "test-CmdProxy-global.h" +#include "test-Caller-global.h" + #include #include "sls/versionAPI.h" @@ -23,76 +24,76 @@ python/scripts/list_tested_cmd.py to check if all commands are covered /* configuration */ -TEST_CASE("rx_version", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_version", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); std::ostringstream oss; - proxy.Call("rx_version", {}, -1, GET, oss); + caller.call("rx_version", {}, -1, GET, oss); sls::Version v(APIRECEIVER); std::ostringstream vs; vs << "rx_version " << v.concise() << '\n'; REQUIRE(oss.str() == vs.str()); - REQUIRE_THROWS(proxy.Call("rx_version", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_version", {"0"}, -1, PUT)); } /* acquisition */ -TEST_CASE("rx_start", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_start", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); det.setFileWrite(false); // avoid writing or error on file creation // PUT only command - REQUIRE_THROWS(proxy.Call("rx_start", {}, -1, GET)); + REQUIRE_THROWS(caller.call("rx_start", {}, -1, GET)); { std::ostringstream oss; - proxy.Call("rx_start", {}, -1, PUT, oss); + caller.call("rx_start", {}, -1, PUT, oss); REQUIRE(oss.str() == "rx_start successful\n"); } { std::ostringstream oss; - proxy.Call("rx_status", {}, -1, GET, oss); + caller.call("rx_status", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_status running\n"); } } -TEST_CASE("rx_stop", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_stop", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); // PUT only command - REQUIRE_THROWS(proxy.Call("rx_stop", {}, -1, GET)); + REQUIRE_THROWS(caller.call("rx_stop", {}, -1, GET)); { std::ostringstream oss; - proxy.Call("rx_stop", {}, -1, PUT, oss); + caller.call("rx_stop", {}, -1, PUT, oss); REQUIRE(oss.str() == "rx_stop successful\n"); } { std::ostringstream oss; - proxy.Call("rx_status", {}, -1, GET, oss); + caller.call("rx_status", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_status idle\n"); } } -TEST_CASE("rx_status", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_status", "[.cmdcall][.rx]") { Detector det; det.setFileWrite(false); // avoid writing or error on file creation - CmdProxy proxy(&det); + Caller caller(&det); det.startReceiver(); { std::ostringstream oss; - proxy.Call("rx_status", {}, -1, GET, oss); + caller.call("rx_status", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_status running\n"); } det.stopReceiver(); { std::ostringstream oss; - proxy.Call("rx_status", {}, -1, GET, oss); + caller.call("rx_status", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_status idle\n"); } } -TEST_CASE("rx_framescaught", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_framescaught", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); // This ensures 0 caught frames auto prev_val = det.getFileWrite(); @@ -101,7 +102,7 @@ TEST_CASE("rx_framescaught", "[.cmd][.rx]") { det.stopReceiver(); { std::ostringstream oss; - proxy.Call("rx_framescaught", {}, -1, GET, oss); + caller.call("rx_framescaught", {}, -1, GET, oss); if (det.getNumberofUDPInterfaces().tsquash( "inconsistent number of interfaces") == 1) { REQUIRE(oss.str() == "rx_framescaught [0]\n"); @@ -116,7 +117,7 @@ TEST_CASE("rx_framescaught", "[.cmd][.rx]") { // det.acquire(); // { // std::ostringstream oss; - // proxy.Call("rx_framescaught", {}, -1, GET, oss); + // caller.call("rx_framescaught", {}, -1, GET, oss); // REQUIRE(oss.str() == "rx_framescaught 1\n"); // } @@ -125,11 +126,11 @@ TEST_CASE("rx_framescaught", "[.cmd][.rx]") { } } -TEST_CASE("rx_missingpackets", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_missingpackets", "[.cmdcall][.rx]") { Detector det; auto prev_val = det.getFileWrite(); det.setFileWrite(false); // avoid writing or error on file creation - CmdProxy proxy(&det); + Caller caller(&det); auto prev_frames = det.getNumberOfFrames().tsquash("inconsistent #frames in test"); det.setNumberOfFrames(100); @@ -138,7 +139,7 @@ TEST_CASE("rx_missingpackets", "[.cmd][.rx]") { det.startReceiver(); det.stopReceiver(); std::ostringstream oss; - proxy.Call("rx_missingpackets", {}, -1, GET, oss); + caller.call("rx_missingpackets", {}, -1, GET, oss); if (det.getNumberofUDPInterfaces().tsquash( "inconsistent number of interfaces") == 1) { REQUIRE(oss.str() != "rx_missingpackets [0]\n"); @@ -154,7 +155,7 @@ TEST_CASE("rx_missingpackets", "[.cmd][.rx]") { det.stopDetector(); det.stopReceiver(); std::ostringstream oss; - proxy.Call("rx_missingpackets", {}, -1, GET, oss); + caller.call("rx_missingpackets", {}, -1, GET, oss); if (det.getNumberofUDPInterfaces().tsquash( "inconsistent number of interfaces") == 1) { REQUIRE(oss.str() == "rx_missingpackets [0]\n"); @@ -168,28 +169,28 @@ TEST_CASE("rx_missingpackets", "[.cmd][.rx]") { det.setNumberOfFrames(prev_frames); } -TEST_CASE("rx_frameindex", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_frameindex", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); - proxy.Call("rx_frameindex", {}, -1, GET); + Caller caller(&det); + caller.call("rx_frameindex", {}, -1, GET); // This is a get only command - REQUIRE_THROWS(proxy.Call("rx_frameindex", {"2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_frameindex", {"2"}, -1, PUT)); } /* Network Configuration (Detector<->Receiver) */ -TEST_CASE("rx_printconfig", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_printconfig", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("rx_printconfig", {}, -1, GET)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("rx_printconfig", {}, -1, GET)); } /* Receiver Config */ -TEST_CASE("rx_hostname", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_hostname", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxHostname(); // Cannot set rx_hostname (will reset parameters in rxr and no shm variables @@ -197,12 +198,12 @@ TEST_CASE("rx_hostname", "[.cmd][.rx]") { // { // // disable receiver // std::ostringstream oss; - // proxy.Call("rx_hostname", {"none"}, -1, PUT, oss); + // caller.call("rx_hostname", {"none"}, -1, PUT, oss); // REQUIRE(oss.str() == "rx_hostname [none]\n"); // } // { // std::ostringstream oss; - // proxy.Call("rx_hostname", {}, -1, GET, oss); + // caller.call("rx_hostname", {}, -1, GET, oss); // REQUIRE(oss.str() == "rx_hostname none\n"); // // receiver should be disabled // REQUIRE(det.getUseReceiverFlag().tsquash( @@ -214,43 +215,42 @@ TEST_CASE("rx_hostname", "[.cmd][.rx]") { // } { std::ostringstream oss; - proxy.Call("rx_hostname", {}, 0, GET, oss); + caller.call("rx_hostname", {}, 0, GET, oss); REQUIRE(oss.str() == "rx_hostname " + prev_val[0] + "\n"); } } -TEST_CASE("rx_tcpport", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_tcpport", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxPort(); uint16_t port = 3500; - proxy.Call("rx_tcpport", {std::to_string(port)}, -1, PUT); + caller.call("rx_tcpport", {std::to_string(port)}, -1, PUT); for (int i = 0; i != det.size(); ++i) { std::ostringstream oss; - proxy.Call("rx_tcpport", {}, i, GET, oss); + caller.call("rx_tcpport", {}, i, GET, oss); REQUIRE(oss.str() == "rx_tcpport " + std::to_string(port + i) + '\n'); } port = 5754; - proxy.Call("rx_tcpport", {std::to_string(port)}, -1, PUT); + caller.call("rx_tcpport", {std::to_string(port)}, -1, PUT); for (int i = 0; i != det.size(); ++i) { std::ostringstream oss; - proxy.Call("rx_tcpport", {}, i, GET, oss); + caller.call("rx_tcpport", {}, i, GET, oss); REQUIRE(oss.str() == "rx_tcpport " + std::to_string(port + i) + '\n'); } - - test_valid_port("rx_tcpport", {}, -1, PUT); - test_valid_port("rx_tcpport", {}, 0, PUT); + test_valid_port_caller("rx_tcpport", {}, -1, PUT); + test_valid_port_caller("rx_tcpport", {}, 0, PUT); // should fail for the second module if (det.size() > 1) { - REQUIRE_THROWS(proxy.Call("rx_tcpport", {"65535"}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_tcpport", {"65535"}, -1, PUT)); auto rxHostname = det.getRxHostname().squash("none"); if (rxHostname != "none") { std::ostringstream oss; for (int i = 0; i != det.size(); ++i) { oss << rxHostname << ":" << 65536 + i << "+"; } - REQUIRE_THROWS(proxy.Call("rx_hostname", {oss.str()}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_hostname", {oss.str()}, -1, PUT)); } } @@ -259,23 +259,23 @@ TEST_CASE("rx_tcpport", "[.cmd][.rx]") { } } -TEST_CASE("rx_fifodepth", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_fifodepth", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxFifoDepth(); { std::ostringstream oss; - proxy.Call("rx_fifodepth", {"10"}, -1, PUT, oss); + caller.call("rx_fifodepth", {"10"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_fifodepth 10\n"); } { std::ostringstream oss; - proxy.Call("rx_fifodepth", {"100"}, -1, PUT, oss); + caller.call("rx_fifodepth", {"100"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_fifodepth 100\n"); } { std::ostringstream oss; - proxy.Call("rx_fifodepth", {}, -1, GET, oss); + caller.call("rx_fifodepth", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_fifodepth 100\n"); } for (int i = 0; i != det.size(); ++i) { @@ -283,23 +283,23 @@ TEST_CASE("rx_fifodepth", "[.cmd][.rx]") { } } -TEST_CASE("rx_silent", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_silent", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxSilentMode(); { std::ostringstream oss; - proxy.Call("rx_silent", {"1"}, -1, PUT, oss); + caller.call("rx_silent", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_silent 1\n"); } { std::ostringstream oss; - proxy.Call("rx_silent", {}, -1, GET, oss); + caller.call("rx_silent", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_silent 1\n"); } { std::ostringstream oss; - proxy.Call("rx_silent", {"0"}, -1, PUT, oss); + caller.call("rx_silent", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_silent 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -307,28 +307,28 @@ TEST_CASE("rx_silent", "[.cmd][.rx]") { } } -TEST_CASE("rx_discardpolicy", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_discardpolicy", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxFrameDiscardPolicy(); { std::ostringstream oss; - proxy.Call("rx_discardpolicy", {"discardempty"}, -1, PUT, oss); + caller.call("rx_discardpolicy", {"discardempty"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_discardpolicy discardempty\n"); } { std::ostringstream oss; - proxy.Call("rx_discardpolicy", {}, -1, GET, oss); + caller.call("rx_discardpolicy", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_discardpolicy discardempty\n"); } { std::ostringstream oss; - proxy.Call("rx_discardpolicy", {"discardpartial"}, -1, PUT, oss); + caller.call("rx_discardpolicy", {"discardpartial"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_discardpolicy discardpartial\n"); } { std::ostringstream oss; - proxy.Call("rx_discardpolicy", {"nodiscard"}, -1, PUT, oss); + caller.call("rx_discardpolicy", {"nodiscard"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_discardpolicy nodiscard\n"); } for (int i = 0; i != det.size(); ++i) { @@ -336,23 +336,23 @@ TEST_CASE("rx_discardpolicy", "[.cmd][.rx]") { } } -TEST_CASE("rx_padding", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_padding", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getPartialFramesPadding(); { std::ostringstream oss; - proxy.Call("rx_padding", {"0"}, -1, PUT, oss); + caller.call("rx_padding", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_padding 0\n"); } { std::ostringstream oss; - proxy.Call("rx_padding", {}, -1, GET, oss); + caller.call("rx_padding", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_padding 0\n"); } { std::ostringstream oss; - proxy.Call("rx_padding", {"1"}, -1, PUT, oss); + caller.call("rx_padding", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_padding 1\n"); } for (int i = 0; i != det.size(); ++i) { @@ -360,62 +360,62 @@ TEST_CASE("rx_padding", "[.cmd][.rx]") { } } -TEST_CASE("rx_udpsocksize", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_udpsocksize", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); int64_t prev_val = det.getRxUDPSocketBufferSize().tsquash( "Need same udp socket buffer size to test"); std::string s_new_val = std::to_string(prev_val); /*std::string s_new_val = std::to_string(prev_val - 1000); { Need permissions std::ostringstream oss; - proxy.Call("rx_udpsocksize", {s_new_val}, -1, PUT, oss); + caller.call("rx_udpsocksize", {s_new_val}, -1, PUT, oss); REQUIRE(oss.str() >= "rx_udpsocksize " + s_new_val + "\n"); }*/ { std::ostringstream oss; - proxy.Call("rx_udpsocksize", {}, -1, GET, oss); + caller.call("rx_udpsocksize", {}, -1, GET, oss); REQUIRE(oss.str() >= "rx_udpsocksize " + s_new_val + "\n"); } det.setRxUDPSocketBufferSize(prev_val); } -TEST_CASE("rx_realudpsocksize", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_realudpsocksize", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); uint64_t val = 0; { std::ostringstream oss; - proxy.Call("rx_udpsocksize", {}, -1, GET, oss); + caller.call("rx_udpsocksize", {}, -1, GET, oss); std::string s = (oss.str()).erase(0, strlen("rx_udpsocksize ")); val = std::stol(s); } { std::ostringstream oss; - proxy.Call("rx_realudpsocksize", {}, -1, GET, oss); + caller.call("rx_realudpsocksize", {}, -1, GET, oss); std::string s = (oss.str()).erase(0, strlen("rx_realudpsocksize ")); uint64_t rval = std::stol(s); REQUIRE(rval >= val * 2); } } -TEST_CASE("rx_lock", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_lock", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxLock(); { std::ostringstream oss; - proxy.Call("rx_lock", {"1"}, -1, PUT, oss); + caller.call("rx_lock", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_lock 1\n"); } { std::ostringstream oss; - proxy.Call("rx_lock", {}, -1, GET, oss); + caller.call("rx_lock", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_lock 1\n"); } { std::ostringstream oss; - proxy.Call("rx_lock", {"0"}, -1, PUT, oss); + caller.call("rx_lock", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_lock 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -423,40 +423,40 @@ TEST_CASE("rx_lock", "[.cmd][.rx]") { } } -TEST_CASE("rx_lastclient", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_lastclient", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("rx_lastclient", {}, -1, GET, oss)); + REQUIRE_NOTHROW(caller.call("rx_lastclient", {}, -1, GET, oss)); if (test::my_ip != "undefined") { REQUIRE(oss.str() == "rx_lastclient " + test::my_ip + "\n"); } } -TEST_CASE("rx_threads", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_threads", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("rx_threads", {}, -1, GET, oss)); + REQUIRE_NOTHROW(caller.call("rx_threads", {}, -1, GET, oss)); } -TEST_CASE("rx_arping", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_arping", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxArping(); { std::ostringstream oss; - proxy.Call("rx_arping", {"1"}, -1, PUT, oss); + caller.call("rx_arping", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_arping 1\n"); } { std::ostringstream oss; - proxy.Call("rx_arping", {}, -1, GET, oss); + caller.call("rx_arping", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_arping 1\n"); } { std::ostringstream oss; - proxy.Call("rx_arping", {"0"}, -1, PUT, oss); + caller.call("rx_arping", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_arping 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -464,13 +464,13 @@ TEST_CASE("rx_arping", "[.cmd][.rx]") { } } -TEST_CASE("rx_roi", "[.cmd]") { +TEST_CASE("Caller::rx_roi", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_THROWS(proxy.Call("rx_roi", {"5", "10"}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_roi", {"5", "10"}, -1, PUT)); } else { auto prev_val = det.getRxROI(); defs::xy detsize = det.getDetectorSize(); @@ -480,36 +480,36 @@ TEST_CASE("rx_roi", "[.cmd]") { det_type == defs::MYTHEN3) { { std::ostringstream oss; - proxy.Call("rx_roi", {"5", "10"}, -1, PUT, oss); + caller.call("rx_roi", {"5", "10"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_roi [5, 10]\n"); } { std::ostringstream oss; - proxy.Call("rx_roi", {"10", "15"}, -1, PUT, oss); + caller.call("rx_roi", {"10", "15"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_roi [10, 15]\n"); } - REQUIRE_THROWS(proxy.Call("rx_roi", {"-1", "-1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_roi", {"-1", "-1"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("rx_roi", {"10", "15", "25", "30"}, -1, PUT)); + caller.call("rx_roi", {"10", "15", "25", "30"}, -1, PUT)); } // 2d else { { std::ostringstream oss; - proxy.Call("rx_roi", {"10", "15", "1", "5"}, -1, PUT, oss); + caller.call("rx_roi", {"10", "15", "1", "5"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_roi [10, 15, 1, 5]\n"); } { std::ostringstream oss; - proxy.Call("rx_roi", {"10", "22", "18", "19"}, -1, PUT, oss); + caller.call("rx_roi", {"10", "22", "18", "19"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_roi [10, 22, 18, 19]\n"); } { std::ostringstream oss; - proxy.Call("rx_roi", - {"1", std::to_string(detsize.x - 5), "1", - std::to_string(detsize.y - 5)}, - -1, PUT, oss); + caller.call("rx_roi", + {"1", std::to_string(detsize.x - 5), "1", + std::to_string(detsize.y - 5)}, + -1, PUT, oss); REQUIRE(oss.str() == std::string("rx_roi [1, ") + std::to_string(detsize.x - 5) + std::string(", 1, ") + @@ -517,7 +517,7 @@ TEST_CASE("rx_roi", "[.cmd]") { std::string("]\n")); } REQUIRE_THROWS( - proxy.Call("rx_roi", {"-1", "-1", "-1", "-1"}, -1, PUT)); + caller.call("rx_roi", {"-1", "-1", "-1", "-1"}, -1, PUT)); } for (int i = 0; i != det.size(); ++i) { @@ -526,18 +526,18 @@ TEST_CASE("rx_roi", "[.cmd]") { } } -TEST_CASE("rx_clearroi", "[.cmd]") { +TEST_CASE("Caller::rx_clearroi", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_THROWS(proxy.Call("rx_clearroi", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_clearroi", {}, -1, PUT)); } else { auto prev_val = det.getRxROI(); { std::ostringstream oss; - proxy.Call("rx_clearroi", {}, -1, PUT, oss); + caller.call("rx_clearroi", {}, -1, PUT, oss); REQUIRE(oss.str() == "rx_clearroi successful\n"); } for (int i = 0; i != det.size(); ++i) { @@ -548,18 +548,18 @@ TEST_CASE("rx_clearroi", "[.cmd]") { /* File */ -TEST_CASE("fformat", "[.cmd]") { +TEST_CASE("Caller::fformat", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getFileFormat(); { std::ostringstream oss; - proxy.Call("fformat", {"binary"}, -1, PUT, oss); + caller.call("fformat", {"binary"}, -1, PUT, oss); REQUIRE(oss.str() == "fformat binary\n"); } { std::ostringstream oss; - proxy.Call("fformat", {}, -1, GET, oss); + caller.call("fformat", {}, -1, GET, oss); REQUIRE(oss.str() == "fformat binary\n"); } for (int i = 0; i != det.size(); ++i) { @@ -567,18 +567,18 @@ TEST_CASE("fformat", "[.cmd]") { } } -TEST_CASE("fpath", "[.cmd]") { +TEST_CASE("Caller::fpath", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getFilePath(); { std::ostringstream oss; - proxy.Call("fpath", {"/tmp"}, -1, PUT, oss); + caller.call("fpath", {"/tmp"}, -1, PUT, oss); REQUIRE(oss.str() == "fpath /tmp\n"); } { std::ostringstream oss; - proxy.Call("fpath", {}, -1, GET, oss); + caller.call("fpath", {}, -1, GET, oss); REQUIRE(oss.str() == "fpath /tmp\n"); } for (int i = 0; i != det.size(); ++i) { @@ -586,50 +586,50 @@ TEST_CASE("fpath", "[.cmd]") { } } -TEST_CASE("fname", "[.cmd]") { +TEST_CASE("Caller::fname", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getFileNamePrefix(); { std::ostringstream oss; - proxy.Call("fname", {"somename"}, -1, PUT, oss); + caller.call("fname", {"somename"}, -1, PUT, oss); REQUIRE(oss.str() == "fname somename\n"); } { std::ostringstream oss; - proxy.Call("fname", {}, -1, GET, oss); + caller.call("fname", {}, -1, GET, oss); REQUIRE(oss.str() == "fname somename\n"); } { std::ostringstream oss; - proxy.Call("fname", {"run"}, -1, PUT, oss); + caller.call("fname", {"run"}, -1, PUT, oss); REQUIRE(oss.str() == "fname run\n"); } - REQUIRE_THROWS(proxy.Call("fname", {"fdf/dfd"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("fname", {"fdf dfd"}, -1, PUT)); + REQUIRE_THROWS(caller.call("fname", {"fdf/dfd"}, -1, PUT)); + REQUIRE_THROWS(caller.call("fname", {"fdf dfd"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setFileNamePrefix(prev_val[i], {i}); } } -TEST_CASE("findex", "[.cmd]") { +TEST_CASE("Caller::findex", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getAcquisitionIndex(); { std::ostringstream oss; - proxy.Call("findex", {"57"}, -1, PUT, oss); + caller.call("findex", {"57"}, -1, PUT, oss); REQUIRE(oss.str() == "findex 57\n"); } { std::ostringstream oss; - proxy.Call("findex", {}, -1, GET, oss); + caller.call("findex", {}, -1, GET, oss); REQUIRE(oss.str() == "findex 57\n"); } { std::ostringstream oss; - proxy.Call("findex", {"0"}, -1, PUT, oss); + caller.call("findex", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "findex 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -637,23 +637,23 @@ TEST_CASE("findex", "[.cmd]") { } } -TEST_CASE("fwrite", "[.cmd]") { +TEST_CASE("Caller::fwrite", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getFileWrite(); { std::ostringstream oss; - proxy.Call("fwrite", {"1"}, -1, PUT, oss); + caller.call("fwrite", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "fwrite 1\n"); } { std::ostringstream oss; - proxy.Call("fwrite", {}, -1, GET, oss); + caller.call("fwrite", {}, -1, GET, oss); REQUIRE(oss.str() == "fwrite 1\n"); } { std::ostringstream oss; - proxy.Call("fwrite", {"0"}, -1, PUT, oss); + caller.call("fwrite", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "fwrite 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -661,45 +661,45 @@ TEST_CASE("fwrite", "[.cmd]") { } } -TEST_CASE("fmaster", "[.cmd]") { +TEST_CASE("Caller::fmaster", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getMasterFileWrite(); { std::ostringstream oss; - proxy.Call("fmaster", {"0"}, -1, PUT, oss); + caller.call("fmaster", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "fmaster 0\n"); } { std::ostringstream oss; - proxy.Call("fmaster", {}, -1, GET, oss); + caller.call("fmaster", {}, -1, GET, oss); REQUIRE(oss.str() == "fmaster 0\n"); } { std::ostringstream oss; - proxy.Call("fmaster", {"1"}, -1, PUT, oss); + caller.call("fmaster", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "fmaster 1\n"); } det.setMasterFileWrite(prev_val); } -TEST_CASE("foverwrite", "[.cmd]") { +TEST_CASE("Caller::foverwrite", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getFileOverWrite(); { std::ostringstream oss; - proxy.Call("foverwrite", {"1"}, -1, PUT, oss); + caller.call("foverwrite", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "foverwrite 1\n"); } { std::ostringstream oss; - proxy.Call("foverwrite", {}, -1, GET, oss); + caller.call("foverwrite", {}, -1, GET, oss); REQUIRE(oss.str() == "foverwrite 1\n"); } { std::ostringstream oss; - proxy.Call("foverwrite", {"0"}, -1, PUT, oss); + caller.call("foverwrite", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "foverwrite 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -707,28 +707,28 @@ TEST_CASE("foverwrite", "[.cmd]") { } } -TEST_CASE("rx_framesperfile", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_framesperfile", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getFramesPerFile(); { std::ostringstream oss; - proxy.Call("rx_framesperfile", {"50"}, -1, PUT, oss); + caller.call("rx_framesperfile", {"50"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_framesperfile 50\n"); } { std::ostringstream oss; - proxy.Call("rx_framesperfile", {}, -1, GET, oss); + caller.call("rx_framesperfile", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_framesperfile 50\n"); } { std::ostringstream oss; - proxy.Call("rx_framesperfile", {"10000"}, -1, PUT, oss); + caller.call("rx_framesperfile", {"10000"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_framesperfile 10000\n"); } { std::ostringstream oss; - proxy.Call("rx_framesperfile", {"0"}, -1, PUT, oss); + caller.call("rx_framesperfile", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_framesperfile 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -738,24 +738,24 @@ TEST_CASE("rx_framesperfile", "[.cmd][.rx]") { /* ZMQ Streaming Parameters (Receiver<->Client) */ -TEST_CASE("rx_zmqstream", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_zmqstream", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxZmqDataStream(); { std::ostringstream oss; - proxy.Call("rx_zmqstream", {"1"}, -1, PUT, oss); + caller.call("rx_zmqstream", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_zmqstream 1\n"); REQUIRE(det.getRxZmqDataStream().squash() == true); } { std::ostringstream oss; - proxy.Call("rx_zmqstream", {}, -1, GET, oss); + caller.call("rx_zmqstream", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_zmqstream 1\n"); } { std::ostringstream oss; - proxy.Call("rx_zmqstream", {"0"}, -1, PUT, oss); + caller.call("rx_zmqstream", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_zmqstream 0\n"); REQUIRE(det.getRxZmqDataStream().squash() == false); } @@ -764,23 +764,23 @@ TEST_CASE("rx_zmqstream", "[.cmd][.rx]") { } } -TEST_CASE("rx_zmqfreq", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_zmqfreq", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxZmqFrequency(); { std::ostringstream oss; - proxy.Call("rx_zmqfreq", {"1"}, -1, PUT, oss); + caller.call("rx_zmqfreq", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_zmqfreq 1\n"); } { std::ostringstream oss; - proxy.Call("rx_zmqfreq", {}, -1, GET, oss); + caller.call("rx_zmqfreq", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_zmqfreq 1\n"); } { std::ostringstream oss; - proxy.Call("rx_zmqfreq", {"0"}, -1, PUT, oss); + caller.call("rx_zmqfreq", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_zmqfreq 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -788,23 +788,23 @@ TEST_CASE("rx_zmqfreq", "[.cmd][.rx]") { } } -TEST_CASE("rx_zmqstartfnum", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_zmqstartfnum", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxZmqStartingFrame(); { std::ostringstream oss; - proxy.Call("rx_zmqstartfnum", {"5"}, -1, PUT, oss); + caller.call("rx_zmqstartfnum", {"5"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_zmqstartfnum 5\n"); } { std::ostringstream oss; - proxy.Call("rx_zmqstartfnum", {}, -1, GET, oss); + caller.call("rx_zmqstartfnum", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_zmqstartfnum 5\n"); } { std::ostringstream oss; - proxy.Call("rx_zmqstartfnum", {"0"}, -1, PUT, oss); + caller.call("rx_zmqstartfnum", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_zmqstartfnum 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -812,9 +812,9 @@ TEST_CASE("rx_zmqstartfnum", "[.cmd][.rx]") { } } -TEST_CASE("rx_zmqport", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_zmqport", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val_zmqport = det.getRxZmqPort(); auto prev_val_numinterfaces = det.getNumberofUDPInterfaces().tsquash( "inconsistent number of udp interfaces to test"); @@ -824,33 +824,32 @@ TEST_CASE("rx_zmqport", "[.cmd][.rx]") { if (det_type == defs::EIGER) { socketsperdetector *= 2; } else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { - proxy.Call("numinterfaces", {"2"}, -1, PUT); + caller.call("numinterfaces", {"2"}, -1, PUT); socketsperdetector *= 2; } uint16_t port = 3500; - proxy.Call("rx_zmqport", {std::to_string(port)}, -1, PUT); + caller.call("rx_zmqport", {std::to_string(port)}, -1, PUT); for (int i = 0; i != det.size(); ++i) { std::ostringstream oss; - proxy.Call("rx_zmqport", {}, i, GET, oss); + caller.call("rx_zmqport", {}, i, GET, oss); REQUIRE(oss.str() == "rx_zmqport " + std::to_string(port + i * socketsperdetector) + '\n'); } port = 30001; - proxy.Call("rx_zmqport", {std::to_string(port)}, -1, PUT); + caller.call("rx_zmqport", {std::to_string(port)}, -1, PUT); for (int i = 0; i != det.size(); ++i) { std::ostringstream oss; - proxy.Call("rx_zmqport", {}, i, GET, oss); + caller.call("rx_zmqport", {}, i, GET, oss); REQUIRE(oss.str() == "rx_zmqport " + std::to_string(port + i * socketsperdetector) + '\n'); } - - test_valid_port("rx_zmqport", {}, -1, PUT); - test_valid_port("rx_zmqport", {}, 0, PUT); + test_valid_port_caller("rx_zmqport", {}, -1, PUT); + test_valid_port_caller("rx_zmqport", {}, 0, PUT); // should fail for the second module if (det.size() > 1) { - REQUIRE_THROWS(proxy.Call("rx_zmqport", {"65535"}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_zmqport", {"65535"}, -1, PUT)); } for (int i = 0; i != det.size(); ++i) { @@ -861,19 +860,19 @@ TEST_CASE("rx_zmqport", "[.cmd][.rx]") { } } -TEST_CASE("rx_zmqip", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_zmqip", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxZmqIP(); { std::ostringstream oss; - proxy.Call("rx_zmqip", {"127.0.0.1"}, 0, PUT, oss); + caller.call("rx_zmqip", {"127.0.0.1"}, 0, PUT, oss); REQUIRE(oss.str() == "rx_zmqip 127.0.0.1\n"); std::cout << "ZMQIP: " << det.getRxZmqIP() << '\n'; } { std::ostringstream oss; - proxy.Call("rx_zmqip", {}, 0, GET, oss); + caller.call("rx_zmqip", {}, 0, GET, oss); REQUIRE(oss.str() == "rx_zmqip 127.0.0.1\n"); } for (int i = 0; i != det.size(); ++i) { @@ -881,29 +880,29 @@ TEST_CASE("rx_zmqip", "[.cmd][.rx]") { } } -TEST_CASE("rx_zmqhwm", "[.cmd]") { +TEST_CASE("Caller::rx_zmqhwm", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRxZmqHwm().tsquash("Inconsistent values for rx_zmqhwm to test"); { std::ostringstream oss; - proxy.Call("rx_zmqhwm", {"50"}, -1, PUT, oss); + caller.call("rx_zmqhwm", {"50"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_zmqhwm 50\n"); } { std::ostringstream oss; - proxy.Call("rx_zmqhwm", {}, -1, GET, oss); + caller.call("rx_zmqhwm", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_zmqhwm 50\n"); } { std::ostringstream oss; - proxy.Call("rx_zmqhwm", {"0"}, -1, PUT, oss); + caller.call("rx_zmqhwm", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_zmqhwm 0\n"); } { std::ostringstream oss; - proxy.Call("rx_zmqhwm", {"-1"}, -1, PUT, oss); + caller.call("rx_zmqhwm", {"-1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_zmqhwm -1\n"); } det.setRxZmqHwm(prev_val); @@ -911,88 +910,88 @@ TEST_CASE("rx_zmqhwm", "[.cmd]") { /* CTB Specific */ -TEST_CASE("rx_dbitlist", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_dbitlist", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getRxDbitList(); { std::ostringstream oss; - proxy.Call("rx_dbitlist", - {"0", "4", "5", "8", "9", "10", "52", "63"}, -1, PUT, - oss); + caller.call("rx_dbitlist", + {"0", "4", "5", "8", "9", "10", "52", "63"}, -1, PUT, + oss); REQUIRE(oss.str() == "rx_dbitlist [0, 4, 5, 8, 9, 10, 52, 63]\n"); } { std::ostringstream oss; - proxy.Call("rx_dbitlist", {}, -1, GET, oss); + caller.call("rx_dbitlist", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_dbitlist [0, 4, 5, 8, 9, 10, 52, 63]\n"); } - REQUIRE_THROWS(proxy.Call("rx_dbitlist", {"67"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("rx_dbitlist", {"-1"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("rx_dbitlist", {"all"}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_dbitlist", {"67"}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_dbitlist", {"-1"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("rx_dbitlist", {"all"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setRxDbitList(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("rx_dbitlist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("rx_dbitlist", {}, -1, GET)); } } -TEST_CASE("rx_dbitoffset", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_dbitoffset", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getRxDbitOffset(); { std::ostringstream oss; - proxy.Call("rx_dbitoffset", {"1"}, -1, PUT, oss); + caller.call("rx_dbitoffset", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_dbitoffset 1\n"); } { std::ostringstream oss; - proxy.Call("rx_dbitoffset", {"0"}, -1, PUT, oss); + caller.call("rx_dbitoffset", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_dbitoffset 0\n"); } { std::ostringstream oss; - proxy.Call("rx_dbitoffset", {"15"}, -1, PUT, oss); + caller.call("rx_dbitoffset", {"15"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_dbitoffset 15\n"); } { std::ostringstream oss; - proxy.Call("rx_dbitoffset", {}, -1, GET, oss); + caller.call("rx_dbitoffset", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_dbitoffset 15\n"); } for (int i = 0; i != det.size(); ++i) { det.setRxDbitOffset(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("rx_dbitoffset", {}, -1, GET)); + REQUIRE_THROWS(caller.call("rx_dbitoffset", {}, -1, GET)); } } -TEST_CASE("rx_jsonaddheader", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_jsonaddheader", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getAdditionalJsonHeader(); { std::ostringstream oss; - proxy.Call("rx_jsonaddheader", {"key1", "value1", "key2", "value2"}, -1, - PUT, oss); + caller.call("rx_jsonaddheader", {"key1", "value1", "key2", "value2"}, + -1, PUT, oss); REQUIRE(oss.str() == "rx_jsonaddheader {key1: value1, key2: value2}\n"); } { std::ostringstream oss; - proxy.Call("rx_jsonaddheader", {}, -1, GET, oss); + caller.call("rx_jsonaddheader", {}, -1, GET, oss); REQUIRE(oss.str() == "rx_jsonaddheader {key1: value1, key2: value2}\n"); } { std::ostringstream oss; - proxy.Call("rx_jsonaddheader", {}, -1, PUT, oss); + caller.call("rx_jsonaddheader", {}, -1, PUT, oss); REQUIRE(oss.str() == "rx_jsonaddheader {}\n"); } for (int i = 0; i != det.size(); ++i) { @@ -1000,31 +999,31 @@ TEST_CASE("rx_jsonaddheader", "[.cmd][.rx]") { } } -TEST_CASE("rx_jsonpara", "[.cmd][.rx]") { +TEST_CASE("Caller::rx_jsonpara", "[.cmdcall][.rx]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getAdditionalJsonHeader(); { std::ostringstream oss; - proxy.Call("rx_jsonpara", {"key1", "value1"}, -1, PUT, oss); + caller.call("rx_jsonpara", {"key1", "value1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_jsonpara {key1: value1}\n"); } { std::ostringstream oss; - proxy.Call("rx_jsonpara", {"key1", "value2"}, -1, PUT, oss); + caller.call("rx_jsonpara", {"key1", "value2"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_jsonpara {key1: value2}\n"); } { std::ostringstream oss; - proxy.Call("rx_jsonpara", {"key1"}, -1, GET, oss); + caller.call("rx_jsonpara", {"key1"}, -1, GET, oss); REQUIRE(oss.str() == "rx_jsonpara value2\n"); } { std::ostringstream oss; - proxy.Call("rx_jsonpara", {"key1"}, -1, PUT, oss); + caller.call("rx_jsonpara", {"key1"}, -1, PUT, oss); REQUIRE(oss.str() == "rx_jsonpara key1 deleted\n"); } - REQUIRE_THROWS(proxy.Call("rx_jsonpara", {"key1"}, -1, GET)); + REQUIRE_THROWS(caller.call("rx_jsonpara", {"key1"}, -1, GET)); for (int i = 0; i != det.size(); ++i) { det.setAdditionalJsonHeader(prev_val[i], {i}); } diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/Caller/test-Caller.cpp similarity index 63% rename from slsDetectorSoftware/tests/test-CmdProxy.cpp rename to slsDetectorSoftware/tests/Caller/test-Caller.cpp index 5044e50e6..b764e7adb 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller.cpp @@ -1,11 +1,11 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" +#include "Caller.h" #include "catch.hpp" #include "sls/Detector.h" #include "sls/file_utils.h" #include "sls/sls_detector_defs.h" -#include "test-CmdProxy-global.h" +#include "test-Caller-global.h" #include #include @@ -18,52 +18,75 @@ namespace sls { using test::GET; using test::PUT; -TEST_CASE("Calling help doesn't throw or cause segfault") { - // Dont add [.cmd] tag this should run with normal tests - CmdProxy proxy(nullptr); - auto commands = proxy.GetProxyCommands(); +TEST_CASE("CALLER::Caller::Calling help doesn't throw or cause segfault") { + // Dont add [.cmdcall] tag this should run with normal tests + Caller caller(nullptr); std::ostringstream os; - for (const auto &cmd : commands) + for (std::string cmd : caller.getAllCommands()) REQUIRE_NOTHROW( - proxy.Call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os)); + caller.call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os)); } -TEST_CASE("Unknown command", "[.cmd]") { +TEST_CASE("CALLER::Caller::period", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("vsaevrreavv", {}, -1, PUT)); + Caller caller(&det); + auto prev_val = det.getPeriod(); + { + std::ostringstream oss; + caller.call("period", {"1.25s"}, -1, PUT, oss); + REQUIRE(oss.str() == "period 1.25s\n"); + } + { + std::ostringstream oss; + caller.call("period", {}, -1, GET, oss); + REQUIRE(oss.str() == "period 1.25s\n"); + } + { + std::ostringstream oss; + caller.call("period", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "period 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setPeriod(prev_val[i], {i}); + } +} + +TEST_CASE("CALLER::Unknown command", "[.cmdcall]") { + Detector det; + Caller caller(&det); + REQUIRE_THROWS(caller.call("vsaevrreavv", {}, -1, PUT)); } /* configuration */ -TEST_CASE("config", "[.cmd]") { +TEST_CASE("CALLER::config", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); // put only - REQUIRE_THROWS(proxy.Call("config", {}, -1, GET)); + REQUIRE_THROWS(caller.call("config", {}, -1, GET)); } // free: not testing -TEST_CASE("parameters", "[.cmd]") { +TEST_CASE("CALLER::parameters", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); // put only - REQUIRE_THROWS(proxy.Call("parameters", {}, -1, GET)); + REQUIRE_THROWS(caller.call("parameters", {}, -1, GET)); /* auto prev_val = det.getNumberOfFrames().tsquash("Number of frames has to be same to test"); { system("echo 'frames 2' > /tmp/tempsetup.det "); std::ostringstream oss; - proxy.Call("parameters", {"/tmp/tempsetup.det"}, -1, PUT, oss); + caller.call("parameters", {"/tmp/tempsetup.det"}, -1, PUT, oss); REQUIRE(oss.str() == "parameters /tmp/tempsetup.det\n"); REQUIRE(det.getNumberOfFrames().tsquash("failed") == 2); } { system("echo '0:frames 1' > /tmp/tempsetup.det "); std::ostringstream oss; - proxy.Call("parameters", {"/tmp/tempsetup.det"}, -1, PUT, oss); + caller.call("parameters", {"/tmp/tempsetup.det"}, -1, PUT, oss); REQUIRE(oss.str() == "parameters /tmp/tempsetup.det\n"); REQUIRE(det.getNumberOfFrames({0}).tsquash("failed") == 1); } @@ -71,126 +94,126 @@ TEST_CASE("parameters", "[.cmd]") { */ } -TEST_CASE("hostname", "[.cmd]") { +TEST_CASE("CALLER::hostname", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("hostname", {}, -1, GET)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("hostname", {}, -1, GET)); } -TEST_CASE("virtual", "[.cmd]") { +TEST_CASE("CALLER::virtual", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("virtual", {}, -1, GET)); - test_valid_port("virtual", {"1"}, -1, PUT); - REQUIRE_THROWS(proxy.Call("virtual", {"3", "65534"}, -1, PUT)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("virtual", {}, -1, GET)); + test_valid_port_caller("virtual", {"1"}, -1, PUT); + REQUIRE_THROWS(caller.call("virtual", {"3", "65534"}, -1, PUT)); } -TEST_CASE("versions", "[.cmd]") { +TEST_CASE("CALLER::versions", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("versions", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("versions", {"0"}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("versions", {}, -1, GET)); + REQUIRE_THROWS(caller.call("versions", {"0"}, -1, PUT)); } -TEST_CASE("packageversion", "[.cmd]") { +TEST_CASE("CALLER::packageversion", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("packageversion", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("packageversion", {"0"}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("packageversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("packageversion", {"0"}, -1, PUT)); } -TEST_CASE("clientversion", "[.cmd]") { +TEST_CASE("CALLER::clientversion", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("clientversion", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("clientversion", {"0"}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("clientversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("clientversion", {"0"}, -1, PUT)); } -TEST_CASE("firmwareversion", "[.cmd]") { +TEST_CASE("CALLER::firmwareversion", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("firmwareversion", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("firmwareversion", {"0"}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("firmwareversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("firmwareversion", {"0"}, -1, PUT)); } -TEST_CASE("detectorserverversion", "[.cmd]") { +TEST_CASE("CALLER::detectorserverversion", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("detectorserverversion", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("detectorserverversion", {"0"}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("detectorserverversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("detectorserverversion", {"0"}, -1, PUT)); } -TEST_CASE("hardwareversion", "[.cmd]") { +TEST_CASE("CALLER::hardwareversion", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("hardwareversion", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("hardwareversion", {"0"}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("hardwareversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("hardwareversion", {"0"}, -1, PUT)); } -TEST_CASE("kernelversion", "[.cmd]") { +TEST_CASE("CALLER::kernelversion", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("kernelversion", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("kernelversion", {"0"}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("kernelversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("kernelversion", {"0"}, -1, PUT)); } -TEST_CASE("serialnumber", "[.cmd]") { +TEST_CASE("CALLER::serialnumber", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_THROWS(proxy.Call("serialnumber", {}, -1, GET)); + REQUIRE_THROWS(caller.call("serialnumber", {}, -1, GET)); } else { - REQUIRE_NOTHROW(proxy.Call("serialnumber", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("serialnumber", {}, -1, GET)); } } -TEST_CASE("moduleid", "[.cmd]") { +TEST_CASE("CALLER::moduleid", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2 || det_type == defs::MYTHEN3 || det_type == defs::EIGER || det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { - REQUIRE_NOTHROW(proxy.Call("moduleid", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("moduleid", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("moduleid", {}, -1, GET)); + REQUIRE_THROWS(caller.call("moduleid", {}, -1, GET)); } } -TEST_CASE("type", "[.cmd]") { +TEST_CASE("CALLER::type", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto dt = det.getDetectorType().squash(); std::ostringstream oss; - proxy.Call("type", {}, -1, GET, oss); + caller.call("type", {}, -1, GET, oss); auto ans = oss.str().erase(0, strlen("type ")); REQUIRE(ans == ToString(dt) + '\n'); // REQUIRE(dt == test::type); } -TEST_CASE("detsize", "[.cmd]") { +TEST_CASE("CALLER::detsize", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("detsize", {}, -1, GET)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("detsize", {}, -1, GET)); } -TEST_CASE("settingslist", "[.cmd]") { +TEST_CASE("CALLER::settingslist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_THROWS(proxy.Call("settingslist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("settingslist", {}, -1, GET)); } else { - REQUIRE_NOTHROW(proxy.Call("settingslist", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("settingslist", {}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("settingslist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("settingslist", {}, -1, PUT)); } } -TEST_CASE("settings", "[.cmd]") { +TEST_CASE("CALLER::settings", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); std::vector allSett; allSett.push_back("standard"); @@ -252,10 +275,10 @@ TEST_CASE("settings", "[.cmd]") { default: if (det_type == defs::EIGER) { // FIXME: need to remove when settings removed - REQUIRE_NOTHROW(proxy.Call("settings", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("settings", {"standard"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("settings", {}, -1, GET)); + REQUIRE_THROWS(caller.call("settings", {"standard"}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("settings", {}, -1, GET)); + REQUIRE_THROWS(caller.call("settings", {}, -1, GET)); } return; } @@ -264,18 +287,18 @@ TEST_CASE("settings", "[.cmd]") { for (auto &it : sett) { { std::ostringstream oss; - proxy.Call("settings", {it}, -1, PUT, oss); + caller.call("settings", {it}, -1, PUT, oss); REQUIRE(oss.str() == "settings " + it + "\n"); } { std::ostringstream oss; - proxy.Call("settings", {}, -1, GET, oss); + caller.call("settings", {}, -1, GET, oss); REQUIRE(oss.str() == "settings " + it + "\n"); } } for (auto &it : allSett) { if (std::find(sett.begin(), sett.end(), it) == sett.end()) { - REQUIRE_THROWS(proxy.Call("settings", {it}, -1, PUT)); + REQUIRE_THROWS(caller.call("settings", {it}, -1, PUT)); } } for (int i = 0; i != det.size(); ++i) { @@ -286,9 +309,9 @@ TEST_CASE("settings", "[.cmd]") { } } -TEST_CASE("threshold", "[.cmd]") { +TEST_CASE("CALLER::threshold", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { @@ -298,15 +321,15 @@ TEST_CASE("threshold", "[.cmd]") { if (!prev_energies.empty()) { std::string senergy = std::to_string(prev_energies[0]); std::ostringstream oss1, oss2; - proxy.Call("threshold", {senergy, "standard"}, -1, PUT, oss1); + caller.call("threshold", {senergy, "standard"}, -1, PUT, oss1); REQUIRE(oss1.str() == "threshold [" + senergy + ", standard]\n"); - proxy.Call("threshold", {}, -1, GET, oss2); + caller.call("threshold", {}, -1, GET, oss2); REQUIRE(oss2.str() == "threshold " + senergy + "\n"); - REQUIRE_THROWS(proxy.Call( + REQUIRE_THROWS(caller.call( "threshold", {senergy, senergy, senergy, "standard"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("threshold", {senergy, "undefined"}, -1, PUT)); + caller.call("threshold", {senergy, "undefined"}, -1, PUT)); det.setTrimEnergies(prev_energies); for (int i = 0; i != det.size(); ++i) { @@ -316,7 +339,7 @@ TEST_CASE("threshold", "[.cmd]") { } } } - REQUIRE_NOTHROW(proxy.Call("threshold", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("threshold", {}, -1, GET)); } else if (det_type == defs::MYTHEN3) { auto prev_threshold = det.getAllThresholdEnergy(); auto prev_settings = @@ -326,29 +349,29 @@ TEST_CASE("threshold", "[.cmd]") { if (!prev_energies.empty()) { std::string senergy = std::to_string(prev_energies[0]); std::ostringstream oss1, oss2; - proxy.Call("threshold", {senergy, "standard"}, -1, PUT, oss1); + caller.call("threshold", {senergy, "standard"}, -1, PUT, oss1); REQUIRE(oss1.str() == "threshold [" + senergy + ", standard]\n"); - proxy.Call("threshold", {}, -1, GET, oss2); + caller.call("threshold", {}, -1, GET, oss2); REQUIRE(oss2.str() == "threshold [" + senergy + ", " + senergy + ", " + senergy + "]\n"); std::string senergy2 = std::to_string(prev_energies[1]); std::string senergy3 = std::to_string(prev_energies[2]); std::ostringstream oss3, oss4; - proxy.Call("threshold", {senergy, senergy2, senergy3, "standard"}, - -1, PUT, oss3); + caller.call("threshold", {senergy, senergy2, senergy3, "standard"}, + -1, PUT, oss3); REQUIRE(oss3.str() == "threshold [" + senergy + ", " + senergy2 + ", " + senergy3 + ", standard]\n"); - proxy.Call("threshold", {}, -1, GET, oss4); + caller.call("threshold", {}, -1, GET, oss4); REQUIRE(oss4.str() == "threshold [" + senergy + ", " + senergy2 + ", " + senergy3 + "]\n"); - REQUIRE_THROWS(proxy.Call("threshold", - {senergy, senergy, "standard"}, -1, PUT)); + REQUIRE_THROWS(caller.call( + "threshold", {senergy, senergy, "standard"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("threshold", {senergy, "undefined"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("threshold", {senergy}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("threshold", - {senergy, senergy2, senergy3}, -1, PUT)); + caller.call("threshold", {senergy, "undefined"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("threshold", {senergy}, -1, PUT)); + REQUIRE_NOTHROW(caller.call( + "threshold", {senergy, senergy2, senergy3}, -1, PUT)); det.setTrimEnergies(prev_energies); for (int i = 0; i != det.size(); ++i) { if (prev_threshold[i][0] >= 0) { @@ -359,15 +382,15 @@ TEST_CASE("threshold", "[.cmd]") { } } } - REQUIRE_NOTHROW(proxy.Call("threshold", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("threshold", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("threshold", {}, -1, GET)); + REQUIRE_THROWS(caller.call("threshold", {}, -1, GET)); } } -TEST_CASE("thresholdnotb", "[.cmd]") { +TEST_CASE("CALLER::thresholdnotb", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { @@ -377,16 +400,16 @@ TEST_CASE("thresholdnotb", "[.cmd]") { if (!prev_energies.empty()) { std::string senergy = std::to_string(prev_energies[0]); std::ostringstream oss1, oss2; - proxy.Call("thresholdnotb", {senergy, "standard"}, -1, PUT, oss1); + caller.call("thresholdnotb", {senergy, "standard"}, -1, PUT, oss1); REQUIRE(oss1.str() == "thresholdnotb [" + senergy + ", standard]\n"); - proxy.Call("threshold", {}, -1, GET, oss2); + caller.call("threshold", {}, -1, GET, oss2); REQUIRE(oss2.str() == "threshold " + senergy + "\n"); - REQUIRE_THROWS(proxy.Call("thresholdnotb", - {senergy, senergy, senergy, "standard"}, - -1, PUT)); + REQUIRE_THROWS(caller.call("thresholdnotb", + {senergy, senergy, senergy, "standard"}, + -1, PUT)); REQUIRE_THROWS( - proxy.Call("thresholdnotb", {senergy, "undefined"}, -1, PUT)); + caller.call("thresholdnotb", {senergy, "undefined"}, -1, PUT)); det.setTrimEnergies(prev_energies); for (int i = 0; i != det.size(); ++i) { if (prev_threshold[i] >= 0) { @@ -395,7 +418,7 @@ TEST_CASE("thresholdnotb", "[.cmd]") { } } } - REQUIRE_NOTHROW(proxy.Call("threshold", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("threshold", {}, -1, GET)); } else if (det_type == defs::MYTHEN3) { auto prev_threshold = det.getAllThresholdEnergy(); auto prev_settings = @@ -405,32 +428,32 @@ TEST_CASE("thresholdnotb", "[.cmd]") { if (!prev_energies.empty()) { std::string senergy = std::to_string(prev_energies[0]); std::ostringstream oss1, oss2; - proxy.Call("thresholdnotb", {senergy, "standard"}, -1, PUT, oss1); + caller.call("thresholdnotb", {senergy, "standard"}, -1, PUT, oss1); REQUIRE(oss1.str() == "thresholdnotb [" + senergy + ", standard]\n"); - proxy.Call("threshold", {}, -1, GET, oss2); + caller.call("threshold", {}, -1, GET, oss2); REQUIRE(oss2.str() == "threshold [" + senergy + ", " + senergy + ", " + senergy + "]\n"); std::string senergy2 = std::to_string(prev_energies[1]); std::string senergy3 = std::to_string(prev_energies[2]); std::ostringstream oss3, oss4; - proxy.Call("thresholdnotb", - {senergy, senergy2, senergy3, "standard"}, -1, PUT, - oss3); + caller.call("thresholdnotb", + {senergy, senergy2, senergy3, "standard"}, -1, PUT, + oss3); REQUIRE(oss3.str() == "thresholdnotb [" + senergy + ", " + senergy2 + ", " + senergy3 + ", standard]\n"); - proxy.Call("threshold", {}, -1, GET, oss4); + caller.call("threshold", {}, -1, GET, oss4); REQUIRE(oss4.str() == "threshold [" + senergy + ", " + senergy2 + ", " + senergy3 + "]\n"); - REQUIRE_THROWS(proxy.Call("thresholdnotb", - {senergy, senergy, "standard"}, -1, PUT)); + REQUIRE_THROWS(caller.call( + "thresholdnotb", {senergy, senergy, "standard"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("thresholdnotb", {senergy, "undefined"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("thresholdnotb", {senergy}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("thresholdnotb", - {senergy, senergy2, senergy3}, -1, PUT)); + caller.call("thresholdnotb", {senergy, "undefined"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("thresholdnotb", {senergy}, -1, PUT)); + REQUIRE_NOTHROW(caller.call( + "thresholdnotb", {senergy, senergy2, senergy3}, -1, PUT)); det.setTrimEnergies(prev_energies); for (int i = 0; i != det.size(); ++i) { if (prev_threshold[i][0] >= 0) { @@ -439,21 +462,21 @@ TEST_CASE("thresholdnotb", "[.cmd]") { } } } - REQUIRE_NOTHROW(proxy.Call("threshold", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("threshold", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("thresholdnotb", {}, -1, GET)); + REQUIRE_THROWS(caller.call("thresholdnotb", {}, -1, GET)); } } -TEST_CASE("settingspath", "[.cmd]") { +TEST_CASE("CALLER::settingspath", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getSettingsPath(); { std::ostringstream oss1, oss2; - proxy.Call("settingspath", {"/tmp"}, -1, PUT, oss1); + caller.call("settingspath", {"/tmp"}, -1, PUT, oss1); REQUIRE(oss1.str() == "settingspath /tmp\n"); - proxy.Call("settingspath", {}, -1, GET, oss2); + caller.call("settingspath", {}, -1, GET, oss2); REQUIRE(oss2.str() == "settingspath /tmp\n"); } for (int i = 0; i != det.size(); ++i) { @@ -461,70 +484,71 @@ TEST_CASE("settingspath", "[.cmd]") { } } -TEST_CASE("trimbits", "[.cmd]") { +TEST_CASE("CALLER::trimbits", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("trimbits", {}, -1, GET)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("trimbits", {}, -1, GET)); } -TEST_CASE("trimval", "[.cmd]") { +TEST_CASE("CALLER::trimval", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3 || det_type == defs::EIGER) { auto prev_val = det.getAllTrimbits(); { std::ostringstream oss; - proxy.Call("trimval", {"63"}, -1, PUT, oss); + caller.call("trimval", {"63"}, -1, PUT, oss); REQUIRE(oss.str() == "trimval 63\n"); } { std::ostringstream oss; - proxy.Call("trimval", {"0"}, -1, PUT, oss); + caller.call("trimval", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "trimval 0\n"); } { std::ostringstream oss; - proxy.Call("trimval", {}, -1, GET, oss); + caller.call("trimval", {}, -1, GET, oss); REQUIRE(oss.str() == "trimval 0\n"); } - REQUIRE_THROWS(proxy.Call("trimval", {"64"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("trimval", {"-2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("trimval", {"64"}, -1, PUT)); + REQUIRE_THROWS(caller.call("trimval", {"-2"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { if (prev_val[i] != -1) { det.setAllTrimbits(prev_val[i], {i}); } } } else { - REQUIRE_THROWS(proxy.Call("trimval", {}, -1, GET)); + REQUIRE_THROWS(caller.call("trimval", {}, -1, GET)); } } -TEST_CASE("trimen", "[.cmd][.this]") { +TEST_CASE("CALLER::trimen", "[.cmdcall][.this]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::MYTHEN3) { auto previous = det.getTrimEnergies(); std::ostringstream oss1, oss2; - proxy.Call("trimen", {"4500", "5400", "6400"}, -1, PUT, oss1); + caller.call("trimen", {"4500", "5400", "6400"}, -1, PUT, oss1); REQUIRE(oss1.str() == "trimen [4500, 5400, 6400]\n"); - proxy.Call("trimen", {}, -1, GET, oss2); + caller.call("trimen", {}, -1, GET, oss2); REQUIRE(oss2.str() == "trimen [4500, 5400, 6400]\n"); for (int i = 0; i != det.size(); ++i) { det.setTrimEnergies(previous[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("trimen", {"4500", "5400", "6400"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("trimen", {}, -1, GET)); + REQUIRE_THROWS( + caller.call("trimen", {"4500", "5400", "6400"}, -1, PUT)); + REQUIRE_THROWS(caller.call("trimen", {}, -1, GET)); } } -TEST_CASE("gappixels", "[.cmd]") { +TEST_CASE("CALLER::gappixels", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); // test eiger(quad or full module only) @@ -543,38 +567,38 @@ TEST_CASE("gappixels", "[.cmd]") { auto prev_val = det.getGapPixelsinCallback(); { std::ostringstream oss; - proxy.Call("gappixels", {"1"}, -1, PUT, oss); + caller.call("gappixels", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "gappixels 1\n"); } { std::ostringstream oss; - proxy.Call("gappixels", {"0"}, -1, PUT, oss); + caller.call("gappixels", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "gappixels 0\n"); } { std::ostringstream oss; - proxy.Call("gappixels", {}, -1, GET, oss); + caller.call("gappixels", {}, -1, GET, oss); REQUIRE(oss.str() == "gappixels 0\n"); } det.setGapPixelsinCallback(prev_val); } else { { std::ostringstream oss; - proxy.Call("gappixels", {}, -1, GET, oss); + caller.call("gappixels", {}, -1, GET, oss); REQUIRE(oss.str() == "gappixels 0\n"); } { std::ostringstream oss; - proxy.Call("gappixels", {"0"}, -1, PUT, oss); + caller.call("gappixels", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "gappixels 0\n"); } - REQUIRE_THROWS(proxy.Call("gappixels", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("gappixels", {"1"}, -1, PUT)); } } -TEST_CASE("fliprows", "[.cmd]") { +TEST_CASE("CALLER::fliprows", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); bool hw2 = false; if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) && @@ -590,11 +614,11 @@ TEST_CASE("fliprows", "[.cmd]") { det.setNumberofUDPInterfaces(2); } std::ostringstream oss1, oss2, oss3; - proxy.Call("fliprows", {"1"}, -1, PUT, oss1); + caller.call("fliprows", {"1"}, -1, PUT, oss1); REQUIRE(oss1.str() == "fliprows 1\n"); - proxy.Call("fliprows", {}, -1, GET, oss2); + caller.call("fliprows", {}, -1, GET, oss2); REQUIRE(oss2.str() == "fliprows 1\n"); - proxy.Call("fliprows", {"0"}, -1, PUT, oss3); + caller.call("fliprows", {"0"}, -1, PUT, oss3); REQUIRE(oss3.str() == "fliprows 0\n"); for (int i = 0; i != det.size(); ++i) { det.setFlipRows(previous[i], {i}); @@ -603,18 +627,18 @@ TEST_CASE("fliprows", "[.cmd]") { det.setNumberofUDPInterfaces(previous_numudp); } } else { - REQUIRE_THROWS(proxy.Call("fliprows", {}, -1, GET)); + REQUIRE_THROWS(caller.call("fliprows", {}, -1, GET)); } } -TEST_CASE("master", "[.cmd]") { +TEST_CASE("CALLER::master", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD || det_type == defs::GOTTHARD2 || det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { - REQUIRE_NOTHROW(proxy.Call("master", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("master", {}, -1, GET)); if (det_type == defs::EIGER || det_type == defs::GOTTHARD2 || det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { // get previous master @@ -630,16 +654,16 @@ TEST_CASE("master", "[.cmd]") { } { std::ostringstream oss1; - proxy.Call("master", {"0"}, 0, PUT, oss1); + caller.call("master", {"0"}, 0, PUT, oss1); REQUIRE(oss1.str() == "master 0\n"); } { std::ostringstream oss1; - proxy.Call("master", {"1"}, 0, PUT, oss1); + caller.call("master", {"1"}, 0, PUT, oss1); REQUIRE(oss1.str() == "master 1\n"); } if (det.size() > 1) { - REQUIRE_THROWS(proxy.Call("master", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("master", {"1"}, -1, PUT)); } // set all to slaves, and then master for (int i = 0; i != det.size(); ++i) { @@ -648,69 +672,69 @@ TEST_CASE("master", "[.cmd]") { det.setMaster(1, prevMaster); } } else { - REQUIRE_THROWS(proxy.Call("master", {}, -1, GET)); + REQUIRE_THROWS(caller.call("master", {}, -1, GET)); } } -TEST_CASE("badchannels", "[.cmd]") { +TEST_CASE("CALLER::badchannels", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2 || det_type == defs::MYTHEN3) { auto prev = det.getBadChannels(); - REQUIRE_THROWS(proxy.Call("badchannels", {}, -1, GET)); + REQUIRE_THROWS(caller.call("badchannels", {}, -1, GET)); std::string fname_put = getAbsolutePathFromCurrentProcess(TEST_FILE_NAME_BAD_CHANNELS); std::string fname_get = "/tmp/sls_test_channels.txt"; - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_put}, 0, PUT)); - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_get}, 0, GET)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_put}, 0, PUT)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_get}, 0, GET)); auto list = getChannelsFromFile(fname_get); std::vector expected = {0, 12, 15, 40, 41, 42, 43, 44, 1279}; REQUIRE(list == expected); - REQUIRE_NOTHROW(proxy.Call("badchannels", {"none"}, 0, PUT)); - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_get}, 0, GET)); + REQUIRE_NOTHROW(caller.call("badchannels", {"none"}, 0, PUT)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_get}, 0, GET)); list = getChannelsFromFile(fname_get); REQUIRE(list.empty()); - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_put}, 0, PUT)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_put}, 0, PUT)); - REQUIRE_NOTHROW(proxy.Call("badchannels", {"0"}, 0, PUT)); - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_get}, 0, GET)); + REQUIRE_NOTHROW(caller.call("badchannels", {"0"}, 0, PUT)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_get}, 0, GET)); list = getChannelsFromFile(fname_get); REQUIRE(list.empty()); - REQUIRE_NOTHROW(proxy.Call("badchannels", {"12"}, 0, PUT)); - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_get}, 0, GET)); + REQUIRE_NOTHROW(caller.call("badchannels", {"12"}, 0, PUT)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_get}, 0, GET)); list = getChannelsFromFile(fname_get); expected = {12}; REQUIRE(list == expected); - REQUIRE_NOTHROW(proxy.Call( + REQUIRE_NOTHROW(caller.call( "badchannels", {"0", "12,", "15", "43", "40:45", "1279"}, 0, PUT)); - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_get}, 0, GET)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_get}, 0, GET)); list = getChannelsFromFile(fname_get); expected = {0, 12, 15, 40, 41, 42, 43, 44, 1279}; REQUIRE(list == expected); - REQUIRE_NOTHROW(proxy.Call("badchannels", {"40:45"}, 0, PUT)); - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_get}, 0, GET)); + REQUIRE_NOTHROW(caller.call("badchannels", {"40:45"}, 0, PUT)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_get}, 0, GET)); list = getChannelsFromFile(fname_get); expected = {40, 41, 42, 43, 44}; REQUIRE(list == expected); - REQUIRE_NOTHROW(proxy.Call("badchannels", {"5,6,7"}, 0, PUT)); - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_get}, 0, GET)); + REQUIRE_NOTHROW(caller.call("badchannels", {"5,6,7"}, 0, PUT)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_get}, 0, GET)); list = getChannelsFromFile(fname_get); expected = {5, 6, 7}; REQUIRE(list == expected); - REQUIRE_NOTHROW(proxy.Call("badchannels", {"1:5,6,7"}, 0, PUT)); - REQUIRE_NOTHROW(proxy.Call("badchannels", {fname_get}, 0, GET)); + REQUIRE_NOTHROW(caller.call("badchannels", {"1:5,6,7"}, 0, PUT)); + REQUIRE_NOTHROW(caller.call("badchannels", {fname_get}, 0, GET)); list = getChannelsFromFile(fname_get); expected = {1, 2, 3, 4, 6, 7}; REQUIRE(list == expected); @@ -718,53 +742,53 @@ TEST_CASE("badchannels", "[.cmd]") { det.setBadChannels(prev); } else { - REQUIRE_THROWS(proxy.Call("badchannels", {}, -1, GET)); + REQUIRE_THROWS(caller.call("badchannels", {}, -1, GET)); } } -TEST_CASE("row", "[.cmd]") { +TEST_CASE("CALLER::row", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getRow()[0]; { std::ostringstream oss; - proxy.Call("row", {"1"}, 0, PUT, oss); + caller.call("row", {"1"}, 0, PUT, oss); REQUIRE(oss.str() == "row 1\n"); } { std::ostringstream oss; - proxy.Call("row", {}, 0, GET, oss); + caller.call("row", {}, 0, GET, oss); REQUIRE(oss.str() == "row 1\n"); } { std::ostringstream oss; - proxy.Call("row", {"0"}, 0, PUT, oss); + caller.call("row", {"0"}, 0, PUT, oss); REQUIRE(oss.str() == "row 0\n"); } - REQUIRE_THROWS(proxy.Call("row", {"-5"}, -1, PUT)); + REQUIRE_THROWS(caller.call("row", {"-5"}, -1, PUT)); det.setRow(prev_val, {0}); } -TEST_CASE("column", "[.cmd]") { +TEST_CASE("CALLER::column", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getColumn()[0]; { std::ostringstream oss; - proxy.Call("column", {"1"}, 0, PUT, oss); + caller.call("column", {"1"}, 0, PUT, oss); REQUIRE(oss.str() == "column 1\n"); } { std::ostringstream oss; - proxy.Call("column", {}, 0, GET, oss); + caller.call("column", {}, 0, GET, oss); REQUIRE(oss.str() == "column 1\n"); } { std::ostringstream oss; - proxy.Call("column", {"0"}, 0, PUT, oss); + caller.call("column", {"0"}, 0, PUT, oss); REQUIRE(oss.str() == "column 0\n"); } - REQUIRE_THROWS(proxy.Call("column", {"-5"}, -1, PUT)); + REQUIRE_THROWS(caller.call("column", {"-5"}, -1, PUT)); det.setColumn(prev_val, {0}); } @@ -772,57 +796,57 @@ TEST_CASE("column", "[.cmd]") { // acquire: not testing -TEST_CASE("frames", "[.cmd]") { +TEST_CASE("CALLER::frames", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getNumberOfFrames().tsquash("#frames must be same to test"); { std::ostringstream oss; - proxy.Call("frames", {"1000"}, -1, PUT, oss); + caller.call("frames", {"1000"}, -1, PUT, oss); REQUIRE(oss.str() == "frames 1000\n"); } { std::ostringstream oss; - proxy.Call("frames", {}, -1, GET, oss); + caller.call("frames", {}, -1, GET, oss); REQUIRE(oss.str() == "frames 1000\n"); } { std::ostringstream oss; - proxy.Call("frames", {"1"}, -1, PUT, oss); + caller.call("frames", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "frames 1\n"); } - REQUIRE_THROWS(proxy.Call("frames", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("frames", {"0"}, -1, PUT)); det.setNumberOfFrames(prev_val); } -TEST_CASE("triggers", "[.cmd]") { +TEST_CASE("CALLER::triggers", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getNumberOfTriggers().tsquash("#triggers must be same to test"); { std::ostringstream oss; - proxy.Call("triggers", {"1000"}, -1, PUT, oss); + caller.call("triggers", {"1000"}, -1, PUT, oss); REQUIRE(oss.str() == "triggers 1000\n"); } { std::ostringstream oss; - proxy.Call("triggers", {}, -1, GET, oss); + caller.call("triggers", {}, -1, GET, oss); REQUIRE(oss.str() == "triggers 1000\n"); } { std::ostringstream oss; - proxy.Call("triggers", {"1"}, -1, PUT, oss); + caller.call("triggers", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "triggers 1\n"); } - REQUIRE_THROWS(proxy.Call("triggers", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("triggers", {"0"}, -1, PUT)); det.setNumberOfTriggers(prev_val); } -TEST_CASE("exptime", "[.cmd][.time]") { +TEST_CASE("CALLER::exptime", "[.cmdcall][.time]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); std::chrono::nanoseconds prev_val; if (det_type != defs::MYTHEN3) { @@ -837,29 +861,29 @@ TEST_CASE("exptime", "[.cmd][.time]") { } { std::ostringstream oss; - proxy.Call("exptime", {"0.05"}, -1, PUT, oss); + caller.call("exptime", {"0.05"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime 0.05\n"); } if (det_type != defs::MYTHEN3) { std::ostringstream oss; - proxy.Call("exptime", {}, -1, GET, oss); + caller.call("exptime", {}, -1, GET, oss); REQUIRE(oss.str() == "exptime 50ms\n"); } { std::ostringstream oss; - proxy.Call("exptime", {"1s"}, -1, PUT, oss); + caller.call("exptime", {"1s"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime 1s\n"); } if (det_type != defs::JUNGFRAU && det_type != defs::MOENCH) { { std::ostringstream oss; - proxy.Call("exptime", {"0"}, -1, PUT, oss); + caller.call("exptime", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime 0\n"); } { // Get exptime of single module std::ostringstream oss; - proxy.Call("exptime", {}, 0, GET, oss); + caller.call("exptime", {}, 0, GET, oss); if (det_type == defs::MYTHEN3) { REQUIRE(oss.str() == "exptime [0ns, 0ns, 0ns]\n"); } else { @@ -870,23 +894,23 @@ TEST_CASE("exptime", "[.cmd][.time]") { det.setExptime(-1, prev_val); } -TEST_CASE("period", "[.cmd]") { +TEST_CASE("CALLER::period", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getPeriod(); { std::ostringstream oss; - proxy.Call("period", {"1.25s"}, -1, PUT, oss); + caller.call("period", {"1.25s"}, -1, PUT, oss); REQUIRE(oss.str() == "period 1.25s\n"); } { std::ostringstream oss; - proxy.Call("period", {}, -1, GET, oss); + caller.call("period", {}, -1, GET, oss); REQUIRE(oss.str() == "period 1.25s\n"); } { std::ostringstream oss; - proxy.Call("period", {"0"}, -1, PUT, oss); + caller.call("period", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "period 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -894,31 +918,31 @@ TEST_CASE("period", "[.cmd]") { } } -TEST_CASE("delay", "[.cmd]") { +TEST_CASE("CALLER::delay", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_THROWS(proxy.Call("delay", {"1"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("delay", {}, -1, GET)); + REQUIRE_THROWS(caller.call("delay", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("delay", {}, -1, GET)); } else if (det_type == defs::GOTTHARD) { // extra delays for master (can throw when setting) - REQUIRE_NOTHROW(proxy.Call("delay", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("delay", {}, -1, GET)); } else { auto prev_val = det.getDelayAfterTrigger(); { std::ostringstream oss; - proxy.Call("delay", {"1.25s"}, -1, PUT, oss); + caller.call("delay", {"1.25s"}, -1, PUT, oss); REQUIRE(oss.str() == "delay 1.25s\n"); } { std::ostringstream oss; - proxy.Call("delay", {}, -1, GET, oss); + caller.call("delay", {}, -1, GET, oss); REQUIRE(oss.str() == "delay 1.25s\n"); } { std::ostringstream oss; - proxy.Call("delay", {"0s"}, -1, PUT, oss); + caller.call("delay", {"0s"}, -1, PUT, oss); REQUIRE(oss.str() == "delay 0s\n"); } for (int i = 0; i != det.size(); ++i) { @@ -927,74 +951,74 @@ TEST_CASE("delay", "[.cmd]") { } } -TEST_CASE("framesl", "[.cmd]") { +TEST_CASE("CALLER::framesl", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_THROWS(proxy.Call("framesl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("framesl", {}, -1, GET)); } else { - REQUIRE_NOTHROW(proxy.Call("framesl", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("framesl", {}, -1, GET)); } } -TEST_CASE("triggersl", "[.cmd]") { +TEST_CASE("CALLER::triggersl", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { - REQUIRE_THROWS(proxy.Call("triggersl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("triggersl", {}, -1, GET)); } else { - REQUIRE_NOTHROW(proxy.Call("triggersl", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("triggersl", {}, -1, GET)); } } -TEST_CASE("delayl", "[.cmd]") { +TEST_CASE("CALLER::delayl", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); switch (det_type) { case defs::EIGER: case defs::CHIPTESTBOARD: case defs::GOTTHARD2: case defs::MYTHEN3: - REQUIRE_THROWS(proxy.Call("delayl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("delayl", {}, -1, GET)); break; default: - REQUIRE_NOTHROW(proxy.Call("delayl", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("delayl", {}, -1, GET)); break; } } -TEST_CASE("periodl", "[.cmd]") { +TEST_CASE("CALLER::periodl", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); switch (det_type) { case defs::EIGER: case defs::CHIPTESTBOARD: case defs::GOTTHARD2: case defs::MYTHEN3: - REQUIRE_THROWS(proxy.Call("periodl", {}, -1, GET)); + REQUIRE_THROWS(caller.call("periodl", {}, -1, GET)); break; default: - REQUIRE_NOTHROW(proxy.Call("periodl", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("periodl", {}, -1, GET)); break; } } -TEST_CASE("dr", "[.cmd]") { +TEST_CASE("CALLER::dr", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { auto dr = det.getDynamicRange().squash(); std::array vals{4, 8, 16, 32}; for (const auto val : vals) { std::ostringstream oss1, oss2; - proxy.Call("dr", {std::to_string(val)}, -1, PUT, oss1); + caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); - proxy.Call("dr", {}, -1, GET, oss2); + caller.call("dr", {}, -1, GET, oss2); REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); } det.setDynamicRange(dr); @@ -1004,106 +1028,106 @@ TEST_CASE("dr", "[.cmd]") { std::array vals{8, 16, 32}; for (const auto val : vals) { std::ostringstream oss1, oss2; - proxy.Call("dr", {std::to_string(val)}, -1, PUT, oss1); + caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); - proxy.Call("dr", {}, -1, GET, oss2); + caller.call("dr", {}, -1, GET, oss2); REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); } det.setDynamicRange(dr); } else { // For the other detectors we should get an error message // except for dr 16 - REQUIRE_THROWS(proxy.Call("dr", {"4"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("dr", {"8"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("dr", {"32"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dr", {"4"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dr", {"8"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dr", {"32"}, -1, PUT)); std::ostringstream oss1, oss2; - proxy.Call("dr", {"16"}, -1, PUT, oss1); + caller.call("dr", {"16"}, -1, PUT, oss1); REQUIRE(oss1.str() == "dr 16\n"); - proxy.Call("dr", {"16"}, -1, PUT, oss2); + caller.call("dr", {"16"}, -1, PUT, oss2); REQUIRE(oss2.str() == "dr 16\n"); } } -TEST_CASE("drlist", "[.cmd]") { +TEST_CASE("CALLER::drlist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("drlist", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("drlist", {}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("drlist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("drlist", {}, -1, PUT)); } -TEST_CASE("timing", "[.cmd]") { +TEST_CASE("CALLER::timing", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getTimingMode(); det.setTimingMode(defs::AUTO_TIMING); { std::ostringstream oss1, oss2; - proxy.Call("timing", {"auto"}, -1, PUT, oss1); + caller.call("timing", {"auto"}, -1, PUT, oss1); REQUIRE(oss1.str() == "timing auto\n"); - proxy.Call("timing", {}, -1, GET, oss2); + caller.call("timing", {}, -1, GET, oss2); REQUIRE(oss2.str() == "timing auto\n"); } { std::ostringstream oss1, oss2; - proxy.Call("timing", {"trigger"}, -1, PUT, oss1); + caller.call("timing", {"trigger"}, -1, PUT, oss1); REQUIRE(oss1.str() == "timing trigger\n"); - proxy.Call("timing", {}, -1, GET, oss2); + caller.call("timing", {}, -1, GET, oss2); REQUIRE(oss2.str() == "timing trigger\n"); } auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { { std::ostringstream oss1, oss2; - proxy.Call("timing", {"gating"}, -1, PUT, oss1); + caller.call("timing", {"gating"}, -1, PUT, oss1); REQUIRE(oss1.str() == "timing gating\n"); - proxy.Call("timing", {}, -1, GET, oss2); + caller.call("timing", {}, -1, GET, oss2); REQUIRE(oss2.str() == "timing gating\n"); } { std::ostringstream oss1, oss2; - proxy.Call("timing", {"burst_trigger"}, -1, PUT, oss1); + caller.call("timing", {"burst_trigger"}, -1, PUT, oss1); REQUIRE(oss1.str() == "timing burst_trigger\n"); - proxy.Call("timing", {}, -1, GET, oss2); + caller.call("timing", {}, -1, GET, oss2); REQUIRE(oss2.str() == "timing burst_trigger\n"); } - REQUIRE_THROWS(proxy.Call("timing", {"trigger_gating"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); } else if (det_type == defs::MYTHEN3) { { std::ostringstream oss1, oss2; - proxy.Call("timing", {"gating"}, -1, PUT, oss1); + caller.call("timing", {"gating"}, -1, PUT, oss1); REQUIRE(oss1.str() == "timing gating\n"); - proxy.Call("timing", {}, -1, GET, oss2); + caller.call("timing", {}, -1, GET, oss2); REQUIRE(oss2.str() == "timing gating\n"); } { std::ostringstream oss1, oss2; - proxy.Call("timing", {"trigger_gating"}, -1, PUT, oss1); + caller.call("timing", {"trigger_gating"}, -1, PUT, oss1); REQUIRE(oss1.str() == "timing trigger_gating\n"); - proxy.Call("timing", {}, -1, GET, oss2); + caller.call("timing", {}, -1, GET, oss2); REQUIRE(oss2.str() == "timing trigger_gating\n"); } - REQUIRE_THROWS(proxy.Call("timing", {"burst_trigger"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("timing", {"gating"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("timing", {"burst_trigger"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("timing", {"trigger_gating"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"gating"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); } for (int i = 0; i != det.size(); ++i) { det.setTimingMode(prev_val[i], {i}); } } -TEST_CASE("timinglist", "[.cmd]") { +TEST_CASE("CALLER::timinglist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("timinglist", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("timinglist", {}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("timinglist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("timinglist", {}, -1, PUT)); } -TEST_CASE("readoutspeed", "[.cmd]") { +TEST_CASE("CALLER::readoutspeed", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::GOTTHARD2) { @@ -1115,13 +1139,13 @@ TEST_CASE("readoutspeed", "[.cmd]") { det.getChipVersion().squash() * 10 == 11) || (det_type == defs::EIGER) || (det_type == defs::MOENCH)) { std::ostringstream oss1, oss2, oss3, oss4; - proxy.Call("readoutspeed", {"0"}, -1, PUT, oss1); + caller.call("readoutspeed", {"0"}, -1, PUT, oss1); REQUIRE(oss1.str() == "readoutspeed full_speed\n"); - proxy.Call("readoutspeed", {}, -1, GET, oss2); + caller.call("readoutspeed", {}, -1, GET, oss2); REQUIRE(oss2.str() == "readoutspeed full_speed\n"); - proxy.Call("readoutspeed", {"full_speed"}, -1, PUT, oss3); + caller.call("readoutspeed", {"full_speed"}, -1, PUT, oss3); REQUIRE(oss3.str() == "readoutspeed full_speed\n"); - proxy.Call("readoutspeed", {}, -1, GET, oss4); + caller.call("readoutspeed", {}, -1, GET, oss4); REQUIRE(oss4.str() == "readoutspeed full_speed\n"); } @@ -1129,104 +1153,106 @@ TEST_CASE("readoutspeed", "[.cmd]") { det_type == defs::MOENCH) { { std::ostringstream oss1, oss2, oss3, oss4; - proxy.Call("readoutspeed", {"1"}, -1, PUT, oss1); + caller.call("readoutspeed", {"1"}, -1, PUT, oss1); REQUIRE(oss1.str() == "readoutspeed half_speed\n"); - proxy.Call("readoutspeed", {}, -1, GET, oss2); + caller.call("readoutspeed", {}, -1, GET, oss2); REQUIRE(oss2.str() == "readoutspeed half_speed\n"); - proxy.Call("readoutspeed", {"half_speed"}, -1, PUT, oss3); + caller.call("readoutspeed", {"half_speed"}, -1, PUT, oss3); REQUIRE(oss3.str() == "readoutspeed half_speed\n"); - proxy.Call("readoutspeed", {}, -1, GET, oss4); + caller.call("readoutspeed", {}, -1, GET, oss4); REQUIRE(oss4.str() == "readoutspeed half_speed\n"); } { std::ostringstream oss1, oss2, oss3, oss4; - proxy.Call("readoutspeed", {"2"}, -1, PUT, oss1); + caller.call("readoutspeed", {"2"}, -1, PUT, oss1); REQUIRE(oss1.str() == "readoutspeed quarter_speed\n"); - proxy.Call("readoutspeed", {}, -1, GET, oss2); + caller.call("readoutspeed", {}, -1, GET, oss2); REQUIRE(oss2.str() == "readoutspeed quarter_speed\n"); - proxy.Call("readoutspeed", {"quarter_speed"}, -1, PUT, oss3); + caller.call("readoutspeed", {"quarter_speed"}, -1, PUT, oss3); REQUIRE(oss3.str() == "readoutspeed quarter_speed\n"); - proxy.Call("readoutspeed", {}, -1, GET, oss4); + caller.call("readoutspeed", {}, -1, GET, oss4); REQUIRE(oss4.str() == "readoutspeed quarter_speed\n"); } - REQUIRE_THROWS(proxy.Call("readoutspeed", {"108"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readoutspeed", {"144"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readoutspeed", {"108"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readoutspeed", {"144"}, -1, PUT)); } if (det_type == defs::GOTTHARD2) { { std::ostringstream oss1, oss2, oss3, oss4; - proxy.Call("readoutspeed", {"108"}, -1, PUT, oss1); + caller.call("readoutspeed", {"108"}, -1, PUT, oss1); REQUIRE(oss1.str() == "readoutspeed 108\n"); - proxy.Call("readoutspeed", {}, -1, GET, oss2); + caller.call("readoutspeed", {}, -1, GET, oss2); REQUIRE(oss2.str() == "readoutspeed 108\n"); } { std::ostringstream oss1, oss2, oss3, oss4; - proxy.Call("readoutspeed", {"144"}, -1, PUT, oss1); + caller.call("readoutspeed", {"144"}, -1, PUT, oss1); REQUIRE(oss1.str() == "readoutspeed 144\n"); - proxy.Call("readoutspeed", {}, -1, GET, oss2); + caller.call("readoutspeed", {}, -1, GET, oss2); REQUIRE(oss2.str() == "readoutspeed 144\n"); } - REQUIRE_THROWS(proxy.Call("readoutspeed", {"full_speed"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readoutspeed", {"half_speed"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("readoutspeed", {"quarter_speed"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readoutspeed", {"0"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readoutspeed", {"1"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readoutspeed", {"2"}, -1, PUT)); + caller.call("readoutspeed", {"full_speed"}, -1, PUT)); + REQUIRE_THROWS( + caller.call("readoutspeed", {"half_speed"}, -1, PUT)); + REQUIRE_THROWS( + caller.call("readoutspeed", {"quarter_speed"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readoutspeed", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readoutspeed", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readoutspeed", {"2"}, -1, PUT)); } for (int i = 0; i != det.size(); ++i) { det.setReadoutSpeed(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("readoutspeed", {"0"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readoutspeed", {}, -1, GET)); + REQUIRE_THROWS(caller.call("readoutspeed", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readoutspeed", {}, -1, GET)); } } -TEST_CASE("readoutspeedlist", "[.cmd]") { +TEST_CASE("CALLER::readoutspeedlist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2 || det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::EIGER) { - REQUIRE_NOTHROW(proxy.Call("readoutspeedlist", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("readoutspeedlist", {}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("readoutspeedlist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("readoutspeedlist", {}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("readoutspeedlist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("readoutspeedlist", {}, -1, GET)); } } -TEST_CASE("adcphase", "[.cmd]") { +TEST_CASE("CALLER::adcphase", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD || det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD) { if (det_type == defs::GOTTHARD) { std::ostringstream oss1; - proxy.Call("adcphase", {"20"}, -1, PUT, oss1); + caller.call("adcphase", {"20"}, -1, PUT, oss1); REQUIRE(oss1.str() == "adcphase 20\n"); // cant get, cant use deg - REQUIRE_THROWS(proxy.Call("adcphase", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("adcphase", {"20", "deg"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adcphase", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adcphase", {"20", "deg"}, -1, PUT)); } else { auto prev_val = det.getADCPhase(); { std::ostringstream oss1, oss2; - proxy.Call("adcphase", {"20"}, -1, PUT, oss1); + caller.call("adcphase", {"20"}, -1, PUT, oss1); REQUIRE(oss1.str() == "adcphase 20\n"); - proxy.Call("adcphase", {}, -1, GET, oss2); + caller.call("adcphase", {}, -1, GET, oss2); REQUIRE(oss2.str() == "adcphase 20\n"); } { std::ostringstream oss1, oss2; - proxy.Call("adcphase", {"20", "deg"}, -1, PUT, oss1); + caller.call("adcphase", {"20", "deg"}, -1, PUT, oss1); REQUIRE(oss1.str() == "adcphase 20 deg\n"); - proxy.Call("adcphase", {"deg"}, -1, GET, oss2); + caller.call("adcphase", {"deg"}, -1, GET, oss2); REQUIRE(oss2.str() == "adcphase 20 deg\n"); } for (int i = 0; i != det.size(); ++i) { @@ -1234,96 +1260,96 @@ TEST_CASE("adcphase", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("adcphase", {"0"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("adcphase", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adcphase", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adcphase", {}, -1, GET)); } } -TEST_CASE("maxadcphaseshift", "[.cmd]") { +TEST_CASE("CALLER::maxadcphaseshift", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || // only because clk index of 0 exists det_type == defs::GOTTHARD2) { // only because clk index of 0 exists - REQUIRE_NOTHROW(proxy.Call("maxadcphaseshift", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("maxadcphaseshift", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("maxadcphaseshift", {}, -1, GET)); + REQUIRE_THROWS(caller.call("maxadcphaseshift", {}, -1, GET)); } } -TEST_CASE("dbitphase", "[.cmd]") { +TEST_CASE("CALLER::dbitphase", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getDBITPhase(); { std::ostringstream oss1, oss2; - proxy.Call("dbitphase", {"20"}, -1, PUT, oss1); + caller.call("dbitphase", {"20"}, -1, PUT, oss1); REQUIRE(oss1.str() == "dbitphase 20\n"); - proxy.Call("dbitphase", {}, -1, GET, oss2); + caller.call("dbitphase", {}, -1, GET, oss2); REQUIRE(oss2.str() == "dbitphase 20\n"); } { std::ostringstream oss1, oss2; - proxy.Call("dbitphase", {"23", "deg"}, -1, PUT, oss1); + caller.call("dbitphase", {"23", "deg"}, -1, PUT, oss1); REQUIRE(oss1.str() == "dbitphase 23 deg\n"); - proxy.Call("dbitphase", {"deg"}, -1, GET, oss2); + caller.call("dbitphase", {"deg"}, -1, GET, oss2); REQUIRE(oss2.str() == "dbitphase 23 deg\n"); } for (int i = 0; i != det.size(); ++i) { det.setDBITPhase(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("dbitphase", {"0"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("dbitphase", {}, -1, GET)); + REQUIRE_THROWS(caller.call("dbitphase", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dbitphase", {}, -1, GET)); } } -TEST_CASE("maxdbitphaseshift", "[.cmd]") { +TEST_CASE("CALLER::maxdbitphaseshift", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || // only because clk index of 0 exists det_type == defs::GOTTHARD2) { // only because clk index of 0 exists - REQUIRE_NOTHROW(proxy.Call("maxdbitphaseshift", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("maxdbitphaseshift", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("maxdbitphaseshift", {}, -1, GET)); + REQUIRE_THROWS(caller.call("maxdbitphaseshift", {}, -1, GET)); } } -TEST_CASE("clkfreq", "[.cmd]") { +TEST_CASE("CALLER::clkfreq", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { - REQUIRE_THROWS(proxy.Call("clkfreq", {"0", "2"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("clkfreq", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("clkfreq", {"7"}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("clkfreq", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("clkfreq", {"0", "2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("clkfreq", {}, -1, GET)); + REQUIRE_THROWS(caller.call("clkfreq", {"7"}, -1, GET)); + REQUIRE_NOTHROW(caller.call("clkfreq", {"0"}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("clkfreq", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("clkfreq", {"0"}, -1, GET)); } } -TEST_CASE("clkphase", "[.cmd]") { +TEST_CASE("CALLER::clkphase", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { - REQUIRE_THROWS(proxy.Call("clkphase", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("clkphase", {"7"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("clkphase", {"4"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("clkphase", {"7", "4"}, -1, PUT)); + REQUIRE_THROWS(caller.call("clkphase", {}, -1, GET)); + REQUIRE_THROWS(caller.call("clkphase", {"7"}, -1, GET)); + REQUIRE_THROWS(caller.call("clkphase", {"4"}, -1, PUT)); + REQUIRE_THROWS(caller.call("clkphase", {"7", "4"}, -1, PUT)); auto prev_val = det.getClockPhase(0); { std::ostringstream oss1, oss2; - proxy.Call("clkphase", {"0", "20"}, -1, PUT, oss1); + caller.call("clkphase", {"0", "20"}, -1, PUT, oss1); REQUIRE(oss1.str() == "clkphase 20\n"); - proxy.Call("clkphase", {"0"}, -1, GET, oss2); + caller.call("clkphase", {"0"}, -1, GET, oss2); REQUIRE(oss2.str() == "clkphase 20\n"); } std::string s_deg_val = "15"; @@ -1334,98 +1360,98 @@ TEST_CASE("clkphase", "[.cmd]") { } { std::ostringstream oss1, oss2; - proxy.Call("clkphase", {"0", s_deg_val, "deg"}, -1, PUT, oss1); + caller.call("clkphase", {"0", s_deg_val, "deg"}, -1, PUT, oss1); REQUIRE(oss1.str() == "clkphase " + s_deg_val + " deg\n"); - proxy.Call("clkphase", {"0", "deg"}, -1, GET, oss2); + caller.call("clkphase", {"0", "deg"}, -1, GET, oss2); REQUIRE(oss2.str() == "clkphase " + s_deg_val + " deg\n"); } for (int i = 0; i != det.size(); ++i) { det.setClockPhase(0, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("clkphase", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("clkphase", {"0"}, -1, GET)); } } -TEST_CASE("clkdiv", "[.cmd]") { +TEST_CASE("CALLER::clkdiv", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { - REQUIRE_THROWS(proxy.Call("clkdiv", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("clkdiv", {"7"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("clkdiv", {"7", "4"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("clkdiv", {"7", "4"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("clkdiv", {"0", "1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("clkdiv", {}, -1, GET)); + REQUIRE_THROWS(caller.call("clkdiv", {"7"}, -1, GET)); + REQUIRE_THROWS(caller.call("clkdiv", {"7", "4"}, -1, PUT)); + REQUIRE_THROWS(caller.call("clkdiv", {"7", "4"}, -1, PUT)); + REQUIRE_THROWS(caller.call("clkdiv", {"0", "1"}, -1, PUT)); auto prev_val = det.getClockDivider(0); { std::ostringstream oss1, oss2; - proxy.Call("clkdiv", {"0", "3"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "clkdiv 3\n"); - proxy.Call("clkdiv", {"0"}, -1, GET, oss2); - REQUIRE(oss2.str() == "clkdiv 3\n"); + caller.call("clkdiv", {"0", "3"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "clkdiv 0 3\n"); + caller.call("clkdiv", {"0"}, -1, GET, oss2); + REQUIRE(oss2.str() == "clkdiv 0 3\n"); } for (int i = 0; i != det.size(); ++i) { det.setClockDivider(0, prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("clkdiv", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("clkdiv", {"0"}, -1, GET)); } } -TEST_CASE("maxclkphaseshift", "[.cmd]") { +TEST_CASE("CALLER::maxclkphaseshift", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { - REQUIRE_THROWS(proxy.Call("maxclkphaseshift", {"0", "2"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("maxclkphaseshift", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("maxclkphaseshift", {"7"}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("maxclkphaseshift", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("maxclkphaseshift", {"0", "2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("maxclkphaseshift", {}, -1, GET)); + REQUIRE_THROWS(caller.call("maxclkphaseshift", {"7"}, -1, GET)); + REQUIRE_NOTHROW(caller.call("maxclkphaseshift", {"0"}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("maxclkphaseshift", {"0"}, -1, GET)); + REQUIRE_THROWS(caller.call("maxclkphaseshift", {"0"}, -1, GET)); } } -TEST_CASE("highvoltage", "[.cmd]") { +TEST_CASE("CALLER::highvoltage", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); auto prev_val = det.getHighVoltage(); // selected values if (det_type == defs::GOTTHARD) { - REQUIRE_THROWS(proxy.Call("highvoltage", {"50"}, -1, PUT)); + REQUIRE_THROWS(caller.call("highvoltage", {"50"}, -1, PUT)); { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"90"}, -1, PUT, oss1); + caller.call("highvoltage", {"90"}, -1, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 90\n"); - proxy.Call("highvoltage", {}, -1, GET, oss2); + caller.call("highvoltage", {}, -1, GET, oss2); REQUIRE(oss2.str() == "highvoltage 90\n"); } { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"0"}, -1, PUT, oss1); + caller.call("highvoltage", {"0"}, -1, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 0\n"); - proxy.Call("highvoltage", {}, -1, GET, oss2); + caller.call("highvoltage", {}, -1, GET, oss2); REQUIRE(oss2.str() == "highvoltage 0\n"); } } // range 0, 60 - 200 else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD) { - REQUIRE_THROWS(proxy.Call("highvoltage", {"50"}, -1, PUT)); + REQUIRE_THROWS(caller.call("highvoltage", {"50"}, -1, PUT)); { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"90"}, -1, PUT, oss1); + caller.call("highvoltage", {"90"}, -1, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 90\n"); - proxy.Call("highvoltage", {}, -1, GET, oss2); + caller.call("highvoltage", {}, -1, GET, oss2); REQUIRE(oss2.str() == "highvoltage 90\n"); } { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"0"}, -1, PUT, oss1); + caller.call("highvoltage", {"0"}, -1, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 0\n"); - proxy.Call("highvoltage", {}, -1, GET, oss2); + caller.call("highvoltage", {}, -1, GET, oss2); REQUIRE(oss2.str() == "highvoltage 0\n"); } } @@ -1433,26 +1459,26 @@ TEST_CASE("highvoltage", "[.cmd]") { else if (det_type == defs::EIGER) { { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"50"}, 0, PUT, oss1); + caller.call("highvoltage", {"50"}, 0, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 50\n"); std::this_thread::sleep_for(std::chrono::seconds(2)); - proxy.Call("highvoltage", {}, 0, GET, oss2); + caller.call("highvoltage", {}, 0, GET, oss2); REQUIRE(oss2.str() == "highvoltage 50\n"); } { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"120"}, 0, PUT, oss1); + caller.call("highvoltage", {"120"}, 0, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 120\n"); std::this_thread::sleep_for(std::chrono::seconds(2)); - proxy.Call("highvoltage", {}, 0, GET, oss2); + caller.call("highvoltage", {}, 0, GET, oss2); REQUIRE(oss2.str() == "highvoltage 120\n"); } { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"0"}, 0, PUT, oss1); + caller.call("highvoltage", {"0"}, 0, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 0\n"); std::this_thread::sleep_for(std::chrono::seconds(2)); - proxy.Call("highvoltage", {}, 0, GET, oss2); + caller.call("highvoltage", {}, 0, GET, oss2); REQUIRE(oss2.str() == "highvoltage 0\n"); } } @@ -1460,23 +1486,23 @@ TEST_CASE("highvoltage", "[.cmd]") { else { { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"50"}, -1, PUT, oss1); + caller.call("highvoltage", {"50"}, -1, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 50\n"); - proxy.Call("highvoltage", {}, -1, GET, oss2); + caller.call("highvoltage", {}, -1, GET, oss2); REQUIRE(oss2.str() == "highvoltage 50\n"); } { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"120"}, -1, PUT, oss1); + caller.call("highvoltage", {"120"}, -1, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 120\n"); - proxy.Call("highvoltage", {}, -1, GET, oss2); + caller.call("highvoltage", {}, -1, GET, oss2); REQUIRE(oss2.str() == "highvoltage 120\n"); } { std::ostringstream oss1, oss2; - proxy.Call("highvoltage", {"0"}, -1, PUT, oss1); + caller.call("highvoltage", {"0"}, -1, PUT, oss1); REQUIRE(oss1.str() == "highvoltage 0\n"); - proxy.Call("highvoltage", {}, -1, GET, oss2); + caller.call("highvoltage", {}, -1, GET, oss2); REQUIRE(oss2.str() == "highvoltage 0\n"); } } @@ -1485,9 +1511,9 @@ TEST_CASE("highvoltage", "[.cmd]") { } } -TEST_CASE("powerchip", "[.cmd]") { +TEST_CASE("CALLER::powerchip", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || @@ -1495,46 +1521,46 @@ TEST_CASE("powerchip", "[.cmd]") { auto prev_val = det.getPowerChip(); { std::ostringstream oss; - proxy.Call("powerchip", {"1"}, -1, PUT, oss); + caller.call("powerchip", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "powerchip 1\n"); } { std::ostringstream oss; - proxy.Call("powerchip", {"0"}, -1, PUT, oss); + caller.call("powerchip", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "powerchip 0\n"); } { std::ostringstream oss; - proxy.Call("powerchip", {}, -1, GET, oss); + caller.call("powerchip", {}, -1, GET, oss); REQUIRE(oss.str() == "powerchip 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setPowerChip(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("powerchip", {}, -1, GET)); + REQUIRE_THROWS(caller.call("powerchip", {}, -1, GET)); } } -TEST_CASE("imagetest", "[.cmd]") { +TEST_CASE("CALLER::imagetest", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); // cannot test only for virtual eiger/jungfrau if (det_type == defs::GOTTHARD) { auto prev_val = det.getImageTestMode(); { std::ostringstream oss1, oss2; - proxy.Call("imagetest", {"1"}, -1, PUT, oss1); + caller.call("imagetest", {"1"}, -1, PUT, oss1); REQUIRE(oss1.str() == "imagetest 1\n"); - proxy.Call("imagetest", {}, -1, GET, oss2); + caller.call("imagetest", {}, -1, GET, oss2); REQUIRE(oss2.str() == "imagetest 1\n"); } { std::ostringstream oss1, oss2; - proxy.Call("imagetest", {"0"}, -1, PUT, oss1); + caller.call("imagetest", {"0"}, -1, PUT, oss1); REQUIRE(oss1.str() == "imagetest 0\n"); - proxy.Call("imagetest", {}, -1, GET, oss2); + caller.call("imagetest", {}, -1, GET, oss2); REQUIRE(oss2.str() == "imagetest 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -1543,34 +1569,34 @@ TEST_CASE("imagetest", "[.cmd]") { } else if (det_type != defs::JUNGFRAU && det_type != defs::MOENCH && det_type != defs::EIGER) { // wont fail for eiger and jungfrau/moench virtual servers - REQUIRE_THROWS(proxy.Call("imagetest", {}, -1, GET)); + REQUIRE_THROWS(caller.call("imagetest", {}, -1, GET)); } } -TEST_CASE("extsig", "[.cmd]") { +TEST_CASE("CALLER::extsig", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD) { auto prev_val = det.getExternalSignalFlags(0); - REQUIRE_THROWS(proxy.Call("extsig", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("extsig", {"1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("extsig", {"0", "inversion_on"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("extsig", {"0", "inversion_off"}, -1, PUT)); + REQUIRE_THROWS(caller.call("extsig", {}, -1, GET)); + REQUIRE_THROWS(caller.call("extsig", {"1"}, -1, GET)); + REQUIRE_THROWS(caller.call("extsig", {"0", "inversion_on"}, -1, PUT)); + REQUIRE_THROWS(caller.call("extsig", {"0", "inversion_off"}, -1, PUT)); { std::ostringstream oss1, oss2; - proxy.Call("extsig", {"0", "trigger_in_rising_edge"}, -1, PUT, - oss1); + caller.call("extsig", {"0", "trigger_in_rising_edge"}, -1, PUT, + oss1); REQUIRE(oss1.str() == "extsig 0 trigger_in_rising_edge\n"); - proxy.Call("extsig", {"0"}, -1, GET, oss2); + caller.call("extsig", {"0"}, -1, GET, oss2); REQUIRE(oss2.str() == "extsig 0 trigger_in_rising_edge\n"); } { std::ostringstream oss1, oss2; - proxy.Call("extsig", {"0", "trigger_in_falling_edge"}, -1, PUT, - oss1); + caller.call("extsig", {"0", "trigger_in_falling_edge"}, -1, PUT, + oss1); REQUIRE(oss1.str() == "extsig 0 trigger_in_falling_edge\n"); - proxy.Call("extsig", {"0"}, -1, GET, oss2); + caller.call("extsig", {"0"}, -1, GET, oss2); REQUIRE(oss2.str() == "extsig 0 trigger_in_falling_edge\n"); } for (int i = 0; i != det.size(); ++i) { @@ -1579,42 +1605,42 @@ TEST_CASE("extsig", "[.cmd]") { } else if (det_type == defs::MYTHEN3) { auto prev_val_0 = det.getExternalSignalFlags(0); auto prev_val_1 = det.getExternalSignalFlags(1); - REQUIRE_THROWS(proxy.Call("extsig", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("extsig", {"8"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("extsig", {"0", "inversion_on"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("extsig", {"0", "inversion_off"}, -1, PUT)); + REQUIRE_THROWS(caller.call("extsig", {}, -1, GET)); + REQUIRE_THROWS(caller.call("extsig", {"8"}, -1, GET)); + REQUIRE_THROWS(caller.call("extsig", {"0", "inversion_on"}, -1, PUT)); + REQUIRE_THROWS(caller.call("extsig", {"0", "inversion_off"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("extsig", {"1", "trigger_in_rising_edge"}, -1, PUT)); + caller.call("extsig", {"1", "trigger_in_rising_edge"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("extsig", {"1", "trigger_in_falling_edge"}, -1, PUT)); + caller.call("extsig", {"1", "trigger_in_falling_edge"}, -1, PUT)); { std::ostringstream oss1, oss2; - proxy.Call("extsig", {"0", "trigger_in_rising_edge"}, -1, PUT, - oss1); + caller.call("extsig", {"0", "trigger_in_rising_edge"}, -1, PUT, + oss1); REQUIRE(oss1.str() == "extsig 0 trigger_in_rising_edge\n"); - proxy.Call("extsig", {"0"}, -1, GET, oss2); + caller.call("extsig", {"0"}, -1, GET, oss2); REQUIRE(oss2.str() == "extsig 0 trigger_in_rising_edge\n"); } { std::ostringstream oss1, oss2; - proxy.Call("extsig", {"0", "trigger_in_falling_edge"}, -1, PUT, - oss1); + caller.call("extsig", {"0", "trigger_in_falling_edge"}, -1, PUT, + oss1); REQUIRE(oss1.str() == "extsig 0 trigger_in_falling_edge\n"); - proxy.Call("extsig", {"0"}, -1, GET, oss2); + caller.call("extsig", {"0"}, -1, GET, oss2); REQUIRE(oss2.str() == "extsig 0 trigger_in_falling_edge\n"); } { std::ostringstream oss1, oss2; - proxy.Call("extsig", {"1", "inversion_off"}, -1, PUT, oss1); + caller.call("extsig", {"1", "inversion_off"}, -1, PUT, oss1); REQUIRE(oss1.str() == "extsig 1 inversion_off\n"); - proxy.Call("extsig", {"1"}, -1, GET, oss2); + caller.call("extsig", {"1"}, -1, GET, oss2); REQUIRE(oss2.str() == "extsig 1 inversion_off\n"); } { std::ostringstream oss1, oss2; - proxy.Call("extsig", {"1", "inversion_on"}, -1, PUT, oss1); + caller.call("extsig", {"1", "inversion_on"}, -1, PUT, oss1); REQUIRE(oss1.str() == "extsig 1 inversion_on\n"); - proxy.Call("extsig", {"1"}, -1, GET, oss2); + caller.call("extsig", {"1"}, -1, GET, oss2); REQUIRE(oss2.str() == "extsig 1 inversion_on\n"); } for (int i = 0; i != det.size(); ++i) { @@ -1622,13 +1648,13 @@ TEST_CASE("extsig", "[.cmd]") { det.setExternalSignalFlags(1, prev_val_1[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("extsig", {}, -1, GET)); + REQUIRE_THROWS(caller.call("extsig", {}, -1, GET)); } } -TEST_CASE("parallel", "[.cmd]") { +TEST_CASE("CALLER::parallel", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || @@ -1636,30 +1662,30 @@ TEST_CASE("parallel", "[.cmd]") { auto prev_val = det.getParallelMode(); { std::ostringstream oss; - proxy.Call("parallel", {"1"}, -1, PUT, oss); + caller.call("parallel", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "parallel 1\n"); } { std::ostringstream oss; - proxy.Call("parallel", {"0"}, -1, PUT, oss); + caller.call("parallel", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "parallel 0\n"); } { std::ostringstream oss; - proxy.Call("parallel", {}, -1, GET, oss); + caller.call("parallel", {}, -1, GET, oss); REQUIRE(oss.str() == "parallel 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setParallelMode(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("parallel", {}, -1, GET)); + REQUIRE_THROWS(caller.call("parallel", {}, -1, GET)); } } -TEST_CASE("filterresistor", "[.cmd]") { +TEST_CASE("CALLER::filterresistor", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); // only for chipv1.1 @@ -1673,87 +1699,87 @@ TEST_CASE("filterresistor", "[.cmd]") { auto prev_val = det.getFilterResistor(); { std::ostringstream oss; - proxy.Call("filterresistor", {"1"}, -1, PUT, oss); + caller.call("filterresistor", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "filterresistor 1\n"); } { std::ostringstream oss; - proxy.Call("filterresistor", {"0"}, -1, PUT, oss); + caller.call("filterresistor", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "filterresistor 0\n"); } { std::ostringstream oss; - proxy.Call("filterresistor", {}, -1, GET, oss); + caller.call("filterresistor", {}, -1, GET, oss); REQUIRE(oss.str() == "filterresistor 0\n"); } if (det_type == defs::GOTTHARD2) { - REQUIRE_NOTHROW(proxy.Call("filterresistor", {"2"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("filterresistor", {"3"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("filterresistor", {"2"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("filterresistor", {"3"}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("filterresistor", {"2"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("filterresistor", {"3"}, -1, PUT)); + REQUIRE_THROWS(caller.call("filterresistor", {"2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("filterresistor", {"3"}, -1, PUT)); } for (int i = 0; i != det.size(); ++i) { det.setFilterResistor(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("filterresistor", {}, -1, GET)); + REQUIRE_THROWS(caller.call("filterresistor", {}, -1, GET)); } } -TEST_CASE("dbitpipeline", "[.cmd]") { +TEST_CASE("CALLER::dbitpipeline", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::GOTTHARD2) { auto prev_val = det.getDBITPipeline(); { std::ostringstream oss; - proxy.Call("dbitpipeline", {"1"}, -1, PUT, oss); + caller.call("dbitpipeline", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "dbitpipeline 1\n"); } { std::ostringstream oss; - proxy.Call("dbitpipeline", {"0"}, -1, PUT, oss); + caller.call("dbitpipeline", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "dbitpipeline 0\n"); } if (det_type == defs::CHIPTESTBOARD) { { std::ostringstream oss; - proxy.Call("dbitpipeline", {"15"}, -1, PUT, oss); + caller.call("dbitpipeline", {"15"}, -1, PUT, oss); REQUIRE(oss.str() == "dbitpipeline 15\n"); } { std::ostringstream oss; - proxy.Call("dbitpipeline", {}, -1, GET, oss); + caller.call("dbitpipeline", {}, -1, GET, oss); REQUIRE(oss.str() == "dbitpipeline 15\n"); } - REQUIRE_THROWS(proxy.Call("dbitpipeline", {"256"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dbitpipeline", {"256"}, -1, PUT)); } else { { std::ostringstream oss; - proxy.Call("dbitpipeline", {"7"}, -1, PUT, oss); + caller.call("dbitpipeline", {"7"}, -1, PUT, oss); REQUIRE(oss.str() == "dbitpipeline 7\n"); } { std::ostringstream oss; - proxy.Call("dbitpipeline", {}, -1, GET, oss); + caller.call("dbitpipeline", {}, -1, GET, oss); REQUIRE(oss.str() == "dbitpipeline 7\n"); } - REQUIRE_THROWS(proxy.Call("dbitpipeline", {"8"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dbitpipeline", {"8"}, -1, PUT)); } for (int i = 0; i != det.size(); ++i) { det.setDBITPipeline(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("dbitpipeline", {}, -1, GET)); + REQUIRE_THROWS(caller.call("dbitpipeline", {}, -1, GET)); } } -TEST_CASE("readnrows", "[.cmd]") { +TEST_CASE("CALLER::readnrows", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { @@ -1766,46 +1792,46 @@ TEST_CASE("readnrows", "[.cmd]") { if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) && !hw2) { { std::ostringstream oss; - proxy.Call("readnrows", {}, -1, GET, oss); + caller.call("readnrows", {}, -1, GET, oss); REQUIRE(oss.str() == "readnrows 512\n"); } } else { auto prev_val = det.getReadNRows(); { std::ostringstream oss; - proxy.Call("readnrows", {"256"}, -1, PUT, oss); + caller.call("readnrows", {"256"}, -1, PUT, oss); REQUIRE(oss.str() == "readnrows 256\n"); } { std::ostringstream oss; - proxy.Call("readnrows", {}, -1, GET, oss); + caller.call("readnrows", {}, -1, GET, oss); REQUIRE(oss.str() == "readnrows 256\n"); } { std::ostringstream oss; - proxy.Call("readnrows", {"16"}, -1, PUT, oss); + caller.call("readnrows", {"16"}, -1, PUT, oss); REQUIRE(oss.str() == "readnrows 16\n"); } if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { - REQUIRE_THROWS(proxy.Call("readnrows", {"7"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readnrows", {"20"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readnrows", {"44"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readnrows", {"513"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("readnrows", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readnrows", {"7"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readnrows", {"20"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readnrows", {"44"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readnrows", {"513"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readnrows", {"1"}, -1, PUT)); } - REQUIRE_THROWS(proxy.Call("readnrows", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("readnrows", {"0"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setReadNRows(prev_val[i], {i}); } } } else { - REQUIRE_THROWS(proxy.Call("readnrows", {}, -1, GET)); + REQUIRE_THROWS(caller.call("readnrows", {}, -1, GET)); } } -TEST_CASE("currentsource", "[.cmd]") { +TEST_CASE("CALLER::currentsource", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2 || det_type == defs::JUNGFRAU) { @@ -1814,23 +1840,23 @@ TEST_CASE("currentsource", "[.cmd]") { if (det_type == defs::GOTTHARD2) { { std::ostringstream oss; - proxy.Call("currentsource", {"1"}, -1, PUT, oss); + caller.call("currentsource", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "currentsource [1]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", {"0"}, -1, PUT, oss); + caller.call("currentsource", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "currentsource [0]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", {}, -1, GET, oss); + caller.call("currentsource", {}, -1, GET, oss); REQUIRE(oss.str() == "currentsource [disabled]\n"); } REQUIRE_THROWS( - proxy.Call("currentsource", {"1", "fix", "42"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("currentsource", - {"1", "fix", "42", "normal"}, -1, PUT)); + caller.call("currentsource", {"1", "fix", "42"}, -1, PUT)); + REQUIRE_THROWS(caller.call("currentsource", + {"1", "fix", "42", "normal"}, -1, PUT)); } // jungfrau else { @@ -1841,94 +1867,94 @@ TEST_CASE("currentsource", "[.cmd]") { 10; } if (chipVersion == 10) { - REQUIRE_THROWS(proxy.Call("currentsource", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("currentsource", {"1"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("currentsource", {"1", "fix"}, -1, PUT)); + caller.call("currentsource", {"1", "fix"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("currentsource", {"1", "fix", "64"}, -1, PUT)); + caller.call("currentsource", {"1", "fix", "64"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("currentsource", {"1", "dfg", "64"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call( + caller.call("currentsource", {"1", "dfg", "64"}, -1, PUT)); + REQUIRE_THROWS(caller.call( "currentsource", {"1", "fix", "63", "normal"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("currentsource", {"1", "fix", "63"}, -1, PUT, - oss); + caller.call("currentsource", {"1", "fix", "63"}, -1, PUT, + oss); REQUIRE(oss.str() == "currentsource [1, fix, 63]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", {"0"}, -1, PUT, oss); + caller.call("currentsource", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "currentsource [0]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", {}, -1, GET, oss); + caller.call("currentsource", {}, -1, GET, oss); REQUIRE(oss.str() == "currentsource [disabled]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", {"1", "nofix", "63"}, -1, PUT, - oss); + caller.call("currentsource", {"1", "nofix", "63"}, -1, PUT, + oss); REQUIRE(oss.str() == "currentsource [1, nofix, 63]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", {}, -1, GET, oss); + caller.call("currentsource", {}, -1, GET, oss); REQUIRE(oss.str() == "currentsource [enabled, nofix, 63]\n"); } } // chipv1.1 else { - REQUIRE_THROWS(proxy.Call("currentsource", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("currentsource", {"1"}, -1, PUT)); REQUIRE_THROWS( - proxy.Call("currentsource", {"1", "fix"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call( + caller.call("currentsource", {"1", "fix"}, -1, PUT)); + REQUIRE_THROWS(caller.call( "currentsource", {"1", "ffgdfgix", "0x0000000000000041"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call( + REQUIRE_THROWS(caller.call( "currentsource", {"1", "fix", "0x0000000000000041", "normaldgf"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("currentsource", - {"1", "fix", "0x0000000000000041", "normal"}, -1, - PUT, oss); + caller.call("currentsource", + {"1", "fix", "0x0000000000000041", "normal"}, + -1, PUT, oss); REQUIRE( oss.str() == "currentsource [1, fix, 0x0000000000000041, normal]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", {"0"}, -1, PUT, oss); + caller.call("currentsource", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "currentsource [0]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", {}, -1, GET, oss); + caller.call("currentsource", {}, -1, GET, oss); REQUIRE(oss.str() == "currentsource [disabled]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", - {"1", "nofix", "0x0000000000000041", "normal"}, - -1, PUT, oss); + caller.call("currentsource", + {"1", "nofix", "0x0000000000000041", "normal"}, + -1, PUT, oss); REQUIRE(oss.str() == "currentsource [1, nofix, " "0x0000000000000041, normal]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", {}, -1, GET, oss); + caller.call("currentsource", {}, -1, GET, oss); REQUIRE(oss.str() == "currentsource [enabled, nofix, " "0x0000000000000041, normal]\n"); } { std::ostringstream oss; - proxy.Call("currentsource", - {"1", "nofix", "0x0000000000000041", "low"}, -1, - PUT, oss); + caller.call("currentsource", + {"1", "nofix", "0x0000000000000041", "low"}, -1, + PUT, oss); REQUIRE( oss.str() == "currentsource [1, nofix, 0x0000000000000041, low]\n"); @@ -1939,69 +1965,69 @@ TEST_CASE("currentsource", "[.cmd]") { det.setCurrentSource(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("currentsource", {}, -1, GET)); + REQUIRE_THROWS(caller.call("currentsource", {}, -1, GET)); } } /** temperature */ -TEST_CASE("templist", "[.cmd]") { +TEST_CASE("CALLER::templist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("templist", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("templist", {}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("templist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("templist", {}, -1, PUT)); } -TEST_CASE("tempvalues", "[.cmd]") { +TEST_CASE("CALLER::tempvalues", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("tempvalues", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("tempvalues", {}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("tempvalues", {}, -1, GET)); + REQUIRE_THROWS(caller.call("tempvalues", {}, -1, PUT)); } -TEST_CASE("temp_adc", "[.cmd]") { +TEST_CASE("CALLER::temp_adc", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::GOTTHARD) { - REQUIRE_NOTHROW(proxy.Call("temp_adc", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("temp_adc", {}, -1, GET)); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("temp_adc", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("temp_adc", {}, 0, GET, oss)); std::string s = (oss.str()).erase(0, strlen("temp_adc ")); REQUIRE(std::stoi(s) != -1); } else { - REQUIRE_THROWS(proxy.Call("temp_adc", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_adc", {}, -1, GET)); } } -TEST_CASE("temp_fpga", "[.cmd]") { +TEST_CASE("CALLER::temp_fpga", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type != defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("temp_fpga", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("temp_fpga", {}, -1, GET)); std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("temp_fpga", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("temp_fpga", {}, 0, GET, oss)); std::string s = (oss.str()).erase(0, strlen("temp_fpga ")); REQUIRE(std::stoi(s) != -1); } else { - REQUIRE_THROWS(proxy.Call("temp_fpga", {}, -1, GET)); + REQUIRE_THROWS(caller.call("temp_fpga", {}, -1, GET)); } } /* list */ -TEST_CASE("daclist", "[.cmd]") { +TEST_CASE("CALLER::daclist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_NOTHROW(proxy.Call("daclist", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("daclist", {}, -1, GET)); auto prev = det.getDacNames(); - REQUIRE_THROWS(proxy.Call("daclist", {"a", "s", "d"}, -1, PUT)); + REQUIRE_THROWS(caller.call("daclist", {"a", "s", "d"}, -1, PUT)); std::vector names; for (int iarg = 0; iarg != 18; ++iarg) { @@ -2009,38 +2035,38 @@ TEST_CASE("daclist", "[.cmd]") { } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("daclist", names, -1, PUT, oss)); + REQUIRE_NOTHROW(caller.call("daclist", names, -1, PUT, oss)); } { std::ostringstream oss; - REQUIRE_NOTHROW(proxy.Call("daclist", {}, -1, GET, oss)); + REQUIRE_NOTHROW(caller.call("daclist", {}, -1, GET, oss)); REQUIRE(oss.str() == std::string("daclist ") + ToString(names) + '\n'); } det.setDacNames(prev); } else { - REQUIRE_THROWS(proxy.Call("daclist", {"a", "b"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("daclist", {}, -1, GET)); + REQUIRE_THROWS(caller.call("daclist", {"a", "b"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("daclist", {}, -1, GET)); } } /* dacs */ -TEST_CASE("dacvalues", "[.cmd]") { +TEST_CASE("CALLER::dacvalues", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("dacvalues", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dacvalues", {}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("dacvalues", {}, -1, GET)); + REQUIRE_THROWS(caller.call("dacvalues", {}, -1, PUT)); } -TEST_CASE("defaultdac", "[.cmd]") { +TEST_CASE("CALLER::defaultdac", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type != defs::CHIPTESTBOARD) { - REQUIRE_THROWS(proxy.Call("defaultdac", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("defaultdac", {"blabla"}, -1, PUT)); + REQUIRE_THROWS(caller.call("defaultdac", {}, -1, GET)); + REQUIRE_THROWS(caller.call("defaultdac", {"blabla"}, -1, PUT)); auto daclist = det.getDacList(); for (auto it : daclist) { if (it == defs::VTHRESHOLD) { @@ -2050,13 +2076,13 @@ TEST_CASE("defaultdac", "[.cmd]") { auto prev_val = det.getDefaultDac(it); { std::ostringstream oss; - proxy.Call("defaultdac", {dacname, "1000"}, -1, PUT, oss); + caller.call("defaultdac", {dacname, "1000"}, -1, PUT, oss); REQUIRE(oss.str() == std::string("defaultdac ") + dacname + std::string(" 1000\n")); } { std::ostringstream oss; - proxy.Call("defaultdac", {dacname}, -1, GET, oss); + caller.call("defaultdac", {dacname}, -1, GET, oss); REQUIRE(oss.str() == std::string("defaultdac ") + dacname + std::string(" 1000\n")); } @@ -2072,14 +2098,14 @@ TEST_CASE("defaultdac", "[.cmd]") { auto prev_val = det.getDefaultDac(it, defs::GAIN0); { std::ostringstream oss; - proxy.Call("defaultdac", {dacname, "1000", "gain0"}, -1, - PUT, oss); + caller.call("defaultdac", {dacname, "1000", "gain0"}, -1, + PUT, oss); REQUIRE(oss.str() == std::string("defaultdac ") + dacname + std::string(" gain0 1000\n")); } { std::ostringstream oss; - proxy.Call("defaultdac", {dacname, "gain0"}, -1, GET, oss); + caller.call("defaultdac", {dacname, "gain0"}, -1, GET, oss); REQUIRE(oss.str() == std::string("defaultdac ") + dacname + std::string(" gain0 1000\n")); } @@ -2089,20 +2115,20 @@ TEST_CASE("defaultdac", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("defaultdac", {}, -1, GET)); + REQUIRE_THROWS(caller.call("defaultdac", {}, -1, GET)); } } -TEST_CASE("resetdacs", "[.cmd]") { +TEST_CASE("CALLER::resetdacs", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type != defs::CHIPTESTBOARD) { auto prev_val = det.getSettings(); - REQUIRE_THROWS(proxy.Call("resetdacs", {}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("resetdacs", {}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("resetdacs", {"hard"}, -1, PUT)); + REQUIRE_THROWS(caller.call("resetdacs", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("resetdacs", {}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("resetdacs", {"hard"}, -1, PUT)); // settings should not change especially for jungfrau/moench and m3 auto next_val = det.getSettings(); @@ -2110,20 +2136,20 @@ TEST_CASE("resetdacs", "[.cmd]") { REQUIRE(prev_val[i] == next_val[i]); } } else { - REQUIRE_THROWS(proxy.Call("resetdacs", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("resetdacs", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("resetdacs", {}, -1, GET)); + REQUIRE_THROWS(caller.call("resetdacs", {}, -1, PUT)); } } /* acquisition */ -TEST_CASE("trigger", "[.cmd]") { +TEST_CASE("CALLER::trigger", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("trigger", {}, -1, GET)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("trigger", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { - REQUIRE_NOTHROW(proxy.Call("trigger", {}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("trigger", {}, -1, PUT)); } else if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_timing = @@ -2143,7 +2169,7 @@ TEST_CASE("trigger", "[.cmd]") { det.startDetector(); { std::ostringstream oss; - proxy.Call("trigger", {}, -1, PUT, oss); + caller.call("trigger", {}, -1, PUT, oss); REQUIRE(oss.str() == "trigger successful\n"); } std::this_thread::sleep_for(std::chrono::seconds(2)); @@ -2156,14 +2182,14 @@ TEST_CASE("trigger", "[.cmd]") { det.setExptime(prev_exptime); det.setPeriod(prev_period); } else { - REQUIRE_THROWS(proxy.Call("trigger", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("trigger", {}, -1, PUT)); } } -TEST_CASE("blockingtrigger", "[.cmd]") { +TEST_CASE("CALLER::blockingtrigger", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, GET)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("blockingtrigger", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { @@ -2184,7 +2210,7 @@ TEST_CASE("blockingtrigger", "[.cmd]") { det.startDetector(); { std::ostringstream oss; - proxy.Call("blockingtrigger", {}, -1, PUT, oss); + caller.call("blockingtrigger", {}, -1, PUT, oss); REQUIRE(oss.str() == "blockingtrigger successful\n"); } if (det.isVirtualDetectorServer().tsquash( @@ -2200,23 +2226,23 @@ TEST_CASE("blockingtrigger", "[.cmd]") { det.setExptime(prev_exptime); det.setPeriod(prev_period); } else { - REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("blockingtrigger", {}, -1, PUT)); } } -TEST_CASE("clearbusy", "[.cmd]") { +TEST_CASE("CALLER::clearbusy", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("clearbusy", {}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("clearbusy", {"0"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("clearbusy", {}, -1, GET)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("clearbusy", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("clearbusy", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("clearbusy", {}, -1, GET)); } -TEST_CASE("start", "[.cmd]") { +TEST_CASE("CALLER::start", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); // PUT only command - REQUIRE_THROWS(proxy.Call("start", {}, -1, GET)); + REQUIRE_THROWS(caller.call("start", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); std::chrono::nanoseconds prev_val; if (det_type != defs::MYTHEN3) { @@ -2237,12 +2263,12 @@ TEST_CASE("start", "[.cmd]") { det.setNumberOfFrames(2000); { std::ostringstream oss; - proxy.Call("start", {}, -1, PUT, oss); + caller.call("start", {}, -1, PUT, oss); REQUIRE(oss.str() == "start successful\n"); } if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { std::ostringstream oss; - proxy.Call("status", {}, -1, GET, oss); + caller.call("status", {}, -1, GET, oss); REQUIRE(oss.str() == "status running\n"); } det.stopDetector(); @@ -2251,11 +2277,11 @@ TEST_CASE("start", "[.cmd]") { det.setNumberOfFrames(prev_frames); } -TEST_CASE("stop", "[.cmd]") { +TEST_CASE("CALLER::stop", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); // PUT only command - REQUIRE_THROWS(proxy.Call("stop", {}, -1, GET)); + REQUIRE_THROWS(caller.call("stop", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); std::chrono::nanoseconds prev_val; if (det_type != defs::MYTHEN3) { @@ -2277,17 +2303,17 @@ TEST_CASE("stop", "[.cmd]") { det.startDetector(); if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { std::ostringstream oss; - proxy.Call("status", {}, -1, GET, oss); + caller.call("status", {}, -1, GET, oss); REQUIRE(oss.str() == "status running\n"); } { std::ostringstream oss; - proxy.Call("stop", {}, -1, PUT, oss); + caller.call("stop", {}, -1, PUT, oss); REQUIRE(oss.str() == "stop successful\n"); } { std::ostringstream oss; - proxy.Call("status", {}, -1, GET, oss); + caller.call("status", {}, -1, GET, oss); REQUIRE(((oss.str() == "status stopped\n") || (oss.str() == "status idle\n"))); } @@ -2296,9 +2322,9 @@ TEST_CASE("stop", "[.cmd]") { det.setNumberOfFrames(prev_frames); } -TEST_CASE("status", "[.cmd]") { +TEST_CASE("CALLER::status", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); std::chrono::nanoseconds prev_val; if (det_type != defs::MYTHEN3) { @@ -2320,13 +2346,13 @@ TEST_CASE("status", "[.cmd]") { det.startDetector(); if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { std::ostringstream oss; - proxy.Call("status", {}, -1, GET, oss); + caller.call("status", {}, -1, GET, oss); REQUIRE(oss.str() == "status running\n"); } det.stopDetector(); { std::ostringstream oss; - proxy.Call("status", {}, -1, GET, oss); + caller.call("status", {}, -1, GET, oss); REQUIRE(((oss.str() == "status stopped\n") || (oss.str() == "status idle\n"))); } @@ -2335,27 +2361,27 @@ TEST_CASE("status", "[.cmd]") { det.setNumberOfFrames(prev_frames); } -TEST_CASE("nextframenumber", "[.cmd]") { +TEST_CASE("CALLER::nextframenumber", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD) { auto prev_sfnum = det.getNextFrameNumber(); - REQUIRE_THROWS(proxy.Call("nextframenumber", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("nextframenumber", {"0"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("nextframenumber", {"3"}, -1, PUT, oss); + caller.call("nextframenumber", {"3"}, -1, PUT, oss); REQUIRE(oss.str() == "nextframenumber 3\n"); } { std::ostringstream oss; - proxy.Call("nextframenumber", {}, -1, GET, oss); + caller.call("nextframenumber", {}, -1, GET, oss); REQUIRE(oss.str() == "nextframenumber 3\n"); } { std::ostringstream oss; - proxy.Call("nextframenumber", {"1"}, -1, PUT, oss); + caller.call("nextframenumber", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "nextframenumber 1\n"); } @@ -2397,13 +2423,13 @@ TEST_CASE("nextframenumber", "[.cmd]") { det.setNextFrameNumber(prev_sfnum[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("nextframenumber", {}, -1, GET)); + REQUIRE_THROWS(caller.call("nextframenumber", {}, -1, GET)); } } -TEST_CASE("scan", "[.cmd]") { +TEST_CASE("CALLER::scan", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); defs::dacIndex ind = defs::DAC_0; defs::dacIndex notImplementedInd = defs::DAC_0; auto det_type = det.getDetectorType().squash(); @@ -2449,67 +2475,67 @@ TEST_CASE("scan", "[.cmd]") { } else { { std::ostringstream oss; - proxy.Call("scan", {ToString(ind), "500", "1500", "500"}, -1, PUT, - oss); + caller.call("scan", {ToString(ind), "500", "1500", "500"}, -1, PUT, + oss); CHECK(oss.str() == "scan [" + ToString(ind) + ", 500, 1500, 500]\n"); } { std::ostringstream oss; - proxy.Call("scan", {}, -1, GET, oss); + caller.call("scan", {}, -1, GET, oss); CHECK(oss.str() == "scan [enabled\ndac " + ToString(ind) + "\nstart 500\nstop 1500\nstep " "500\nsettleTime 1ms\n]\n"); } { std::ostringstream oss; - proxy.Call("scan", {ToString(ind), "500", "1500", "500", "2s"}, -1, - PUT, oss); + caller.call("scan", {ToString(ind), "500", "1500", "500", "2s"}, -1, + PUT, oss); CHECK(oss.str() == "scan [" + ToString(ind) + ", 500, 1500, 500, 2s]\n"); } { std::ostringstream oss; - proxy.Call("scan", {}, -1, GET, oss); + caller.call("scan", {}, -1, GET, oss); CHECK(oss.str() == "scan [enabled\ndac " + ToString(ind) + "\nstart 500\nstop 1500\nstep " "500\nsettleTime 2s\n]\n"); } { std::ostringstream oss; - proxy.Call("scan", {"0"}, -1, PUT, oss); + caller.call("scan", {"0"}, -1, PUT, oss); CHECK(oss.str() == "scan [0]\n"); } { std::ostringstream oss; - proxy.Call("scan", {}, -1, GET, oss); + caller.call("scan", {}, -1, GET, oss); CHECK(oss.str() == "scan [disabled]\n"); } { std::ostringstream oss; - proxy.Call("scan", {ToString(ind), "1500", "500", "-500"}, -1, PUT, - oss); + caller.call("scan", {ToString(ind), "1500", "500", "-500"}, -1, PUT, + oss); CHECK(oss.str() == "scan [" + ToString(ind) + ", 1500, 500, -500]\n"); } - CHECK_THROWS(proxy.Call( + CHECK_THROWS(caller.call( "scan", {ToString(notImplementedInd), "500", "1500", "500"}, -1, PUT)); - CHECK_THROWS(proxy.Call("scan", {ToString(ind), "500", "1500", "-500"}, - -1, PUT)); - CHECK_THROWS( - proxy.Call("scan", {ToString(ind), "1500", "500", "500"}, -1, PUT)); + CHECK_THROWS(caller.call("scan", {ToString(ind), "500", "1500", "-500"}, + -1, PUT)); + CHECK_THROWS(caller.call("scan", {ToString(ind), "1500", "500", "500"}, + -1, PUT)); if (det_type == defs::MYTHEN3 || defs::EIGER) { { std::ostringstream oss; - proxy.Call("scan", {"trimbits", "0", "63", "16", "2s"}, -1, PUT, - oss); + caller.call("scan", {"trimbits", "0", "63", "16", "2s"}, -1, + PUT, oss); CHECK(oss.str() == "scan [trimbits, 0, 63, 16, 2s]\n"); } { std::ostringstream oss; - proxy.Call("scan", {}, -1, GET, oss); + caller.call("scan", {}, -1, GET, oss); CHECK(oss.str() == "scan [enabled\ndac trimbits\nstart 0\nstop 48\nstep " "16\nsettleTime 2s\n]\n"); @@ -2530,63 +2556,63 @@ TEST_CASE("scan", "[.cmd]") { } } -TEST_CASE("scanerrmsg", "[.cmd]") { +TEST_CASE("CALLER::scanerrmsg", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("scanerrmsg", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("scanerrmsg", {""}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("scanerrmsg", {}, -1, GET)); + REQUIRE_THROWS(caller.call("scanerrmsg", {""}, -1, PUT)); } /* Network Configuration (Detector<->Receiver) */ -TEST_CASE("numinterfaces", "[.cmd]") { +TEST_CASE("CALLER::numinterfaces", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getNumberofUDPInterfaces().tsquash( "inconsistent numinterfaces to test"); { std::ostringstream oss; - proxy.Call("numinterfaces", {"2"}, -1, PUT, oss); + caller.call("numinterfaces", {"2"}, -1, PUT, oss); REQUIRE(oss.str() == "numinterfaces 2\n"); } { std::ostringstream oss; - proxy.Call("numinterfaces", {"1"}, -1, PUT, oss); + caller.call("numinterfaces", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "numinterfaces 1\n"); } { std::ostringstream oss; - proxy.Call("numinterfaces", {}, -1, GET, oss); + caller.call("numinterfaces", {}, -1, GET, oss); REQUIRE(oss.str() == "numinterfaces 1\n"); } det.setNumberofUDPInterfaces(prev_val); } else if (det_type == defs::EIGER) { - REQUIRE_THROWS(proxy.Call("numinterfaces", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("numinterfaces", {"1"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("numinterfaces", {}, -1, GET, oss); + caller.call("numinterfaces", {}, -1, GET, oss); REQUIRE(oss.str() == "numinterfaces 2\n"); } } else { std::ostringstream oss; - proxy.Call("numinterfaces", {}, -1, GET, oss); + caller.call("numinterfaces", {}, -1, GET, oss); REQUIRE(oss.str() == "numinterfaces 1\n"); - REQUIRE_THROWS(proxy.Call("numinterfaces", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("numinterfaces", {"1"}, -1, PUT)); } - REQUIRE_THROWS(proxy.Call("numinterfaces", {"3"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("numinterfaces", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("numinterfaces", {"3"}, -1, PUT)); + REQUIRE_THROWS(caller.call("numinterfaces", {"0"}, -1, PUT)); } -TEST_CASE("udp_srcip", "[.cmd]") { +TEST_CASE("CALLER::udp_srcip", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getSourceUDPIP(); - REQUIRE_THROWS(proxy.Call("udp_srcip", {"0.0.0.0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("udp_srcip", {"0.0.0.0"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("udp_srcip", {"129.129.205.12"}, -1, PUT, oss); + caller.call("udp_srcip", {"129.129.205.12"}, -1, PUT, oss); REQUIRE(oss.str() == "udp_srcip 129.129.205.12\n"); } for (int i = 0; i != det.size(); ++i) { @@ -2594,91 +2620,91 @@ TEST_CASE("udp_srcip", "[.cmd]") { } } -TEST_CASE("udp_dstlist", "[.cmd]") { +TEST_CASE("CALLER::udp_dstlist", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { - REQUIRE_NOTHROW(proxy.Call("udp_dstlist", {}, 0, GET, std::cout, 0)); - REQUIRE_THROWS(proxy.Call( + REQUIRE_NOTHROW(caller.call("udp_dstlist", {}, 0, GET, std::cout, 0)); + REQUIRE_THROWS(caller.call( "udp_dstlist", {"ip=0.0.0.0", "mac=00:00:00:00:00:00", "port=1233"}, -1, PUT, std::cout, 0)); } else { - REQUIRE_THROWS(proxy.Call("udp_dstlist", {}, -1, GET, std::cout, 0)); + REQUIRE_THROWS(caller.call("udp_dstlist", {}, -1, GET, std::cout, 0)); } } -TEST_CASE("udp_numdst", "[.cmd]") { +TEST_CASE("CALLER::udp_numdst", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { - REQUIRE_NOTHROW(proxy.Call("udp_numdst", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("udp_numdst", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("udp_numdst", {}, -1, GET)); + REQUIRE_THROWS(caller.call("udp_numdst", {}, -1, GET)); } } -TEST_CASE("udp_cleardst", "[.cmd]") { +TEST_CASE("CALLER::udp_cleardst", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("udp_cleardst", {}, -1, GET)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("udp_cleardst", {}, -1, GET)); /* dont clear all udp destinations */ - /*REQUIRE_NOTHROW(proxy.Call("udp_cleardst", {}, -1, PUT));*/ + /*REQUIRE_NOTHROW(caller.call("udp_cleardst", {}, -1, PUT));*/ } -TEST_CASE("udp_firstdst", "[.cmd]") { +TEST_CASE("CALLER::udp_firstdst", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { auto prev_val = det.getFirstUDPDestination(); { std::ostringstream oss; - proxy.Call("udp_firstdst", {"0"}, -1, PUT, oss); + caller.call("udp_firstdst", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "udp_firstdst 0\n"); } { std::ostringstream oss; - proxy.Call("udp_firstdst", {}, -1, GET, oss); + caller.call("udp_firstdst", {}, -1, GET, oss); REQUIRE(oss.str() == "udp_firstdst 0\n"); } /* { std::ostringstream oss; - proxy.Call("udp_firstdst", {"1"}, -1, PUT, oss); + caller.call("udp_firstdst", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "udp_firstdst 1\n"); } */ - REQUIRE_THROWS(proxy.Call("udp_firstdst", {"33"}, -1, PUT)); + REQUIRE_THROWS(caller.call("udp_firstdst", {"33"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setFirstUDPDestination(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("udp_firstdst", {}, -1, GET)); + REQUIRE_THROWS(caller.call("udp_firstdst", {}, -1, GET)); } } -TEST_CASE("udp_dstip", "[.cmd]") { +TEST_CASE("CALLER::udp_dstip", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("udp_dstip", {"0.0.0.0"}, -1, PUT)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("udp_dstip", {"0.0.0.0"}, -1, PUT)); } -TEST_CASE("udp_srcmac", "[.cmd]") { +TEST_CASE("CALLER::udp_srcmac", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getSourceUDPMAC(); - REQUIRE_THROWS(proxy.Call("udp_srcmac", {"00:00:00:00:00:00"}, -1, PUT)); + REQUIRE_THROWS(caller.call("udp_srcmac", {"00:00:00:00:00:00"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("udp_srcmac", {"00:50:c2:42:34:12"}, -1, PUT, oss); + caller.call("udp_srcmac", {"00:50:c2:42:34:12"}, -1, PUT, oss); REQUIRE(oss.str() == "udp_srcmac 00:50:c2:42:34:12\n"); } for (int i = 0; i != det.size(); ++i) { @@ -2688,43 +2714,44 @@ TEST_CASE("udp_srcmac", "[.cmd]") { } } -TEST_CASE("udp_dstmac", "[.cmd]") { +TEST_CASE("CALLER::udp_dstmac", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("udp_dstmac", {"00:00:00:00:00:00"}, -1, PUT)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("udp_dstmac", {"00:00:00:00:00:00"}, -1, PUT)); } -TEST_CASE("udp_dstport", "[.cmd]") { +TEST_CASE("CALLER::udp_dstport", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getDestinationUDPPort(); { std::ostringstream oss; - proxy.Call("udp_dstport", {"50084"}, -1, PUT, oss); + caller.call("udp_dstport", {"50084"}, -1, PUT, oss); REQUIRE(oss.str() == "udp_dstport 50084\n"); } - test_valid_port("udp_dstport", {}, -1, PUT); - test_valid_port("udp_dstport", {}, 0, PUT); + test_valid_port_caller("udp_dstport", {}, -1, PUT); + test_valid_port_caller("udp_dstport", {}, 0, PUT); // should fail for the second module if (det.size() > 1) { - REQUIRE_THROWS(proxy.Call("udp_dstport", {"65535"}, -1, PUT)); + REQUIRE_THROWS(caller.call("udp_dstport", {"65535"}, -1, PUT)); } + for (int i = 0; i != det.size(); ++i) { det.setDestinationUDPPort(prev_val[i], {i}); } } -TEST_CASE("udp_srcip2", "[.cmd]") { +TEST_CASE("CALLER::udp_srcip2", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::GOTTHARD2) { auto prev_val = det.getSourceUDPIP2(); - REQUIRE_THROWS(proxy.Call("udp_srcip2", {"0.0.0.0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("udp_srcip2", {"0.0.0.0"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("udp_srcip2", {"129.129.205.12"}, -1, PUT, oss); + caller.call("udp_srcip2", {"129.129.205.12"}, -1, PUT, oss); REQUIRE(oss.str() == "udp_srcip2 129.129.205.12\n"); } for (int i = 0; i != det.size(); ++i) { @@ -2732,34 +2759,34 @@ TEST_CASE("udp_srcip2", "[.cmd]") { det.setSourceUDPIP2(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("udp_srcip2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("udp_srcip2", {}, -1, GET)); } } -TEST_CASE("udp_dstip2", "[.cmd]") { +TEST_CASE("CALLER::udp_dstip2", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::GOTTHARD2) { - REQUIRE_THROWS(proxy.Call("udp_dstip2", {"0.0.0.0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("udp_dstip2", {"0.0.0.0"}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("udp_dstip2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("udp_dstip2", {}, -1, GET)); } } -TEST_CASE("udp_srcmac2", "[.cmd]") { +TEST_CASE("CALLER::udp_srcmac2", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::GOTTHARD2) { auto prev_val = det.getSourceUDPMAC2(); REQUIRE_THROWS( - proxy.Call("udp_srcmac2", {"00:00:00:00:00:00"}, -1, PUT)); + caller.call("udp_srcmac2", {"00:00:00:00:00:00"}, -1, PUT)); { std::ostringstream oss; - proxy.Call("udp_srcmac2", {"00:50:c2:42:34:12"}, -1, PUT, oss); + caller.call("udp_srcmac2", {"00:50:c2:42:34:12"}, -1, PUT, oss); REQUIRE(oss.str() == "udp_srcmac2 00:50:c2:42:34:12\n"); } for (int i = 0; i != det.size(); ++i) { @@ -2768,41 +2795,40 @@ TEST_CASE("udp_srcmac2", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("udp_srcmac2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("udp_srcmac2", {}, -1, GET)); } } -TEST_CASE("udp_dstmac2", "[.cmd]") { +TEST_CASE("CALLER::udp_dstmac2", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::GOTTHARD2) { REQUIRE_THROWS( - proxy.Call("udp_dstmac2", {"00:00:00:00:00:00"}, -1, PUT)); + caller.call("udp_dstmac2", {"00:00:00:00:00:00"}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("udp_dstmac2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("udp_dstmac2", {}, -1, GET)); } } -TEST_CASE("udp_dstport2", "[.cmd]") { +TEST_CASE("CALLER::udp_dstport2", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::GOTTHARD2 || det_type == defs::EIGER) { auto prev_val = det.getDestinationUDPPort2(); { std::ostringstream oss; - proxy.Call("udp_dstport2", {"50084"}, -1, PUT, oss); + caller.call("udp_dstport2", {"50084"}, -1, PUT, oss); REQUIRE(oss.str() == "udp_dstport2 50084\n"); } - - test_valid_port("udp_dstport2", {}, -1, PUT); - test_valid_port("udp_dstport2", {}, 0, PUT); + test_valid_port_caller("udp_dstport2", {}, -1, PUT); + test_valid_port_caller("udp_dstport2", {}, 0, PUT); // should fail for the second module if (det.size() > 1) { - REQUIRE_THROWS(proxy.Call("udp_dstport2", {"65535"}, -1, PUT)); + REQUIRE_THROWS(caller.call("udp_dstport2", {"65535"}, -1, PUT)); } for (int i = 0; i != det.size(); ++i) { @@ -2811,27 +2837,27 @@ TEST_CASE("udp_dstport2", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("udp_dstport2", {}, -1, GET)); + REQUIRE_THROWS(caller.call("udp_dstport2", {}, -1, GET)); } } -TEST_CASE("udp_reconfigure", "[.cmd]") { +TEST_CASE("CALLER::udp_reconfigure", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("udp_reconfigure", {}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("udp_reconfigure", {}, -1, PUT)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("udp_reconfigure", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("udp_reconfigure", {}, -1, PUT)); } -TEST_CASE("udp_validate", "[.cmd]") { +TEST_CASE("CALLER::udp_validate", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_THROWS(proxy.Call("udp_validate", {}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("udp_validate", {}, -1, PUT)); + Caller caller(&det); + REQUIRE_THROWS(caller.call("udp_validate", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("udp_validate", {}, -1, PUT)); } -TEST_CASE("tengiga", "[.cmd]") { +TEST_CASE("CALLER::tengiga", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::CHIPTESTBOARD || @@ -2840,22 +2866,22 @@ TEST_CASE("tengiga", "[.cmd]") { det.setTenGiga(false); std::ostringstream oss1, oss2; - proxy.Call("tengiga", {"1"}, -1, PUT, oss1); + caller.call("tengiga", {"1"}, -1, PUT, oss1); REQUIRE(oss1.str() == "tengiga 1\n"); - proxy.Call("tengiga", {}, -1, GET, oss2); + caller.call("tengiga", {}, -1, GET, oss2); REQUIRE(oss2.str() == "tengiga 1\n"); for (int i = 0; i != det.size(); ++i) { det.setTenGiga(tengiga[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("tengiga", {}, -1, GET)); + REQUIRE_THROWS(caller.call("tengiga", {}, -1, GET)); } } -TEST_CASE("flowcontrol10g", "[.cmd]") { +TEST_CASE("CALLER::flowcontrol10g", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || @@ -2863,30 +2889,30 @@ TEST_CASE("flowcontrol10g", "[.cmd]") { auto prev_val = det.getTenGigaFlowControl(); { std::ostringstream oss; - proxy.Call("flowcontrol10g", {"1"}, -1, PUT, oss); + caller.call("flowcontrol10g", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "flowcontrol10g 1\n"); } { std::ostringstream oss; - proxy.Call("flowcontrol10g", {"0"}, -1, PUT, oss); + caller.call("flowcontrol10g", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "flowcontrol10g 0\n"); } { std::ostringstream oss; - proxy.Call("flowcontrol10g", {}, -1, GET, oss); + caller.call("flowcontrol10g", {}, -1, GET, oss); REQUIRE(oss.str() == "flowcontrol10g 0\n"); } for (int i = 0; i != det.size(); ++i) { det.setTenGigaFlowControl(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("flowcontrol10g", {}, -1, GET)); + REQUIRE_THROWS(caller.call("flowcontrol10g", {}, -1, GET)); } } -TEST_CASE("txdelay_frame", "[.cmd]") { +TEST_CASE("CALLER::txdelay_frame", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::MYTHEN3) { @@ -2899,22 +2925,22 @@ TEST_CASE("txdelay_frame", "[.cmd]") { std::string sval = std::to_string(val); { std::ostringstream oss1, oss2; - proxy.Call("txdelay_frame", {sval}, -1, PUT, oss1); + caller.call("txdelay_frame", {sval}, -1, PUT, oss1); REQUIRE(oss1.str() == "txdelay_frame " + sval + "\n"); - proxy.Call("txdelay_frame", {}, -1, GET, oss2); + caller.call("txdelay_frame", {}, -1, GET, oss2); REQUIRE(oss2.str() == "txdelay_frame " + sval + "\n"); } for (int i = 0; i != det.size(); ++i) { det.setTransmissionDelayFrame(prev_val[i]); } } else { - REQUIRE_THROWS(proxy.Call("txdelay_frame", {}, -1, GET)); + REQUIRE_THROWS(caller.call("txdelay_frame", {}, -1, GET)); } } -TEST_CASE("txdelay", "[.cmd]") { +TEST_CASE("CALLER::txdelay", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::MYTHEN3) { @@ -2923,12 +2949,12 @@ TEST_CASE("txdelay", "[.cmd]") { if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::MYTHEN3) && (det.size() < 2)) { - REQUIRE_THROWS(proxy.Call("txdelay", {}, -1, GET)); + REQUIRE_THROWS(caller.call("txdelay", {}, -1, GET)); int val = 5; std::string sval = std::to_string(val); { std::ostringstream oss1; - proxy.Call("txdelay", {sval}, -1, PUT, oss1); + caller.call("txdelay", {sval}, -1, PUT, oss1); REQUIRE(oss1.str() == "txdelay " + sval + "\n"); } } @@ -2950,9 +2976,9 @@ TEST_CASE("txdelay", "[.cmd]") { std::string sval = std::to_string(val); { std::ostringstream oss1, oss2; - proxy.Call("txdelay", {sval}, -1, PUT, oss1); + caller.call("txdelay", {sval}, -1, PUT, oss1); REQUIRE(oss1.str() == "txdelay " + sval + "\n"); - proxy.Call("txdelay", {}, -1, GET, oss2); + caller.call("txdelay", {}, -1, GET, oss2); REQUIRE(oss2.str() == "txdelay " + sval + "\n"); } // test other mods @@ -2970,8 +2996,8 @@ TEST_CASE("txdelay", "[.cmd]") { } } // not a module level command - REQUIRE_THROWS(proxy.Call("txdelay", {"5"}, 0, PUT)); - REQUIRE_THROWS(proxy.Call("txdelay", {}, 0, GET)); + REQUIRE_THROWS(caller.call("txdelay", {"5"}, 0, PUT)); + REQUIRE_THROWS(caller.call("txdelay", {}, 0, GET)); for (int i = 0; i != det.size(); ++i) { if (eiger) { @@ -2982,15 +3008,15 @@ TEST_CASE("txdelay", "[.cmd]") { } } } else { - REQUIRE_THROWS(proxy.Call("txdelay", {}, -1, GET)); + REQUIRE_THROWS(caller.call("txdelay", {}, -1, GET)); } } /* ZMQ Streaming Parameters (Receiver<->Client) */ -TEST_CASE("zmqport", "[.cmd]") { +TEST_CASE("CALLER::zmqport", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); int socketsperdetector = 1; auto det_type = det.getDetectorType().squash(); @@ -3006,12 +3032,12 @@ TEST_CASE("zmqport", "[.cmd]") { auto port_str = std::to_string(port); { std::ostringstream oss; - proxy.Call("zmqport", {port_str}, -1, PUT, oss); + caller.call("zmqport", {port_str}, -1, PUT, oss); REQUIRE(oss.str() == "zmqport " + port_str + '\n'); } for (int i = 0; i != det.size(); ++i) { std::ostringstream oss; - proxy.Call("zmqport", {}, i, GET, oss); + caller.call("zmqport", {}, i, GET, oss); REQUIRE(oss.str() == "zmqport " + std::to_string(port + i * socketsperdetector) + '\n'); @@ -3021,36 +3047,37 @@ TEST_CASE("zmqport", "[.cmd]") { port_str = std::to_string(port); { std::ostringstream oss; - proxy.Call("zmqport", {port_str}, -1, PUT, oss); + caller.call("zmqport", {port_str}, -1, PUT, oss); REQUIRE(oss.str() == "zmqport " + port_str + '\n'); } for (int i = 0; i != det.size(); ++i) { std::ostringstream oss; - proxy.Call("zmqport", {}, i, GET, oss); + caller.call("zmqport", {}, i, GET, oss); REQUIRE(oss.str() == "zmqport " + std::to_string(port + i * socketsperdetector) + '\n'); } - test_valid_port("zmqport", {}, -1, PUT); - test_valid_port("zmqport", {}, 0, PUT); + test_valid_port_caller("zmqport", {}, -1, PUT); + test_valid_port_caller("zmqport", {}, 0, PUT); // should fail for the second module if (det.size() > 1) { - REQUIRE_THROWS(proxy.Call("zmqport", {"65535"}, -1, PUT)); + REQUIRE_THROWS(caller.call("zmqport", {"65535"}, -1, PUT)); } + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { det.setNumberofUDPInterfaces(prev); } } -TEST_CASE("zmqip", "[.cmd]") { +TEST_CASE("CALLER::zmqip", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); std::ostringstream oss1, oss2; auto zmqip = det.getClientZmqIp(); - proxy.Call("zmqip", {}, 0, GET, oss1); + caller.call("zmqip", {}, 0, GET, oss1); REQUIRE(oss1.str() == "zmqip " + zmqip[0].str() + '\n'); - proxy.Call("zmqip", {zmqip[0].str()}, 0, PUT, oss2); + caller.call("zmqip", {zmqip[0].str()}, 0, PUT, oss2); REQUIRE(oss2.str() == "zmqip " + zmqip[0].str() + '\n'); for (int i = 0; i != det.size(); ++i) { @@ -3058,28 +3085,28 @@ TEST_CASE("zmqip", "[.cmd]") { } } -TEST_CASE("zmqhwm", "[.cmd]") { +TEST_CASE("CALLER::zmqhwm", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getClientZmqHwm(); { std::ostringstream oss; - proxy.Call("zmqhwm", {"50"}, -1, PUT, oss); + caller.call("zmqhwm", {"50"}, -1, PUT, oss); REQUIRE(oss.str() == "zmqhwm 50\n"); } { std::ostringstream oss; - proxy.Call("zmqhwm", {}, -1, GET, oss); + caller.call("zmqhwm", {}, -1, GET, oss); REQUIRE(oss.str() == "zmqhwm 50\n"); } { std::ostringstream oss; - proxy.Call("zmqhwm", {"0"}, -1, PUT, oss); + caller.call("zmqhwm", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "zmqhwm 0\n"); } { std::ostringstream oss; - proxy.Call("zmqhwm", {"-1"}, -1, PUT, oss); + caller.call("zmqhwm", {"-1"}, -1, PUT, oss); REQUIRE(oss.str() == "zmqhwm -1\n"); } det.setClientZmqHwm(prev_val); @@ -3087,129 +3114,129 @@ TEST_CASE("zmqhwm", "[.cmd]") { /* Advanced */ -TEST_CASE("adcpipeline", "[.cmd]") { +TEST_CASE("CALLER::adcpipeline", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { auto prev_val = det.getADCPipeline(); { std::ostringstream oss; - proxy.Call("adcpipeline", {"1"}, -1, PUT, oss); + caller.call("adcpipeline", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "adcpipeline 1\n"); } { std::ostringstream oss; - proxy.Call("adcpipeline", {"0"}, -1, PUT, oss); + caller.call("adcpipeline", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "adcpipeline 0\n"); } { std::ostringstream oss; - proxy.Call("adcpipeline", {"15"}, -1, PUT, oss); + caller.call("adcpipeline", {"15"}, -1, PUT, oss); REQUIRE(oss.str() == "adcpipeline 15\n"); } { std::ostringstream oss; - proxy.Call("adcpipeline", {}, -1, GET, oss); + caller.call("adcpipeline", {}, -1, GET, oss); REQUIRE(oss.str() == "adcpipeline 15\n"); } for (int i = 0; i != det.size(); ++i) { det.setADCPipeline(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("adcpipeline", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adcpipeline", {}, -1, GET)); } } -TEST_CASE("programfpga", "[.cmd]") { +TEST_CASE("CALLER::programfpga", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { // TODO program a real board? /// afs/psi.ch/project/sls_det_firmware/jungfrau_firmware/cyclone_V/v0_8/Jungfrau_MCB.pof - REQUIRE_THROWS(proxy.Call("programfpga", {}, -1, GET)); + REQUIRE_THROWS(caller.call("programfpga", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("programfpga", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("programfpga", {"/tmp/test.pof"}, -1, PUT)); + REQUIRE_THROWS(caller.call("programfpga", {}, -1, GET)); + REQUIRE_THROWS(caller.call("programfpga", {"/tmp/test.pof"}, -1, PUT)); } } -TEST_CASE("resetfpga", "[.cmd]") { +TEST_CASE("CALLER::resetfpga", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { // reset will also reset udp info from config file (comment out for - // invdividual tests) std::ostringstream oss; proxy.Call("resetfpga", + // invdividual tests) std::ostringstream oss; caller.call("resetfpga", // {}, -1, PUT, oss); REQUIRE(oss.str() == "resetfpga successful\n"); - REQUIRE_THROWS(proxy.Call("resetfpga", {}, -1, GET)); + REQUIRE_THROWS(caller.call("resetfpga", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("resetfpga", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("resetfpga", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("resetfpga", {}, -1, GET)); + REQUIRE_THROWS(caller.call("resetfpga", {}, -1, PUT)); } } -TEST_CASE("updatekernel", "[.cmd]") { +TEST_CASE("CALLER::updatekernel", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { // TODO: send real server? // std::ostringstream oss; - // proxy.Call("updatekernel",{"juImage_detector.lzma", + // caller.call("updatekernel",{"juImage_detector.lzma", // "pc13784"}, -1, PUT, oss); // REQUIRE(oss.str() == "updatekernel successful\n"); - REQUIRE_THROWS(proxy.Call("updatekernel", {}, -1, GET)); + REQUIRE_THROWS(caller.call("updatekernel", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("updatekernel", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("updatekernel", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("updatekernel", {}, -1, GET)); + REQUIRE_THROWS(caller.call("updatekernel", {}, -1, PUT)); } } -TEST_CASE("rebootcontroller", "[.cmd]") { +TEST_CASE("CALLER::rebootcontroller", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2 || det_type == defs::GOTTHARD) { // TODO: reboot real server? - // REQUIRE_NOTHROW(proxy.Call("rebootcontroller", {}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("rebootcontroller", {}, -1, GET)); + // REQUIRE_NOTHROW(caller.call("rebootcontroller", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("rebootcontroller", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("rebootcontroller", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("rebootcontroller", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("rebootcontroller", {}, -1, GET)); + REQUIRE_THROWS(caller.call("rebootcontroller", {}, -1, PUT)); } } -TEST_CASE("update", "[.cmd]") { +TEST_CASE("CALLER::update", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD) { // TODO: update real server and firmware? - // REQUIRE_NOTHROW(proxy.Call("update", + // REQUIRE_NOTHROW(caller.call("update", // {"jungfrauDetectorServerv4.0.1.0", "pc13784", // "/afs/psi.ch/project/sls_det_firmware/jungfrau_firmware/cyclone_V/v0_8/Jungfrau_MCB.pof"}, // -1, PUT)); - REQUIRE_THROWS(proxy.Call("update", {}, -1, GET)); + REQUIRE_THROWS(caller.call("update", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("update", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("update", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("update", {}, -1, GET)); + REQUIRE_THROWS(caller.call("update", {}, -1, PUT)); } } -TEST_CASE("reg", "[.cmd]") { +TEST_CASE("CALLER::reg", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type != defs::EIGER) { uint32_t addr = 0x64; @@ -3217,9 +3244,9 @@ TEST_CASE("reg", "[.cmd]") { auto prev_val = det.readRegister(addr); { std::ostringstream oss1, oss2; - proxy.Call("reg", {saddr, "0x5"}, -1, PUT, oss1); + caller.call("reg", {saddr, "0x5"}, -1, PUT, oss1); REQUIRE(oss1.str() == "reg [" + saddr + ", 0x5]\n"); - proxy.Call("reg", {saddr}, -1, GET, oss2); + caller.call("reg", {saddr}, -1, GET, oss2); REQUIRE(oss2.str() == "reg 0x5\n"); } for (int i = 0; i != det.size(); ++i) { @@ -3228,31 +3255,31 @@ TEST_CASE("reg", "[.cmd]") { } // cannot check for eiger virtual server else { - REQUIRE_NOTHROW(proxy.Call("reg", {"0x64"}, -1, GET)); + REQUIRE_NOTHROW(caller.call("reg", {"0x64"}, -1, GET)); } } -TEST_CASE("adcreg", "[.cmd]") { +TEST_CASE("CALLER::adcreg", "[.cmdcall]") { // TODO! what is a safe value to use? Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD || det_type == defs::GOTTHARD) { std::ostringstream oss; - proxy.Call("adcreg", {"0x8", "0x3"}, -1, PUT, oss); + caller.call("adcreg", {"0x8", "0x3"}, -1, PUT, oss); REQUIRE(oss.str() == "adcreg [0x8, 0x3]\n"); // This is a put only command - REQUIRE_THROWS(proxy.Call("adcreg", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adcreg", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("adcreg", {"0x0", "0"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("adcreg", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adcreg", {"0x0", "0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("adcreg", {}, -1, GET)); } } -TEST_CASE("setbit", "[.cmd]") { +TEST_CASE("CALLER::setbit", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type != defs::EIGER) { uint32_t addr = 0x64; @@ -3260,10 +3287,10 @@ TEST_CASE("setbit", "[.cmd]") { auto prev_val = det.readRegister(addr); { std::ostringstream oss1, oss2; - proxy.Call("reg", {saddr, "0x0"}, -1, PUT); - proxy.Call("setbit", {saddr, "1"}, -1, PUT, oss1); + caller.call("reg", {saddr, "0x0"}, -1, PUT); + caller.call("setbit", {saddr, "1"}, -1, PUT, oss1); REQUIRE(oss1.str() == "setbit [" + saddr + ", 1]\n"); - proxy.Call("reg", {saddr}, -1, GET, oss2); + caller.call("reg", {saddr}, -1, GET, oss2); REQUIRE(oss2.str() == "reg 0x2\n"); } for (int i = 0; i != det.size(); ++i) { @@ -3272,9 +3299,9 @@ TEST_CASE("setbit", "[.cmd]") { } } -TEST_CASE("clearbit", "[.cmd]") { +TEST_CASE("CALLER::clearbit", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type != defs::EIGER) { uint32_t addr = 0x64; @@ -3282,10 +3309,10 @@ TEST_CASE("clearbit", "[.cmd]") { auto prev_val = det.readRegister(addr); { std::ostringstream oss1, oss2; - proxy.Call("reg", {saddr, "0x3"}, -1, PUT); - proxy.Call("clearbit", {saddr, "1"}, -1, PUT, oss1); + caller.call("reg", {saddr, "0x3"}, -1, PUT); + caller.call("clearbit", {saddr, "1"}, -1, PUT, oss1); REQUIRE(oss1.str() == "clearbit [" + saddr + ", 1]\n"); - proxy.Call("reg", {saddr}, -1, GET, oss2); + caller.call("reg", {saddr}, -1, GET, oss2); REQUIRE(oss2.str() == "reg 0x1\n"); } for (int i = 0; i != det.size(); ++i) { @@ -3294,9 +3321,9 @@ TEST_CASE("clearbit", "[.cmd]") { } } -TEST_CASE("getbit", "[.cmd]") { +TEST_CASE("CALLER::getbit", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type != defs::EIGER) { uint32_t addr = 0x64; @@ -3304,8 +3331,8 @@ TEST_CASE("getbit", "[.cmd]") { auto prev_val = det.readRegister(addr); { std::ostringstream oss1, oss2; - proxy.Call("reg", {saddr, "0x3"}, -1, PUT); - proxy.Call("getbit", {saddr, "1"}, -1, GET, oss1); + caller.call("reg", {saddr, "0x3"}, -1, PUT); + caller.call("getbit", {saddr, "1"}, -1, GET, oss1); REQUIRE(oss1.str() == "getbit 1\n"); } for (int i = 0; i != det.size(); ++i) { @@ -3314,69 +3341,69 @@ TEST_CASE("getbit", "[.cmd]") { } // cannot check for eiger virtual server else { - REQUIRE_NOTHROW(proxy.Call("getbit", {"0x64", "1"}, -1, GET)); + REQUIRE_NOTHROW(caller.call("getbit", {"0x64", "1"}, -1, GET)); } } -TEST_CASE("firmwaretest", "[.cmd]") { +TEST_CASE("CALLER::firmwaretest", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD || det_type == defs::GOTTHARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; - proxy.Call("firmwaretest", {}, -1, PUT, oss); + caller.call("firmwaretest", {}, -1, PUT, oss); REQUIRE(oss.str() == "firmwaretest successful\n"); - REQUIRE_THROWS(proxy.Call("firmwaretest", {}, -1, GET)); + REQUIRE_THROWS(caller.call("firmwaretest", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("firmwaretest", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("firmwaretest", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("firmwaretest", {}, -1, GET)); + REQUIRE_THROWS(caller.call("firmwaretest", {}, -1, PUT)); } } -TEST_CASE("bustest", "[.cmd]") { +TEST_CASE("CALLER::bustest", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD || det_type == defs::GOTTHARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; - proxy.Call("bustest", {}, -1, PUT, oss); + caller.call("bustest", {}, -1, PUT, oss); REQUIRE(oss.str() == "bustest successful\n"); - REQUIRE_THROWS(proxy.Call("bustest", {}, -1, GET)); + REQUIRE_THROWS(caller.call("bustest", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("bustest", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("bustest", {}, -1, PUT)); + REQUIRE_THROWS(caller.call("bustest", {}, -1, GET)); + REQUIRE_THROWS(caller.call("bustest", {}, -1, PUT)); } } -TEST_CASE("initialchecks", "[.cmd]") { +TEST_CASE("CALLER::initialchecks", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto check = det.getInitialChecks(); { std::ostringstream oss; - proxy.Call("initialchecks", {"0"}, -1, PUT, oss); + caller.call("initialchecks", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "initialchecks 0\n"); } { std::ostringstream oss; - proxy.Call("initialchecks", {}, -1, GET, oss); + caller.call("initialchecks", {}, -1, GET, oss); REQUIRE(oss.str() == "initialchecks 0\n"); } { std::ostringstream oss; - proxy.Call("initialchecks", {}, -1, GET, oss); + caller.call("initialchecks", {}, -1, GET, oss); REQUIRE(oss.str() == "initialchecks 0\n"); } det.setInitialChecks(check); } -TEST_CASE("adcinvert", "[.cmd]") { +TEST_CASE("CALLER::adcinvert", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::CHIPTESTBOARD || det_type == defs::JUNGFRAU || @@ -3384,87 +3411,89 @@ TEST_CASE("adcinvert", "[.cmd]") { auto prev_val = det.getADCInvert(); { std::ostringstream oss; - proxy.Call("adcinvert", {"0x8d0a21d4"}, -1, PUT, oss); + caller.call("adcinvert", {"0x8d0a21d4"}, -1, PUT, oss); REQUIRE(oss.str() == "adcinvert 0x8d0a21d4\n"); } { std::ostringstream oss; - proxy.Call("adcinvert", {}, -1, GET, oss); + caller.call("adcinvert", {}, -1, GET, oss); REQUIRE(oss.str() == "adcinvert 0x8d0a21d4\n"); } for (int i = 0; i != det.size(); ++i) { det.setADCInvert(prev_val[i], {i}); } } else { - REQUIRE_THROWS(proxy.Call("adcinvert", {}, -1, GET)); + REQUIRE_THROWS(caller.call("adcinvert", {}, -1, GET)); } } /* Insignificant */ -TEST_CASE("port", "[.cmd]") { +TEST_CASE("CALLER::port", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getControlPort({0}).squash(); { std::ostringstream oss; - proxy.Call("port", {"1942"}, 0, PUT, oss); + caller.call("port", {"1942"}, 0, PUT, oss); REQUIRE(oss.str() == "port 1942\n"); } { std::ostringstream oss; - proxy.Call("port", {}, 0, GET, oss); + caller.call("port", {}, 0, GET, oss); REQUIRE(oss.str() == "port 1942\n"); } - test_valid_port("port", {}, -1, PUT); - test_valid_port("port", {}, 0, PUT); + test_valid_port_caller("port", {}, -1, PUT); + test_valid_port_caller("port", {}, 0, PUT); // should fail for the second module if (det.size() > 1) { - REQUIRE_THROWS(proxy.Call("port", {"65536"}, -1, PUT)); + REQUIRE_THROWS(caller.call("port", {"65536"}, -1, PUT)); } + det.setControlPort(prev_val, {0}); } -TEST_CASE("stopport", "[.cmd]") { +TEST_CASE("CALLER::stopport", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getStopPort({0}).squash(); { std::ostringstream oss; - proxy.Call("stopport", {"1942"}, 0, PUT, oss); + caller.call("stopport", {"1942"}, 0, PUT, oss); REQUIRE(oss.str() == "stopport 1942\n"); } { std::ostringstream oss; - proxy.Call("stopport", {}, 0, GET, oss); + caller.call("stopport", {}, 0, GET, oss); REQUIRE(oss.str() == "stopport 1942\n"); } - test_valid_port("stopport", {}, -1, PUT); - test_valid_port("stopport", {}, 0, PUT); + test_valid_port_caller("stopport", {}, -1, PUT); + test_valid_port_caller("stopport", {}, 0, PUT); // should fail for the second module if (det.size() > 1) { - REQUIRE_THROWS(proxy.Call("stopport", {"65536"}, -1, PUT)); + REQUIRE_THROWS(caller.call("stopport", {"65536"}, -1, PUT)); } + det.setStopPort(prev_val, {0}); } -TEST_CASE("lock", "[.cmd]") { +TEST_CASE("CALLER::lock", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto prev_val = det.getDetectorLock(); { std::ostringstream oss; - proxy.Call("lock", {"1"}, -1, PUT, oss); + caller.call("lock", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "lock 1\n"); } { std::ostringstream oss; - proxy.Call("lock", {}, -1, GET, oss); + caller.call("lock", {}, -1, GET, oss); REQUIRE(oss.str() == "lock 1\n"); } { std::ostringstream oss; - proxy.Call("lock", {"0"}, -1, PUT, oss); + caller.call("lock", {"0"}, -1, PUT, oss); REQUIRE(oss.str() == "lock 0\n"); } for (int i = 0; i != det.size(); ++i) { @@ -3472,74 +3501,74 @@ TEST_CASE("lock", "[.cmd]") { } } -TEST_CASE("execcommand", "[.cmd]") { +TEST_CASE("CALLER::execcommand", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - REQUIRE_NOTHROW(proxy.Call("execcommand", {"ls *.txt"}, -1, PUT)); + Caller caller(&det); + REQUIRE_NOTHROW(caller.call("execcommand", {"ls *.txt"}, -1, PUT)); } -TEST_CASE("framecounter", "[.cmd]") { +TEST_CASE("CALLER::framecounter", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { auto framecounter = det.getNumberOfFramesFromStart().squash(); std::ostringstream oss; - proxy.Call("framecounter", {}, -1, GET, oss); + caller.call("framecounter", {}, -1, GET, oss); REQUIRE(oss.str() == "framecounter " + std::to_string(framecounter) + "\n"); - REQUIRE_NOTHROW(proxy.Call("framecounter", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("framecounter", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("framecounter", {}, -1, GET)); + REQUIRE_THROWS(caller.call("framecounter", {}, -1, GET)); } } -TEST_CASE("runtime", "[.cmd]") { +TEST_CASE("CALLER::runtime", "[.cmdcall]") { // TODO! can we test this? Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; - proxy.Call("runtime", {}, -1, GET, oss); + caller.call("runtime", {}, -1, GET, oss); // Get only - REQUIRE_THROWS(proxy.Call("runtime", {"2019"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("runtime", {}, -1, GET)); + REQUIRE_THROWS(caller.call("runtime", {"2019"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("runtime", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("runtime", {}, -1, GET)); + REQUIRE_THROWS(caller.call("runtime", {}, -1, GET)); } } -TEST_CASE("frametime", "[.cmd]") { +TEST_CASE("CALLER::frametime", "[.cmdcall]") { // TODO! can we test this? Detector det; - CmdProxy proxy(&det); + Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; - proxy.Call("frametime", {}, -1, GET, oss); + caller.call("frametime", {}, -1, GET, oss); // Get only - REQUIRE_THROWS(proxy.Call("frametime", {"2019"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("frametime", {}, -1, GET)); + REQUIRE_THROWS(caller.call("frametime", {"2019"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("frametime", {}, -1, GET)); } else { - REQUIRE_THROWS(proxy.Call("frametime", {}, -1, GET)); + REQUIRE_THROWS(caller.call("frametime", {}, -1, GET)); } } -TEST_CASE("user", "[.cmd]") { +TEST_CASE("CALLER::user", "[.cmdcall]") { Detector det; - CmdProxy proxy(&det); - proxy.Call("user", {}, -1, GET); + Caller caller(&det); + caller.call("user", {}, -1, GET); // This is a get only command - REQUIRE_THROWS(proxy.Call("user", {}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("user", {}, -1, GET)); + REQUIRE_THROWS(caller.call("user", {}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("user", {}, -1, GET)); } -} // namespace sls +} // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/tests/test-CmdProxy-global.h b/slsDetectorSoftware/tests/test-CmdProxy-global.h deleted file mode 100644 index 164fbbc8a..000000000 --- a/slsDetectorSoftware/tests/test-CmdProxy-global.h +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-other -// Copyright (C) 2021 Contributors to the SLS Detector Package -#pragma once -#include "sls/sls_detector_defs.h" - -namespace sls { - -void test_valid_port(const std::string &command, - const std::vector &arguments, int detector_id, - int action); - -void test_dac(slsDetectorDefs::dacIndex index, const std::string &dacname, - int dacvalue); -void test_onchip_dac(slsDetectorDefs::dacIndex index, - const std::string &dacname, int dacvalue); - -} // namespace sls diff --git a/slsDetectorSoftware/tests/test-CmdProxy-gotthard.cpp b/slsDetectorSoftware/tests/test-CmdProxy-gotthard.cpp deleted file mode 100644 index 4c26986c2..000000000 --- a/slsDetectorSoftware/tests/test-CmdProxy-gotthard.cpp +++ /dev/null @@ -1,164 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-other -// Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" -#include "catch.hpp" -#include "sls/Detector.h" -#include "sls/sls_detector_defs.h" -#include - -#include "sls/Result.h" -#include "sls/ToString.h" -#include "sls/versionAPI.h" -#include "test-CmdProxy-global.h" -#include "tests/globals.h" - -namespace sls { - -using test::GET; -using test::PUT; - -/* dacs */ - -TEST_CASE("Setting and reading back GOTTHARD dacs", "[.cmd][.dacs]") { - // vref_ds, vcascn_pb, vcascp_pb, vout_cm, vcasc_out, vin_cm, vref_comp, - // ib_test_c - - Detector det; - CmdProxy proxy(&det); - auto det_type = det.getDetectorType().squash(); - if (det_type == defs::GOTTHARD) { - SECTION("vref_ds") { test_dac(defs::VREF_DS, "vref_ds", 660); } - SECTION("vcascn_pb") { test_dac(defs::VCASCN_PB, "vcascn_pb", 650); } - SECTION("vcascp_pb") { test_dac(defs::VCASCP_PB, "vcascp_pb", 1480); } - SECTION("vout_cm") { test_dac(defs::VOUT_CM, "vout_cm", 1520); } - SECTION("vcasc_out") { test_dac(defs::VCASC_OUT, "vcasc_out", 1320); } - SECTION("vin_cm") { test_dac(defs::VIN_CM, "vin_cm", 1350); } - SECTION("vref_comp") { test_dac(defs::VREF_COMP, "vref_comp", 350); } - SECTION("ib_test_c") { test_dac(defs::IB_TESTC, "ib_test_c", 2001); } - // eiger - REQUIRE_THROWS(proxy.Call("dac", {"vthreshold"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vsvp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vsvn"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtrim"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrpreamp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtgstv"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_ll"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_lr"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rl"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rr"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"rxb_rb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"rxb_lb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcn"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vishaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"iodelay"}, -1, GET)); - // jungfrau - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vdd_prot"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vin_com"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_prech"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_pixbuf"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_ds"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vref_ds"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vref_comp"}, -1, GET)); - // mythen3 - REQUIRE_THROWS(proxy.Call("dac", {"vrpreamp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper_n"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vipre"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vishaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vdcsh"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth2"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth3"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal_n"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal_p"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtrim"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcassh"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcas"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vicin"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vipre_out"}, -1, GET)); - // gotthard2 - REQUIRE_THROWS(proxy.Call("dac", {"vref_h_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp_fe"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_cds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_rstore"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_opa_1st"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp_fe"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_adc1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_l_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_cds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_cs"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_opa_fd"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_adc2"}, -1, GET)); - } -} - -/* Gotthard Specific */ - -TEST_CASE("roi", "[.cmd]") { - Detector det; - CmdProxy proxy(&det); - auto det_type = det.getDetectorType().squash(); - - if (det_type == defs::GOTTHARD) { - if (det.size() > 1) { - REQUIRE_THROWS(proxy.Call("roi", {"0", "255"}, -1, PUT)); - REQUIRE_NOTHROW(proxy.Call("roi", {}, -1, GET)); - } else { - auto prev_val = det.getROI(); - { - std::ostringstream oss; - proxy.Call("roi", {"0", "255"}, -1, PUT, oss); - REQUIRE(oss.str() == "roi [0, 255]\n"); - } - { - std::ostringstream oss; - proxy.Call("roi", {"256", "511"}, -1, PUT, oss); - REQUIRE(oss.str() == "roi [256, 511]\n"); - } - REQUIRE_THROWS(proxy.Call("roi", {"0", "256"}, -1, PUT)); - for (int i = 0; i != det.size(); ++i) { - det.setROI(prev_val[i], i); - } - } - } else { - REQUIRE_THROWS(proxy.Call("roi", {}, -1, GET)); - } -} - -TEST_CASE("clearroi", "[.cmd]") { - Detector det; - CmdProxy proxy(&det); - auto det_type = det.getDetectorType().squash(); - - if (det_type == defs::GOTTHARD) { - auto prev_val = det.getROI(); - { - std::ostringstream oss; - proxy.Call("clearroi", {}, -1, PUT, oss); - REQUIRE(oss.str() == "clearroi successful\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setROI(prev_val[i], i); - } - } else { - REQUIRE_THROWS(proxy.Call("clearroi", {}, -1, PUT)); - } -} - -TEST_CASE("exptimel", "[.cmd]") { - Detector det; - CmdProxy proxy(&det); - auto det_type = det.getDetectorType().squash(); - if (det_type == defs::GOTTHARD) { - REQUIRE_NOTHROW(proxy.Call("exptimel", {}, -1, GET)); - } else { - REQUIRE_THROWS(proxy.Call("exptimel", {}, -1, GET)); - } -} - -} // namespace sls diff --git a/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp b/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp deleted file mode 100644 index e56e0d99f..000000000 --- a/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-or-other -// Copyright (C) 2021 Contributors to the SLS Detector Package -#include "CmdProxy.h" -#include "catch.hpp" -#include "sls/Detector.h" -#include "sls/sls_detector_defs.h" -#include - -#include "sls/Result.h" -#include "sls/ToString.h" -#include "sls/versionAPI.h" -#include "test-CmdProxy-global.h" -#include "tests/globals.h" - -namespace sls { - -using test::GET; -using test::PUT; - -/* dacs */ -TEST_CASE("Setting and reading back moench dacs", "[.cmd][.dacs]") { - // vbp_colbuf, vipre, vin_cm, vb_sda, vcasc_sfp, vout_cm, vipre_cds, - // ibias_sfp - Detector det; - CmdProxy proxy(&det); - auto det_type = det.getDetectorType().squash(); - if (det_type == defs::MOENCH) { - SECTION("vbp_colbuf") { - test_dac(defs::VBP_COLBUF, "vbp_colbuf", 1300); - } - SECTION("vipre") { test_dac(defs::VIPRE, "vipre", 1000); } - SECTION("vin_cm") { test_dac(defs::VIN_CM, "vin_cm", 1400); } - SECTION("vb_sda") { test_dac(defs::VB_SDA, "vb_sda", 680); } - SECTION("vcasc_sfp") { test_dac(defs::VCASC_SFP, "vcasc_sfp", 1428); } - SECTION("vout_cm") { test_dac(defs::VOUT_CM, "vout_cm", 1200); } - SECTION("vipre_cds") { test_dac(defs::VIPRE_CDS, "vipre_cds", 800); } - SECTION("ibias_sfp") { test_dac(defs::IBIAS_SFP, "ibias_sfp", 900); } - // eiger - REQUIRE_THROWS(proxy.Call("vthreshold", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vsvp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vsvn", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vtrim", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vrpreamp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vrshaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vtgstv", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcmp_ll", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcmp_lr", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcal", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcmp_rl", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcmp_rr", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("rxb_rb", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("rxb_lb", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcn", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vishaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("iodelay", {}, -1, GET)); - // gotthard - REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcascn_pb", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcascp_pb", {}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("vout_cm", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcasc_out", {}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("vin_cm", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("ib_test_c", {}, -1, GET)); - // mythen3 - REQUIRE_THROWS(proxy.Call("vrpreamp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vrshaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vrshaper_n", {}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("vipre", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vishaper", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vdcsh", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vth1", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vth2", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vth3", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcal_n", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcal_p", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vtrim", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcassh", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcas", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vicin", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vipre_out", {}, -1, GET)); - // gotthard2 - REQUIRE_THROWS(proxy.Call("vref_h_adc", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_comp_fe", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_comp_adc", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcom_cds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_rstore", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_opa_1st", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_comp_fe", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcom_adc1", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_l_adc", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_cds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_cs", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_opa_fd", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vcom_adc2", {}, -1, GET)); - // jungfrau - REQUIRE_THROWS(proxy.Call("vb_comp", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vdd_prot", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vin_com", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_prech", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_pixbuf", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vb_ds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET)); - } -} - -} // namespace sls diff --git a/tests/scripts/test_simulators.py b/tests/scripts/test_simulators.py index 1ee095d51..2a40ba1a3 100644 --- a/tests/scripts/test_simulators.py +++ b/tests/scripts/test_simulators.py @@ -126,7 +126,7 @@ def loadConfig(name, rx_hostname, settingsdir): def startCmdTests(name, fp, fname): Log(Fore.GREEN, 'Cmd Tests for ' + name) - cmd = 'tests --abort [.cmd] -s -o ' + fname + cmd = 'tests --abort [.cmdcall] -s -o ' + fname p = subprocess.run(cmd.split(), stdout=fp, stderr=fp, check=True, text=True) p.check_returncode() From 51412f40cf52186ee8e88b9061f629a8f2c16fd8 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 13 Dec 2023 15:38:10 +0100 Subject: [PATCH 24/38] Generate commands/fix det command rename (#881) * made a link to bash autocompletion script in main folder, and replaced all references to 'det' command with 'sls_detector' --- bash_autocomplete.sh | 1 + .../generator/cpp_codegen/codegen.py | 4 +- .../generator/inferAction.in.cpp | 2 +- slsDetectorSoftware/generator/readme.md | 12 +- slsDetectorSoftware/src/Detector.cpp | 4 +- slsDetectorSoftware/src/HelpDacs.cpp | 2 +- slsDetectorSoftware/src/inferAction.cpp | 182 +++++++++--------- 7 files changed, 106 insertions(+), 101 deletions(-) create mode 120000 bash_autocomplete.sh diff --git a/bash_autocomplete.sh b/bash_autocomplete.sh new file mode 120000 index 000000000..f79749d0d --- /dev/null +++ b/bash_autocomplete.sh @@ -0,0 +1 @@ +slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh \ No newline at end of file diff --git a/slsDetectorSoftware/generator/cpp_codegen/codegen.py b/slsDetectorSoftware/generator/cpp_codegen/codegen.py index 5df7c3b61..03dac76cf 100644 --- a/slsDetectorSoftware/generator/cpp_codegen/codegen.py +++ b/slsDetectorSoftware/generator/cpp_codegen/codegen.py @@ -93,7 +93,7 @@ class CodeGenerator: with function('int', f"InferAction::{command['function_alias']}", []) as f: if (command_name, -1) in non_dist| type_dist: self.write_line( - f'throw RuntimeError("det is disabled for command: {command_name}. Use detg or detp");') + f'throw RuntimeError("sls_detector is disabled for command: {command_name}. Use detg or detp");') elif not command['infer_action']: self.write_line('throw RuntimeError("infer_action is disabled");') else: @@ -107,7 +107,7 @@ class CodeGenerator: # check if this argc is not distinguishable if (command_name, arg["argc"]) in non_dist | type_dist: self.write_line( - f'throw RuntimeError("det is disabled for command: {command_name} with number of arguments {arg["argc"]}. Use detg or detp");') + f'throw RuntimeError("sls_detector is disabled for command: {command_name} with number of arguments {arg["argc"]}. Use detg or detp");') else: self.write_line(f'return {self.actions_dict[action]};') with else_block(): diff --git a/slsDetectorSoftware/generator/inferAction.in.cpp b/slsDetectorSoftware/generator/inferAction.in.cpp index 6d74f968f..3e355bf4e 100644 --- a/slsDetectorSoftware/generator/inferAction.in.cpp +++ b/slsDetectorSoftware/generator/inferAction.in.cpp @@ -9,7 +9,7 @@ int InferAction::infer(sls::CmdParser &parser, std::ostream &os) { if (it != functions.end()) { return ((*this).*(it->second))(); } else { - throw RuntimeError("det not implemented for command: " + + throw RuntimeError("sls_detector not implemented for command: " + parser.command()); } } diff --git a/slsDetectorSoftware/generator/readme.md b/slsDetectorSoftware/generator/readme.md index d98510675..6fb8d741b 100644 --- a/slsDetectorSoftware/generator/readme.md +++ b/slsDetectorSoftware/generator/readme.md @@ -194,12 +194,12 @@ Now for C++ code generation. After parsing the commands.yaml file and producing ### infer action -the generated code will produce 5 new targets: "detg detp deta deth det" +the generated code will produce 5 new targets: "sls_detector_get sls_detector_put sls_detector_acquire sls_detector_help sls_detector" -`detg` will set the action as GET -`detp` will the action as PUT +`sls_detector_get` will set the action as GET +`sls_detector_put` will the action as PUT -`det` will guess the action depending on the number of arguments +`sls_detector` will guess the action depending on the number of arguments the codegen module will generate a function for every command that will return the action based on the number of arguments @@ -221,7 +221,7 @@ int InferAction::activate() { the `inferAction` class will be called from `CmdApp.cpp` to infer the action and the command function will be called with the appropriate action. -some commands have the same number of argument count for both get and put. These commands can be found using the the `check_infer.py` script. in the generated code it will say that "det is disabled" +some commands have the same number of argument count for both get and put. These commands can be found using the the `check_infer.py` script. in the generated code it will say that "sls_detector is disabled" ```bash # to see these commands python infer_action/check_infer.py @@ -257,7 +257,7 @@ write_arg in codegen reads the argument fields and generate c++ code accordingly - check_det_id: if true it will check the detector id and throw an error if it is not valid - convert_det_id: if true it will convert the detector id to the correct type `std::vector{ det_id }` - store_result_in_t: if true it will store the result of the function in the variable t (more on it in tricky things) -- infer_action: if true it will infer the action (only if det is used) +- infer_action: if true it will infer the action (only if sls_detector is used) - detectors: the detectors that have specific behaviour - args: the arguments of the command - argc: the number of arguments diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 56eb77fa9..4a25c0d87 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -3,8 +3,8 @@ #include "sls/Detector.h" #include "sls/detectorData.h" -#include "CmdParser.h" #include "Caller.h" +#include "CmdParser.h" #include "CtbConfig.h" #include "DetectorImpl.h" #include "Module.h" @@ -96,7 +96,7 @@ void Detector::loadParameters(const std::vector ¶meters) { for (const auto ¤t_line : parameters) { parser.Parse(current_line); caller.call(parser.command(), parser.arguments(), parser.detector_id(), - defs::PUT_ACTION, std::cout, parser.receiver_id()); + defs::PUT_ACTION, std::cout, parser.receiver_id()); } } diff --git a/slsDetectorSoftware/src/HelpDacs.cpp b/slsDetectorSoftware/src/HelpDacs.cpp index 9ce150bd1..3a2c0504c 100644 --- a/slsDetectorSoftware/src/HelpDacs.cpp +++ b/slsDetectorSoftware/src/HelpDacs.cpp @@ -1,7 +1,7 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package -#include "sls/string_utils.h" #include "sls/sls_detector_defs.h" +#include "sls/string_utils.h" #include namespace sls { diff --git a/slsDetectorSoftware/src/inferAction.cpp b/slsDetectorSoftware/src/inferAction.cpp index c10087bd2..4bc9b3fbe 100644 --- a/slsDetectorSoftware/src/inferAction.cpp +++ b/slsDetectorSoftware/src/inferAction.cpp @@ -18,7 +18,7 @@ int InferAction::infer(sls::CmdParser &parser, std::ostream &os) { } else { - throw RuntimeError("det not implemented for command: " + + throw RuntimeError("sls_detector not implemented for command: " + parser.command()); } @@ -27,8 +27,8 @@ int InferAction::infer(sls::CmdParser &parser, std::ostream &os) { int InferAction::acquire() { if (args.size() == 0) { - throw RuntimeError("det is disabled for command: acquire with number " - "of arguments 0. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: acquire with " + "number of arguments 0. Use detg or detp"); } else { @@ -132,7 +132,7 @@ int InferAction::adcinvert() { int InferAction::adclist() { throw RuntimeError( - "det is disabled for command: adclist. Use detg or detp"); + "sls_detector is disabled for command: adclist. Use detg or detp"); } int InferAction::adcname() { @@ -158,8 +158,8 @@ int InferAction::adcphase() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: adcphase with number " - "of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: adcphase " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -207,8 +207,8 @@ int InferAction::adcvpp() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: adcvpp with number of " - "arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: adcvpp with " + "number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -272,7 +272,7 @@ int InferAction::autocompdisable() { int InferAction::badchannels() { throw RuntimeError( - "det is disabled for command: badchannels. Use detg or detp"); + "sls_detector is disabled for command: badchannels. Use detg or detp"); } int InferAction::blockingtrigger() { @@ -310,8 +310,8 @@ int InferAction::burstperiod() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: burstperiod with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: burstperiod " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -475,8 +475,8 @@ int InferAction::clkphase() { } if (args.size() == 2) { - throw RuntimeError("det is disabled for command: clkphase with number " - "of arguments 2. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: clkphase " + "with number of arguments 2. Use detg or detp"); } if (args.size() == 3) { @@ -512,8 +512,9 @@ int InferAction::compdisabletime() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: compdisabletime with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: compdisabletime with number " + "of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -557,7 +558,7 @@ int InferAction::config() { int InferAction::counters() { throw RuntimeError( - "det is disabled for command: counters. Use detg or detp"); + "sls_detector is disabled for command: counters. Use detg or detp"); } int InferAction::currentsource() { @@ -591,8 +592,8 @@ int InferAction::dac() { } if (args.size() == 2) { - throw RuntimeError("det is disabled for command: dac with number of " - "arguments 2. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: dac with " + "number of arguments 2. Use detg or detp"); } if (args.size() == 3) { @@ -620,7 +621,7 @@ int InferAction::dacindex() { int InferAction::daclist() { throw RuntimeError( - "det is disabled for command: daclist. Use detg or detp"); + "sls_detector is disabled for command: daclist. Use detg or detp"); } int InferAction::dacname() { @@ -694,8 +695,8 @@ int InferAction::dbitphase() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: dbitphase with number " - "of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: dbitphase " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -731,8 +732,8 @@ int InferAction::defaultdac() { } if (args.size() == 2) { - throw RuntimeError("det is disabled for command: defaultdac with " - "number of arguments 2. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: defaultdac " + "with number of arguments 2. Use detg or detp"); } if (args.size() == 3) { @@ -764,8 +765,8 @@ int InferAction::delay() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: delay with number of " - "arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: delay with " + "number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -897,7 +898,7 @@ int InferAction::dsamples() { int InferAction::execcommand() { throw RuntimeError( - "det is disabled for command: execcommand. Use detg or detp"); + "sls_detector is disabled for command: execcommand. Use detg or detp"); } int InferAction::exptime() { @@ -907,8 +908,8 @@ int InferAction::exptime() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: exptime with number " - "of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: exptime with " + "number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -928,8 +929,8 @@ int InferAction::exptime1() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: exptime1 with number " - "of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: exptime1 " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -949,8 +950,8 @@ int InferAction::exptime2() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: exptime2 with number " - "of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: exptime2 " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -970,8 +971,8 @@ int InferAction::exptime3() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: exptime3 with number " - "of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: exptime3 " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -1307,8 +1308,8 @@ int InferAction::frametime() { int InferAction::free() { if (args.size() == 0) { - throw RuntimeError("det is disabled for command: free with number of " - "arguments 0. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: free with " + "number of arguments 0. Use detg or detp"); } else { @@ -1336,7 +1337,7 @@ int InferAction::fwrite() { int InferAction::gaincaps() { throw RuntimeError( - "det is disabled for command: gaincaps. Use detg or detp"); + "sls_detector is disabled for command: gaincaps. Use detg or detp"); } int InferAction::gainmode() { @@ -1378,8 +1379,8 @@ int InferAction::gatedelay() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: gatedelay with number " - "of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: gatedelay " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -1399,8 +1400,8 @@ int InferAction::gatedelay1() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: gatedelay1 with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: gatedelay1 " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -1420,8 +1421,8 @@ int InferAction::gatedelay2() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: gatedelay2 with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: gatedelay2 " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -1441,8 +1442,8 @@ int InferAction::gatedelay3() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: gatedelay3 with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: gatedelay3 " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -1514,7 +1515,7 @@ int InferAction::highvoltage() { int InferAction::hostname() { throw RuntimeError( - "det is disabled for command: hostname. Use detg or detp"); + "sls_detector is disabled for command: hostname. Use detg or detp"); } int InferAction::im_a() { @@ -1956,31 +1957,31 @@ int InferAction::patioctrl() { int InferAction::patlimits() { throw RuntimeError( - "det is disabled for command: patlimits. Use detg or detp"); + "sls_detector is disabled for command: patlimits. Use detg or detp"); } int InferAction::patloop() { throw RuntimeError( - "det is disabled for command: patloop. Use detg or detp"); + "sls_detector is disabled for command: patloop. Use detg or detp"); } int InferAction::patloop0() { throw RuntimeError( - "det is disabled for command: patloop0. Use detg or detp"); + "sls_detector is disabled for command: patloop0. Use detg or detp"); } int InferAction::patloop1() { throw RuntimeError( - "det is disabled for command: patloop1. Use detg or detp"); + "sls_detector is disabled for command: patloop1. Use detg or detp"); } int InferAction::patloop2() { throw RuntimeError( - "det is disabled for command: patloop2. Use detg or detp"); + "sls_detector is disabled for command: patloop2. Use detg or detp"); } int InferAction::patmask() { @@ -2002,25 +2003,25 @@ int InferAction::patmask() { int InferAction::patnloop() { throw RuntimeError( - "det is disabled for command: patnloop. Use detg or detp"); + "sls_detector is disabled for command: patnloop. Use detg or detp"); } int InferAction::patnloop0() { throw RuntimeError( - "det is disabled for command: patnloop0. Use detg or detp"); + "sls_detector is disabled for command: patnloop0. Use detg or detp"); } int InferAction::patnloop1() { throw RuntimeError( - "det is disabled for command: patnloop1. Use detg or detp"); + "sls_detector is disabled for command: patnloop1. Use detg or detp"); } int InferAction::patnloop2() { throw RuntimeError( - "det is disabled for command: patnloop2. Use detg or detp"); + "sls_detector is disabled for command: patnloop2. Use detg or detp"); } int InferAction::patsetbit() { @@ -2066,49 +2067,49 @@ int InferAction::patternstart() { int InferAction::patwait() { throw RuntimeError( - "det is disabled for command: patwait. Use detg or detp"); + "sls_detector is disabled for command: patwait. Use detg or detp"); } int InferAction::patwait0() { throw RuntimeError( - "det is disabled for command: patwait0. Use detg or detp"); + "sls_detector is disabled for command: patwait0. Use detg or detp"); } int InferAction::patwait1() { throw RuntimeError( - "det is disabled for command: patwait1. Use detg or detp"); + "sls_detector is disabled for command: patwait1. Use detg or detp"); } int InferAction::patwait2() { throw RuntimeError( - "det is disabled for command: patwait2. Use detg or detp"); + "sls_detector is disabled for command: patwait2. Use detg or detp"); } int InferAction::patwaittime() { throw RuntimeError( - "det is disabled for command: patwaittime. Use detg or detp"); + "sls_detector is disabled for command: patwaittime. Use detg or detp"); } int InferAction::patwaittime0() { throw RuntimeError( - "det is disabled for command: patwaittime0. Use detg or detp"); + "sls_detector is disabled for command: patwaittime0. Use detg or detp"); } int InferAction::patwaittime1() { throw RuntimeError( - "det is disabled for command: patwaittime1. Use detg or detp"); + "sls_detector is disabled for command: patwaittime1. Use detg or detp"); } int InferAction::patwaittime2() { throw RuntimeError( - "det is disabled for command: patwaittime2. Use detg or detp"); + "sls_detector is disabled for command: patwaittime2. Use detg or detp"); } int InferAction::patword() { @@ -2154,8 +2155,8 @@ int InferAction::period() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: period with number of " - "arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: period with " + "number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -2247,7 +2248,7 @@ int InferAction::powerindex() { int InferAction::powerlist() { throw RuntimeError( - "det is disabled for command: powerlist. Use detg or detp"); + "sls_detector is disabled for command: powerlist. Use detg or detp"); } int InferAction::powername() { @@ -2601,7 +2602,7 @@ int InferAction::rx_clearroi() { int InferAction::rx_dbitlist() { throw RuntimeError( - "det is disabled for command: rx_dbitlist. Use detg or detp"); + "sls_detector is disabled for command: rx_dbitlist. Use detg or detp"); } int InferAction::rx_dbitoffset() { @@ -2695,20 +2696,20 @@ int InferAction::rx_framesperfile() { int InferAction::rx_hostname() { throw RuntimeError( - "det is disabled for command: rx_hostname. Use detg or detp"); + "sls_detector is disabled for command: rx_hostname. Use detg or detp"); } int InferAction::rx_jsonaddheader() { - throw RuntimeError( - "det is disabled for command: rx_jsonaddheader. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: " + "rx_jsonaddheader. Use detg or detp"); } int InferAction::rx_jsonpara() { if (args.size() == 1) { - throw RuntimeError("det is disabled for command: rx_jsonpara with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: rx_jsonpara " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -2852,7 +2853,7 @@ int InferAction::rx_start() { int InferAction::rx_status() { throw RuntimeError( - "det is disabled for command: rx_status. Use detg or detp"); + "sls_detector is disabled for command: rx_status. Use detg or detp"); } int InferAction::rx_stop() { @@ -3182,7 +3183,7 @@ int InferAction::signalindex() { int InferAction::signallist() { throw RuntimeError( - "det is disabled for command: signallist. Use detg or detp"); + "sls_detector is disabled for command: signallist. Use detg or detp"); } int InferAction::signalname() { @@ -3228,7 +3229,7 @@ int InferAction::slowadcindex() { int InferAction::slowadclist() { throw RuntimeError( - "det is disabled for command: slowadclist. Use detg or detp"); + "sls_detector is disabled for command: slowadclist. Use detg or detp"); } int InferAction::slowadcname() { @@ -3273,7 +3274,8 @@ int InferAction::start() { int InferAction::status() { - throw RuntimeError("det is disabled for command: status. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: status. Use detg or detp"); } int InferAction::stop() { @@ -3311,8 +3313,9 @@ int InferAction::storagecell_delay() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: storagecell_delay " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: storagecell_delay with " + "number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -3348,8 +3351,8 @@ int InferAction::subdeadtime() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: subdeadtime with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: subdeadtime " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -3369,8 +3372,8 @@ int InferAction::subexptime() { } if (args.size() == 1) { - throw RuntimeError("det is disabled for command: subexptime with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: subexptime " + "with number of arguments 1. Use detg or detp"); } if (args.size() == 2) { @@ -3766,8 +3769,8 @@ int InferAction::triggersl() { int InferAction::trimbits() { if (args.size() == 1) { - throw RuntimeError("det is disabled for command: trimbits with number " - "of arguments 1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: trimbits " + "with number of arguments 1. Use detg or detp"); } else { @@ -3778,7 +3781,8 @@ int InferAction::trimbits() { int InferAction::trimen() { - throw RuntimeError("det is disabled for command: trimen. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: trimen. Use detg or detp"); } int InferAction::trimval() { @@ -3936,7 +3940,7 @@ int InferAction::udp_dstip2() { int InferAction::udp_dstlist() { throw RuntimeError( - "det is disabled for command: udp_dstlist. Use detg or detp"); + "sls_detector is disabled for command: udp_dstlist. Use detg or detp"); } int InferAction::udp_dstmac() { @@ -4438,7 +4442,7 @@ int InferAction::vetoalg() { int InferAction::vetofile() { throw RuntimeError( - "det is disabled for command: vetofile. Use detg or detp"); + "sls_detector is disabled for command: vetofile. Use detg or detp"); } int InferAction::vetophoton() { @@ -4460,13 +4464,13 @@ int InferAction::vetophoton() { int InferAction::vetoref() { throw RuntimeError( - "det is disabled for command: vetoref. Use detg or detp"); + "sls_detector is disabled for command: vetoref. Use detg or detp"); } int InferAction::vetostream() { throw RuntimeError( - "det is disabled for command: vetostream. Use detg or detp"); + "sls_detector is disabled for command: vetostream. Use detg or detp"); } int InferAction::virtualFunction() { From 4f4125a3b2728d3e4adb3d2326d1399be153127a Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 13 Dec 2023 17:01:10 +0100 Subject: [PATCH 25/38] Generate commands/fix detp detg command rename (#882) * replacing detp with sls_Detector_put and detg with sls_detector_get * sls_detector_not implemented, but extended message to ask user to use sls_detector_get or sls_detector_put * autocompletion also for sls_detector or det --- slsDetectorSoftware/CMakeLists.txt | 2 +- .../generator/autocomplete/autocomplete.py | 8 +- .../autocomplete/bash_autocomplete.in.sh | 3 + .../autocomplete/bash_autocomplete.sh | 45 +-- .../autocomplete/slsdet-completion.bash | 8 +- .../autocomplete/zsh_autocomplete.in.sh | 5 +- .../autocomplete/zsh_autocomplete.sh | 47 +-- .../generator/cpp_codegen/codegen.py | 4 +- .../generator/inferAction.in.cpp | 5 +- slsDetectorSoftware/src/inferAction.cpp | 274 ++++++++++-------- 10 files changed, 223 insertions(+), 178 deletions(-) diff --git a/slsDetectorSoftware/CMakeLists.txt b/slsDetectorSoftware/CMakeLists.txt index 905952154..e97f31bb9 100755 --- a/slsDetectorSoftware/CMakeLists.txt +++ b/slsDetectorSoftware/CMakeLists.txt @@ -111,7 +111,7 @@ if(SLS_USE_TEXTCLIENT) set_property(TARGET ${val1} PROPERTY INTERPROCEDURAL_OPTIMIZATION True) endif() endforeach() - install(TARGETS ${det_bin_names} DESTINATION bin) # was not there for detp. Include? FIXME + install(TARGETS ${det_bin_names} DESTINATION bin) endif(SLS_USE_TEXTCLIENT) diff --git a/slsDetectorSoftware/generator/autocomplete/autocomplete.py b/slsDetectorSoftware/generator/autocomplete/autocomplete.py index afcfe93d7..008531a05 100644 --- a/slsDetectorSoftware/generator/autocomplete/autocomplete.py +++ b/slsDetectorSoftware/generator/autocomplete/autocomplete.py @@ -38,13 +38,13 @@ def get_types(arg_types): #Intercept the options and in case detector specific options appear replace the #list of options with a command line call that fetches them - #TODO! Rename detg + #TODO! Rename sls_detector_get if "defs::dacIndex" in arg_types: - return "`detg daclist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`" + return "`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`" elif "defs::detectorSettings" in arg_types: - return "`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`" + return "`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`" elif "defs::timingMode" in arg_types: - return "`detg timinglist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`" + return "`sls_detector_get timinglist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`" return ret diff --git a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.in.sh b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.in.sh index c622a809d..d55b10c07 100644 --- a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.in.sh +++ b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.in.sh @@ -162,3 +162,6 @@ complete -F _sd -o filenames detg complete -F _sd -o filenames sls_detector_put complete -F _sd -o filenames p complete -F _sd -o filenames detp + +complete -F _sd -o filenames sls_detector +complete -F _sd -o filenames det diff --git a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh index 62764f094..6ed628f94 100644 --- a/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh +++ b/slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh @@ -503,7 +503,7 @@ __dac() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="mV mv" @@ -511,7 +511,7 @@ fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -544,12 +544,12 @@ __dacname() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -627,21 +627,21 @@ __defaultdac() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "4" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -650,13 +650,13 @@ __defaultpattern() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "4" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -1634,12 +1634,12 @@ __powername() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -2163,7 +2163,7 @@ __scan() { FCN_RETURN="" if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -2213,7 +2213,7 @@ __settings() { FCN_RETURN="" if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -2303,12 +2303,12 @@ __slowadcname() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -2505,13 +2505,13 @@ if [[ "${cword}" == "2" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "3" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "4" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "5" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -2523,13 +2523,13 @@ if [[ "${cword}" == "2" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "3" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "4" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "5" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -2538,7 +2538,7 @@ __timing() { FCN_RETURN="" if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg timinglist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get timinglist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -3250,3 +3250,6 @@ complete -F _sd -o filenames detg complete -F _sd -o filenames sls_detector_put complete -F _sd -o filenames p complete -F _sd -o filenames detp + +complete -F _sd -o filenames sls_detector +complete -F _sd -o filenames det diff --git a/slsDetectorSoftware/generator/autocomplete/slsdet-completion.bash b/slsDetectorSoftware/generator/autocomplete/slsdet-completion.bash index 0572be712..2ae81a4b8 100644 --- a/slsDetectorSoftware/generator/autocomplete/slsdet-completion.bash +++ b/slsDetectorSoftware/generator/autocomplete/slsdet-completion.bash @@ -162,10 +162,16 @@ _sd() { } +complete -F _sd -o filenames sls_detector_put complete -F _sd -o filenames sls_detector_get + complete -F _sd -o filenames g complete -F _sd -o filenames p + complete -F _sd -o filenames detg complete -F _sd -o filenames detp -complete -F _sd -o filenames sls_detector_put + +complete -F _sd -o filenames sls_detector +complete -F _sd -o filenames det + diff --git a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.in.sh b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.in.sh index 5b34c2bc6..cbf8fad6b 100644 --- a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.in.sh +++ b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.in.sh @@ -71,4 +71,7 @@ complete -F _sd -o filenames detg complete -F _sd -o filenames sls_detector_put complete -F _sd -o filenames p -complete -F _sd -o filenames detp \ No newline at end of file +complete -F _sd -o filenames detp + +complete -F _sd -o filenames sls_detector +complete -F _sd -o filenames det diff --git a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh index 07b4728dd..0ac10863c 100644 --- a/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh +++ b/slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh @@ -427,7 +427,7 @@ __dac() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="mV mv" @@ -435,7 +435,7 @@ fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -468,12 +468,12 @@ __dacname() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -551,21 +551,21 @@ __defaultdac() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "4" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -574,13 +574,13 @@ __defaultpattern() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "4" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -1558,12 +1558,12 @@ __powername() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -2087,7 +2087,7 @@ __scan() { FCN_RETURN="" if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -2137,7 +2137,7 @@ __settings() { FCN_RETURN="" if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -2227,12 +2227,12 @@ __slowadcname() { FCN_RETURN="" if [[ ${IS_GET} -eq 1 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "3" ]]; then FCN_RETURN="" @@ -2429,13 +2429,13 @@ if [[ "${cword}" == "2" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "3" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "4" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "5" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -2447,13 +2447,13 @@ if [[ "${cword}" == "2" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "3" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi if [[ "${cword}" == "4" ]]; then FCN_RETURN="" fi if [[ "${cword}" == "5" ]]; then -FCN_RETURN="`detg settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -2462,7 +2462,7 @@ __timing() { FCN_RETURN="" if [[ ${IS_GET} -eq 0 ]]; then if [[ "${cword}" == "2" ]]; then -FCN_RETURN="`detg timinglist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" +FCN_RETURN="`sls_detector_get timinglist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" fi fi return 0 @@ -3159,4 +3159,7 @@ complete -F _sd -o filenames detg complete -F _sd -o filenames sls_detector_put complete -F _sd -o filenames p -complete -F _sd -o filenames detp \ No newline at end of file +complete -F _sd -o filenames detp + +complete -F _sd -o filenames sls_detector +complete -F _sd -o filenames det diff --git a/slsDetectorSoftware/generator/cpp_codegen/codegen.py b/slsDetectorSoftware/generator/cpp_codegen/codegen.py index 03dac76cf..ffb2c52e8 100644 --- a/slsDetectorSoftware/generator/cpp_codegen/codegen.py +++ b/slsDetectorSoftware/generator/cpp_codegen/codegen.py @@ -93,7 +93,7 @@ class CodeGenerator: with function('int', f"InferAction::{command['function_alias']}", []) as f: if (command_name, -1) in non_dist| type_dist: self.write_line( - f'throw RuntimeError("sls_detector is disabled for command: {command_name}. Use detg or detp");') + f'throw RuntimeError("sls_detector is disabled for command: {command_name}. Use sls_detector_get or sls_detector_put");') elif not command['infer_action']: self.write_line('throw RuntimeError("infer_action is disabled");') else: @@ -107,7 +107,7 @@ class CodeGenerator: # check if this argc is not distinguishable if (command_name, arg["argc"]) in non_dist | type_dist: self.write_line( - f'throw RuntimeError("sls_detector is disabled for command: {command_name} with number of arguments {arg["argc"]}. Use detg or detp");') + f'throw RuntimeError("sls_detector is disabled for command: {command_name} with number of arguments {arg["argc"]}. Use sls_detector_get or sls_detector_put");') else: self.write_line(f'return {self.actions_dict[action]};') with else_block(): diff --git a/slsDetectorSoftware/generator/inferAction.in.cpp b/slsDetectorSoftware/generator/inferAction.in.cpp index 3e355bf4e..715109075 100644 --- a/slsDetectorSoftware/generator/inferAction.in.cpp +++ b/slsDetectorSoftware/generator/inferAction.in.cpp @@ -9,8 +9,9 @@ int InferAction::infer(sls::CmdParser &parser, std::ostream &os) { if (it != functions.end()) { return ((*this).*(it->second))(); } else { - throw RuntimeError("sls_detector not implemented for command: " + - parser.command()); + throw RuntimeError( + "sls_detector not implemented for command: " + parser.command() + + ". Use sls_detector_get or sls_detector_put."); } } diff --git a/slsDetectorSoftware/src/inferAction.cpp b/slsDetectorSoftware/src/inferAction.cpp index 4bc9b3fbe..31ae6919d 100644 --- a/slsDetectorSoftware/src/inferAction.cpp +++ b/slsDetectorSoftware/src/inferAction.cpp @@ -18,17 +18,20 @@ int InferAction::infer(sls::CmdParser &parser, std::ostream &os) { } else { - throw RuntimeError("sls_detector not implemented for command: " + + throw RuntimeError( - parser.command()); + "sls_detector not implemented for command: " + parser.command() + + + ". Use sls_detector_get or sls_detector_put."); } } int InferAction::acquire() { if (args.size() == 0) { - throw RuntimeError("sls_detector is disabled for command: acquire with " - "number of arguments 0. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: acquire with number of " + "arguments 0. Use sls_detector_get or sls_detector_put"); } else { @@ -131,8 +134,8 @@ int InferAction::adcinvert() { int InferAction::adclist() { - throw RuntimeError( - "sls_detector is disabled for command: adclist. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: adclist. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::adcname() { @@ -158,8 +161,9 @@ int InferAction::adcphase() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: adcphase " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: adcphase with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -207,8 +211,9 @@ int InferAction::adcvpp() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: adcvpp with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: adcvpp with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -271,8 +276,8 @@ int InferAction::autocompdisable() { int InferAction::badchannels() { - throw RuntimeError( - "sls_detector is disabled for command: badchannels. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: badchannels. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::blockingtrigger() { @@ -310,8 +315,9 @@ int InferAction::burstperiod() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: burstperiod " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: burstperiod with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -475,8 +481,9 @@ int InferAction::clkphase() { } if (args.size() == 2) { - throw RuntimeError("sls_detector is disabled for command: clkphase " - "with number of arguments 2. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: clkphase with number of " + "arguments 2. Use sls_detector_get or sls_detector_put"); } if (args.size() == 3) { @@ -514,7 +521,7 @@ int InferAction::compdisabletime() { if (args.size() == 1) { throw RuntimeError( "sls_detector is disabled for command: compdisabletime with number " - "of arguments 1. Use detg or detp"); + "of arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -557,8 +564,8 @@ int InferAction::config() { int InferAction::counters() { - throw RuntimeError( - "sls_detector is disabled for command: counters. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: counters. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::currentsource() { @@ -592,8 +599,9 @@ int InferAction::dac() { } if (args.size() == 2) { - throw RuntimeError("sls_detector is disabled for command: dac with " - "number of arguments 2. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: dac with number of " + "arguments 2. Use sls_detector_get or sls_detector_put"); } if (args.size() == 3) { @@ -620,8 +628,8 @@ int InferAction::dacindex() { int InferAction::daclist() { - throw RuntimeError( - "sls_detector is disabled for command: daclist. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: daclist. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::dacname() { @@ -695,8 +703,9 @@ int InferAction::dbitphase() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: dbitphase " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: dbitphase with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -732,8 +741,9 @@ int InferAction::defaultdac() { } if (args.size() == 2) { - throw RuntimeError("sls_detector is disabled for command: defaultdac " - "with number of arguments 2. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: defaultdac with number of " + "arguments 2. Use sls_detector_get or sls_detector_put"); } if (args.size() == 3) { @@ -765,8 +775,9 @@ int InferAction::delay() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: delay with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: delay with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -897,8 +908,8 @@ int InferAction::dsamples() { int InferAction::execcommand() { - throw RuntimeError( - "sls_detector is disabled for command: execcommand. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: execcommand. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::exptime() { @@ -908,8 +919,9 @@ int InferAction::exptime() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: exptime with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: exptime with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -929,8 +941,9 @@ int InferAction::exptime1() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: exptime1 " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: exptime1 with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -950,8 +963,9 @@ int InferAction::exptime2() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: exptime2 " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: exptime2 with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -971,8 +985,9 @@ int InferAction::exptime3() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: exptime3 " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: exptime3 with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -1308,8 +1323,9 @@ int InferAction::frametime() { int InferAction::free() { if (args.size() == 0) { - throw RuntimeError("sls_detector is disabled for command: free with " - "number of arguments 0. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: free with number of " + "arguments 0. Use sls_detector_get or sls_detector_put"); } else { @@ -1336,8 +1352,8 @@ int InferAction::fwrite() { int InferAction::gaincaps() { - throw RuntimeError( - "sls_detector is disabled for command: gaincaps. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: gaincaps. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::gainmode() { @@ -1379,8 +1395,9 @@ int InferAction::gatedelay() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: gatedelay " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: gatedelay with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -1400,8 +1417,9 @@ int InferAction::gatedelay1() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: gatedelay1 " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: gatedelay1 with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -1421,8 +1439,9 @@ int InferAction::gatedelay2() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: gatedelay2 " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: gatedelay2 with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -1442,8 +1461,9 @@ int InferAction::gatedelay3() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: gatedelay3 " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: gatedelay3 with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -1514,8 +1534,8 @@ int InferAction::highvoltage() { int InferAction::hostname() { - throw RuntimeError( - "sls_detector is disabled for command: hostname. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: hostname. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::im_a() { @@ -1956,32 +1976,32 @@ int InferAction::patioctrl() { int InferAction::patlimits() { - throw RuntimeError( - "sls_detector is disabled for command: patlimits. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patlimits. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patloop() { - throw RuntimeError( - "sls_detector is disabled for command: patloop. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patloop. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patloop0() { - throw RuntimeError( - "sls_detector is disabled for command: patloop0. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patloop0. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patloop1() { - throw RuntimeError( - "sls_detector is disabled for command: patloop1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patloop1. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patloop2() { - throw RuntimeError( - "sls_detector is disabled for command: patloop2. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patloop2. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patmask() { @@ -2002,26 +2022,26 @@ int InferAction::patmask() { int InferAction::patnloop() { - throw RuntimeError( - "sls_detector is disabled for command: patnloop. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patnloop. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patnloop0() { - throw RuntimeError( - "sls_detector is disabled for command: patnloop0. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patnloop0. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patnloop1() { - throw RuntimeError( - "sls_detector is disabled for command: patnloop1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patnloop1. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patnloop2() { - throw RuntimeError( - "sls_detector is disabled for command: patnloop2. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patnloop2. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patsetbit() { @@ -2066,50 +2086,50 @@ int InferAction::patternstart() { int InferAction::patwait() { - throw RuntimeError( - "sls_detector is disabled for command: patwait. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patwait. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patwait0() { - throw RuntimeError( - "sls_detector is disabled for command: patwait0. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patwait0. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patwait1() { - throw RuntimeError( - "sls_detector is disabled for command: patwait1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patwait1. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patwait2() { - throw RuntimeError( - "sls_detector is disabled for command: patwait2. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patwait2. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patwaittime() { - throw RuntimeError( - "sls_detector is disabled for command: patwaittime. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patwaittime. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::patwaittime0() { - throw RuntimeError( - "sls_detector is disabled for command: patwaittime0. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patwaittime0. " + "Use sls_detector_get or sls_detector_put"); } int InferAction::patwaittime1() { - throw RuntimeError( - "sls_detector is disabled for command: patwaittime1. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patwaittime1. " + "Use sls_detector_get or sls_detector_put"); } int InferAction::patwaittime2() { - throw RuntimeError( - "sls_detector is disabled for command: patwaittime2. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: patwaittime2. " + "Use sls_detector_get or sls_detector_put"); } int InferAction::patword() { @@ -2155,8 +2175,9 @@ int InferAction::period() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: period with " - "number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: period with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -2247,8 +2268,8 @@ int InferAction::powerindex() { int InferAction::powerlist() { - throw RuntimeError( - "sls_detector is disabled for command: powerlist. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: powerlist. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::powername() { @@ -2601,8 +2622,8 @@ int InferAction::rx_clearroi() { int InferAction::rx_dbitlist() { - throw RuntimeError( - "sls_detector is disabled for command: rx_dbitlist. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: rx_dbitlist. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::rx_dbitoffset() { @@ -2695,21 +2716,23 @@ int InferAction::rx_framesperfile() { int InferAction::rx_hostname() { - throw RuntimeError( - "sls_detector is disabled for command: rx_hostname. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: rx_hostname. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::rx_jsonaddheader() { - throw RuntimeError("sls_detector is disabled for command: " - "rx_jsonaddheader. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: rx_jsonaddheader. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::rx_jsonpara() { if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: rx_jsonpara " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: rx_jsonpara with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -2852,8 +2875,8 @@ int InferAction::rx_start() { int InferAction::rx_status() { - throw RuntimeError( - "sls_detector is disabled for command: rx_status. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: rx_status. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::rx_stop() { @@ -3182,8 +3205,8 @@ int InferAction::signalindex() { int InferAction::signallist() { - throw RuntimeError( - "sls_detector is disabled for command: signallist. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: signallist. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::signalname() { @@ -3228,8 +3251,8 @@ int InferAction::slowadcindex() { int InferAction::slowadclist() { - throw RuntimeError( - "sls_detector is disabled for command: slowadclist. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: slowadclist. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::slowadcname() { @@ -3274,8 +3297,8 @@ int InferAction::start() { int InferAction::status() { - throw RuntimeError( - "sls_detector is disabled for command: status. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: status. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::stop() { @@ -3315,7 +3338,7 @@ int InferAction::storagecell_delay() { if (args.size() == 1) { throw RuntimeError( "sls_detector is disabled for command: storagecell_delay with " - "number of arguments 1. Use detg or detp"); + "number of arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -3351,8 +3374,9 @@ int InferAction::subdeadtime() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: subdeadtime " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: subdeadtime with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -3372,8 +3396,9 @@ int InferAction::subexptime() { } if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: subexptime " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: subexptime with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } if (args.size() == 2) { @@ -3769,8 +3794,9 @@ int InferAction::triggersl() { int InferAction::trimbits() { if (args.size() == 1) { - throw RuntimeError("sls_detector is disabled for command: trimbits " - "with number of arguments 1. Use detg or detp"); + throw RuntimeError( + "sls_detector is disabled for command: trimbits with number of " + "arguments 1. Use sls_detector_get or sls_detector_put"); } else { @@ -3781,8 +3807,8 @@ int InferAction::trimbits() { int InferAction::trimen() { - throw RuntimeError( - "sls_detector is disabled for command: trimen. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: trimen. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::trimval() { @@ -3939,8 +3965,8 @@ int InferAction::udp_dstip2() { int InferAction::udp_dstlist() { - throw RuntimeError( - "sls_detector is disabled for command: udp_dstlist. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: udp_dstlist. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::udp_dstmac() { @@ -4441,8 +4467,8 @@ int InferAction::vetoalg() { int InferAction::vetofile() { - throw RuntimeError( - "sls_detector is disabled for command: vetofile. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: vetofile. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::vetophoton() { @@ -4463,14 +4489,14 @@ int InferAction::vetophoton() { int InferAction::vetoref() { - throw RuntimeError( - "sls_detector is disabled for command: vetoref. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: vetoref. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::vetostream() { - throw RuntimeError( - "sls_detector is disabled for command: vetostream. Use detg or detp"); + throw RuntimeError("sls_detector is disabled for command: vetostream. Use " + "sls_detector_get or sls_detector_put"); } int InferAction::virtualFunction() { From 9738cb7d7449fb6f7eb4d2be17119885a8998df8 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 4 Jan 2024 17:10:16 +0100 Subject: [PATCH 26/38] Xilinx ctb (#884) * updated registers, arm64 * compiler set to aarch64 for xilinx server * updated RegisterDefs.h * merge into generate branch and resolving conflicts and adding the xilinx changes to callerspecial and commands.yaml * compiles and can print firmware version (using a different csp0 address) * fixing other servers (gotthard, jungfrau, moench, mythen3) that it returns in case of mapping failure, xilinxctb: added that it checks type, prints proper fw version, checks kernel date, added armprocessor define to use in common places, added specifiers to supress overflow and truncation warnings * added detector ip and mac adddress to the printout * fixed tests and recompiled servers --- slsDetectorServers/CMakeLists.txt | 1 + .../bin/ctbDetectorServer_developer | Bin 328256 -> 328424 bytes .../bin/eigerDetectorServer_developer | Bin 444195 -> 444195 bytes .../bin/gotthard2DetectorServer_developer | Bin 286768 -> 286768 bytes .../bin/gotthardDetectorServer_developer | Bin 277196 -> 277364 bytes .../slsDetectorFunctionList.c | 1 + .../bin/jungfrauDetectorServer_developer | Bin 312448 -> 312616 bytes .../slsDetectorFunctionList.c | 1 + .../bin/moenchDetectorServer_developer | Bin 295340 -> 295380 bytes .../slsDetectorFunctionList.c | 1 + .../bin/mythen3DetectorServer_developer | Bin 300752 -> 300752 bytes .../slsDetectorFunctionList.c | 1 + .../slsDetectorServer/include/arm64.h | 10 + .../include/slsDetectorFunctionList.h | 41 +- .../slsDetectorServer/src/arm64.c | 75 ++++ .../slsDetectorServer/src/common.c | 28 +- .../src/slsDetectorServer_funcs.c | 210 +++++++-- .../xilinx_ctbDetectorServer/CMakeLists.txt | 38 ++ .../xilinx_ctbDetectorServer/Makefile | 47 ++ .../xilinx_ctbDetectorServer/RegisterDefs.h | 416 ++++++++++++++++++ .../bin/xilinx_ctbDetectorServer_developer | Bin 0 -> 231752 bytes .../slsDetectorFunctionList.c | 211 +++++++++ .../slsDetectorServer_defs.h | 18 + slsDetectorSoftware/generator/commands.yaml | 130 +++--- .../generator/extended_commands.yaml | 252 +++++++---- slsDetectorSoftware/include/sls/Detector.h | 2 +- slsDetectorSoftware/src/Caller.cpp | 293 ++++++++---- slsDetectorSoftware/src/CallerSpecial.cpp | 11 +- slsDetectorSoftware/src/Detector.cpp | 89 ++-- slsDetectorSoftware/src/DetectorImpl.cpp | 12 +- slsDetectorSoftware/src/Module.cpp | 8 +- slsSupportLib/include/sls/sls_detector_defs.h | 2 + slsSupportLib/include/sls/versionAPI.h | 15 +- slsSupportLib/src/ToString.cpp | 4 + slsSupportLib/tests/test-ToString.cpp | 1 + 35 files changed, 1602 insertions(+), 316 deletions(-) create mode 100644 slsDetectorServers/slsDetectorServer/include/arm64.h create mode 100644 slsDetectorServers/slsDetectorServer/src/arm64.c create mode 100644 slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt create mode 100755 slsDetectorServers/xilinx_ctbDetectorServer/Makefile create mode 100644 slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h create mode 100755 slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer create mode 100644 slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c create mode 100644 slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h diff --git a/slsDetectorServers/CMakeLists.txt b/slsDetectorServers/CMakeLists.txt index 2bb9386b0..703cd77f0 100644 --- a/slsDetectorServers/CMakeLists.txt +++ b/slsDetectorServers/CMakeLists.txt @@ -11,6 +11,7 @@ install(TARGETS slsProjectCSettings PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) add_subdirectory(ctbDetectorServer) +add_subdirectory(xilinx_ctbDetectorServer) add_subdirectory(eigerDetectorServer) add_subdirectory(gotthardDetectorServer) add_subdirectory(jungfrauDetectorServer) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index d236682c32a74be2c80ad4bf13f4a98218436c0c..0389e28a7b3f1e65a899258bae9d82b9e5fd5357 100755 GIT binary patch delta 109612 zcmb514O|q}{{Lrr&;>CEL4|x;R1_6+ElVuT#fL=1M5TPla!o34*$vC?wVSs^ua%V* zc&w}}!K}0_v8+HWv3$U?!lJU9CFAHyg@r|hrSW^88D@7#-TVLhdVO)tP($)`+Em2sLgGYS(II0pMl zGNZMUOtsKaYebK~r6pT8dNj{H3Z{xoZ6hu=23;t5kxFfBn58RT>BjU$ezxv(czbBI z;SRmzYLDh6a7_Qzkyk#yO!X>y=dipohkoB2kFPl(MZf)!<)uAPXUrFgmY0eip`YE& zu0%y&_J%ViNwwU{6wB0pGTWh#BMN466#WfHe)-}ug(&>jkxvwQkC|h6=_K~WNtxQ* z@zI!CsKj{GOl=-CZ@joKEXC)!CmesqYE_x7u`qXiNvu2E-OlaMpUd=UY2y_v9TyH6 zntq$3puErsX{DopkeaTy2XswRKdt(YCuYb@8tHa;9eSIqO+}KKbzuQT(SHb6#DMSt zaYwG|r`7%T#EhV;uf(n4<0C!eiJN#keEiV)gcD4{hk+!>1nnk&mSri@^j%6x`R1|| za^gFsg!o-0(jz(zG4m;1+mhwLwvv07Touf{wMs?#4kJx_lnU;-&`OhdG-6O&&poY4 z`4w7SRx7Ped>GL+dBwQkz1J&M<@=3$?^mk0_ovy-`61dx4ve+#Et$|tE17U%*(k9; zB5~{#+x%5cLmgcmbW`oAJ0#pRiy zxe#22@L+}u2ZQ0k1~17-fHU9>ga4JG!ZYES2H&3Hg!AA$gKy5r)K-s<#%R#GPn>Sm zv+EYFZkf2h>~L9=KDJ5bjN)z5=QYWk`9chDotPLwHxrTFq+ihFE+0g`HR)5D++2M} z+}65lay(b#vy-^HeUqm=-MBua$;0)v-j0Os;krj`ZrwHR5iccCu9hh=wbZjk=!=Bb zI?i#o_@(uv$ko{nZM7Kh?CMAte{&A$xewl#y|%2r#Nm#1$GMyIrGJ{Wt4ZJRr>tG^ z;yvfU$WypGC4S?+??s2Gfsv_`99pUv7uD7AuDB^GIdbMCazhkGb?CcxmRe?YW9KOz zZ6#M$PHNKsJT3i|>FR0t`-u2B>Z-_f__I#*jqd80EXGFnjI6?SmAEasL()aF@-2T9 z+1Zwsq-zbhZkSYB^b{>MQ9K`gQxE54hvuAIS~L>n&?H6guT+ezDQ}!zRZhn}nT~t1 zxS&lxN12%3=2qXUlN7JRo918CG}Qm^CXW`6gZRnm+Gsq%^pY!T%KK@Je?BqeaM?(A zlGda+^kG-lkO}Emn0mUFf!mD9G<@B0ReibYLO=b)j1#zb=(Urq>x849$f+-{rx<>W zlWwNYNRQXDxH)TbKdqiy(%qA}WsR5~Gc`7ch~(HJGD_@-iJSiM1Q~Son10$3qLi+! z;_g*O&@1t}yGz!c7iXz%>-uW0uQsmdj~VOs++^yRgffqanRm;G-6;mN?c{rJl6BuY z?prr`s=LQcG7()T6tu{9tMipTS2X>Y^&nDW!c|4jQLM*~Z2!&WPI*P3o1M12Z%B*# z+^S29@(oX$=+L8b75%ME&X_&{2htm>yGqyA6Seh|-=zb*J=;>7^l$#K8c_HtnF)Wt z)*gx0E<2e~S}32ERK^-Ix@K~d{`McLd@jh^c=!*}t53LAeAn*$8QXZuZp$>ErWJgy zX#TvD&pUbgDlz9JWb(-*hu(*fO)~GPx`=JoT+8;=*=4M(pEP~ zzq6t2@n&3)5bBXjxF?qjwLqr0$o_hy&2MA2qPqx&lrJ$kRA_YyCwNrOK7MA6%Ps_2`m=_sbqQA}yl zZ~a|%Q7V;U#qYA~JAIAfttyXkeNm?9-NkA3+9_98xipWW=qdYMS~~yt;{TES@8bVa z{NIKDNArII|3A=5(Yfdf<EB`u}Y0}G2TJ^r>q^$SjudyE9*S7EKE2X-WQmMSa>&Q*sDqZ_et5tYG*j{>?F<8YCwN&PG8Khu7z$+@6C|S$#-UR+Jpze zrecqE8tv9f1I=!_6_Bi#!RW~7uO#{_iT;VkqVi(nG2QWG5z$|4M1KX*Z_Ytyp+~F5 zajkH~$N6p{Xe-;57#W;J4t)o~HFpLCXLSooj0`R&hk-~=lm2?6_1rzsSV3^3jNozz z&MF{=@VNEj_L)XGij%$9yNy-29WW!)7bs^laI4fE`hN(#xx*pw=1-KI416gbF2%z; z8_i)|lm1j=4IV}sfp;Wut2TJFgSb72+gXj~z>c9pqpXELPM38=wC~Vmh?y~F*_p96 zKbxMIpUnT+nKrO8FSXnI#$@IHDc^+{UBc-cmGZw1< z%^W>9=^YwNh)O<5H9HyUf6oNjSY;D1I~BDsVWO3r(nm9f(#I5hOu1@4KJNLg;*#cJ zO5Ja=7^dQ-*;h#~hbPD$p@S>RTU8e8Ug8OJJKfFwow%W6PoLRinNe>p0Rl2V$$+v6 zDEq3#1hn)wnd7nuH~c1ZJbwD@vb?hN?EErEb^%dtu49E(G}XfNY|AGe9DLqFJKmBh z6JmbC|Iyka0$6laApzw4W);(2zsX`cGR^*U=5-a9>#u6kJpp$&81AaX_)bF-cXD+n zR}%tPhZ|Sdi>J9-&DCnI*8ggS(ZRTyFTU?|YtK5a)?HOr)TD0=T;KnzjKi>LR*B!8 zFtEAAHzmxuP`#QC`0B0PG4WR`TNeB(v*plK>(Nqr^v5Roa53wT7@e3BX*_ep{KUi& z!AccPq5nh=+0X>EKSi!T-&ILxug;K${L9~;Dz zod@~MRGZD}?9bN5BG-9~)yASFyVWHgZQe8m3%+AD;ClnUS2xJlaak8nHc^`NZA2$@?^3oQb z+V2|0UDLR08h1U~V72Hi4YEad=PtAPN&hdvo)_S@pP zZ5_9*n|hMcy{^H01#Z&+(@@2IKZtf+FKg9Yt+Kni&NqiLvZAD4okxK*yr#ZBIalCuyA@g$@=hT!_1m=7kFEo*~@{_dlYI3xCT3ONW)TG@%1^S7f zjDA9la3wl!64PB1x;EmjvDw|yfV&NbJ6@?>Q@SQhr);L1K4k@5%r{&d6c;6p$QXu; zVYq10yZ>ZWjL|>Iim_>mlRj;zY&f`?X1Hk^@Z&KZE~lP<&$J8?;@4+(B?I#G9i%4;q|hp)=x5Hm)atB1x37Xm;n{F26HF$ww0ufXd9c8bj6QW!QJwsOw#AsW|C%{5#VAOVBAOH_N?2( zWcViWK%eBe-e=sZ-2+*qFukF*r>fqOdGYd=qKx4U!?a-8fbs(pIrD|d3#smoci+8qL%Xk zYT-n;c9WtDQP{7;<=5{Hc87A%Bd;+~(HHHe9GVv{9O%}Z0eySh7K+wFF`ON$&l6culMx#j7|-OlC*!+A_}S)RleI-?>I#C7K<^sv0L zLY7M=vOjAb3~^b1&!jp=$xLq?iBr;I+9j~yqwst*v`%P>zF}8uXB$?8f_nR-amsh) z-HZ&8*VEjJ{_HN5KEb$8B&LoSQcZ=do*_pQ8|&m~LcY)MudAXu4rA*3`dt;gYtP!{ zbT^W&{-p75hA-ENM^lp`>t-KlD!qU&9X#dVDXYb=tJuutOCjdfNPf2dAY z@n1z#YGLP$YnXt(W(Pxi)wnL7<`)~+i^R(V`bL&;y+nLDpl|1VKILB{pBrC%FMX0O zPkk?ax=D1spl@UY*Biw63;K56$)}x$%Vz^F-!oiZARfJ7h~rYR=YoIw?3G0=Ofw!C zF*A8>ohfr*;P=*eD(8Ed1KYD2=j4_D&DHpq%G9Y)(Z77JwX+k`hM&Esx|vePj|{_) zw%^M>+ethx{9ZnGo?&U^z4!9Uui&9w=d~4K+p`qmCOkD>X7O(6%qIQVcUGcfjHLY2 zh)@y*DyKl!zb6ay86psfpy=wpsdFuN*UlWu1LX1VtTAZ$cO^uow^-v&Zlzr7(3ES% z`|e(jKgEykzK&RtI4F74=xcdvxVD&58Ty@-57&Js^I`A!8(e9{a(JWY-@lu-S5Ss?|Y`c7XiYuF1v5f$?i9>^u9Cr%G zg+mgL5YmxrnY;YfsvU>Fm1R0XOuF#m$5oW==a$bz*NeMHx@RexTclqcm-)dsm$prj z<1s}~e%k3inI%6(Kg}dJ^T)k*(FwJUN|0Jdc{Njh`s1n6B5S%*z9X9xm*UxrdnIP! zan`IRz44eVF!_ekwN@6`GV#^LiHTmWdbxV&m`sPf8eyd4HqrKy#Lf%3x^R|kTDy)} zwd}iNvKUyoyW~S(0oMy=Y2?Es#=0QLAS8x|gMQO=b z=DzAQT7DX?(s1>N->UDg`(^fZ%W$%`@^#abF2(r&F~%ZuaXS~c3;i-PWjvno%Sz$Q z5C_w`IpW11X*(hp;Anx^F|y0@o^Rh%dbXlLo(OezPRpqFahsj4}9u|lX zF1zR|V`9H~N?t7to19;s&pMLq;udh<0`B|ph*dd%IwJG)+AAF16I%z6ij}xniHmJV zWIo6o*N(`1$P!bA^=$jnTct%kXujss!GDJJAG99#>u1ZHS!~=P`-2yZJ7TYBoKsak zfPP$wiD3X?-F0YK_ek^p@ZqDzRdIjSZ226xIB@?A>u7g@)Y5p z5{}C|IBpi5F2CP5_m68HvAJj}-vp=V&5sPxbwuld`e@w8B&cb{ zNvsk$qv8@g+H&Hx{CfF#8Kzq`Vzw@8#6B@)L?7RRH&wTlPfK=p%9lNPdtndv%zRAO zN{C6x^}%?YK5TVqJ#<;09v+=ZSw~~c(K0ZzK3A1c%Zbr}>lf2i9X?zmPL60h(Tp$>x)Orcj-1fgPPMP3O${Bn&qno^4%54cej=A;$zRK&N=v-WB5DKNSpL`!C{%U zLt;Ssn1RcI6V zxWe%HTg^(}c}9%y5+~EI>U@yv2aW5S1J^&-Wcuk3N8WkysW~i(&vCe`%3HhAH6@qf zL9QewsB@X1&fQPW%?#YR*toM!#EqKJKLNK1xn}(_-~W3B+>JBbZ5f$XyqCAiW#XYx z{~WsFB}Nem^8I+ci|4<-V7Siq((r#YyXgP$JliQ?M)>ysl@fw*2)5K+?$NA=Q zbskrrsIgMHtwyGz&qxIysex9f%9H>r0=Qm^>wLqt>_472T&p7+$>mpAy{a+#BKgkS zt2tg(<*~$TVvBek*~sMaw@$BPrhZF?oPeds0s%!5&?*92ML=0bq+J9w--z_VbVa}9 z!@gc8i%(7h8U3M4dzOK^TR7cOndaws;nH$>GrL^O8q+Sc9*?*Y%oKC5Ken{@Hl8^pB4&~wa#`N?um)DU)A5Kqj5HAmk zL07~%rid|DbieEre2O4mJS68hfq^Zcs1=riZMjdHJCtTre=b zqQh7>SKVCo9g=;Jyno%H60WvOcXR(tm!~YsTR73#9QtTnkH+=fL$Vi=t{*-`9nhJT zzM^wt9#`|YdgUS6kI1Wc9IE2#H)7z}#6GLIx{9k8AF}G%j6*eC-Q{u6o3v6GO z+%~pD=hrm=d$Ov#iZc8$6oxMg^nJe`7s8-~Xnb6kaSAXCyj` z#M2p<4ef=SUN`P2`-GC7C;g&qoAknOWKNtK!Ky9S)9~Xu!;b{6{m1ZwdFFA$gJmrcvzkDo$3Xh&(iSR7+P@S< zf1w~n{Edf&bp6bnfCEJK z0Fjk}T~A=S1lGGbFzcEO%=j$UjPDy3HAcKYKFyk(cV=~IWhPDZ%j(fL7?YuNjwJ+M zQJzZR6}H?nXXx+Dx^uw7(M*FkDKTAC+N?hPQKy@ZlcLI@sAe3rx<=nYS=`@=P80h3 ztYzUqF7p~;YOzckn+tU0yxU>y9Q@K9T-goe9e0?kz48uoy)k%41$S7>vCWA#mh((4 z*2gW)YlwkBUZnp1yUCmxsVKjmk#-G*7_3w60(C03kop)UCqt}>U+FSfF{DeYVpuM% znOo^{+V~04&GYkp1LbUbniOEQu%`TcR}~H6rqkvCbvZe@oE%;AmCR8mm4D|~GDioB zhp!wHX)IKVFRmOlAQH%iDy&+k5y~6aO}h}LxWL|NRThLB}OEz zICf5ulSgu4w*HLL-!*Z5;^RGoPanCLOwq^eX`JKG-xL$GJM}eIZ$_A#RLotQ=Azm> zRte@cZ&Imd;<;Kpn%$wxh=KjIRqPrK?*6=FV5XLb+r06jBKv@E*9GCFm%gGFCY6rV z)SJSv`jT+ARweh$-kMaJUFwLEL&zk5WZfBfMK@m&#t~;s|dkucDVR?{P&m zCL<-^r;h%qc->nECJikfsg1rR3}aPp2&-~K>Pz}*D~Zm9Z!_DZ?@f1$PLq>;&fDn8 zZnNeC%m}AzIkz~lk#4zxZrBC9pWVXy*)8VPOkT>jh39RZUn;kwYTLt`7NYu2q_!l&=>aOy)eO1>d^}D4bz_t&+ol;v5}m2!t?Pa_A&+n z`akeSB^T8pa%rjr$0b6W95>*POJCv9u@lDh1>r?oi;a7q3@_r|x=ZD~lZJb=Q@A)K zlBUG@zPgkaCd*@pET{Xq+cl5Zt$B)mWq8Hb9YzA~2(RGo-MBPMRA%JuxEzK{OdlFv zwROMY^1ARUTyDmtS>Dp+wYbd1C8qZZui2^@F2{w};BvJOr)HIr!OPvJi*SnR?ZWG~ zo-iUmIJ_RG_ZyL~8^)6n7nuHMm{RUwMo!UthAT9Te;6*l!bL4EF#UL#S{`e-XdkZP z;s(RT`@>`oC)~<9$E{Nx`ko|NFcpT_1+mMm4*l&UnNx2LbC;&YRJFIFC|B5yCfak} zg?mgd3v-nx@sL;aZ^B#zG)O#<)7|$*T0gD&_a|nk-b{BG{-sASaY}Vf<1S1u43qm) zWdhy|b8}Y|nPHZyoYw6^8@6b%*3`tyj~Y~*xk_8PxM;a><}SgF8YNdsO|5-LdOhoM zg1b#_x|VyZL(3Jzuj-zFSIlYoJVEPt^m(iR|!+d}N|E}mO9M(4aw;Xx+5j|Aye$L=3rvJymlDhcz>Na!#NW1*#U8nnL zb-&nqjF?n%`J|;NEa-%%T8V03XkJU#^8W6?FNv0Gh78_aw$Kp*vadmY>W$W zf$3ob#muR_96yT1Q#;3PNWID(md$!57xVw#o`kFvo2Di@I*GkgyZWB(Zv`YDMbWwa zG%vkJy0#S8OO3$7+0|P2%hVaoSKM+7>GA%7B zvSdP<7-nk_B9Pu{85E0Wa z9N!!q6B3W*Gx1MZS>T) zi9aKI`wH^tR`aZ`oGBi<_LaBEt?Ms!lUw6A!W#`<+f8nbuY@ZNeyW@7oDRYV4PMbr zZjG;p>kWReo7@^7f&USC(!V9$G5F?ga%+4J zoMZ6y-Q?Ezx$s0oU~O9Tf6?$Vy(iR*~nB=B_VS4#&1h z*Q#L5;3)VAj2Y~JmHE7R&o}vGbh_3B#*FJHU^k2z{4JaTV+L!{=|0VifEmJNgPDn?vQ41 zAsi2520sAzf-!>^!^2?A;Je^#7&CZ2oC{+H{|#OUV+POmArv5BhAu7NRwhr$tekbpZ(9t5Yrm~p)?JQ~If_9Y>B5imnYgcre>!Ljfv7&ABu zUJqjiJK$0nGx%f_MF3+4pMVd*n8Dw|4KOCzcUVJE7dWID4!(qY!I;7O;WQXCcrTm< zV+QYly)b5Q8N3L_4BiZ{f-!?Pz#Cx<_9=&p5h@Tc!@-kqHH;Zt2-m`x!4JUBJNe?n zohC1aT`*=`zY87)V+PNMb70Kizrk~1%w6xJnaxJXN5BjR)8UmcX7D7q2*wN^2XBNi zgVW({FlO*jxEjU`9t79In8AJFQ!wWC$#$NEknj&?#r|PBNQ6^i%(x*I&Vn(6qu{wP zX0QX!hcSasI>~YvGx!9&5ylMu7OsFXpCM=n2M{oWzl7^y%;5d7@=rRNf111(j)yVh z`VP1kj2T=84}&p-H^W&lX7C2s3w!_RGlgP=1qhho;7Pau#tbfmH^P{~55W6i%;3dv z9gG=#7aX(DAl@%+|MF33nuTHnHx4kv!IN+nj2T=A&xJ9AAAlFZn8AzT0vI#+ zF1QHB44w~{!kEE-gR6W9Rn5X|gjyIg988CmyGg;_CQpLnVa&Kb4o-nFgVSLTj2S!> zo(5wE4}#~xn8AHvUp@k62uTPlVa(t}cs-0691CxQF@vMvDi|}^0Uv=e_+)R^fiP$oGz`L^ zi=i9{gD!yPLYVCT`+$o;jEgR46@)>F&=v@T+C!BP2DO0>LKqYQ)k7F`I+@*oWQ6j};l&^~Atgh9KYEf5C1164s7^cGYD zVNeNF4`GmR1E}QF$nqtwh2kL$dKyZBFlZ&@fiUP{XeNX~_d#APiavErl>> zK2!i<(9P26Y7hhGK&21{&4el;47v(B0AbLTP(6e}VIyA~FsLI`1YuA+s06|wCsYYxkOMjZVbJfr=+qz#`WaG| zklRZn)%9Zh-vz|Lqg+gdFz6d-7=%GzKv@t5RY6_|gZ4rTAPjmJS_WZIIkXzWpe@iA z2!mdMeEUEQd;zS1FlY_b0AbK7$oU^K_&<^gp#%tn9)waL4Ehh`fiP$hG!4R_JE6G{ z2K^mc=mQrTcoSFvVO;b=>mdx94sC-lXfjjgnaw~Ujo;I81x)e0b$T;=m3O4k3sbi20a2f?<0fnlXO3n0AWx*njgT_FsAq=`4Dupm; z2viMWkk1X)gBaKsig}2!&qI=WKq(Lgb%rt^42p+xAq;8@e-+0c3jgT_IX5C)BeY9S1| z401k7+j>;eV94hJF>nBw24PTdCmUq@hAJQo3Wp9t7<9@- zU4t;_7bwP8KxHeC_ygDr!k}Z&FbIQcpd1K;zJ&514Eh8rfH3F-Xd{F{JE2MlgWiT} zAPjmFQVMzgDTNX@fv!UG!l3m~8iaAJ7|Mb$=qYF}gh2vY3SrQ4s0hNKd!d~W2HgYI zLKyTHw{VFz7sJ3xq*(UsffAK}@xq z8<1*UEC91w`3%$Q&-4?|%^wh1#JWR~_-y{5aodb_2Pf-#nVO;U6*czAG|2tx%O7EJ z`w{Z+8S?NMzB$<5(yU2+xuj%H>R%})-adexX8*oDG3@>J=4m&hpQSO0&A0dQ<*#9f z{u*n}n_XAWvg_*ElT5+SZ7-+vSHr6f_O_Q(`lWEG!PDByDgAx$K7+H{%PIXDxW?d& z_Hs(U0d6qZ(_T*LI|APXK!71(Kl>TUVw85_Sa!P+1 zJk8*Q_Hs&p9z4%rm6gWeX*bE|TbUf8u*Qq4k~Mr6IdJ05UB-zw6CdoyQe|^#gyS%E z2`dasAiw2nOXs*RnWXFZ+`JIc|p(EV9C(} z#?u1C^aWjgRvG5UM6<|fQIgit;f(4UP~d^T(!bUzg$b@L7V!3x%G8&VQJCzO3)+g)8xYc zw%8vRX1Ng;-FfllN)cT|k*vb9>PJ8rB&&W5gh8_E$3qw-t9}=#OObft&K|ybMHE+& zRp035xP;+Qw!2gagJioK3}KLLcf%kIl7VMI7$gIq31N^7JQu>CVBnHycfRJLc95>r z2cj{ypFYa=(??}9vy^28Y~?JF+f*&33Z<$*o?T)oX@#sp7gpJnjVK!n)y+XS`73B# zE3$2hFP=4~cu`=J7N9H;RW@ZO%1)ua7W61NcF3>T-%1W4K3ED^(tmX zx>)tMw`mRQ=>XQN{y0PPMH^Y}+(0j|LG{Pm9IirJh1S8Q9Yi~b*3qWbqt&BzvS~A4 zV*C9|sz1S|ZF!mX*q2p*qD@nL8`(;{QT3m16D!av&^p_+h*wyNd`0zlv1z$zxoBN& z+IqD0Xx(gD(W@*%zpDDX+q5HSN6>sOn^?7pO0`M#C)u=RB~-l<)!)OWRct1Ln^k{L zn-=pL-<^3)_4l%AN6?O-CEGOj>vX5DtNz}m<}*N4vnLtwURf zHqfTkq1Ba^=LzE+T5)yHg8q^X*R7_IW3}G^$%^K|#-a^Isxyr=p{*|cdp$-$kff3!^-wu?ybQvG8T zUobYy5SJldVRJZdH&2J%s(-9aD@7|s%dlzgJ=E$ws(+kKTZOg?Ez_ncl{EKC)j!_S zd}RMz#JPxBmWWn~R*5#jrlsy>D6m)cUun}8pe;a~Xww?d8ql(BTH5{lWbZk zny(abvQ0dNcnWQbO5^H?61en_@{sQRbd9J)SYKh{U8e}+w4hPDjt8k<&+R*yE*rcL{pa{pNMUu)AU z&??Zb3ur!%mQuw7r%LtD3W$t=(F)MKHf`a4zTmcB_0P6x2ha|n$)Sstko-@0$bO>w z=h(EIPuU0Zsp`+QY3tC|`4Dfgi6zyH3#(QCjW(_EGY(AnO!ePn(@H-lw?0?>b8Xrw zG&Umo|7O$bzaVG6Q2jUCw4wvFumh_97Bt#_G%+W|Uy9k#)!BO@%Esoc{D1Lruy%&X^pky zLapjwVAHa{;~DXt>c7*btwURf_79tu@;ycTz3Ts`O^ZLuz~`t>^)IxEjfjm$RsUT! zEz8eX$FKVTWz(wBs?qMYX?X;aM<9!A+UPo77V1?0zirwov{h*LNX^%r{aubT4m!^B z*yb?d7}<49_2=8P184`(7TdH`awe6WSz^<+plw0>k4?)Zj9kK4YSVlvKae#)sQ!Cx z;zG2AX!qH)Q)s8q?zd^4A1S6ERsS-Zrq)wG>Q(;(HZ2D&2kk+dR*hC&uloEC*~Eks zr1*sDUvAS@p{+uD*rpvsJBap(O`G`>L$04x|D!go2(1XMz^27C@RV&({e_0sJpNmW zxDs)N&7tczI-lQEzp!a)BdKdt{VQ$S;8Q&FPpSULY+Ax;5^`GgKW@`%(Q472uxVMo zKdD@Qs{U0raSPfOv?py^mnP~*lj?uUrY%EThW4~gi&03OqWV|cG!A>#a?qZ!X)_(< zmV^5CtW8V_qb`K0{xvo&CL9mLRezC9+laf3xGT144Rl-$bX;p~+7>#lEp%MZ*|co@ z%f`QTre==+st~IXpSL-TkDz@WXfN8d3bYEe^)}5J$#^nS^>46g5v>?O zw^IEt*|d3)jQ{50@MW7=hr>D?ZnSC3(UzmVV$hL=wf6r22Q;v}&|!v^_R$ zSr3|L50%3;gJXj#v?{c{mL|u4b-k!?y;T4EmWY;>Ouvw<`aiH~%gE|wWc5Cqwj6iM zardE3t3<0r`^cun_og-VR{b9<9<7wmrM=BaQU0pG%I5GC7f<1EzfGIjhi2DD^?zd1 ziqMMCKDBAi6q;R%>aVtG^U&s@eP+{2&`Qugw~znSzEqmNs{ad{!-Z%I(GJ+OBWOp^ zzO-p6{ph&*ss8`kwAE;<(Y~^2YJbA$ulf%LG@nPyLCit?Iv|ooXr*Z1*fb@Tv3siO zKV;K#(Q?shY}$IX^=O(+a}FS92B`kSHZ2P+%ZI4j#Epm>(T>=(tP5~>f$BeM(+bcE z(EK*dJ&+D*pz1$n(-xpDK&!QBrD&yS-=YP^e^qX3rd#!YXLFcvAy2UjRsZ)kZ6?}G zv^tySy@>wfBGrG~rmaI;hxUU_ix^DH8Law$3~D|t12F@!J}7GI(bl7#uxSe~rY>Bp z`hT)%ThO+k{cO`pFDG@EtNsR?7BPZ=N2vZ^Y}zy``n29Y)&HwaO!Y97@~HmbY+4># z9$KSKt3s*8U)o6C&qk{L(>8~T&=#Tn zY12-jokDA}X`WFG!$zro#nuH^pjDtbY+A%)5GrqmrIs0F^uVl zBR$PaC{21y;6TDb#({(*yEQKd1diIX=Emhx42zqrATEDoBy*p9qo=6RI4UXHz14-c zZ`r)nj5F}$+K0$fEKhzTG^OFBk>0(TX9H`M8WPHt&;1#lIh6xtm;g>9JFPF5+Yj z`Nhh@M>;3XiEZy%T-I2$g0GWY8=GIo|6YggR`bgW%hsZODn5K9$>+vLckyJd{Mb%@ zKj+;DdC+%SO!8S{AXke%BTd7KnMP`k$4Ckx49nzus80q?@O#HNXYb=Kah$D@a-PaP zGr4DGu{?$2KF;t#x zZFO-tX8me`L+=n_Wn7a!f*{QWoLnPBj!!D+KH}V!U_rZnTEZ!NG2epXZnP`ci&+Kp zd!E~mF2r{EGtt^|@pD0Pmvg&oJWmw8(@|s=UJ}C5&hu8hcfNSD@bb>*_UJ*;ZpCGh z#&t1qMTZfkY)&#g#qZp>$EC$94v=bW5VRj!pc={4o@fB91u4mSt)#u(>;kBBA|*;K7!V2cN} zt-3gDwnP7_t)({U#m4b{vW4z8j_>>8{HgA>H+eX%y;O`99R{2`#hhIOK2r-*IrRWz)pk2Z_TUF;>i)^c_D~ zRo(xC{3_XR;`GYyA#&tbG32o^A+GNhPdt_$nX;BAp7{E)5v{uLsmof?x}8$!Y6)vVsEfB@>Q=5)2i2+y^!>@x6RY+ z`rLBu{8_jlWk{x}H?EU{sd|J3zp5n=fkyw&wqg{t8_Y%w11xpmj8=^qZs!Y zM=^da2CeB6Vt{a@*?1!7N8&&X_&nJs=S>JTDV!deSgaaM>l zegL=6Y>5q}$D)$ncmt4)Lm3^u_2kF+@d{S^vocvb#Lar|4>d;#2#HQ>@n>g|L+HST!mjm5ec+%xXb_Ttu=!frsWRzDP)1%oR!+D$(Gu3vA*|K65mQH9B~GRjdCvb|V<(T#psrvewWWBwbiMUDsp#d6XU6jR2pP*8SN9;ZpI+TE zvp+RX`IMR6=sPM~Pn40{*{fqnQa(w_=cfj8isTD|e04ETz#WCVTRYJ#J_=-{2z(;? zqiwGsMPy&m`X0uqcl*Pwy2+t_N3ABc?Wk;0AF31W)#k&ql&-y0A~vv@aD&2um1m~+ z0wcXYisBdJtUPTIz0S7iCE!oOhWB|cEV4yz^f!f_k)7% zEdBp6D@uPmGb>uJ4VPsJk8$F1ljy95pf%aH|OTr-m?#eDSFW?B_@S|U)6_!#I(qF`L+DZLGb-5s%j%$&4&$^#!q!np}?8e}D_MO$l`1n*0HU+yJZu`LPSKoaiNWFPl< zj7-A4A(F8EC6;~ul7bKCDB`zG=T3v7FBBJ*3>qG66ILej4F_UX`BD#Uyu#z%_WJx| zjnxap8)wQUi{g?&=gcL34O$#88Q+`>E#Lg(U*?tiWiy2Bwl}hSYpfyTOEvPLSKelb ztEg-j(rH+$G z1F5*fIMj8i&^MpE1uA;J==s{YTObENiutb%Y3^I(2>r-e;`UnEdu74+ttNh}UnXuw z&k*bj3V#a5viy*h*ENUagXn~adc9|eyr#yze$hEwvZC)fE#BGLQEYtOWs7RBt!HLq z%cxcn)vB{Zwdq7Ks(k}dz0!#4EHPk9sHn~qw`>^@BC2Vph4+n);{7cbhH%vCv`Ba( zHAIFS7PHubfKkk{`KeM&=xPx?y#NBTluCw*n1?ynV7%BGyPn>@coPp@udiEAT2nfha} z){Q%8_4I!~D7#5t>tJ`F#AK>t-T5~)>D@L3)W3AYmQU$7XoK;7@W$^LO--@Az9t$+ zxXQ8S<;D@N6I;7npK|v1Unh~}1ai(sX7o0;e1<%5ozu0S$JJb}&D|&-+}b-tO-dCX zY%RX{Ttg&9|LCNgI?r&YYnIh@XbE?rIG>73d8Wht?I+a*5hma%Sy)A-)Hnwbnz zyKv(~w}Z^z^Ius+at5jHzp{uC1pl|7ui`t^Th5BEc4FkmY(JZD{s z?z_qgR4uG1pXy$6lZ!Dv>mnlk?M~-h-%<1fjRAiOjbF~zzZdtu9ja?85o_M*B>ww$ zMxU0m+_H>|h#XZVczw1jko&pX!NV(8za0{+ z;qM;#$Yf|Nf0!(sA0|`uk<^Fg+9izQdxYY9WJlRl_q#VL`WJy1@2ChB3kq__4L&oS zTG>yWHa+06pue*E$SRY>kFP{NcCo9bEI+1WLOp-u60C{uPs;SNdPZ#4y#7s(2k#Gj zqKwnZ5GtV|tYUqL)u7#CSC#l7!^8jrpr_P%$+c=HWM zP8*+SQN%CVirAi&!8GlsxDQj@a@NDB4C1bxp~AaJyuI_H$hgN9j)47TXZNmV1(IXH zmcxtMjjcH7a?q~0t~Y#ZPf~~;r1EED`TwOomxSm8cmdxtA;fhr*E@@QDnpHRctTZ< z2@#P~KN+L8k$XdV^1gURwW>+5@y6KB4{UXNG!Re);i2{EI(o-X4S(c%42WqYHT z`hKWdIa)mZe)9SG_@0mNpMGlj-uS8XJ*r9k_x;`>QW)`*=<>n2UxpQ(A?F9liRM=c z`SFQ>|BoB~zbKyhAXMxbtbGtF_PmGeOHQmJ_Ep5bUBLIjhVNsM2CJ$Sd-o#1P8ed`F=9M1WNTwG){lTgMZ2zjVO8uQGS?VAE zVU?wt*<93CU23)JuSIRIO3&F|6K<=rN_u6LEa~S(@&0q~XHoQZ;;a3ky14~E7)3Do zlYVCzA`W|%jcu>Cd<|eD)F+{)7hFRBWWrgeVX|N47`|6~Xs!8ejai3-`SifYR+3)* zSSD$^xb@S4=iEugsp`j@^HFU7w9^@H3Q_-~ia#P+SD$Mt>)k;6ViKO%E_+qcKi7gW zRX(<+N|QgXBBq!8o=OXjU0cK61YQW7@|5;qZ}1+kR@SD0Ew6@YTV9px+s1e=iE-OY zHjk@6va;ahM=}ede-{U;T_O5z=W!ALS*X6-FQ$GrVoWeHa=OrpOg)jQ4@QQ#q}bvz zIS`kB8gb!A|2_*f@5YSo=b`%fTyf3kBd$1mOx&BoH20=Jwh)sSYJ%Ba^`Vt3zkDcj zrPWDM^LeOTiKr7@z6g~oJkh=wWt+h}Y%B12n>agXlcM*r#b8n(2LCW(aDQVL2Jfa z&bX2m8CP;fNxoL5T(5uiwUrtCx@sWN{ftCk_G^z88E0Q!wP##cTgK_{Tgh}9$>g_I z4~BYNCWxO8CMOQw%$L+QGc9l2EvIz$y)QF~T}NMs8k8OocYGbHD|}PD^>uP$2EJ$D z`9Pr9q4y+-OF{kg<}Q%^E$F?9oaQ~uk2N1VcfH~gdiVnkW(Q%eqV8( zb7;1Y$nV?Sp2+{bIr7ZeFuvPs^%2we%0A-eh7xL4>Jq*LvZS!+6OQPS+qTy+=jyuA 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%0DqQHflrRKamsTC_(AQt> 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 WfojlhQPbRk9mE0zn8vwjHUA$a5O8b& diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 81848e47e9d049d1ef9d2b39b04bbcf4a85ba0f0..55d73d6b48dae331cca5cc28cd5c4d6718ebfb48 100755 GIT binary patch delta 37177 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%0DH& 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 delta 36923 zcmeEve^^x2+V-rq2L(h$1w=p?0Ra_pRMb&1M@1V26%BPX)KO7U(a^B4#u$wX3k%)o zLPNzO!=l7M2Mddeii!%8I#`(4p`xM=o#-4abiRAdUL%8gzW4pE@4DXapU>;M+4p|d zuV+1Lt!Mq%d$!L%?f?AK{<)94d{d`Vf3xqY``o^c^;FwYCXpByqAJt(nA4m7aY@b@ zFowFdl~oN`Lo!unH|k~XC1vayp;E=DJk?rNFGc1iotS4)YZRHg+AK*KmSZXpgG>D- zgNk?vd4QArZG%eHF625V`ANtdg*@I#zR#e_R8@-rlT*MBBq$N`bSL>L$n%6e+etnf zaJk}h?i{g+f92n$jyE$NrD{fe~(M5B}nDU zsuCoF-0aWDNZA~)nD(*A^#M`tPyV=Ts>*fON|guGjwjyoluTcF;^57+Po-QucoOYX z&)QriANkM0uMi>^2ZoR#a&6$89(@`O(&CYF+t<-@LXeOBcF|=yHE15~(;`;}F*i@U z?v}pMa*}2Q(aG7GvG`l52`4dfv*wgr?9K3kA#-ToY`JAfAnltYy9Q6VvsFk?V^&g&v=`=>fxOQQ>t|vymRD)=#A97M6QhX@7*ne+#J2l z$GhGsO~cJJspB>d_vRz62X_UQUf&16WJG_{WZjePAO8^bZYnd6UqQ!rZwGr0J&{At z@2j1SK3dbgab(Ylem?)99rP2Yq8%&~dy+vzbS9O`pxQabAZ=c%@Q^RS-Q>ba;UrS7 znKZ{em3t$-K}x+K2TYy-yC+WGrgW4~sZXt(AM-f%$&xiw{zZKX%Y5&OB0UCHP0Unz z$QGlIyn5;|;vwfueSG-(1C~sctKGq=YA=~h{ux|S*+&?pwX@}-=^JVCA=z_=KT*q(GXiPyaXEg*2=t|l8A0BQ z?B;ia`Q5&6fVu$&DS4V)GGk8In$x^?235()?loI;xvS_k7wk1li1jB^t|D9%Ma2 z9#s?IqSl&xo8{8@Fu!FN5NS3dc_NY*BDtV_5j;pOx5dxrE_km0;3>D4cdEBRTDAj? zr;@AA2f>sBe3o7}s9xRPRo=4E25IS!a@E{$Hy6w}p1W46ykz~n3H^2%R6k7VinsKP zT`y$Oe<>!@AFetDtwoTYm0lof*5pfimR+1z%{^y+!g^xdzu;*)s7lUVFr5x+lj|4E zC%$s%!skh%T(j^lE^@tR9`&=x#(To3Uy*FNXB+jamfP>)@nRG2bBTmfMpl_74U#V; zj)73UXeEYr@**Cge9`;VKSwq%#-*Svc1aIH{VU~oV-y`&C7X@&eEeIwoSc8F;^6%| zGs9Z;H3S_ z1IN$VV^Ce(!N*c=5cd#s&ZES9T(=rj^}C$pFFvMa`Ez6 z^o0v@+w!1(8ytdZCe55(fW*v!Gp4>@doO#CC&g?*HPlL;o{S1;}gHB~b7f|JbFPC#yPN#zlvd8B6L+2{VkIw9#d=ejie8#}AowQlDY`&|{M64l? zz915#B{#38K_#+w%R4lvN^aj0Om+KY-}{DB-AS$+J2i{+lQZsHOeb8D>mZ)+o7{Qd z78=wjr>2Dr9;Eb)y)Fi6!UDj}pxQeOdBc@VfX7dpPRFAe(*pa9cdGSx;o!ISC9`GI z)}Y>-yXrW8mEHNb&FB#}?y6F!lZ(37X?$;|=mayJPHszfl_R%7s}8wfTN&Cp;r?To z3)=4ALN&#*Dg6OD=7QXi9!SUhA$O#IPBl$(?e+htmhO-JYIZCnG;*&T@UR~p(kAO3o=>nIeRu*EzEuz33r`SWohycYZ~KF}FMt!squ#hST6$Iq8w0 z-djbi5`#1hMLhBd4Q?rO&6Eh%79N(D`AW|+t54WTrO`%>G)Q6SJ-foa4d@~EHLO+@ zk~qb_fD1{I4ZEh^F(gAS*!2z#$&*dHCyfuOa-!i*#oL7N1%M;(rYR;Y z4mX9gl-2F-DS0n7NJBm`s2==%0%BPcxnWy zUxUBVa{E*FlBIG&j$a@DUG{=hVdzJy7-eU*FK3e55T*RERJlH9c(5OQnPIt7h~HJG zLQEpHMb_+HN5e|x?7fR=ScBZO*UIgiG!Ahi6#L#ViYzp&l+zHJ>J-XrRV_j-a^VplzhQY!!Ms*^BDh$t*Hg&4 z)pK}VS2;15ARXsO!&|!KlQB~|YCgiLF(zX@?C1w0e4XN-Gi2U0#)wF#08Au~o-so2 zB;NzMu+E4?CplJcj;=By#Yw&ta$&9!W+(YH$nAY6TB{n7>l82y0m6bKik#&AAQ#rA>Ki(ulbM!D5v+6;@hh8GI-4&&^G{E}fkWNt32v$OHnK#TWY5=zyGK^typ4VB zAdPI48(-TtQI=thPNgYmF!iu9+RKBDhTE;s9J)q-d@E>vYhkwC`<*FZ_lBl za%I_wPHHOn>c%s{3d@A9k-?}lTup7t)! zwB}u&si~T0np-^q?Nn23m%L|}yvJwY%J)K`MALhjWPxmYe*~sB%N2k5#rFq<4Y+K# zNgy`(%61y7%K;y9S?0UHXPDJehC%A}irnkUMs9$NJnGVt^bOSu9NG&Sb~GNh%YZ<*Vy?b4=GFd+k8Ui%7qPKexF{Av;DP! zuP`y0@uMz&I_PSkpY@iT8tx(6S*aNlYpKDXedbDB<%chgpkuP-;!D5MF(q>TR~zY= zDp~#Y>vT+=T=n&SI;LGtY#arLpVgR&22@`j0e!TW=h3lQvgPt{I<`VCx%@31+aTwD zvk6<9&Tm36S8J|>^$+`nTMMJc)xNTjhJGg-ukih;#mILH?g}kI#Tv(nim*)$sz6%0(@c==c`7sbvWw>wf&%I~qK8D;rzK(+O>IZtK06w_01LVrL)u%M$RcU*?ZXcVsqNqqCs(b)xmf*|09x5w2C~ z3Y2BDu1I$M^(pVz+h@3mv1P@-t|nAhDSNbqQC+(n-8PCulqI*}3Bbe(Ipw#bJ`*p#lB+wu_V(z~W{R((&6H5N{Muxk+O%C;PtwYaf6gG@ zb8qce2Kv#}veLg+Q#vJI_PVhWYNg-c=jH`BPS7cpa;)t+I;B}|vAscJ4ipiD9H=E$ zqG4HtJVD}_2PN;4M1ETE@|~Lcu6&j&k%RQEY8Ig;&)yQnzOT8fnKh`%{k@%PFx8jk z#*sieHI!wzkf(?T&p(Qd=|Ps>l7oF}nrdQ&Jy6KhT&C-J=R&5IvzDG@$sG%6VyUj= zcjC)TZe$HfVAXEqtk1-@E`v^NRt&07Wx4KT1=Z)UHg~dxUroKpYO1eb)xF4Ks&8Nc z9z-T;YpDkri?x7aFsnx&vWeiZCZjJbm%y~1z4u&jn9dy{*KkyUwgsUdV#gYha4nydIPigl8@;0P8L51&EduB z2a)@Tmc{zP95ZrQqaWE#XB0D&KMA8Vs#&%_38pg|ScyNukYefpG6At;0?7R&mX!uT zX%lM>fI=C}V=(y_jm>B3Kr)G*+{N^P1V^yU6o^P8`CVXC?R$>iv=0Y<`&O#pa`gF@ zWBLLEE&k0B7Ng?Fp0SmzDUi&e^+zx*`m?)(h%ec|OhF`y#@4djASmL>YJ$jQqGxIi z$}lsX2Eqj_O+yAwyy+$#{?PIkyzUhonb42EaFpZ}W<*$$fz}UWRT>m=@fvH>ppvus zY|Ju;5ZR~dwqyo+btH=jCSg8Rhi=W%K%0JJxg%iVj9{{m)?MeS`?2qX$v!fUB@8ED z`n-9EMBn_zVn&d=eBPXSdxqZ};TcY6e}(b|nzr&277)g-Cz&4Cz)x>3x{!??b9n5| zp*XLfh4Xq^xq(^2NXX!usv(L2QR1DVzohz%M}w_-*#BX(bNXoFo>IYs`uvGgZ}m&xA4Bo|b@GV}^L_>R*{50R0nw0`(yE@7F&Qxp=X9qaR&q1ynE{s*p?mF;LpFWNN zu|b?2>y&`+Oanv#MpmvP-_Y3weA_M0KjzKqCc?h6zm}6G4`QE8A}=W;_$citRVxNKIi&^wsOi-z;eJgi7jgVqtzx;ko{n&>YOb%ch?}cn?Fr=HB-Prw zfUGC5RN_5k8KH9vSZN{#%iIPQyNEnXRMw_Nm_jhE1}wpRXl6xA$QU}Wh&3!BPttjH z)?_2;Nr)#)U5elY*1i-oO$Lit2HVUpveqplcpNn!3zB;g9Lh{d2##lYNw9eai&;+I zrwJ8Iy@Jf52@NcM1$iEhqHP7-hMwtG!ka9xu$Gl*sRaerSQ7~(bU`^wUWFNYLA6!8 zn)HVNny$f;#*5XhAsgw!ENe_Mxlh6jU$UOuwK(JLu2IW9%EoIbr(iDQRy4AKm24$1 zlVq!L8_z2-%bI#Wc@w128o8Z(3DRO!KS;I^x~P_=XOJ0KfK+6l?b2D|4)Qo%RL>fB zpmQ(kWC0Jsl!(ROnqf~rL`D*gweleng3}Pz^f0`18uKudN9f{gYmOOyIde(j?QTlQ zy1A*vPHtxtyn^E#YjM{pn|c%X3c^h-Zs;21o48jHZfbF>ll-{TIo1-DQvml0B}(63 z;^idY3b}AoOCp@)OCc9-YDtWfd>Z7!O)W`qk`II2?xt{#wItaopdSK+n_A*H5Q1ag zcnxylrk3Qe*i5*oC3Q@*K^iSj$?3_GEF=z1uir)ddnX{O*u5Eztj>bfrRhI}1hU6> zks@l${!ii7ZM#V#xpM?-+oM<`cNI6b3dN;7hNYXa#G3yY8Fgz|{o~{=cVn&H{p>NK zuRK8(4qsY%d;1HSbNic?2C)1mu$t1cDt^(i7Je}>&um;0n2ukJ%)~Dymd!6Itdw8U zSOdS95AK0?Tbj)x?AJV&V80fy4Ewc+749L!>CzHw?H;m{dUrFT;xO+`wCZz++~ba6 zDXe8bnSaNiLKZKRC3g&JU==c1f2W`%Uu$$8`3FH|LJz|Cq_NV27->oQOvm`Og5k6b zSIjQ?{My0l^6k3`;~`vhtchO|S;}GZ4AOQS#uj9GHZwhotX`T}f? zmN&7&0u0IJtxR(SseD;6zr--@QCv){;wTDOk;U}K_!aY;{aVWs3i*92YbYf1u`!7_ zP8fV@)p4?tBr(l%@J=i9Sl)Bw0bZiV^YC6P%dHj9qdVTI!YgZ8%nR6E`C8Q{Fl(R+ zoiAeD8N+;wv8B+lgkm&eEXyb+YclU}FtAFIId>VA$!4Y!zvQ&CF**4p{o6<&T!zVMDWpFMxo{aKrHO#$Ph;1) zv5_y6arD{&Yx2wFH9}XFGv8OR_+OjH5?_G_U)#b;Umyt2QSl`Ax%dkcWU=?L3VD`as^1+~V137z* z&%(<2vSCHmVLGhnYvIKtJP{_>Z$oM`RN(|~ztL&4H zX+t@yI!E5kOuxMuHYqZvX3(lOI!zg)(2*RIxk^O0ptlj6qN-vTg?9)o(ecL1Kw#BTo2wNcp|tkXKE^Voseh2oc*fBO+ErD z1TO&>=1i>wFBI~6aAD5WR`6^g?*JF(+^hyqQ{&dm|vMj_XME9T5pZN|o< zpI!u*z=b(Cr-Mfbc{aE(=jH-%vDn{S4z3n)Y78pR4#6A2TLo_eZ&LUcDCb!(I27`% z$rLy7xTzF81-w*nn8>q8@Ivr>!C@889KmbBErRoc(*=ixJW~Yk1W!`><^f(Cqsrtj z{ij9Zrb-0Ff|m=9=IC22cm{ZZ;5p#Af){~j30?u7A$T=-s^DB9li*F@iGp`v(c9Oc z+-&6<#R#qe*9sm39x8YOxUb-_N?#Abxk4(zp-`W8!C{p?ErLUdK8=DmgV%AMsa0+5 z#7(slu+0m+Lhw-V62W!gg@U7*`s4`?3-!qs918U@3!Vj@CU`!0vf${jeT;&0g)-yC zO&f0X3cueIJX&xqc!b~y-~ocCfqM#`3$7Nt(4gwwA$TcxtKe1OO@h~g*DE~p{wCbi zh=4ZmN`w?clize*g-3WC;$1JTe4Fzwt;FJRaO6crth* zcqVH9fEhOi5s(WWBX|+GR`3e&P{C`#eFaDJd3XrU6;dhuL05ySSG(W=;4Ok{!5amS zh5zqWCvK7uP%U^mc!l6O;3a}XpOheGa63f}>R z-0Ow^-=V=xjR-)SxmOAv4_+#`3A{+~4DfuxVIlV%!3)7Hf>(m43*G>pB6ur!lENRt zp}ERELELzO#|j<+t`j^4JW}ukaE;(8;9i1Tz+DB;GpO7;1uq6~6C4V;H46@f+!}=c ze+XuAt5pIXR)bdw4u#yx1rG%;7919GD-awOa?2Gw89YmHDCCwQI4mSyXHh+z4{j3j zV)%czL~&D&0E6IF;4y+Xf@=kb>D)pE?*#W%xS1>JA$TOXN^tZi*LJ~^z*_`Q18?LU z{@rBy?Odw`F9oj~va`0%uxe^hAH-ZNUj^=amRQRK6aJAq829>%)a9Bv)DtJ726ZijU zf=82aQ!h9=k-A3k0`N+~(KPB(!Rx_`1n&gTS9lhNmO4l9XmE?*M(}jO&EP45XQIaH zBym#$o*+1Csg4yKrdI0|{upYejubosTq8KIjhEoOGOmJW7*tZH;IOpRCU_BeGxz_f z{bN!mK=4%XT)}x^S%UMzG6d&kr3&5*|1X)8 znf zD0nt_yx=9^dckYKqXp*$L@4}85AXoNBf&idj|Eo?4$F}a!C^Vls_@JwQ5(`E0!qN^ z1+M|G5xg0^QsGajz)J;3pCCnoYr*pcN6ko%;3ja3;Jn~;!O`(a3ito$fKQde2`;L6*cV(>^H7~x zlK0=|V>Q(i*$>B_?Y|QIBFUQf4|0^y!-XvRHymvq#_LSK;cWJBH7l~;*RZ)=AJSaGf=h?sGpxBdT{ElY;8m4c@n@b5+Q#9e`avxLT46aFOQ)jrSO`cMhAf3}hp+`!ZPXG@vIMt*QpDYztUqCruCp-(qje8wKsA()@ZHjO`j0q>)5M(X|{;8 zjve)+mGoE#OX^2|aEnnYXL^st_oq+c$i1OI{R`RF51_BQ7Zxa?D;{H>=cu>!xECEv zXkiInSfgRIu$r}a(}T3I5pS;1=kZ7#p{LSBJ`xr4jm%!`NQaO` ztP^iAdardn0)VRg*HY+gPY{+6M1Mxhp#|1ipVQFZ5=>JXLSJ`(K6j#?$C-b?njT8O zBJR%@D}uSFt;R5VR!yI;VxA-D_p}JlE7NHR^N*y@2w^b$G?H#69@dzV^ai0tMr+I{ zI!~fSIV@)k-A{|Et(vhkgyL1Z*l{$REW+=q2TSD4FDz#q^~VpamD|&-W*mKvzK~;0 z9Z#Qh^*Ir3@09p5z^-r%Zo9)j5zRcN(s}fSTHf1y*tV%OjlLi(vsh1O4)Rnw#u)x% zmH@ow;W7v_kBGg*0r>{%&L?ug$g;h_~Sqoy(VDv;YYn+8ng5RRvO^>GCG=&~i2D-;e-dT=$w<8k(VSgI z_Y+#IJGcyy>+Yo+-HQ{Hh93ByH8zRjz2xF#R=gaeq&S;-uAmRN7ndsKdhKGlE9ePY zT+8LbY}rcMLW|p3tO@=lfK{0g_oP9I+wTI?uR`3DDO?`R+*c#+$voD+8X2FgWJzmy zm{do?4@RwvJuYkB}YHmL}$8*e$sO@OK_(?*4H=DU1}0)jY*^U zM#sx3taU4T?#oqH%QiSjG>jE(I;kgpxtYa3Os#m4Ms22xX^D{~nWqj$sjIeF0T zwIpUb0Eb@MYRx}D|0MJ^vo(*=-5>?b_mC2jaEQJSL6z0_S$jw`D=46ocnup0=>2Gu z_#-rs(lV1Z^%%vQon;o*UTBYC)gGsKTdAzb>iRr=1f-T_7b%%m6;V9qE^A}yClo=+ z33`g4CngocBbMu|CB?iWl$)*kmndFzD#u%DFQZ44SMbJpla@DF>q@AM9~iUbSLsSr z$UdKpKSkr|83RK%^0OX2MKcIJW48L9rg)Xy?x(!0rq}30M7Xj^%%_|lS3<^Ee=4UN z9MKq}`B)!0OOw0e239!Y{tZb|-=xFYJLhNwJ(JH`&%s401+bFWF~g@?b#G92lwN6# zt)$^pNwAQfX|-0pNk>q;SJ7HUf0DQ&`~w8+Z|+hM>;E2Hi}12m&HG9^cvqOEhCWHp zMq68I=<5FTY`iu8YxEe$1ZMsCGRmiCGgy2Rox|R_f_2E*3@dI9Lz-)Cxk{td)M~W) zeoy@%!K;Qp(8G?2Qk65BHT-~HeYS!--nDFB3mr|**0bss`UpMSYK{GoK0^lc1-e*e zTKPoOW7n`254>CGqT6J}D||oEr*CGMy~~>YGuAHDnrbcmg}0wIhiU!+zi7A7820Bs zXb~!E#dJa?YAs-h8hPAbdxwg}9skNE4w$oYSKG?eW4?2?$QDba-U~D_S z&V#XC5!$6&Nxrr6-}D`OvstduAMom(_Bvh0-uV-@t%zkMf1!km1lIZ&ELve!0zdDh z%aw>n-78}4u35ExqP5{VeVx*ZJf%WuwaiygHR$L$Ja~{$@H;kERAL$)R z-zc_r_)7RG=j%pR?I*3KuNSijf9V1GI)3uuFD;~R=&bGj($g;VjU?7FLBc#dM2e?x zWV7}m(hc`FN*z^Hs?k40dIgTYDnuHK^>TX%GOUbY#!zVsPf`;q&7+m6e5M>?oj6n) zN@-<*)f6tl)m2uqmI!Gvt*qlc=+>z2<^n5z2vtP5AXOuLZp2u51Q7HX<0jrKewa%Bbm{G|7d^M{a zB}LKm4XkyP6h_atGR%iV*f_293w;wCgVEAg^iA`@F^KbKKGTkoUZZaovF0(-r}WKM zRz6nxC!P5=D~^`#85Cjv^@mNBvMb2G2S?9*3tR2P-`hhm1u1lC!HXD-b%KoDtrs`?b07v0nFbe%QC2z3}Lks zq~Y|fJS&<8?+U+Fb#|h(5m)TZCP_~X;hoQ``}nSM8sAkB%y+W%5UtWG>%Pg-YWFH- zsiqqLg*7HddYaNIqqX)f34W(4-5R5}lN@WwG&?D_2F#FtLYx}rI!oF}s~TDQELaG8 zLd{onAPbr;4PaaDmNwwKJ`HzE+vwYR7H^PVcaHEdecQ+iX7j*2<~c_Rbi8Bh#(th7 zZK7|NGGiPReY@3KA14h|BfHl5(mmL|>J!kY?-&nGl$Npn3nYX4JE=;48S;uXd4aT$ z(09^V#X@xCckm`?0!CW!J(7vOQ=>SmZ|>nqnv^7gSFPGaDNsHA-Im+8y+YRQ)Zv}3 z7jEgkS8zNe2KBpYmTQy-4$|Cwfrswfi80@(jQ@9|S(Q=p@q4%HB|f@uF2YMhcoJ)~ zho?EEAB=Fb2+v}gr96FpS9tC(2#*)xB`m=n-u0>z&Beab{sIwP{JZtcvQ)YPAAncp z9*}6Yk)^GaBJn1<^ewGUVl6As2-W4RXr=TsJY}v)T1VeYuy&ZFZwY;`lr^rFo}}-! zv6M9!Nbh4JT_fSR=Y11PUn{*z-!EaI>!hEie^7n95rwRq5#O)rs>N>9!ePYsn^?kn z)bjnV_pIn{UJGHx4?LM=J&fG-S{2>B7s0}aALv*qPyRvITU2!Sa)b*beqdrv_V9G4 z;zuG}81VxvM^kwEg0Apg*AX6|82N)zyv8nlLqBNeuPVPvYob}*25Dj7p(BnT+QKtN zWBh5&DnkO#!=O5Z->q$w{OFT=S<*%+giKRzEtm1LBrmK94&l{!9-c9X)oqmghjqO* zugbsqqapk*$`e0n@w)lDDAhAZnAavLoNTrKoNUP^$qPpW$iR=XPpsLSq$ombl37Kn zG=|osv({8;%lMi?1KnwVxu37>F}sNa&zd4+A0gJ&TEsbn8au*@S?*?OerBQBm7d7O zNsWA!B$=o7%E-+mhTLN$ej?^8{BYmKf7YZ!wq_Up>z;?FS%QdxhjF?6hvn4lGEt*a z@eSs_sl;pFN@72L8?C7+)ddl+T^m%YJ;PLL{>8<88<7u={|=2%sqOg(;hPxDv_%T` ztEsR@9)<`!;&5ch6+i~8V2k9xs2mO8stZzi@dm)pqVe`7@v=7reRzuf_Xzy!c98Ra zs>LUk5QiTH+I5B8)6svkd*N)+t;byxGgV$J@;)gd)1IsSw@VLQ;Gdo2u`~B@L)wbC z5{_JXErs?fo|<8c+ z4*q#3SDnfJc`w&E+rRkN?eLTJ9YaLHu{;Zyvt$Zdhbcc5@DVL#Nb{XG=! zg~GS8!fn#PaVH&zY-meycK2bHozHP#fPOl9`6%z zwm-Ou14P^a#N{RqFwh4a-{Eprtz8+kyo^6yK|214CEhgn#M1BAkPh~I;02a?zw{jW zi1kg!l7zpdEsnrHGT>-R8aQM#F8~Gc44nGMKY0e|AKPDGrnz(!dp2E?k;|y3`p|o8J3w~gvlF#p(yXW&8`XA3HeXX1p=x=|3P`4cu(E(QafE0`zUw%;9 z6#P*m)Q*p{{l-7r3DjS+wzQ3_4lx zA9lqIbn7L2!_J12)lPo1ek_UgWYpN;|9r9)e z!paYgmv)9XILmoZ3KSYFc4+XAMaWSr+E5#3`{g)tgkw#ct7xFA;lmi7CkEL@a$lkN zh>un1w=vy)MA{zKu|o>Z{FrasB9Tvgm;czhN7O_Z@7K3cZnP*j8s+vz{Am0V>zpW; zPfamOxBfU*>DIsQMH-#xH|R&Lmykw>G>`GPyN1A9N2^qiutN_?I|4sWLZ&|=0q-X+ zFdzI#>o_Dp`);|)v=2*xV?MUv-tO{YCo?L&l;0zreP9da;5&Z)4s!U8E&G_|VQI{m zk1M;UyYCN?&i)}Qkq)0F{COAT81!34vgU`;fj(wE&Cfs)Tp`;bqhuuEi|t>rT0kp{YH56gZ83xf-+^bu+J%-VF=0_Of{ zFrxE5$!&u^*|GuA(I+=~cX*2qsz1|2fK)nmiJ(PZ_ZK`EKnbN7u+VVKtk0V9( zc{aXrwjXvNIYz_Ap)hgz?IzxMfY%l#wtpn$784gM?n_ky6PI(%kykNP`w(fIz83cb zS5X5KZ+M#}SfucY*PJYTGY_O6Cerf{vxExEgvQyvKLdHFfo@pEN-ePP#$n93OF9}{ z+rVd1)B{5#OBhp?!lcVXr z;~#z0i*))p+uwgfI=z9eJAx~E&bmLC`BBM_e8SkH(y=k0cv>50e$XFrJPH1UJ@vSx z8G<%&g?IXPF7kDn)tU|=UwErEGg_24MjN(qHp%1C=8-i6Y={)DbQ!V{nx(moBSA2 zSnf09!6zi2Rjb!3SzP%7Swx6&5fNwmW(cx~Fi_Jcq7SrkEvML5S)b)79o7}&@YRK>#AVNja5IWZ_Ne}XKXW`o8-kYh}*z?1H$ zq?fvU6imP34nArHd{mC~(BKt|kWU2E;HN(kd|QH{nV{IKj-ASp0*3sel-S5UxYNAx z75CtI%^EK&o+y#XDjM4%&BV&{V$*edbTJ%tYu4qcqQL&Mw91>Pa^ z-p!%{_MM$BNa}R7s;*GgGw#MJ=heP2^92Ks$1}b;;I8y+SH@e?0a2g}3UqQN4GT~p zoXN85-3%6Px{z!+h8n%q6W#981tfCvDh-2?2wr8`hs^Md^wX?H$Eyf@C^~A4Ranms zF{V@odM~A<(Jy$z|oou zmFQod@GPOuo`o+JppO`lcBkUdqo%ta%V1%<9t3(gEu+4i3qANU%6N_W?vnz&SB`UX zlSX?-HeFzG`=pR%%P>ZG9)II=jMLcp;tS+~v14@1F*>g66uW=7#| zj;+!cN01I))Hs`!=1G&-#%H9OS(kP=mG7v`Ek-qds3`KKTX&<@FH(%UgfLGTJ8@hi zWGO`R7@tmWx9wv4^TyGd&)Ftf@}FfSw|C&rP=N?xdZJcyWkg#6=D#o$6%7qAnxW^P%r##LxNAhY=SY;9End zG?h+i_|WHbii@T1F%?#3pPxY@c(z4YndM0&Q8O=?l|(ou)k+6t3D{9{b4Y=St z7MYKSDhpls#OK3y=Syjs^=*!GG4a3rxM)>E*6m#PV!K#UqjC%I^Hs;WZoP+-d@FiL zyM1C%)kiqVmqKn|z##7!C;2qI;A{U>Eicr5stSwn0)`<$iO49~DM3HT^MpL3OP+8I zaQE)aVp{7t@*7AkM{yX;l-?+0myGU zpoqC^5BlNv@J$8M0PG*)k4RxX2*y<0kN5-wo>k4;&SfJs`*`$|p*sW6vH%*>Q_l|b+J#{L}aY>r9cURQ4~=x^*V6clky6oivX zRWvUMg{-|(?5TxN>x>ecG&y1`YAN>O=NnyW{SDiYYnPyw)6CH^6l!7Sn7x@56+*4+ zcPi*gA?Byq-l8NuO42EM&2j9boJwiH7Wdke?oQ_4dlV;Qz&l~brGa;kYdS97MJ}nAk+jHmf(34bnvbt9HxGtaR0=P?lM9kzSXGkZH1J+(;E zc%D`atrFXmOYFWP)afyNAAW+oGPCED7JK(Yu5Pe?hyLsbEW+LurHut17i0U_3Q%*`}edzEFOjCs? zp2KFd>?*uraDi1+N$=BPZp`ww^fGyYMZP0VqTz`C4sOYLt5>!3dmm!4x?Ys}xX|o$ zt8at!^#D>}ZU0%?;zl=Vt;v5#?+ldKPux%F^7_Ka*crlDj&vhikE?+AYay zaaZG`qVBP_PWL1r9moNSfJ&eqXtj0rQUd`%G!Sns?WLYAxr`k>T04>5=%Y6F=u_>f z?o(?`>Z|_2b(+>wJx~Yefq1|On1B=@4afj2KsJyIHuq@uR74> zu7D0t^uD|zrO*1dg-o!##%RA{RoNLonY(SodQ^Ze4rGl0h)jgTj!&mKm?!%j0~36TPq{g z?!7b5q}e*pB3lQ}RCaN@48=IY?s)H%wp+aaB+r;}-}cmG&6fMpHS5==vrkT_`&jRp zq|S12i}6%XH30FfX)5f?Z#zBJdbKrQuU_mH^{dX-`77%AE9&{H1wcK2MLmB-J%4Qi zP|ts$p8r5S|A9BYc^#AHsNW!NW>0k-S}G2&n#HSM=C|=WKyR&&SI_S?GS7BBtOTeA z8i97(^>7a$6o>&5fm9$1D6l3N)xVO=sC3(Pt!sCT>{RYY*4wU+%29Y!eD^rFrim)B zU5{!7Q24E3|C{^F|C7l7*KtRc->O_@cflx_?SG@~e=BU1*MH7q6q=!1{)28YeH7Y? zM;MiCt-n|OyUWN5+x5HafENCrI|06c7BB!NAOpw+ih(MnuSBm_FHkG)$NJod&&kBEe`vK1MZbIhvhx{qz>;)QCT3lKmkw; zlmk^jEdbR=H3Mxxr)ViJTs1%>paWuo1Rx1W0nz~rkOSlcML;P~3Df}fKoigkbfCM9 zRs)_u01yF019~7HFapUy8ej&pfjpoPC;=*fYM>5i1X_T0+x0Ojzyt6FLIEuh0~mlr zzyzcMnHl(#1>^z+Krv7bQ~|X>1JDe#0iCw%V_g9+Km$YqIv^HE0FrzQLaY}cdJfF}?DL;%r%9*75wKr)a9n1O5{4=4mmfC``*r~?{- z7NFgBeVhvL0DOT^KnuhG1|ShI0jX&JaTy?4KrT=K6a(cz6;KN_0L?%f&}q9q-WBiy zG(aSv17d*$APGnT(g6#Q1LOlmKq*iO)ByEB6VQtGAKziSK0yt50uev}5Dn;oc)$oG z18IO6$OiI&LZAewuwB>lG}S;I&=b5DI947{CA|0+}ZKNd+>1EFc#s z0E&TfpbDr38h~b?4d}F8pXdsB0U96@&;hZEA`=t9lYkT;9k2j7Kt50elmeAN4cdQV zJxCMK3Ut`6Pf`P(KmZT{L<4#t9xwvQKpJ2MvVlCH5GVmEfNG!)Xarh-cH8yIDn&7F zrCX4BtKfh59_@dNM*p+-nYWwde^i0Y|EIMN!1(`vtHA$n|64lXWDks2Umz6F0x^IA zNCZqkDv$wW0l7c{Pz;m#JL>mIC#+BrpYfrD%XiKnKJE z&^HCTrleafN7ci6u-9Ku2U-Wdpl&0X&9>`@Q3Yq@-y-`zy?4&*zv4Z3g#2b}&Wq}( z!BKhHwi|hcKm||-wAgMOPyxPx7BB!NAOpx%R>TqSskcZ`$5L%Kj%5J_KsitgGy|Qs z8--p#BoGTE0qORXO#Pv{&|3E)jwbvyGc(fGu1Q~;JV|r!(EFE1YVO88r0m3E1Ku86kOA6H#!q>g>`I*PbzFS7d5U> z&?OmH6xyQ**LIt&C-R}LHXDDZmuhXcfe5D=HkR_JDT8bTG>|>br+ELmJ?e3N7Ug zhMKPNRrx>j9P5Ap}d||PO?16kiDwXNmgvLg~2we z4ksBp#s8}6T7au8uJHdl>%Er%e~?EIB;nPBhbBU5E<#C>08tSl1q>Qq4q$jmps2xs z$uLwh9g5WkPFk&~MU6wK*j5&&p-?API?Jwv0dlyNzmgu3BX05b8exZ20ir_da3IST2=r? zXM-ytu;>`Tsz z_`vOxOU|I+5Z68=j!e~mZ*z`V{EsWnMDm#2^-Jf;(4j4^eK->n>KhUGz~a$gIS(tJ z%P)N86b3UPfY6}BBCyxu-7QW&c}xy{sf*XpdH zGze7a^zWP=wvY4VHfObpRJe9sv)r#*C>aO(s;mMJK1WN__&9Te2^(6u7l>Y+as z^gn`rQY8Yo!v?ZtJn=UAFx0TgwND(xz1F|yuQKROt_o0h)le=>-XEargB$ihv3-cN zxHQvX;u8;Jr(yK1FuJ3l9#51Tf|N1%(^l6$j!9sRg`lbwLF+9DUJ$|KJ@Jg>p&@!e z9gm@PgV%;=T*Z!;;>+VY4oj~vN@-Eax`AogO3#FRsvuf8y(7l^L2Rm@Rsw)aY zjWF-23UrXkiG3-X&vv5?sn58s(cBh@J=70c!6 ziEv{F9_m5YN>`vE--}Hd(xKNti%I`@cX@Jzx!izuq+>= zMPn)9i#=%*6#*^gqF$7xVpXn<3B9`)9qGiM?@g<)WPI71`l%QuMy!^*_n}8Z=i;t? zzS%HRw*JoO`cpqsT}DV=uF-fS zQ)a5G5!b%9fPa}xe^b|CFf4J?QlPhw>!AbbCuZpDTGwvDz=yApFwf>)gJ`SrnL2wg zO)^6*h{qe42qVsUeRJMW*scY3xKXVa4yFF4ENb6m^2Q(0fzY?;^V@nj_B#o^e!L`= zvemayFk`$cm9DBA)vjab@#|?&#K-ls!{`okPCnwrH{i{3puPcbE)cF5&@nRv^$ghd zs-T_$+j@$uXTY2Ff_ib-o*)9A0ozje(s0@v%tNn_^h_U(){ zs3kJIc_e)tvTIz&S&tB0^8fOim0!Z)yXlg=_#lLM=10C|uB1}}c|86;oh}jHiKq;H zC4<6d2R?ihycEoEod70E)&`A*ZJ6mkYz~odpDp52q&H_$$PBu`F-O9!vbsksej-eh z$z$^FFg+Ox?8K|V1%@&95JMn^$B%(y{P%@CeGE-hfol-J1p;GeG!=-ft{+2Z2I9Pu z_a3J@3;V9#FprK|xY2L=Li(qLomcl;L`N($O}%=hH{Rt zp|D>66yaEj69;uh5#jh3Y{Ee9(??fhGFXk38bUZi>QsgP-C7!N<9w%+&r+f(yYZdB zqCVPQNB5i9ll7G6XrhTtS#K$!o(^u4dZUzj+t`-%hZ||FiG5k8Z=yvA!)AOEInRDB zWhY-Pr2+b{zaX6cff&5JnFcsGGAp!2IvhRint|&y^wAe-v1w-L%$MjP z8=G}m1$}P?s<><$x*o!{+h~-eAg$YIEK-on?R2lCAS zSJ_tLIOx06=bOV_`?oQjJ3+l>NwO24sJ2=y&0L(L=1B?_%~4-U@)Mb)o)W8vC#!5T zu>cJ^ScK4UpxCvaZ{hMOYMS-h79E|U<|95h{Gdw5S#E_7s#PX(spvy$K5QADs>VyM zR6JEB;~V_Ssp^dN#%V5o7%*6;^QWn95_Vjer=Azr#`9FEiG-0mh*&r&a2W*aBWR(D9qrOig~Xf^jy zjA?6}_dTknqxC?(`owf~6z{<;>!mUse+*)YnB+!H4@-uc^0I5co6kuF7zFaa`~sK; z0h>El?ZBlS@ww=&>MtCar|y&byTJn7cWxZ_mHh9u*L6h1dhW;ER`=-cdMe~@MKumELJ0M-kXjufk6%Y(_wb}}c`@w% zPF$z0Q#d(hBuAfvd;;f|K*ul_mmrd`8AnT?V@b7cEm5a!y4SdW@e`b0rg~$#s#J57 K?o*}`ru-L*V?1#H diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 2d70b2e23a0bb36b459c3095fee26d7476891440..b1ddbb69c5977f3798d6e71e194335d6a7fb0c01 100755 GIT binary patch delta 23035 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 delta 23030 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 GjQKgy*LK}57F$+U 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

      fS!7w2o%cI$D+X%Rte7xk+ig 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%0D`sV5gogUTj58b`Gt&aFaO4hV# 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 z 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 Tuf`5EBa2ZiMzJ}^=92#hb_L|K delta 78907 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 diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 3f31b2158..dea9c2d47 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -82,6 +82,7 @@ void basictests() { "Could not map to memory. Cannot proceed. Check Firmware.\n"); LOG(logERROR, ("%s\n\n", initErrorMessage)); initError = FAIL; + return; } #ifndef VIRTUAL // does check only if flag is 0 (by default), set by command line diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 0da2dd9e3bd89a1dccf6ebe0cd78f27bd47ebc17..786505472e3d7baf36e9afd3929fca5876b35301 100755 GIT binary patch delta 90697 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%0AvcJ5V8RB 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 eW@d9~c$#1}=l&5Kk43 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 Bp*{cr delta 90161 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 Ha$Wv^R<0ui diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index 3fcfda045..4c069b452 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -92,6 +92,7 @@ void basictests() { "Could not map to memory. Cannot proceed. Check Firmware.\n"); LOG(logERROR, (initErrorMessage)); initError = FAIL; + return; } #ifndef VIRTUAL // does check only if flag is 0 (by default), set by command line diff --git a/slsDetectorServers/slsDetectorServer/include/arm64.h b/slsDetectorServers/slsDetectorServer/include/arm64.h new file mode 100644 index 000000000..f095790e0 --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/include/arm64.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#pragma once + +#include +#include + +int mapCSP0(void); +void bus_w(u_int32_t offset, u_int32_t data); +u_int32_t bus_r(u_int32_t offset); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index d7858498f..6b3b43cb3 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -25,6 +25,10 @@ #include "blackfin.h" #endif +#ifdef ARMPROCESSOR +#include "arm64.h" +#endif + #ifdef MYTHEN3D #include "mythen3.h" #endif @@ -61,9 +65,10 @@ typedef struct udpStruct_s { int isInitCheckDone(); int getInitResult(char **mess); void basictests(); +int checkType(); + #if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) -int checkType(); int testFpga(); int testBus(); #endif @@ -81,13 +86,17 @@ u_int64_t getFirmwareVersion(); #ifdef EIGERD uint64_t getFrontEndFirmwareVersion(enum fpgaPosition fpgaPosition); #endif +#ifndef XILINX_CHIPTESTBOARDD u_int64_t getFirmwareAPIVersion(); void getHardwareVersion(char *version); +#endif #ifdef EIGERD int getHardwareVersionNumber(); #else +#ifndef XILINX_CHIPTESTBOARDD u_int16_t getHardwareVersionNumber(); #endif +#endif #if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) u_int16_t getHardwareSerialNumber(); #endif @@ -111,7 +120,6 @@ int updateModuleId(); void setModuleId(int modid); #endif #endif - u_int64_t getDetectorMAC(); u_int32_t getDetectorIP(); @@ -136,7 +144,7 @@ int updateDatabytesandAllocateRAM(); void updateDataBytes(); #endif -#ifndef CHIPTESTBOARDD +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) int resetToDefaultDacs(int hardReset); int getDefaultDac(enum DACINDEX index, enum detectorSettings sett, int *retval); int setDefaultDac(enum DACINDEX index, enum detectorSettings sett, int value); @@ -191,8 +199,10 @@ void setMasterSlaveConfiguration(); #endif // parameters - dr, roi +#ifndef XILINX_CHIPTESTBOARDD int setDynamicRange(int dr); int getDynamicRange(int *retval); +#endif #ifdef GOTTHARDD int setROI(ROI arg); ROI getROI(); @@ -241,6 +251,7 @@ int getMaxStoragecellStart(); int setNextFrameNumber(uint64_t value); int getNextFrameNumber(uint64_t *value); #endif +#ifndef XILINX_CHIPTESTBOARDD void setNumFrames(int64_t val); int64_t getNumFrames(); void setNumTriggers(int64_t val); @@ -251,6 +262,7 @@ int64_t getExpTime(); #endif int setPeriod(int64_t val); int64_t getPeriod(); +#endif #ifdef MYTHEN3D void setNumIntGates(int val); void setNumGates(int val); @@ -337,10 +349,12 @@ int setTrimbits(int *trimbits); int setAllTrimbits(int val); int getAllTrimbits(); #endif +#ifndef XILINX_CHIPTESTBOARDD #ifndef CHIPTESTBOARDD enum detectorSettings setSettings(enum detectorSettings sett); #endif enum detectorSettings getSettings(); +#endif #if defined(JUNGFRAUD) enum gainMode getGainMode(); void setGainMode(enum gainMode mode); @@ -366,10 +380,14 @@ void setDAC(enum DACINDEX ind, int val, int mV, int counterEnableCheck); void setGeneralDAC(enum DACINDEX ind, int val, int mV); void setVthDac(int index, int enable); #else +#ifndef XILINX_CHIPTESTBOARDD void setDAC(enum DACINDEX ind, int val, int mV); #endif +#endif +#ifndef XILINX_CHIPTESTBOARDD int getDAC(enum DACINDEX ind, int mV); int getMaxDacSteps(); +#endif #if defined(CHIPTESTBOARDD) int dacToVoltage(int dac); int checkVLimitCompliant(int mV); @@ -394,14 +412,17 @@ void powerOff(); #if defined(MYTHEN3D) || defined(GOTTHARD2D) int getADC(enum ADCINDEX ind, int *value); #else +#ifndef XILINX_CHIPTESTBOARDD int getADC(enum ADCINDEX ind); #endif +#endif #ifdef CHIPTESTBOARDD int getSlowADC(int ichan); int getSlowADCTemperature(); #endif - +#ifndef XILINX_CHIPTESTBOARDD int setHighVoltage(int val); +#endif // parameters - timing, extsig #if defined(EIGERD) || defined(GOTTHARD2D) || defined(JUNGFRAUD) || \ @@ -426,8 +447,10 @@ void setSynchronization(int enable); void updatingRegisters(); int updateClockDivs(); #endif +#ifndef XILINX_CHIPTESTBOARDD void setTiming(enum timingMode arg); enum timingMode getTiming(); +#endif #ifdef MYTHEN3D void setInitialExtSignals(); int setChipStatusRegister(int csr); @@ -478,7 +501,9 @@ void calcChecksum(udp_header *udp); int getAdcConfigured(); #endif +#ifndef XILINX_CHIPTESTBOARDD int configureMAC(); +#endif int setDetectorPosition(int pos[]); int *getDetectorPosition(); @@ -674,11 +699,13 @@ int setTransmissionDelayRight(int value); #endif // aquisition +#ifndef XILINX_CHIPTESTBOARDD int startStateMachine(); #ifdef VIRTUAL void *start_timer(void *arg); #endif int stopStateMachine(); +#endif #ifdef MYTHEN3D int softwareTrigger(); #endif @@ -688,12 +715,16 @@ int softwareTrigger(int block); #if defined(EIGERD) || defined(MYTHEN3D) || defined(CHIPTESTBOARDD) int startReadOut(); #endif +#ifndef XILINX_CHIPTESTBOARDD enum runStatus getRunStatus(); +#endif #ifdef EIGERD void waitForAcquisitionEnd(int *ret, char *mess); #else +#ifndef XILINX_CHIPTESTBOARDD void waitForAcquisitionEnd(); #endif +#endif #if defined(CHIPTESTBOARDD) int validateUDPSocket(); void readandSendUDPFrames(); @@ -714,6 +745,7 @@ u_int32_t runState(enum TLogLevel lev); #endif // common +#ifndef XILINX_CHIPTESTBOARDD int calculateDataBytes(); int getTotalNumberOfChannels(); #if defined(CHIPTESTBOARDD) @@ -722,3 +754,4 @@ void getNumberOfChannels(int *nchanx, int *nchany); int getNumberOfChips(); int getNumberOfDACs(); int getNumberOfChannelsPerChip(); +#endif \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/arm64.c b/slsDetectorServers/slsDetectorServer/src/arm64.c new file mode 100644 index 000000000..9cd6f406e --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/src/arm64.c @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#include "arm64.h" +#include "RegisterDefs.h" +#include "clogger.h" +#include "common.h" +#include "sls/ansi.h" +#include "sls/sls_detector_defs.h" + +#include // open +#include // mmap + + +/* global variables */ +#define CSP0 (0xB0010000)/// 0xB008_0000 +#define MEM_SIZE 0x100000 + +u_int32_t *csp0base = 0; + +void bus_w(u_int32_t offset, u_int32_t data) { + volatile u_int32_t *ptr1; + ptr1 = (u_int32_t *)(csp0base + offset / (sizeof(u_int32_t))); + *ptr1 = data; +} + +u_int32_t bus_r(u_int32_t offset) { + volatile u_int32_t *ptr1; + ptr1 = (u_int32_t *)(csp0base + offset / (sizeof(u_int32_t))); + return *ptr1; +} + +uint64_t getU64BitReg(int aLSB, int aMSB) { + uint64_t retval = bus_r(aMSB); + retval = (retval << 32) | bus_r(aLSB); + return retval; +} + +void setU64BitReg(uint64_t value, int aLSB, int aMSB) { + bus_w(aLSB, value & (0xffffffff)); + bus_w(aMSB, (value >> 32) & (0xffffffff)); +} + +int mapCSP0(void) { + // if not mapped + if (csp0base == 0) { + LOG(logINFO, ("Mapping memory\n")); +#ifdef VIRTUAL + csp0base = malloc(MEM_SIZE); + if (csp0base == NULL) { + LOG(logERROR, ("Could not allocate virtual memory.\n")); + return FAIL; + } + LOG(logINFO, ("memory allocated\n")); +#else + int fd; + fd = open("/dev/mem", O_RDWR | O_SYNC, 0); + if (fd == -1) { + LOG(logERROR, ("Can't find /dev/mem\n")); + return FAIL; + } + LOG(logDEBUG1, ("/dev/mem opened\n")); + csp0base = (u_int32_t*)mmap(0, MEM_SIZE, PROT_READ | PROT_WRITE, + MAP_FILE | MAP_SHARED, fd, CSP0); + if (csp0base == MAP_FAILED) { + LOG(logERROR, ("Can't map memmory area\n")); + return FAIL; + } +#endif + LOG(logINFO, ("csp0base mapped from %p to %p\n", csp0base, + (csp0base + MEM_SIZE))); + } else + LOG(logINFO, ("Memory already mapped before\n")); + return OK; +} + diff --git a/slsDetectorServers/slsDetectorServer/src/common.c b/slsDetectorServers/slsDetectorServer/src/common.c index 3a00038e3..79db3df28 100644 --- a/slsDetectorServers/slsDetectorServer/src/common.c +++ b/slsDetectorServers/slsDetectorServer/src/common.c @@ -114,6 +114,10 @@ int getTimeFromString(char *buf, time_t *result) { t.tm_mday, t.tm_mon, t.tm_year + 1900, t.tm_hour, t.tm_min, t.tm_sec)); *result = mktime(&t); + if (*result == -1) { + LOG(logERROR, ("Could not convert time structure to time_t\n")); + return FAIL; + } return OK; } @@ -130,6 +134,7 @@ int getKernelVersion(char *retvals) { return OK; } + int validateKernelVersion(char *expectedVersion) { // extract kernel date string char version[255] = {0}; @@ -143,15 +148,26 @@ int validateKernelVersion(char *expectedVersion) { #ifdef VIRTUAL strcpy(currentVersion, expectedVersion); #else +#ifndef ARMPROCESSOR // remove first word (#version number) - const char *ptr = strchr(version, ' '); + const char *ptr = strstr(version, " "); if (ptr == NULL) { LOG(logERROR, ("Could not parse kernel version\n")); return FAIL; } - strcpy(currentVersion, version + (ptr - version + 1)); + strcpy(currentVersion, ptr + 1); +#else + // remove first two words (#version number and SMP) + const char *ptr = strstr(version, "SMP "); + if (ptr == NULL) { + LOG(logERROR, ("Could not parse kernel version\n")); + return FAIL; + } + strcpy(currentVersion, ptr + 4); #endif - +#endif + currentVersion[sizeof(currentVersion) - 1] = '\0'; + // convert kernel date string into time time_t kernelDate; if (getTimeFromString(currentVersion, &kernelDate) == FAIL) { @@ -159,6 +175,7 @@ int validateKernelVersion(char *expectedVersion) { ("Could not parse retrieved kernel date, %s\n", currentVersion)); return FAIL; } + LOG(logDEBUG, ("Kernel Date: [%s]\n", ctime(&kernelDate))); // convert expected date into time time_t expDate; @@ -167,11 +184,12 @@ int validateKernelVersion(char *expectedVersion) { ("Could not parse expected kernel date, %s\n", expectedVersion)); return FAIL; } + LOG(logDEBUG, ("Expected Date: [%s]\n", ctime(&expDate))); // compare if kernel time is older than expected time if (kernelDate < expDate) { - LOG(logERROR, ("Kernel Version Incompatible (too old)! Expected: [%s], " - "Got [%s]\n", + LOG(logERROR, ("Kernel Version Incompatible (too old)!\nExpected: '%s'" + "\nGot : '%s'\n", expectedVersion, currentVersion)); return FAIL; } diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index e08eb946e..80520a0ca 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -33,6 +33,8 @@ const enum detectorType myDetectorType = MOENCH; const enum detectorType myDetectorType = MYTHEN3; #elif GOTTHARD2D const enum detectorType myDetectorType = GOTTHARD2; +#elif XILINX_CHIPTESTBOARDD +const enum detectorType myDetectorType = XILINX_CHIPTESTBOARD; #else const enum detectorType myDetectorType = GENERIC; #endif @@ -717,6 +719,9 @@ int set_timing_mode(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting external communication mode to %d\n", arg)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // set if (((int)arg != GET_FLAG) && (Server_VerifyLock() == OK)) { switch (arg) { @@ -753,7 +758,7 @@ int set_timing_mode(int file_des) { validate(&ret, mess, (int)arg, (int)retval, "set timing mode", DEC); #endif LOG(logDEBUG1, ("Timing Mode: %d\n", retval)); - +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -787,7 +792,7 @@ int get_serial_number(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#ifdef EIGERD +#if defined(EIGERD) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else retval = getDetectorNumber(); @@ -1119,6 +1124,8 @@ enum DACINDEX getDACIndex(enum dacIndex ind) { case IBIAS_SFP: serverDacIndex = MO_IBIAS_SFP; break; +#elif XILINX_CHIPTESTBOARDD + #endif default: @@ -1137,8 +1144,9 @@ enum DACINDEX getDACIndex(enum dacIndex ind) { int validateAndSetDac(enum dacIndex ind, int val, int mV) { int retval = -1; - enum DACINDEX serverDacIndex = 0; +#ifndef XILINX_CHIPTESTBOARDD + enum DACINDEX serverDacIndex = 0; // valid enums switch (ind) { case HIGH_VOLTAGE: @@ -1389,6 +1397,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { #endif break; } +#endif return retval; } @@ -1401,6 +1410,9 @@ int set_dac(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else enum dacIndex ind = args[0]; int mV = args[1]; int val = args[2]; @@ -1411,6 +1423,7 @@ int set_dac(int file_des) { if ((val == GET_FLAG) || (Server_VerifyLock() == OK)) { retval = validateAndSetDac(ind, val, mV); } +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -1423,6 +1436,9 @@ int get_adc(int file_des) { if (receiveData(file_des, &ind, sizeof(ind), INT32) < 0) return printSocketReadError(); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else enum ADCINDEX serverAdcIndex = 0; // get @@ -1544,6 +1560,7 @@ int get_adc(int file_des) { LOG(logDEBUG1, ("ADC(%d): %d\n", serverAdcIndex, retval)); #endif } +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -1560,6 +1577,9 @@ int write_register(int file_des) { uint32_t val = args[1]; LOG(logDEBUG1, ("Writing to register 0x%x, data 0x%x\n", addr, val)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { #ifdef GOTTHARDD @@ -1594,6 +1614,7 @@ int write_register(int file_des) { } LOG(logDEBUG1, ("Write register (0x%x): 0x%x\n", retval)); } +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -1608,6 +1629,10 @@ int read_register(int file_des) { LOG(logDEBUG1, ("Reading from register 0x%x\n", addr)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else + // get #ifdef GOTTHARDD retval = readRegister16And32(addr); @@ -1624,7 +1649,7 @@ int read_register(int file_des) { retval = readRegister(addr); #endif LOG(logINFO, ("Read register (0x%x): 0x%x\n", addr, retval)); - +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -1828,7 +1853,7 @@ int set_settings(int file_des) { if (receiveData(file_des, &isett, sizeof(isett), INT32) < 0) return printSocketReadError(); -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else LOG(logDEBUG1, ("Setting settings %d\n", isett)); @@ -1905,6 +1930,9 @@ int acquire(int blocking, int file_des) { } else { LOG(logINFOBLUE, ("Unblocking Acquisition\n")); } +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { #if defined(JUNGFRAUD) @@ -2003,10 +2031,12 @@ int acquire(int blocking, int file_des) { } } } +#endif return Server_SendResult(file_des, INT32, NULL, 0); } void *start_state_machine(void *arg) { +#ifndef XILINX_CHIPTESTBOARDD int *blocking = (int *)arg; int times = 1; // start of scan @@ -2132,6 +2162,7 @@ void *start_state_machine(void *arg) { if (scan && sharedMemory_getScanStatus() != ERROR) { sharedMemory_setScanStatus(IDLE); } +#endif return NULL; } @@ -2149,6 +2180,9 @@ int stop_acquisition(int file_des) { memset(mess, 0, sizeof(mess)); LOG(logDEBUG1, ("Stopping Acquisition\n")); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { ret = stopStateMachine(); @@ -2158,6 +2192,7 @@ int stop_acquisition(int file_des) { } LOG(logDEBUG1, ("Stopping Acquisition ret: %d\n", ret)); } +#endif return Server_SendResult(file_des, INT32, NULL, 0); } @@ -2167,9 +2202,13 @@ int get_run_status(int file_des) { enum runStatus retval = ERROR; LOG(logDEBUG1, ("Getting status\n")); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only get retval = getRunStatus(); LOG(logDEBUG1, ("Status: %d\n", retval)); +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -2180,6 +2219,9 @@ int get_num_frames(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only if (!scan) { retval = getNumFrames(); @@ -2189,6 +2231,7 @@ int get_num_frames(int file_des) { LOG(logDEBUG1, ("retval num frames (num scan steps) %lld\n", (long long int)retval)); } +#endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -2201,6 +2244,9 @@ int set_num_frames(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting number of frames %lld\n", (long long int)arg)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { // only set number of frames if normal mode (not scan) @@ -2246,6 +2292,7 @@ int set_num_frames(int file_des) { } } } +#endif return Server_SendResult(file_des, INT64, NULL, 0); } @@ -2254,9 +2301,13 @@ int get_num_triggers(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only retval = getNumTriggers(); LOG(logDEBUG1, ("retval num triggers %lld\n", (long long int)retval)); +#endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -2269,6 +2320,9 @@ int set_num_triggers(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting number of triggers %lld\n", (long long int)arg)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { #if JUNGFRAUD @@ -2288,6 +2342,7 @@ int set_num_triggers(int file_des) { validate64(&ret, mess, arg, retval, "set number of triggers", DEC); } } +#endif return Server_SendResult(file_des, INT64, NULL, 0); } @@ -2447,6 +2502,9 @@ int get_exptime(int file_des) { if (receiveData(file_des, &gateIndex, sizeof(gateIndex), INT32) < 0) return printSocketReadError(); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only #ifdef MYTHEN3D if (gateIndex < 0 || gateIndex > 2) { @@ -2470,6 +2528,7 @@ int get_exptime(int file_des) { retval = getExpTime(); LOG(logDEBUG1, ("retval exptime %lld ns\n", (long long int)retval)); } +#endif #endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -2486,6 +2545,9 @@ int set_exptime(int file_des) { LOG(logDEBUG1, ("Setting exptime %lld ns (gateIndex:%d)\n", (long long int)val, gateIndex)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { #ifdef MYTHEN3D @@ -2550,6 +2612,7 @@ int set_exptime(int file_des) { } #endif } +#endif return Server_SendResult(file_des, INT64, NULL, 0); } @@ -2558,9 +2621,13 @@ int get_period(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only retval = getPeriod(); LOG(logDEBUG1, ("retval period %lld ns\n", (long long int)retval)); +#endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -2573,6 +2640,9 @@ int set_period(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting period %lld ns\n", (long long int)arg)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { ret = setPeriod(arg); @@ -2584,6 +2654,7 @@ int set_period(int file_des) { LOG(logERROR, (mess)); } } +#endif return Server_SendResult(file_des, INT64, NULL, 0); } @@ -2991,6 +3062,9 @@ int set_dynamic_range(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting dr to %d\n", dr)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // set & get if ((dr == GET_FLAG) || (Server_VerifyLock() == OK)) { // check dr @@ -3039,6 +3113,7 @@ int set_dynamic_range(int file_des) { break; } } +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -3153,7 +3228,7 @@ int enable_ten_giga(int file_des) { LOG(logDEBUG, ("Setting 10GbE: %d\n", arg)); #if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARDD) || \ - defined(GOTTHARD2D) + defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // set & get @@ -4322,7 +4397,7 @@ int reboot_controller(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#ifdef EIGERD +#if defined(EIGERD) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #elif VIRTUAL ret = GOODBYE; @@ -4951,6 +5026,9 @@ int set_detector_position(int file_des) { LOG(logDEBUG, ("Setting detector positions: [maxy:%u, modIndex:%u]\n", args[0], args[1])); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { // if in update mode, there is no need to do this (also detector not set @@ -4961,10 +5039,14 @@ int set_detector_position(int file_des) { calculate_and_set_position(); } } +#endif return Server_SendResult(file_des, INT32, NULL, 0); } int check_detector_idle(const char *s) { +#ifdef XILINX_CHIPTESTBOARDD + return FAIL; +#else enum runStatus status = getRunStatus(); if (status != IDLE && status != RUN_FINISHED && status != STOPPED && status != ERROR) { @@ -4976,6 +5058,7 @@ int check_detector_idle(const char *s) { LOG(logERROR, (mess)); } return ret; +#endif } int is_udp_configured() { @@ -5042,6 +5125,7 @@ int is_udp_configured() { } void configure_mac() { +#ifndef XILINX_CHIPTESTBOARDD if (isControlServer) { if (is_udp_configured() == OK) { ret = configureMAC(); @@ -5068,6 +5152,7 @@ void configure_mac() { } configured = FAIL; LOG(logWARNING, ("Configure FAIL, not all parameters configured yet\n")); +#endif } int set_source_udp_ip(int file_des) { @@ -5080,6 +5165,9 @@ int set_source_udp_ip(int file_des) { arg = __builtin_bswap32(arg); LOG(logINFO, ("Setting udp source ip: 0x%x\n", arg)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { if (check_detector_idle("configure mac") == OK) { @@ -5092,6 +5180,7 @@ int set_source_udp_ip(int file_des) { } } } +#endif return Server_SendResult(file_des, INT32, NULL, 0); } @@ -5101,11 +5190,14 @@ int get_source_udp_ip(int file_des) { uint32_t retval = -1; LOG(logDEBUG1, ("Getting udp source ip\n")); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only retval = udpDetails[0].srcip; retval = __builtin_bswap32(retval); LOG(logDEBUG1, ("udp soure ip retval: 0x%x\n", retval)); - +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -5165,6 +5257,9 @@ int set_dest_udp_ip(int file_des) { arg = __builtin_bswap32(arg); LOG(logINFO, ("Setting udp destination ip: 0x%x\n", arg)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { if (check_detector_idle("configure mac") == OK) { @@ -5174,6 +5269,7 @@ int set_dest_udp_ip(int file_des) { } } } +#endif return Server_SendResult(file_des, INT32, NULL, 0); } @@ -5183,11 +5279,14 @@ int get_dest_udp_ip(int file_des) { uint32_t retval = -1; LOG(logDEBUG1, ("Getting destination ip\n")); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only retval = udpDetails[0].dstip; retval = __builtin_bswap32(retval); LOG(logDEBUG1, ("udp destination ip retval: 0x%x\n", retval)); - +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -5243,6 +5342,9 @@ int set_source_udp_mac(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting udp source mac: 0x%lx\n", arg)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { if (check_detector_idle("configure mac") == OK) { @@ -5264,6 +5366,7 @@ int set_source_udp_mac(int file_des) { } } } +#endif return Server_SendResult(file_des, INT64, NULL, 0); } @@ -5272,11 +5375,13 @@ int get_source_udp_mac(int file_des) { memset(mess, 0, sizeof(mess)); uint64_t retval = -1; LOG(logDEBUG1, ("Getting udp source mac\n")); - +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only retval = udpDetails[0].srcmac; LOG(logDEBUG1, ("udp soure mac retval: 0x%lx\n", retval)); - +#endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -5333,6 +5438,9 @@ int set_dest_udp_mac(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting udp destination mac: 0x%lx\n", arg)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { if (check_detector_idle("configure mac") == OK) { @@ -5342,6 +5450,7 @@ int set_dest_udp_mac(int file_des) { } } } +#endif return Server_SendResult(file_des, INT64, NULL, 0); } @@ -5350,11 +5459,13 @@ int get_dest_udp_mac(int file_des) { memset(mess, 0, sizeof(mess)); uint64_t retval = -1; LOG(logDEBUG1, ("Getting udp destination mac\n")); - +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only retval = udpDetails[0].dstmac; LOG(logDEBUG1, ("udp destination mac retval: 0x%lx\n", retval)); - +#endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -5408,6 +5519,9 @@ int set_dest_udp_port(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting udp destination port: %hu\n", arg)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { if (check_detector_idle("configure mac") == OK) { @@ -5417,6 +5531,7 @@ int set_dest_udp_port(int file_des) { } } } +#endif return Server_SendResult(file_des, INT16, NULL, 0); } @@ -5425,11 +5540,13 @@ int get_dest_udp_port(int file_des) { memset(mess, 0, sizeof(mess)); uint16_t retval = -1; LOG(logDEBUG1, ("Getting destination port")); - +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only retval = udpDetails[0].dstport; LOG(logDEBUG, ("udp destination port retval: %hu\n", retval)); - +#endif return Server_SendResult(file_des, INT16, &retval, sizeof(retval)); } @@ -5485,7 +5602,8 @@ int set_num_interfaces(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting number of interfaces: %d\n", arg)); -#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) && \ + !defined(XLINX_CHIPTESTBOARDD) // fixed number of udp interfaces int num_interfaces = getNumberofUDPInterfaces(); if (arg != num_interfaces) { @@ -5557,7 +5675,6 @@ int get_num_interfaces(int file_des) { // get only retval = getNumberofUDPInterfaces(); - LOG(logDEBUG1, ("Number of udp interfaces retval: %u\n", retval)); return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -7020,6 +7137,10 @@ int get_receiver_parameters(int file_des) { memset(mess, 0, sizeof(mess)); LOG(logDEBUG1, ("Getting receiver parameters\n")); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); + Server_SendResult(file_des, INT32, NULL, 0); +#else // get only Server_SendResult(file_des, INT32, NULL, 0); @@ -7477,7 +7598,7 @@ int get_receiver_parameters(int file_des) { return printSocketReadError(); LOG(logINFO, ("Sent %d bytes for receiver parameters\n", n)); - +#endif return OK; } @@ -7819,6 +7940,9 @@ int set_scan(int file_des) { if (receiveData(file_des, &dacTime, sizeof(dacTime), INT64) < 0) return printSocketReadError(); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { int enable = args[0]; @@ -7908,6 +8032,7 @@ int set_scan(int file_des) { } } } +#endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -8265,6 +8390,9 @@ int reconfigure_udp(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else if (Server_VerifyLock() == OK) { LOG(logINFO, ("Reconfiguring UDP\n")); if (check_detector_idle("configure mac") == OK) { @@ -8277,6 +8405,7 @@ int reconfigure_udp(int file_des) { } } } +#endif return Server_SendResult(file_des, INT32, NULL, 0); } @@ -8377,7 +8506,7 @@ int reset_to_default_dacs(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Resetting dacs to defaults (hard reset: %d)\n", arg)); -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else if (Server_VerifyLock() == OK) { @@ -8792,7 +8921,7 @@ int get_default_dac(int file_des) { LOG(logDEBUG1, ("Getting default dac [dacindex:%d, settings: %d]\n", dacindex, sett)); -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // get only @@ -8832,7 +8961,7 @@ int set_default_dac(int file_des) { LOG(logDEBUG1, ("Setting default dac [dacindex: %d, settings: %d] to %d\n", (int)dacindex, (int)sett, value)); -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // only set @@ -9452,6 +9581,11 @@ int clear_all_udp_dst(int file_des) { memset(mess, 0, sizeof(mess)); LOG(logINFO, ("Clearing all udp destinations\n")); + +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else + if (Server_VerifyLock() == OK) { if (check_detector_idle("clear all udp destinations") == OK) { memset(udpDetails, 0, sizeof(udpDetails)); @@ -9479,6 +9613,7 @@ int clear_all_udp_dst(int file_des) { } } } +#endif return Server_SendResult(file_des, INT32, NULL, 0); } @@ -9618,7 +9753,9 @@ int get_kernel_version(int file_des) { memset(retvals, 0, MAX_STR_LENGTH); LOG(logDEBUG1, ("Getting kernel version\n")); - +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // get only ret = getKernelVersion(retvals); if (ret == FAIL) { @@ -9631,13 +9768,14 @@ int get_kernel_version(int file_des) { } else { LOG(logDEBUG1, ("kernel version: [%s]\n", retvals)); } +#endif return Server_SendResult(file_des, OTHER, retvals, sizeof(retvals)); } int update_kernel(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#ifdef EIGERD +#if defined(EIGERD) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); return Server_SendResult(file_des, INT32, NULL, 0); #else @@ -9689,7 +9827,8 @@ int receive_program(int file_des, enum PROGRAM_INDEX index) { LOG(logINFO, ("\tServer Name: %s\n", serverName)); } -#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD) +#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD) && \ + !defined(XILINX_CHIPTESTBOARDD) int forceDeleteNormalFile = 0; if (receiveData(file_des, &forceDeleteNormalFile, sizeof(forceDeleteNormalFile), INT32) < 0) @@ -9725,7 +9864,8 @@ int receive_program(int file_des, enum PROGRAM_INDEX index) { } if (ret == OK) { -#if defined(GOTTHARD2D) || defined(MYTHEN3D) || defined(EIGERD) +#if defined(GOTTHARD2D) || defined(MYTHEN3D) || defined(EIGERD) || \ + defined(XILINX_CHIPTESTBOARDD) receive_program_default(file_des, index, functionType, filesize, checksum, serverName); #else @@ -9871,7 +10011,8 @@ void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index, void receive_program_default(int file_des, enum PROGRAM_INDEX index, char *functionType, uint64_t filesize, char *checksum, char *serverName) { -#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD) +#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD) && \ + !defined(XILINX_CHIPTESTBOARDD) ret = FAIL; sprintf(mess, "Could not %s. program via blackfin not implmented for this " @@ -10389,8 +10530,12 @@ int get_hardware_version(int file_des) { memset(mess, 0, sizeof(mess)); char retvals[MAX_STR_LENGTH]; memset(retvals, 0, MAX_STR_LENGTH); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else getHardwareVersion(retvals); LOG(logDEBUG1, ("hardware version retval: %s\n", retvals)); +#endif return Server_SendResult(file_des, OTHER, retvals, sizeof(retvals)); } @@ -10443,6 +10588,10 @@ int set_bit(int file_des) { int nBit = (int)args[1]; LOG(logDEBUG1, ("Setting bit %d of reg 0x%x\n", nBit, addr)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else + // only set if (Server_VerifyLock() == OK) { if (nBit < 0 || nBit > 31) { @@ -10473,6 +10622,7 @@ int set_bit(int file_des) { } } } +#endif return Server_SendResult(file_des, INT32, NULL, 0); } @@ -10487,6 +10637,9 @@ int clear_bit(int file_des) { int nBit = (int)args[1]; LOG(logDEBUG1, ("Clearing bit %d of reg 0x%x\n", nBit, addr)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else // only set if (Server_VerifyLock() == OK) { if (nBit < 0 || nBit > 31) { @@ -10517,6 +10670,7 @@ int clear_bit(int file_des) { } } } +#endif return Server_SendResult(file_des, INT32, NULL, 0); } @@ -10532,6 +10686,9 @@ int get_bit(int file_des) { int nBit = (int)args[1]; LOG(logDEBUG1, ("Getting bit %d of reg 0x%x\n", nBit, addr)); +#ifdef XILINX_CHIPTESTBOARDD + functionNotImplemented(); +#else if (nBit < 0 || nBit > 31) { ret = FAIL; sprintf(mess, @@ -10556,6 +10713,7 @@ int get_bit(int file_des) { LOG(logDEBUG1, ("regval: 0x%x bit value:0%d\n", regval, retval)); #endif } +#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt new file mode 100644 index 000000000..da49cddde --- /dev/null +++ b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: LGPL-3.0-or-other +# Copyright (C) 2021 Contributors to the SLS Detector Package +add_executable(xilinx_ctbDetectorServer_virtual + slsDetectorFunctionList.c + ../slsDetectorServer/src/slsDetectorServer.c + ../slsDetectorServer/src/slsDetectorServer_funcs.c + ../slsDetectorServer/src/communication_funcs.c + ../slsDetectorServer/src/arm64.c + ../slsDetectorServer/src/common.c + ../slsDetectorServer/src/sharedMemory.c + ../../slsSupportLib/src/md5.c +) + +include_directories( + ../slsDetectorServer/include + ../../slsSupportLib/include + ../../slsDetectorSoftware/include/sls/ +) + +target_include_directories(xilinx_ctbDetectorServer_virtual + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} +) + +target_compile_definitions(xilinx_ctbDetectorServer_virtual + PUBLIC XILINX_CHIPTESTBOARDD ARMPROCESSOR VIRTUAL STOP_SERVER +) + +target_link_libraries(xilinx_ctbDetectorServer_virtual + PUBLIC pthread rt slsProjectCSettings +) + +set_target_properties(xilinx_ctbDetectorServer_virtual PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin +) + +install(TARGETS xilinx_ctbDetectorServer_virtual + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile new file mode 100755 index 000000000..fc1950523 --- /dev/null +++ b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: LGPL-3.0-or-other +# Copyright (C) 2021 Contributors to the SLS Detector Package +current_dir = $(shell pwd) +main_inc = ../slsDetectorServer/include/ +main_src = ../slsDetectorServer/src/ +support_lib = ../../slsSupportLib/include/ +det_lib = ../../slsDetectorSoftware/include/sls/ +md5_dir = ../../slsSupportLib/src/ + +CROSS = aarch64-none-linux-gnu- +CC = $(CROSS)gcc +#TODO: allow these warnings and fix code +CFLAGS += -Wall -std=gnu99 -Wno-format-overflow -Wno-format-truncation -DXILINX_CHIPTESTBOARDD -DARMPROCESSOR -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE +#CFLAGS += -Wall -std=gnu99 -DXILINX_CHIPTESTBOARDD -DARMPROCESSOR -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE +LDLIBS += -lm -lrt -pthread +PROGS = xilinx_ctbDetectorServer +DESTDIR ?= bin +INSTMODE = 0777 + +SRCS = slsDetectorFunctionList.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)arm64.c $(main_src)common.c $(main_src)/sharedMemory.c $(md5_dir)md5.c + +OBJS = $(SRCS:.c=.o) + +all: clean $(PROGS) +version: clean versioning $(PROGS) + +boot: $(OBJS) + +version_branch=$(API_BRANCH) +version_name=APIXILINXCTB +version_path=slsDetectorServers/xilinx_ctbDetectorServer +versioning: + cd ../../ && echo $(PWD) && echo `tput setaf 6; ./updateAPIVersion.sh $(version_name) $(version_path) $(version_branch); tput sgr0;` + + +$(PROGS): $(OBJS) +# echo $(OBJS) + mkdir -p $(DESTDIR) + $(CC) -o $@ $^ $(CFLAGS) $(LDLIBS) + mv $(PROGS) $(DESTDIR) + rm $(main_src)*.o $(md5_dir)*.o +clean: + rm -rf $(DESTDIR)/$(PROGS) *.o *.gdb $(main_src)*.o $(md5_dir)*.o + + + diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h new file mode 100644 index 000000000..49f6097a4 --- /dev/null +++ b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h @@ -0,0 +1,416 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#pragma once + +#define CTRLREG1 (0x0) + +#define CTR1_OFST (0) +#define CTR1_MSK (0xffffffff << CTR1_OFST) + +#define CTRLREG2 (0x4) + +#define CTRL2_OFST (0) +#define CTRL2_MSK (0xffffffff << CTRL2_OFST) + +#define STATUSREG1 (0x8) + +#define STATUS1_OFST (0) +#define STATUS1_MSK (0xffffffff << STATUS1_OFST) + +#define STATUSREG2 (0xC) + +#define STATUS2_OFST (0) +#define STATUS2_MSK (0xffffffff << STATUS2_OFST) + +#define FPGAVERSIONREG (0x10) + +#define COMPDATE_OFST (0) +#define COMPDATE_MSK (0x00ffffff << COMPDATE_OFST) +#define DETTYPE_OFST (24) +#define DETTYPE_MSK (0x000000ff << DETTYPE_OFST) + +#define PKTPACKETLENGTHREG (0x28) + +#define PACKETLENGTH1G_OFST (0) +#define PACKETLENGTH1G_MSK (0x0000ffff << PACKETLENGTH1G_OFST) +#define PACKETLENGTH10G_OFST (16) +#define PACKETLENGTH10G_MSK (0x0000ffff << PACKETLENGTH10G_OFST) + +#define PKTNOPACKETSREG (0x30) + +#define NOPACKETS1G_OFST (0) +#define NOPACKETS1G_MSK (0x0000003f << NOPACKETS1G_OFST) +#define NOPACKETS10G_OFST (8) +#define NOPACKETS10G_MSK (0x0000003f << NOPACKETS10G_OFST) + +#define PKTCTRLREG (0x38) + +#define NSERVERS_OFST (0) +#define NSERVERS_MSK (0x0000003f << NSERVERS_OFST) +#define SERVERSTART_OFST (6) +#define SERVERSTART_MSK (0x0000001f << SERVERSTART_OFST) +#define ETHINTERF_OFST (11) +#define ETHINTERF_MSK (0x00000001 << ETHINTERF_OFST) + +#define PKTCOORDREG1 (0x40) + +#define COORDX_OFST (0) +#define COORDX_MSK (0x0000ffff << COORDX_OFST) +#define COORDY_OFST (16) +#define COORDY_MSK (0x0000ffff << COORDY_OFST) + +#define PKTCOORDREG2 (0x48) + +#define COORDZ_OFST (0) +#define COORDZ_MSK (0x0000ffff << COORDZ_OFST) + +#define FLOWSTATUSREG (0x100) + +#define RSMBUSY_OFST (0) +#define RSMBUSY_MSK (0x00000001 << RSMBUSY_OFST) +#define RSMTRGWAIT_OFST (3) +#define RSMTRGWAIT_MSK (0x00000001 << RSMTRGWAIT_OFST) +#define CSMBUSY_OFST (17) +#define CSMBUSY_MSK (0x00000001 << CSMBUSY_OFST) + +#define FLOWCONTROLREG (0x108) + +#define STARTF_OFST (0) +#define STARTF_MSK (0x00000001 << STARTF_OFST) +#define STOPF_OFST (1) +#define STOPF_MSK (0x00000001 << STOPF_OFST) +#define RSTF_OFST (2) +#define RSTF_MSK (0x00000001 << RSTF_OFST) +#define SWTRIGGERF_OFST (3) +#define SWTRIGGERF_MSK (0x00000001 << SWTRIGGERF_OFST) +#define TRIGGERENABLE_OFST (4) +#define TRIGGERENABLE_MSK (0x00000001 << TRIGGERENABLE_OFST) + +#define TIMEFROMSTARTOUTREG1 (0x110) + +#define TIMEFROMSTARTOUT1_OFST (0) +#define TIMEFROMSTARTOUT1_MSK (0xffffffff << TIMEFROMSTARTOUT1_OFST) + +#define TIMEFROMSTARTOUTREG2 (0x114) + +#define TIMEFROMSTARTOUT2_OFST (0) +#define TIMEFROMSTARTOUT2_MSK (0xffffffff << TIMEFROMSTARTOUT2_OFST) + +#define FRAMESFROMSTARTOUTREG1 (0x118) + +#define FRAMESFROMSTARTOUT1_OFST (0) +#define FRAMESFROMSTARTOUT1_MSK (0xffffffff << FRAMESFROMSTARTOUT1_OFST) + +#define FRAMESFROMSTARTOUTREG2 (0x11C) + +#define FRAMESFROMSTARTOUT2_OFST (0) +#define FRAMESFROMSTARTOUT2_MSK (0xffffffff << FRAMESFROMSTARTOUT2_OFST) + +#define FRAMETIMEOUTREG1 (0x120) + +#define FRAMETIMEOUT1_OFST (0) +#define FRAMETIMEOUT1_MSK (0xffffffff << FRAMETIMEOUT1_OFST) + +#define FRAMETIMEOUTREG2 (0x124) + +#define FRAMETIMEOUT2_OFST (0) +#define FRAMETIMEOUT2_MSK (0xffffffff << FRAMETIMEOUT2_OFST) + +#define DELAYOUTREG1 (0x128) + +#define DELAYOUT1_OFST (0) +#define DELAYOUT1_MSK (0xffffffff << DELAYOUT1_OFST) + +#define DELAYOUTREG2 (0x12C) + +#define DELAYOUT2_OFST (0) +#define DELAYOUT2_MSK (0xffffffff << DELAYOUT2_OFST) + +#define CYCLESOUTREG1 (0x130) + +#define CYCLESOUT1_OFST (0) +#define CYCLESOUT1_MSK (0xffffffff << CYCLESOUT1_OFST) + +#define CYCLESOUTREG2 (0x134) + +#define CYCLESOUT2_OFST (0) +#define CYCLESOUT2_MSK (0xffffffff << CYCLESOUT2_OFST) + +#define FRAMESOUTREG1 (0x138) + +#define FRAMESOUT1_OFST (0) +#define FRAMESOUT1_MSK (0xffffffff << FRAMESOUT1_OFST) + +#define FRAMESOUTREG2 (0x13C) + +#define FRAMESOUT2_OFST (0) +#define FRAMESOUT2_MSK (0xffffffff << FRAMESOUT2_OFST) + +#define PERIODOUTREG1 (0x140) + +#define PERIODOUT1_OFST (0) +#define PERIODOUT1_MSK (0xffffffff << PERIODOUT1_OFST) + +#define PERIODOUTREG2 (0x144) + +#define PERIODOUT2_OFST (0) +#define PERIODOUT2_MSK (0xffffffff << PERIODOUT2_OFST) + +#define DELAYINREG1 (0x148) + +#define DELAYIN1_OFST (0) +#define DELAYIN1_MSK (0xffffffff << DELAYIN1_OFST) + +#define DELAYINREG2 (0x14C) + +#define DELAYIN2_OFST (0) +#define DELAYIN2_MSK (0xffffffff << DELAYIN2_OFST) + +#define CYCLESINREG1 (0x150) + +#define CYCLESIN1_OFST (0) +#define CYCLESIN1_MSK (0xffffffff << CYCLESIN1_OFST) + +#define CYCLESINREG2 (0x154) + +#define CYCLESIN2_OFST (0) +#define CYCLESIN2_MSK (0xffffffff << CYCLESIN2_OFST) + +#define FRAMESINREG1 (0x158) + +#define FRAMESIN1_OFST (0) +#define FRAMESIN1_MSK (0xffffffff << FRAMESIN1_OFST) + +#define FRAMESINREG2 (0x15C) + +#define FRAMESIN2_OFST (0) +#define FRAMESIN2_MSK (0xffffffff << FRAMESIN2_OFST) + +#define PERIODINREG1 (0x160) + +#define PERIODIN1_OFST (0) +#define PERIODIN1_MSK (0xffffffff << PERIODIN1_OFST) + +#define PERIODINREG2 (0x164) + +#define PERIODIN2_OFST (0) +#define PERIODIN2_MSK (0xffffffff << PERIODIN2_OFST) + +#define PATTERNOUTREG0 (0x200) + +#define PATTERNOUT0_OFST (0) +#define PATTERNOUT0_MSK (0xffffffff << PATTERNOUT0_OFST) + +#define PATTERNOUTREG1 (0x204) + +#define PATTERNOUT1_OFST (0) +#define PATTERNOUT1_MSK (0xffffffff << PATTERNOUT1_OFST) + +#define PATTERNINREG0 (0x208) + +#define PATTERNIN0_OFST (0) +#define PATTERNIN0_MSK (0xffffffff << PATTERNIN0_OFST) + +#define PATTERNINREG1 (0x20C) + +#define PATTERNIN1_OFST (0) +#define PATTERNIN1_MSK (0xffffffff << PATTERNIN1_OFST) + +#define PATTERNIOMASKREG0 (0x210) + +#define PATTERNIOMASK0_OFST (0) +#define PATTERNIOMASK0_MSK (0xffffffff << PATTERNIOMASK0_OFST) + +#define PATTERNIOMASKREG1 (0x214) + +#define PATTERNIOMASK1_OFST (0) +#define PATTERNIOMASK1_MSK (0xffffffff << PATTERNIOMASK1_OFST) + +#define PATTERNIOSETREG0 (0x218) + +#define PATTERNIOSET0_OFST (0) +#define PATTERNIOSET0_MSK (0xffffffff << PATTERNIOSET0_OFST) + +#define PATTERNIOSETREG1 (0x21C) + +#define PATTERNIOSET1_OFST (0) +#define PATTERNIOSET1_MSK (0xffffffff << PATTERNIOSET1_OFST) + +#define PATTERNCONTROLREG (0x220) + +#define PATTERNWRBIT_OFST (0) +#define PATTERNWRBIT_MSK (0x00000001 << PATTERNWRBIT_OFST) +#define PATTERNRDBIT_OFST (1) +#define PATTERNRDBIT_MSK (0x00000001 << PATTERNRDBIT_OFST) +#define PATTERNADDRESSPTR_OFST (16) +#define PATTERNADDRESSPTR_MSK (0x00001fff << PATTERNADDRESSPTR_OFST) + +#define PATTERNLIMITADDRESSREG (0x228) + +#define PATTERNLIMITADDRESS_OFST (0) +#define PATTERNLIMITADDRESS_MSK (0xffffffff << PATTERNLIMITADDRESS_OFST) + +#define PATTERNLOOP1ADDRESSREG (0x230) + +#define PATTERNLOOP1ADDRESS_OFST (0) +#define PATTERNLOOP1ADDRESS_MSK (0xffffffff << PATTERNLOOP1ADDRESS_OFST) + +#define PATTERNNLOOPS1REG (0x238) + +#define PATTERNNLOOPS1_OFST (0) +#define PATTERNNLOOPS1_MSK (0xffffffff << PATTERNNLOOPS1_OFST) + +#define PATTERNWAIT1ADDRESSREG (0x240) + +#define PATTERNWAIT1ADDRESS_OFST (0) +#define PATTERNWAIT1ADDRESS_MSK (0xffffffff << PATTERNWAIT1ADDRESS_OFST) + +#define PATTERNWAIT1TIMEREG1 (0x248) + +#define PATTERNWAIT1TIME1_OFST (0) +#define PATTERNWAIT1TIME1_MSK (0xffffffff << PATTERNWAIT1TIME1_OFST) + +#define PATTERNWAIT1TIMEREG2 (0x24C) + +#define PATTERNWAIT1TIME2_OFST (0) +#define PATTERNWAIT1TIME2_MSK (0xffffffff << PATTERNWAIT1TIME2_OFST) + +#define PATTERNLOOP2ADDRESSREG (0x250) + +#define PATTERNLOOP2ADDRESS_OFST (0) +#define PATTERNLOOP2ADDRESS_MSK (0xffffffff << PATTERNLOOP2ADDRESS_OFST) + +#define PATTERNNLOOPS2REG (0x258) + +#define PATTERNNLOOPS2_OFST (0) +#define PATTERNNLOOPS2_MSK (0xffffffff << PATTERNNLOOPS2_OFST) + +#define PATTERNWAIT2ADDRESSREG (0x260) + +#define PATTERNWAIT2ADDRESS_OFST (0) +#define PATTERNWAIT2ADDRESS_MSK (0xffffffff << PATTERNWAIT2ADDRESS_OFST) + +#define PATTERNWAIT2TIMEREG1 (0x268) + +#define PATTERNWAIT2TIME1_OFST (0) +#define PATTERNWAIT2TIME1_MSK (0xffffffff << PATTERNWAIT2TIME1_OFST) + +#define PATTERNWAIT2TIMEREG2 (0x26C) + +#define PATTERNWAIT2TIME2_OFST (0) +#define PATTERNWAIT2TIME2_MSK (0xffffffff << PATTERNWAIT2TIME2_OFST) + +#define PATTERNLOOP3ADDRESSREG (0x270) + +#define PATTERNLOOP3ADDRESS_OFST (0) +#define PATTERNLOOP3ADDRESS_MSK (0xffffffff << PATTERNLOOP3ADDRESS_OFST) + +#define PATTERNNLOOPS3REG (0x278) + +#define PATTERNNLOOPS3_OFST (0) +#define PATTERNNLOOPS3_MSK (0xffffffff << PATTERNNLOOPS3_OFST) + +#define PATTERNWAIT3ADDRESSREG (0x280) + +#define PATTERNWAIT3ADDRESS_OFST (0) +#define PATTERNWAIT3ADDRESS_MSK (0xffffffff << PATTERNWAIT3ADDRESS_OFST) + +#define PATTERNWAIT3TIMEREG1 (0x288) + +#define PATTERNWAIT3TIME1_OFST (0) +#define PATTERNWAIT3TIME1_MSK (0xffffffff << PATTERNWAIT3TIME1_OFST) + +#define PATTERNWAIT3TIMEREG2 (0x28C) + +#define PATTERNWAIT3TIME2_OFST (0) +#define PATTERNWAIT3TIME2_MSK (0xffffffff << PATTERNWAIT3TIME2_OFST) + +#define PATTERNLOOP4ADDRESSREG (0x290) + +#define PATTERNLOOP4ADDRESS_OFST (0) +#define PATTERNLOOP4ADDRESS_MSK (0xffffffff << PATTERNLOOP4ADDRESS_OFST) + +#define PATTERNNLOOPS4REG (0x298) + +#define PATTERNNLOOPS4_OFST (0) +#define PATTERNNLOOPS4_MSK (0xffffffff << PATTERNNLOOPS4_OFST) + +#define PATTERNWAIT4ADDRESSREG (0x300) + +#define PATTERNWAIT4ADDRESS_OFST (0) +#define PATTERNWAIT4ADDRESS_MSK (0xffffffff << PATTERNWAIT4ADDRESS_OFST) + +#define PATTERNWAIT4TIMEREG1 (0x308) + +#define PATTERNWAI4TIME1_OFST (0) +#define PATTERNWAI4TIME1_MSK (0xffffffff << PATTERNWAI4TIME1_OFST) + +#define PATTERNWAIT4TIMEREG2 (0x30C) + +#define PATTERNWAIT4TIME2_OFST (0) +#define PATTERNWAIT4TIME2_MSK (0xffffffff << PATTERNWAIT4TIME2_OFST) + +#define PATTERNLOOP5ADDRESSREG (0x310) + +#define PATTERNLOOP5ADDRESS_OFST (0) +#define PATTERNLOOP5ADDRESS_MSK (0xffffffff << PATTERNLOOP5ADDRESS_OFST) + +#define PATTERNNLOOPS5REG (0x318) + +#define PATTERNNLOOPS5_OFST (0) +#define PATTERNNLOOPS5_MSK (0xffffffff << PATTERNNLOOPS5_OFST) + +#define PATTERNWAIT5ADDRESSREG (0x320) + +#define PATTERNWAIT5ADDRESS_OFST (0) +#define PATTERNWAIT5ADDRESS_MSK (0xffffffff << PATTERNWAIT5ADDRESS_OFST) + +#define PATTERNWAIT5TIMEREG1 (0x328) + +#define PATTERNWAIT5TIME1_OFST (0) +#define PATTERNWAIT5TIME1_MSK (0xffffffff << PATTERNWAIT5TIME1_OFST) + +#define PATTERNWAIT5TIMEREG2 (0x32C) + +#define PATTERNWAIT5TIME2_OFST (0) +#define PATTERNWAIT5TIME2_MSK (0xffffffff << PATTERNWAIT5TIME2_OFST) + +#define PATTERNLOOP6ADDRESSREG (0x330) + +#define PATTERNLOOP6ADDRESS_OFST (0) +#define PATTERNLOOP6ADDRESS_MSK (0xffffffff << PATTERNLOOP6ADDRESS_OFST) + +#define PATTERNNLOOPS6REG (0x338) + +#define PATTERNNLOOPS6_OFST (0) +#define PATTERNNLOOPS6_MSK (0xffffffff << PATTERNNLOOPS6_OFST) + +#define PATTERNWAIT6ADDRESSREG (0x340) + +#define PATTERNWAIT6ADDRESS_OFST (0) +#define PATTERNWAIT6ADDRESS_MSK (0xffffffff << PATTERNWAIT6ADDRESS_OFST) + +#define PATTERNWAIT6TIMEREG1 (0x348) + +#define PATTERNWAIT6TIME1_OFST (0) +#define PATTERNWAIT6TIME1_MSK (0xffffffff << PATTERNWAIT6TIME1_OFST) + +#define PATTERNWAIT6TIMEREG2 (0x34C) + +#define PATTERNWAIT6TIME2_OFST (0) +#define PATTERNWAIT6TIME2_MSK (0xffffffff << PATTERNWAIT6TIME2_OFST) + +#define EXPCTRLREG (0x400) + +#define STARTP_OFST (0) +#define STARTP_MSK (0x00000001 << STARTP_OFST) + +#define EXPFRAMESREG (0x408) + +#define NOFRAMES_OFST (0) +#define NOFRAMES_MSK (0xffffffff << NOFRAMES_OFST) + +#define EXPTIMEREG (0x410) + +#define EXPTIME_OFST (0) +#define EXPTIME_MSK (0xffffffff << EXPTIME_OFST) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer new file mode 100755 index 0000000000000000000000000000000000000000..cdf9b7c45727680214b13cf9c0450510f1642dfb GIT binary patch literal 231752 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
    1. #P&(OGJpJE|LNY8@u84|ii=QMu#HRx#b z=wwy4lU*RIvRl|1+1CWmzRuD3uA7+KXw?qh*E2Eq zxW>m_tRu+u3Z5TSv<(>|nhYHK9Ls-P2fBX(y)fAz=5ZcxZ51t!YuxwI9gEg#(7Mlu z*7t+RCorw1*+i);uNu2#=jNE*(J$qz2EisDp(U{Uv}d z`y29EY96K-Bp#9LL5JcuXGrR7NZn?3Y`}!(tT6jLed!H7rdG^sXAJZN@yK^|k z1AI#T9G;DLWMwz>H`l;+*#Aw}bon06{m}Rx79jWaO77$HFQ0$v`j^Ih@L-JxI(tMs zhR7&%n8YdLErQb%|M&yJc^0vOjDfB z{J?J6t{(Js_~|iyxc81MfpdQ%Ha?O_j1!62IQHeezk+;2u%;T~p7+{YOJ&6C;1%TDR^feCxtYvv2c9_Ss0xHj`OoDEF%S*nj=Pl0k(K(1<> z4K>Him^6Dyn+F4F{Tj3);Dch=*XX>dkN$gVa_RFv$w2qsl_o>e+TG;#`)#D(hpAoo zm#`6UWTmy+G`dSPxhcV&?ezgN zy^#Ukks4h;nXb@e3VAY}=Oa@^25on6+g5SXB$CO;K7N$}-MUXw&UNAKlRdN;y7|c25mc9+c^O;EzE%KD;ixtnc8YH-Ra5nZ=5YQ$MKIcX#00s+wakN zWuJZ;ngQKAG`fB=z1urAo)&mA{n96WO@tjv#(*>8<0WUq44~UC1G<-Mbbk{-_Xn&`k9Vv`HM&~@=pM{~?inuKW9|ps+$-gqJ0fpP@yc?K zkIjgK^<31R4EX2^J}5pZGGglGTDyml^XNeFPCKU*BSf;>7*TB^U*;ozUCuy7}xanQ}+6#o-+%S>oLexM|(4e8tU_KQOcG! zL!W1m?u*@=$M0IGJyi8frji?Z5b!ZuB;t}e8b?@`Y)BF5PWos&PL*f>VdpvHU3Gih%GzgJRSMEkC>nTL^6 zb^yNy`6%zA>Ipp8O!bf(tnTC1`;zJbejfEyJK(pTcO?h*Eph)#SYI)Z#5?U{Ir|&t zcfUlvqZ|I>w}%zj2eY_sw5MnzUqZQdk)1d{XixDi)sAmIEU=wZ&<@rZ$MhjrYW>~} z{Z2mQLhMtJ&NmxAhXMy{!X( z1f&0FGyWzIehaxJ{H9H%pIjRQ*y^3BMuaAIN@=wj7ANEfi zH(!)N+s|ule}&vSwQsIZr=-zMTb~BX^bpg<`ckb=3%qYyr|xOEPW`NB%4b{-8Oe5D z58$Ur@xyD=rtxzF_@S|EIgRWUp-A&+(1>vB$~Jl^Q?IJbo?= z;OEgaewx;YosMBsNVLa7HOA;K9y_;Y&|io4H$HAhY3)CU_G#R9M*BQ& z*;ZDj>7r@2@|M-|+69xakl z?EUcmXB_vpQDx+@LH9ZEX^zd#8Sr?OE4zw!A0pX(_ANpg&|TDs?7!1wALS>z=p_pc z*@bx3v`2Qevl^n6Afj@ znSqn!eTMAQJ=u#OdzO#v7i7R=LX-X9$ocy9`{XpbsdE91$-WD8E%X2Vuq<$(uUmpz9(f~uQH{mugAPw?X^+v;eIfp|F#n9k^2 zjeG#prI<_Q3SdW+2T0Jm41M$oXfr&8^o#Wh&JxhtW#%E|mcf7WCDfs3F}fiRrM3Ma zd^25=hxoFP2}SPjgLhhAI}8vk)Ht{>zl~OpEW)vdwkp-z{l5E zN2TneY5s2x_;>}jN`3~uW43tr&YAIM@zt*b|AL1v1fFe-eO&@Rj?RuFhN`lhlhV$P zN4)nB7RK=0OH8b%y5tX=E1#G0fsa!D9zO7AXp8Bm`8?0(K0tf~`8>nt-V9pY-ls%g z^Lf8eWjlE(>X<(7KBc>cxfSNi&*x=>4*NX6IDVSeckdv#OKXTh=sUCRYt#BIwbpB_ z?SFlkYFqI@xkJR1MVMRk__x2t1D&xaKi4L}e&%Pu$4f3B$2>EVt?{wd)5WLA=bE~h zkj6vP;(-Ui1M8}KSS*j`Vw3Iw(B(SmaYEDd{d2TI=STf?{AQ1o&$`f)?GHY(wMvt% zY3;7m`uQHv^oyas!I~{K?wdyUyhh~twI)wrPo7Oa^1PElyJIzZE)9?;kpbP48j)v- zCeJrG(@NuTnvXm?GHADjCeNq$@Vm4qw$?jeE7_lmuA4n8%^XR zSL5R@kB_gBul3_&Y6g7l1|J-QPlS)tbJkyVPmRBgUjObx+w21-pgye?`e)GY7FT|i zFL}n3$K1=v&w%cFk|!W%@w6t-RLEnjU8@A%8#n@cQhLtfL#!KU-TnvAy_63HZ|Ns{w2%Bo$%;6_TertO+1G;Zk9}l+ zC<7kbX|me^vi~9jxxS#7=sH0#{j>0yHuFhDm9@=syA|E&f?-U4I{SgCGUJz#q`pWZ(FFe0fjpt$F z;GwxH+sXGJixalwt%(1$TtGwlWBuyoKV6f564Al)K-KsiL6W}~IRyvs3#hXI^1Hm^ zHyE?LXE*70S2qh;g7!vOG*z3Um!WtpI_WZgteXwqyvocm$gZAvj z(J`XCeOn=ZtCa6Un@MLSWTp32;C_PXJU5JpuF`rQbm%noB*JxS!yH7}i0c`G_EY$e_^EK|;j?T(#^z;}aIg1<0X+usi)XgK& zIIY3>P&;PIC!cgd7#suqm32VgD`FVFIX3{t?TD;8soP=XhB{Tmz)QhesReo8PLsd zL=ST{J?uvwqftHBL*%PU?o^C&g{OyUXk(y{9yVvd?1PiEGN4=Dh#ubRk{TDK$I=7d z>o&#E!y)9fXk5I6HXiiRLmk#r$2%@A*7UG7Ko9@QfbQ9(2XFsjBF417_PR~eLl5Xd ztyR2z2sM|8VKUp0{V`AW8$fr7Ci?`?rui?C0gorSva5C4Y?2-Guena!l>yzHMr5C* z$^K8|78}SO8z%p%WKH>j%RJdn2i^WYvR|D6j~~6K{D6|ZLxAi{GoV`qxziCKAo{|(C_i# za+)FgcUUXXcz+diAM%ksoB@xEHQBcX$o>V^l*j8wW|HjF#d_y1j3JE45`1X=Kx6Y4 zn(T!v`*eGK{kjRiN7u%X{RvO@TR?ZYCcEX0_ZKqYv7ak@o>MB;&n4NPbkBd%+Josn zoB`eTjmSPnlf4G{7uD~&?9K>D`z9PmQv5^vJk;-Jf$m@**{=)cvBGC9Uq$iSr+@e6 zeaNof!{a0S$~3xZdqIJ8-vZsBdB3wJ`+bmopce;v{f^%Q8mZR9yvI$lpGvZ0f9C|q zUWNG{zsv5%i+J}E#jOc<4_on5i27;|9r5ITTt`3BI=0-xdreg=2)WmRKZe(6dPXcb zv%u5yA=F{NLNv){2P$3o?(GEXLb8sL^WRRqq$WG**+CAPZ0s@6y#x7rQ~uAf?hNn&fjpk0$sYqvKiS{OfbQ5vWZ$I8 z-pWsQ{Ql&(O4ihTy4{ogGSEHONA}$r@R+B`J|RH%Z5hx#@^0|>vNhRXMSe#4mb88! zE&pW5KHrml6!`7rBm0UBc-#jbF`m@gDik35+zjYG-H7a#Ci^XZvg7wfuP|gU@?`%G zbl*ju*tGc}8Sr?!Ci@=H^t1Uc8PNSH(?xEGbxUzd5yq|_OF!E&HTKVd9wsx-r{2b$1i0d^z^1w$vYz5CnR^s_beeVS^&KODiWO^L^TUEA` z8_?E;K6?B^27GsBzBN5g_Uwjp2OLA*l}11HJS*bSz!*yS(Dxfd6EwZNhFr-c(#rt5 z(wPn)gy#pHY51NNQ@_=^?;Yp`&z7q4+7oAy|E5^E8qb$ftUK7FwTqrB1a1g;cpNl` z5KWK9^F#w@Q5(=etWGp~cr-rsXq*Td6vubR_x+&N9kgnuq2H#fy#%~#Y>eDO{p01a zrN$jR*LRI>=cE zzWnC8{rM@su>x`pfLwn8uO<)O!2|cRw-351inU7wa`H2q)DQYRngH#39P;_3*C%zH zr|UlfN4nMZp!x^*)Z+j@4ViQvIM;9F%mZ!lBG$<<#^^noPWnM7fnyZEtCeSr(PwC# zgmuVmXlsp+9$@_2pA5YP%bceO_2^}onD(A@K5pLQS0pxt&}yA#NEea<~>%Yf#Q zw;PH7HCbMTEPDKpF;gq>8y$aA`c18U=6m`c1ztP($h{(%$8w+CLIvd(_JKzpJD~vC z=Vn0nX_v0bQGSj*G5JCEu@h(5QOzQnpJHQv(Ztib-Cg|^9OlFg~-nxWGM z&+h@Je4F+>dAY_@H}KR6dZu?0nEmlHtzJ9Squ*w3FxSyLx^aGEz9tjT!<9-V-}xX= zrV}Aky*zsw%0uVMruejV588syRdm_!qdeR1Iqpf2%df9a174>Q;I{*L|My$L{%?e) z%V&@iBHQlZBge8dJ4nk>1-AR9*RBP6e*SMx1~i`nP32p(cgjm$V*X9U(|~n zY3()5rv8NXlwW{7A0)ay@z&Thy)}()9CU;BGY+&%jS)Iy-yq(y$IA1uZ=tV2o2xR; z|AFq4;M4RolndeUWd8O6&jE<(>z_dcPQ_f8gC6OUfBRrH%CyH~(*GXoGWDAv-ftcp zPa78*ZJdYlP27jZZ;v=eJNmnj8?~v zMDsAMx%4u0x+;#}6H>Sc&P`Gs*pezc>K>f41P<@4XB^Iix-_d?nqs59RebZ)eRxOM zn-MxQNA{@H&lDJkhlH?)|-S$Y(vCoAOyD ztaERVh~irz#>qk03(|eo-;v*@HTiDPy%l_#HhB>1PWD+wE+LS|Gc?)P2gv?L26RU@ zBKtZ`_OPGqv2pTCC2MMZ{3}oP6`(uaNA?FY;ITE!uEns*4g&TI&d~UN8~GBl|AC}4 zpWN#;0sO>#-UFa~0M_dtzp2J^m0GK9Zn(A~AEL&twpKey(lYi&H2g1I|zYiim30V1QJ?{zIrrf~+ zstdS2X9lq&?ceG{>!6~=YnhbqYmC+zpap+ZCB%5y z&KPq~Q(hOkm#Cv?;P=nDpRdMq#7vjgW^~>o?mb6L^sLzUwC9KmYbQK`->83r?xC~k zRG0dtH)u2b6}9J`7soi9`D<0SldDk2w7p$vdTW}jIiSPy;AzmG-@J8u8r`P#N3sg% z|9tx6>J0khBhccxh~^=49QD)e>M`UDX}r_@$q}`LHech+2(jF&47m&zytN`H^}Sy+5Z_C(0s(B>8H~}ZBw@YQ%{z+ z(Y7hezzo`zUb{iR<@lD?cB$8&e7}_IjQ-46w__uZ^~V!$t)nV-*3vz3gB<2;*axy zP2=wb@K-;NpnsdPA9AL~L$(ATGbHl^{|G=F{IZ|?ZZ z50L%Rw7zK?%{M@^-miK7MBnGm)8za$W3)X}Yx^Hw+jKsgZG`oC^KrDTd?nU7wXdh*dUd|tN1vAk)2%Z7Ez^BZqwA;7 z9-2%KdNS1^M{de=ZU${XskQwno#FM72|36hyAPDOMHhFCv!P?l5=EI=r6j|yy z9Nq6eNcjB?b2~c-&%R8{C*KXc-e&4|0UodaZ3e!s=R$z1r8W0iq=zk#{bqb7;!M@1 z7SKVcfevm(JDd~g0v(K{`JgD&fd6Z?dO4^!jOyWc?u!f`e5F>enWs}{kLCJmO};X% z-Vex0xWD6pd=dR_!Dh_0*L(2wqOy83=HJbhY>R%V2Hu%y$yNl9MJ@?C#XA&sO#tnG zVBK6@4BX}v?p@%<`Sj^l;E!(jYlGifXiTSvUrUYeJ^?m+m7?1)huj$58qh_&QXwLz z$(@w7odIe54_hn z2jv?`KH$u~k$Z!ZY#{BA*bXL4!Q&L8k@mH0|Lx3yGM-sP=#ukMNc!Ei(tY;3mk*#+5^aeCKB zwpeA;yA3@!oAwY1ru{_ZbQO#}I)U7C7ueR0iG@;)t2lle#oK>xui-8HW(@5$)vpht z_F*e34!6?lM2dau&^sIApijAP)kd^f{uz4>@zSj1_R>k}_j@l<_$0ijHg<9*QKg2th5|8 zzw0uRn;0*0W8(|sc;{tYtfzZu-aMV!oDLqQPon+Qncq_G8t`Ayo)Z@G5Oj(AX2!R{ zCb!){@A-H$J_UUX_^>#o{&#i6VAbrPL+or`a}b{N;X;F`d-lY#3XI_%2# zu8DC%iX)TuiO)Cgt6LCxmD&*k`=JwEy4xW;^{wj1iIb9dV(wG#*YuH{Y?5-iO7>_- zvRoa&Kf}2sV=-hbc4d5uWCUD}I=U|=oB1o&i}b!@>Z|Q&`(D)96cR*N>0HG_=!dH@ z=C;Fb??b&Euqoohe8_3cq09za95$544h=EkD=ED{3V!tW zX#GT$?c{LqNB$%g<2~lacmZwKm5QXPKiI}>+Q*^x@QiiRDRuYO3JD*!I7|mAgTXLCG3RosIE}(Q2^nd#5$S6ZP5Pr)`ojeH+lU* zd!!xE5956FKA}1EgS}GnzcJJ!Uz9*!(40&93dNeczSn79Z(G$kYi0IDgzHCIG^jt# zr+&W13)>#GXGL4oxAXpAQ{(L&VQ+ZbQVuN*_EN`G~QJrsc>Vy7V3+Q}&OsUJe-Rfi`reCi{i}+2727?x;p&zfzOEnV;-}VpwUnz3*-!Lj{~C1n zflt%s`)9!87EShN0%Xt6fbM#YuAdKkN|S#I~>VhzT&?2`uw9LwjSeLWBG zW0ZeJ^7-TeK2UAwd4RONqrf(7&?LVP+X*~7e~l(*TgXZK;ujMin;V{;|Fb5m5uXI| zP{4XV#y)CPItEW;HJ)A!;HirbPi1L5rR{MB>gjFf zN!x=}XEgRSJVVeyg&Ff@}jc!+EJGmHiw|aRbD;sMN+(&DWSFm2g`bP1?>jJt)>rAWrkwHEVS>o)4IN$ zO0Av8h%TPdtS)fdiK?=l9Eo;LKs$Gk{-+?%0G^wH52BToXf5|oao@8*yjxfku#692 z&1u?nsp=_n}al#Fa*uc~bY+yHN2aT7nvQp!8qn`~pt>q%pk@j2L?N!-M zehj*Knb?5croL}xYJEfdWV#I`k>{lM`M!=iYy(q{#|G@S_3ez&+8LqxJY@qPQaiAR zKcEiT0NQG31M#+jHgJ-U4g3>p!c-3FS(QV&fa2gR`kl4s8ssAQ-Pbc!tc-jNop;8X zQTYPI6(zu@{FO^@id(l)dZ(H6aK??|l)-8Anr5TjpdYqT_5FxAMSaf_>wkp(7IPf@ z8am){!s9ba`5Yg=JrQ>3JR(%Cx~JyP#}gj>673QVKN@(Qc1kyCvXuL*=__bW|H)s1 zW%1*$k2X#ycc{**`|#UCtM?%4wIkofJSg5X(pHW}|BXRA^*H+kIUKkV zIxca790c589T&-weSzzz<6=3o2)JH4&dHG{0*84(Ya>^70j{f#i|5LG;5z6y(N5+7 zm#gEV?PM$9D4wk6Inhow1FpG_i{wcG9OaQ<6Xn7#K+fJy?n58Dxj)`F+s*s+$?8oa zS+f~=dDcgoN=e5A7{Ea~?NoaV7S7HGZz9_O;*57^KQ}aunL$0)8UkgWeJE91`+c zz|=S7Z-__Y>t)a)ULE*4lBXPH<(r|8gMhJbl;_OBdtWiuLwvRZ_uYnT6c_!kWQugG zm+5Dqr~DrDeJ05OTjSrtIQ(BK!=511`H*S5$NM~whY860<6b;_LN?^;x*EA+7ndU; zPqGgCzT}G#vn8u(A8}pbVF%xW-l30c1Q(1Gt6J98%_hBAM?^c4FH#ZfDmFH6Px~26 zZyr4tx^CX#YSb&t7kTjOdnZJm`&CF-yYxCCw4w85p)D?ZFgD*K80J<_Za_>Iu+NY+Grhj)vr+xCj~ z@vl{%fj6Zu=!p8Y8THiyOVVBp=99e`YkOVV?LfO(|6dc|Ev!nX#RSDmv_Jfe2cLm` z{NLlcvX5NsB{VV?+iSj|J$!@GJN!yMc!+y6dgEL9xo|#yAErI+g`#gd%3qTX;e)F; zxjH>vmF?tA)E@$!Fh4&(3BTW(V^#JdT+W0B_U5ezVAJhnA=?}3>Gp=-Ex8Fg|4Q_P zoIW&CHrq~;&04ToswX^~wIhjNIpGM-CWxDqp3xT7BfG7hg+1;2tol7+y6^9MARGGJ zY3=Iw(#~p(`PyV-I-Cw&bbv0;@^rZmbPu9W4}?4P-w%D(c>1*LPPAtO`kmwy(&Gl` zb%U$dLr1A>Cy(IXu^t_fE6ypn-CDIc&x;%EZVloFMK9J_jv#u|KyR8$??a*o_!H23 z3S&*xb2`g@RBsCEO>yhJP4xi(6ZIbDdZLRgpn7XiZ;e~;RjLR0E!2CE>)Bmo2dXy< z^=7&Co}+qzUqQWlxL&l2Y)$oWrmlLTTkmnI2RMOxw{yK%7im$wIjA?st+$)%0sa%} z-Ng0cUF3I!$DVC@QW>PVPXx%ekJ@MeZm3QqWuK z(%YiScJfZtTgLSwUFF{izY_IUy7jJ8WjlE*>dohR(XR3h!e4=USGe^ysIr~B7WL+G zy?9so7s5|Rz3FbfRjOk7$uiWN#Pyu6^7n*agnEnI zdKam(oxB9~PUU){oBS=|i&3xGtv5@R?c{~1Hx%{iHf8OkJ#fsC>i3wM15a@gjUm{j z48u?I`3f7pmh_3T>l^VrB>BeH$f42LYSP?;db%$NoO?XqS%do3_>>|pDvZavvR|cn zM)?Htt?);TCqG$@F<*@OZQsY7hlicF%Rg)yN~f?&(^ryS&UDo zmphB*O7mKw2)ne1U(7AU?_}l|zZXVpH&;LK3HYrt@Ozu0fonCm=JAX3FjKdJ-`l|N zF22t9f?u4cL%$KfCe5eH_JQXBnlrXS-^WjLV{{*_aeUi565UtQ7>}ffh^q%$JJmrS zWShAK0vS-pL!Ys8@|RvSxs&++P4Y9spkhJ0UvlkfTcF zJiL91M(W>1IW1b>6jQv)dkCo495klK)#y_W-8+sWUwWKkD{-^^_RKpnGPHd{E_c@D~$NXQJEIr`)pFDKs50VzYG<0)r_&%0;DTQGUA;`?NfgObzT*w#P) zp>B2v^?8gEk6(ahjP@}QbI^N>0GA6<3|O59D;Kq=rQykMk}eYNedQvzSW@nQ>eE>? zbw6;R4cSOnoYPA^LqfW8aF4SEb+$kr{6^zc$Yawu!0*J*p#Jb;UAlhcdn((>X3$67 zCggWE;69AGBG9-7AL?5gZ=X}_OV>8II`YPL-gK;~u>Mkbr4!KLc3(!jM2qBtAMB6y zM5W>*(pwHDKE}dM#=;kYkN1cV!21*Urh5>_nLNB2z{B9C@PM3o8V`xyvMup28a#}4 zd8i~F06)(>;0&|L!>#}x+BSuUY=Z~8kNlk49049ixIEmc%64))^Dwj_4>tzz@HyG* zvHGHo!9${te3jZn-UjMG~~fsr#7(3T}|O3-{2w9SKdf%dig!F$&*#tPM*d*L>uzZJ3tRNHid`I z1`pAGaxt~(U! zz1V`<*sjWUau>CMda38t{>Xa@n6HHEzaN1geZ=(N_&r~uF$?2l7UakETU6Oj-T|6* z_ribQh5Nj|akhCdbmVMJ(NntE%6tx#uM!O}??N=MP-TpNPuHdoyo_{9?c9|<7i=OQ zcrV%lUd;vIhh?bO6VC;xqx6K|qx~JV$8!?epQFlH%Xsbk%>}aqc=$ zo5BOn1_a^8 zoCqHF5f7LjKVTkw=7OpK9^PvT4?Gtz5Ah+gIq|@AB6xU|c)w)J2=D{8+4^o>vCxQp5%69Ts%!AKdaBBb$cQ%Cwo(q_V#8CMHwaIfLcqmh4JGq{D zfDKh|bK_QlwFCPeHNOMz`odvS>Cf|ph^=S-gy>+MwFq>mTn7H=-eb)z=LX0ZZA3oh z?^veDaJhxr<~bHJja6kkIf-S0f1vn1&hnsK4Sz|odA*G6LtH;vCGeY*>xqsxZ<0(W zsj{6M?8=xonq@r3+|`3+1aI|om&<>Zh>eh?M3?7A)M>5Cb~2y%M?K=bn$|NkUOic$ zAGM}Yb6HczBlrt++5NlP{KIB3>rw~s9@y-Is62kMGbdAn~(VFfy+)rm36peYEIsGW5NpQ(I~x9+CC#`?I1@|=BQ6t5$9 zhIJ+Syg&6ha)jc@;(Zo!kS-kE7pjNn?hDt$GxlZG!&CQB&hjAc{SCf9#y;XlSQj1) zXZ1f24r4zmg#9S1zp{n+$&%W7|0%PNy*xPhs>U;Wyazx$WD#GTkbB(Nc@}+(|Ht0@ zz(-Y_3;!oeRQ{<^P^nNkCrE3K@c zq5@qMZ_(1*c%>CuT4PIly)Cz;N?Tgd2BocS@x8RAE$Kz}_kCvOoIShQvwGk6-fMrK z&!K&M_RKTSGtWHp%rkT5%uH70lq;Ro?}6n?C;2TpP;S36?Tx$@yNt1ry>e72fbOdQ)Q#UOOpu?C2S!IeUAwepf~Z zktVT1^((X9e-JzC_~Eqkf8XAoB56bBQU9HLd-jRU6~vttIY8QGA;$FI z+Y`T+Zy9G=@_wP$q3mI@_SA>J(@#R>oKc=AYyURu{^XN%d|mIA5F5d-)|DMOU9y(- zK4eH-b$H*sL-(UU%R3HhXNP2sj=1y(;;@u2eMWqK80+Q|qke7Dt3noQP@48MuSl?KDh1hx^7M%jQ}7-#F{*uN;O~-n*6o$bN;qujG)2ddR*PV|%q{L;Y5IXIsy? zWm#A0y*(1M#0JPwdwcjj*pwxAv?OHlzGvi$EXyi$$7QSPs^}G>r8 zT?Zpa)t&M6GRbGgAj$WdZsVq z6RVgbZA8@t zl1F~q6Zn0R^=|J);dd>o^8!gj#=G{cstZJ?tP%6y&9SR5C`SKNq&&%&)0o7U1)tW< zLZPFg>mio{2oF~%6s=yudevxr(PXzo%ZZJ@Y|#hB0Y=raXgQ+PI)#P%=gpu zcVh6K|0J?yZW-epf895@^MPlJa%9fAg*4SBoI$S;+GW(?G99CtkSbkuo1GfHk~WI* zuDWHs{`T}+Vo!|UKY~x%N&2$L6Mow10iLgrGG7t7mwNP|?zfPp?A~=+GC?>xx6rh39$l_r6Hmzi950z=pEVuX@}4k-G=STE(ZGyxUUphIx-s<-%)Q z)(?BXi5z%;uuG3iz2DS!MgM5;3s&Fh*rfLb{DyKbtgo6Sbp6{_zg0ewK^})kkl&jb$G9?hnKm?TjUe}P<6Hjs`>DK_-La)R^!7qHa}O&C+|e+A--$+hF-gt zaXv9#67L5_zbs?b^Ng3zOMmE!T(6#4|A$}X$@e`;fA@|9=3RHI+kP^a|4y#nkMt&b z$a6beG8f2Mk7{m+ztmedEi z*3bd!8@BLVCUrBit=>V=PYTbkknt-ikJzN1!+ocdPwReA=^p>?Aou-@Zjjjq`c8teE-c;Hat~5=k>jVO~i)v)FB=pKsoQv z&)=jRWw+kJ%5DRwNAJw6zTTO6dYeC>}jTLl%LTa z>}^)I*@7&$eK@mpw#c~@IhSfV-xfLie%i>fk;6A<&hD`GY*~N!z0pN{-IZgV9<@Zy zWyrZq%h@h+_`S}^IYacJ4&rxiJ?t~0f0BID;hUbP{A06v&g=U$eA+)aXZ+nkW)F$G zw}Ufv#2Ciox0tgZW*+!!#$uV*F>dUVxVS}P17n-`dzjzOSVtXhmc34rcMR<>@rB=N z57Zdyc9=2oE%=zL>;578^QiypJM~%Qess=^2>qwf1uOfR^-0nH6H*^y{&mzx&-0xz zFr_Yxe{WF_{%%FzuUSX%)@95o=!^X&KJ-Xk(9LNNsasNAc;ApdP%Z5QkK{efJ{9&j zJ)7wBIZEek=qz((-+a9~-)2*{`&3=%%hX5eroK1u`}}@&doHnOJoO&7s~HckWNc&1 zcE)>4?z{RA{`SLvbje<#pTyc2Q~B+T>0vXbpJv8%p*iEaWybYW%($*(_>Jw&TJDoG zwGYOcX;jyb`*+Fy^3b!k)$>v6{878RXO7j~HD`;VTh`gpJY>Z9 zUbSVuw#z#w`JPpZ;HM^P1GHl)9E`+uWy~!+lN0HWRVU zi}&Go!$Qv3%~}?1MEMU(`S?YQu`WnZzMsDkf7I&>-@Po92x%}GI#!D$^2lXQ_ta1i7%U|r{K>B54t*g&Znv8 zaNmcJVIz|^8!qF5$W!~{h(D7#OG>&r$DELRj*@$yk=r72@QXv(mp&62rJlom1B~23 zA{Uubmu${ja9-=#HzmHIr|8Av5qk%n`>?jZulV!S^h6BOHaai5kaA;>(iV?~)jr_A z|ED}t4th$SESq+p&U~Eb*gE>hI^BoIV6&%4cjHFvyr}q1spJFC61le__cmR>!y=d8 zKZGuJ>kz--p2exA4f4eAkS+YK%%0&&=4>PLB9VCqGVjnbe=IWj{dFU=3YjXlj?UT@ z8-2Hqtq-6xzkT~OG~YfgGW`1VeOm5Q=qz&s#@1Kx-M$A!*Dpf*Vz@8%gw-c&8e8Ny zbrt{ELY}9&A4&Yfsq@)Mbv{Sc`Q5K02Rr^o>UbA*zDw6xzE8yXeY>giMPf(vOx0th z(PPUKluh|I?^~je{FXS=$bLDYDL;sfi0&1+_fpQiEj~zDRg%Im45z~==uV*7s7q9=dHdME3lm>k{d&s-x=;N3-{m>nw*$JwmORma zrfzqOxU%JW%HsKI=JOATjyx+JtIm&}A+jDs)`R4M_ZuRM-&>G1QsiK>*q5OThR>!S z$^1fOvCpkSew*|kO1{{a@re{0e@^tq#!8PDOkc#-Vsq(>+mF!~9i8ZlzY`sZFA^(6 zr-#*ZxNnunLH4QOE!a-#kj;4=)fef5Tk^?|otWdkM_>H8eg_>eIPnfTnz3kP@;KU? zKPW2m=~GR-%JPnr_DD6Jz4|phPVPoW=eLg-m^r17I}Bw!=C6tQJXaj>Lzm)nLBi6*`w4t!`I1kh;)(nmdZa@V*OdY$m_jp z?yk{c-UnpO0y^`KXJx+sVf4V(w{%elN&hwJhe>~nvD=K%-C1Gej}G^37MbAtq)xo+ z9^#!<>NH(F=k=X$>NFJH%{w7JenIpOpNwXt7<0Z`oOLMtwl` zvrW)Oa~@sxxJwLIwzWnluZv{oaYi-kE4Fj5@6iJO7G3sE=|_3gD|Qk0!d_IM?D9^Z zJQwusN3Kmhzkyx0e3v_GDgRBLf6KirGPhJQlXQ7EQ#w`IN+*$71h3$UBAdIN3Zm*$> z$lfiorXzd0mR+x&3;Ifp?8}k;B)%wj9;^2285jMkEdF(sdM@Z2XY`csLrOpPhTkVNbN{jEH(fm! z^qo&$;mthXVIAk*3(Y#t*Y!GOni#9fsu~|{M0PK8AI^fP*fByqhx_8_t?Xb;P-_?u z@+|u#dx`flc8tLX-Wo{^BaW$jHu;EMDc62dxxp<|IT#dKkrs*?^$o9{%QJICW19)s;Se(To~6cpzG?NT zXQSs^e`Sn8j|<5!V~fl++_Ko?EcPE_%2N9{iRXu=>#|}}7QgQ^WyyQ;o0KK*ciJZ| zjs8~hFb*7|e~JICQ_r0Lg-87F-8+7u$MJh@cPvqR#D-ba+3I_12sTl7%!l}{k&|@C z{D+X?tOI9x?z$gF`mgWJi5{koGB%1XA#0Kwdw%u2jy1m+DgD*fV{`r(*Pedg z?9}*D%ANJ4=FWP?L;3Byh6l}e4NqkF&D%$7xliI3GM9;sF6cXg?qV;QkC|^_%#Eg~ zZ(+^YD2CrHAy16@ZlS(Xzijnf(Dw)EHqY162Kw(03}Eh%Jg0bwJTJzxpNZA*UEbpx zYe?UUA3cQ*$}iX}?93@{fF^Sa@e5a{s>_s4*FY1Uri%{4&}o>~=~sV~=YqcPLl>Ro zJMNZ?m^V;{_{A@{14Zh2H!@?S%baa1Wj}>4=<;)Qd`I>bri}BYjPoetJYB~3r3`+5 z#grkwA^L4Gb+CGKqo)hcNO(qS-`FKQ@*5tpog3%zNi~P#E`GVwKK>8xC(EdppP&5t zU#KH?`;pX@zO=>krBABog1%~Fucg>aty^NR0@5VTRkJteMeYEI>f0OLs3YO3oyKY-THcetP&zb7Epzi`x#)ta(&a~*AlE?U4jB+Qc=Yqbo;F0%( zBwq_pkG2Zk<7*eF=Yqad$e+>I2At)_ByWsYV@2=u=u+hLjt=qNZ?1}O1J(1~zW<rFW{iPkBFwbwU>Uu@uiQ?zm{!NlTGSt^Qa;}DD zOME6y>AxkR&+ELO_a>>IS`(T{%s{5BJIAiqbEhq`79i>JKEb}wA?Olg4kT+@(iShE zi>!HXHo8<&M@zmLlp~{@Jo3$eIf4B4U9W-WyIvzQ{Nnz#tb;*UeeYVKwCUcoo-3k@N%QP!WB=dm=yjxd_Oz|Fx@Jd}hL2_J8-Dwxc35^PaY~Sz$S2(0~7}b3d@EfB${` zwDr~Mjy(Kwt;POE6B}tq{tgwfOU2ytw2v-V&)olmKJQl^->19Bgoj1Pu&UtAsCA~Kn`9~!31C{fShzPtW!%b1l^Mz_UY%=<+q?*$UqrLWCU&)om>e_O_! zlrq@c*(@@7?+|~KGDfOr)^jOC`I${q#YMGMI< zaZcIyC~H^jTX23$Od%#sJ;Ysjw~|AhMb9+02)$4JXBhpz;nhDDiVhb2jc)o7{8OxNK~os0_sknzC*HqJ3H1Y zZR}0AY>Rg9dgXJJCG*ZM#vpCO0nwj|9>&k4PIs$k?*BD)8ip=jS)*qq%jW*WUAlcw ziGD|TJ^i9dJ>$Q~64{CP=;N~=(SEjp{O{$n;%7fla>KjIbbd1jJ0%*Ea*eH}++y_{ z?z@wG(oPeo6Jt!0&E@-_x1L$_jb7|&Vb81C`(sm{mo9zfP3R%$ZaZ72MwR`HPfFR7 zrEGk%lCrg(PK$O*n&}5I@~Ayo^n=B!K4PcjHV(^JL*JD$L*$pXjDJ=4Ek`HXywCYf zKDFmZY;?Dh8Qygo7(KO(s!oflJ%OHfA0RprYc40B*vMVK>p3l|?B{9MA(S26>ri~6draO0Gr_XnOzkG>#+V6->Ub{;i%A&8nLwfSuMDxTMFAk>g zSd4X?dDzt}aSr}eTMF&RDLkqiV!*2z%K1(TkHvT=vcB(E4z|2!hiz9beg0hj zb^gX))-!)2maBD3)^*>c&-SvmD{GUob~#M?KX^FjP6eOCId{S5a!zUUR ze2Dz?w=4d}*p!-PjS4>`cYOUV&U5c|HsPWZiQIr+-tf**5H>y z)-}D4s&fECszcTg>%sMr@H^jVWez{2ZTY%kZK2`Zee}O%g9kb56*}jdD)ibSdU00S zMh|ox()0UABE2KN)%p>he-?RU*v~@4{`d5HfUz(%{F)y0x?A*mQ0s+`L#jr8A!4oG z+RFEuAz!=d;bC73o%_G17kkrsLc^|!p;xu&^?=q39f$P1{#Yb7b7$)e^jbf0{jl|+ zbN=`Ax;MqY*rO)xh>k;g|8jSv>#N`XVEpT@6#u$6;a}nJZHV+9-S)xw*BvSTb(hD# zzH@)XI`wNGjDOvh;$L?p{L79#6zSRa;s@hjZ7KeBTf)Drk?SH>?pHn-|7uS0ueOAL z_5NjZq^th955~W4PVukign#vXcKz8ONbF)=A}My=obaulzdau5y7ajZ#{*yhJ?4Tj`V!jj3G^Wjw0i;jDw7Q*T`K}&b+~@eGU=Ikuru0e%iz=k3Uf6HN75R2v4{#5{|#9b!|=fF6CX*Yw8aVZM!*Q|DSH{ z2a6MaOIg?SdVDrKc1Q>%K^Aw;8W5PWUTjCH1YY1)Cy0 zkM2mXpYbPnhS-03EYfqwGwJp7*wAYHY^3Vvrp;6JGk!1nSzmZG();rlbbF`j=V|Mn z0}n>3hCQ8LKhr-&zi@nY#I7*!3#s<=_+%{SGx)^XI-S~wcY9M=jr3t7axp-k3E%MKjYU*zrCM}bUke5`^J8~13og5 zI5%;Nw6U>GHDz}#z&4*Y@$(br9dE$p6Nz&Zk#$Y4X}_1q+xw?4M#6PwUi>lh-Zfyx z#2)e@%k{A>lDBk5-w;$Y1Ui-B5k*bG`KTa|4CtiJxttewi z)vO01RbSq&ZJJJB)1H(uB>d20k*-5#o|R5t<8xcc8+&jwYfvw0+osdkyniZvzwtn% ztGipbe>#0l-xYm(|Lwtu^%pZwNT;u9U(we(xG~c8Jrj@8>1%vY^zB;4cv@w~({%cp zexmf9!Cd7fGoGf?*Ysu4H@uHN_4^F|VB(GF8=JQ|68_Q)+Hce8YkX4lt-Aj4Nbkp< z_P4L;H%i~u$0I#0W;}KDWgW(1eMWSYH5pm&7VNCq$X#K=t7x(|1kG8;u~^3u9TZL0 ziJ&=aI~Hp@FF7>UjD#lZJ+gkwTF*}ou|_1{iN~}g?kWGvjd`pih5Pw@7D?-Y!{x z{ti4UjXVC(WJ4N6D>X z9~o=XO2-q{A77?CktzAm>4DLt70DS=)~O|p_3{U@2C~;t(|^dfnP+AHpWNqk^qKgh z7qUjJ@=}knoDJ~imGV_yBU`P(CCd7ttfh)hqnB_m7G-3~nlR;F^=$mnGqIVYgXr}p zd?M>r%2f5Bj-t0~2V{t?Wv`sF@rik_dh2hoF8wBYD19iik3GjyC+qMhRlfJsld{B) zU3^nXwWE9&khCmxaP*XVY(rPkDRHlb`5r>O53wfS%Q~~=w1@omw41l?hxmJH`2H12 zU%9KmY1dxskAtX}lQ&&kDVx$(ze5++g8SU|qP(5hAc^<1s9e6|H z%cS9>Q8@>Z#~o!#N2v$2(5ivund$t!g^c{%iRMEO(GUD+>_*O9wxVY!ThV>W78_Vu zKau|9wc~Q}CF-5($7{rHVh>qkRz50A=g`uD|PzR(nPCHy-D%MvH%01S9!3^2X^?SB|`K>dL}M zq%<MX?FrjFm+T=ar@qNT24DJ~e%MZn|WVfBDLS z!nuo5N=~FtO)5E&KFue6x=;EHpY+R<(z!p#;*6HXn81cI%lZ(&1}TepXYq~Knhda? z(V7X!zx?Ko##+0nx!rDQZD?w@+w1G>n&y=)jdksHc3o?0bF00wuC1+lMV;Nyq^M1G zohI`X3YzHtvzIh9HZ*nG`SlGgc12xVyFItLy0z9WuWP-vuGMz)O%(M!<*ux5vD=#| zWo2{g?NjXh>L#sCb4^`cEzk9JH8n-hk|yIx?4ILTCrAtPF>pj)i*VtZi$NehBll3OPf`@ zE>JPoUT#{bjQnfW z$ZA+#)7-SYVTE1SUY~2PvRAa$wa9N6R@rv-Z8zKF?=Y@AcAEXE@rKQsZGO;B>X$3W zkukoZsjl4~ZzN8>)gC`}+RQ1r{BP=b^7u(+Z=U)$E_a#|JWh+Z%G;Y;jH}PKOK|CV z)eVjB>010TDY2jFBK%s8J4|)WnB0?;$>ujV*DkxgZpswX6No24TyzElS|$-+KiIgq zNJ6GWX8XqK))gHq>zdlzZW>(H+}75xtg+5^)A&_4d+?yiw@$JrPd4Gj_WYY|yZzcw z$=o8DTbf(j?K$$_tDO9^?TY*|3EwL_ni^`V+X+>+%63~rd%a!L*nk#OYy_+j0Zq*- zn`=8zCh>2!ePhY(bgri9H{CeDxxKxf06y&|I1*X<{hD9bRM$#y#d8-n+a+2glIy0} z&q7M~4oP(a};{&2Z=aH``vM6Eg@Q~sXqOSF(8?WhTTCu#fx+7uj#IN_V zdyx`MYpd|MyrB_;W7L&W=*sH0b|T~)jg@~S3hmdz@4rl%f#9ZOGi2vVn@^o$m$lZ_ z)YaBC)zsO|IBBv<4YqvJEws&BtHZ>n;V>GC#YiYNYC6wmvqPc|8IsC`SEm{re8@>I(3R&(5yzV4*aW{@vL2jv>FC38LgJxE;VXz zZFY3G8S)p@HMXc~nb<9zP9_vgfxNxDt>Ke(40o!sh^nb>sjg{gzg^}aq}I^Csu>Ym z+nnLhs=u{m_VU>)YC9TM&TgOGW|bG0(tGWm!{IXJW(K{bv)`ZPt@g_W?=rSJ<2rcjpJ%>QnpCU$B83$Jr!@HM=kGY zs!`EglqoNoU$n47i?fQF2$~JJQnH7V&0`=v2sCx9T!yRJ6J##N6l{uJMCCh}s4r8K z`_}3vX8BX?$q+5w3{%=W+l{^4_k6$ z(Aa3Vx6*?;T3c}AW>hxaKu?G}XG1w?sUtuBn>w((zJD=ab21 zn!L3QiM*3rbdS*Eq-7;X0W*5i1vwX}{;6n?+89t$+9`t4x692)&t@ulIFmjp5L4=bkmpf`?J6jK>pPej|7`Z zf+gKsp4FJChD>>~EN9TyPnM;+BM-XqEGucaB3*Y5%fi_ei+GjpXj(!r|NO^%FP~Rg zxTG+@GQYH>ByV8>{ibq$VMS#@VMSqnMQNn6;)b$9)qpy^a7jgBWMN)$C9y@&yy83# z>dU`*mF4ig7rmmWgteE-lF|Y#)hTaYQKW>0nZnA&g^}{2(uGcXd0~WzAD8jKd&J1e0`*- zqOdYjIKQYIu+cAW~SqptQK4vT$KxWd043 zUS5$Gsi@4$ziv@cc~ONjj<$D2X<5Hy(|(af3x%&@5t8*kSI$CF3eED0xoX2H7eiLg zi{zCQdh=87bm`(Bl3o!hnm?cBa^?G^JNfep3Y7ZdJ-C)MKz?CyaX4HIOY*0ttNfk@(#jh3jDFq* zOr;CI_NB_=!g;zEI)3K(OoHOX6=lyvvhibWH&3!jPh%gGNy{rK%qw3MDJ)1dL`pgp zPqc})pGWU`k~?@W1l`4x+Bm4x|Bx+$lmaAAcZYJVuWVPRfLQGR74Z{d6=eo7pP zlyXi>{nPq*pNmWLuO)~|z$1sI7w45%ROS~KiTt86VI*EJ%$r**!E0gV{G$1JN}A(m zbZYUZlDS0{N&TuUuR;QMWl<@SeqlwVRP}u=PxNx=*Ox|=*E;f?^x{&9H3bDkr*hrb zbUl;k`8VVzI$|>Y`n)1S82sp;RGy?Ot0t$HY5q&B^ag z*KwN2EkW7nkzcxKq4YuW>EcK)TU1F1;*LI-en@Qr6fdKfZ;=`bpWh^m3NGPq!*B>pr~BBk`jpjd1Ia$banosg$!GC{`>`n`PX{K z$I^KfYR+PUni50##f8#^=DFhseNKfdhaM@MTUtu5*8Q+JY5pSKY5KQub#2FV>0&KO zFIq^%aNL)2rQOq|C+21{;K?+symV0{-?e8yx>8v8%Y_hiPon@~2Br&9B55`QH3a zdQyI)Wk30z^pyNsOsf2%GB-Ube_5$ zN|!GA-MoxWdT7-0)1^!Pvb+dGZDFzV_TbnjUAp9F$cU&A@4oqH`RURnzxZ+KBE~fL zMM>vRmoEA9)#PDbr0}{$g$wg}Z7}vvm!8O9wji(EbpNFM{nJbGmY6aWt+ISUk(t@) z{-nz(C|X=p;Knntce-?CkA*6*_j|8m6qA6TlrH&;7GA@M3N3HpLft@4`}9wj{EG{T z@ns82E96yD{nPo=rMvkfh4Ts{m`|BR=byVMLPtxqg4k8^`=zJE>B_0O=JnXvHxpgt zI`a|lJV)8l%u`a+#h;ZfP8c-$rArq%T5s>n*IS?DbXD#mrZUVu6C;Ib?=pQ&8R zz@qb~OPBnjr)gAozPhNaKxRu3&y>k|>2>{@`Bh<&tPDtpD`Bz1c@35NtM_Fy1N7Kq zJ_5^4J4m_Cv)EmJdq-)f|M;bw_dR)ucI8NY68Sx(6#sMl(eXR)v!k_BetCYLabRsn z@3WLA&y{MYOC|5_<-AjCX%2sWK{+}Vsr3})U!G^-pI1~Y(_f}uEMAmGVAkdMrHlVE zahX>%e-Z5?&7%8>U;11Y8dBR=^hlRZn;OZ5GPIeB%&T0SS6rk#LPl$yMd>N}Yu`_P zKh*7SA|?9ic_s0npm1K^qGGj}BYsd+Ub(m^BJXull&*)@{>7yz@9?+;Q(t+{>bF*t zkV8MkuKHQ~R}qmdugvj3X%p`=^@9VQON2-M>2^q$F7;M%EQvwqPnYiI&nuo^%39R| zRfZ>jO1k7%L74uf*W$E3lJ1zpyB;R>OP4PBRXtVs)a7}fRXLt%xc5EKJ3V*OCI7r) z1_w3k)AGE}LYIDReAlck>3n|a;wT3) z1;)SJ`AsqX&D+k-e9n{Z)W_jb*^$Fbc3wn<7wHf}O|*}sum;MQl}H!8)1`}iXFgG0 zR;b=u9KTDKF8Qxz5rJ8c$1~XWYIE#mc%7u30)cq(=*OOr17&03=@9Wegs_K^JP z(j~vMwwPeh_DGj5`L!P<+PVCOh4~92r3;Hb=F~{@r%M<91$mKzbnELZbnzy}qK3P0 z?li6TYwx;<)W`d*{m@BCil1rMnM4m0Mx~DyRv&o3=rRH8;=t&jIv)vHkY8;b<4hwFT0{nDkTbd}0^ix#q; zQM%BXxVbZ$LdoGSKVTpAea0m_A8J@rP3S9+K?}q|iPgjO+NY96XH1wniYZ^N1gh`7r%0wyo%!JZ4H}w$pT|M+fH$hIV zr|6mX13{YlI-N4%l=w9m3=PNejIx ze6GLx_)!|VtB^}mGfFi(ciPFFM71p<^v_+S@jvm4>Hk{ z?8K*oeCAX#@htMJx4Haj=t=x#Qe&AZrr6h$?#j}PDGP$0{vvdFVWDqdYwYdvsuvUY zr9#;uDITPuC+Vr^rSs;Is5?Z8zG>)5{O-bkNT;ycgYV zSM~9X6(4PfMV^7zzn*%*D?L52aOKjI{6rQzXtAOKXTF-^2cEd1rU&ydtdf+{9`84w zcl9r=9A{xHr9Iq58B+~oSJ!Td@)un1SqI5PPtc^Fc^7`9jFj^GE!d>kDKAo{Ul3F5 z;z@VQOKJe0`M8_;eb8AVtjH4u)95Yz!26Qq&UI7j=gni{jjMv{Sk8-73ZMJJBn83I z@BL>{)6GrIw>8=G%nnwk{RZ%Zd!(&Fz)(QWtDOy;1B?Jh0&;F`3@{cL4@?9m1G&I- zfcx#ND}Xrw=fSPHfD9fo8I^4Y@?v)#AR$iP13w1b1XKYvfb5}c02%@QR*gDy)B%_%L7t7XcRomjIK1%YbRX<-jc9O5iFW4=4cU1J?j0Kp9XDECy}>mI9T) zGN2Bq2W|$MfLnle;5Oisz^8yN;9lS}z-NIqz=Oa;z{9`>;0a(eum#u(d|^e4q%J z2NVOPfcz2qMZgl^M&RQ>HBbwz06qb%1U{3^zFu$}a4T>-unORBiCFglp9by+9ss@o zM1l3dqrl_9CLjhp1^g5646q&eD)2AB*MObCH-T>h-2Y(h0sa;E0r2m@K0x$%75p>c z7r;T_SHPRVuYtFLKLGy+_#1;7|! zEHECJ2uucYf$6|UfGdDGz}0~06+mEvzz6;@ePAwqv=CSTTnj7&t^+E7>w%8}Hvv^Z z4X_+&02+a2pcUucmv>G6N|qsX8ji6?{r!307rp81Ahhj zfD=F*2oax70R{p?fHQ!zfZ@P-!1=(30UNjoxEQzum;_t~Oam?lW&u|MR{?oI0Wcr9 z1}Fi_fO23la09Rus05Y)bwE9EGtdOw0<;6S0iOgu1#|)T0s{%vGJlifq!Y%qUBWRo zbw;0KLv@{XH63y^jLQK$C$~5g*jOirHESE%;lNV z@HF5IK<0(Bfhz%-!^t{d6;KQO5%?1zbD?9vUjUhNeHM_p-l+&IR96_t5p>St*y=!8 zTXW6Lb)18B598_t&ihrj)jKDWoO!Ez@~V#GQ;FkpR;ja(HLpm0XP#eLS}^y9LQC%g z#6R`C*J|MW7OGh4Dh2Ru)f^XXT4A+zG*vF=>}Xqkom9nY=k!(E%7%7Dh))$UobhWsIoIiNY2&ak#X3MHA;Jxx&CX z1}BZ71)^_KDovDdK7FXOrBz=gp>$82uak3Z?ulUMY_(NTU1JwD)z-;7fc%Sl{>gKK zzpakrp8AlZ&GF%CZ5ocKN)xs@LgqH&ZDPi}8t!3eqw$-YBw(PXb^SW#^+Z*0EJISuGJ-|6Ple#S9$I&*DZV>O3!TdP;fQFV35 zEQt|$8|W4=;*=SC3LY44ivX_EOTl^E^m8Lnsbu2rCB$HJ)xGvlcI>Y z!%FObNSwVY;c?r5#4<2-7OUCn(UT)X0&L8iv$sPDM?dU$;PgPacJ)N;*9LzA{N zcd0GI!E>KCKd&_NTN#seDlbp{ZEJa?T-bxmCucXz7Dry;$!K<&g95N+@q?D7A zFCi>LK69+Q-svEIN*Eu zo?@4nW5znjc=T_pYt(nbxW(zx9DQ0iA>Y_o*C>%zf>dg~cKgr92(2D#(bc zPMh~5a=5&vTJBX4E$|=agQG8Mhiy0KB886TwXk80~!Nt(zXWCo;#ddzb#Q0P>bS5?-uFVi;>G`G4% zh}zgs-D1@Qo6M!;nyfbY&216t_w6f}H8*k#3im(U>`p+`brQ^hmn%15Xi5k%&Fkq; zJGY#qW^m|C7ZOa= zFK2l^+a&a=cQU)KT1H6izje#1YnP)FFQH9b zMS>yp%U9j*6SNUXpMZL6Qb2@An*0;><+pr8OU>tfo(6p$ zAm7lu>HkQ-wH3uY>rG)I1G-HKE)Ne-3u zX66vGIFcg5Bq#Ej#*tJp5nEIYImtV3Z6ySNYbL`K|-w5_^8^y2MCrxHg8<~8x zQ~G>PTd91~Ug@%V+D!6EyQRtIww=>%Y4RksowQq;JZ{_3ZfVGgwsVR2I_{l#5tas> zV!ORVMy3@k!029S+S_GzZET{1r(IL!ioJOS@{{fQi;ryQt;W{thjOW%8c6B#YH8ZN z<(E0{tqrv}mV57+naazc??yFqvzJ^A%%okeoir<4?wVF&bu00U_G2-?`M)%$HAVfG z^pyKlgL&gW=Dd-sZCfOo=0ewEP$3E9s_k*hWWF(O!R&D*v&WU&<2Y63Er$s{Yl+-|-oUa> zTYGCqO*;!1qNb!&GS`=Xa;-CNN~(M?pjK){D3M)#VeF7ZonJ3pxp#8A8Ykvwyf(%BmBKC-QN3LOU}^?sdFm%wT8Sn{AID*EW7I*Z8U%SIr~!NRgB8O2HAhD|ux@ z(-isTuD>SqlyxRnQPc|mBra}eeFM*M7X16?labfWX@qox_hs9qI{|MB6SO=czsQEV@(IEX3j;btKfd)y# zuzcL1-(}KQnT)CWi2|1hzn^`VH_Gk;=h}AWLF2}qZpx#4Pmxo24b#4@##!FSL@&h- z_N$*?yUZh4HYUvK&a;x`xUPUH>4vq-n|=GR_=*ajZE21K?ysglWR}#$l=0VH+))y z$~*<2s-ygSeMiV#p47wndmKsk?D~EIXl$}4x2Z<^FWbqi^|g6FU8I`lJ?w5zNaFTb zXi#~QSm!QnoNMw`9y3~Pw>Q3=_=#G{kUdU()2O~(?nPEtfiGiuZ-p&ug;(1Z;@y0@mOnuu zxGWz zQh(X}VP-|t0UJ+n1DF$!SKcb=W^&X|zNh!BR zl24&{d4eiKYMMDZ2GV^gk+Z)XZRbP|HBzgFkQu&67VVwQXNi15(Jp3MO$i#OcGG#= zL(QMsY2P}&R?CcDP0^k9tw<2C+mva`?eBEwBWZH}s6V{Ef(>3HI))Q2CW(w6)_Do^??2oAhS0lB~Le#lo?2Ox4lE zA=`9mdfF_nK&BU6Vm3fZFGPn3U&bXMs*aPyqQ0y#^_R^abXW5yk@6)V$sajUburTQ zmP#X0>tiZwGC0Gll6iC8?ao_~_kGp;p%VFn6fN!b(t9dbvURt!vR$nSmMcT3x9X(A zjUAKAOUQC2Y^5^4PGU^9Lo&Z<5?yyUh^g7;7<+>AE~Hr2QgwTK zH5+lX*{$UKnkF2H{Jc{6=GV03{H>}b)63U1u|?L%0atDv%D!{<9*>xHGQOMNOThcU zo#3~@+rTHlZ-aAq2^ew3$@mQLDDVRC(%C2D_25}oo{ZlQUI5+*ZU^rGulnf8_yO=? z@Nw|itB`XB`@g}t;IUVqjF*9}@X2@!xD32j((_KnyTM)Hec)~2x4}EWC&0VGIc&H- zF&8=D1Nq1S9|yO9a|+N0Tvkf?;I(Cx4{p5fWPC&p`{iq>2Y7Go$#?}gyY6JX9lQ#> z9=u~Y`h#;-V8hgyboLf zJ_c?Cul+3LgNJ{P^1(a6d%<%aI2k_zE?aXlK9rAt8^M#nd%?xv;?Khm-U?nL&tHHa zTm{|(?gAeM?*(U{L%Te9GCmeu04@M;1lNK`tUVcD4Q>H%1s?(L0T)E!2ls%p&n4eO z@PpTb3&2Ofwcz@7@Pm(nw}Mx%haY?pd>FjsVffF(Zs4)tNsqt}UJb4VTaUsIUIN|< z-Vfdbp0oje@HTMv2=YA!KX?ha0Nf3(1rK~2esC3dD|jb(4>;!u_`&ty><>{7@L2GO zjqrnG;9Bs8P4I(THp34-_C@%?OJneZ4}-JMr<^VDgLi`qz_Xr&AG{X48f-rWKX?y# z54d70{NTgjYz~^XKMg_k(M}OP_}yd>FhHY<~@Y@J8@q@Yt`z&mZdD1|AC@ z`U3pm)!F3{oAG`)!AkW`~AG{R28f@)`AG`#- z2Ydp27+mo!_{Y!>z+=HZSt-tQ7m!Eb~2fj8_S4uFq>b1uZ5 z-y;rykAus=+rCd609*e``~!D`yTJorh9A5gd=#AhZ}4A4esC_>`T_jlt>6~$3GiBQ z?1%7!kAwGtH|~WWd<>j37JdF5e(+In8TiDH;0G`HG5qoj?gm%vgCBexd=y;v6Zpp= z2b>Eoeg%H;QE&@*!K?6t_kz2@75m`_9|j)Ucpo_Y3;4l1e+fSatoObKKX~;)_`xT@E#R`(;RhcBcY}-HfFHaSd=zZ|3Vt@E zbb@oi$G~OamwVv{uRa7n_yo8cT=pjX;BN3yNeAb!cvk!t{NN4XGVt)j@Piw{Yr)p9 z;RoLj-UmJoJ_@e?4g3@F6L2oL_P6kZUk0~>bKgE0-vC|(-U;6SJH{{Y*55OJfk*v; zapzL(2%ZBTapYutDYyl^3OxKB{13bpyc;~@|D22;1Y7^XxCPz|9yJNRqws^X{|G;L zDR>ol8+apl?4RHVw}TIYd%!2all~0OhV2%hj4_`%!32f?|2 zg&({cJZcJd1kVAl`WyV%kkr1N-0ycY_atv;Pi1_eczh{%A9xjbR(3od1Fr`6fcJoV!R>?M@!V# zA9&!|@Pn(sIWwr=F!;es!DZkB;1+Orcs#xyya&7kyyTpCd_VXI_!#*9bK~*hmt$}6 z4DizP;_(XbesDW@(g^s$_k(wUbI*q#yas#>JYy96AECd1XMk6OE5IAU?cn|3_2Aft z;Rmm}ARa#e-aR@VKMvkt$KxYr;`d|Y@mb&*6XWq(a5s20c-y7%_*QW36xs{C9()kI z7kmOdb}H>Pi+((f_5$b3qP@TeucE!cORlE9!7=b|@WwFw;5m8lgS)|_t{~sscsvZ= zkROj%f!hn>@hX z3;5*{`~|#vA^rm1Ru+%TLBjUy;&B^X7NLCbo<)=k-nSS&@Twcg4<2|E`R2g?aq@v% zmf;uReYNNXwwI$9ctL$Up8Zk!%O_|LaL>)?13s{ldVohX$KyM}$G```t8bwlz^mG* z$5r@uJM{opb-)MCxs`f=H-a~Sb8mwmyaapz+yy=k-T@wQHRB<87I;)A{NOThCwM1# z19B8!tq%8rqI{f^$fkt4TlP~WKdsFu20dv=d7QFHLt7kw`<*o%E^pr7* z=dHkA(!yE%FnpnfZ@ex{Lf-=%nM5oCL+=i4x_I-r4ow$b4g=dJGd2jFe^Qs@z*f?v zPVnRuAudfZ^>(q-F=>gnHP z%C2uCZ)Xeh7f*S0raYUpfu}J3-NJjlrXM{sZ_~-F&F^Nl=x(oMOd`)g@>FETTSH=nlLLtg{^IP@+L|HnP_?a-IBF?aRQ8x7qiZ7=kr z(2Y&k61(on+I)A`5>FkDl4n-?$@mhFj0#T~Ij7=Z(4`HWcDv3)&xO7*1HBCT%g~ko zn0CF%!`}jZY=?jOYoRZNKFgz@85>^ZJqWN`rFV? zKwqu-l)qJa^cr{?K7Olz+f0Do3*E167eHTd8|z5AkF;z$WAo{ud|iN)Uk`mwr@vkA zhh7goSL>%@+ch5jwn6WN-sREX>l-gaKLFjYUEhYDbNk8oHV=QjkuP=~NTA*TU4GN< zIr+w}HtFk0w{?0_%$0hD4c*UQs-XA4@26K6^y3-i#|+(%zXy8mC;k1c7y26Le*ALr z*q#jhHgx+AfBrD^CD2!C`zXKi`g;}h9U1t$pdZP=AA`PNm4Ep?(7T}fmEQ~fAoTk^ z`gvoLHJI`HQ>>3_y6QJI9>0^1&^w{~*)I(JD0IK_tDqO(>CfKk3k=Lw}1IP&vZ}*^wm0Umu(unc~Hm<45Q$&p-=dXJJ(nJ+nMVNJq*1Cx}Sbk z&<{X2F?zaL$Cj=E59GT3i^Qry7Nw;pdW_r*S=xs#cMLuANuYL^e*U=KA)lf(C^Pc?}2_8x}SY| zp^y54+rFxP-u9K3wHS0iejECM4E$l}OCR*-uY$fFy78}m<#$1s?^}N5$Do%%_v7z@ zzCQzhFZ7{N|9O{n7XAT!f$smxKSO1@1E~HFz3QP1?GOFs4D>4Kx$FG-yP$8#K#xJU z*8B7KK(Eh0?}ffE16?j#o%Jy5Jl^`3cpP@_JAFi9zpy-l^%zf4uLrJtBXDzyI_?FN5yKZw+HjBLlw;y*C4Y82YTo{L8O` z-U8jvK3&icWT3~OhadOXzX$pT=zjgD7y3Tve*H&Y@GGA1=eMD+f$qm2hMu$0pT7$F z0_cAB?}9GhdHwW{K|cUp?gZt%M88+Pl_zKazoe4fK|O^5@?UeH(N? zU)&3Q(wF@Ck3g@5?#Dm$Jk|*^@K1tnZ}aCbhQ1ZLZ~dVk%)q|}det-j{M(^#fNs_X zwa@CMLA3_57y9aF-Su1LpU(QNjAcil_dxfp{|MeCzU*KABKq~U&~kTs^0H6d!d)@n9!O5 z{n)qJd!x%xe%NaK%qFb@`qmd+KXY}s(W65rd5)9E&lVe?=k}zxh3K#o`VQ!R{0E>P z$-sXcddo}xv2es_=8hTYv!IuK$NgTU#@bsveQgQ!6B+28(6@cpzYR7(-w*wWwy~0b zyGQ;`=&?N+>JR+@biXz}4n6yO{(Wf#4Os=<^i@^9x3A8Ez81Ql{3XzLLvQrx?|k2r z_UnW`@caJyZ-5?#zRJVz?dvs zXP_^EKIvuuSlS7_3c8M|WGwiB`@Klfo$p1`ezTzOh3+@jE`e_S(BFQY&}*Ul>9+y;M(Don4_)?O z`tcutp1aqd|2XtD(Ea#FT!eix@Xvy7|GU5ZCD2zv_mkfVeMbiV4bXFb1LmSo-GM|#8~XV&%gXx(Dy?(W1aFp?^w75 z`q-cN^LIjD3f-@LH$dN+fqy6TqdxpL`X7KU`)4zagD1$dmOOqjY}7bn81yjmu%VjI zm~BUv@XUdJ5PEmEqW7GYw`oIY^P_rS$s?il4~HIJA9`e6=+TEl8=|4d)`lK`F!aP1 zLIXx+_1~l*HeZ9hIX`!8qT0+G^R`2mJ-qvLoAqRE8nOAjkREx3e=qa}zi{UVs!hCW zX-A;1fi8cy$63D!nV>HGLocSjzw~djNzji$_iM9a=w+|@$Am`ctD$#NmQ%hrCa-~h z5V~KV*$#d9LH{|yUg#U3`|%%vzApp+(DBS&Uiasp1bq$ktsecoYw5+%bKdahZ-l-8 zx*z`<=zBBpZ-<`!tMvA_(P=OAD(IPfUiN8kCC_S49lYKhHky-??d~bFM;mo14p5+g}&5NfA1Pe&L!9p z`ZjOeGy~r#cyggv9QNlggT5BJAAbw<5x?P_lrCTG&nocD>()Zgfj-NlpR@l(%I}6g zAp`$D=ynGFqtItT-|La@%v){JWdHnO=m$M?v&B$S)H>4)@@)KVhW&5Qcfak*NZS7< zb&$RIoxj5e2k_vm>HbO^L7I0x^n*vR(W#2QHni!&&13S{+3QC?e8GUbv)*|9r-{9I zJ>-4)Pp-eH810Rjz0k-0IsNzH;fS{`Wu6XwcSx0$8~Vx_s*WQ_kNwr%kE3F#cR$W7 z=-tpwJ1IZ+w$l>mFGH7okknC+zv~m@ZzpuCkNv0KSX`8#Z-74Z?;*0(6`5FM{T3-tWD=`K4-vlF8u)XC8x3v8+IqwdhK!?`VQy|G+p_j`Rt|ZKZ!Pg zenQh#{XV7DQ}kKTcb>*RX-!x5@y;KYK%X^`edwC5+T}*WZ>(3o&v)wdzec-^(uqD7P?sjQ!+x%AP0}gXeZBM z&L;TPYd!SrGt$>f_;*0>fo{fe?OSFX9}9gy^rM_**r4sEzL~IZGH>0`5X+UXvcp^J zA!kOaIMdLh^K}i_l)L$|P?M^Slrw4y|KTjdZV*1yGhoxK%`?q{lF;Ws-w1uI_VJ_a zS6;ZeB=i}1%@_Jo=rPVZ?A82APbbz0eHHX#&ORLU(4AN_hqR5*2cCxy={RvTYtsdr zKdd%@j#@wR;qxE)(4!+ZocGwdkDv3z@X$}+c-`HnD-{&^2jQQ?SqZaVZstpR!Cd5@ zfIeYlJicA)ulG|c`4_Jr_wd+9E_(FB4Pzd&A0Pe11)-->U%^UH@q>!YEE*M=T>F!bmbLK{9GdTdST@drXrd@dCFL;vZe zvd0nR9T>+M3tit>)~4Z`hlL(d?QK)u&|Jo*39etoa`HB<4sE_S6uM3?+|X^TT=EoL z5|7K@HpD0Pk>_)v&7T#W^48rS3f*)1==|5;(EUa7SCN0trSW*9PyThD{5JX5lD~6u zqRrg>_hGGr*nJ0isyKr(Ld(>#PuYF=`e6^B{m5C5=4?3gu`?b&{fVKWJJZX;N)q}^sfAI_PVwYuF@?312#1~j2pKwmwbvl*JMW5B8ey&d|} z%iVsZ;+l7zc0Kgt&?k8LIVIu9-vQm4$=MSS`YC?zcgX$F*Fs<8p;v2mrQb2=C!nwQ z(7kI1!>6$}##tU2i;=I!22;G^p8>ry1HA%z7xWn(`PX{NZ->4<1ARU8Z5il0pzqE= z-w%Bs^md5SRk-KV1d8_fdv8!1QrM^ z5Lh6vKwyEu0)Yhr3j`JjED%^Aus~pezyg5<0t*Bd2rLj-Ah1ASfxrTR1p*5M76>d5 zSRk-KV1d8_fdv8!1QrM^5Lh6vKwyEu0)Yhr3j`JjED%^Aus~pezyg5<0t*Bd2rLj- zAh1ASfxrTR1p*5M76>d5SRk-KV1d8_fdv8!1QrM^5Lh6vKwyEu0)Yhr3j`JjED%^A zus~pezyg5<0t*Bd2rLj-Ah1ASfxrTR1p*5M76>d5SRk-KV1d8_fdv8!1QrM^5Lh6v zKwyEu0)Yhr3j`JjED%^Aus~pezyg5<0t*Bd2rLj-Ah1ASfxrTR1p*5M76>d5SRk-K zV1d8_fdv8!1QrM^5Lh6vKwyEu0)Yhr3j`JjED%^Aus~pezyg5<0t*Bd2rLj-Ah1AS zfxrTR1p*5M76>d5SRk-KV1d8_fdv8!1QrM^5Lh6vKwyEu0)Yhr3j`JjED%^Aus~pe zzyg5<0t*Bd2rLj-Ah5vyFD%eCGOYA0GdRm=T@lhhoac|5=b?sfof}raPB+i7wmkLg zL+1JAck|V+k>+`z!RH&i&(KGu(6h~RXDF)${CGRA^)+nP0wZ|1p`T{(c?R!1Gpv3&=@ZPeQ_r;~-ynmX z@=wNfeU6`@`QzreQ<~p0N`6`MTSv)HYks@thvo0r{Mab@CCy(s3jd5!m&+vk66tKqy!mYl+SYrSc`dC=%IQq1B~j>~P2e@Jc!gxnYneZH{(`xS z<}dQM`f9vL>?9G;&I@Clz1UCWOH+OsJpYmuSw$}llG9t!}cC#a}9tR7vXH4 z69NjOsQC@}AK4kD3Fz8NW|jLUT1W+3fsg+jie5~FblrsiRgwA+q8qBBb-$rUbzKG& zRrPhf^oZ1c7+}r2k&awB?Ghr7);x+w%_F!)T4!8A>9-;zj=W+@2I&daHR){0)x4jw zUpbX@UR7VShaQpoj}fo8gE)HO(=)7a{B)eSEqReu<)s()2I{_}Wo_5VU|zm~V^`njl~`Zw}c?UBbgQ}+LchDmeos1GyO?B&#SMwe~H8Z%KjlTrmRQpg4cZ(`b(QpUwT}X^sfW$Z#Auvin-G@n@yO4^|ExM1e=L!25 zVRVZgBCL+Ee;|x*(Lus4C+sVP(JlHEZjJv6tf}sImy!(sj>_tOuTpJAM&0uhK7&WJ zwnQ&~n6eL#>e^3&w(iBr3t$-auKEYWk8aUfz$ZP7+l;!}Nd3EzsQ(U;)<=Y8eGRDU z8Y058em~VVCNiG-rn>%FqHK&@FrB#8pQ606lGp62+mIQdTXZ*(4N!^q5k|M@eS|$p z*e3|1TaXzoOI>N_~=2mr&{-Db-4;Cn+_bQl!@CVoH%ZqRT0DFQwK|>TfCaW=j1NrBamo z7NxS3`Zr1qQ0fnqdM8pf({Zc2gw46JjC6I~rPM*SPlBRu=7c>+gX&JAdh4XWL3(mi z-P1Kc#rxPtar@yIPVRtw&o=&^&`;v_qs9g(-8Fm=Hv-w{Cb$MFPdWTv=NhP^sC)Rm z$~FE7l{VFVpX{J^0$A3aZukOX+4j1Q}y%>v6AN-uM6>O|F_4@kpU}6{_Jq zDD;J)_o*kqynaO$F|KZ?>W;>ckL!B;C$H8;60lbzrO@>a{Evcb=*Pr?)sh3Np1~4`1FLyxI^?V) z2UhcN%}>D8)zN^dd1TBb)ByNZK=pr#TN~aRmLdTMMqreH8g^jqNJZ!tT|yW;u+@ao zE&2w+*nw>(jBe4J31bIFelo(&@@+_o1FQYr<4D($1FQYLN<|K=_W22K#3Ncq4y^VM zQ?AFOx{e%J?TeF7;sp+jdN4w_=+|+Zzz(by4y+YaW5|KQe{nmqb_)_ zPvKELhWrMc7ny(k7;;|lU6cdgb&}ZAEjk-SHSD{tMJhtKXa`~JyZ($YxROO#4cssSyJ3{Z-uzsMd+T}-L{l)4J3 zTJl}BmrNqHi0`Vslr&jKzN>cTgn39KLB6Z@t&{FYx~Zx5>6*LnuD*+tB;T`*A0bqH z*8^0p{vO;2WP6+7>Zv^C@Oz!Br&_6Z_}zS0?f1z9>d1H1o^D7Y4Nf%v&KPB#n>d4A zK_on?Blo$vpd=SiKm#JTgUMI`e*n2Jn!2FIx%rjYugYDjWj;V0E@AOTCX`ZL`XRek;tma5tJD-6P)G% zX`CFX8sFH++-BBO)>tkyv(DI$YX!F%ARRw30=XNjF1_f|rfC>bDi>nUrpXazfqIC; zM3s-LMetCmLh~n26LQE;kzzdY6(o9|GYvb-nW3-u66%;7yr@3J| zk(llvqw4NY(y!^SHmK;ju%hctoeieWF`~TM*HlzKs)B1P3La_(455y6JAO#F6T;eS z3Tkg+o4aAUnZs4ni9@XUR@y&ji`y_QWN#sBo9LRR`Dxr6QL+XOlm<+7B=U#xaPzo` zAO1x+_Hm9(HH!3v=vvC*n`?;L0;B4+k;`XZj(=CpymIE1m$%N0Mo_i@Qeu5Go+Gm6 zO}+$jbNIg<|KEoHAHn|z@Sm$2!>bgUaUzRwi<0k*(rjP#CQ7AntM13GhUp4O)y_v* zs`Zt4j#w**lzWuikmK7eNKmORJVz{r@#|ay|4CMplVz;qkb!S3D9cz8uZqO0#+=g- zHRn?`Ei#!EbSqf>cXZEz7T>_l+!1s?bLPy;m?2k;{f)TbNe;h+rmu%YU=> z51=6tzM&dhxK_O~GRvyA#cS0(#oF5D6n7L;UcNXdktihl7A>4pEF}u1wk|g(l_(|V z-0WqyrnAL4+jE7j#e5>^&B3<9?2>IO%#mG$ImJS9PH!f?B{?TqEIZnH=;&&h-?ngW z+gulCj;@$XZcU_8g?PG{^Sxvfg}lq;vb`;Qqh)D4UdCg={CLR~)7eGwo=k3gI@{wb zRn98WyhTLRmn)Q7sN_%``2i_gOy=@lJe{Jqcu%4~o!Q}*WqKAZjK48gNV#lZsvv}U z@BmY)uk27`qU6?hEqi@@X;*yt>W&rhwKvAsFYD^=Sl=DLacz9v`en=3tm}?1S=BvM zX|~7=O7rHox0JKRbZ^#6`I=@BONurwijz9#Ez+j6qa`m>W7nz`YdcnRg{0o4^X7$j zZCYmcXVRro#+&VBQ|Uw&?};tx>ofU93tMLQw#>e9e#`7)DRq5swv58Fd+=<(Zgx7G zNoPI0_Irh1Z+0S+nT`EobXm4k1X{?I!7SSgUZp;~XLI0@NN$~-FXT#IvXmg=`Kl>sBqpy_6}=?$4#X%=PJPx|B|2W_tr((q*wnE$T_-%3Cs?D<-su zpoxmIuzSTl6u;FgDIFaKH02eOgtAK2YNWH-f=JQCo=jTJrBXq_Zc-T+ zUjpNHuogB}pG|qWENUw4$a^o>Pit1KSl`jTENB@6^RHn8WFsR>WP!-q#LR(E7TL1t zV5o(##EP{nnC}Wj@0NJ7h*6Q~EylN`eYx!*M3=`)iQb{&>8u+3TDEl^g+uuX5{~re z;;U}NSVeEg%SBjjJe7$Tyi6{cD0wu7OX*}hpZ0ik|35Upm$S4Ht#cIf8^QG@3#BwX zUlM~LzTHb~jrU~T$Yk07GY2`GsbePzuIRtn_|V2{OH$SOTroW`2c2A`H+y=S9=}}W zENI}yx6Q#&E)S7oT$kqHKRy3@?tBaF5YN^b0peu6+01%2e8wD12PJ68CX8@4&jRIQ z0d&bsIpv8^j>b)~tq<*lftBEPO4*?|^7r(Lh7qVXs!6YeM4Gb6^f{d_K|NxUv)M%P zYMoaAr!IGuPMvtTI-7{6)Y;tIRAdN;aeB_|6arQlkAYNPfzC;kOb0dAvpbFuWeLo>c-{9uXFL25r>h)-=3k72 zPjdEs6@Q^BH`&?uRD$>vH`4bes@w(cG5sD%kbbJO@0SGeX|6fi>4!L7<(l1K-AFjC z4u)S<&c0O>%&X#6Y!IWjD*kk3B%Ew~_*LaD84d!G<@4~YD%Ua$M9Ar?-7jAXXV4lQ zLHscL$FdruWe9H}GF+sAk@(Ey+~M{!OYtKY#yDj+sdu8A6|x7~L>P&`&=0q_Ye%6s zd2Fc=uD3l@@A5yw$9$9VS%X9rJ9&mr(G00~__z~%_&9p=%hucI%+XoB#>d>A;fa^! zGtNB|(tif@B!3vsD&BNa45^_@^gqqDgvQG|Ktg=%`)gL>UL+zIM<;b0MKnYB3?J7Y zXZqpzSAY|L`<|S#;k_m7kPP!1-(fz(ajAErTNmng!H48D{`^7NsN-dV8`Mp3qnCae z=XQnkMw@9Qzu_@eM2q6bXT+EVZIaSu@;nprKPLa-ko@z&=jF!B$$<`GtoNDx9Oq`u ziUn|!)9|pIsVjs&DCacS8nTCFkSF4%xw(q(#5-Lk|G+PU@^mBr<>cQO`rge<<~Gh9 zofqSj-AsPN!}6b>FZ4nA(eI5xKQD4lbBC)&!Y8`euY&St|A_npUkcKj{HI+IH~9?@ z%RehB^kMmrUOJMTkbe~WiA`T(D&yy_$jj^h@YjNJ&g4?#+~BMrZt@!*mfu||^kMlQ zn>CXB6Wzg!f^zPOyu6$zpA5<~Q{~LOB8Z!uhKJ=m^h%)*$~n>PoDr1g{gIcKr~L=P zdS|LUv2{V*@Ua>37!>l>b0vWcf|bqi+t%Y2){qnL$1Y zv}^S7JJDq>3(|iY^+pf}hH+BQNPLbm{qT72i@@nq&v2YcAL2(why!O5`3Q0Ezk_}v z=BeX4j;fgspIZQ*1ixK5i!#zb;9Jtg?vvp6+e;^{658>QoQ-of}5N_R=oaT5I=AHbAnU+M;CpqV3H&Q_Zg$$ zZH%M8UWze&yOwHKeD@axH+fbmzV~^-H!1z=6;J(r5T`FAke)YwF35+zbuf~g?^gQK zuY>ga6mNNJ5Pwkd+y5nqe_rv_KMCILZd`7?E)?a5CS0dkozR*DJ z%A6AVU79yd@yFgM_G$cIrTE5eLcdq(uVq|ce2-O1zc?-QrvIB1Kk=`E@7FS06+iu9 z!A<_%qwxO_a2mg7CUr80qxHgQKkybw2JXk05A5Vk(k_#~aU#(VUk{#8`qZN_=Ce+@ zonbt{nqPje^e;3C|8^y*!N(q?=K*c6>0zqk3vY=rrQug7zWQB)&r&`&Fs?7Y2YnNd z_*XwD^u}k4;ycxEn19#-ya{>>uXFEI`oZrAp8>7o{ff7*kap46x#&8e_>uR-_}%LL zg5o<1LHtR@yNf~moZ^Ez?hY_F#Ll(SuEjd8pHO^?;$u$;pSu;mT=Aw)32yQ%P`s27 zJcjW=*Am6uJu!Y?&3ET+RJ{JZf}1>B74O_Gxao77;=5`^Kh1cj>rTcc?Z1BrIN9ys zMV$<**}6l@C;z<|;|I0SF~!fSf3|wRthlR^dUt8NzG?U)!pHRUtm3!MNU=P3PeUWhT>LA9S(E50ryPnY87o)6OB zGz$N$($~LT=+AR4&TRwE^Sj1N)r#M)^qbx(^nHrISMeh+3f`{x2b9kH3z^4}|80pECV4cSP4CR__Z+f9`yY%Wvd6zF`AH zB0sSCD(M&VS63+hgw96?l)hc@v)h7vmMWh5aS-32cypiNN0rabif=qC_zCUbH;fTK zb21dKzEkOMe^ThpKJQWd%u&I2EB}uxzW7$bt-X&Ze)bE34=DZPz?Yz|6eJ7s73H+v`nNy^t|VC!8a*BLGig?5xh_F7R3j3-f30*)rwzzv(VeP zUaR<13k2`hLD-}Csjmrc{a6If{zT*ddgcFar60IZ?BNNFbGrUY@iQuq`GE%%k6jsK zx)#1WcSP|Sp>et&TazRChbKW#aqkh8$L#i7j5oW}p>cFZ@xjnI{khgVuuw`pQ{yrOvhu3@_8-c(c$}Yol1Y-3E^+^&IaH#Z-(tTq4a0x zik!3_pldthlJ?*K0yy>8>5zWzRX%+>e;w9B2Ngf@s~98Ju7^h9|G3hp{0WPSXFej|y(%ZWiNOneTCp((k`m=$kZenc^#d zFSyx%!s!1}aPtrSqws$_aMI^vA${JXe9oK>@;{*X$*ZNm_C-XX2NmD_ZlO0le?{@Z z-wD1~$lX(l$DR|sPw}5Jt}njFOGtCiqi|->-N^ z<*{-4_lkFZNazQY{&B^RzhCg(il0(^<8Hx?&wl`?em@wBqhOkBpU3YPdh5pq#+9k> zaiP+${70eRta-CXq3=}s^IL^}m(s6ReDyy^H&_|@&fe!NTZxnC0c zV@m(mig%XLi5G1mHyn9g+4Fju3O-g@cuh5%4^eTQ@{o7vUf2-nWKPdEO zCwD2n`AWf?mHuOj&sD!|dj729M?!w@i;6dCKf?U@`ZjR(KWc}nX7^*JS0dlzIpvdi zI>xB=W8DO?+x!h;5A;1+x~3|A_9roZm%DSb8D}VPyFuyKc|!Sw=B`%!^j8GmsQfo5 z-uE5FmHy9xbGt(OV_TGdaHhz)Qt3;IAAX(S8J!2;u6Ro0x?M_tkK+5^AoQ&&&&Pq& zd~_(}&mUC!O*-!GQ$7zV-u#y_M$AsWtoZSF2J!D2pFzRRPR=OauKZ^?xt>>iwXPFa zs+=`V(qDbw5I&~osfy>@q+Nqb->Uf4p?PGk;-_CD^zx@G&aG6uUOz85rSiO4@gqm1 z-UEtnRs4{yN3319D!%vILT~uH6<-|kxA!W3>Q13I`#fm$dxH4Gif8T<-1Pq>aJC*}3cCzbx}i$ZVX@ma=|$oDuu3f_Qy8;bM8pW{yjPVq_efbci@+Z1<)1vfo(D8BOh zLHai;UQ&NDpfYV$d~kb^&$|?F9w+^HUg_^*Twi>T{Yt<2vq3(eQG8E};4NC_QN>%A z3vToN(~9?fL~v`@8OF7+@9~1tFZ>6gxBhB^ljpeZ$AX*QE@RxsK$9`0pYpdtZ}lD> zCC=4h&(ngd`j`X?-ShGdjxok z8-9IB=~I6v^ftb}4V>gTp?==vInDIL`8=oeF}44lO7f!ef9!VQZ+d(3Lel^6Ytm%# zhxWN%wUS&0ocimje-S>`-g%1W9~S&>rSDMuu*Tt6D}JNmEjNkXZc-sqig&7?H+$F) zd}4I?_W^bp|8r7rxAMP7@#au_U%XV>bu_fU@z+ZKOj`J?Rz43XzWD*ctzQNePklyk z)8{vh{xQMx%I9Z{>x=L4g3=$;abbEJJ4N(-Soc*rwaj$IGb>_@3@Cn;;-^&4^*RsE zSN!13LT_>|H+qd5%|16Pe&1N>7t?=U@!hWy-1cL41E1)Iz9(aLa<9@)`EXFqPcZ#7 zcQ8E9D!o&?vU)$S_~1u`kLmv@#c%Hyc@}DWf28=rF9`inC)aa|pYIWTzv2@v7}@@3 zGCt1jnJM(AlzxulO}7bd`n*B$lbs^ZW|ikg#Sh;Vq|YdRBp1Zrq4=hM7W^qE*Ivb6 z(0z5Q_mJW#T^AevCB={GylMDTiswV);+Kl=d!5wlrfS7_(s*|opR_AHR`E?ogx>gH zqWEf^$IYG>Dn8|;(C<<{OBJ7`>r?CZH#4q8zQ-*}zxWB^b3*fORlNF_f)6Nur{aS< z1ULTs6o2eTf}8xGW?T#V9>>}7q5r`s_&Mcs><-~$`l+3!<6YOACg(-K z$^Y*Utv9b?dY^!rY*#)9?-u^nt__Nxjfs8I=W}$W6?dPE@w?IArg-N5AbyYHeP0&b z^sry?ypAu!A6EQ{$Avz{wK(^v;$y!ixb@d5;MCqDp>@qqmA<+l^roNlir@F5;LXba zCBx8E-^lbz zw=tE)@RNn)i05ALr)&FTu@DCTJYBQ|T8g{a&R%_?*!1Qv5TD*X#VXQSsx7 zALtkQDcasA72my5?1cXIl&+^0-}mttznlJltN5v(1@TGKMW0QF1mDP|oVyY@>F4O> zos3v}7b<=0+k*6~7}vtS$4$&XX>VJ&SG2kQF+i|5o^$V%j^z($`?bnH%hgAPR z0#5bX_w=m2|Dp7Io)SLmRQ~h8NBX?A8u1?MKjcrw11J6bM&k{OZ>KW-(D&1<-Yb>< z=y9ocv(|g9;(LBBxWx%8m`}4i7FyT83gxKYfh&bR)+mg+mCxCef)5DnQi|W65q!Vm zMa9S7CAjJTZpB;G{}}#3#ZPM-)gBQ>pHh6G;mZFDitm{${c^R^f1Pn9@;#nW`mtY( zF>3bn3*$dg_-xevePI+n6E33un&ys%;-#s;NpA}^e%PsXU#@t|=cQg7*9#Osp>e6% z+hWGGu07lQQ=0b{v->v<1TJafwCG<8={ZjG19fDiCqBBU(!>|Ui`{Q;rpBXUrtmFH6}?0bAd>7NPN`9q3lbe(SF?yHLLTP6IR z_RIII-WI_%*PT`TX*8O++C&kEcI`T6`u{9^l(D; zU$6K=rQh@67$as6OBHYWpx`zxHYh%*^Y!h@XS3qn=Y{@0#rqi77vJMnrO$s_=&fDv zQM~l5;N7Z+j{+zEVBf>6R$hOj^jH6d(3|{^DBh>@vhn|_;kO0pzpwaM-Ip*vKUaLe z#_fjJTr%=_q2s5>UmXaIyDLYbZ&&&mKM;9LpUZ($e+_Ep9}Hd#kex{Jw7@Lenj~k`;hQAJv^cKi9W$I%Ij(1B)@$R-1_S$N}u^wkk509 zAI%DG<2Q1t=(F!K!EN5344n2!!rw!;vrqfc^#3!(Pn2U! zXMX;7inksRyhZ2Vh8EH1nWqIeJ{L0XhFz~>e4MLK#5m9T_qB@8Q2%D_U8VThF46ya z9lw9B_~wH#N7rG#JJ;VL@|@D|v9DCTsCZuWY;xYI_(omF8J`a+e*F6}N0-qbY!Ut& z561|`fjRte|JWk<{-4AcFnfDk@s`tq=Q-E8?V)7hP{5SUrKA`mfta#J-4n~fty?s^jTg8w5 zlhE7vs=ZA5>y*a-)?XJXzDw8F#-~;B{JVtD5thoi>loJ;-{W;k?{*6PNzGfY_~PdU zH~wkGZ`XB@;kPNi^XozS_bR^WLBXwEA7flA^F1yeEB@2|4y9W29#TF>7j`g02TsxT zxZ$6T@w@T=p5n*V-KM0?NKgu8a1AjiJBj;uf0Nh?k>hmpj4P)iYnbhrTioE}FWfV6_*kds9VH8+<?ShH#=V4T+xU$#y_3dk{vj^!Yks?h^`Xa+)HSDt5?W+nK&9( zgq*J5>rdu)#8#|cwPb00e%rij9i1kT&AEb?NOg2BU0%rbFHh468(zuux(+7`P$QXN zw%i|2WD}WOZ@ieGjxC}nh~uRkj@IZ&lrtrqosndb;`wraK91u*ws>6D8-QNXu^F$Y z!~mV1Q0hbZzFa1SzQ?&DJ6y&~xi#@@jug#QIB}vB$6?j+bbdYq#ay|N^eWJ{L?(^n zI&kuYSHcMfy+!=Jf1#Ay>Te~GjF$}{UTJAAQ|^~$Z7CN}N!}}@b1AN)klW5rYA@`^ zEA-$*8)+4(DpxMW>7Wwl4Wvtcwxn~_PrjT%Ur0Cfdx;_)s~sf|h zmNXh@CU+1H*^og8Q=!8X&lAl$$2c`HNpUh$F~%V+86O5?I#oYqNA29N#p3E z9XzZ^8Ym~;o9@N&EjXPwpo_sG3zadcz ziEOby4W9xZhhur*p?UC9o|p8l3BalSoJ>sF?c`P9@+>T#usV zJo%>OID$tGZh?15VH_t?adM%s`F%_|OM-Pl@o);HlypChEVyEI?BHzy#acuoG%+rN z;+Zy?DzX#~fkL9t>laW}qjndl619k7ah>dSgEFB?A3*^F00)ER3K*U=c*%dT8R1m4 z4?P(w6pl$*rC6@2s$j8>K0nwC#%wdSD_&&#yyj#x@TDMIzIi zE2K+({Vq|;rTrx0&oHB|!N^C)=`f2IXdoqX1$2WrqmV{=aK>9;YDyPZ4U<;fFg#yq zAkl>G;b5x)xY~Y<-dxfz5(SOflpmpnQryy$rr?5fK>F?2Qe20V&qNJspP5`P&nJDM zH3$Zh881=b1G`8SFxymM_<=8(04faEX7-LV_;8M$-`;)JPCSRg19)|em>V;g4k-i{ zqbcslCi@DxZ2DIAFD^;Fi5AGv!XbGWPQ*s*yL+--M zQVan9SKJz(H<$e6&@`tm&sQ1Kxje;VsXWF<@*vvZtPkPg>pR`I@hfl3J9UHbk7d9_F}o8yu=c$kkr*B%P>UD z1`^4!mdLhJ>E1NW(B_~?57u*R3CSI>01B+x0L{%pFBEr%#kHuKf@z5*5$s}F;-{k; z5PDOP#$f>u{DS8w#-?$yHdk6j!F)fYh116>A*7cQloj{3A)8wf8l9>&e@EgFyIxjP zp`0(R#GIEAorHV`yCJh8urcplS#uOI#joHc<*IDT!%>ZWI5sfcG%})mI`7f>gf7@4 z<`^ori@+8XPQn&HBZ`IKIwTUJ7E#q=2*rZyA>S{y9Df7%`D*gQGJ0&qLN%)3iChysq+*S)S?0>L zMA5xWOn%X6$jJN^@={uu!r>rOS`DhhLl}%f;}?sRM$4E?1`Bdi<8qCyU{kz6mvC_n zmX;luV77ZH3qrU~c5l$ah)XsxzMg`2OWDgNcd%Nm*Cd!Tr`eB~e}MN=!t(jnoCrr9 z4|~kDyh6cFbKilxc6_RKJg1cBBGespslhsoJ|)II+5(wCyYVUi{n$5P~TnFJcWLtc1GVQAH~ zrCj77GuTvKU6OqaU(XH6OA7||@QE!jSicrXasK%V??W*^^-*Q=b{JFXB*nS1Y8WBz z#SA;(=N2#arLkiJ{zZyKZJ~!GJZY&r*J;~P>l0aoVxhx9Ni-TiX{M(2(wku35@(PP z(K*W+PxA%slCW!WYdWuqZ{QVFylZtAD~*k-;PD1nQikV{^Wa#N4?JZLUkvyKDA?wg zRqMESbZy0JS~k@1QhoUPSLC9;8n$!Aoe-SziEgARztY#i<`NumjRcI~y~Lhu_Qol$ zw1)!P&W@!rxllRmJQR3~fqe}LXKr|V0tQiWZsaVtRf=HY;s$Hbp31(q4Z zTEs`?`cces!=goOE<-SXGf2J>Haf5m)5p=y(3(=+2o>--O1Lp@BCJsNs?l28H5(ef zOf;gU`b1_T(rKJse4I8mXn6yUT|m1^IDeZ*0V#B7_N9#mRw1>x5(yz5lLdTbo@4Ff z(As1`gCZk5g>bdnku*% zaq25ffYg2>$IuNeD_94W+190tXlkKUPT&~oq3uVmMvMf*XKB~Exw3SF!-YzD_ke03 zhEE zYDad$8Qqx0(d#{2mA?~+A4$$TMKlVssS0%}jjiZlV9>v#vS*8u^1%Q#-XEOUJ0Bz* z>~hNTtA*YX{y^bkBt1Qua!$TX&q)gjA;@uVe9!UzGM?Q&H2O%1>4=tz&DHrA^pM3T}xbQ-W zKieXqM-d|!z7S!L_yO!i;lth>enbOU#be0^3;n!6Jc|h;q%a9jR;5;DE0JDk@xuFr z_O9cO; z%B?*b<5ar>l<&WY)_>vaRIU#Ht$cShhBt@v==tGVn4(u3M=^*0Obmf~53|5pDqjWN!7hM3}dn`OwWeLY{_oclAR@SD;V`R(^4-ZEZD z_9~^d-`Lrcz7P1Kue|;4#Ca`W`Cc99{PHVX*NX%-)%e-(Q?%mm8R)uO9>er!?Y{;2 zRDOxl+3#2!)$%JA%ADe>_y)e&3_%7gB!n0)OeD{xkINkRVf| zF+i974#;EwDJ=@iYwz}a7-h&*ti1hR$caC({G%vKwqxb(cSTNW`E$~YihWtVW(QwK zSt7CW_WL7`(Qkp`YT^6P&C1*JTgdX4x8Er_qvhvX$0`deXU|ii@^%hNb5tZcXahe~ zUSHj_NDwcR-~LWvuuhO>{9TFvvU&~sHzY`Y^Am2#p;z}` D+Ssex literal 0 HcmV?d00001 diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c new file mode 100644 index 000000000..3faeb53ea --- /dev/null +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#include "slsDetectorFunctionList.h" +#include "arm64.h" +#include "clogger.h" +#include "common.h" +#include "sharedMemory.h" +#include "sls/versionAPI.h" + +#include +#include // usleep +#include // INET_ADDRSTRLEN + + +// Global variable from slsDetectorServer_funcs +extern int debugflag; +extern int updateFlag; +extern const enum detectorType myDetectorType; + +// Global variable from communication_funcs.c +extern int isControlServer; + +int initError = OK; +int initCheckDone = 0; +char initErrorMessage[MAX_STR_LENGTH]; + +int detPos[2] = {0, 0}; + +int isInitCheckDone() { return initCheckDone; } + +int getInitResult(char **mess) { + *mess = initErrorMessage; + return initError; +} + +void basictests() { + initError = OK; + initCheckDone = 0; + memset(initErrorMessage, 0, MAX_STR_LENGTH); +#ifdef VIRTUAL + LOG(logINFOBLUE, ("****** Xilinx Chip Test Board Virtual Server ******\n")); +#else + LOG(logINFOBLUE, ("********** Xilinx Chip Test Board Server **********\n")); +#endif + if (mapCSP0() == FAIL) { + strcpy(initErrorMessage, + "Could not map to memory. Cannot proceed. Check Firmware.\n"); + LOG(logERROR, (initErrorMessage)); + initError = FAIL; + return; + } + +#ifndef VIRTUAL + /*if ((!debugflag) && (!updateFlag) && + ((validateKernelVersion(KERNEL_DATE_VRSN) == FAIL) || + (checkType() == FAIL) || (testFpga() == FAIL) || + (testBus() == FAIL))) {*/ + if ((!debugflag) && (!updateFlag) && + ((validateKernelVersion(KERNEL_DATE_VRSN) == FAIL) || + (checkType() == FAIL) /*|| (testFpga() == FAIL) || + (testBus() == FAIL)*/)) { + sprintf(initErrorMessage, + "Could not pass basic tests of FPGA and bus. Cannot proceed. " + "Check Firmware. (Firmware version:0x%lx) \n", + getFirmwareVersion()); + LOG(logERROR, ("%s\n\n", initErrorMessage)); + initError = FAIL; + return; + } +#endif + uint32_t ipadd = getDetectorIP(); + uint64_t macadd = getDetectorMAC(); + int64_t fwversion = getFirmwareVersion(); + char swversion[MAX_STR_LENGTH] = {0}; + memset(swversion, 0, MAX_STR_LENGTH); + getServerVersion(swversion); + uint32_t requiredFirmwareVersion = REQRD_FRMWRE_VRSN; + + LOG(logINFOBLUE, + ("**************************************************\n" + "Detector IP Addr:\t\t 0x%x\n" + "Detector MAC Addr:\t\t 0x%lx\n\n" + + "Firmware Version:\t\t 0x%lx\n" + "Software Version:\t\t %s\n" + "Required Firmware Version:\t 0x%x\n" + "********************************************************\n", + ipadd, macadd, fwversion, swversion, requiredFirmwareVersion)); +} + +int checkType() { +#ifdef VIRTUAL + return OK; +#endif + u_int32_t type = + ((bus_r(FPGAVERSIONREG) & DETTYPE_MSK) >> DETTYPE_OFST); + if (type != XILINX_CHIPTESTBOARD) { + LOG(logERROR, + ("This is not a Xilinx CTB firmware (read %d, expected %d)\n", type, + XILINX_CHIPTESTBOARD)); + return FAIL; + } + return OK; +} + +/* Ids */ + +void getServerVersion(char *version) { strcpy(version, APIXILINXCTB); } + +uint64_t getFirmwareVersion() { +#ifdef VIRTUAL + return REQRD_FRMWRE_VRSN; +#endif + return ((bus_r(FPGAVERSIONREG) & COMPDATE_MSK) >> COMPDATE_OFST); +} + +u_int64_t getDetectorMAC() { +#ifdef VIRTUAL + return 0; +#else + char output[255], mac[255] = ""; + u_int64_t res = 0; + FILE *sysFile = + popen("ifconfig eth0 | grep ether | awk '{ print $2 }'", "r"); + fgets(output, sizeof(output), sysFile); + pclose(sysFile); + // getting rid of ":" + char *pch; + pch = strtok(output, ":"); + while (pch != NULL) { + strcat(mac, pch); + pch = strtok(NULL, ":"); + } + sscanf(mac, "%lx", &res); + return res; +#endif +} + +u_int32_t getDetectorIP() { +#ifdef VIRTUAL + return 0; +#endif + char temp[INET_ADDRSTRLEN] = ""; + u_int32_t res = 0; + // execute and get address + char output[255]; + FILE *sysFile = popen( + "ifconfig | grep 'inet '| grep -v '127.0.0.1' | awk '{ print $2 }'", + "r"); + fgets(output, sizeof(output), sysFile); + pclose(sysFile); + + // converting IPaddress to hex. + char *pcword = strtok(output, "."); + while (pcword != NULL) { + sprintf(output, "%02x", atoi(pcword)); + strcat(temp, output); + pcword = strtok(NULL, "."); + } + strcpy(output, temp); + sscanf(output, "%x", &res); + // LOG(logINFO, ("ip:%x\n",res); + + return res; +} + +/* initialization */ + +void initControlServer() { + if (!updateFlag && initError == OK) { + setupDetector(); + } + initCheckDone = 1; +} + +void initStopServer() { + if (!updateFlag && initError == OK) { + usleep(CTRL_SRVR_INIT_TIME_US); + if (mapCSP0() == FAIL) { + initError = FAIL; + strcpy(initErrorMessage, + "Stop Server: Map Fail. Cannot proceed. Check Firmware.\n"); + LOG(logERROR, (initErrorMessage)); + initCheckDone = 1; + return; + } +#ifdef VIRTUAL + sharedMemory_setStop(0); +#endif + } + initCheckDone = 1; +} + +/* set up detector */ + +void setupDetector() { + LOG(logINFO, ("This Server is for 1 Xilinx Chip Test Board\n")); +#ifdef VIRTUAL + sharedMemory_setStatus(IDLE); +#endif + LOG(logINFO, ("Goodbye...\n")); +} + +int setDetectorPosition(int pos[]) { + memcpy(detPos, pos, sizeof(detPos)); + return OK; +} + +int *getDetectorPosition() { return detPos; } + +int getNumberofUDPInterfaces() { return 1; } \ No newline at end of file diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h new file mode 100644 index 000000000..edb3c32b9 --- /dev/null +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#pragma once +#include "RegisterDefs.h" +#include "sls/sls_detector_defs.h" + +#define REQRD_FRMWRE_VRSN (0x230000) +#define KERNEL_DATE_VRSN "Wed Nov 29 17:32:14 CET 2023" + +#define LINKED_SERVER_NAME "xilinx_ctbDetectorServer" + +#define CTRL_SRVR_INIT_TIME_US (2 * 1000 * 1000) + +/* Hardware Definitions */ +#define NCHAN (1) + +enum ADCINDEX { V_PWR_IO }; +enum DACINDEX { D0 }; diff --git a/slsDetectorSoftware/generator/commands.yaml b/slsDetectorSoftware/generator/commands.yaml index 2a7224d53..d1e433668 100644 --- a/slsDetectorSoftware/generator/commands.yaml +++ b/slsDetectorSoftware/generator/commands.yaml @@ -311,19 +311,27 @@ CTB_NAMED_LIST: infer_action: true actions: GET: - check_det_id: true + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); exceptions: - - condition: 'cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD' + - condition: 'cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type != defs::XILINX_CHIPTESTBOARD' message: 'cmd + " only allowed for CTB."' + check_det_id: true argc: 0 output: [ 'ToString(t)' ] PUT: - check_det_id: true + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); exceptions: - - condition: 'cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD' + - condition: 'cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type != defs::XILINX_CHIPTESTBOARD' message: 'cmd + " only allowed for CTB."' - - condition: 'cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD' + - condition: 'cmd == "daclist" && det_type != defs::CHIPTESTBOARD && det_type != defs::XILINX_CHIPTESTBOARD' message: '"This detector already has fixed dac names. Cannot change them."' + check_det_id: true input: [ 'args' ] argc: -1 # unknown number of args input_types: [ std::string ] @@ -337,12 +345,11 @@ CTB_SINGLE_DACNAME: extra_variables: - name: index type: defs::dacIndex - value: 0 - - check_det_id: true + value: 0 exceptions: - - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + - condition: 'det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD' message: 'cmd + " only allowed for CTB."' + check_det_id: true argc: 1 input: [ "static_cast(StringTo(args[0]) + index)" ] input_types: [ defs::dacIndex ] @@ -353,11 +360,10 @@ CTB_SINGLE_DACNAME: - name: index type: defs::dacIndex value: 0 - - check_det_id: true exceptions: - - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + - condition: 'det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD' message: 'cmd + " only allowed for CTB."' + check_det_id: true argc: 2 input: [ "static_cast(StringTo(args[0]) + index)","args[1]" ] input_types: [ defs::dacIndex , std::string ] @@ -375,7 +381,7 @@ CTB_GET_DACINDEX: check_det_id: true exceptions: - - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + - condition: 'det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD' message: 'cmd + " only allowed for CTB."' argc: 1 input: [ 'args[0]' ] @@ -389,7 +395,7 @@ CTB_SINGLE_NAME: GET: check_det_id: true exceptions: - - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + - condition: 'det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD' message: 'cmd + " only allowed for CTB."' argc: 1 input: [ "args[0]" ] @@ -399,7 +405,7 @@ CTB_SINGLE_NAME: PUT: check_det_id: true exceptions: - - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + - condition: 'det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD' message: 'cmd + " only allowed for CTB."' argc: 2 cast_input: [ true, false ] @@ -414,7 +420,7 @@ CTB_GET_INDEX: GET: check_det_id: true exceptions: - - condition: 'det->getDetectorType().squash() != defs::CHIPTESTBOARD' + - condition: 'det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD' message: 'cmd + " only allowed for CTB."' argc: 1 input: [ 'args[0]' ] @@ -490,14 +496,14 @@ burstperiod: ################# TIME_GET_COMMAND ############# delayl: - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Delay Left in Acquisition. \n\t[Gotthard2] only in continuous mode." + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Delay Left in Acquisition. \n\t[Gotthard2] only in continuous mode." inherit_actions: TIME_GET_COMMAND actions: GET: function: getDelayAfterTriggerLeft periodl: - help: "\n\t[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Period left for current frame. \n\t[Gotthard2] only in continuous mode." + help: "\n\t[Gotthard][Jungfrau][Moench][Ctb][Mythen3][Gotthard2] Period left for current frame. \n\t[Gotthard2] only in continuous mode." inherit_actions: TIME_GET_COMMAND actions: GET: @@ -525,14 +531,14 @@ exptimel: function: getExptimeLeft runtime: - help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Time from detector start up.\n\t[Gotthard2] not in burst and auto mode." + help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Time from detector start up.\n\t[Gotthard2] not in burst and auto mode." inherit_actions: TIME_GET_COMMAND actions: GET: function: getActualTime frametime: - help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Timestamp at a frame start.\n\t[Gotthard2] not in burst and auto mode." + help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Timestamp at a frame start.\n\t[Gotthard2] not in burst and auto mode." inherit_actions: TIME_GET_COMMAND actions: GET: @@ -740,7 +746,7 @@ filterresistor: function: setFilterResistor dbitpipeline: - help: "[n_value]\n\t[Ctb][Gotthard2] Pipeline of the clock for latching digital bits.\n\t[Gotthard2] Options: 0-7\n\t[CTB] Options: 0-255" + help: "[n_value]\n\t[Ctb][Gotthard2] Pipeline of the clock for latching digital bits.\n\t[Gotthard2] Options: 0-7\n\t[Ctb] Options: 0-255" inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -758,7 +764,7 @@ readnrows: function: setReadNRows nextframenumber: - help: "[n_value]\n\t[Eiger][Jungfrau][Moench][CTB] Next frame number. Stopping acquisition might result in different frame numbers for different modules." + help: "[n_value]\n\t[Eiger][Jungfrau][Moench][Ctb] Next frame number. Stopping acquisition might result in different frame numbers for different modules." inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -1256,7 +1262,7 @@ dpulse: input_types: [ bool ] asamples: - help: "[n_samples]\n\t[CTB] Number of analog samples expected." + help: "[n_samples]\n\t[Ctb] Number of analog samples expected." inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -1283,7 +1289,7 @@ runclk: function: setRUNClock dsamples: - help: "[n_value]\n\t[CTB] Number of digital samples expected." + help: "[n_value]\n\t[Ctb] Number of digital samples expected." inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -1292,7 +1298,7 @@ dsamples: function: setNumberOfDigitalSamples tsamples: - help: "[n_value]\n\t[CTB] Number of transceiver samples expected." + help: "[n_value]\n\t[Ctb] Number of transceiver samples expected." inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -1301,7 +1307,7 @@ tsamples: function: setNumberOfTransceiverSamples romode: - help: "[analog|digital|analog_digital|transceiver|digital_transceiver]\n\t[CTB] Readout mode. Default is analog." + help: "[analog|digital|analog_digital|transceiver|digital_transceiver]\n\t[Ctb] Readout mode. Default is analog." inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -1872,35 +1878,35 @@ moduleid: type: inherit_actions: GET_COMMAND - help: "\n\tReturns detector type. Can be Eiger, Jungfrau, Gotthard, Moench, Mythen3, Gotthard2, ChipTestBoard" + help: "\n\tReturns detector type. Can be Eiger, Jungfrau, Gotthard, Moench, Mythen3, Gotthard2, ChipTestBoard, Xilinx_ChipTestBoard" actions: GET: function: getDetectorType framesl: inherit_actions: GET_COMMAND - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames left in acquisition. \n\t[Gotthard2] only in continuous auto mode." + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of frames left in acquisition. \n\t[Gotthard2] only in continuous auto mode." actions: GET: function: getNumberOfFramesLeft triggersl: inherit_actions: GET_COMMAND - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of triggers left in acquisition. Only when external trigger used." + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of triggers left in acquisition. Only when external trigger used." actions: GET: function: getNumberOfTriggersLeft maxadcphaseshift: inherit_actions: GET_COMMAND - help: "\n\t[Jungfrau][Moench][CTB] Absolute maximum Phase shift of ADC clock." + help: "\n\t[Jungfrau][Moench][Ctb] Absolute maximum Phase shift of ADC clock." actions: GET: function: getMaxADCPhaseShift maxdbitphaseshift: inherit_actions: GET_COMMAND - help: "\n\t[CTB][Jungfrau] Absolute maximum Phase shift of of the clock to latch digital bits." + help: "\n\t[Ctb][Jungfrau] Absolute maximum Phase shift of of the clock to latch digital bits." actions: GET: function: getMaxDBITPhaseShift @@ -2005,7 +2011,7 @@ lastclient: framecounter: inherit_actions: GET_COMMAND - help: "\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames from start run control.\n\t[Gotthard2] only in continuous mode." + help: "\n\t[Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of frames from start run control.\n\t[Gotthard2] only in continuous mode." actions: GET: function: getNumberOfFramesFromStart @@ -2013,7 +2019,7 @@ framecounter: ################# GET_COMMAND_HEX ############################ serialnumber: inherit_actions: GET_COMMAND - help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][CTB]\nSerial number of detector." + help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb]\nSerial number of detector." actions: GET: function: getSerialNumber @@ -2236,7 +2242,7 @@ im_io: ################# CTB_NAMED_LIST ############################# daclist: inherit_actions: CTB_NAMED_LIST - help: "[dacname1 dacname2 .. dacname18] \n\t\t[ChipTestBoard] Set the list of dac names for this detector.\n\t\t[All] Gets the list of dac names for every dac for this detector." + help: "[dacname1 dacname2 .. dacname18] \n\t\t[Ctb][Xilinx_Ctb] Set the list of dac names for this detector.\n\t\t[All] Gets the list of dac names for every dac for this detector." actions: GET: function: getDacNames @@ -2245,7 +2251,7 @@ daclist: adclist: inherit_actions: CTB_NAMED_LIST - help: "[adcname1 adcname2 .. adcname32] \n\t\t[ChipTestBoard] Set the list of adc names for this board." + help: "[adcname1 adcname2 .. adcname32] \n\t\t[Ctb][Xilinx_Ctb] Set the list of adc names for this board." actions: GET: function: getAdcNames @@ -2254,7 +2260,7 @@ adclist: signallist: inherit_actions: CTB_NAMED_LIST - help: "[signalname1 signalname2 .. signalname63] \n\t\t[ChipTestBoard] Set the list of signal names for this board." + help: "[signalname1 signalname2 .. signalname63] \n\t\t[Ctb][Xilinx_Ctb] Set the list of signal names for this board." actions: GET: function: getSignalNames @@ -2263,7 +2269,7 @@ signallist: powerlist: inherit_actions: CTB_NAMED_LIST - help: "[powername1 powername2 .. powername4] \n\t\t[ChipTestBoard] Set the list of power names for this board." + help: "[powername1 powername2 .. powername4] \n\t\t[Ctb][Xilinx_Ctb] Set the list of power names for this board." actions: GET: function: getPowerNames @@ -2272,7 +2278,7 @@ powerlist: slowadclist: inherit_actions: CTB_NAMED_LIST - help: "[slowadcname1 slowadcname2 .. slowadcname7] \n\t\t[ChipTestBoard] Set the list of slowadc names for this board." + help: "[slowadcname1 slowadcname2 .. slowadcname7] \n\t\t[Ctb][Xilinx_Ctb] Set the list of slowadc names for this board." actions: GET: function: getSlowADCNames @@ -2281,7 +2287,7 @@ slowadclist: ################# CTB_VALUES ################################ powervalues: - help: "[name] \n\t\t[ChipTestBoard] Get values of all powers." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get values of all powers." actions: GET: argc: 0 @@ -2293,7 +2299,7 @@ powervalues: printable_name: "*name_it++" slowadcvalues: - help: "[name] \n\t\t[ChipTestBoard] Get values of all slow adcs." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get values of all slow adcs." actions: GET: argc: 0 @@ -2319,7 +2325,7 @@ tempvalues: ################# CTB_SINGLE_DACNAME ######################## dacname: inherit_actions: CTB_SINGLE_DACNAME - help: "[0-17][name] \n\t\t[ChipTestBoard] Set the dac at the given position to the given name." + help: "[0-17][name] \n\t\t[Ctb][Xilinx_Ctb] Set the dac at the given position to the given name." actions: GET: function: getDacName @@ -2336,7 +2342,7 @@ dacname: powername: inherit_actions: CTB_SINGLE_DACNAME - help: "[0-4][name] \n\t\t[ChipTestBoard] Set the power at the given position to the given name." + help: "[0-4][name] \n\t\t[Ctb][Xilinx_Ctb] Set the power at the given position to the given name." actions: GET: function: getPowerName @@ -2353,7 +2359,7 @@ powername: slowadcname: inherit_actions: CTB_SINGLE_DACNAME - help: "[0-7][name] \n\t\t[ChipTestBoard] Set the slowadc at the given position to the given name." + help: "[0-7][name] \n\t\t[Ctb][Xilinx_Ctb] Set the slowadc at the given position to the given name." actions: GET: function: getSlowADCName @@ -2371,7 +2377,7 @@ slowadcname: ################# CTB_GET_DACINDEX ########################## dacindex: inherit_actions: CTB_GET_DACINDEX - help: "[name] \n\t\t[ChipTestBoard] Get the dac index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the dac index for the given name." actions: GET: function: getDacIndex @@ -2382,7 +2388,7 @@ dacindex: powerindex: inherit_actions: CTB_GET_DACINDEX - help: "[name] \n\t\t[ChipTestBoard] Get the power index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the power index for the given name." actions: GET: function: getPowerIndex @@ -2393,7 +2399,7 @@ powerindex: slowadcindex: inherit_actions: CTB_GET_DACINDEX - help: "[name] \n\t\t[ChipTestBoard] Get the slowadc index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the slowadc index for the given name." actions: GET: function: getSlowADCIndex @@ -2405,7 +2411,7 @@ slowadcindex: ################# CTB_SINGLE_NAME ########################### adcname: inherit_actions: CTB_SINGLE_NAME - help: "[0-31][name] \n\t\t[ChipTestBoard] Set the adc at the given position to the given name." + help: "[0-31][name] \n\t\t[Ctb][Xilinx_Ctb] Set the adc at the given position to the given name." actions: GET: function: getAdcName @@ -2414,7 +2420,7 @@ adcname: signalname: inherit_actions: CTB_SINGLE_NAME - help: "[0-63][name] \n\t\t[ChipTestBoard] Set the signal at the given position to the given name." + help: "[0-63][name] \n\t\t[Ctb][Xilinx_Ctb] Set the signal at the given position to the given name." actions: GET: function: getSignalName @@ -2424,14 +2430,14 @@ signalname: ################# CTB_GET_INDEX ############################# adcindex: inherit_actions: CTB_GET_INDEX - help: "[name] \n\t\t[ChipTestBoard] Get the adc index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the adc index for the given name." actions: GET: function: getAdcIndex signalindex: inherit_actions: CTB_GET_INDEX - help: "[name] \n\t\t[ChipTestBoard] Get the signal index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the signal index for the given name." actions: GET: function: getSignalIndex @@ -2877,16 +2883,24 @@ readoutspeed: help: "\n\t[0 or full_speed|1 or half_speed|2 or quarter_speed]\n\t[Eiger][Jungfrau][Moench] Readout speed of chip.\n\t[Eiger][Moench] Default speed is full_speed.\n\t[Jungfrau] Default speed is half_speed. full_speed option only available from v2.0 boards and is recommended to set number of interfaces to 2. Also overwrites adcphase to recommended default.\n\t [144|108]\n\t\t[Gotthard2] Readout speed of chip in MHz. Default is 108." actions: GET: + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); exceptions: - - condition: 'det->getDetectorType().squash() == defs::CHIPTESTBOARD' + - condition: 'det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD' message: '"ReadoutSpeed not implemented. Did you mean runclk?"' argc: 0 require_det_id: true function: getReadoutSpeed output: [ OutString(t) ] PUT: + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); exceptions: - - condition: 'det->getDetectorType().squash() == defs::CHIPTESTBOARD' + - condition: 'det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD' message: '"ReadoutSpeed not implemented. Did you mean runclk?"' argc: 1 require_det_id: true @@ -3158,12 +3172,12 @@ dac: actions: GET: exceptions: - - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD" + - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD" message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' extra_variables: - name: dacIndex type: defs::dacIndex - value: "(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0])" + value: "((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0])" function: getDAC require_det_id: true input_types: [ defs::dacIndex, bool ] @@ -3175,7 +3189,7 @@ dac: output: [ 'args[0]', "' '", OutString(t) ] - argc: 2 exceptions: - - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD" + - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD" message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' - condition: 'args[1] != "mv" && args[1] != "mV"' message: '"Unknown argument " + args[1] + ". Did you mean mV?"' @@ -3184,12 +3198,12 @@ dac: output: [ 'args[0]', "' '" , OutString(t), '" mV"' ] PUT: exceptions: - - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD" + - condition: "is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD" message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' extra_variables: - name: dacIndex type: defs::dacIndex - value: "(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0])" + value: "((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0])" function: setDAC require_det_id: true input_types: [ defs::dacIndex, int, bool ] @@ -4141,7 +4155,7 @@ updatekernel: output: [ '"successful"' ] update: - help: "\n\tWithout tftp: [server_name (incl fullpath)] [fname.pof (incl full path)] This does not use tftp.\n\t\t[Jungfrau][Moench][Gotthard][CTB] Updates the firmware, detector server, deletes old server, creates the symbolic link and then reboots detector controller. \n\t\t[Mythen3][Gotthard2] will require a script to start up the shorter named server link at start up. \n\t\tserver_name is full path name of detector server binary\n\t\tfname is full path of programming file" + help: "\n\tWithout tftp: [server_name (incl fullpath)] [fname.pof (incl full path)] This does not use tftp.\n\t\t[Jungfrau][Moench][Gotthard][Ctb] Updates the firmware, detector server, deletes old server, creates the symbolic link and then reboots detector controller. \n\t\t[Mythen3][Gotthard2] will require a script to start up the shorter named server link at start up. \n\t\tserver_name is full path name of detector server binary\n\t\tfname is full path of programming file" actions: PUT: argc: 2 diff --git a/slsDetectorSoftware/generator/extended_commands.yaml b/slsDetectorSoftware/generator/extended_commands.yaml index ff4431f9b..173f30a7f 100644 --- a/slsDetectorSoftware/generator/extended_commands.yaml +++ b/slsDetectorSoftware/generator/extended_commands.yaml @@ -202,7 +202,8 @@ adcindex: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." function: getAdcIndex input: @@ -215,7 +216,7 @@ adcindex: store_result_in_t: true command_name: adcindex function_alias: adcindex - help: "[name] \n\t\t[ChipTestBoard] Get the adc index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the adc index for the given name." infer_action: true template: true adcinvert: @@ -268,8 +269,13 @@ adclist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: getAdcNames input: [] input_types: [] @@ -287,10 +293,16 @@ adclist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." - - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd == "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: '"This detector already has fixed dac names. Cannot change them."' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: setAdcNames input: - args @@ -302,8 +314,8 @@ adclist: store_result_in_t: false command_name: adclist function_alias: adclist - help: "[adcname1 adcname2 .. adcname32] \n\t\t[ChipTestBoard] Set the list of adc\ - \ names for this board." + help: "[adcname1 adcname2 .. adcname32] \n\t\t[Ctb][Xilinx_Ctb] Set the list of\ + \ adc names for this board." infer_action: true template: true adcname: @@ -318,7 +330,8 @@ adcname: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." function: getAdcName input: @@ -343,7 +356,8 @@ adcname: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." function: setAdcName input: @@ -358,8 +372,8 @@ adcname: store_result_in_t: false command_name: adcname function_alias: adcname - help: "[0-31][name] \n\t\t[ChipTestBoard] Set the adc at the given position to the\ - \ given name." + help: "[0-31][name] \n\t\t[Ctb][Xilinx_Ctb] Set the adc at the given position to\ + \ the given name." infer_action: true template: true adcphase: @@ -708,7 +722,7 @@ asamples: store_result_in_t: false command_name: asamples function_alias: asamples - help: "[n_samples]\n\t[CTB] Number of analog samples expected." + help: "[n_samples]\n\t[Ctb] Number of analog samples expected." infer_action: true template: true autocompdisable: @@ -1711,13 +1725,15 @@ dac: convert_det_id: true exceptions: - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD + && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' extra_variables: - name: dacIndex type: defs::dacIndex - value: '(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) - ? det->getDacIndex(args[0]) : StringTo(args[0])' + value: '((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() + == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) + : StringTo(args[0])' function: getDAC input: - dacIndex @@ -1742,6 +1758,7 @@ dac: convert_det_id: true exceptions: - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD + && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' - condition: args[1] != "mv" && args[1] != "mV" @@ -1749,8 +1766,9 @@ dac: extra_variables: - name: dacIndex type: defs::dacIndex - value: '(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) - ? det->getDacIndex(args[0]) : StringTo(args[0])' + value: '((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() + == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) + : StringTo(args[0])' function: getDAC input: - dacIndex @@ -1779,13 +1797,15 @@ dac: convert_det_id: true exceptions: - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD + && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' extra_variables: - name: dacIndex type: defs::dacIndex - value: '(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) - ? det->getDacIndex(args[0]) : StringTo(args[0])' + value: '((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() + == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) + : StringTo(args[0])' function: setDAC input: - dacIndex @@ -1814,13 +1834,15 @@ dac: convert_det_id: true exceptions: - condition: is_int(args[0]) && det->getDetectorType().squash() != defs::CHIPTESTBOARD + && det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD message: '"Dac indices can only be used for chip test board. Use daclist to get list of dac names for current detector."' extra_variables: - name: dacIndex type: defs::dacIndex - value: '(det->getDetectorType().squash() == defs::CHIPTESTBOARD && !is_int(args[0])) - ? det->getDacIndex(args[0]) : StringTo(args[0])' + value: '((det->getDetectorType().squash() == defs::CHIPTESTBOARD || det->getDetectorType().squash() + == defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) + : StringTo(args[0])' function: setDAC input: - dacIndex @@ -1855,7 +1877,8 @@ dacindex: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." extra_variables: - name: index @@ -1872,7 +1895,7 @@ dacindex: store_result_in_t: true command_name: dacindex function_alias: dacindex - help: "[name] \n\t\t[ChipTestBoard] Get the dac index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the dac index for the given name." infer_action: true template: true daclist: @@ -1885,8 +1908,13 @@ daclist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: getDacNames input: [] input_types: [] @@ -1904,10 +1932,16 @@ daclist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." - - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd == "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: '"This detector already has fixed dac names. Cannot change them."' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: setDacNames input: - args @@ -1919,9 +1953,9 @@ daclist: store_result_in_t: false command_name: daclist function_alias: daclist - help: "[dacname1 dacname2 .. dacname18] \n\t\t[ChipTestBoard] Set the list of dac\ - \ names for this detector.\n\t\t[All] Gets the list of dac names for every dac\ - \ for this detector." + help: "[dacname1 dacname2 .. dacname18] \n\t\t[Ctb][Xilinx_Ctb] Set the list of\ + \ dac names for this detector.\n\t\t[All] Gets the list of dac names for every\ + \ dac for this detector." infer_action: true template: true dacname: @@ -1936,7 +1970,8 @@ dacname: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." extra_variables: - name: index @@ -1965,7 +2000,8 @@ dacname: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." extra_variables: - name: index @@ -1984,8 +2020,8 @@ dacname: store_result_in_t: false command_name: dacname function_alias: dacname - help: "[0-17][name] \n\t\t[ChipTestBoard] Set the dac at the given position to the\ - \ given name." + help: "[0-17][name] \n\t\t[Ctb][Xilinx_Ctb] Set the dac at the given position to\ + \ the given name." infer_action: true template: true dacvalues: @@ -2253,7 +2289,7 @@ dbitpipeline: command_name: dbitpipeline function_alias: dbitpipeline help: "[n_value]\n\t[Ctb][Gotthard2] Pipeline of the clock for latching digital\ - \ bits.\n\t[Gotthard2] Options: 0-7\n\t[CTB] Options: 0-255" + \ bits.\n\t[Gotthard2] Options: 0-7\n\t[Ctb] Options: 0-255" infer_action: true template: true defaultdac: @@ -2494,7 +2530,7 @@ delayl: store_result_in_t: true command_name: delayl function_alias: delayl - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Delay Left in Acquisition.\ + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Delay Left in Acquisition.\ \ \n\t[Gotthard2] only in continuous mode." infer_action: true template: true @@ -2728,7 +2764,7 @@ dsamples: store_result_in_t: false command_name: dsamples function_alias: dsamples - help: "[n_value]\n\t[CTB] Number of digital samples expected." + help: "[n_value]\n\t[Ctb] Number of digital samples expected." infer_action: true template: true execcommand: @@ -3870,7 +3906,7 @@ framecounter: store_result_in_t: true command_name: framecounter function_alias: framecounter - help: "\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames from start\ + help: "\n\t[Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of frames from start\ \ run control.\n\t[Gotthard2] only in continuous mode." infer_action: true template: true @@ -3934,7 +3970,7 @@ framesl: store_result_in_t: true command_name: framesl function_alias: framesl - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames\ + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of frames\ \ left in acquisition. \n\t[Gotthard2] only in continuous auto mode." infer_action: true template: true @@ -3969,7 +4005,7 @@ frametime: store_result_in_t: true command_name: frametime function_alias: frametime - help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB]\ + help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][Ctb]\ \ Timestamp at a frame start.\n\t[Gotthard2] not in burst and auto mode." infer_action: true template: true @@ -5252,7 +5288,7 @@ maxadcphaseshift: store_result_in_t: true command_name: maxadcphaseshift function_alias: maxadcphaseshift - help: "\n\t[Jungfrau][Moench][CTB] Absolute maximum Phase shift of ADC clock." + help: "\n\t[Jungfrau][Moench][Ctb] Absolute maximum Phase shift of ADC clock." infer_action: true template: true maxclkphaseshift: @@ -5305,7 +5341,7 @@ maxdbitphaseshift: store_result_in_t: true command_name: maxdbitphaseshift function_alias: maxdbitphaseshift - help: "\n\t[CTB][Jungfrau] Absolute maximum Phase shift of of the clock to latch\ + help: "\n\t[Ctb][Jungfrau] Absolute maximum Phase shift of of the clock to latch\ \ digital bits." infer_action: true template: true @@ -5438,7 +5474,7 @@ nextframenumber: store_result_in_t: false command_name: nextframenumber function_alias: nextframenumber - help: "[n_value]\n\t[Eiger][Jungfrau][Moench][CTB] Next frame number. Stopping acquisition\ + help: "[n_value]\n\t[Eiger][Jungfrau][Moench][Ctb] Next frame number. Stopping acquisition\ \ might result in different frame numbers for different modules." infer_action: true template: true @@ -7142,7 +7178,7 @@ periodl: store_result_in_t: true command_name: periodl function_alias: periodl - help: "\n\t[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Period left for\ + help: "\n\t[Gotthard][Jungfrau][Moench][Ctb][Mythen3][Gotthard2] Period left for\ \ current frame. \n\t[Gotthard2] only in continuous mode." infer_action: true template: true @@ -7281,7 +7317,8 @@ powerindex: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." extra_variables: - name: index @@ -7298,7 +7335,7 @@ powerindex: store_result_in_t: true command_name: powerindex function_alias: powerindex - help: "[name] \n\t\t[ChipTestBoard] Get the power index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the power index for the given name." infer_action: true template: true powerlist: @@ -7311,8 +7348,13 @@ powerlist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: getPowerNames input: [] input_types: [] @@ -7330,10 +7372,16 @@ powerlist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." - - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd == "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: '"This detector already has fixed dac names. Cannot change them."' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: setPowerNames input: - args @@ -7345,7 +7393,7 @@ powerlist: store_result_in_t: false command_name: powerlist function_alias: powerlist - help: "[powername1 powername2 .. powername4] \n\t\t[ChipTestBoard] Set the list\ + help: "[powername1 powername2 .. powername4] \n\t\t[Ctb][Xilinx_Ctb] Set the list\ \ of power names for this board." infer_action: true template: true @@ -7361,7 +7409,8 @@ powername: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." extra_variables: - name: index @@ -7390,7 +7439,8 @@ powername: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." extra_variables: - name: index @@ -7409,7 +7459,7 @@ powername: store_result_in_t: false command_name: powername function_alias: powername - help: "[0-4][name] \n\t\t[ChipTestBoard] Set the power at the given position to\ + help: "[0-4][name] \n\t\t[Ctb][Xilinx_Ctb] Set the power at the given position to\ \ the given name." infer_action: true template: true @@ -7436,7 +7486,7 @@ powervalues: store_result_in_t: true command_name: powervalues function_alias: powervalues - help: "[name] \n\t\t[ChipTestBoard] Get values of all powers." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get values of all powers." infer_action: true programfpga: actions: @@ -7778,8 +7828,12 @@ readoutspeed: check_det_id: false convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() == defs::CHIPTESTBOARD + - condition: det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD message: '"ReadoutSpeed not implemented. Did you mean runclk?"' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: getReadoutSpeed input: [] input_types: [] @@ -7797,8 +7851,12 @@ readoutspeed: check_det_id: false convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() == defs::CHIPTESTBOARD + - condition: det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD message: '"ReadoutSpeed not implemented. Did you mean runclk?"' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: setReadoutSpeed input: - args[0] @@ -8058,7 +8116,7 @@ romode: store_result_in_t: false command_name: romode function_alias: romode - help: "[analog|digital|analog_digital|transceiver|digital_transceiver]\n\t[CTB]\ + help: "[analog|digital|analog_digital|transceiver|digital_transceiver]\n\t[Ctb]\ \ Readout mode. Default is analog." infer_action: true template: true @@ -8172,7 +8230,7 @@ runtime: store_result_in_t: true command_name: runtime function_alias: runtime - help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB]\ + help: "[(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][Ctb]\ \ Time from detector start up.\n\t[Gotthard2] not in burst and auto mode." infer_action: true template: true @@ -9554,7 +9612,7 @@ serialnumber: store_result_in_t: true command_name: serialnumber function_alias: serialnumber - help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][CTB]\nSerial number\ + help: "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb]\nSerial number\ \ of detector." infer_action: true template: true @@ -9710,7 +9768,8 @@ signalindex: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." function: getSignalIndex input: @@ -9723,7 +9782,7 @@ signalindex: store_result_in_t: true command_name: signalindex function_alias: signalindex - help: "[name] \n\t\t[ChipTestBoard] Get the signal index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the signal index for the given name." infer_action: true template: true signallist: @@ -9736,8 +9795,13 @@ signallist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: getSignalNames input: [] input_types: [] @@ -9755,10 +9819,16 @@ signallist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." - - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd == "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: '"This detector already has fixed dac names. Cannot change them."' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: setSignalNames input: - args @@ -9770,8 +9840,8 @@ signallist: store_result_in_t: false command_name: signallist function_alias: signallist - help: "[signalname1 signalname2 .. signalname63] \n\t\t[ChipTestBoard] Set the list\ - \ of signal names for this board." + help: "[signalname1 signalname2 .. signalname63] \n\t\t[Ctb][Xilinx_Ctb] Set the\ + \ list of signal names for this board." infer_action: true template: true signalname: @@ -9786,7 +9856,8 @@ signalname: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." function: getSignalName input: @@ -9811,7 +9882,8 @@ signalname: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." function: setSignalName input: @@ -9826,8 +9898,8 @@ signalname: store_result_in_t: false command_name: signalname function_alias: signalname - help: "[0-63][name] \n\t\t[ChipTestBoard] Set the signal at the given position to\ - \ the given name." + help: "[0-63][name] \n\t\t[Ctb][Xilinx_Ctb] Set the signal at the given position\ + \ to the given name." infer_action: true template: true slowadc: @@ -9863,7 +9935,8 @@ slowadcindex: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." extra_variables: - name: index @@ -9880,7 +9953,7 @@ slowadcindex: store_result_in_t: true command_name: slowadcindex function_alias: slowadcindex - help: "[name] \n\t\t[ChipTestBoard] Get the slowadc index for the given name." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get the slowadc index for the given name." infer_action: true template: true slowadclist: @@ -9893,8 +9966,13 @@ slowadclist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: getSlowADCNames input: [] input_types: [] @@ -9912,10 +9990,16 @@ slowadclist: check_det_id: true convert_det_id: true exceptions: - - condition: cmd != "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd != "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." - - condition: cmd == "daclist" && det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: cmd == "daclist" && det_type != defs::CHIPTESTBOARD && det_type + != defs::XILINX_CHIPTESTBOARD message: '"This detector already has fixed dac names. Cannot change them."' + extra_variables: + - name: det_type + type: auto + value: det->getDetectorType().squash(defs::GENERIC); function: setSlowADCNames input: - args @@ -9927,7 +10011,7 @@ slowadclist: store_result_in_t: false command_name: slowadclist function_alias: slowadclist - help: "[slowadcname1 slowadcname2 .. slowadcname7] \n\t\t[ChipTestBoard] Set the\ + help: "[slowadcname1 slowadcname2 .. slowadcname7] \n\t\t[Ctb][Xilinx_Ctb] Set the\ \ list of slowadc names for this board." infer_action: true template: true @@ -9943,7 +10027,8 @@ slowadcname: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." extra_variables: - name: index @@ -9972,7 +10057,8 @@ slowadcname: check_det_id: true convert_det_id: true exceptions: - - condition: det->getDetectorType().squash() != defs::CHIPTESTBOARD + - condition: det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD + && det->getDetectorType().squash(defs::GENERIC) != defs::XILINX_CHIPTESTBOARD message: cmd + " only allowed for CTB." extra_variables: - name: index @@ -9991,8 +10077,8 @@ slowadcname: store_result_in_t: false command_name: slowadcname function_alias: slowadcname - help: "[0-7][name] \n\t\t[ChipTestBoard] Set the slowadc at the given position to\ - \ the given name." + help: "[0-7][name] \n\t\t[Ctb][Xilinx_Ctb] Set the slowadc at the given position\ + \ to the given name." infer_action: true template: true slowadcvalues: @@ -10018,7 +10104,7 @@ slowadcvalues: store_result_in_t: true command_name: slowadcvalues function_alias: slowadcvalues - help: "[name] \n\t\t[ChipTestBoard] Get values of all slow adcs." + help: "[name] \n\t\t[Ctb][Xilinx_Ctb] Get values of all slow adcs." infer_action: true start: actions: @@ -11373,7 +11459,7 @@ triggersl: store_result_in_t: true command_name: triggersl function_alias: triggersl - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of triggers\ + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of triggers\ \ left in acquisition. Only when external trigger used." infer_action: true template: true @@ -11530,7 +11616,7 @@ tsamples: store_result_in_t: false command_name: tsamples function_alias: tsamples - help: "[n_value]\n\t[CTB] Number of transceiver samples expected." + help: "[n_value]\n\t[Ctb] Number of transceiver samples expected." infer_action: true template: true txdelay: @@ -11720,7 +11806,7 @@ type: command_name: type function_alias: type help: "\n\tReturns detector type. Can be Eiger, Jungfrau, Gotthard, Moench, Mythen3,\ - \ Gotthard2, ChipTestBoard" + \ Gotthard2, ChipTestBoard, Xilinx_ChipTestBoard" infer_action: true template: true udp_cleardst: @@ -12327,7 +12413,7 @@ update: command_name: update function_alias: update help: "\n\tWithout tftp: [server_name (incl fullpath)] [fname.pof (incl full path)]\ - \ This does not use tftp.\n\t\t[Jungfrau][Moench][Gotthard][CTB] Updates the firmware,\ + \ This does not use tftp.\n\t\t[Jungfrau][Moench][Gotthard][Ctb] Updates the firmware,\ \ detector server, deletes old server, creates the symbolic link and then reboots\ \ detector controller. \n\t\t[Mythen3][Gotthard2] will require a script to start\ \ up the shorter named server link at start up. \n\t\tserver_name is full path\ diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 4f346effa..7001eba45 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -98,7 +98,7 @@ class Detector { Result getReceiverVersion(Positions pos = {}) const; /** Options: EIGER, JUNGFRAU, GOTTHARD, MOENCH, MYTHEN3, GOTTHARD2, - * CHIPTESTBOARD */ + * CHIPTESTBOARD, XILINX_CHIPTESTBOARD */ Result getDetectorType(Positions pos = {}) const; /** Gets the total number of modules in shared memory */ diff --git a/slsDetectorSoftware/src/Caller.cpp b/slsDetectorSoftware/src/Caller.cpp index 29897ea8c..058330b2f 100644 --- a/slsDetectorSoftware/src/Caller.cpp +++ b/slsDetectorSoftware/src/Caller.cpp @@ -264,7 +264,7 @@ std::string Caller::adcindex(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: adcindex" << std::endl; os << R"V0G0N([name] - [ChipTestBoard] Get the adc index for the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Get the adc index for the given name. )V0G0N" << std::endl; return os.str(); } @@ -289,7 +289,10 @@ std::string Caller::adcindex(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -374,7 +377,7 @@ std::string Caller::adclist(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: adclist" << std::endl; os << R"V0G0N([adcname1 adcname2 .. adcname32] - [ChipTestBoard] Set the list of adc names for this board. )V0G0N" + [Ctb][Xilinx_Ctb] Set the list of adc names for this board. )V0G0N" << std::endl; return os.str(); } @@ -386,6 +389,8 @@ std::string Caller::adclist(int action) { } if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; } } @@ -406,8 +411,10 @@ std::string Caller::adclist(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 0) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -419,12 +426,14 @@ std::string Caller::adclist(int action) { } if (action == slsDetectorDefs::PUT_ACTION) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } - if (cmd == "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (cmd == "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError("This detector already has fixed dac names. " "Cannot change them."); } @@ -445,7 +454,7 @@ std::string Caller::adcname(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: adcname" << std::endl; os << R"V0G0N([0-31][name] - [ChipTestBoard] Set the adc at the given position to the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Set the adc at the given position to the given name. )V0G0N" << std::endl; return os.str(); } @@ -490,7 +499,10 @@ std::string Caller::adcname(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -504,7 +516,10 @@ std::string Caller::adcname(int action) { if (action == slsDetectorDefs::PUT_ACTION) { if (args.size() == 2) { - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -955,7 +970,7 @@ std::string Caller::asamples(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: asamples" << std::endl; os << R"V0G0N([n_samples] - [CTB] Number of analog samples expected. )V0G0N" + [Ctb] Number of analog samples expected. )V0G0N" << std::endl; return os.str(); } @@ -2248,7 +2263,9 @@ std::string Caller::dac(int action) { if (args.size() == 1) { defs::dacIndex dacIndex = - (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || + det->getDetectorType().squash() == + defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0]); @@ -2261,7 +2278,9 @@ std::string Caller::dac(int action) { if (args.size() == 2) { defs::dacIndex dacIndex = - (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || + det->getDetectorType().squash() == + defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0]); @@ -2281,7 +2300,9 @@ std::string Caller::dac(int action) { if (args.size() == 2) { defs::dacIndex dacIndex = - (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || + det->getDetectorType().squash() == + defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0]); @@ -2299,7 +2320,9 @@ std::string Caller::dac(int action) { if (args.size() == 3) { defs::dacIndex dacIndex = - (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || + det->getDetectorType().squash() == + defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0]); @@ -2327,12 +2350,15 @@ std::string Caller::dac(int action) { if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { defs::dacIndex dacIndex = - (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || + det->getDetectorType().squash() == + defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0]); if (is_int(args[0]) && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + det->getDetectorType().squash() != defs::CHIPTESTBOARD && + det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError( "Dac indices can only be used for chip test board. Use " "daclist to get list of dac names for current detector."); @@ -2344,12 +2370,15 @@ std::string Caller::dac(int action) { if (args.size() == 2) { defs::dacIndex dacIndex = - (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || + det->getDetectorType().squash() == + defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0]); if (is_int(args[0]) && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + det->getDetectorType().squash() != defs::CHIPTESTBOARD && + det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError( "Dac indices can only be used for chip test board. Use " "daclist to get list of dac names for current detector."); @@ -2367,12 +2396,15 @@ std::string Caller::dac(int action) { if (action == slsDetectorDefs::PUT_ACTION) { if (args.size() == 2) { defs::dacIndex dacIndex = - (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || + det->getDetectorType().squash() == + defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0]); if (is_int(args[0]) && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + det->getDetectorType().squash() != defs::CHIPTESTBOARD && + det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError( "Dac indices can only be used for chip test board. Use " "daclist to get list of dac names for current detector."); @@ -2385,12 +2417,15 @@ std::string Caller::dac(int action) { if (args.size() == 3) { defs::dacIndex dacIndex = - (det->getDetectorType().squash() == defs::CHIPTESTBOARD && + ((det->getDetectorType().squash() == defs::CHIPTESTBOARD || + det->getDetectorType().squash() == + defs::XILINX_CHIPTESTBOARD) && !is_int(args[0])) ? det->getDacIndex(args[0]) : StringTo(args[0]); if (is_int(args[0]) && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + det->getDetectorType().squash() != defs::CHIPTESTBOARD && + det->getDetectorType().squash() != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError( "Dac indices can only be used for chip test board. Use " "daclist to get list of dac names for current detector."); @@ -2412,7 +2447,7 @@ std::string Caller::dacindex(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: dacindex" << std::endl; os << R"V0G0N([name] - [ChipTestBoard] Get the dac index for the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Get the dac index for the given name. )V0G0N" << std::endl; return os.str(); } @@ -2439,7 +2474,10 @@ std::string Caller::dacindex(int action) { if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { defs::dacIndex index = defs::DAC_0; - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -2460,7 +2498,7 @@ std::string Caller::daclist(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: daclist" << std::endl; os << R"V0G0N([dacname1 dacname2 .. dacname18] - [ChipTestBoard] Set the list of dac names for this detector. + [Ctb][Xilinx_Ctb] Set the list of dac names for this detector. [All] Gets the list of dac names for every dac for this detector. )V0G0N" << std::endl; return os.str(); @@ -2473,6 +2511,8 @@ std::string Caller::daclist(int action) { } if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; } } @@ -2493,8 +2533,10 @@ std::string Caller::daclist(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 0) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -2506,12 +2548,14 @@ std::string Caller::daclist(int action) { } if (action == slsDetectorDefs::PUT_ACTION) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } - if (cmd == "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (cmd == "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError("This detector already has fixed dac names. " "Cannot change them."); } @@ -2532,7 +2576,7 @@ std::string Caller::dacname(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: dacname" << std::endl; os << R"V0G0N([0-17][name] - [ChipTestBoard] Set the dac at the given position to the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Set the dac at the given position to the given name. )V0G0N" << std::endl; return os.str(); } @@ -2570,7 +2614,10 @@ std::string Caller::dacname(int action) { if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { defs::dacIndex index = defs::DAC_0; - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -2585,7 +2632,10 @@ std::string Caller::dacname(int action) { if (action == slsDetectorDefs::PUT_ACTION) { if (args.size() == 2) { defs::dacIndex index = defs::DAC_0; - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -2880,7 +2930,7 @@ std::string Caller::dbitpipeline(int action) { os << R"V0G0N([n_value] [Ctb][Gotthard2] Pipeline of the clock for latching digital bits. [Gotthard2] Options: 0-7 - [CTB] Options: 0-255 )V0G0N" + [Ctb] Options: 0-255 )V0G0N" << std::endl; return os.str(); } @@ -3200,7 +3250,7 @@ std::string Caller::delayl(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: delayl" << std::endl; os << R"V0G0N( - [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Delay Left in Acquisition. + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Delay Left in Acquisition. [Gotthard2] only in continuous mode. )V0G0N" << std::endl; return os.str(); @@ -3572,7 +3622,7 @@ std::string Caller::dsamples(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: dsamples" << std::endl; os << R"V0G0N([n_value] - [CTB] Number of digital samples expected. )V0G0N" + [Ctb] Number of digital samples expected. )V0G0N" << std::endl; return os.str(); } @@ -5082,7 +5132,7 @@ std::string Caller::framecounter(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: framecounter" << std::endl; os << R"V0G0N( - [Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames from start run control. + [Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of frames from start run control. [Gotthard2] only in continuous mode. )V0G0N" << std::endl; return os.str(); @@ -5192,7 +5242,7 @@ std::string Caller::framesl(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: framesl" << std::endl; os << R"V0G0N( - [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames left in acquisition. + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of frames left in acquisition. [Gotthard2] only in continuous auto mode. )V0G0N" << std::endl; return os.str(); @@ -5233,7 +5283,7 @@ std::string Caller::frametime(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: frametime" << std::endl; os << R"V0G0N([(optional unit) ns|us|ms|s] - [Jungfrau][Moench][Mythen3][Gotthard2][CTB] Timestamp at a frame start. + [Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Timestamp at a frame start. [Gotthard2] not in burst and auto mode. )V0G0N" << std::endl; return os.str(); @@ -6902,7 +6952,7 @@ std::string Caller::maxadcphaseshift(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: maxadcphaseshift" << std::endl; os << R"V0G0N( - [Jungfrau][Moench][CTB] Absolute maximum Phase shift of ADC clock. )V0G0N" + [Jungfrau][Moench][Ctb] Absolute maximum Phase shift of ADC clock. )V0G0N" << std::endl; return os.str(); } @@ -6998,7 +7048,7 @@ std::string Caller::maxdbitphaseshift(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: maxdbitphaseshift" << std::endl; os << R"V0G0N( - [CTB][Jungfrau] Absolute maximum Phase shift of of the clock to latch digital bits. )V0G0N" + [Ctb][Jungfrau] Absolute maximum Phase shift of of the clock to latch digital bits. )V0G0N" << std::endl; return os.str(); } @@ -7174,7 +7224,7 @@ std::string Caller::nextframenumber(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: nextframenumber" << std::endl; os << R"V0G0N([n_value] - [Eiger][Jungfrau][Moench][CTB] Next frame number. Stopping acquisition might result in different frame numbers for different modules. )V0G0N" + [Eiger][Jungfrau][Moench][Ctb] Next frame number. Stopping acquisition might result in different frame numbers for different modules. )V0G0N" << std::endl; return os.str(); } @@ -9091,7 +9141,7 @@ std::string Caller::periodl(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: periodl" << std::endl; os << R"V0G0N( - [Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Period left for current frame. + [Gotthard][Jungfrau][Moench][Ctb][Mythen3][Gotthard2] Period left for current frame. [Gotthard2] only in continuous mode. )V0G0N" << std::endl; return os.str(); @@ -9332,7 +9382,7 @@ std::string Caller::powerindex(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: powerindex" << std::endl; os << R"V0G0N([name] - [ChipTestBoard] Get the power index for the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Get the power index for the given name. )V0G0N" << std::endl; return os.str(); } @@ -9359,7 +9409,10 @@ std::string Caller::powerindex(int action) { if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { defs::dacIndex index = defs::V_POWER_A; - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -9380,7 +9433,7 @@ std::string Caller::powerlist(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: powerlist" << std::endl; os << R"V0G0N([powername1 powername2 .. powername4] - [ChipTestBoard] Set the list of power names for this board. )V0G0N" + [Ctb][Xilinx_Ctb] Set the list of power names for this board. )V0G0N" << std::endl; return os.str(); } @@ -9392,6 +9445,8 @@ std::string Caller::powerlist(int action) { } if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; } } @@ -9412,8 +9467,10 @@ std::string Caller::powerlist(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 0) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -9425,12 +9482,14 @@ std::string Caller::powerlist(int action) { } if (action == slsDetectorDefs::PUT_ACTION) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } - if (cmd == "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (cmd == "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError("This detector already has fixed dac names. " "Cannot change them."); } @@ -9451,7 +9510,7 @@ std::string Caller::powername(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: powername" << std::endl; os << R"V0G0N([0-4][name] - [ChipTestBoard] Set the power at the given position to the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Set the power at the given position to the given name. )V0G0N" << std::endl; return os.str(); } @@ -9489,7 +9548,10 @@ std::string Caller::powername(int action) { if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { defs::dacIndex index = defs::V_POWER_A; - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -9504,7 +9566,10 @@ std::string Caller::powername(int action) { if (action == slsDetectorDefs::PUT_ACTION) { if (args.size() == 2) { defs::dacIndex index = defs::V_POWER_A; - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -9527,7 +9592,7 @@ std::string Caller::powervalues(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: powervalues" << std::endl; os << R"V0G0N([name] - [ChipTestBoard] Get values of all powers. )V0G0N" + [Ctb][Xilinx_Ctb] Get values of all powers. )V0G0N" << std::endl; return os.str(); } @@ -10055,6 +10120,8 @@ std::string Caller::readoutspeed(int action) { } if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; } } @@ -10065,6 +10132,8 @@ std::string Caller::readoutspeed(int action) { } if (args.size() == 1) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; try { StringTo(args[0]); } catch (...) { @@ -10084,7 +10153,10 @@ std::string Caller::readoutspeed(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 0) { - if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { throw RuntimeError( "ReadoutSpeed not implemented. Did you mean runclk?"); } @@ -10095,7 +10167,10 @@ std::string Caller::readoutspeed(int action) { if (action == slsDetectorDefs::PUT_ACTION) { if (args.size() == 1) { - if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { throw RuntimeError( "ReadoutSpeed not implemented. Did you mean runclk?"); } @@ -10430,7 +10505,7 @@ std::string Caller::romode(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: romode" << std::endl; os << R"V0G0N([analog|digital|analog_digital|transceiver|digital_transceiver] - [CTB] Readout mode. Default is analog. )V0G0N" + [Ctb] Readout mode. Default is analog. )V0G0N" << std::endl; return os.str(); } @@ -10621,7 +10696,7 @@ std::string Caller::runtime(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: runtime" << std::endl; os << R"V0G0N([(optional unit) ns|us|ms|s] - [Jungfrau][Moench][Mythen3][Gotthard2][CTB] Time from detector start up. + [Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Time from detector start up. [Gotthard2] not in burst and auto mode. )V0G0N" << std::endl; return os.str(); @@ -12504,7 +12579,7 @@ std::string Caller::serialnumber(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: serialnumber" << std::endl; os << R"V0G0N( - [Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][CTB] + [Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Serial number of detector. )V0G0N" << std::endl; return os.str(); @@ -12769,7 +12844,7 @@ std::string Caller::signalindex(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: signalindex" << std::endl; os << R"V0G0N([name] - [ChipTestBoard] Get the signal index for the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Get the signal index for the given name. )V0G0N" << std::endl; return os.str(); } @@ -12794,7 +12869,10 @@ std::string Caller::signalindex(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -12816,7 +12894,7 @@ std::string Caller::signallist(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: signallist" << std::endl; os << R"V0G0N([signalname1 signalname2 .. signalname63] - [ChipTestBoard] Set the list of signal names for this board. )V0G0N" + [Ctb][Xilinx_Ctb] Set the list of signal names for this board. )V0G0N" << std::endl; return os.str(); } @@ -12828,6 +12906,8 @@ std::string Caller::signallist(int action) { } if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; } } @@ -12848,8 +12928,10 @@ std::string Caller::signallist(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 0) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -12861,12 +12943,14 @@ std::string Caller::signallist(int action) { } if (action == slsDetectorDefs::PUT_ACTION) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } - if (cmd == "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (cmd == "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError("This detector already has fixed dac names. " "Cannot change them."); } @@ -12887,7 +12971,7 @@ std::string Caller::signalname(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: signalname" << std::endl; os << R"V0G0N([0-63][name] - [ChipTestBoard] Set the signal at the given position to the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Set the signal at the given position to the given name. )V0G0N" << std::endl; return os.str(); } @@ -12932,7 +13016,10 @@ std::string Caller::signalname(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -12946,7 +13033,10 @@ std::string Caller::signalname(int action) { if (action == slsDetectorDefs::PUT_ACTION) { if (args.size() == 2) { - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -12968,7 +13058,7 @@ std::string Caller::slowadcindex(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: slowadcindex" << std::endl; os << R"V0G0N([name] - [ChipTestBoard] Get the slowadc index for the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Get the slowadc index for the given name. )V0G0N" << std::endl; return os.str(); } @@ -12995,7 +13085,10 @@ std::string Caller::slowadcindex(int action) { if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { defs::dacIndex index = defs::SLOW_ADC0; - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -13017,7 +13110,7 @@ std::string Caller::slowadclist(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: slowadclist" << std::endl; os << R"V0G0N([slowadcname1 slowadcname2 .. slowadcname7] - [ChipTestBoard] Set the list of slowadc names for this board. )V0G0N" + [Ctb][Xilinx_Ctb] Set the list of slowadc names for this board. )V0G0N" << std::endl; return os.str(); } @@ -13029,6 +13122,8 @@ std::string Caller::slowadclist(int action) { } if (args.size() == 0) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; } } @@ -13049,8 +13144,10 @@ std::string Caller::slowadclist(int action) { // generate code for each action if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 0) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -13063,12 +13160,14 @@ std::string Caller::slowadclist(int action) { } if (action == slsDetectorDefs::PUT_ACTION) { - if (cmd != "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + ; + if (cmd != "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } - if (cmd == "daclist" && - det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (cmd == "daclist" && det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError("This detector already has fixed dac names. " "Cannot change them."); } @@ -13089,7 +13188,7 @@ std::string Caller::slowadcname(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: slowadcname" << std::endl; os << R"V0G0N([0-7][name] - [ChipTestBoard] Set the slowadc at the given position to the given name. )V0G0N" + [Ctb][Xilinx_Ctb] Set the slowadc at the given position to the given name. )V0G0N" << std::endl; return os.str(); } @@ -13127,7 +13226,10 @@ std::string Caller::slowadcname(int action) { if (action == slsDetectorDefs::GET_ACTION) { if (args.size() == 1) { defs::dacIndex index = defs::SLOW_ADC0; - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -13143,7 +13245,10 @@ std::string Caller::slowadcname(int action) { if (action == slsDetectorDefs::PUT_ACTION) { if (args.size() == 2) { defs::dacIndex index = defs::SLOW_ADC0; - if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) { + if (det->getDetectorType().squash(defs::GENERIC) != + defs::CHIPTESTBOARD && + det->getDetectorType().squash(defs::GENERIC) != + defs::XILINX_CHIPTESTBOARD) { throw RuntimeError(cmd + " only allowed for CTB."); } if (det_id != -1) { @@ -13167,7 +13272,7 @@ std::string Caller::slowadcvalues(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: slowadcvalues" << std::endl; os << R"V0G0N([name] - [ChipTestBoard] Get values of all slow adcs. )V0G0N" + [Ctb][Xilinx_Ctb] Get values of all slow adcs. )V0G0N" << std::endl; return os.str(); } @@ -15029,7 +15134,7 @@ std::string Caller::triggersl(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: triggersl" << std::endl; os << R"V0G0N( - [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of triggers left in acquisition. Only when external trigger used. )V0G0N" + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of triggers left in acquisition. Only when external trigger used. )V0G0N" << std::endl; return os.str(); } @@ -15189,7 +15294,7 @@ std::string Caller::tsamples(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: tsamples" << std::endl; os << R"V0G0N([n_value] - [CTB] Number of transceiver samples expected. )V0G0N" + [Ctb] Number of transceiver samples expected. )V0G0N" << std::endl; return os.str(); } @@ -15519,7 +15624,7 @@ std::string Caller::type(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: type" << std::endl; os << R"V0G0N( - Returns detector type. Can be Eiger, Jungfrau, Gotthard, Moench, Mythen3, Gotthard2, ChipTestBoard )V0G0N" + Returns detector type. Can be Eiger, Jungfrau, Gotthard, Moench, Mythen3, Gotthard2, ChipTestBoard, Xilinx_ChipTestBoard )V0G0N" << std::endl; return os.str(); } @@ -16227,7 +16332,7 @@ std::string Caller::update(int action) { os << "Command: update" << std::endl; os << R"V0G0N( Without tftp: [server_name (incl fullpath)] [fname.pof (incl full path)] This does not use tftp. - [Jungfrau][Moench][Gotthard][CTB] Updates the firmware, detector server, deletes old server, creates the symbolic link and then reboots detector controller. + [Jungfrau][Moench][Gotthard][Ctb] Updates the firmware, detector server, deletes old server, creates the symbolic link and then reboots detector controller. [Mythen3][Gotthard2] will require a script to start up the shorter named server link at start up. server_name is full path name of detector server binary fname is full path of programming file )V0G0N" diff --git a/slsDetectorSoftware/src/CallerSpecial.cpp b/slsDetectorSoftware/src/CallerSpecial.cpp index c64314f8e..dfd5a0d68 100644 --- a/slsDetectorSoftware/src/CallerSpecial.cpp +++ b/slsDetectorSoftware/src/CallerSpecial.cpp @@ -850,7 +850,8 @@ std::string Caller::counters(int action) { std::string Caller::samples(int action) { std::ostringstream os; if (action == defs::HELP_ACTION) { - os << "[n_samples]\n\t[CTB] Number of samples (analog, digitial and " + os << "[n_samples]\n\t[Ctb][Xilinx_Ctb] Number of samples (analog, " + "digitial and " "transceiver) expected.\n" << '\n'; } else if (action == defs::GET_ACTION) { @@ -859,7 +860,9 @@ std::string Caller::samples(int action) { } auto a = det->getNumberOfAnalogSamples(std::vector{det_id}); // get also digital samples for ctb and compare with analog - if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { auto d = det->getNumberOfDigitalSamples(std::vector{det_id}); auto t = det->getNumberOfTransceiverSamples(std::vector{det_id}); @@ -880,7 +883,9 @@ std::string Caller::samples(int action) { det->setNumberOfAnalogSamples(StringTo(args[0]), std::vector{det_id}); // set also digital samples for ctb - if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + auto det_type = det->getDetectorType().squash(defs::GENERIC); + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { det->setNumberOfDigitalSamples(StringTo(args[0]), std::vector{det_id}); det->setNumberOfTransceiverSamples(StringTo(args[0]), diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 4a25c0d87..bc7d138cb 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -208,6 +208,7 @@ std::vector Detector::getSettingsList() const { defs::G2_LOWCAP_HIGHGAIN, defs::G2_LOWCAP_LOWGAIN, defs::G4_HIGHGAIN, defs::G4_LOWGAIN}; case defs::CHIPTESTBOARD: + case defs::XILINX_CHIPTESTBOARD: throw RuntimeError("Settings not implemented for this detector"); default: throw RuntimeError("Unknown detector type"); @@ -652,6 +653,7 @@ std::vector Detector::getTemperatureList() const { std::vector retval; switch (getDetectorType().squash()) { case defs::CHIPTESTBOARD: + case defs::XILINX_CHIPTESTBOARD: return std::vector{defs::SLOW_ADC_TEMP}; case defs::JUNGFRAU: case defs::MOENCH: @@ -743,6 +745,7 @@ std::vector Detector::getDacList() const { defs::VBP_COLBUF, defs::VIPRE, defs::VIN_CM, defs::VB_SDA, defs::VCASC_SFP, defs::VOUT_CM, defs::VIPRE_CDS, defs::IBIAS_SFP}; case defs::CHIPTESTBOARD: + case defs::XILINX_CHIPTESTBOARD: for (int i = 0; i != 18; ++i) { retval.push_back(static_cast(i)); } @@ -905,7 +908,8 @@ void Detector::stopDetector(Positions pos) { case defs::EIGER: case defs::JUNGFRAU: case defs::MOENCH: - case defs::CHIPTESTBOARD: { + case defs::CHIPTESTBOARD: + case defs::XILINX_CHIPTESTBOARD: { auto res = getNextFrameNumber(pos); if (!res.equal()) { uint64_t maxVal = 0; @@ -2079,7 +2083,9 @@ Result Detector::getSYNCClock(Positions pos) const { } std::vector Detector::getPowerList() const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && + dettype != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError("Power list not implemented for this detector"); } return std::vector{defs::V_POWER_A, defs::V_POWER_B, @@ -2088,7 +2094,9 @@ std::vector Detector::getPowerList() const { } std::vector Detector::getSlowADCList() const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) { + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && + dettype != defs::XILINX_CHIPTESTBOARD) { throw RuntimeError("Slow ADC list not implemented for this detector"); } return std::vector{ @@ -2277,7 +2285,8 @@ void Detector::setLEDEnable(bool enable, Positions pos) { } void Detector::setDacNames(const std::vector names) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named dacs only for CTB"); pimpl->setCtbDacNames(names); } @@ -2285,7 +2294,7 @@ void Detector::setDacNames(const std::vector names) { std::vector Detector::getDacNames() const { std::vector names; auto type = getDetectorType().squash(); - if (type == defs::CHIPTESTBOARD) + if (type == defs::CHIPTESTBOARD || type == defs::XILINX_CHIPTESTBOARD) return pimpl->getCtbDacNames(); for (const auto &index : getDacList()) @@ -2295,7 +2304,7 @@ std::vector Detector::getDacNames() const { defs::dacIndex Detector::getDacIndex(const std::string &name) const { auto type = getDetectorType().squash(); - if (type == defs::CHIPTESTBOARD) { + if (type == defs::CHIPTESTBOARD || type == defs::XILINX_CHIPTESTBOARD) { auto names = getDacNames(); auto it = std::find(names.begin(), names.end(), name); if (it == names.end()) @@ -2306,32 +2315,36 @@ defs::dacIndex Detector::getDacIndex(const std::string &name) const { } void Detector::setDacName(const defs::dacIndex i, const std::string &name) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named dacs only for CTB"); pimpl->setCtbDacName(i, name); } std::string Detector::getDacName(const defs::dacIndex i) const { - auto type = getDetectorType().squash(); - if (type == defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype == defs::CHIPTESTBOARD || dettype == defs::XILINX_CHIPTESTBOARD) return pimpl->getCtbDacName(i); return ToString(i); } void Detector::setAdcNames(const std::vector names) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named adcs only for CTB"); pimpl->setCtbAdcNames(names); } std::vector Detector::getAdcNames() const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named adcs only for CTB"); return pimpl->getCtbAdcNames(); } int Detector::getAdcIndex(const std::string &name) const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named adcs only for CTB"); auto names = getAdcNames(); auto it = std::find(names.begin(), names.end(), name); @@ -2341,31 +2354,36 @@ int Detector::getAdcIndex(const std::string &name) const { } void Detector::setAdcName(const int index, const std::string &name) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named adcs only for CTB"); pimpl->setCtbAdcName(index, name); } std::string Detector::getAdcName(const int i) const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named adcs only for CTB"); return pimpl->getCtbAdcName(i); } void Detector::setSignalNames(const std::vector names) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named signals only for CTB"); pimpl->setCtbSignalNames(names); } std::vector Detector::getSignalNames() const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named signals only for CTB"); return pimpl->getCtbSignalNames(); } int Detector::getSignalIndex(const std::string &name) const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named signals only for CTB"); auto names = getSignalNames(); auto it = std::find(names.begin(), names.end(), name); @@ -2375,31 +2393,37 @@ int Detector::getSignalIndex(const std::string &name) const { } void Detector::setSignalName(const int index, const std::string &name) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named signals only for CTB"); pimpl->setCtbSignalName(index, name); } std::string Detector::getSignalName(const int i) const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named signals only for CTB"); return pimpl->getCtbSignalName(i); } void Detector::setPowerNames(const std::vector names) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (getDetectorType().squash() != defs::CHIPTESTBOARD && + dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named powers only for CTB"); pimpl->setCtbPowerNames(names); } std::vector Detector::getPowerNames() const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named powers only for CTB"); return pimpl->getCtbPowerNames(); } defs::dacIndex Detector::getPowerIndex(const std::string &name) const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named powers only for CTB"); auto names = getPowerNames(); auto it = std::find(names.begin(), names.end(), name); @@ -2410,31 +2434,36 @@ defs::dacIndex Detector::getPowerIndex(const std::string &name) const { void Detector::setPowerName(const defs::dacIndex index, const std::string &name) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named powers only for CTB"); pimpl->setCtbPowerName(index, name); } std::string Detector::getPowerName(const defs::dacIndex i) const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named powers only for CTB"); return pimpl->getCtbPowerName(i); } void Detector::setSlowADCNames(const std::vector names) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named SlowADCs only for CTB"); pimpl->setCtbSlowADCNames(names); } std::vector Detector::getSlowADCNames() const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named SlowADCs only for CTB"); return pimpl->getCtbSlowADCNames(); } defs::dacIndex Detector::getSlowADCIndex(const std::string &name) const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named SlowADCs only for CTB"); auto names = getSlowADCNames(); auto it = std::find(names.begin(), names.end(), name); @@ -2445,13 +2474,15 @@ defs::dacIndex Detector::getSlowADCIndex(const std::string &name) const { void Detector::setSlowADCName(const defs::dacIndex index, const std::string &name) { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named SlowADCs only for CTB"); pimpl->setCtbSlowADCName(index, name); } std::string Detector::getSlowADCName(const defs::dacIndex i) const { - if (getDetectorType().squash() != defs::CHIPTESTBOARD) + auto dettype = getDetectorType().squash(); + if (dettype != defs::CHIPTESTBOARD && dettype != defs::XILINX_CHIPTESTBOARD) throw RuntimeError("Named SlowADCs only for CTB"); return pimpl->getCtbSlowADCName(i); } diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index c40c163fc..a44bbadec 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -272,7 +272,8 @@ void DetectorImpl::setHostname(const std::vector &name) { // Here we know the detector type and can add ctb shared memory // if needed, CTB dac names are only on detector level - if (shm()->detType == defs::CHIPTESTBOARD) { + if (shm()->detType == defs::CHIPTESTBOARD || + shm()->detType == defs::XILINX_CHIPTESTBOARD) { if (ctb_shm.exists()) ctb_shm.openSharedMemory(true); else @@ -711,7 +712,8 @@ void DetectorImpl::readFrameFromReceiver() { uint32_t yoffset = coordY * nPixelsY; uint32_t singledetrowoffset = nPixelsX * bytesPerPixel; uint32_t rowoffset = nX * singledetrowoffset; - if (shm()->detType == CHIPTESTBOARD) { + if (shm()->detType == CHIPTESTBOARD || + shm()->detType == defs::XILINX_CHIPTESTBOARD) { singledetrowoffset = size; } LOG(logDEBUG1) @@ -1735,7 +1737,8 @@ void DetectorImpl::verifyUniqueHost( } defs::ROI DetectorImpl::getRxROI() const { - if (shm()->detType == CHIPTESTBOARD) { + if (shm()->detType == CHIPTESTBOARD || + shm()->detType == defs::XILINX_CHIPTESTBOARD) { throw RuntimeError("RxRoi not implemented for this Detector"); } if (modules.size() == 0) { @@ -1810,7 +1813,8 @@ defs::ROI DetectorImpl::getRxROI() const { } void DetectorImpl::setRxROI(const defs::ROI arg) { - if (shm()->detType == CHIPTESTBOARD) { + if (shm()->detType == CHIPTESTBOARD || + shm()->detType == defs::XILINX_CHIPTESTBOARD) { throw RuntimeError("RxRoi not implemented for this Detector"); } if (modules.size() == 0) { diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 33603c6ea..0f8596036 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -184,7 +184,8 @@ slsDetectorDefs::detectorType Module::getDetectorType() const { } void Module::updateNumberOfChannels() { - if (shm()->detType == CHIPTESTBOARD) { + if (shm()->detType == CHIPTESTBOARD || + shm()->detType == XILINX_CHIPTESTBOARD) { std::array retvals{}; sendToDetector(F_GET_NUM_CHANNELS, nullptr, retvals); shm()->nChan.x = retvals[0]; @@ -2461,7 +2462,8 @@ void Module::setReadoutMode(const slsDetectorDefs::readoutMode mode) { sendToDetector(F_SET_READOUT_MODE, arg, nullptr); sendToDetectorStop(F_SET_READOUT_MODE, arg, nullptr); // update #nchan, as it depends on #samples, adcmask, - if (shm()->detType == CHIPTESTBOARD) { + if (shm()->detType == CHIPTESTBOARD || + shm()->detType == XILINX_CHIPTESTBOARD) { updateNumberOfChannels(); } if (shm()->useReceiverFlag) { @@ -3407,6 +3409,8 @@ const std::string Module::getDetectorAPI() const { return APIMYTHEN3; case GOTTHARD2: return APIGOTTHARD2; + case XILINX_CHIPTESTBOARD: + return APIXILINXCTB; default: throw NotImplementedError( "Detector type not implemented to get Detector API"); diff --git a/slsSupportLib/include/sls/sls_detector_defs.h b/slsSupportLib/include/sls/sls_detector_defs.h index a90890a90..d7eafd5fd 100644 --- a/slsSupportLib/include/sls/sls_detector_defs.h +++ b/slsSupportLib/include/sls/sls_detector_defs.h @@ -96,6 +96,7 @@ class slsDetectorDefs { MOENCH, MYTHEN3, GOTTHARD2, + XILINX_CHIPTESTBOARD }; /** return values */ @@ -683,6 +684,7 @@ struct detParameters { nChipY = 2; nDacs = 8; break; + case slsDetectorDefs::detectorType::XILINX_CHIPTESTBOARD: case slsDetectorDefs::detectorType::CHIPTESTBOARD: nChanX = 36; nChanY = 1; diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index fdf00d6e8..fbb726e37 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -4,10 +4,11 @@ #define RELEASE "developer" #define APILIB "developer 0x230224" #define APIRECEIVER "developer 0x230224" -#define APICTB "developer 0x231109" -#define APIGOTTHARD "developer 0x231109" -#define APIGOTTHARD2 "developer 0x231109" -#define APIJUNGFRAU "developer 0x231109" -#define APIMYTHEN3 "developer 0x231109" -#define APIEIGER "developer 0x231109" -#define APIMOENCH "developer 0x231127" +#define APIXILINXCTB "developer 0x240104" +#define APICTB "developer 0x240104" +#define APIGOTTHARD "developer 0x240104" +#define APIGOTTHARD2 "developer 0x240104" +#define APIJUNGFRAU "developer 0x240104" +#define APIMYTHEN3 "developer 0x240104" +#define APIMOENCH "developer 0x240104" +#define APIEIGER "developer 0x240104" diff --git a/slsSupportLib/src/ToString.cpp b/slsSupportLib/src/ToString.cpp index 66206fe16..fa8541ce9 100644 --- a/slsSupportLib/src/ToString.cpp +++ b/slsSupportLib/src/ToString.cpp @@ -207,6 +207,8 @@ std::string ToString(const defs::detectorType s) { return std::string("Mythen3"); case defs::GOTTHARD2: return std::string("Gotthard2"); + case defs::XILINX_CHIPTESTBOARD: + return std::string("Xilinx_ChipTestBoard"); default: return std::string("Unknown"); } @@ -694,6 +696,8 @@ template <> defs::detectorType StringTo(const std::string &s) { return defs::MYTHEN3; if (s == "Gotthard2") return defs::GOTTHARD2; + if (s == "Xilinx_ChipTestBoard") + return defs::XILINX_CHIPTESTBOARD; throw RuntimeError("Unknown detector type " + s); } diff --git a/slsSupportLib/tests/test-ToString.cpp b/slsSupportLib/tests/test-ToString.cpp index 56b591eba..5018a77ea 100644 --- a/slsSupportLib/tests/test-ToString.cpp +++ b/slsSupportLib/tests/test-ToString.cpp @@ -136,6 +136,7 @@ TEST_CASE("string to detectorType") { REQUIRE(StringTo
      ("Moench") == dt::MOENCH); REQUIRE(StringTo
      ("Mythen3") == dt::MYTHEN3); REQUIRE(StringTo
      ("Gotthard2") == dt::GOTTHARD2); + REQUIRE(StringTo
      ("Xilinx_ChipTestBoard") == dt::XILINX_CHIPTESTBOARD); } TEST_CASE("vec") { From 9a08ecc5a58301c3fa6f2826bbef90bf92d8e65e Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 10 Jan 2024 16:23:52 +0100 Subject: [PATCH 27/38] Xilinx client tests (#887) * implemented testbus, testfpga, set/get #frames, triggers, allowed that and for connection to client, also allowed, getnumchannels, configuremac, getrunstatus, setdetectorposition with dummy values * allowing tests for xilinx * binaries in --- .../bin/ctbDetectorServer_developer | Bin 328424 -> 328424 bytes .../bin/eigerDetectorServer_developer | Bin 444195 -> 444195 bytes .../bin/gotthard2DetectorServer_developer | Bin 286768 -> 286768 bytes .../bin/gotthardDetectorServer_developer | Bin 277364 -> 277364 bytes .../bin/jungfrauDetectorServer_developer | Bin 312616 -> 312616 bytes .../bin/moenchDetectorServer_developer | Bin 295380 -> 295380 bytes .../bin/mythen3DetectorServer_developer | Bin 300752 -> 300752 bytes .../slsDetectorServer/include/arm64.h | 6 +- .../include/slsDetectorFunctionList.h | 14 +- .../src/slsDetectorServer_funcs.c | 32 +- .../bin/xilinx_ctbDetectorServer_developer | Bin 231752 -> 232088 bytes .../slsDetectorFunctionList.c | 194 ++- .../slsDetectorServer_defs.h | 5 + slsDetectorSoftware/src/Detector.cpp | 1 - .../Caller/test-Caller-chiptestboard.cpp | 37 +- .../tests/Caller/test-Caller-rx.cpp | 1497 +++++++++-------- .../tests/Caller/test-Caller.cpp | 1205 +++++++------ slsSupportLib/include/sls/versionAPI.h | 16 +- tests/scripts/test_simulators.py | 5 +- 19 files changed, 1720 insertions(+), 1292 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 0389e28a7b3f1e65a899258bae9d82b9e5fd5357..2e08e740bd4cb9cea7585082237fbcc032ba2172 100755 GIT binary patch delta 50 zcmaFSD)ORLWP&F1Ts?#7g%T_hjV`S&jIAzATV0qLgBUHhy9F`FOEOxvFUw}$zAT%? GX*vL@!Vnz* delta 50 zcmaFSD)ORLWP&F1w5$847fP^5G`h69Ft)ldZFOO03}Q6d?iR!xFUe@qzAT%0`?72n Gr|AIK?h!%& diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 55d73d6b48dae331cca5cc28cd5c4d6718ebfb48..fb03bc42d2a64261660ba5e2a2be8c548d90b0ec 100755 GIT binary patch delta 41 vcmZ47C%w2&x}k-!g{g&k3(H?VM$7I0_*lBb87 delta 41 vcmZ47C%w2&x}k-!g{g&k3(H?VMw9LT_*lBb8BN-|(pZ3)b$eGD+sp(2Kxz*j diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index b1ddbb69c5977f3798d6e71e194335d6a7fb0c01..f135ab12f3340247bacad2223b798f7a93ea756b 100755 GIT binary patch delta 37 scmdmRKyU*P8D3}dIoE7_z1{da<96fgOv|JgE!%H>WZHh~BXd|D089Z9Pyhe` delta 37 scmdmRKyU*P8D3}NIooV}z1{da<96fgOv|JgP1;5RfSYoh~t#F>(VKfkcHw0kuQ|-O&L#w<6L4rxgJ?hsx&yx60=O Fs#Doz6S)8Y delta 47 zcmV+~0MP&R_7L>;5RfSYmes(QF>(VKfkcHw0kuQ|-O&Lww<6L4rxgJ-hsx&yx60=O Fs#63L6y5*; diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index dbf4172f509cba83d72310d212642e858db82432..5e2a3ec150e7fc8684c4968ffd965c38c20db25b 100755 GIT binary patch delta 50 zcmZ3{CA^|bc!DPLTs`CIiO-oO8eLjl7+YPKwz@DsRb#Z=uBFbLEzfA#KFy7J`!qL} GNp%3YZxFTs delta 50 zcmV-20L}lXiW8`c6Obtbmes3#o?-sR6eOsRGJ)0Xc`(Ap^J8Aq4t#FY^zY delta 37 vcmV+=0NVf1trF0!60ixW0u0TA3#o?-sR6eOsRGJ)0W^o!Ap^J8Aq4t#DB=%P diff --git a/slsDetectorServers/slsDetectorServer/include/arm64.h b/slsDetectorServers/slsDetectorServer/include/arm64.h index f095790e0..06e8f7b26 100644 --- a/slsDetectorServers/slsDetectorServer/include/arm64.h +++ b/slsDetectorServers/slsDetectorServer/include/arm64.h @@ -5,6 +5,8 @@ #include #include -int mapCSP0(void); void bus_w(u_int32_t offset, u_int32_t data); -u_int32_t bus_r(u_int32_t offset); \ No newline at end of file +u_int32_t bus_r(u_int32_t offset); +uint64_t getU64BitReg(int aLSB, int aMSB); +void setU64BitReg(uint64_t value, int aLSB, int aMSB); +int mapCSP0(void); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 6b3b43cb3..6c0a8fad5 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -65,10 +65,8 @@ typedef struct udpStruct_s { int isInitCheckDone(); int getInitResult(char **mess); void basictests(); +#if !defined(EIGERD) int checkType(); - -#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ - defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int testFpga(); int testBus(); #endif @@ -251,11 +249,11 @@ int getMaxStoragecellStart(); int setNextFrameNumber(uint64_t value); int getNextFrameNumber(uint64_t *value); #endif -#ifndef XILINX_CHIPTESTBOARDD void setNumFrames(int64_t val); int64_t getNumFrames(); void setNumTriggers(int64_t val); int64_t getNumTriggers(); +#ifndef XILINX_CHIPTESTBOARDD #ifndef MYTHEN3D int setExpTime(int64_t val); int64_t getExpTime(); @@ -501,9 +499,7 @@ void calcChecksum(udp_header *udp); int getAdcConfigured(); #endif -#ifndef XILINX_CHIPTESTBOARDD int configureMAC(); -#endif int setDetectorPosition(int pos[]); int *getDetectorPosition(); @@ -715,9 +711,7 @@ int softwareTrigger(int block); #if defined(EIGERD) || defined(MYTHEN3D) || defined(CHIPTESTBOARDD) int startReadOut(); #endif -#ifndef XILINX_CHIPTESTBOARDD enum runStatus getRunStatus(); -#endif #ifdef EIGERD void waitForAcquisitionEnd(int *ret, char *mess); #else @@ -748,9 +742,11 @@ u_int32_t runState(enum TLogLevel lev); #ifndef XILINX_CHIPTESTBOARDD int calculateDataBytes(); int getTotalNumberOfChannels(); -#if defined(CHIPTESTBOARDD) +#endif +#if defined(CHIPTESTBOARDD) || defined (XILINX_CHIPTESTBOARDD) void getNumberOfChannels(int *nchanx, int *nchany); #endif +#ifndef XILINX_CHIPTESTBOARDD int getNumberOfChips(); int getNumberOfDACs(); int getNumberOfChannelsPerChip(); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 80520a0ca..5256a3490 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -2219,9 +2219,6 @@ int get_num_frames(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#ifdef XILINX_CHIPTESTBOARDD - functionNotImplemented(); -#else // get only if (!scan) { retval = getNumFrames(); @@ -2231,7 +2228,6 @@ int get_num_frames(int file_des) { LOG(logDEBUG1, ("retval num frames (num scan steps) %lld\n", (long long int)retval)); } -#endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -2244,9 +2240,6 @@ int set_num_frames(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting number of frames %lld\n", (long long int)arg)); -#ifdef XILINX_CHIPTESTBOARDD - functionNotImplemented(); -#else // only set if (Server_VerifyLock() == OK) { // only set number of frames if normal mode (not scan) @@ -2292,7 +2285,6 @@ int set_num_frames(int file_des) { } } } -#endif return Server_SendResult(file_des, INT64, NULL, 0); } @@ -2301,13 +2293,9 @@ int get_num_triggers(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#ifdef XILINX_CHIPTESTBOARDD - functionNotImplemented(); -#else // get only retval = getNumTriggers(); LOG(logDEBUG1, ("retval num triggers %lld\n", (long long int)retval)); -#endif return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -2320,9 +2308,6 @@ int set_num_triggers(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting number of triggers %lld\n", (long long int)arg)); -#ifdef XILINX_CHIPTESTBOARDD - functionNotImplemented(); -#else // only set if (Server_VerifyLock() == OK) { #if JUNGFRAUD @@ -2342,7 +2327,6 @@ int set_num_triggers(int file_des) { validate64(&ret, mess, arg, retval, "set number of triggers", DEC); } } -#endif return Server_SendResult(file_des, INT64, NULL, 0); } @@ -3622,7 +3606,7 @@ int write_adc_register(int file_des) { uint32_t val = args[1]; LOG(logDEBUG1, ("Writing 0x%x to ADC Register 0x%x\n", val, addr)); -#if defined(EIGERD) || defined(GOTTHARD2D) || defined(MYTHEN3D) +#if defined(EIGERD) || defined(GOTTHARD2D) || defined(MYTHEN3D) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else #ifndef VIRTUAL @@ -4017,7 +4001,7 @@ int reset_fpga(int file_des) { LOG(logDEBUG1, ("Reset FPGA\n")); #if defined(EIGERD) || defined(GOTTHARDD) || defined(GOTTHARD2D) || \ - defined(MYTHEN3D) + defined(MYTHEN3D) || defined (XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // only set @@ -5026,9 +5010,6 @@ int set_detector_position(int file_des) { LOG(logDEBUG, ("Setting detector positions: [maxy:%u, modIndex:%u]\n", args[0], args[1])); -#ifdef XILINX_CHIPTESTBOARDD - functionNotImplemented(); -#else // only set if (Server_VerifyLock() == OK) { // if in update mode, there is no need to do this (also detector not set @@ -5039,14 +5020,10 @@ int set_detector_position(int file_des) { calculate_and_set_position(); } } -#endif return Server_SendResult(file_des, INT32, NULL, 0); } int check_detector_idle(const char *s) { -#ifdef XILINX_CHIPTESTBOARDD - return FAIL; -#else enum runStatus status = getRunStatus(); if (status != IDLE && status != RUN_FINISHED && status != STOPPED && status != ERROR) { @@ -5058,7 +5035,6 @@ int check_detector_idle(const char *s) { LOG(logERROR, (mess)); } return ret; -#endif } int is_udp_configured() { @@ -5125,7 +5101,6 @@ int is_udp_configured() { } void configure_mac() { -#ifndef XILINX_CHIPTESTBOARDD if (isControlServer) { if (is_udp_configured() == OK) { ret = configureMAC(); @@ -5152,7 +5127,6 @@ void configure_mac() { } configured = FAIL; LOG(logWARNING, ("Configure FAIL, not all parameters configured yet\n")); -#endif } int set_source_udp_ip(int file_des) { @@ -7105,7 +7079,7 @@ int get_num_channels(int file_des) { LOG(logDEBUG1, ("Getting number of channels\n")); -#if !defined(CHIPTESTBOARDD) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // get only diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer index cdf9b7c45727680214b13cf9c0450510f1642dfb..c50684e34a42f1c07c4cc35e4be73ad49b4c1199 100755 GIT binary patch delta 63201 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 AQvd(} delta 59023 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 0) { + LOG(logINFO, ("Setting number of frames %ld\n", val)); + setU64BitReg(val, FRAMESINREG1, FRAMESINREG2); + } +} + +int64_t getNumFrames() { return getU64BitReg(FRAMESINREG1, FRAMESINREG2); } + +void setNumTriggers(int64_t val) { + if (val > 0) { + LOG(logINFO, ("Setting number of triggers %ld\n", val)); + setU64BitReg(val, CYCLESINREG1, CYCLESINREG2); + } +} + +int64_t getNumTriggers() { return getU64BitReg(CYCLESINREG1, CYCLESINREG2); } + int setDetectorPosition(int pos[]) { memcpy(detPos, pos, sizeof(detPos)); + // TODO + return OK; +} + +int configureMAC() { + // TODO + LOG(logINFO, ("Configuring MAC\n")); return OK; } int *getDetectorPosition() { return detPos; } -int getNumberofUDPInterfaces() { return 1; } \ No newline at end of file +int getNumberofUDPInterfaces() { return 1; } + +/* aquisition */ + +enum runStatus getRunStatus() { + LOG(logDEBUG1, ("Getting status\n")); + // scan error or running + if (sharedMemory_getScanStatus() == ERROR) { + LOG(logINFOBLUE, ("Status: scan ERROR\n")); + return ERROR; + } + if (sharedMemory_getScanStatus() == RUNNING) { + LOG(logINFOBLUE, ("Status: scan RUNNING\n")); + return RUNNING; + } +#ifdef VIRTUAL + if (sharedMemory_getStatus() == RUNNING) { + LOG(logINFOBLUE, ("Status: RUNNING\n")); + return RUNNING; + } + LOG(logINFOBLUE, ("Status: IDLE\n")); + return IDLE; +#endif + //TODO: get status + LOG(logINFOBLUE, ("Status: IDLE\n")); + return IDLE; +} + +void getNumberOfChannels(int *nchanx, int *nchany) { + // TODO + *nchanx = NCHAN; + *nchany = 1; +} \ No newline at end of file diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h index edb3c32b9..391a4b327 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h @@ -16,3 +16,8 @@ enum ADCINDEX { V_PWR_IO }; enum DACINDEX { D0 }; + + +/** Default Parameters */ +#define DEFAULT_NUM_FRAMES (1) +#define DEFAULT_NUM_CYCLES (1) diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index bc7d138cb..0473c3c9a 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -653,7 +653,6 @@ std::vector Detector::getTemperatureList() const { std::vector retval; switch (getDetectorType().squash()) { case defs::CHIPTESTBOARD: - case defs::XILINX_CHIPTESTBOARD: return std::vector{defs::SLOW_ADC_TEMP}; case defs::JUNGFRAU: case defs::MOENCH: diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp index bcdc91af4..fa4c278f6 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp @@ -24,7 +24,7 @@ TEST_CASE("CALLER::dacname", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2); std::string str_dac_index = "2"; auto prev = det.getDacName(ind); @@ -58,7 +58,7 @@ TEST_CASE("CALLER::dacindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2); std::string str_dac_index = "2"; @@ -83,7 +83,7 @@ TEST_CASE("CALLER::adclist", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { auto prev = det.getAdcNames(); REQUIRE_THROWS(caller.call("adclist", {"a", "s", "d"}, -1, PUT)); @@ -115,7 +115,7 @@ TEST_CASE("CALLER::adcname", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { int ind = 2; std::string str_adc_index = "2"; auto prev = det.getAdcName(ind); @@ -149,7 +149,7 @@ TEST_CASE("CALLER::adcindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { int ind = 2; std::string str_adc_index = "2"; @@ -174,7 +174,7 @@ TEST_CASE("CALLER::signallist", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { auto prev = det.getSignalNames(); REQUIRE_THROWS(caller.call("signallist", {"a", "s", "d"}, -1, PUT)); @@ -206,7 +206,7 @@ TEST_CASE("CALLER::signalname", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { int ind = 2; std::string str_signal_index = "2"; auto prev = det.getSignalName(ind); @@ -240,7 +240,7 @@ TEST_CASE("CALLER::signalindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { int ind = 2; std::string str_signal_index = "2"; @@ -266,7 +266,7 @@ TEST_CASE("CALLER::powerlist", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { auto prev = det.getPowerNames(); REQUIRE_THROWS(caller.call("powerlist", {"a", "s", "d"}, -1, PUT)); @@ -298,7 +298,7 @@ TEST_CASE("CALLER::powername", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2 + defs::V_POWER_A); std::string str_power_index = "2"; auto prev = det.getPowerName(ind); @@ -332,7 +332,7 @@ TEST_CASE("CALLER::powerindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2 + defs::V_POWER_A); std::string str_power_index = "2"; @@ -382,7 +382,7 @@ TEST_CASE("CALLER::slowadclist", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { auto prev = det.getSlowADCNames(); REQUIRE_THROWS(caller.call("slowadclist", {"a", "s", "d"}, -1, PUT)); @@ -414,7 +414,7 @@ TEST_CASE("CALLER::slowadcname", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2 + defs::SLOW_ADC0); std::string str_slowadc_index = "2"; auto prev = det.getSlowADCName(ind); @@ -449,7 +449,7 @@ TEST_CASE("CALLER::slowadcindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2 + defs::SLOW_ADC0); std::string str_slowadc_index = "2"; @@ -478,12 +478,17 @@ TEST_CASE("CALLER::dac", "[.cmdcall][.dacs]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { for (int i = 0; i < 18; ++i) { SECTION("dac " + std::to_string(i)) { - test_dac_caller(static_cast(i), "dac", 0); + if (det_type == defs::CHIPTESTBOARD) { + test_dac_caller(static_cast(i), "dac", 0); + } else { + REQUIRE_THROWS(caller.call("dac", {std::to_string(i)}, -1, GET)); + } } } + // eiger // REQUIRE_THROWS(caller.call("dac", {"vthreshold"}, -1, GET)); // REQUIRE_THROWS(caller.call("dac", {"vsvp"}, -1, GET)); diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp index 195c884d9..e3429dfc2 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp @@ -27,155 +27,191 @@ python/scripts/list_tested_cmd.py to check if all commands are covered TEST_CASE("Caller::rx_version", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - std::ostringstream oss; - caller.call("rx_version", {}, -1, GET, oss); - sls::Version v(APIRECEIVER); - std::ostringstream vs; - vs << "rx_version " << v.concise() << '\n'; - REQUIRE(oss.str() == vs.str()); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + std::ostringstream oss; + caller.call("rx_version", {}, -1, GET, oss); + sls::Version v(APIRECEIVER); + std::ostringstream vs; + vs << "rx_version " << v.concise() << '\n'; + REQUIRE(oss.str() == vs.str()); - REQUIRE_THROWS(caller.call("rx_version", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("rx_version", {"0"}, -1, PUT)); + } else { + REQUIRE_THROWS(caller.call("rx_version", {}, -1, GET)); + } } /* acquisition */ TEST_CASE("Caller::rx_start", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - det.setFileWrite(false); // avoid writing or error on file creation - // PUT only command - REQUIRE_THROWS(caller.call("rx_start", {}, -1, GET)); - { - std::ostringstream oss; - caller.call("rx_start", {}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_start successful\n"); - } - { - std::ostringstream oss; - caller.call("rx_status", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_status running\n"); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + det.setFileWrite(false); // avoid writing or error on file creation + // PUT only command + REQUIRE_THROWS(caller.call("rx_start", {}, -1, GET)); + { + std::ostringstream oss; + caller.call("rx_start", {}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_start successful\n"); + } + { + std::ostringstream oss; + caller.call("rx_status", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_status running\n"); + } + } else { + REQUIRE_THROWS(caller.call("rx_start", {}, -1, GET)); } } TEST_CASE("Caller::rx_stop", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - // PUT only command - REQUIRE_THROWS(caller.call("rx_stop", {}, -1, GET)); - { - std::ostringstream oss; - caller.call("rx_stop", {}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_stop successful\n"); - } - { - std::ostringstream oss; - caller.call("rx_status", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_status idle\n"); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + // PUT only command + REQUIRE_THROWS(caller.call("rx_stop", {}, -1, GET)); + { + std::ostringstream oss; + caller.call("rx_stop", {}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_stop successful\n"); + } + { + std::ostringstream oss; + caller.call("rx_status", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_status idle\n"); + } + } else { + REQUIRE_THROWS(caller.call("rx_stop", {}, -1, GET)); } } TEST_CASE("Caller::rx_status", "[.cmdcall][.rx]") { Detector det; - det.setFileWrite(false); // avoid writing or error on file creation Caller caller(&det); - det.startReceiver(); - { - std::ostringstream oss; - caller.call("rx_status", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_status running\n"); - } - det.stopReceiver(); - { - std::ostringstream oss; - caller.call("rx_status", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_status idle\n"); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + det.setFileWrite(false); // avoid writing or error on file creation + Caller caller(&det); + det.startReceiver(); + { + std::ostringstream oss; + caller.call("rx_status", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_status running\n"); + } + det.stopReceiver(); + { + std::ostringstream oss; + caller.call("rx_status", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_status idle\n"); + } + } else { + REQUIRE_THROWS(caller.call("rx_status", {}, -1, GET)); } } TEST_CASE("Caller::rx_framescaught", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - - // This ensures 0 caught frames - auto prev_val = det.getFileWrite(); - det.setFileWrite(false); // avoid writing or error on file creation - det.startReceiver(); - det.stopReceiver(); - { - std::ostringstream oss; - caller.call("rx_framescaught", {}, -1, GET, oss); - if (det.getNumberofUDPInterfaces().tsquash( - "inconsistent number of interfaces") == 1) { - REQUIRE(oss.str() == "rx_framescaught [0]\n"); - } else { - REQUIRE(oss.str() == "rx_framescaught [0, 0]\n"); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + // This ensures 0 caught frames + auto prev_val = det.getFileWrite(); + det.setFileWrite(false); // avoid writing or error on file creation + det.startReceiver(); + det.stopReceiver(); + { + std::ostringstream oss; + caller.call("rx_framescaught", {}, -1, GET, oss); + if (det.getNumberofUDPInterfaces().tsquash( + "inconsistent number of interfaces") == 1) { + REQUIRE(oss.str() == "rx_framescaught [0]\n"); + } else { + REQUIRE(oss.str() == "rx_framescaught [0, 0]\n"); + } } - } - // Currently disabled may activate if we have a stable env - // Now take one frame and see that we caught it - // det.setNumberOfFrames(1); - // det.acquire(); - // { - // std::ostringstream oss; - // caller.call("rx_framescaught", {}, -1, GET, oss); - // REQUIRE(oss.str() == "rx_framescaught 1\n"); - // } + // Currently disabled may activate if we have a stable env + // Now take one frame and see that we caught it + // det.setNumberOfFrames(1); + // det.acquire(); + // { + // std::ostringstream oss; + // caller.call("rx_framescaught", {}, -1, GET, oss); + // REQUIRE(oss.str() == "rx_framescaught 1\n"); + // } - for (int i = 0; i != det.size(); ++i) { - det.setFileWrite(prev_val[i], {i}); + for (int i = 0; i != det.size(); ++i) { + det.setFileWrite(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_framescaught", {}, -1, GET)); } } TEST_CASE("Caller::rx_missingpackets", "[.cmdcall][.rx]") { Detector det; - auto prev_val = det.getFileWrite(); - det.setFileWrite(false); // avoid writing or error on file creation Caller caller(&det); - auto prev_frames = - det.getNumberOfFrames().tsquash("inconsistent #frames in test"); - det.setNumberOfFrames(100); - { - // some missing packets - det.startReceiver(); - det.stopReceiver(); - std::ostringstream oss; - caller.call("rx_missingpackets", {}, -1, GET, oss); - if (det.getNumberofUDPInterfaces().tsquash( - "inconsistent number of interfaces") == 1) { - REQUIRE(oss.str() != "rx_missingpackets [0]\n"); - } else { - REQUIRE(oss.str() != "rx_missingpackets [0, 0]\n"); - } - } auto det_type = det.getDetectorType().squash(); - if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { - // 0 missing packets (takes into account that acquisition is stopped) - det.startReceiver(); - det.startDetector(); - det.stopDetector(); - det.stopReceiver(); - std::ostringstream oss; - caller.call("rx_missingpackets", {}, -1, GET, oss); - if (det.getNumberofUDPInterfaces().tsquash( - "inconsistent number of interfaces") == 1) { - REQUIRE(oss.str() == "rx_missingpackets [0]\n"); - } else { - REQUIRE(oss.str() == "rx_missingpackets [0, 0]\n"); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getFileWrite(); + det.setFileWrite(false); // avoid writing or error on file creation + Caller caller(&det); + auto prev_frames = + det.getNumberOfFrames().tsquash("inconsistent #frames in test"); + det.setNumberOfFrames(100); + { + // some missing packets + det.startReceiver(); + det.stopReceiver(); + std::ostringstream oss; + caller.call("rx_missingpackets", {}, -1, GET, oss); + if (det.getNumberofUDPInterfaces().tsquash( + "inconsistent number of interfaces") == 1) { + REQUIRE(oss.str() != "rx_missingpackets [0]\n"); + } else { + REQUIRE(oss.str() != "rx_missingpackets [0, 0]\n"); + } } + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { + // 0 missing packets (takes into account that acquisition is stopped) + det.startReceiver(); + det.startDetector(); + det.stopDetector(); + det.stopReceiver(); + std::ostringstream oss; + caller.call("rx_missingpackets", {}, -1, GET, oss); + if (det.getNumberofUDPInterfaces().tsquash( + "inconsistent number of interfaces") == 1) { + REQUIRE(oss.str() == "rx_missingpackets [0]\n"); + } else { + REQUIRE(oss.str() == "rx_missingpackets [0, 0]\n"); + } + } + for (int i = 0; i != det.size(); ++i) { + det.setFileWrite(prev_val[i], {i}); + } + det.setNumberOfFrames(prev_frames); + } else { + REQUIRE_THROWS(caller.call("rx_missingpackets", {}, -1, GET)); } - for (int i = 0; i != det.size(); ++i) { - det.setFileWrite(prev_val[i], {i}); - } - det.setNumberOfFrames(prev_frames); } TEST_CASE("Caller::rx_frameindex", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - caller.call("rx_frameindex", {}, -1, GET); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + caller.call("rx_frameindex", {}, -1, GET); - // This is a get only command - REQUIRE_THROWS(caller.call("rx_frameindex", {"2"}, -1, PUT)); + // This is a get only command + REQUIRE_THROWS(caller.call("rx_frameindex", {"2"}, -1, PUT)); + } else { + REQUIRE_THROWS(caller.call("rx_frameindex", {}, -1, GET)); + } } /* Network Configuration (Detector<->Receiver) */ @@ -183,7 +219,12 @@ TEST_CASE("Caller::rx_frameindex", "[.cmdcall][.rx]") { TEST_CASE("Caller::rx_printconfig", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - REQUIRE_NOTHROW(caller.call("rx_printconfig", {}, -1, GET)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + REQUIRE_NOTHROW(caller.call("rx_printconfig", {}, -1, GET)); + } else { + REQUIRE_THROWS(caller.call("rx_printconfig", {}, -1, GET)); + } } /* Receiver Config */ @@ -191,32 +232,37 @@ TEST_CASE("Caller::rx_printconfig", "[.cmdcall][.rx]") { TEST_CASE("Caller::rx_hostname", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxHostname(); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxHostname(); - // Cannot set rx_hostname (will reset parameters in rxr and no shm variables - // to update) - // { - // // disable receiver - // std::ostringstream oss; - // caller.call("rx_hostname", {"none"}, -1, PUT, oss); - // REQUIRE(oss.str() == "rx_hostname [none]\n"); - // } - // { - // std::ostringstream oss; - // caller.call("rx_hostname", {}, -1, GET, oss); - // REQUIRE(oss.str() == "rx_hostname none\n"); - // // receiver should be disabled - // REQUIRE(det.getUseReceiverFlag().tsquash( - // "different values of flag in test") == false); - // } - // put back old values (not necessary when we dont set it to none) - // for (int i = 0; i != det.size(); ++i) { - // det.setRxHostname(prev_val[i], {i}); - // } - { - std::ostringstream oss; - caller.call("rx_hostname", {}, 0, GET, oss); - REQUIRE(oss.str() == "rx_hostname " + prev_val[0] + "\n"); + // Cannot set rx_hostname (will reset parameters in rxr and no shm variables + // to update) + // { + // // disable receiver + // std::ostringstream oss; + // caller.call("rx_hostname", {"none"}, -1, PUT, oss); + // REQUIRE(oss.str() == "rx_hostname [none]\n"); + // } + // { + // std::ostringstream oss; + // caller.call("rx_hostname", {}, -1, GET, oss); + // REQUIRE(oss.str() == "rx_hostname none\n"); + // // receiver should be disabled + // REQUIRE(det.getUseReceiverFlag().tsquash( + // "different values of flag in test") == false); + // } + // put back old values (not necessary when we dont set it to none) + // for (int i = 0; i != det.size(); ++i) { + // det.setRxHostname(prev_val[i], {i}); + // } + { + std::ostringstream oss; + caller.call("rx_hostname", {}, 0, GET, oss); + REQUIRE(oss.str() == "rx_hostname " + prev_val[0] + "\n"); + } + } else { + REQUIRE_THROWS(caller.call("rx_hostname", {"localhost"}, -1, PUT)); } } @@ -262,205 +308,255 @@ TEST_CASE("Caller::rx_tcpport", "[.cmdcall][.rx]") { TEST_CASE("Caller::rx_fifodepth", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxFifoDepth(); - { - std::ostringstream oss; - caller.call("rx_fifodepth", {"10"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_fifodepth 10\n"); - } - { - std::ostringstream oss; - caller.call("rx_fifodepth", {"100"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_fifodepth 100\n"); - } - { - std::ostringstream oss; - caller.call("rx_fifodepth", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_fifodepth 100\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxFifoDepth(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxFifoDepth(); + { + std::ostringstream oss; + caller.call("rx_fifodepth", {"10"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_fifodepth 10\n"); + } + { + std::ostringstream oss; + caller.call("rx_fifodepth", {"100"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_fifodepth 100\n"); + } + { + std::ostringstream oss; + caller.call("rx_fifodepth", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_fifodepth 100\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxFifoDepth(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_fifodepth", {}, -1, GET)); } } TEST_CASE("Caller::rx_silent", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxSilentMode(); - { - std::ostringstream oss; - caller.call("rx_silent", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_silent 1\n"); - } - { - std::ostringstream oss; - caller.call("rx_silent", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_silent 1\n"); - } - { - std::ostringstream oss; - caller.call("rx_silent", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_silent 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxSilentMode(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxSilentMode(); + { + std::ostringstream oss; + caller.call("rx_silent", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_silent 1\n"); + } + { + std::ostringstream oss; + caller.call("rx_silent", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_silent 1\n"); + } + { + std::ostringstream oss; + caller.call("rx_silent", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_silent 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxSilentMode(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_silent", {}, -1, GET)); } } TEST_CASE("Caller::rx_discardpolicy", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxFrameDiscardPolicy(); - { - std::ostringstream oss; - caller.call("rx_discardpolicy", {"discardempty"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_discardpolicy discardempty\n"); - } - { - std::ostringstream oss; - caller.call("rx_discardpolicy", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_discardpolicy discardempty\n"); - } - { - std::ostringstream oss; - caller.call("rx_discardpolicy", {"discardpartial"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_discardpolicy discardpartial\n"); - } - { - std::ostringstream oss; - caller.call("rx_discardpolicy", {"nodiscard"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_discardpolicy nodiscard\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxFrameDiscardPolicy(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxFrameDiscardPolicy(); + { + std::ostringstream oss; + caller.call("rx_discardpolicy", {"discardempty"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_discardpolicy discardempty\n"); + } + { + std::ostringstream oss; + caller.call("rx_discardpolicy", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_discardpolicy discardempty\n"); + } + { + std::ostringstream oss; + caller.call("rx_discardpolicy", {"discardpartial"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_discardpolicy discardpartial\n"); + } + { + std::ostringstream oss; + caller.call("rx_discardpolicy", {"nodiscard"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_discardpolicy nodiscard\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxFrameDiscardPolicy(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_discardpolicy", {}, -1, GET)); } } TEST_CASE("Caller::rx_padding", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getPartialFramesPadding(); - { - std::ostringstream oss; - caller.call("rx_padding", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_padding 0\n"); - } - { - std::ostringstream oss; - caller.call("rx_padding", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_padding 0\n"); - } - { - std::ostringstream oss; - caller.call("rx_padding", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_padding 1\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setPartialFramesPadding(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getPartialFramesPadding(); + { + std::ostringstream oss; + caller.call("rx_padding", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_padding 0\n"); + } + { + std::ostringstream oss; + caller.call("rx_padding", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_padding 0\n"); + } + { + std::ostringstream oss; + caller.call("rx_padding", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_padding 1\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setPartialFramesPadding(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_padding", {}, -1, GET)); } } TEST_CASE("Caller::rx_udpsocksize", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - int64_t prev_val = det.getRxUDPSocketBufferSize().tsquash( - "Need same udp socket buffer size to test"); - std::string s_new_val = std::to_string(prev_val); - /*std::string s_new_val = std::to_string(prev_val - 1000); - { Need permissions - std::ostringstream oss; - caller.call("rx_udpsocksize", {s_new_val}, -1, PUT, oss); - REQUIRE(oss.str() >= "rx_udpsocksize " + s_new_val + "\n"); - }*/ - { - std::ostringstream oss; - caller.call("rx_udpsocksize", {}, -1, GET, oss); - REQUIRE(oss.str() >= "rx_udpsocksize " + s_new_val + "\n"); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + int64_t prev_val = det.getRxUDPSocketBufferSize().tsquash( + "Need same udp socket buffer size to test"); + std::string s_new_val = std::to_string(prev_val); + /*std::string s_new_val = std::to_string(prev_val - 1000); + { Need permissions + std::ostringstream oss; + caller.call("rx_udpsocksize", {s_new_val}, -1, PUT, oss); + REQUIRE(oss.str() >= "rx_udpsocksize " + s_new_val + "\n"); + }*/ + { + std::ostringstream oss; + caller.call("rx_udpsocksize", {}, -1, GET, oss); + REQUIRE(oss.str() >= "rx_udpsocksize " + s_new_val + "\n"); + } + det.setRxUDPSocketBufferSize(prev_val); + } else { + REQUIRE_THROWS(caller.call("rx_udpsocksize", {}, -1, GET)); } - det.setRxUDPSocketBufferSize(prev_val); } TEST_CASE("Caller::rx_realudpsocksize", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - uint64_t val = 0; - { - std::ostringstream oss; - caller.call("rx_udpsocksize", {}, -1, GET, oss); - std::string s = (oss.str()).erase(0, strlen("rx_udpsocksize ")); - val = std::stol(s); - } - { - std::ostringstream oss; - caller.call("rx_realudpsocksize", {}, -1, GET, oss); - std::string s = (oss.str()).erase(0, strlen("rx_realudpsocksize ")); - uint64_t rval = std::stol(s); - REQUIRE(rval >= val * 2); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + uint64_t val = 0; + { + std::ostringstream oss; + caller.call("rx_udpsocksize", {}, -1, GET, oss); + std::string s = (oss.str()).erase(0, strlen("rx_udpsocksize ")); + val = std::stol(s); + } + { + std::ostringstream oss; + caller.call("rx_realudpsocksize", {}, -1, GET, oss); + std::string s = (oss.str()).erase(0, strlen("rx_realudpsocksize ")); + uint64_t rval = std::stol(s); + REQUIRE(rval >= val * 2); + } + } else { + REQUIRE_THROWS(caller.call("rx_realudpsocksize", {}, -1, GET)); } } TEST_CASE("Caller::rx_lock", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxLock(); - { - std::ostringstream oss; - caller.call("rx_lock", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_lock 1\n"); - } - { - std::ostringstream oss; - caller.call("rx_lock", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_lock 1\n"); - } - { - std::ostringstream oss; - caller.call("rx_lock", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_lock 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxLock(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxLock(); + { + std::ostringstream oss; + caller.call("rx_lock", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_lock 1\n"); + } + { + std::ostringstream oss; + caller.call("rx_lock", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_lock 1\n"); + } + { + std::ostringstream oss; + caller.call("rx_lock", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_lock 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxLock(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_lock", {}, -1, GET)); } } TEST_CASE("Caller::rx_lastclient", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - std::ostringstream oss; - REQUIRE_NOTHROW(caller.call("rx_lastclient", {}, -1, GET, oss)); - if (test::my_ip != "undefined") { - REQUIRE(oss.str() == "rx_lastclient " + test::my_ip + "\n"); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + std::ostringstream oss; + REQUIRE_NOTHROW(caller.call("rx_lastclient", {}, -1, GET, oss)); + if (test::my_ip != "undefined") { + REQUIRE(oss.str() == "rx_lastclient " + test::my_ip + "\n"); + } + } else { + REQUIRE_THROWS(caller.call("rx_lastclient", {}, -1, GET)); } } TEST_CASE("Caller::rx_threads", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - std::ostringstream oss; - REQUIRE_NOTHROW(caller.call("rx_threads", {}, -1, GET, oss)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + std::ostringstream oss; + REQUIRE_NOTHROW(caller.call("rx_threads", {}, -1, GET, oss)); + } else { + REQUIRE_THROWS(caller.call("rx_threads", {}, -1, GET)); + } } TEST_CASE("Caller::rx_arping", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxArping(); - { - std::ostringstream oss; - caller.call("rx_arping", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_arping 1\n"); - } - { - std::ostringstream oss; - caller.call("rx_arping", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_arping 1\n"); - } - { - std::ostringstream oss; - caller.call("rx_arping", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_arping 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxArping(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxArping(); + { + std::ostringstream oss; + caller.call("rx_arping", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_arping 1\n"); + } + { + std::ostringstream oss; + caller.call("rx_arping", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_arping 1\n"); + } + { + std::ostringstream oss; + caller.call("rx_arping", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_arping 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxArping(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_arping", {}, -1, GET)); } } @@ -468,61 +564,64 @@ TEST_CASE("Caller::rx_roi", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD) { + REQUIRE_THROWS(caller.call("rx_roi", {"5", "10"}, -1, PUT)); + } else { + auto prev_val = det.getRxROI(); + defs::xy detsize = det.getDetectorSize(); - if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_THROWS(caller.call("rx_roi", {"5", "10"}, -1, PUT)); + // 1d + if (det_type == defs::GOTTHARD || det_type == defs::GOTTHARD2 || + det_type == defs::MYTHEN3) { + { + std::ostringstream oss; + caller.call("rx_roi", {"5", "10"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_roi [5, 10]\n"); + } + { + std::ostringstream oss; + caller.call("rx_roi", {"10", "15"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_roi [10, 15]\n"); + } + REQUIRE_THROWS(caller.call("rx_roi", {"-1", "-1"}, -1, PUT)); + REQUIRE_THROWS( + caller.call("rx_roi", {"10", "15", "25", "30"}, -1, PUT)); + } + // 2d + else { + { + std::ostringstream oss; + caller.call("rx_roi", {"10", "15", "1", "5"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_roi [10, 15, 1, 5]\n"); + } + { + std::ostringstream oss; + caller.call("rx_roi", {"10", "22", "18", "19"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_roi [10, 22, 18, 19]\n"); + } + { + std::ostringstream oss; + caller.call("rx_roi", + {"1", std::to_string(detsize.x - 5), "1", + std::to_string(detsize.y - 5)}, + -1, PUT, oss); + REQUIRE(oss.str() == std::string("rx_roi [1, ") + + std::to_string(detsize.x - 5) + + std::string(", 1, ") + + std::to_string(detsize.y - 5) + + std::string("]\n")); + } + REQUIRE_THROWS( + caller.call("rx_roi", {"-1", "-1", "-1", "-1"}, -1, PUT)); + } + + for (int i = 0; i != det.size(); ++i) { + det.setRxROI(prev_val); + } + } } else { - auto prev_val = det.getRxROI(); - defs::xy detsize = det.getDetectorSize(); - - // 1d - if (det_type == defs::GOTTHARD || det_type == defs::GOTTHARD2 || - det_type == defs::MYTHEN3) { - { - std::ostringstream oss; - caller.call("rx_roi", {"5", "10"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_roi [5, 10]\n"); - } - { - std::ostringstream oss; - caller.call("rx_roi", {"10", "15"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_roi [10, 15]\n"); - } - REQUIRE_THROWS(caller.call("rx_roi", {"-1", "-1"}, -1, PUT)); - REQUIRE_THROWS( - caller.call("rx_roi", {"10", "15", "25", "30"}, -1, PUT)); - } - // 2d - else { - { - std::ostringstream oss; - caller.call("rx_roi", {"10", "15", "1", "5"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_roi [10, 15, 1, 5]\n"); - } - { - std::ostringstream oss; - caller.call("rx_roi", {"10", "22", "18", "19"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_roi [10, 22, 18, 19]\n"); - } - { - std::ostringstream oss; - caller.call("rx_roi", - {"1", std::to_string(detsize.x - 5), "1", - std::to_string(detsize.y - 5)}, - -1, PUT, oss); - REQUIRE(oss.str() == std::string("rx_roi [1, ") + - std::to_string(detsize.x - 5) + - std::string(", 1, ") + - std::to_string(detsize.y - 5) + - std::string("]\n")); - } - REQUIRE_THROWS( - caller.call("rx_roi", {"-1", "-1", "-1", "-1"}, -1, PUT)); - } - - for (int i = 0; i != det.size(); ++i) { - det.setRxROI(prev_val); - } + REQUIRE_THROWS(caller.call("rx_roi", {}, -1, GET)); } } @@ -530,19 +629,22 @@ TEST_CASE("Caller::rx_clearroi", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - - if (det_type == defs::CHIPTESTBOARD) { - REQUIRE_THROWS(caller.call("rx_clearroi", {}, -1, PUT)); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD) { + REQUIRE_THROWS(caller.call("rx_clearroi", {}, -1, PUT)); + } else { + auto prev_val = det.getRxROI(); + { + std::ostringstream oss; + caller.call("rx_clearroi", {}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_clearroi successful\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxROI(prev_val); + } + } } else { - auto prev_val = det.getRxROI(); - { - std::ostringstream oss; - caller.call("rx_clearroi", {}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_clearroi successful\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxROI(prev_val); - } + REQUIRE_THROWS(caller.call("rx_clearroi", {}, -1, PUT)); } } @@ -551,188 +653,228 @@ TEST_CASE("Caller::rx_clearroi", "[.cmdcall]") { TEST_CASE("Caller::fformat", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getFileFormat(); - { - std::ostringstream oss; - caller.call("fformat", {"binary"}, -1, PUT, oss); - REQUIRE(oss.str() == "fformat binary\n"); - } - { - std::ostringstream oss; - caller.call("fformat", {}, -1, GET, oss); - REQUIRE(oss.str() == "fformat binary\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setFileFormat(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getFileFormat(); + { + std::ostringstream oss; + caller.call("fformat", {"binary"}, -1, PUT, oss); + REQUIRE(oss.str() == "fformat binary\n"); + } + { + std::ostringstream oss; + caller.call("fformat", {}, -1, GET, oss); + REQUIRE(oss.str() == "fformat binary\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setFileFormat(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("fformat", {}, -1, GET)); } } TEST_CASE("Caller::fpath", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getFilePath(); - { - std::ostringstream oss; - caller.call("fpath", {"/tmp"}, -1, PUT, oss); - REQUIRE(oss.str() == "fpath /tmp\n"); - } - { - std::ostringstream oss; - caller.call("fpath", {}, -1, GET, oss); - REQUIRE(oss.str() == "fpath /tmp\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setFilePath(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getFilePath(); + { + std::ostringstream oss; + caller.call("fpath", {"/tmp"}, -1, PUT, oss); + REQUIRE(oss.str() == "fpath /tmp\n"); + } + { + std::ostringstream oss; + caller.call("fpath", {}, -1, GET, oss); + REQUIRE(oss.str() == "fpath /tmp\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setFilePath(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("fpath", {}, -1, GET)); } } TEST_CASE("Caller::fname", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getFileNamePrefix(); - { - std::ostringstream oss; - caller.call("fname", {"somename"}, -1, PUT, oss); - REQUIRE(oss.str() == "fname somename\n"); - } - { - std::ostringstream oss; - caller.call("fname", {}, -1, GET, oss); - REQUIRE(oss.str() == "fname somename\n"); - } - { - std::ostringstream oss; - caller.call("fname", {"run"}, -1, PUT, oss); - REQUIRE(oss.str() == "fname run\n"); - } - REQUIRE_THROWS(caller.call("fname", {"fdf/dfd"}, -1, PUT)); - REQUIRE_THROWS(caller.call("fname", {"fdf dfd"}, -1, PUT)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getFileNamePrefix(); + { + std::ostringstream oss; + caller.call("fname", {"somename"}, -1, PUT, oss); + REQUIRE(oss.str() == "fname somename\n"); + } + { + std::ostringstream oss; + caller.call("fname", {}, -1, GET, oss); + REQUIRE(oss.str() == "fname somename\n"); + } + { + std::ostringstream oss; + caller.call("fname", {"run"}, -1, PUT, oss); + REQUIRE(oss.str() == "fname run\n"); + } + REQUIRE_THROWS(caller.call("fname", {"fdf/dfd"}, -1, PUT)); + REQUIRE_THROWS(caller.call("fname", {"fdf dfd"}, -1, PUT)); - for (int i = 0; i != det.size(); ++i) { - det.setFileNamePrefix(prev_val[i], {i}); + for (int i = 0; i != det.size(); ++i) { + det.setFileNamePrefix(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("fname", {}, -1, GET)); } } TEST_CASE("Caller::findex", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getAcquisitionIndex(); - { - std::ostringstream oss; - caller.call("findex", {"57"}, -1, PUT, oss); - REQUIRE(oss.str() == "findex 57\n"); - } - { - std::ostringstream oss; - caller.call("findex", {}, -1, GET, oss); - REQUIRE(oss.str() == "findex 57\n"); - } - { - std::ostringstream oss; - caller.call("findex", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "findex 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setAcquisitionIndex(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getAcquisitionIndex(); + { + std::ostringstream oss; + caller.call("findex", {"57"}, -1, PUT, oss); + REQUIRE(oss.str() == "findex 57\n"); + } + { + std::ostringstream oss; + caller.call("findex", {}, -1, GET, oss); + REQUIRE(oss.str() == "findex 57\n"); + } + { + std::ostringstream oss; + caller.call("findex", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "findex 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setAcquisitionIndex(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("findex", {}, -1, GET)); } } TEST_CASE("Caller::fwrite", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getFileWrite(); - { - std::ostringstream oss; - caller.call("fwrite", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "fwrite 1\n"); - } - { - std::ostringstream oss; - caller.call("fwrite", {}, -1, GET, oss); - REQUIRE(oss.str() == "fwrite 1\n"); - } - { - std::ostringstream oss; - caller.call("fwrite", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "fwrite 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setFileWrite(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getFileWrite(); + { + std::ostringstream oss; + caller.call("fwrite", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "fwrite 1\n"); + } + { + std::ostringstream oss; + caller.call("fwrite", {}, -1, GET, oss); + REQUIRE(oss.str() == "fwrite 1\n"); + } + { + std::ostringstream oss; + caller.call("fwrite", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "fwrite 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setFileWrite(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("fwrite", {}, -1, GET)); } } TEST_CASE("Caller::fmaster", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getMasterFileWrite(); - { - std::ostringstream oss; - caller.call("fmaster", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "fmaster 0\n"); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getMasterFileWrite(); + { + std::ostringstream oss; + caller.call("fmaster", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "fmaster 0\n"); + } + { + std::ostringstream oss; + caller.call("fmaster", {}, -1, GET, oss); + REQUIRE(oss.str() == "fmaster 0\n"); + } + { + std::ostringstream oss; + caller.call("fmaster", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "fmaster 1\n"); + } + det.setMasterFileWrite(prev_val); + } else { + REQUIRE_THROWS(caller.call("fmaster", {}, -1, GET)); } - { - std::ostringstream oss; - caller.call("fmaster", {}, -1, GET, oss); - REQUIRE(oss.str() == "fmaster 0\n"); - } - { - std::ostringstream oss; - caller.call("fmaster", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "fmaster 1\n"); - } - det.setMasterFileWrite(prev_val); } TEST_CASE("Caller::foverwrite", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getFileOverWrite(); - { - std::ostringstream oss; - caller.call("foverwrite", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "foverwrite 1\n"); - } - { - std::ostringstream oss; - caller.call("foverwrite", {}, -1, GET, oss); - REQUIRE(oss.str() == "foverwrite 1\n"); - } - { - std::ostringstream oss; - caller.call("foverwrite", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "foverwrite 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setFileOverWrite(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getFileOverWrite(); + { + std::ostringstream oss; + caller.call("foverwrite", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "foverwrite 1\n"); + } + { + std::ostringstream oss; + caller.call("foverwrite", {}, -1, GET, oss); + REQUIRE(oss.str() == "foverwrite 1\n"); + } + { + std::ostringstream oss; + caller.call("foverwrite", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "foverwrite 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setFileOverWrite(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("foverwrite", {}, -1, GET)); } } TEST_CASE("Caller::rx_framesperfile", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getFramesPerFile(); - { - std::ostringstream oss; - caller.call("rx_framesperfile", {"50"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_framesperfile 50\n"); - } - { - std::ostringstream oss; - caller.call("rx_framesperfile", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_framesperfile 50\n"); - } - { - std::ostringstream oss; - caller.call("rx_framesperfile", {"10000"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_framesperfile 10000\n"); - } - { - std::ostringstream oss; - caller.call("rx_framesperfile", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_framesperfile 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setFramesPerFile(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getFramesPerFile(); + { + std::ostringstream oss; + caller.call("rx_framesperfile", {"50"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_framesperfile 50\n"); + } + { + std::ostringstream oss; + caller.call("rx_framesperfile", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_framesperfile 50\n"); + } + { + std::ostringstream oss; + caller.call("rx_framesperfile", {"10000"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_framesperfile 10000\n"); + } + { + std::ostringstream oss; + caller.call("rx_framesperfile", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_framesperfile 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setFramesPerFile(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_framesperfile", {}, -1, GET)); } } @@ -741,171 +883,202 @@ TEST_CASE("Caller::rx_framesperfile", "[.cmdcall][.rx]") { TEST_CASE("Caller::rx_zmqstream", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxZmqDataStream(); - { - std::ostringstream oss; - caller.call("rx_zmqstream", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_zmqstream 1\n"); - REQUIRE(det.getRxZmqDataStream().squash() == true); - } - { - std::ostringstream oss; - caller.call("rx_zmqstream", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_zmqstream 1\n"); - } - { - std::ostringstream oss; - caller.call("rx_zmqstream", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_zmqstream 0\n"); - REQUIRE(det.getRxZmqDataStream().squash() == false); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxZmqDataStream(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxZmqDataStream(); + { + std::ostringstream oss; + caller.call("rx_zmqstream", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_zmqstream 1\n"); + REQUIRE(det.getRxZmqDataStream().squash() == true); + } + { + std::ostringstream oss; + caller.call("rx_zmqstream", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_zmqstream 1\n"); + } + { + std::ostringstream oss; + caller.call("rx_zmqstream", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_zmqstream 0\n"); + REQUIRE(det.getRxZmqDataStream().squash() == false); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxZmqDataStream(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_zmqstream", {}, -1, GET)); } } TEST_CASE("Caller::rx_zmqfreq", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxZmqFrequency(); - { - std::ostringstream oss; - caller.call("rx_zmqfreq", {"1"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_zmqfreq 1\n"); - } - { - std::ostringstream oss; - caller.call("rx_zmqfreq", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_zmqfreq 1\n"); - } - { - std::ostringstream oss; - caller.call("rx_zmqfreq", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_zmqfreq 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxZmqFrequency(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxZmqFrequency(); + { + std::ostringstream oss; + caller.call("rx_zmqfreq", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_zmqfreq 1\n"); + } + { + std::ostringstream oss; + caller.call("rx_zmqfreq", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_zmqfreq 1\n"); + } + { + std::ostringstream oss; + caller.call("rx_zmqfreq", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_zmqfreq 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxZmqFrequency(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_zmqfreq", {}, -1, GET)); } } TEST_CASE("Caller::rx_zmqstartfnum", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxZmqStartingFrame(); - { - std::ostringstream oss; - caller.call("rx_zmqstartfnum", {"5"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_zmqstartfnum 5\n"); - } - { - std::ostringstream oss; - caller.call("rx_zmqstartfnum", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_zmqstartfnum 5\n"); - } - { - std::ostringstream oss; - caller.call("rx_zmqstartfnum", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_zmqstartfnum 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxZmqStartingFrame(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxZmqStartingFrame(); + { + std::ostringstream oss; + caller.call("rx_zmqstartfnum", {"5"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_zmqstartfnum 5\n"); + } + { + std::ostringstream oss; + caller.call("rx_zmqstartfnum", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_zmqstartfnum 5\n"); + } + { + std::ostringstream oss; + caller.call("rx_zmqstartfnum", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_zmqstartfnum 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxZmqStartingFrame(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_zmqstartfnum", {}, -1, GET)); + } } TEST_CASE("Caller::rx_zmqport", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val_zmqport = det.getRxZmqPort(); - auto prev_val_numinterfaces = det.getNumberofUDPInterfaces().tsquash( - "inconsistent number of udp interfaces to test"); - - int socketsperdetector = 1; auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER) { - socketsperdetector *= 2; - } else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { - caller.call("numinterfaces", {"2"}, -1, PUT); - socketsperdetector *= 2; - } - uint16_t port = 3500; - caller.call("rx_zmqport", {std::to_string(port)}, -1, PUT); - for (int i = 0; i != det.size(); ++i) { - std::ostringstream oss; - caller.call("rx_zmqport", {}, i, GET, oss); - REQUIRE(oss.str() == "rx_zmqport " + - std::to_string(port + i * socketsperdetector) + - '\n'); - } - port = 30001; - caller.call("rx_zmqport", {std::to_string(port)}, -1, PUT); - for (int i = 0; i != det.size(); ++i) { - std::ostringstream oss; - caller.call("rx_zmqport", {}, i, GET, oss); - REQUIRE(oss.str() == "rx_zmqport " + - std::to_string(port + i * socketsperdetector) + - '\n'); - } - test_valid_port_caller("rx_zmqport", {}, -1, PUT); - test_valid_port_caller("rx_zmqport", {}, 0, PUT); - // should fail for the second module - if (det.size() > 1) { - REQUIRE_THROWS(caller.call("rx_zmqport", {"65535"}, -1, PUT)); - } + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val_zmqport = det.getRxZmqPort(); + auto prev_val_numinterfaces = det.getNumberofUDPInterfaces().tsquash( + "inconsistent number of udp interfaces to test"); - for (int i = 0; i != det.size(); ++i) { - det.setRxZmqPort(prev_val_zmqport[i], i); - } - if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { - det.setNumberofUDPInterfaces(prev_val_numinterfaces); + int socketsperdetector = 1; + auto det_type = det.getDetectorType().squash(); + if (det_type == defs::EIGER) { + socketsperdetector *= 2; + } else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { + caller.call("numinterfaces", {"2"}, -1, PUT); + socketsperdetector *= 2; + } + uint16_t port = 3500; + caller.call("rx_zmqport", {std::to_string(port)}, -1, PUT); + for (int i = 0; i != det.size(); ++i) { + std::ostringstream oss; + caller.call("rx_zmqport", {}, i, GET, oss); + REQUIRE(oss.str() == "rx_zmqport " + + std::to_string(port + i * socketsperdetector) + + '\n'); + } + port = 30001; + caller.call("rx_zmqport", {std::to_string(port)}, -1, PUT); + for (int i = 0; i != det.size(); ++i) { + std::ostringstream oss; + caller.call("rx_zmqport", {}, i, GET, oss); + REQUIRE(oss.str() == "rx_zmqport " + + std::to_string(port + i * socketsperdetector) + + '\n'); + } + test_valid_port_caller("rx_zmqport", {}, -1, PUT); + test_valid_port_caller("rx_zmqport", {}, 0, PUT); + // should fail for the second module + if (det.size() > 1) { + REQUIRE_THROWS(caller.call("rx_zmqport", {"65535"}, -1, PUT)); + } + + for (int i = 0; i != det.size(); ++i) { + det.setRxZmqPort(prev_val_zmqport[i], i); + } + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { + det.setNumberofUDPInterfaces(prev_val_numinterfaces); + } + } else { + REQUIRE_THROWS(caller.call("rx_zmqport", {}, -1, GET)); } } TEST_CASE("Caller::rx_zmqip", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getRxZmqIP(); - { - std::ostringstream oss; - caller.call("rx_zmqip", {"127.0.0.1"}, 0, PUT, oss); - REQUIRE(oss.str() == "rx_zmqip 127.0.0.1\n"); - std::cout << "ZMQIP: " << det.getRxZmqIP() << '\n'; - } - { - std::ostringstream oss; - caller.call("rx_zmqip", {}, 0, GET, oss); - REQUIRE(oss.str() == "rx_zmqip 127.0.0.1\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setRxZmqIP(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getRxZmqIP(); + { + std::ostringstream oss; + caller.call("rx_zmqip", {"127.0.0.1"}, 0, PUT, oss); + REQUIRE(oss.str() == "rx_zmqip 127.0.0.1\n"); + std::cout << "ZMQIP: " << det.getRxZmqIP() << '\n'; + } + { + std::ostringstream oss; + caller.call("rx_zmqip", {}, 0, GET, oss); + REQUIRE(oss.str() == "rx_zmqip 127.0.0.1\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setRxZmqIP(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_zmqip", {}, -1, GET)); } } TEST_CASE("Caller::rx_zmqhwm", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = - det.getRxZmqHwm().tsquash("Inconsistent values for rx_zmqhwm to test"); - { - std::ostringstream oss; - caller.call("rx_zmqhwm", {"50"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_zmqhwm 50\n"); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = + det.getRxZmqHwm().tsquash("Inconsistent values for rx_zmqhwm to test"); + { + std::ostringstream oss; + caller.call("rx_zmqhwm", {"50"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_zmqhwm 50\n"); + } + { + std::ostringstream oss; + caller.call("rx_zmqhwm", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_zmqhwm 50\n"); + } + { + std::ostringstream oss; + caller.call("rx_zmqhwm", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_zmqhwm 0\n"); + } + { + std::ostringstream oss; + caller.call("rx_zmqhwm", {"-1"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_zmqhwm -1\n"); + } + det.setRxZmqHwm(prev_val); + } else { + REQUIRE_THROWS(caller.call("rx_zmqhwm", {}, -1, GET)); } - { - std::ostringstream oss; - caller.call("rx_zmqhwm", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_zmqhwm 50\n"); - } - { - std::ostringstream oss; - caller.call("rx_zmqhwm", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_zmqhwm 0\n"); - } - { - std::ostringstream oss; - caller.call("rx_zmqhwm", {"-1"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_zmqhwm -1\n"); - } - det.setRxZmqHwm(prev_val); } /* CTB Specific */ @@ -976,56 +1149,66 @@ TEST_CASE("Caller::rx_dbitoffset", "[.cmdcall][.rx]") { TEST_CASE("Caller::rx_jsonaddheader", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getAdditionalJsonHeader(); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getAdditionalJsonHeader(); - { - std::ostringstream oss; - caller.call("rx_jsonaddheader", {"key1", "value1", "key2", "value2"}, - -1, PUT, oss); - REQUIRE(oss.str() == "rx_jsonaddheader {key1: value1, key2: value2}\n"); - } - { - std::ostringstream oss; - caller.call("rx_jsonaddheader", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_jsonaddheader {key1: value1, key2: value2}\n"); - } - { - std::ostringstream oss; - caller.call("rx_jsonaddheader", {}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_jsonaddheader {}\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setAdditionalJsonHeader(prev_val[i], {i}); + { + std::ostringstream oss; + caller.call("rx_jsonaddheader", {"key1", "value1", "key2", "value2"}, + -1, PUT, oss); + REQUIRE(oss.str() == "rx_jsonaddheader {key1: value1, key2: value2}\n"); + } + { + std::ostringstream oss; + caller.call("rx_jsonaddheader", {}, -1, GET, oss); + REQUIRE(oss.str() == "rx_jsonaddheader {key1: value1, key2: value2}\n"); + } + { + std::ostringstream oss; + caller.call("rx_jsonaddheader", {}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_jsonaddheader {}\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setAdditionalJsonHeader(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_jsonaddheader", {}, -1, GET)); } } TEST_CASE("Caller::rx_jsonpara", "[.cmdcall][.rx]") { Detector det; Caller caller(&det); - auto prev_val = det.getAdditionalJsonHeader(); - { - std::ostringstream oss; - caller.call("rx_jsonpara", {"key1", "value1"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_jsonpara {key1: value1}\n"); - } - { - std::ostringstream oss; - caller.call("rx_jsonpara", {"key1", "value2"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_jsonpara {key1: value2}\n"); - } - { - std::ostringstream oss; - caller.call("rx_jsonpara", {"key1"}, -1, GET, oss); - REQUIRE(oss.str() == "rx_jsonpara value2\n"); - } - { - std::ostringstream oss; - caller.call("rx_jsonpara", {"key1"}, -1, PUT, oss); - REQUIRE(oss.str() == "rx_jsonpara key1 deleted\n"); - } - REQUIRE_THROWS(caller.call("rx_jsonpara", {"key1"}, -1, GET)); - for (int i = 0; i != det.size(); ++i) { - det.setAdditionalJsonHeader(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getAdditionalJsonHeader(); + { + std::ostringstream oss; + caller.call("rx_jsonpara", {"key1", "value1"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_jsonpara {key1: value1}\n"); + } + { + std::ostringstream oss; + caller.call("rx_jsonpara", {"key1", "value2"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_jsonpara {key1: value2}\n"); + } + { + std::ostringstream oss; + caller.call("rx_jsonpara", {"key1"}, -1, GET, oss); + REQUIRE(oss.str() == "rx_jsonpara value2\n"); + } + { + std::ostringstream oss; + caller.call("rx_jsonpara", {"key1"}, -1, PUT, oss); + REQUIRE(oss.str() == "rx_jsonpara key1 deleted\n"); + } + REQUIRE_THROWS(caller.call("rx_jsonpara", {"key1"}, -1, GET)); + for (int i = 0; i != det.size(); ++i) { + det.setAdditionalJsonHeader(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("rx_jsonpara", {}, -1, GET)); } } diff --git a/slsDetectorSoftware/tests/Caller/test-Caller.cpp b/slsDetectorSoftware/tests/Caller/test-Caller.cpp index b764e7adb..e1a31e239 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller.cpp @@ -27,30 +27,6 @@ TEST_CASE("CALLER::Caller::Calling help doesn't throw or cause segfault") { caller.call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os)); } -TEST_CASE("CALLER::Caller::period", "[.cmdcall]") { - Detector det; - Caller caller(&det); - auto prev_val = det.getPeriod(); - { - std::ostringstream oss; - caller.call("period", {"1.25s"}, -1, PUT, oss); - REQUIRE(oss.str() == "period 1.25s\n"); - } - { - std::ostringstream oss; - caller.call("period", {}, -1, GET, oss); - REQUIRE(oss.str() == "period 1.25s\n"); - } - { - std::ostringstream oss; - caller.call("period", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "period 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setPeriod(prev_val[i], {i}); - } -} - TEST_CASE("CALLER::Unknown command", "[.cmdcall]") { Detector det; Caller caller(&det); @@ -111,8 +87,13 @@ TEST_CASE("CALLER::virtual", "[.cmdcall]") { TEST_CASE("CALLER::versions", "[.cmdcall]") { Detector det; Caller caller(&det); - REQUIRE_NOTHROW(caller.call("versions", {}, -1, GET)); - REQUIRE_THROWS(caller.call("versions", {"0"}, -1, PUT)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + REQUIRE_NOTHROW(caller.call("versions", {}, -1, GET)); + REQUIRE_THROWS(caller.call("versions", {"0"}, -1, PUT)); + } else { + REQUIRE_THROWS(caller.call("versions", {}, -1, GET)); + } } TEST_CASE("CALLER::packageversion", "[.cmdcall]") { @@ -146,22 +127,32 @@ TEST_CASE("CALLER::detectorserverversion", "[.cmdcall]") { TEST_CASE("CALLER::hardwareversion", "[.cmdcall]") { Detector det; Caller caller(&det); - REQUIRE_NOTHROW(caller.call("hardwareversion", {}, -1, GET)); - REQUIRE_THROWS(caller.call("hardwareversion", {"0"}, -1, PUT)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + REQUIRE_NOTHROW(caller.call("hardwareversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("hardwareversion", {"0"}, -1, PUT)); + } else { + REQUIRE_THROWS(caller.call("hardwareversion", {}, -1, GET)); + } } TEST_CASE("CALLER::kernelversion", "[.cmdcall]") { Detector det; Caller caller(&det); - REQUIRE_NOTHROW(caller.call("kernelversion", {}, -1, GET)); - REQUIRE_THROWS(caller.call("kernelversion", {"0"}, -1, PUT)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + REQUIRE_NOTHROW(caller.call("kernelversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("kernelversion", {"0"}, -1, PUT)); + } else { + REQUIRE_THROWS(caller.call("kernelversion", {}, -1, GET)); + } } TEST_CASE("CALLER::serialnumber", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER) { + if (det_type == defs::EIGER || det_type == defs::XILINX_CHIPTESTBOARD) { REQUIRE_THROWS(caller.call("serialnumber", {}, -1, GET)); } else { REQUIRE_NOTHROW(caller.call("serialnumber", {}, -1, GET)); @@ -203,7 +194,7 @@ TEST_CASE("CALLER::settingslist", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { REQUIRE_THROWS(caller.call("settingslist", {}, -1, GET)); } else { REQUIRE_NOTHROW(caller.call("settingslist", {}, -1, GET)); @@ -848,73 +839,82 @@ TEST_CASE("CALLER::exptime", "[.cmdcall][.time]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - std::chrono::nanoseconds prev_val; - if (det_type != defs::MYTHEN3) { - prev_val = det.getExptime().tsquash("inconsistent exptime to test"); - } else { - auto t = - det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); - if (t[0] != t[1] || t[1] != t[2]) { - throw RuntimeError("inconsistent exptime for all gates"); - } - prev_val = t[0]; - } - { - std::ostringstream oss; - caller.call("exptime", {"0.05"}, -1, PUT, oss); - REQUIRE(oss.str() == "exptime 0.05\n"); - } - if (det_type != defs::MYTHEN3) { - std::ostringstream oss; - caller.call("exptime", {}, -1, GET, oss); - REQUIRE(oss.str() == "exptime 50ms\n"); - } - { - std::ostringstream oss; - caller.call("exptime", {"1s"}, -1, PUT, oss); - REQUIRE(oss.str() == "exptime 1s\n"); - } - if (det_type != defs::JUNGFRAU && det_type != defs::MOENCH) { - { - std::ostringstream oss; - caller.call("exptime", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "exptime 0\n"); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + std::chrono::nanoseconds prev_val; + if (det_type != defs::MYTHEN3) { + prev_val = det.getExptime().tsquash("inconsistent exptime to test"); + } else { + auto t = + det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); + if (t[0] != t[1] || t[1] != t[2]) { + throw RuntimeError("inconsistent exptime for all gates"); + } + prev_val = t[0]; } { - // Get exptime of single module std::ostringstream oss; - caller.call("exptime", {}, 0, GET, oss); - if (det_type == defs::MYTHEN3) { - REQUIRE(oss.str() == "exptime [0ns, 0ns, 0ns]\n"); - } else { - REQUIRE(oss.str() == "exptime 0ns\n"); + caller.call("exptime", {"0.05"}, -1, PUT, oss); + REQUIRE(oss.str() == "exptime 0.05\n"); + } + if (det_type != defs::MYTHEN3) { + std::ostringstream oss; + caller.call("exptime", {}, -1, GET, oss); + REQUIRE(oss.str() == "exptime 50ms\n"); + } + { + std::ostringstream oss; + caller.call("exptime", {"1s"}, -1, PUT, oss); + REQUIRE(oss.str() == "exptime 1s\n"); + } + if (det_type != defs::JUNGFRAU && det_type != defs::MOENCH) { + { + std::ostringstream oss; + caller.call("exptime", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "exptime 0\n"); + } + { + // Get exptime of single module + std::ostringstream oss; + caller.call("exptime", {}, 0, GET, oss); + if (det_type == defs::MYTHEN3) { + REQUIRE(oss.str() == "exptime [0ns, 0ns, 0ns]\n"); + } else { + REQUIRE(oss.str() == "exptime 0ns\n"); + } } } + det.setExptime(-1, prev_val); + } else { + REQUIRE_THROWS(caller.call("exptime", {}, -1, GET)); } - det.setExptime(-1, prev_val); } TEST_CASE("CALLER::period", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getPeriod(); - { - std::ostringstream oss; - caller.call("period", {"1.25s"}, -1, PUT, oss); - REQUIRE(oss.str() == "period 1.25s\n"); - } - { - std::ostringstream oss; - caller.call("period", {}, -1, GET, oss); - REQUIRE(oss.str() == "period 1.25s\n"); - } - { - std::ostringstream oss; - caller.call("period", {"0"}, -1, PUT, oss); - REQUIRE(oss.str() == "period 0\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setPeriod(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getPeriod(); + { + std::ostringstream oss; + caller.call("period", {"1.25s"}, -1, PUT, oss); + REQUIRE(oss.str() == "period 1.25s\n"); + } + { + std::ostringstream oss; + caller.call("period", {}, -1, GET, oss); + REQUIRE(oss.str() == "period 1.25s\n"); + } + { + std::ostringstream oss; + caller.call("period", {"0"}, -1, PUT, oss); + REQUIRE(oss.str() == "period 0\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setPeriod(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("period", {}, -1, GET)); } } @@ -922,32 +922,36 @@ TEST_CASE("CALLER::delay", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER) { - REQUIRE_THROWS(caller.call("delay", {"1"}, -1, PUT)); - REQUIRE_THROWS(caller.call("delay", {}, -1, GET)); - } else if (det_type == defs::GOTTHARD) { - // extra delays for master (can throw when setting) - REQUIRE_NOTHROW(caller.call("delay", {}, -1, GET)); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::EIGER) { + REQUIRE_THROWS(caller.call("delay", {"1"}, -1, PUT)); + REQUIRE_THROWS(caller.call("delay", {}, -1, GET)); + } else if (det_type == defs::GOTTHARD) { + // extra delays for master (can throw when setting) + REQUIRE_NOTHROW(caller.call("delay", {}, -1, GET)); + } else { + auto prev_val = det.getDelayAfterTrigger(); + { + std::ostringstream oss; + caller.call("delay", {"1.25s"}, -1, PUT, oss); + REQUIRE(oss.str() == "delay 1.25s\n"); + } + { + std::ostringstream oss; + caller.call("delay", {}, -1, GET, oss); + REQUIRE(oss.str() == "delay 1.25s\n"); + } + { + std::ostringstream oss; + caller.call("delay", {"0s"}, -1, PUT, oss); + REQUIRE(oss.str() == "delay 0s\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setDelayAfterTrigger(prev_val[i], {i}); + } + } } else { - auto prev_val = det.getDelayAfterTrigger(); - { - std::ostringstream oss; - caller.call("delay", {"1.25s"}, -1, PUT, oss); - REQUIRE(oss.str() == "delay 1.25s\n"); - } - { - std::ostringstream oss; - caller.call("delay", {}, -1, GET, oss); - REQUIRE(oss.str() == "delay 1.25s\n"); - } - { - std::ostringstream oss; - caller.call("delay", {"0s"}, -1, PUT, oss); - REQUIRE(oss.str() == "delay 0s\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setDelayAfterTrigger(prev_val[i], {i}); - } + REQUIRE_THROWS(caller.call("delay", {}, -1, GET)); } } @@ -955,7 +959,7 @@ TEST_CASE("CALLER::framesl", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER) { + if (det_type == defs::EIGER || det_type == defs::XILINX_CHIPTESTBOARD) { REQUIRE_THROWS(caller.call("framesl", {}, -1, GET)); } else { REQUIRE_NOTHROW(caller.call("framesl", {}, -1, GET)); @@ -966,7 +970,7 @@ TEST_CASE("CALLER::triggersl", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER) { + if (det_type == defs::EIGER || det_type == defs::XILINX_CHIPTESTBOARD) { REQUIRE_THROWS(caller.call("triggersl", {}, -1, GET)); } else { REQUIRE_NOTHROW(caller.call("triggersl", {}, -1, GET)); @@ -980,6 +984,7 @@ TEST_CASE("CALLER::delayl", "[.cmdcall]") { switch (det_type) { case defs::EIGER: case defs::CHIPTESTBOARD: + case defs::XILINX_CHIPTESTBOARD: case defs::GOTTHARD2: case defs::MYTHEN3: REQUIRE_THROWS(caller.call("delayl", {}, -1, GET)); @@ -997,6 +1002,7 @@ TEST_CASE("CALLER::periodl", "[.cmdcall]") { switch (det_type) { case defs::EIGER: case defs::CHIPTESTBOARD: + case defs::XILINX_CHIPTESTBOARD: case defs::GOTTHARD2: case defs::MYTHEN3: REQUIRE_THROWS(caller.call("periodl", {}, -1, GET)); @@ -1011,41 +1017,45 @@ TEST_CASE("CALLER::dr", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER) { - auto dr = det.getDynamicRange().squash(); - std::array vals{4, 8, 16, 32}; - for (const auto val : vals) { - std::ostringstream oss1, oss2; - caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); - REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); - caller.call("dr", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); - } - det.setDynamicRange(dr); - } else if (det_type == defs::MYTHEN3) { - auto dr = det.getDynamicRange().squash(); - // not updated in firmware to support dr 1 - std::array vals{8, 16, 32}; - for (const auto val : vals) { - std::ostringstream oss1, oss2; - caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); - REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); - caller.call("dr", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); - } - det.setDynamicRange(dr); - } else { - // For the other detectors we should get an error message - // except for dr 16 - REQUIRE_THROWS(caller.call("dr", {"4"}, -1, PUT)); - REQUIRE_THROWS(caller.call("dr", {"8"}, -1, PUT)); - REQUIRE_THROWS(caller.call("dr", {"32"}, -1, PUT)); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::EIGER) { + auto dr = det.getDynamicRange().squash(); + std::array vals{4, 8, 16, 32}; + for (const auto val : vals) { + std::ostringstream oss1, oss2; + caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); + REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); + caller.call("dr", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); + } + det.setDynamicRange(dr); + } else if (det_type == defs::MYTHEN3) { + auto dr = det.getDynamicRange().squash(); + // not updated in firmware to support dr 1 + std::array vals{8, 16, 32}; + for (const auto val : vals) { + std::ostringstream oss1, oss2; + caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); + REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); + caller.call("dr", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); + } + det.setDynamicRange(dr); + } else { + // For the other detectors we should get an error message + // except for dr 16 + REQUIRE_THROWS(caller.call("dr", {"4"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dr", {"8"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dr", {"32"}, -1, PUT)); - std::ostringstream oss1, oss2; - caller.call("dr", {"16"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "dr 16\n"); - caller.call("dr", {"16"}, -1, PUT, oss2); - REQUIRE(oss2.str() == "dr 16\n"); + std::ostringstream oss1, oss2; + caller.call("dr", {"16"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "dr 16\n"); + caller.call("dr", {"16"}, -1, PUT, oss2); + REQUIRE(oss2.str() == "dr 16\n"); + } + } else { + REQUIRE_THROWS(caller.call("dr", {}, -1, GET)); } } @@ -1059,62 +1069,67 @@ TEST_CASE("CALLER::drlist", "[.cmdcall]") { TEST_CASE("CALLER::timing", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getTimingMode(); - det.setTimingMode(defs::AUTO_TIMING); - { - std::ostringstream oss1, oss2; - caller.call("timing", {"auto"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing auto\n"); - caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing auto\n"); - } - { - std::ostringstream oss1, oss2; - caller.call("timing", {"trigger"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing trigger\n"); - caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing trigger\n"); - } auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER) { + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getTimingMode(); + det.setTimingMode(defs::AUTO_TIMING); { std::ostringstream oss1, oss2; - caller.call("timing", {"gating"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing gating\n"); + caller.call("timing", {"auto"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing auto\n"); caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing gating\n"); + REQUIRE(oss2.str() == "timing auto\n"); } { std::ostringstream oss1, oss2; - caller.call("timing", {"burst_trigger"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing burst_trigger\n"); + caller.call("timing", {"trigger"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing trigger\n"); caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing burst_trigger\n"); + REQUIRE(oss2.str() == "timing trigger\n"); } - REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); - } else if (det_type == defs::MYTHEN3) { - { - std::ostringstream oss1, oss2; - caller.call("timing", {"gating"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing gating\n"); - caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing gating\n"); + if (det_type == defs::EIGER) { + { + std::ostringstream oss1, oss2; + caller.call("timing", {"gating"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing gating\n"); + caller.call("timing", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "timing gating\n"); + } + { + std::ostringstream oss1, oss2; + caller.call("timing", {"burst_trigger"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing burst_trigger\n"); + caller.call("timing", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "timing burst_trigger\n"); + } + REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); + } else if (det_type == defs::MYTHEN3) { + { + std::ostringstream oss1, oss2; + caller.call("timing", {"gating"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing gating\n"); + caller.call("timing", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "timing gating\n"); + } + { + std::ostringstream oss1, oss2; + caller.call("timing", {"trigger_gating"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing trigger_gating\n"); + caller.call("timing", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "timing trigger_gating\n"); + } + REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); + } else { + REQUIRE_THROWS(caller.call("timing", {"gating"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); } - { - std::ostringstream oss1, oss2; - caller.call("timing", {"trigger_gating"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing trigger_gating\n"); - caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing trigger_gating\n"); + for (int i = 0; i != det.size(); ++i) { + det.setTimingMode(prev_val[i], {i}); } - REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); } else { - REQUIRE_THROWS(caller.call("timing", {"gating"}, -1, PUT)); - REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); - REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); - } - for (int i = 0; i != det.size(); ++i) { - det.setTimingMode(prev_val[i], {i}); + REQUIRE_THROWS(caller.call("timing", {}, -1, GET)); + } } @@ -1417,97 +1432,102 @@ TEST_CASE("CALLER::highvoltage", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - auto prev_val = det.getHighVoltage(); - // selected values - if (det_type == defs::GOTTHARD) { - REQUIRE_THROWS(caller.call("highvoltage", {"50"}, -1, PUT)); - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"90"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 90\n"); - caller.call("highvoltage", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 90\n"); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getHighVoltage(); + // selected values + if (det_type == defs::GOTTHARD) { + REQUIRE_THROWS(caller.call("highvoltage", {"50"}, -1, PUT)); + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"90"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 90\n"); + caller.call("highvoltage", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 90\n"); + } + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"0"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 0\n"); + caller.call("highvoltage", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 0\n"); + } } - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"0"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 0\n"); - caller.call("highvoltage", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 0\n"); + // range 0, 60 - 200 + else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD) { + REQUIRE_THROWS(caller.call("highvoltage", {"50"}, -1, PUT)); + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"90"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 90\n"); + caller.call("highvoltage", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 90\n"); + } + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"0"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 0\n"); + caller.call("highvoltage", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 0\n"); + } } - } - // range 0, 60 - 200 - else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || - det_type == defs::CHIPTESTBOARD) { - REQUIRE_THROWS(caller.call("highvoltage", {"50"}, -1, PUT)); - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"90"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 90\n"); - caller.call("highvoltage", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 90\n"); + // full range 0 - 200 (get needs to wait) + else if (det_type == defs::EIGER) { + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"50"}, 0, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 50\n"); + std::this_thread::sleep_for(std::chrono::seconds(2)); + caller.call("highvoltage", {}, 0, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 50\n"); + } + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"120"}, 0, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 120\n"); + std::this_thread::sleep_for(std::chrono::seconds(2)); + caller.call("highvoltage", {}, 0, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 120\n"); + } + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"0"}, 0, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 0\n"); + std::this_thread::sleep_for(std::chrono::seconds(2)); + caller.call("highvoltage", {}, 0, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 0\n"); + } } - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"0"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 0\n"); - caller.call("highvoltage", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 0\n"); + // full range 0 - 200 + else { + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"50"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 50\n"); + caller.call("highvoltage", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 50\n"); + } + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"120"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 120\n"); + caller.call("highvoltage", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 120\n"); + } + { + std::ostringstream oss1, oss2; + caller.call("highvoltage", {"0"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "highvoltage 0\n"); + caller.call("highvoltage", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "highvoltage 0\n"); + } } - } - // full range 0 - 200 (get needs to wait) - else if (det_type == defs::EIGER) { - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"50"}, 0, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 50\n"); - std::this_thread::sleep_for(std::chrono::seconds(2)); - caller.call("highvoltage", {}, 0, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 50\n"); + for (int i = 0; i != det.size(); ++i) { + det.setHighVoltage(prev_val[i], {i}); } - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"120"}, 0, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 120\n"); - std::this_thread::sleep_for(std::chrono::seconds(2)); - caller.call("highvoltage", {}, 0, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 120\n"); - } - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"0"}, 0, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 0\n"); - std::this_thread::sleep_for(std::chrono::seconds(2)); - caller.call("highvoltage", {}, 0, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 0\n"); - } - } - // full range 0 - 200 - else { - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"50"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 50\n"); - caller.call("highvoltage", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 50\n"); - } - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"120"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 120\n"); - caller.call("highvoltage", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 120\n"); - } - { - std::ostringstream oss1, oss2; - caller.call("highvoltage", {"0"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "highvoltage 0\n"); - caller.call("highvoltage", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "highvoltage 0\n"); - } - } - for (int i = 0; i != det.size(); ++i) { - det.setHighVoltage(prev_val[i], {i}); + } else { + REQUIRE_THROWS(caller.call("highvoltage", {"0"}, -1, PUT)); + REQUIRE_THROWS(caller.call("highvoltage", {}, -1, GET)); } } @@ -2005,7 +2025,7 @@ TEST_CASE("CALLER::temp_fpga", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::CHIPTESTBOARD) { + if (det_type != defs::CHIPTESTBOARD && det_type != defs::XILINX_CHIPTESTBOARD) { REQUIRE_NOTHROW(caller.call("temp_fpga", {}, -1, GET)); std::ostringstream oss; REQUIRE_NOTHROW(caller.call("temp_fpga", {}, 0, GET, oss)); @@ -2056,15 +2076,21 @@ TEST_CASE("CALLER::daclist", "[.cmdcall]") { TEST_CASE("CALLER::dacvalues", "[.cmdcall]") { Detector det; Caller caller(&det); - REQUIRE_NOTHROW(caller.call("dacvalues", {}, -1, GET)); - REQUIRE_THROWS(caller.call("dacvalues", {}, -1, PUT)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + REQUIRE_NOTHROW(caller.call("dacvalues", {}, -1, GET)); + REQUIRE_THROWS(caller.call("dacvalues", {}, -1, PUT)); + } else { + REQUIRE_THROWS(caller.call("dacvalues", {}, -1, GET)); + + } } TEST_CASE("CALLER::defaultdac", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::CHIPTESTBOARD) { + if (det_type != defs::CHIPTESTBOARD && det_type != defs::XILINX_CHIPTESTBOARD) { REQUIRE_THROWS(caller.call("defaultdac", {}, -1, GET)); REQUIRE_THROWS(caller.call("defaultdac", {"blabla"}, -1, PUT)); auto daclist = det.getDacList(); @@ -2123,7 +2149,7 @@ TEST_CASE("CALLER::resetdacs", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::CHIPTESTBOARD) { + if (det_type != defs::CHIPTESTBOARD && det_type != defs::XILINX_CHIPTESTBOARD) { auto prev_val = det.getSettings(); REQUIRE_THROWS(caller.call("resetdacs", {}, -1, GET)); @@ -2241,124 +2267,138 @@ TEST_CASE("CALLER::clearbusy", "[.cmdcall]") { TEST_CASE("CALLER::start", "[.cmdcall]") { Detector det; Caller caller(&det); - // PUT only command - REQUIRE_THROWS(caller.call("start", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); - std::chrono::nanoseconds prev_val; - if (det_type != defs::MYTHEN3) { - prev_val = det.getExptime().tsquash("inconsistent exptime to test"); - } else { - auto t = - det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); - if (t[0] != t[1] || t[1] != t[2]) { - throw RuntimeError("inconsistent exptime for all gates"); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + // PUT only command + REQUIRE_THROWS(caller.call("start", {}, -1, GET)); + auto det_type = det.getDetectorType().squash(); + std::chrono::nanoseconds prev_val; + if (det_type != defs::MYTHEN3) { + prev_val = det.getExptime().tsquash("inconsistent exptime to test"); + } else { + auto t = + det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); + if (t[0] != t[1] || t[1] != t[2]) { + throw RuntimeError("inconsistent exptime for all gates"); + } + prev_val = t[0]; } - prev_val = t[0]; + auto prev_frames = + det.getNumberOfFrames().tsquash("inconsistent #frames in test"); + auto prev_period = det.getPeriod().tsquash("inconsistent period in test"); + det.setExptime(-1, std::chrono::microseconds(200)); + det.setPeriod(std::chrono::milliseconds(1)); + det.setNumberOfFrames(2000); + { + std::ostringstream oss; + caller.call("start", {}, -1, PUT, oss); + REQUIRE(oss.str() == "start successful\n"); + } + if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { + std::ostringstream oss; + caller.call("status", {}, -1, GET, oss); + REQUIRE(oss.str() == "status running\n"); + } + det.stopDetector(); + det.setExptime(-1, prev_val); + det.setPeriod(prev_period); + det.setNumberOfFrames(prev_frames); + } else { + REQUIRE_THROWS(caller.call("start", {}, -1, GET)); } - auto prev_frames = - det.getNumberOfFrames().tsquash("inconsistent #frames in test"); - auto prev_period = det.getPeriod().tsquash("inconsistent period in test"); - det.setExptime(-1, std::chrono::microseconds(200)); - det.setPeriod(std::chrono::milliseconds(1)); - det.setNumberOfFrames(2000); - { - std::ostringstream oss; - caller.call("start", {}, -1, PUT, oss); - REQUIRE(oss.str() == "start successful\n"); - } - if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { - std::ostringstream oss; - caller.call("status", {}, -1, GET, oss); - REQUIRE(oss.str() == "status running\n"); - } - det.stopDetector(); - det.setExptime(-1, prev_val); - det.setPeriod(prev_period); - det.setNumberOfFrames(prev_frames); } TEST_CASE("CALLER::stop", "[.cmdcall]") { Detector det; Caller caller(&det); - // PUT only command - REQUIRE_THROWS(caller.call("stop", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); - std::chrono::nanoseconds prev_val; - if (det_type != defs::MYTHEN3) { - prev_val = det.getExptime().tsquash("inconsistent exptime to test"); - } else { - auto t = - det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); - if (t[0] != t[1] || t[1] != t[2]) { - throw RuntimeError("inconsistent exptime for all gates"); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + // PUT only command + REQUIRE_THROWS(caller.call("stop", {}, -1, GET)); + auto det_type = det.getDetectorType().squash(); + std::chrono::nanoseconds prev_val; + if (det_type != defs::MYTHEN3) { + prev_val = det.getExptime().tsquash("inconsistent exptime to test"); + } else { + auto t = + det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); + if (t[0] != t[1] || t[1] != t[2]) { + throw RuntimeError("inconsistent exptime for all gates"); + } + prev_val = t[0]; } - prev_val = t[0]; + auto prev_frames = + det.getNumberOfFrames().tsquash("inconsistent #frames in test"); + auto prev_period = det.getPeriod().tsquash("inconsistent period in test"); + det.setExptime(-1, std::chrono::microseconds(200)); + det.setPeriod(std::chrono::milliseconds(1)); + det.setNumberOfFrames(2000); + det.startDetector(); + if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { + std::ostringstream oss; + caller.call("status", {}, -1, GET, oss); + REQUIRE(oss.str() == "status running\n"); + } + { + std::ostringstream oss; + caller.call("stop", {}, -1, PUT, oss); + REQUIRE(oss.str() == "stop successful\n"); + } + { + std::ostringstream oss; + caller.call("status", {}, -1, GET, oss); + REQUIRE(((oss.str() == "status stopped\n") || + (oss.str() == "status idle\n"))); + } + det.setExptime(-1, prev_val); + det.setPeriod(prev_period); + det.setNumberOfFrames(prev_frames); + } else { + REQUIRE_THROWS(caller.call("stop", {}, -1, GET)); } - auto prev_frames = - det.getNumberOfFrames().tsquash("inconsistent #frames in test"); - auto prev_period = det.getPeriod().tsquash("inconsistent period in test"); - det.setExptime(-1, std::chrono::microseconds(200)); - det.setPeriod(std::chrono::milliseconds(1)); - det.setNumberOfFrames(2000); - det.startDetector(); - if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { - std::ostringstream oss; - caller.call("status", {}, -1, GET, oss); - REQUIRE(oss.str() == "status running\n"); - } - { - std::ostringstream oss; - caller.call("stop", {}, -1, PUT, oss); - REQUIRE(oss.str() == "stop successful\n"); - } - { - std::ostringstream oss; - caller.call("status", {}, -1, GET, oss); - REQUIRE(((oss.str() == "status stopped\n") || - (oss.str() == "status idle\n"))); - } - det.setExptime(-1, prev_val); - det.setPeriod(prev_period); - det.setNumberOfFrames(prev_frames); } TEST_CASE("CALLER::status", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - std::chrono::nanoseconds prev_val; - if (det_type != defs::MYTHEN3) { - prev_val = det.getExptime().tsquash("inconsistent exptime to test"); - } else { - auto t = - det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); - if (t[0] != t[1] || t[1] != t[2]) { - throw RuntimeError("inconsistent exptime for all gates"); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + std::chrono::nanoseconds prev_val; + if (det_type != defs::MYTHEN3) { + prev_val = det.getExptime().tsquash("inconsistent exptime to test"); + } else { + auto t = + det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); + if (t[0] != t[1] || t[1] != t[2]) { + throw RuntimeError("inconsistent exptime for all gates"); + } + prev_val = t[0]; } - prev_val = t[0]; + auto prev_frames = + det.getNumberOfFrames().tsquash("inconsistent #frames in test"); + auto prev_period = det.getPeriod().tsquash("inconsistent period in test"); + det.setExptime(-1, std::chrono::microseconds(200)); + det.setPeriod(std::chrono::milliseconds(1)); + det.setNumberOfFrames(2000); + det.startDetector(); + if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { + std::ostringstream oss; + caller.call("status", {}, -1, GET, oss); + REQUIRE(oss.str() == "status running\n"); + } + det.stopDetector(); + { + std::ostringstream oss; + caller.call("status", {}, -1, GET, oss); + REQUIRE(((oss.str() == "status stopped\n") || + (oss.str() == "status idle\n"))); + } + det.setExptime(-1, prev_val); + det.setPeriod(prev_period); + det.setNumberOfFrames(prev_frames); + } else { + REQUIRE_THROWS(caller.call("status", {}, -1, GET)); } - auto prev_frames = - det.getNumberOfFrames().tsquash("inconsistent #frames in test"); - auto prev_period = det.getPeriod().tsquash("inconsistent period in test"); - det.setExptime(-1, std::chrono::microseconds(200)); - det.setPeriod(std::chrono::milliseconds(1)); - det.setNumberOfFrames(2000); - det.startDetector(); - if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { - std::ostringstream oss; - caller.call("status", {}, -1, GET, oss); - REQUIRE(oss.str() == "status running\n"); - } - det.stopDetector(); - { - std::ostringstream oss; - caller.call("status", {}, -1, GET, oss); - REQUIRE(((oss.str() == "status stopped\n") || - (oss.str() == "status idle\n"))); - } - det.setExptime(-1, prev_val); - det.setPeriod(prev_period); - det.setNumberOfFrames(prev_frames); } TEST_CASE("CALLER::nextframenumber", "[.cmdcall]") { @@ -2433,126 +2473,130 @@ TEST_CASE("CALLER::scan", "[.cmdcall]") { defs::dacIndex ind = defs::DAC_0; defs::dacIndex notImplementedInd = defs::DAC_0; auto det_type = det.getDetectorType().squash(); - switch (det_type) { - case defs::CHIPTESTBOARD: - ind = defs::DAC_0; - notImplementedInd = defs::VSVP; - break; - case defs::EIGER: - ind = defs::VCMP_LL; - notImplementedInd = defs::VCASCP_PB; - break; - case defs::JUNGFRAU: - ind = defs::VB_COMP; - notImplementedInd = defs::VSVP; - break; - case defs::MOENCH: - ind = defs::VIN_CM; - notImplementedInd = defs::VSVP; - break; - case defs::GOTTHARD: - ind = defs::VREF_DS; - notImplementedInd = defs::VSVP; - break; - case defs::GOTTHARD2: - ind = defs::VB_COMP_FE; - notImplementedInd = defs::VSVP; - break; - case defs::MYTHEN3: - ind = defs::VTH2; - notImplementedInd = defs::VSVP; - break; - default: - break; - } + if (det_type != defs::XILINX_CHIPTESTBOARD) { + switch (det_type) { + case defs::CHIPTESTBOARD: + ind = defs::DAC_0; + notImplementedInd = defs::VSVP; + break; + case defs::EIGER: + ind = defs::VCMP_LL; + notImplementedInd = defs::VCASCP_PB; + break; + case defs::JUNGFRAU: + ind = defs::VB_COMP; + notImplementedInd = defs::VSVP; + break; + case defs::MOENCH: + ind = defs::VIN_CM; + notImplementedInd = defs::VSVP; + break; + case defs::GOTTHARD: + ind = defs::VREF_DS; + notImplementedInd = defs::VSVP; + break; + case defs::GOTTHARD2: + ind = defs::VB_COMP_FE; + notImplementedInd = defs::VSVP; + break; + case defs::MYTHEN3: + ind = defs::VTH2; + notImplementedInd = defs::VSVP; + break; + default: + break; + } - // when taking acquisition - // auto previous = det.getDAC(ind, false); - // auto notImplementedPrevious = det.getDAC(notImplementedInd, false); + // when taking acquisition + // auto previous = det.getDAC(ind, false); + // auto notImplementedPrevious = det.getDAC(notImplementedInd, false); - if (det_type == defs::MYTHEN3 && det.size() > 1) { - ; // scan only allowed for single module due to sync - } else { - { - std::ostringstream oss; - caller.call("scan", {ToString(ind), "500", "1500", "500"}, -1, PUT, - oss); - CHECK(oss.str() == - "scan [" + ToString(ind) + ", 500, 1500, 500]\n"); - } - { - std::ostringstream oss; - caller.call("scan", {}, -1, GET, oss); - CHECK(oss.str() == "scan [enabled\ndac " + ToString(ind) + - "\nstart 500\nstop 1500\nstep " - "500\nsettleTime 1ms\n]\n"); - } - { - std::ostringstream oss; - caller.call("scan", {ToString(ind), "500", "1500", "500", "2s"}, -1, - PUT, oss); - CHECK(oss.str() == - "scan [" + ToString(ind) + ", 500, 1500, 500, 2s]\n"); - } - { - std::ostringstream oss; - caller.call("scan", {}, -1, GET, oss); - CHECK(oss.str() == "scan [enabled\ndac " + ToString(ind) + - "\nstart 500\nstop 1500\nstep " - "500\nsettleTime 2s\n]\n"); - } - { - std::ostringstream oss; - caller.call("scan", {"0"}, -1, PUT, oss); - CHECK(oss.str() == "scan [0]\n"); - } - { - std::ostringstream oss; - caller.call("scan", {}, -1, GET, oss); - CHECK(oss.str() == "scan [disabled]\n"); - } - { - std::ostringstream oss; - caller.call("scan", {ToString(ind), "1500", "500", "-500"}, -1, PUT, - oss); - CHECK(oss.str() == - "scan [" + ToString(ind) + ", 1500, 500, -500]\n"); - } - CHECK_THROWS(caller.call( - "scan", {ToString(notImplementedInd), "500", "1500", "500"}, -1, - PUT)); - CHECK_THROWS(caller.call("scan", {ToString(ind), "500", "1500", "-500"}, - -1, PUT)); - CHECK_THROWS(caller.call("scan", {ToString(ind), "1500", "500", "500"}, - -1, PUT)); - - if (det_type == defs::MYTHEN3 || defs::EIGER) { + if (det_type == defs::MYTHEN3 && det.size() > 1) { + ; // scan only allowed for single module due to sync + } else { { std::ostringstream oss; - caller.call("scan", {"trimbits", "0", "63", "16", "2s"}, -1, - PUT, oss); - CHECK(oss.str() == "scan [trimbits, 0, 63, 16, 2s]\n"); + caller.call("scan", {ToString(ind), "500", "1500", "500"}, -1, PUT, + oss); + CHECK(oss.str() == + "scan [" + ToString(ind) + ", 500, 1500, 500]\n"); } { std::ostringstream oss; caller.call("scan", {}, -1, GET, oss); - CHECK(oss.str() == - "scan [enabled\ndac trimbits\nstart 0\nstop 48\nstep " - "16\nsettleTime 2s\n]\n"); + CHECK(oss.str() == "scan [enabled\ndac " + ToString(ind) + + "\nstart 500\nstop 1500\nstep " + "500\nsettleTime 1ms\n]\n"); } + { + std::ostringstream oss; + caller.call("scan", {ToString(ind), "500", "1500", "500", "2s"}, -1, + PUT, oss); + CHECK(oss.str() == + "scan [" + ToString(ind) + ", 500, 1500, 500, 2s]\n"); + } + { + std::ostringstream oss; + caller.call("scan", {}, -1, GET, oss); + CHECK(oss.str() == "scan [enabled\ndac " + ToString(ind) + + "\nstart 500\nstop 1500\nstep " + "500\nsettleTime 2s\n]\n"); + } + { + std::ostringstream oss; + caller.call("scan", {"0"}, -1, PUT, oss); + CHECK(oss.str() == "scan [0]\n"); + } + { + std::ostringstream oss; + caller.call("scan", {}, -1, GET, oss); + CHECK(oss.str() == "scan [disabled]\n"); + } + { + std::ostringstream oss; + caller.call("scan", {ToString(ind), "1500", "500", "-500"}, -1, PUT, + oss); + CHECK(oss.str() == + "scan [" + ToString(ind) + ", 1500, 500, -500]\n"); + } + CHECK_THROWS(caller.call( + "scan", {ToString(notImplementedInd), "500", "1500", "500"}, -1, + PUT)); + CHECK_THROWS(caller.call("scan", {ToString(ind), "500", "1500", "-500"}, + -1, PUT)); + CHECK_THROWS(caller.call("scan", {ToString(ind), "1500", "500", "500"}, + -1, PUT)); + + if (det_type == defs::MYTHEN3 || defs::EIGER) { + { + std::ostringstream oss; + caller.call("scan", {"trimbits", "0", "63", "16", "2s"}, -1, + PUT, oss); + CHECK(oss.str() == "scan [trimbits, 0, 63, 16, 2s]\n"); + } + { + std::ostringstream oss; + caller.call("scan", {}, -1, GET, oss); + CHECK(oss.str() == + "scan [enabled\ndac trimbits\nstart 0\nstop 48\nstep " + "16\nsettleTime 2s\n]\n"); + } + } + + // Switch off scan for future tests + det.setScan(defs::scanParameters()); + // acquire for each? + + // when taking acquisition + // Reset all dacs to previous value + // for (int i = 0; i != det.size(); ++i) { + // det.setDAC(ind, previous[i], false, {i}); + // det.setDAC(notImplementedInd, notImplementedPrevious[i], false, + // {i}); + // } } - - // Switch off scan for future tests - det.setScan(defs::scanParameters()); - // acquire for each? - - // when taking acquisition - // Reset all dacs to previous value - // for (int i = 0; i != det.size(); ++i) { - // det.setDAC(ind, previous[i], false, {i}); - // det.setDAC(notImplementedInd, notImplementedPrevious[i], false, - // {i}); - // } + } else { + REQUIRE_THROWS(caller.call("scan", {ToString(defs::DAC_0), "500", "1500", "500"}, -1, PUT)); } } @@ -2608,15 +2652,20 @@ TEST_CASE("CALLER::numinterfaces", "[.cmdcall]") { TEST_CASE("CALLER::udp_srcip", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getSourceUDPIP(); - REQUIRE_THROWS(caller.call("udp_srcip", {"0.0.0.0"}, -1, PUT)); - { - std::ostringstream oss; - caller.call("udp_srcip", {"129.129.205.12"}, -1, PUT, oss); - REQUIRE(oss.str() == "udp_srcip 129.129.205.12\n"); - } - for (int i = 0; i != det.size(); ++i) { - det.setSourceUDPIP(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getSourceUDPIP(); + REQUIRE_THROWS(caller.call("udp_srcip", {"0.0.0.0"}, -1, PUT)); + { + std::ostringstream oss; + caller.call("udp_srcip", {"129.129.205.12"}, -1, PUT, oss); + REQUIRE(oss.str() == "udp_srcip 129.129.205.12\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setSourceUDPIP(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("udp_srcip", {}, -1, GET)); } } @@ -2652,9 +2701,15 @@ TEST_CASE("CALLER::udp_numdst", "[.cmdcall]") { TEST_CASE("CALLER::udp_cleardst", "[.cmdcall]") { Detector det; Caller caller(&det); - REQUIRE_THROWS(caller.call("udp_cleardst", {}, -1, GET)); - /* dont clear all udp destinations */ - /*REQUIRE_NOTHROW(caller.call("udp_cleardst", {}, -1, PUT));*/ + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + REQUIRE_THROWS(caller.call("udp_cleardst", {}, -1, GET)); + /* dont clear all udp destinations */ + /*REQUIRE_NOTHROW(caller.call("udp_cleardst", {}, -1, PUT));*/ + } else { + REQUIRE_THROWS(caller.call("udp_cleardst", {}, -1, PUT)); + + } } TEST_CASE("CALLER::udp_firstdst", "[.cmdcall]") { @@ -2700,17 +2755,22 @@ TEST_CASE("CALLER::udp_dstip", "[.cmdcall]") { TEST_CASE("CALLER::udp_srcmac", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getSourceUDPMAC(); - REQUIRE_THROWS(caller.call("udp_srcmac", {"00:00:00:00:00:00"}, -1, PUT)); - { - std::ostringstream oss; - caller.call("udp_srcmac", {"00:50:c2:42:34:12"}, -1, PUT, oss); - REQUIRE(oss.str() == "udp_srcmac 00:50:c2:42:34:12\n"); - } - for (int i = 0; i != det.size(); ++i) { - if (prev_val[i].str() != "00:00:00:00:00:00") { - det.setSourceUDPMAC(prev_val[i], {i}); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getSourceUDPMAC(); + REQUIRE_THROWS(caller.call("udp_srcmac", {"00:00:00:00:00:00"}, -1, PUT)); + { + std::ostringstream oss; + caller.call("udp_srcmac", {"00:50:c2:42:34:12"}, -1, PUT, oss); + REQUIRE(oss.str() == "udp_srcmac 00:50:c2:42:34:12\n"); } + for (int i = 0; i != det.size(); ++i) { + if (prev_val[i].str() != "00:00:00:00:00:00") { + det.setSourceUDPMAC(prev_val[i], {i}); + } + } + } else { + REQUIRE_THROWS(caller.call("udp_srcmac", {}, -1, GET)); } } @@ -2723,21 +2783,26 @@ TEST_CASE("CALLER::udp_dstmac", "[.cmdcall]") { TEST_CASE("CALLER::udp_dstport", "[.cmdcall]") { Detector det; Caller caller(&det); - auto prev_val = det.getDestinationUDPPort(); - { - std::ostringstream oss; - caller.call("udp_dstport", {"50084"}, -1, PUT, oss); - REQUIRE(oss.str() == "udp_dstport 50084\n"); - } - test_valid_port_caller("udp_dstport", {}, -1, PUT); - test_valid_port_caller("udp_dstport", {}, 0, PUT); - // should fail for the second module - if (det.size() > 1) { - REQUIRE_THROWS(caller.call("udp_dstport", {"65535"}, -1, PUT)); - } + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + auto prev_val = det.getDestinationUDPPort(); + { + std::ostringstream oss; + caller.call("udp_dstport", {"50084"}, -1, PUT, oss); + REQUIRE(oss.str() == "udp_dstport 50084\n"); + } + test_valid_port_caller("udp_dstport", {}, -1, PUT); + test_valid_port_caller("udp_dstport", {}, 0, PUT); + // should fail for the second module + if (det.size() > 1) { + REQUIRE_THROWS(caller.call("udp_dstport", {"65535"}, -1, PUT)); + } - for (int i = 0; i != det.size(); ++i) { - det.setDestinationUDPPort(prev_val[i], {i}); + for (int i = 0; i != det.size(); ++i) { + det.setDestinationUDPPort(prev_val[i], {i}); + } + } else { + REQUIRE_THROWS(caller.call("udp_dstport", {}, -1, GET)); } } @@ -2844,15 +2909,26 @@ TEST_CASE("CALLER::udp_dstport2", "[.cmdcall]") { TEST_CASE("CALLER::udp_reconfigure", "[.cmdcall]") { Detector det; Caller caller(&det); - REQUIRE_THROWS(caller.call("udp_reconfigure", {}, -1, GET)); - REQUIRE_NOTHROW(caller.call("udp_reconfigure", {}, -1, PUT)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + REQUIRE_THROWS(caller.call("udp_reconfigure", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("udp_reconfigure", {}, -1, PUT)); + } else { + REQUIRE_THROWS(caller.call("udp_reconfigure", {}, -1, PUT)); + } } TEST_CASE("CALLER::udp_validate", "[.cmdcall]") { Detector det; Caller caller(&det); - REQUIRE_THROWS(caller.call("udp_validate", {}, -1, GET)); - REQUIRE_NOTHROW(caller.call("udp_validate", {}, -1, PUT)); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + REQUIRE_THROWS(caller.call("udp_validate", {}, -1, GET)); + REQUIRE_NOTHROW(caller.call("udp_validate", {}, -1, PUT)); + } else { + REQUIRE_THROWS(caller.call("udp_validate", {}, -1, PUT)); + + } } TEST_CASE("CALLER::tengiga", "[.cmdcall]") { @@ -3072,16 +3148,19 @@ TEST_CASE("CALLER::zmqport", "[.cmdcall]") { TEST_CASE("CALLER::zmqip", "[.cmdcall]") { Detector det; Caller caller(&det); - std::ostringstream oss1, oss2; - auto zmqip = det.getClientZmqIp(); - caller.call("zmqip", {}, 0, GET, oss1); - REQUIRE(oss1.str() == "zmqip " + zmqip[0].str() + '\n'); + auto det_type = det.getDetectorType().squash(); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + std::ostringstream oss1, oss2; + auto zmqip = det.getClientZmqIp(); + caller.call("zmqip", {}, 0, GET, oss1); + REQUIRE(oss1.str() == "zmqip " + zmqip[0].str() + '\n'); - caller.call("zmqip", {zmqip[0].str()}, 0, PUT, oss2); - REQUIRE(oss2.str() == "zmqip " + zmqip[0].str() + '\n'); + caller.call("zmqip", {zmqip[0].str()}, 0, PUT, oss2); + REQUIRE(oss2.str() == "zmqip " + zmqip[0].str() + '\n'); - for (int i = 0; i != det.size(); ++i) { - det.setRxZmqIP(zmqip[i], {i}); + for (int i = 0; i != det.size(); ++i) { + det.setRxZmqIP(zmqip[i], {i}); + } } } @@ -3238,24 +3317,28 @@ TEST_CASE("CALLER::reg", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::EIGER) { - uint32_t addr = 0x64; - std::string saddr = ToStringHex(addr); - auto prev_val = det.readRegister(addr); - { - std::ostringstream oss1, oss2; - caller.call("reg", {saddr, "0x5"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "reg [" + saddr + ", 0x5]\n"); - caller.call("reg", {saddr}, -1, GET, oss2); - REQUIRE(oss2.str() == "reg 0x5\n"); + if (det_type != defs::XILINX_CHIPTESTBOARD) { + if (det_type != defs::EIGER) { + uint32_t addr = 0x64; + std::string saddr = ToStringHex(addr); + auto prev_val = det.readRegister(addr); + { + std::ostringstream oss1, oss2; + caller.call("reg", {saddr, "0x5"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "reg [" + saddr + ", 0x5]\n"); + caller.call("reg", {saddr}, -1, GET, oss2); + REQUIRE(oss2.str() == "reg 0x5\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.writeRegister(addr, prev_val[i], {i}); + } } - for (int i = 0; i != det.size(); ++i) { - det.writeRegister(addr, prev_val[i], {i}); + // cannot check for eiger virtual server + else { + REQUIRE_NOTHROW(caller.call("reg", {"0x64"}, -1, GET)); } - } - // cannot check for eiger virtual server - else { - REQUIRE_NOTHROW(caller.call("reg", {"0x64"}, -1, GET)); + } else { + REQUIRE_THROWS(caller.call("reg", {}, -1, GET)); } } @@ -3281,7 +3364,7 @@ TEST_CASE("CALLER::setbit", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::EIGER) { + if (det_type != defs::EIGER && det_type != defs::XILINX_CHIPTESTBOARD) { uint32_t addr = 0x64; std::string saddr = ToStringHex(addr); auto prev_val = det.readRegister(addr); @@ -3303,7 +3386,7 @@ TEST_CASE("CALLER::clearbit", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::EIGER) { + if (det_type != defs::EIGER && det_type != defs::XILINX_CHIPTESTBOARD) { uint32_t addr = 0x64; std::string saddr = ToStringHex(addr); auto prev_val = det.readRegister(addr); @@ -3325,7 +3408,9 @@ TEST_CASE("CALLER::getbit", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::EIGER) { + if (det_type == defs::XILINX_CHIPTESTBOARD) { + REQUIRE_THROWS(caller.call("getbit", {"0x64", "1"}, -1, GET)); + } else if (det_type != defs::EIGER) { uint32_t addr = 0x64; std::string saddr = ToStringHex(addr); auto prev_val = det.readRegister(addr); diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index fbb726e37..f14a99937 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -4,11 +4,11 @@ #define RELEASE "developer" #define APILIB "developer 0x230224" #define APIRECEIVER "developer 0x230224" -#define APIXILINXCTB "developer 0x240104" -#define APICTB "developer 0x240104" -#define APIGOTTHARD "developer 0x240104" -#define APIGOTTHARD2 "developer 0x240104" -#define APIJUNGFRAU "developer 0x240104" -#define APIMYTHEN3 "developer 0x240104" -#define APIMOENCH "developer 0x240104" -#define APIEIGER "developer 0x240104" +#define APIXILINXCTB "developer 0x240109" +#define APICTB "developer 0x240109" +#define APIGOTTHARD "developer 0x240109" +#define APIGOTTHARD2 "developer 0x240109" +#define APIJUNGFRAU "developer 0x240109" +#define APIMYTHEN3 "developer 0x240109" +#define APIMOENCH "developer 0x240109" +#define APIEIGER "developer 0x240109" diff --git a/tests/scripts/test_simulators.py b/tests/scripts/test_simulators.py index 2a40ba1a3..1d26c96e7 100644 --- a/tests/scripts/test_simulators.py +++ b/tests/scripts/test_simulators.py @@ -99,7 +99,9 @@ def loadConfig(name, rx_hostname, settingsdir): Log(Fore.GREEN, 'Loading config') try: d = Detector() - if name == 'eiger': + if name == 'xilinx_ctb': + d.hostname = 'localhost' + elif name == 'eiger': d.hostname = 'localhost:' + str(DEFAULT_TCP_CNTRL_PORTNO) + '+localhost:' + str(HALFMOD2_TCP_CNTRL_PORTNO) #d.udp_dstport = {2: 50003} # will set up for every module @@ -174,6 +176,7 @@ if args.servers is None: 'gotthard', 'ctb', 'moench', + 'xilinx_ctb' ] else: servers = args.servers From c8bb70f87659c607ddcca7c76ccd4a5e7d318e53 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 11 Jan 2024 18:01:08 +0100 Subject: [PATCH 28/38] Dev/xilinx defaults and pattern (#888) * implemented testbus, testfpga, set/get #frames, triggers, allowed that and for connection to client, also allowed, getnumchannels, configuremac, getrunstatus, setdetectorposition with dummy values * connected kernelversion, hardwareversion, versions, framesl, triggersl, dr, timingmode, pattern (except patioctrl) thats there for altera ctb * replaced set/get64Bit to set/getU64bit in all loadpattern.c for (ctb and m3 also) --- python/slsdet/detector.py | 52 +- slsDetectorServers/compileAllServers.sh | 3 +- .../compileAllServers_noAPIUpdate.sh | 1 + .../bin/ctbDetectorServer_developer | Bin 328424 -> 328424 bytes .../bin/eigerDetectorServer_developer | Bin 444195 -> 444195 bytes .../bin/gotthard2DetectorServer_developer | Bin 286768 -> 286768 bytes .../bin/gotthardDetectorServer_developer | Bin 277364 -> 277364 bytes .../bin/jungfrauDetectorServer_developer | Bin 312616 -> 312616 bytes .../bin/moenchDetectorServer_developer | Bin 295380 -> 295380 bytes .../bin/mythen3DetectorServer_developer | Bin 300752 -> 300752 bytes .../slsDetectorServer/include/loadPattern.h | 4 +- .../include/slsDetectorFunctionList.h | 13 +- .../slsDetectorServer/src/arm64.c | 2 +- .../slsDetectorServer/src/loadPattern.c | 52 +- .../src/slsDetectorServer_funcs.c | 52 +- .../xilinx_ctbDetectorServer/CMakeLists.txt | 1 + .../xilinx_ctbDetectorServer/Makefile | 2 +- .../xilinx_ctbDetectorServer/RegisterDefs.h | 1340 ++++++++++++++--- .../bin/xilinx_ctbDetectorServer_developer | Bin 232088 -> 233952 bytes .../slsDetectorFunctionList.c | 55 + .../slsDetectorServer_defs.h | 9 +- slsDetectorSoftware/generator/commands.yaml | 32 +- slsDetectorSoftware/include/sls/Detector.h | 44 +- .../tests/Caller/test-Caller-pattern.cpp | 28 +- .../tests/Caller/test-Caller.cpp | 192 ++- slsSupportLib/include/sls/versionAPI.h | 16 +- 26 files changed, 1433 insertions(+), 465 deletions(-) diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index e53ab4295..8a900a588 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -232,7 +232,7 @@ class Detector(CppDetectorApi): @element def hardwareversion(self): """ - [Jungfrau][Moench][Gotthard2][Myhten3][Gotthard][Ctb] Hardware version of detector. \n + Hardware version of detector. \n [Eiger] Hardware version of front FPGA on detector. """ return self.getHardwareVersion() @@ -308,7 +308,7 @@ class Detector(CppDetectorApi): ----- [Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets clkdivider to 2 (quarter speed), else to 0 (full speed)\n [Mythen3] Options: 8, 16, 32 \n - [Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16 + [Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2][Xilinx Ctb] 16 """ return self.getDynamicRange() @@ -400,7 +400,7 @@ class Detector(CppDetectorApi): @element def framesl(self): """ - [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames left in acquisition.\n + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB][Xilinx CTB] Number of frames left in acquisition.\n Note ---- @@ -1951,7 +1951,7 @@ class Detector(CppDetectorApi): @element def triggersl(self): """ - [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of triggers left in acquisition.\n + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB][Xilinx CTB] Number of triggers left in acquisition.\n Note ---- @@ -2180,7 +2180,7 @@ class Detector(CppDetectorApi): Note ----- Default: AUTO_TIMING \n - [Jungfrau][Moench][Gotthard][Ctb][Gotthard2] AUTO_TIMING, TRIGGER_EXPOSURE \n + [Jungfrau][Moench][Gotthard][Ctb][Gotthard2][Xilinx Ctb] AUTO_TIMING, TRIGGER_EXPOSURE \n [Mythen3] AUTO_TIMING, TRIGGER_EXPOSURE, GATED, TRIGGER_GATED \n [Eiger] AUTO_TIMING, TRIGGER_EXPOSURE, GATED, BURST_TRIGGER """ @@ -3477,7 +3477,7 @@ class Detector(CppDetectorApi): @property def pattern(self): - """[Mythen3][Ctb] Loads ASCII pattern file directly to server (instead of executing line by line). + """[Mythen3][Ctb][Xilinx Ctb] Loads ASCII pattern file directly to server (instead of executing line by line). :getter: Not Implemented @@ -3495,7 +3495,7 @@ class Detector(CppDetectorApi): @property def patfname(self): """ - [Ctb][Mythen3] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default + [Ctb][Mythen3][Xilinx Ctb] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default file """ return self.getPatterFileName() @@ -3520,7 +3520,7 @@ class Detector(CppDetectorApi): @property @element def patlimits(self): - """[Ctb][Mythen3] Limits (start and stop address) of complete pattern. + """[Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of complete pattern. Example --------- @@ -3540,7 +3540,7 @@ class Detector(CppDetectorApi): @property @element def patsetbit(self): - """[Ctb][Mythen3] Sets the mask applied to every pattern to the selected bits. + """[Ctb][Mythen3][Xilinx Ctb] Sets the mask applied to every pattern to the selected bits. Example -------- @@ -3557,7 +3557,7 @@ class Detector(CppDetectorApi): @property @element def patmask(self): - """[Ctb][Mythen3] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern. + """[Ctb][Mythen3][Xilinx Ctb] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern. Example -------- @@ -3575,7 +3575,7 @@ class Detector(CppDetectorApi): # @element def patwait(self): """ - [Ctb][Mythen3] Wait address of loop level provided. + [Ctb][Mythen3][Xilinx Ctb] Wait address of loop level provided. Example ------- @@ -3592,7 +3592,7 @@ class Detector(CppDetectorApi): @property @element def patwait0(self): - """[Ctb][Mythen3] Wait 0 address. + """[Ctb][Mythen3][Xilinx Ctb] Wait 0 address. Example -------- @@ -3612,7 +3612,7 @@ class Detector(CppDetectorApi): @property @element def patwait1(self): - """[Ctb][Mythen3] Wait 1 address. + """[Ctb][Mythen3][Xilinx Ctb] Wait 1 address. Example -------- @@ -3632,7 +3632,7 @@ class Detector(CppDetectorApi): @property @element def patwait2(self): - """[Ctb][Mythen3] Wait 2 address. + """[Ctb][Mythen3][Xilinx Ctb] Wait 2 address. Example -------- @@ -3652,7 +3652,7 @@ class Detector(CppDetectorApi): @property def patwaittime(self): """ - [Ctb][Mythen3] Wait time in clock cycles of loop level provided. + [Ctb][Mythen3][Xilinx Ctb] Wait time in clock cycles of loop level provided. Example ------- @@ -3669,7 +3669,7 @@ class Detector(CppDetectorApi): @property @element def patwaittime0(self): - """[Ctb][Mythen3] Wait 0 time in clock cycles.""" + """[Ctb][Mythen3][Xilinx Ctb] Wait 0 time in clock cycles.""" return self.getPatternWaitTime(0) @patwaittime0.setter @@ -3680,7 +3680,7 @@ class Detector(CppDetectorApi): @property @element def patwaittime1(self): - """[Ctb][Mythen3] Wait 1 time in clock cycles.""" + """[Ctb][Mythen3][Xilinx Ctb] Wait 1 time in clock cycles.""" return self.getPatternWaitTime(1) @patwaittime1.setter @@ -3691,7 +3691,7 @@ class Detector(CppDetectorApi): @property @element def patwaittime2(self): - """[Ctb][Mythen3] Wait 2 time in clock cycles.""" + """[Ctb][Mythen3][Xilinx Ctb] Wait 2 time in clock cycles.""" return self.getPatternWaitTime(2) @patwaittime2.setter @@ -3703,7 +3703,7 @@ class Detector(CppDetectorApi): @property def patloop(self): """ - [Ctb][Mythen3] Limits (start and stop address) of the loop provided. + [Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of the loop provided. Example ------- @@ -3720,7 +3720,7 @@ class Detector(CppDetectorApi): @property @element def patloop0(self): - """[Ctb][Mythen3] Limits (start and stop address) of loop 0. + """[Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of loop 0. Example --------- @@ -3740,7 +3740,7 @@ class Detector(CppDetectorApi): @property @element def patloop1(self): - """[Ctb][Mythen3] Limits (start and stop address) of loop 1. + """[Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of loop 1. Example --------- @@ -3761,7 +3761,7 @@ class Detector(CppDetectorApi): @property @element def patloop2(self): - """[Ctb][Mythen3] Limits (start and stop address) of loop 2. + """[Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of loop 2. Example --------- @@ -3783,7 +3783,7 @@ class Detector(CppDetectorApi): @property def patnloop(self): """ - [Ctb][Mythen3] Number of cycles of the loop provided. + [Ctb][Mythen3][Xilinx Ctb] Number of cycles of the loop provided. Example ------- @@ -3800,7 +3800,7 @@ class Detector(CppDetectorApi): @property @element def patnloop0(self): - """[Ctb][Mythen3] Number of cycles of loop 0.""" + """[Ctb][Mythen3][Xilinx Ctb] Number of cycles of loop 0.""" return self.getPatternLoopCycles(0) @patnloop0.setter @@ -3811,7 +3811,7 @@ class Detector(CppDetectorApi): @property @element def patnloop1(self): - """[Ctb][Mythen3] Number of cycles of loop 1.""" + """[Ctb][Mythen3][Xilinx Ctb] Number of cycles of loop 1.""" return self.getPatternLoopCycles(1) @patnloop1.setter @@ -3822,7 +3822,7 @@ class Detector(CppDetectorApi): @property @element def patnloop2(self): - """[Ctb][Mythen3] Number of cycles of loop 2.""" + """[Ctb][Mythen3][Xilinx Ctb] Number of cycles of loop 2.""" return self.getPatternLoopCycles(2) @patnloop2.setter diff --git a/slsDetectorServers/compileAllServers.sh b/slsDetectorServers/compileAllServers.sh index fe48f61fd..eec8907bf 100644 --- a/slsDetectorServers/compileAllServers.sh +++ b/slsDetectorServers/compileAllServers.sh @@ -8,7 +8,8 @@ det_list=("ctbDetectorServer gotthard2DetectorServer jungfrauDetectorServer mythen3DetectorServer - moenchDetectorServer" + moenchDetectorServer + xilinx_ctbDetectorServer" ) usage="\nUsage: compileAllServers.sh [server|all(opt)] [branch(opt)]. \n\tNo arguments mean all servers with 'developer' branch. \n\tNo 'branch' input means 'developer branch'" diff --git a/slsDetectorServers/compileAllServers_noAPIUpdate.sh b/slsDetectorServers/compileAllServers_noAPIUpdate.sh index 2d16347b1..ecfbdf6fb 100644 --- a/slsDetectorServers/compileAllServers_noAPIUpdate.sh +++ b/slsDetectorServers/compileAllServers_noAPIUpdate.sh @@ -9,6 +9,7 @@ det_list=("ctbDetectorServer" "jungfrauDetectorServer" "mythen3DetectorServer" "moenchDetectorServer" + "xilinx_ctbDetectorServer" ) usage="\nUsage: compileAllServers.sh [server|all(opt)] [branch(opt)]. \n\tNo arguments mean all servers with 'developer' branch. \n\tNo 'branch' input means 'developer branch'" diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 2e08e740bd4cb9cea7585082237fbcc032ba2172..46a6e3bc4e8e0e94bc800ae7a1152aca3b436f46 100755 GIT binary patch delta 257 zcmaFSD)ORLWP&F1ynTnJ7fP^5G`ehcVZ88&ap`o?$Bg}qwcD3IW~^q8o`2}U?vJ}o z6cir5U{HMcisAp`Xt4Y&-HfOh?V{BZi+7mVVPR}ZQ{ zrDYgl(o#U}C#Uni1WNBc$ODyDflDg^r8lZm!p{X(3l)H-f7rliz-6EWwCn%lxzq2yU=){}cu)l@ zEyDWH9ahd=C diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index fb03bc42d2a64261660ba5e2a2be8c548d90b0ec..c88182af42779766dc75a9aace56f82d748b7888 100755 GIT binary patch delta 43 wcmZ47C%w2&x}k-!g{g&k3(FrqCPRbm|M*zC!hwwTt~3@PX5HSE#x^qn09RiRcmMzZ delta 43 wcmZ47C%w2&x}k-!g{g&k3(FrqCIidu|M*zC!hwwTt~3@PX5HSE#x^qn09cg|hyVZp diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index f135ab12f3340247bacad2223b798f7a93ea756b..7e05b13de5ef9aadf3800a6320bf5123e3251fa7 100755 GIT binary patch delta 39 ucmdmRKyU*P8C+*};W^W6e7)WHI^%ZZ>r6|fm<$ctZ+&Fie(NK1SRMdgn-O{d delta 39 ucmdmRKyU*P8C+*(@j2IQe7)WHI^%ZZ>r6|fm<%l2Z+&Fie(NK1SRMdg=n;ef diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer index 93e176859c10a8eea632ef7d28fdc84e75d93b36..55866dae24a4804f9291a18b36f85bb8a4510057 100755 GIT binary patch delta 49 zcmezJP2kHnfeD(-^Y$H{Zdk-D(dg3Z!noCi>CQzaLxb%~mzb7`0vYY6o-=Jf^_+QC FFaRTm6)XS% delta 49 zcmezJP2kHnfeD(-bM*|T8x}E3G`h69Fm82Wx^t1qz;e6NC8lMfKt}ti=Sj diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 5e2a3ec150e7fc8684c4968ffd965c38c20db25b..7dfc45b9efcff5018b24fbf78807cbcfa228766d 100755 GIT binary patch delta 52 zcmZ3{CA^|bc!DPLynRQfCq8GEXmn|HVQh6_+UmmmM2*SNV7rz&bCx`i(LT+MdHXas HmPvI01M(6n delta 52 zcmZ3{CA^|bc!DPLTs`CIiO-oO8eLjl7+YPKwz@DsQDZW&+^(h0oFxxrv`=$m-agHZ HWl|jg)vOT~ diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 37277043f51f22c4874fb26449aef70a116f59ae..b52f777db6f08a6e84e81c350ea4d72953913cb1 100755 GIT binary patch delta 49 zcmcc8EOez=Xo4p5ynV-~Z(PkR(dg3Z!noCi$>1-Op~3dDzf4x*Kt}r}5$5fiL|Bw^ E0rM#m8UO$Q delta 49 zcmcc8EOez=Xo4p5Ts@QN8&@++G`h69Fm82WGWg46V7a~QFO!uxkkP(Lgn9cW5f-If E0LV2F1^@s6 diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 7802f6453a36689bca9c2edfd95244988f5ea9cd..e97d939e2ffcde60d087993d06aa2df307704781 100755 GIT binary patch delta 21001 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 diff --git a/slsDetectorServers/slsDetectorServer/include/loadPattern.h b/slsDetectorServers/slsDetectorServer/include/loadPattern.h index 1d87956b9..290e50506 100644 --- a/slsDetectorServers/slsDetectorServer/include/loadPattern.h +++ b/slsDetectorServers/slsDetectorServer/include/loadPattern.h @@ -6,10 +6,12 @@ #include "clogger.h" void initializePatternAddresses(); -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) #ifdef VIRTUAL void initializePatternWord(); #endif +#endif +#if defined(CHIPTESTBOARDD) // TODO || defined(XILINX_CHIPTESTBOARDD) uint64_t validate_readPatternIOControl(); int validate_writePatternIOControl(char *message, uint64_t arg); void writePatternIOControl(uint64_t word); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 6c0a8fad5..6e53976c1 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -86,8 +86,8 @@ uint64_t getFrontEndFirmwareVersion(enum fpgaPosition fpgaPosition); #endif #ifndef XILINX_CHIPTESTBOARDD u_int64_t getFirmwareAPIVersion(); -void getHardwareVersion(char *version); #endif +void getHardwareVersion(char *version); #ifdef EIGERD int getHardwareVersionNumber(); #else @@ -197,10 +197,8 @@ void setMasterSlaveConfiguration(); #endif // parameters - dr, roi -#ifndef XILINX_CHIPTESTBOARDD int setDynamicRange(int dr); int getDynamicRange(int *retval); -#endif #ifdef GOTTHARDD int setROI(ROI arg); ROI getROI(); @@ -309,12 +307,15 @@ uint32_t getCounterMask(); void updatePacketizing(); #endif +#ifndef EIGERD +int64_t getNumFramesLeft(); +int64_t getNumTriggersLeft(); +#endif #if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARDD) || \ defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int setDelayAfterTrigger(int64_t val); int64_t getDelayAfterTrigger(); -int64_t getNumFramesLeft(); -int64_t getNumTriggersLeft(); + int64_t getDelayAfterTriggerLeft(); int64_t getPeriodLeft(); #endif @@ -445,10 +446,8 @@ void setSynchronization(int enable); void updatingRegisters(); int updateClockDivs(); #endif -#ifndef XILINX_CHIPTESTBOARDD void setTiming(enum timingMode arg); enum timingMode getTiming(); -#endif #ifdef MYTHEN3D void setInitialExtSignals(); int setChipStatusRegister(int csr); diff --git a/slsDetectorServers/slsDetectorServer/src/arm64.c b/slsDetectorServers/slsDetectorServer/src/arm64.c index 9cd6f406e..4c28dc703 100644 --- a/slsDetectorServers/slsDetectorServer/src/arm64.c +++ b/slsDetectorServers/slsDetectorServer/src/arm64.c @@ -12,7 +12,7 @@ /* global variables */ -#define CSP0 (0xB0010000)/// 0xB008_0000 +#define CSP0 (0xB0010000) #define MEM_SIZE 0x100000 u_int32_t *csp0base = 0; diff --git a/slsDetectorServers/slsDetectorServer/src/loadPattern.c b/slsDetectorServers/slsDetectorServer/src/loadPattern.c index 1c2e49f04..6d3349499 100644 --- a/slsDetectorServers/slsDetectorServer/src/loadPattern.c +++ b/slsDetectorServers/slsDetectorServer/src/loadPattern.c @@ -13,7 +13,7 @@ extern enum TLogLevel trimmingPrint; #endif -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) #ifdef VIRTUAL uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; #endif @@ -21,8 +21,8 @@ uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; extern void bus_w(u_int32_t offset, u_int32_t data); extern u_int32_t bus_r(u_int32_t offset); -extern int64_t get64BitReg(int aLSB, int aMSB); -extern int64_t set64BitReg(int64_t value, int aLSB, int aMSB); +//extern int64_t get64BitReg(int aLSB, int aMSB); +//extern int64_t set64BitReg(int64_t value, int aLSB, int aMSB); extern uint64_t getU64BitReg(int aLSB, int aMSB); extern void setU64BitReg(uint64_t value, int aLSB, int aMSB); @@ -44,13 +44,15 @@ void initializePatternAddresses() { } } -#ifdef CHIPTESTBOARDD +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) #ifdef VIRTUAL void initializePatternWord() { memset(virtual_pattern, 0, sizeof(virtual_pattern)); } #endif +#endif +#if defined(CHIPTESTBOARDD) // TODO || defined(XILINX_CHIPTESTBOARDD) uint64_t validate_readPatternIOControl() { return getU64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); } @@ -101,7 +103,7 @@ uint64_t readPatternWord(int addr) { // the first word in RAM as base plus the offset of the word to write (addr) uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2; uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2; - return get64BitReg(reg_lsb, reg_msb); + return getU64BitReg(reg_lsb, reg_msb); #else LOG(logDEBUG1, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr)); uint32_t reg = PATTERN_CNTRL_REG; @@ -118,7 +120,7 @@ uint64_t readPatternWord(int addr) { // read value #ifndef VIRTUAL - return get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG); + return getU64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG); #else return virtual_pattern[addr]; #endif @@ -160,7 +162,7 @@ void writePatternWord(int addr, uint64_t word) { uint32_t reg = PATTERN_CNTRL_REG; // write word - set64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG); + setU64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG); // overwrite with only addr bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK)); @@ -178,7 +180,7 @@ void writePatternWord(int addr, uint64_t word) { // the first word in RAM as base plus the offset of the word to write (addr) uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2; uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2; - set64BitReg(word, reg_lsb, reg_msb); + setU64BitReg(word, reg_lsb, reg_msb); #endif } @@ -311,23 +313,23 @@ int validate_getPatternWaitTime(char *message, int level, uint64_t *waittime) { uint64_t getPatternWaitTime(int level) { switch (level) { case 0: - return get64BitReg(PATTERN_WAIT_TIMER_0_LSB_REG, + return getU64BitReg(PATTERN_WAIT_TIMER_0_LSB_REG, PATTERN_WAIT_TIMER_0_MSB_REG); case 1: - return get64BitReg(PATTERN_WAIT_TIMER_1_LSB_REG, + return getU64BitReg(PATTERN_WAIT_TIMER_1_LSB_REG, PATTERN_WAIT_TIMER_1_MSB_REG); case 2: - return get64BitReg(PATTERN_WAIT_TIMER_2_LSB_REG, + return getU64BitReg(PATTERN_WAIT_TIMER_2_LSB_REG, PATTERN_WAIT_TIMER_2_MSB_REG); #ifndef MYTHEN3D case 3: - return get64BitReg(PATTERN_WAIT_TIMER_3_LSB_REG, + return getU64BitReg(PATTERN_WAIT_TIMER_3_LSB_REG, PATTERN_WAIT_TIMER_3_MSB_REG); case 4: - return get64BitReg(PATTERN_WAIT_TIMER_4_LSB_REG, + return getU64BitReg(PATTERN_WAIT_TIMER_4_LSB_REG, PATTERN_WAIT_TIMER_4_MSB_REG); case 5: - return get64BitReg(PATTERN_WAIT_TIMER_5_LSB_REG, + return getU64BitReg(PATTERN_WAIT_TIMER_5_LSB_REG, PATTERN_WAIT_TIMER_5_MSB_REG); #endif default: @@ -369,28 +371,28 @@ void setPatternWaitTime(int level, uint64_t t) { (long long int)t)); switch (level) { case 0: - set64BitReg(t, PATTERN_WAIT_TIMER_0_LSB_REG, + setU64BitReg(t, PATTERN_WAIT_TIMER_0_LSB_REG, PATTERN_WAIT_TIMER_0_MSB_REG); break; case 1: - set64BitReg(t, PATTERN_WAIT_TIMER_1_LSB_REG, + setU64BitReg(t, PATTERN_WAIT_TIMER_1_LSB_REG, PATTERN_WAIT_TIMER_1_MSB_REG); break; case 2: - set64BitReg(t, PATTERN_WAIT_TIMER_2_LSB_REG, + setU64BitReg(t, PATTERN_WAIT_TIMER_2_LSB_REG, PATTERN_WAIT_TIMER_2_MSB_REG); break; #ifndef MYTHEN3D case 3: - set64BitReg(t, PATTERN_WAIT_TIMER_3_LSB_REG, + setU64BitReg(t, PATTERN_WAIT_TIMER_3_LSB_REG, PATTERN_WAIT_TIMER_3_MSB_REG); break; case 4: - set64BitReg(t, PATTERN_WAIT_TIMER_4_LSB_REG, + setU64BitReg(t, PATTERN_WAIT_TIMER_4_LSB_REG, PATTERN_WAIT_TIMER_4_MSB_REG); break; case 5: - set64BitReg(t, PATTERN_WAIT_TIMER_5_LSB_REG, + setU64BitReg(t, PATTERN_WAIT_TIMER_5_LSB_REG, PATTERN_WAIT_TIMER_5_MSB_REG); break; #endif @@ -775,7 +777,7 @@ int loadPattern(char *message, enum TLogLevel printLevel, } } // iocontrol -#ifndef MYTHEN3D +#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) //TODO if (ret == OK) { ret = validate_writePatternIOControl(message, pat->ioctrl); } @@ -835,7 +837,7 @@ int getPattern(char *message, patternParameters *pat) { pat->word[i] = retval64; } // iocontrol -#ifndef MYTHEN3D +#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) //TODO if (ret == OK) { validate_readPatternIOControl(); } @@ -956,7 +958,7 @@ int loadPatternFile(char *patFname, char *errMessage) { uint64_t word = 0; // cannot scan values -#ifdef VIRTUAL +#if defined(VIRTUAL) || defined(XILINX_CHIPTESTBOARDD) if (sscanf(line, "%s 0x%x 0x%lx", command, &addr, &word) != 3) { #else if (sscanf(line, "%s 0x%x 0x%llx", command, &addr, &word) != 3) { @@ -971,7 +973,7 @@ int loadPatternFile(char *patFname, char *errMessage) { } // patioctrl -#ifndef MYTHEN3D +#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) //TODO if (!strncmp(line, "patioctrl", strlen("patioctrl"))) { uint64_t arg = 0; @@ -1063,7 +1065,7 @@ int loadPatternFile(char *patFname, char *errMessage) { uint64_t waittime = 0; // cannot scan values -#ifdef VIRTUAL +#if defined(VIRTUAL) || defined(XILINX_CHIPTESTBOARDD) if (sscanf(line, "%s %d %ld", command, &level, &waittime) != 3) { #else if (sscanf(line, "%s %d %lld", command, &level, &waittime) != 3) { diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 5256a3490..d000f5149 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -7,7 +7,7 @@ #include "sls/sls_detector_funcs.h" #include "slsDetectorFunctionList.h" -#if defined(CHIPTESTBOARDD) || defined(MYTHEN3D) +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) || defined(MYTHEN3D) #include "Pattern.h" #include "loadPattern.h" #endif @@ -719,9 +719,6 @@ int set_timing_mode(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting external communication mode to %d\n", arg)); -#ifdef XILINX_CHIPTESTBOARDD - functionNotImplemented(); -#else // set if (((int)arg != GET_FLAG) && (Server_VerifyLock() == OK)) { switch (arg) { @@ -758,7 +755,7 @@ int set_timing_mode(int file_des) { validate(&ret, mess, (int)arg, (int)retval, "set timing mode", DEC); #endif LOG(logDEBUG1, ("Timing Mode: %d\n", retval)); -#endif + return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -2880,7 +2877,7 @@ int get_frames_left(int file_des) { int64_t retval = -1; #if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \ - !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) + !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && !defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // get only @@ -2896,7 +2893,7 @@ int get_triggers_left(int file_des) { int64_t retval = -1; #if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \ - !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) + !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && !defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // get only @@ -3046,9 +3043,6 @@ int set_dynamic_range(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting dr to %d\n", dr)); -#ifdef XILINX_CHIPTESTBOARDD - functionNotImplemented(); -#else // set & get if ((dr == GET_FLAG) || (Server_VerifyLock() == OK)) { // check dr @@ -3069,7 +3063,7 @@ int set_dynamic_range(int file_des) { case 32: #endif #if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ - defined(CHIPTESTBOARDD) || defined(GOTTHARD2D) + defined(CHIPTESTBOARDD) || defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD) case 16: #endif if (dr >= 0) { @@ -3097,7 +3091,6 @@ int set_dynamic_range(int file_des) { break; } } -#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -3343,7 +3336,7 @@ int set_pattern_word(int file_des) { if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int addr = (int)args[0]; @@ -3371,7 +3364,7 @@ int set_pattern_loop_addresses(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -3417,7 +3410,7 @@ int set_pattern_loop_cycles(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -3446,7 +3439,7 @@ int set_pattern_wait_addr(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -3475,7 +3468,7 @@ int set_pattern_wait_time(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = (int)args[0]; @@ -3505,7 +3498,7 @@ int set_pattern_mask(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Set Pattern Mask to %d\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -3533,7 +3526,7 @@ int get_pattern_mask(int file_des) { LOG(logDEBUG1, ("Get Pattern Mask\n")); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only get @@ -3554,7 +3547,7 @@ int set_pattern_bit_mask(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Set Pattern Bit Mask to %d\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -3583,7 +3576,7 @@ int get_pattern_bit_mask(int file_des) { LOG(logDEBUG1, ("Get Pattern Bit Mask\n")); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only get @@ -7801,7 +7794,7 @@ int set_pattern(int file_des) { char args[MAX_STR_LENGTH]; memset(args, 0, MAX_STR_LENGTH); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else @@ -7838,7 +7831,7 @@ int get_pattern_file(int file_des) { LOG(logDEBUG1, ("Getting pattern file name\n")); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -7852,7 +7845,7 @@ int get_pattern(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); return Server_SendResult(file_des, INT32, NULL, 0); #else @@ -9727,9 +9720,7 @@ int get_kernel_version(int file_des) { memset(retvals, 0, MAX_STR_LENGTH); LOG(logDEBUG1, ("Getting kernel version\n")); -#ifdef XILINX_CHIPTESTBOARDD - functionNotImplemented(); -#else + // get only ret = getKernelVersion(retvals); if (ret == FAIL) { @@ -9742,7 +9733,6 @@ int get_kernel_version(int file_des) { } else { LOG(logDEBUG1, ("kernel version: [%s]\n", retvals)); } -#endif return Server_SendResult(file_des, OTHER, retvals, sizeof(retvals)); } @@ -10504,12 +10494,10 @@ int get_hardware_version(int file_des) { memset(mess, 0, sizeof(mess)); char retvals[MAX_STR_LENGTH]; memset(retvals, 0, MAX_STR_LENGTH); -#ifdef XILINX_CHIPTESTBOARDD - functionNotImplemented(); -#else + getHardwareVersion(retvals); LOG(logDEBUG1, ("hardware version retval: %s\n", retvals)); -#endif + return Server_SendResult(file_des, OTHER, retvals, sizeof(retvals)); } diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt index da49cddde..2f93c61f8 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/xilinx_ctbDetectorServer/CMakeLists.txt @@ -8,6 +8,7 @@ add_executable(xilinx_ctbDetectorServer_virtual ../slsDetectorServer/src/arm64.c ../slsDetectorServer/src/common.c ../slsDetectorServer/src/sharedMemory.c + ../slsDetectorServer/src/loadPattern.c ../../slsSupportLib/src/md5.c ) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile index fc1950523..e5e3a6b54 100755 --- a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile +++ b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile @@ -18,7 +18,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)arm64.c $(main_src)common.c $(main_src)/sharedMemory.c $(md5_dir)md5.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)arm64.c $(main_src)common.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c $(md5_dir)md5.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h index 49f6097a4..1a61383bb 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h @@ -2,55 +2,77 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package #pragma once + + #define CTRLREG1 (0x0) -#define CTR1_OFST (0) -#define CTR1_MSK (0xffffffff << CTR1_OFST) #define CTRLREG2 (0x4) -#define CTRL2_OFST (0) -#define CTRL2_MSK (0xffffffff << CTRL2_OFST) #define STATUSREG1 (0x8) -#define STATUS1_OFST (0) -#define STATUS1_MSK (0xffffffff << STATUS1_OFST) #define STATUSREG2 (0xC) -#define STATUS2_OFST (0) -#define STATUS2_MSK (0xffffffff << STATUS2_OFST) #define FPGAVERSIONREG (0x10) #define COMPDATE_OFST (0) #define COMPDATE_MSK (0x00ffffff << COMPDATE_OFST) -#define DETTYPE_OFST (24) -#define DETTYPE_MSK (0x000000ff << DETTYPE_OFST) +#define DETTYPE_OFST (24) +#define DETTYPE_MSK (0x000000ff << DETTYPE_OFST) + + +#define EMPTY14REG (0x14) + + +#define EMPTY18REG (0x18) + + +#define EMPTY1CREG (0x1C) + + +#define EMPTY20REG (0x20) + + +#define EMPTY24REG (0x24) + #define PKTPACKETLENGTHREG (0x28) -#define PACKETLENGTH1G_OFST (0) -#define PACKETLENGTH1G_MSK (0x0000ffff << PACKETLENGTH1G_OFST) +#define PACKETLENGTH1G_OFST (0) +#define PACKETLENGTH1G_MSK (0x0000ffff << PACKETLENGTH1G_OFST) #define PACKETLENGTH10G_OFST (16) #define PACKETLENGTH10G_MSK (0x0000ffff << PACKETLENGTH10G_OFST) + +#define EMPTY2CREG (0x2C) + + #define PKTNOPACKETSREG (0x30) -#define NOPACKETS1G_OFST (0) -#define NOPACKETS1G_MSK (0x0000003f << NOPACKETS1G_OFST) -#define NOPACKETS10G_OFST (8) +#define NOPACKETS1G_OFST (0) +#define NOPACKETS1G_MSK (0x0000003f << NOPACKETS1G_OFST) +#define NOPACKETS10G_OFST (16) #define NOPACKETS10G_MSK (0x0000003f << NOPACKETS10G_OFST) + +#define EMPTY34REG (0x34) + + #define PKTCTRLREG (0x38) -#define NSERVERS_OFST (0) -#define NSERVERS_MSK (0x0000003f << NSERVERS_OFST) -#define SERVERSTART_OFST (6) +#define NOSERVERS_OFST (0) +#define NOSERVERS_MSK (0x0000003f << NOSERVERS_OFST) +#define SERVERSTART_OFST (8) #define SERVERSTART_MSK (0x0000001f << SERVERSTART_OFST) -#define ETHINTERF_OFST (11) -#define ETHINTERF_MSK (0x00000001 << ETHINTERF_OFST) +#define ETHINTERF_OFST (16) +#define ETHINTERF_MSK (0x00000001 << ETHINTERF_OFST) + + +#define EMPTY3CREG (0x3C) + #define PKTCOORDREG1 (0x40) @@ -59,358 +81,1268 @@ #define COORDY_OFST (16) #define COORDY_MSK (0x0000ffff << COORDY_OFST) + +#define EMPTY44REG (0x44) + + #define PKTCOORDREG2 (0x48) #define COORDZ_OFST (0) #define COORDZ_MSK (0x0000ffff << COORDZ_OFST) + +#define EMPTY4CREG (0x4C) + + +#define EMPTY50REG (0x50) + + +#define EMPTY54REG (0x54) + + +#define EMPTY58REG (0x58) + + +#define EMPTY5CREG (0x5C) + + +#define EMPTY60REG (0x60) + + +#define EMPTY64REG (0x64) + + +#define EMPTY68REG (0x68) + + +#define EMPTY6CREG (0x6C) + + +#define EMPTY70REG (0x70) + + +#define EMPTY74REG (0x74) + + +#define EMPTY78REG (0x78) + + +#define EMPTY7CREG (0x7C) + + +#define EMPTY80REG (0x80) + + +#define EMPTY84REG (0x84) + + +#define EMPTY88REG (0x88) + + +#define EMPTY8CREG (0x8C) + + +#define EMPTY90REG (0x90) + + +#define EMPTY94REG (0x94) + + +#define EMPTY98REG (0x98) + + +#define EMPTY9CREG (0x9C) + + #define FLOWSTATUSREG (0x100) -#define RSMBUSY_OFST (0) -#define RSMBUSY_MSK (0x00000001 << RSMBUSY_OFST) +#define RSMBUSY_OFST (0) +#define RSMBUSY_MSK (0x00000001 << RSMBUSY_OFST) #define RSMTRGWAIT_OFST (3) #define RSMTRGWAIT_MSK (0x00000001 << RSMTRGWAIT_OFST) -#define CSMBUSY_OFST (17) -#define CSMBUSY_MSK (0x00000001 << CSMBUSY_OFST) +#define CSMBUSY_OFST (17) +#define CSMBUSY_MSK (0x00000001 << CSMBUSY_OFST) + + +#define EMPTY104REG (0x104) + #define FLOWCONTROLREG (0x108) -#define STARTF_OFST (0) -#define STARTF_MSK (0x00000001 << STARTF_OFST) -#define STOPF_OFST (1) -#define STOPF_MSK (0x00000001 << STOPF_OFST) -#define RSTF_OFST (2) -#define RSTF_MSK (0x00000001 << RSTF_OFST) -#define SWTRIGGERF_OFST (3) -#define SWTRIGGERF_MSK (0x00000001 << SWTRIGGERF_OFST) +#define STARTF_OFST (0) +#define STARTF_MSK (0x00000001 << STARTF_OFST) +#define STOPF_OFST (1) +#define STOPF_MSK (0x00000001 << STOPF_OFST) +#define RSTF_OFST (2) +#define RSTF_MSK (0x00000001 << RSTF_OFST) +#define SWTRIGGERF_OFST (3) +#define SWTRIGGERF_MSK (0x00000001 << SWTRIGGERF_OFST) #define TRIGGERENABLE_OFST (4) #define TRIGGERENABLE_MSK (0x00000001 << TRIGGERENABLE_OFST) + +#define EMPTY10CREG (0x10C) + + #define TIMEFROMSTARTOUTREG1 (0x110) -#define TIMEFROMSTARTOUT1_OFST (0) -#define TIMEFROMSTARTOUT1_MSK (0xffffffff << TIMEFROMSTARTOUT1_OFST) #define TIMEFROMSTARTOUTREG2 (0x114) -#define TIMEFROMSTARTOUT2_OFST (0) -#define TIMEFROMSTARTOUT2_MSK (0xffffffff << TIMEFROMSTARTOUT2_OFST) #define FRAMESFROMSTARTOUTREG1 (0x118) -#define FRAMESFROMSTARTOUT1_OFST (0) -#define FRAMESFROMSTARTOUT1_MSK (0xffffffff << FRAMESFROMSTARTOUT1_OFST) #define FRAMESFROMSTARTOUTREG2 (0x11C) -#define FRAMESFROMSTARTOUT2_OFST (0) -#define FRAMESFROMSTARTOUT2_MSK (0xffffffff << FRAMESFROMSTARTOUT2_OFST) #define FRAMETIMEOUTREG1 (0x120) -#define FRAMETIMEOUT1_OFST (0) -#define FRAMETIMEOUT1_MSK (0xffffffff << FRAMETIMEOUT1_OFST) #define FRAMETIMEOUTREG2 (0x124) -#define FRAMETIMEOUT2_OFST (0) -#define FRAMETIMEOUT2_MSK (0xffffffff << FRAMETIMEOUT2_OFST) #define DELAYOUTREG1 (0x128) -#define DELAYOUT1_OFST (0) -#define DELAYOUT1_MSK (0xffffffff << DELAYOUT1_OFST) #define DELAYOUTREG2 (0x12C) -#define DELAYOUT2_OFST (0) -#define DELAYOUT2_MSK (0xffffffff << DELAYOUT2_OFST) #define CYCLESOUTREG1 (0x130) -#define CYCLESOUT1_OFST (0) -#define CYCLESOUT1_MSK (0xffffffff << CYCLESOUT1_OFST) #define CYCLESOUTREG2 (0x134) -#define CYCLESOUT2_OFST (0) -#define CYCLESOUT2_MSK (0xffffffff << CYCLESOUT2_OFST) #define FRAMESOUTREG1 (0x138) -#define FRAMESOUT1_OFST (0) -#define FRAMESOUT1_MSK (0xffffffff << FRAMESOUT1_OFST) #define FRAMESOUTREG2 (0x13C) -#define FRAMESOUT2_OFST (0) -#define FRAMESOUT2_MSK (0xffffffff << FRAMESOUT2_OFST) #define PERIODOUTREG1 (0x140) -#define PERIODOUT1_OFST (0) -#define PERIODOUT1_MSK (0xffffffff << PERIODOUT1_OFST) #define PERIODOUTREG2 (0x144) -#define PERIODOUT2_OFST (0) -#define PERIODOUT2_MSK (0xffffffff << PERIODOUT2_OFST) #define DELAYINREG1 (0x148) -#define DELAYIN1_OFST (0) -#define DELAYIN1_MSK (0xffffffff << DELAYIN1_OFST) #define DELAYINREG2 (0x14C) -#define DELAYIN2_OFST (0) -#define DELAYIN2_MSK (0xffffffff << DELAYIN2_OFST) #define CYCLESINREG1 (0x150) -#define CYCLESIN1_OFST (0) -#define CYCLESIN1_MSK (0xffffffff << CYCLESIN1_OFST) #define CYCLESINREG2 (0x154) -#define CYCLESIN2_OFST (0) -#define CYCLESIN2_MSK (0xffffffff << CYCLESIN2_OFST) #define FRAMESINREG1 (0x158) -#define FRAMESIN1_OFST (0) -#define FRAMESIN1_MSK (0xffffffff << FRAMESIN1_OFST) #define FRAMESINREG2 (0x15C) -#define FRAMESIN2_OFST (0) -#define FRAMESIN2_MSK (0xffffffff << FRAMESIN2_OFST) #define PERIODINREG1 (0x160) -#define PERIODIN1_OFST (0) -#define PERIODIN1_MSK (0xffffffff << PERIODIN1_OFST) #define PERIODINREG2 (0x164) -#define PERIODIN2_OFST (0) -#define PERIODIN2_MSK (0xffffffff << PERIODIN2_OFST) -#define PATTERNOUTREG0 (0x200) +#define EMPTY168REG (0x168) -#define PATTERNOUT0_OFST (0) -#define PATTERNOUT0_MSK (0xffffffff << PATTERNOUT0_OFST) -#define PATTERNOUTREG1 (0x204) +#define EMPTY16CREG (0x16C) -#define PATTERNOUT1_OFST (0) -#define PATTERNOUT1_MSK (0xffffffff << PATTERNOUT1_OFST) -#define PATTERNINREG0 (0x208) +#define EMPTY170REG (0x170) -#define PATTERNIN0_OFST (0) -#define PATTERNIN0_MSK (0xffffffff << PATTERNIN0_OFST) -#define PATTERNINREG1 (0x20C) +#define EMPTY174REG (0x174) -#define PATTERNIN1_OFST (0) -#define PATTERNIN1_MSK (0xffffffff << PATTERNIN1_OFST) -#define PATTERNIOMASKREG0 (0x210) +#define EMPTY178REG (0x178) -#define PATTERNIOMASK0_OFST (0) -#define PATTERNIOMASK0_MSK (0xffffffff << PATTERNIOMASK0_OFST) -#define PATTERNIOMASKREG1 (0x214) +#define EMPTY17CREG (0x17C) -#define PATTERNIOMASK1_OFST (0) -#define PATTERNIOMASK1_MSK (0xffffffff << PATTERNIOMASK1_OFST) -#define PATTERNIOSETREG0 (0x218) +#define EMPTY180REG (0x180) -#define PATTERNIOSET0_OFST (0) -#define PATTERNIOSET0_MSK (0xffffffff << PATTERNIOSET0_OFST) -#define PATTERNIOSETREG1 (0x21C) +#define EMPTY184REG (0x184) -#define PATTERNIOSET1_OFST (0) -#define PATTERNIOSET1_MSK (0xffffffff << PATTERNIOSET1_OFST) -#define PATTERNCONTROLREG (0x220) +#define EMPTY188REG (0x188) -#define PATTERNWRBIT_OFST (0) -#define PATTERNWRBIT_MSK (0x00000001 << PATTERNWRBIT_OFST) -#define PATTERNRDBIT_OFST (1) -#define PATTERNRDBIT_MSK (0x00000001 << PATTERNRDBIT_OFST) -#define PATTERNADDRESSPTR_OFST (16) -#define PATTERNADDRESSPTR_MSK (0x00001fff << PATTERNADDRESSPTR_OFST) -#define PATTERNLIMITADDRESSREG (0x228) +#define EMPTY18CREG (0x18C) -#define PATTERNLIMITADDRESS_OFST (0) -#define PATTERNLIMITADDRESS_MSK (0xffffffff << PATTERNLIMITADDRESS_OFST) -#define PATTERNLOOP1ADDRESSREG (0x230) +#define EMPTY190REG (0x190) -#define PATTERNLOOP1ADDRESS_OFST (0) -#define PATTERNLOOP1ADDRESS_MSK (0xffffffff << PATTERNLOOP1ADDRESS_OFST) -#define PATTERNNLOOPS1REG (0x238) +#define EMPTY194REG (0x194) -#define PATTERNNLOOPS1_OFST (0) -#define PATTERNNLOOPS1_MSK (0xffffffff << PATTERNNLOOPS1_OFST) -#define PATTERNWAIT1ADDRESSREG (0x240) +#define EMPTY198REG (0x198) -#define PATTERNWAIT1ADDRESS_OFST (0) -#define PATTERNWAIT1ADDRESS_MSK (0xffffffff << PATTERNWAIT1ADDRESS_OFST) -#define PATTERNWAIT1TIMEREG1 (0x248) +#define EMPTY19CREG (0x19C) -#define PATTERNWAIT1TIME1_OFST (0) -#define PATTERNWAIT1TIME1_MSK (0xffffffff << PATTERNWAIT1TIME1_OFST) -#define PATTERNWAIT1TIMEREG2 (0x24C) +#define PATTERN_OUT_LSB_REG (0x200) -#define PATTERNWAIT1TIME2_OFST (0) -#define PATTERNWAIT1TIME2_MSK (0xffffffff << PATTERNWAIT1TIME2_OFST) -#define PATTERNLOOP2ADDRESSREG (0x250) +#define PATTERN_OUT_MSB_REG (0x204) -#define PATTERNLOOP2ADDRESS_OFST (0) -#define PATTERNLOOP2ADDRESS_MSK (0xffffffff << PATTERNLOOP2ADDRESS_OFST) -#define PATTERNNLOOPS2REG (0x258) +#define PATTERN_IN_LSB_REG (0x208) -#define PATTERNNLOOPS2_OFST (0) -#define PATTERNNLOOPS2_MSK (0xffffffff << PATTERNNLOOPS2_OFST) -#define PATTERNWAIT2ADDRESSREG (0x260) +#define PATTERN_IN_MSB_REG (0x20C) -#define PATTERNWAIT2ADDRESS_OFST (0) -#define PATTERNWAIT2ADDRESS_MSK (0xffffffff << PATTERNWAIT2ADDRESS_OFST) -#define PATTERNWAIT2TIMEREG1 (0x268) +#define PATTERN_MASK_LSB_REG (0x210) -#define PATTERNWAIT2TIME1_OFST (0) -#define PATTERNWAIT2TIME1_MSK (0xffffffff << PATTERNWAIT2TIME1_OFST) -#define PATTERNWAIT2TIMEREG2 (0x26C) +#define PATTERN_MASK_MSB_REG (0x214) -#define PATTERNWAIT2TIME2_OFST (0) -#define PATTERNWAIT2TIME2_MSK (0xffffffff << PATTERNWAIT2TIME2_OFST) -#define PATTERNLOOP3ADDRESSREG (0x270) +#define PATTERN_SET_LSB_REG (0x218) -#define PATTERNLOOP3ADDRESS_OFST (0) -#define PATTERNLOOP3ADDRESS_MSK (0xffffffff << PATTERNLOOP3ADDRESS_OFST) -#define PATTERNNLOOPS3REG (0x278) +#define PATTERN_SET_MSB_REG (0x21C) -#define PATTERNNLOOPS3_OFST (0) -#define PATTERNNLOOPS3_MSK (0xffffffff << PATTERNNLOOPS3_OFST) -#define PATTERNWAIT3ADDRESSREG (0x280) +#define PATTERN_CNTRL_REG (0x220) -#define PATTERNWAIT3ADDRESS_OFST (0) -#define PATTERNWAIT3ADDRESS_MSK (0xffffffff << PATTERNWAIT3ADDRESS_OFST) +#define PATTERN_CNTRL_WR_OFST (0) +#define PATTERN_CNTRL_WR_MSK (0x00000001 << PATTERN_CNTRL_WR_OFST) +#define PATTERN_CNTRL_RD_OFST (1) +#define PATTERN_CNTRL_RD_MSK (0x00000001 << PATTERN_CNTRL_RD_OFST) +#define PATTERN_CNTRL_ADDR_OFST (16) +#define PATTERN_CNTRL_ADDR_MSK (0x00001fff << PATTERN_CNTRL_ADDR_OFST) -#define PATTERNWAIT3TIMEREG1 (0x288) -#define PATTERNWAIT3TIME1_OFST (0) -#define PATTERNWAIT3TIME1_MSK (0xffffffff << PATTERNWAIT3TIME1_OFST) +#define EMPTY224REG (0x224) -#define PATTERNWAIT3TIMEREG2 (0x28C) -#define PATTERNWAIT3TIME2_OFST (0) -#define PATTERNWAIT3TIME2_MSK (0xffffffff << PATTERNWAIT3TIME2_OFST) +#define PATTERN_LIMIT_REG (0x228) -#define PATTERNLOOP4ADDRESSREG (0x290) +#define PATTERN_LIMIT_STRT_OFST (0) +#define PATTERN_LIMIT_STRT_MSK (0x00001fff << PATTERN_LIMIT_STRT_OFST) +#define PATTERN_LIMIT_STP_OFST (16) +#define PATTERN_LIMIT_STP_MSK (0x00001fff << PATTERN_LIMIT_STP_OFST) -#define PATTERNLOOP4ADDRESS_OFST (0) -#define PATTERNLOOP4ADDRESS_MSK (0xffffffff << PATTERNLOOP4ADDRESS_OFST) -#define PATTERNNLOOPS4REG (0x298) +#define EMPTY22CREG (0x22C) -#define PATTERNNLOOPS4_OFST (0) -#define PATTERNNLOOPS4_MSK (0xffffffff << PATTERNNLOOPS4_OFST) -#define PATTERNWAIT4ADDRESSREG (0x300) +#define PATTERN_LOOP_0_ADDR_REG (0x230) -#define PATTERNWAIT4ADDRESS_OFST (0) -#define PATTERNWAIT4ADDRESS_MSK (0xffffffff << PATTERNWAIT4ADDRESS_OFST) +#define PATTERN_LOOP_0_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_0_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_0_ADDR_STRT_OFST) +#define PATTERN_LOOP_0_ADDR_STP_OFST (16) +#define PATTERN_LOOP_0_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_0_ADDR_STP_OFST) -#define PATTERNWAIT4TIMEREG1 (0x308) -#define PATTERNWAI4TIME1_OFST (0) -#define PATTERNWAI4TIME1_MSK (0xffffffff << PATTERNWAI4TIME1_OFST) +#define EMPTY234REG (0x234) -#define PATTERNWAIT4TIMEREG2 (0x30C) -#define PATTERNWAIT4TIME2_OFST (0) -#define PATTERNWAIT4TIME2_MSK (0xffffffff << PATTERNWAIT4TIME2_OFST) +#define PATTERN_LOOP_0_ITERATION_REG (0x238) -#define PATTERNLOOP5ADDRESSREG (0x310) -#define PATTERNLOOP5ADDRESS_OFST (0) -#define PATTERNLOOP5ADDRESS_MSK (0xffffffff << PATTERNLOOP5ADDRESS_OFST) +#define EMPTY23CREG (0x23C) -#define PATTERNNLOOPS5REG (0x318) -#define PATTERNNLOOPS5_OFST (0) -#define PATTERNNLOOPS5_MSK (0xffffffff << PATTERNNLOOPS5_OFST) +#define PATTERN_WAIT_0_ADDR_REG (0x240) -#define PATTERNWAIT5ADDRESSREG (0x320) +#define PATTERN_WAIT_0_ADDR_OFST (0) +#define PATTERN_WAIT_0_ADDR_MSK (0x00001fff << PATTERN_WAIT_0_ADDR_OFST) -#define PATTERNWAIT5ADDRESS_OFST (0) -#define PATTERNWAIT5ADDRESS_MSK (0xffffffff << PATTERNWAIT5ADDRESS_OFST) -#define PATTERNWAIT5TIMEREG1 (0x328) +#define EMPTY244REG (0x244) -#define PATTERNWAIT5TIME1_OFST (0) -#define PATTERNWAIT5TIME1_MSK (0xffffffff << PATTERNWAIT5TIME1_OFST) -#define PATTERNWAIT5TIMEREG2 (0x32C) +#define PATTERN_WAIT_TIMER_0_LSB_REG (0x248) -#define PATTERNWAIT5TIME2_OFST (0) -#define PATTERNWAIT5TIME2_MSK (0xffffffff << PATTERNWAIT5TIME2_OFST) -#define PATTERNLOOP6ADDRESSREG (0x330) +#define PATTERN_WAIT_TIMER_0_MSB_REG (0x24C) -#define PATTERNLOOP6ADDRESS_OFST (0) -#define PATTERNLOOP6ADDRESS_MSK (0xffffffff << PATTERNLOOP6ADDRESS_OFST) -#define PATTERNNLOOPS6REG (0x338) +#define PATTERN_LOOP_1_ADDR_REG (0x250) -#define PATTERNNLOOPS6_OFST (0) -#define PATTERNNLOOPS6_MSK (0xffffffff << PATTERNNLOOPS6_OFST) +#define PATTERN_LOOP_1_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_1_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_1_ADDR_STRT_OFST) +#define PATTERN_LOOP_1_ADDR_STP_OFST (16) +#define PATTERN_LOOP_1_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_1_ADDR_STP_OFST) -#define PATTERNWAIT6ADDRESSREG (0x340) -#define PATTERNWAIT6ADDRESS_OFST (0) -#define PATTERNWAIT6ADDRESS_MSK (0xffffffff << PATTERNWAIT6ADDRESS_OFST) +#define EMPTY254REG (0x254) -#define PATTERNWAIT6TIMEREG1 (0x348) -#define PATTERNWAIT6TIME1_OFST (0) -#define PATTERNWAIT6TIME1_MSK (0xffffffff << PATTERNWAIT6TIME1_OFST) +#define PATTERN_LOOP_1_ITERATION_REG (0x258) -#define PATTERNWAIT6TIMEREG2 (0x34C) -#define PATTERNWAIT6TIME2_OFST (0) -#define PATTERNWAIT6TIME2_MSK (0xffffffff << PATTERNWAIT6TIME2_OFST) +#define EMPTY25CREG (0x25C) + + +#define PATTERN_WAIT_1_ADDR_REG (0x260) + +#define PATTERN_WAIT_1_ADDR_OFST (0) +#define PATTERN_WAIT_1_ADDR_MSK (0x00001fff << PATTERN_WAIT_1_ADDR_OFST) + + +#define EMPTY264REG (0x264) + + +#define PATTERN_WAIT_TIMER_1_LSB_REG (0x268) + + +#define PATTERN_WAIT_TIMER_1_MSB_REG (0x26C) + + +#define PATTERN_LOOP_2_ADDR_REG (0x270) + +#define PATTERN_LOOP_2_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_2_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_2_ADDR_STRT_OFST) +#define PATTERN_LOOP_2_ADDR_STP_OFST (16) +#define PATTERN_LOOP_2_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_2_ADDR_STP_OFST) + + +#define EMPTY274REG (0x274) + + +#define PATTERN_LOOP_2_ITERATION_REG (0x278) + + +#define EMPTY27CREG (0x27C) + + +#define PATTERN_WAIT_2_ADDR_REG (0x280) + +#define PATTERN_WAIT_2_ADDR_OFST (0) +#define PATTERN_WAIT_2_ADDR_MSK (0x00001fff << PATTERN_WAIT_2_ADDR_OFST) + + +#define EMPTY284REG (0x284) + + +#define PATTERN_WAIT_TIMER_2_LSB_REG (0x288) + + +#define PATTERN_WAIT_TIMER_2_MSB_REG (0x28C) + + +#define PATTERN_LOOP_3_ADDR_REG (0x290) + +#define PATTERN_LOOP_3_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_3_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_3_ADDR_STRT_OFST) +#define PATTERN_LOOP_3_ADDR_STP_OFST (16) +#define PATTERN_LOOP_3_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_3_ADDR_STP_OFST) + + +#define EMPTY294REG (0x294) + + +#define PATTERN_LOOP_3_ITERATION_REG (0x298) + + +#define EMPTY29CREG (0x29C) + + +#define PATTERN_WAIT_3_ADDR_REG (0x300) + +#define PATTERN_WAIT_3_ADDR_OFST (0) +#define PATTERN_WAIT_3_ADDR_MSK (0x00001fff << PATTERN_WAIT_3_ADDR_OFST) + + +#define EMPTY304REG (0x304) + + +#define PATTERN_WAIT_TIMER_3_LSB_REG (0x308) + + +#define PATTERN_WAIT_TIMER_3_MSB_REG (0x30C) + + +#define PATTERN_LOOP_4_ADDR_REG (0x310) + +#define PATTERN_LOOP_4_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_4_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_4_ADDR_STRT_OFST) +#define PATTERN_LOOP_4_ADDR_STP_OFST (16) +#define PATTERN_LOOP_4_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_4_ADDR_STP_OFST) + + +#define EMPTY314REG (0x314) + + +#define PATTERN_LOOP_4_ITERATION_REG (0x318) + + +#define EMPTY31CREG (0x31C) + + +#define PATTERN_WAIT_4_ADDR_REG (0x320) + +#define PATTERN_WAIT_4_ADDR_OFST (0) +#define PATTERN_WAIT_4_ADDR_MSK (0x00001fff << PATTERN_WAIT_4_ADDR_OFST) + + +#define EMPTY324REG (0x324) + + +#define PATTERN_WAIT_TIMER_4_LSB_REG (0x328) + + +#define PATTERN_WAIT_TIMER_4_MSB_REG (0x32C) + + +#define PATTERN_LOOP_5_ADDR_REG (0x330) + +#define PATTERN_LOOP_5_ADDR_STRT_OFST (0) +#define PATTERN_LOOP_5_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_5_ADDR_STRT_OFST) +#define PATTERN_LOOP_5_ADDR_STP_OFST (16) +#define PATTERN_LOOP_5_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_5_ADDR_STP_OFST) + + +#define EMPTY334REG (0x334) + + +#define PATTERN_LOOP_5_ITERATION_REG (0x338) + + +#define EMPTY33CREG (0x33C) + + +#define PATTERN_WAIT_5_ADDR_REG (0x340) + +#define PATTERN_WAIT_5_ADDR_OFST (0) +#define PATTERN_WAIT_5_ADDR_MSK (0x00001fff << PATTERN_WAIT_5_ADDR_OFST) + + +#define EMPTY344REG (0x344) + + +#define PATTERN_WAIT_TIMER_5_LSB_REG (0x348) + + +#define PATTERN_WAIT_TIMER_5_MSB_REG (0x34C) + + +#define PINIOCTRLREG (0x350) + + +#define EMPTY354REG (0x354) + + +#define EMPTY358REG (0x358) + + +#define EMPTY35CREG (0x35C) + + +#define EMPTY360REG (0x360) + + +#define EMPTY364REG (0x364) + + +#define EMPTY368REG (0x368) + + +#define EMPTY36CREG (0x36C) + + +#define EMPTY370REG (0x370) + + +#define EMPTY374REG (0x374) + + +#define EMPTY378REG (0x378) + + +#define EMPTY37CREG (0x37C) + + +#define EMPTY380REG (0x380) + + +#define EMPTY384REG (0x384) + + +#define EMPTY388REG (0x388) + + +#define EMPTY38CREG (0x38C) + + +#define EMPTY390REG (0x390) + + +#define EMPTY394REG (0x394) + + +#define EMPTY398REG (0x398) + + +#define EMPTY39CREG (0x39C) + + +#define EMPTY3A0REG (0x3A0) + + +#define EMPTY3A4REG (0x3A4) + + +#define EMPTY3A8REG (0x3A8) + + +#define EMPTY3ACREG (0x3AC) + + +#define EMPTY3B0REG (0x3B0) + + +#define EMPTY3B4REG (0x3B4) + + +#define EMPTY3B8REG (0x3B8) + + +#define EMPTY3BCREG (0x3BC) + + +#define EMPTY3C0REG (0x3C0) + + +#define EMPTY3C4REG (0x3C4) + + +#define EMPTY3C8REG (0x3C8) + + +#define EMPTY3CCREG (0x3CC) + + +#define EMPTY3D0REG (0x3D0) + + +#define EMPTY3D4REG (0x3D4) + + +#define EMPTY3D8REG (0x3D8) + + +#define EMPTY3DCREG (0x3DC) + + +#define EMPTY3E0REG (0x3E0) + + +#define EMPTY3E4REG (0x3E4) + + +#define EMPTY3E8REG (0x3E8) + + +#define EMPTY3ECREG (0x3EC) + + +#define EMPTY3F0REG (0x3F0) + + +#define EMPTY3F4REG (0x3F4) + + +#define EMPTY3F8REG (0x3F8) + + +#define EMPTY3FCREG (0x3FC) + #define EXPCTRLREG (0x400) #define STARTP_OFST (0) #define STARTP_MSK (0x00000001 << STARTP_OFST) + +#define EMPTY404REG (0x404) + + #define EXPFRAMESREG (0x408) -#define NOFRAMES_OFST (0) -#define NOFRAMES_MSK (0xffffffff << NOFRAMES_OFST) + +#define EMPTY40CREG (0x40C) + #define EXPTIMEREG (0x410) -#define EXPTIME_OFST (0) -#define EXPTIME_MSK (0xffffffff << EXPTIME_OFST) + +#define EMPTY414REG (0x414) + + +#define EMPTY418REG (0x418) + + +#define EMPTY41CREG (0x41C) + + +#define EMPTY420REG (0x420) + + +#define EMPTY424REG (0x424) + + +#define EMPTY428REG (0x428) + + +#define EMPTY42CREG (0x42C) + + +#define EMPTY430REG (0x430) + + +#define EMPTY434REG (0x434) + + +#define EMPTY438REG (0x438) + + +#define EMPTY43CREG (0x43C) + + +#define EMPTY440REG (0x440) + + +#define EMPTY444REG (0x444) + + +#define EMPTY448REG (0x448) + + +#define EMPTY44CREG (0x44C) + + +#define EMPTY450REG (0x450) + + +#define EMPTY454REG (0x454) + + +#define EMPTY458REG (0x458) + + +#define EMPTY45CREG (0x45C) + + +#define EMPTY460REG (0x460) + + +#define EMPTY464REG (0x464) + + +#define EMPTY468REG (0x468) + + +#define EMPTY46CREG (0x46C) + + +#define EMPTY470REG (0x470) + + +#define EMPTY474REG (0x474) + + +#define EMPTY478REG (0x478) + + +#define EMPTY47CREG (0x47C) + + +#define EMPTY480REG (0x480) + + +#define EMPTY484REG (0x484) + + +#define EMPTY488REG (0x488) + + +#define EMPTY48CREG (0x48C) + + +#define EMPTY490REG (0x490) + + +#define EMPTY494REG (0x494) + + +#define EMPTY498REG (0x498) + + +#define EMPTY49CREG (0x49C) + + +#define EMPTY4A0REG (0x4A0) + + +#define EMPTY4A4REG (0x4A4) + + +#define EMPTY4A8REG (0x4A8) + + +#define EMPTY4ACREG (0x4AC) + + +#define EMPTY4B0REG (0x4B0) + + +#define EMPTY4B4REG (0x4B4) + + +#define EMPTY4B8REG (0x4B8) + + +#define EMPTY4BCREG (0x4BC) + + +#define EMPTY4C0REG (0x4C0) + + +#define EMPTY4C4REG (0x4C4) + + +#define EMPTY4C8REG (0x4C8) + + +#define EMPTY4CCREG (0x4CC) + + +#define EMPTY4D0REG (0x4D0) + + +#define EMPTY4D4REG (0x4D4) + + +#define EMPTY4D8REG (0x4D8) + + +#define EMPTY4DCREG (0x4DC) + + +#define EMPTY4E0REG (0x4E0) + + +#define EMPTY4E4REG (0x4E4) + + +#define EMPTY4E8REG (0x4E8) + + +#define EMPTY4ECREG (0x4EC) + + +#define EMPTY4F0REG (0x4F0) + + +#define EMPTY4F4REG (0x4F4) + + +#define EMPTY4F8REG (0x4F8) + + +#define EMPTY4FCREG (0x4FC) + + +#define FIFOTOGBCONTROLREG (0x500) + +#define ENABLEDCHANNELS_OFST (0) +#define ENABLEDCHANNELS_MSK (0x00001fff << ENABLEDCHANNELS_OFST) +#define ROMODE_OFST (13) +#define ROMODE_MSK (0x00000007 << ROMODE_OFST) +#define COUNTFRAMESFROMUPDATE_OFST (16) +#define COUNTFRAMESFROMUPDATE_MSK (0x00000001 << COUNTFRAMESFROMUPDATE_OFST) +#define STARTSTREAMING_P_OFST (17) +#define STARTSTREAMING_P_MSK (0x00000001 << STARTSTREAMING_P_OFST) + + +#define EMPTY504REG (0x504) + + +#define NOSAMPLESDREG (0x508) + +#define NOSAMPLESD_OFST (0) +#define NOSAMPLESD_MSK (0x00003fff << NOSAMPLESD_OFST) + + +#define EMPTY50CREG (0x50C) + + +#define NOSAMPLESAREG (0x510) + +#define NOSAMPLESA_OFST (0) +#define NOSAMPLESA_MSK (0x00003fff << NOSAMPLESA_OFST) + + +#define EMPTY514REG (0x514) + + +#define NOSAMPLESXREG (0x518) + +#define NOSAMPLESX_OFST (0) +#define NOSAMPLESX_MSK (0x00001fff << NOSAMPLESX_OFST) + + +#define EMPTY51CREG (0x51C) + + +#define COUNTFRAMESFROMREG1 (0x520) + + +#define COUNTFRAMESFROMREG2 (0x524) + + +#define LOCALFRAMENUMBERREG1 (0x528) + + +#define LOCALFRAMENUMBERREG2 (0x52C) + + +#define EMPTY530REG (0x530) + + +#define EMPTY534REG (0x534) + + +#define EMPTY538REG (0x538) + + +#define EMPTY53CREG (0x53C) + + +#define EMPTY540REG (0x540) + + +#define EMPTY544REG (0x544) + + +#define EMPTY548REG (0x548) + + +#define EMPTY54CREG (0x54C) + + +#define EMPTY550REG (0x550) + + +#define EMPTY554REG (0x554) + + +#define EMPTY558REG (0x558) + + +#define EMPTY55CREG (0x55C) + + +#define EMPTY560REG (0x560) + + +#define EMPTY564REG (0x564) + + +#define EMPTY568REG (0x568) + + +#define EMPTY56CREG (0x56C) + + +#define EMPTY570REG (0x570) + + +#define EMPTY574REG (0x574) + + +#define EMPTY578REG (0x578) + + +#define EMPTY57CREG (0x57C) + + +#define EMPTY580REG (0x580) + + +#define EMPTY584REG (0x584) + + +#define EMPTY588REG (0x588) + + +#define EMPTY58CREG (0x58C) + + +#define EMPTY590REG (0x590) + + +#define EMPTY594REG (0x594) + + +#define EMPTY598REG (0x598) + + +#define EMPTY59CREG (0x59C) + + +#define EMPTY5A0REG (0x5A0) + + +#define EMPTY5A4REG (0x5A4) + + +#define EMPTY5A8REG (0x5A8) + + +#define EMPTY5ACREG (0x5AC) + + +#define EMPTY5B0REG (0x5B0) + + +#define EMPTY5B4REG (0x5B4) + + +#define EMPTY5B8REG (0x5B8) + + +#define EMPTY5BCREG (0x5BC) + + +#define EMPTY5C0REG (0x5C0) + + +#define EMPTY5C4REG (0x5C4) + + +#define EMPTY5C8REG (0x5C8) + + +#define EMPTY5CCREG (0x5CC) + + +#define EMPTY5D0REG (0x5D0) + + +#define EMPTY5D4REG (0x5D4) + + +#define EMPTY5D8REG (0x5D8) + + +#define EMPTY5DCREG (0x5DC) + + +#define EMPTY5E0REG (0x5E0) + + +#define EMPTY5E4REG (0x5E4) + + +#define EMPTY5E8REG (0x5E8) + + +#define EMPTY5ECREG (0x5EC) + + +#define EMPTY5F0REG (0x5F0) + + +#define EMPTY5F4REG (0x5F4) + + +#define EMPTY5F8REG (0x5F8) + + +#define EMPTY5FCREG (0x5FC) + + +#define MATTERHORNSPIREG1 (0x600) + + +#define MATTERHORNSPIREG2 (0x604) + + +#define MATTERHORNSPICTRL (0x608) + +#define MATTERHORNSPICTRL_EN_OFST (0) +#define MATTERHORNSPICTRL_EN_MSK (0x00000001 << MATTERHORNSPICTRL_EN_OFST) +#define CONFIGSTART_OFST (1) +#define CONFIGSTART_MSK (0x00000001 << CONFIGSTART_OFST) +#define START_P_OFST (2) +#define START_P_MSK (0x00000001 << START_P_OFST) +#define STARTREAD_P_OFST (3) +#define STARTREAD_P_MSK (0x00000001 << STARTREAD_P_OFST) +#define BUSY_OFST (4) +#define BUSY_MSK (0x00000001 << BUSY_OFST) + + +#define EMPTY60CREG (0x60C) + + +#define EMPTY610REG (0x610) + + +#define EMPTY614REG (0x614) + + +#define EMPTY618REG (0x618) + + +#define EMPTY61CREG (0x61C) + + +#define EMPTY620REG (0x620) + + +#define EMPTY624REG (0x624) + + +#define EMPTY628REG (0x628) + + +#define EMPTY62CREG (0x62C) + + +#define TRANSCEIVERRXCTRL0REG1 (0x630) + + +#define TRANSCEIVERRXCTRL0REG2 (0x634) + + +#define TRANSCEIVERRXCTRL1REG1 (0x638) + + +#define TRANSCEIVERRXCTRL1REG2 (0x63C) + + +#define TRANSCEIVERRXCTRL2REG (0x640) + + +#define EMPTY644REG (0x644) + + +#define TRANSCEIVERRXCTRL3REG (0x648) + + +#define EMPTY64CREG (0x64C) + + +#define TRANSCEIVERSTATUS (0x650) + +#define LINKDOWNLATCHEDOUT_OFST (0) +#define LINKDOWNLATCHEDOUT_MSK (0x00000001 << LINKDOWNLATCHEDOUT_OFST) +#define TXUSERCLKACTIVE_OFST (1) +#define TXUSERCLKACTIVE_MSK (0x00000001 << TXUSERCLKACTIVE_OFST) +#define RXUSERCLKACTIVE_OFST (2) +#define RXUSERCLKACTIVE_MSK (0x00000001 << RXUSERCLKACTIVE_OFST) +#define RXCOMMADET_OFST (3) +#define RXCOMMADET_MSK (0x0000000f << RXCOMMADET_OFST) +#define RXBYTEREALIGN_OFST (7) +#define RXBYTEREALIGN_MSK (0x0000000f << RXBYTEREALIGN_OFST) +#define RXBYTEISALIGNED_OFST (11) +#define RXBYTEISALIGNED_MSK (0x0000000f << RXBYTEISALIGNED_OFST) +#define GTWIZRXCDRSTABLE_OFST (15) +#define GTWIZRXCDRSTABLE_MSK (0x00000001 << GTWIZRXCDRSTABLE_OFST) +#define RESETTXDONE_OFST (16) +#define RESETTXDONE_MSK (0x00000001 << RESETTXDONE_OFST) +#define RESETRXDONE_OFST (17) +#define RESETRXDONE_MSK (0x00000001 << RESETRXDONE_OFST) +#define RXPMARESETDONE_OFST (18) +#define RXPMARESETDONE_MSK (0x0000000f << RXPMARESETDONE_OFST) +#define TXPMARESETDONE_OFST (22) +#define TXPMARESETDONE_MSK (0x0000000f << TXPMARESETDONE_OFST) +#define GTTPOWERGOOD_OFST (26) +#define GTTPOWERGOOD_MSK (0x0000000f << GTTPOWERGOOD_OFST) + + +#define EMPTY654REG (0x654) + + +#define TRANSCEIVERCONTROL (0x658) + +#define GTWIZRESETALL_OFST (0) +#define GTWIZRESETALL_MSK (0x00000001 << GTWIZRESETALL_OFST) +#define RESETTXPLLANDDATAPATH_OFST (1) +#define RESETTXPLLANDDATAPATH_MSK (0x00000001 << RESETTXPLLANDDATAPATH_OFST) +#define RESETTXDATAPATHIN_OFST (2) +#define RESETTXDATAPATHIN_MSK (0x00000001 << RESETTXDATAPATHIN_OFST) +#define RESETRXPLLANDDATAPATH_OFST (3) +#define RESETRXPLLANDDATAPATH_MSK (0x00000001 << RESETRXPLLANDDATAPATH_OFST) +#define RESETRXDATAPATHIN_OFST (4) +#define RESETRXDATAPATHIN_MSK (0x00000001 << RESETRXDATAPATHIN_OFST) + + +#define EMPTY65CREG (0x65C) + + +#define EMPTY660REG (0x660) + + +#define EMPTY664REG (0x664) + + +#define EMPTY668REG (0x668) + + +#define EMPTY66CREG (0x66C) + + +#define EMPTY670REG (0x670) + + +#define EMPTY674REG (0x674) + + +#define EMPTY678REG (0x678) + + +#define EMPTY67CREG (0x67C) + + +#define EMPTY680REG (0x680) + + +#define EMPTY684REG (0x684) + + +#define EMPTY688REG (0x688) + + +#define EMPTY68CREG (0x68C) + + +#define EMPTY690REG (0x690) + + +#define EMPTY694REG (0x694) + + +#define EMPTY698REG (0x698) + + +#define EMPTY69CREG (0x69C) + + +#define EMPTY6A0REG (0x6A0) + + +#define EMPTY6A4REG (0x6A4) + + +#define EMPTY6A8REG (0x6A8) + + +#define EMPTY6ACREG (0x6AC) + + +#define EMPTY6B0REG (0x6B0) + + +#define EMPTY6B4REG (0x6B4) + + +#define EMPTY6B8REG (0x6B8) + + +#define EMPTY6BCREG (0x6BC) + + +#define EMPTY6C0REG (0x6C0) + + +#define EMPTY6C4REG (0x6C4) + + +#define EMPTY6C8REG (0x6C8) + + +#define EMPTY6CCREG (0x6CC) + + +#define EMPTY6D0REG (0x6D0) + + +#define EMPTY6D4REG (0x6D4) + + +#define EMPTY6D8REG (0x6D8) + + +#define EMPTY6DCREG (0x6DC) + + +#define EMPTY6E0REG (0x6E0) + + +#define EMPTY6E4REG (0x6E4) + + +#define EMPTY6E8REG (0x6E8) + + +#define EMPTY6ECREG (0x6EC) + + +#define EMPTY6F0REG (0x6F0) + + +#define EMPTY6F4REG (0x6F4) + + +#define EMPTY6F8REG (0x6F8) + + +#define EMPTY6FCREG (0x6FC) + + +#define DBITFIFOCTRLREG (0x700) + +#define DBITRD_OFST (0) +#define DBITRD_MSK (0x00000001 << DBITRD_OFST) +#define DBITRST_OFST (1) +#define DBITRST_MSK (0x00000001 << DBITRST_OFST) +#define DBITFULL_OFST (2) +#define DBITFULL_MSK (0x00000001 << DBITFULL_OFST) +#define DBITEMPTY_OFST (3) +#define DBITEMPTY_MSK (0x00000001 << DBITEMPTY_OFST) +#define DBITUNDERFLOW_OFST (4) +#define DBITUNDERFLOW_MSK (0x00000001 << DBITUNDERFLOW_OFST) +#define DBITOVERFLOW_OFST (5) +#define DBITOVERFLOW_MSK (0x00000001 << DBITOVERFLOW_OFST) + + +#define EMPTYREG (0x704) + + +#define DBITFIFODATAREG1 (0x708) + + +#define DBITFIFODATAREG2 (0x70C) + + +#define EMPTY710REG (0x710) + + +#define EMPTY714REG (0x714) + + +#define EMPTY718REG (0x718) + + +#define EMPTY71CREG (0x71C) + + +#define EMPTY720REG (0x720) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer index c50684e34a42f1c07c4cc35e4be73ad49b4c1199..9af587f648d79cf91babbe1a8ba3acd1fd9df002 100755 GIT binary patch literal 233952 zcmcG%31C&l^*=uMB|z9DK-ibO01C2(9R$ox070>WfV(y?ECRBG%?bs}18lWwYeuP9 zwR!<-g}TIQD{5-VomJ`;R{EnRDl!Ip@ro zGc#xA&fPHi>@z}^CHOBS9ut&`b+r}B{a1+ibr~v6|JY)TXpVpTh~A*zSek*@s;Hx+2}XhlW%s&MvBrlT|`*@ zo4it9`kV2=>Ujk39^gK>dq9!G^L4~YDk=EN&z+0sh|k9UWqTQCdgTS_C0Rf216&V7 zmMoexWXZfiOBOA=a?PNUl9h88jv6s|Rq5cNuG~bQ@=iJDJoO;ecQXaK|B&{ldFkOA z{tUpQytIvLEBp%aE5L6Gek1Th5lVjpapk|!0NfgNF`aQ~jUUy=Nc<+_N17yi>V==D zM$r%OSp0h6cM5*F`0-y~59s7wyLeZUrMCy4it8i~9*^rd{Mz8xAHNCsosJ*>jq!kd zT-nS9@y-8(E7uK^qB>~lB|74I7Jh6adK+r)n`*O_aLj1{5-Kx#7W@auzL z9)9}Y$w-`u-(U~f9apy1VIFR(cg^vxL%gebISq)e8nQiLsspkIl9^{3`+Ys{`<31L)5W$bWG_exOAd zKlAS{ApH2;6o9V|z~3Bz|8D^P$^bs6!C?IOSrU-{i2(cq0r*n_@DB&@IUpea#R2*M z5`e!tfX+t&c=G>#ddLaL|7ZYyNdQ0h2ITJ+fWIez&SL@i%>i_73BW%XfWIz)KKb1+ ze&*k-06L)neU1pge;q*Qw1E6=0`O-9;0FcZuYy2+^}aFye`5fjRsj8H1L!;*fZrN` zpA~?g7QoM%fc#kje7+ly|MdX;zJPKU2jGVV;Aw0S#?Sm)7LdPt0RJ5W@HAxhtKS0w z_@96gzx*Wu`M*Z~wxY9mtC>5x$npgF!Nb2`;4fG7TZ`R;ZIv^u{uSa3T!~Jlm!JD! zQGDj?pA^rVzjFS9MXOfNUpf0H6PJ`On?Ji`&XW0}xOl?b(j*?aL=Pq3?N>-OH5=%>#;I>#kcS-3g(hWwwb3NTGEm;Jf zReA)nXRDSiU%6=6>dVC{@4DQTW%bHB{Xl^R zM~jw0M8)ll91CG+RHGDF@gl{$-y!Pl}D=Sh#sTQSVc5X(K>R+SEkb#8W1S?kU|EHp4~t3>B5 z4SxzDyuY}Hr@0OPal59$GL2#RkJ~TdX&ldg>>mhEafS z8lLAvbni9|PjfE*b2L27?fCCL4d028xRz^pnj7=qZVk`#Te=t1@cP{A1r5)!8OmR& z;c2eNe{X4c8td_2T*K>g&W|;`J{Pai@L?u`>k$o~r{RT_wEtcjK1;*%9G-4xYxq7| z{>~bn=Cu45*6@0}?x*4Va%NofHGDq}KSsk-EP?-Q4d0)UxK7pZ97CYnGc-JnefaM} z4X?)5l?hA-6cM>Kqqh8Llv{kuJrdoxSJyE$BZwuYaq(dn$=&(QF> z;fyzqt=qHnScZ`Kme_J^-QN3R8O3kb0Ebv;W!oR8B(kduWH^-jCgtTH?$xvn*@^6s zQ1?{2Dbl^PbPJ@5wDd_x&(YHDklv)FJ0iVZOLs+jpO)^4bhVc5g>=YDmVXM;y|i?H zq>HrlV5H}0>0wB3($b@l-maxjLwcW9de7($eQ3Jx5E= zM0%5!J|F4rTKZz7_i5>$B3-Se=O7)*NS1#&(!I3w6-XCp>19aI(b6lC-lU~}hV*tV z{d1)EY3W}eU9F`zAsxz0mj5fHdui$GkuK8GzeReEmcAM3OcKaF&?mfnYSsA;nN z=aBBDrC&t4NK5|%={Z{Z0MeVZ^qWX;*V6AGy-!QOk94(`u0}f4ELr}CNcYmx|3$h; zOMi~^94-A7(wnsOcSvv7(mx=*PfP!ZbhVZa6{7sCWcf{z?xm$$AYG)TPeOW*o7P;A z0?DuR5YYoY@%tb{?5fJJ6V<(i{1AQ#8OlWE0GWY%nfQJAW9`=UwY6L6nIAJn4qeG- z#o@2Sr&AKP5RWdbt?fiO_E)%9Bf`0|3fDYbF;@R1hGiV2EAu{{k|@D5H5t|}0YB%_ zO39Bg$xFSCZa7%jYU2%gM+;|vd;TOU;V3p&|D$sx&=xLBGI`eAEi)W6lJE-hK z$z87Gt|0rwwDYxiGw{*OPAHp>2bcM&hSp+r?~5!zOC=J_gJlz0qzil&GyxtU@`VFqLY?GT<-azw_< zct&U!>m!^Mn;^2H6T;5E@xs|Op3Av~Xk~zQMp1&~E>P*BghTrGc+CSIvQ^B2O(xJU6ChpsR4;3(iO826A27GzihxEl4Q zWQb3Y%;z`9Tz)K1J`pXD^N81O;Jus6d$vj!C06+GPVERW^)2xsnH8()+CG%HjIM1$ ziP~CgXMBf{*1G6{YWN_khisxTS4ggxR$dx%Y>8w#Gvl2yE9m|QohDTr2ET{e6eX(L z7bU8OOsW9yWx^?tYvckQJR-1)oH^5z!3Uhv>skk-wq3t0ek>hvFJWIs};spKPBM$_Cx% zGi44vKOD~ww-XNX#prp!dAQb=qU=()j`w!(>NA!po6$2v@XQeRnMdduz&W^zQ(?as z;JFLziiMCPK1)>8LWbIIqC!l)4z}&Aj88{;v8ebZcq^QC!_2~Ie_k11Y*&P_jLq^^ zWr+SnV=~de^*p+QMpZXk>7zi1#dZjG2VD^EP=?hXHq*Zfbd+p%6ZtRVs}uO_3Smik2aH6Q#tV4RlVJEPgQ9+J&v31WY|9x!T6G__-H<#yW z{5jBzZ4(ck*l`OjKIe0*$!yjOf+!a z?xV}FpDj=GWQ;VI{WTe>4&Nl%An$0_CHRdaztSW4sRE3?OX+di|DeZlNTci(R5o;% zi@s0k5qXpz!!2Z6D#L3pq>rbl478n|bj35r);+8A$o*aw`aSh*tc4_>Nquc3)81)k zik&6ng|zX@Lmxr?28|oIFXXu{`MP4_2kll|YTwNBUZ!8|(YL}aRX^4X;|=(;MBZ}y zh_zfC(P`H1&#LQRYd3^;#`j~)nkl9WA<(T`_=WJxz%LWOCipddK-BzZd~F+{WUwMF zRi7!ME#;=8q+2Ty-<&C{+ZUqUL}w0C`Yueg$F&-GlG}>3a`~eCovZ|6t~v3|7=v^w zOk52d=Mfk$ck%MXaSyuxa_^6|v#IYmg#2}VU6kl$?D~rGwxMwc`iK2lUjJ~vvfbJZ z?RM7YTB^?Kcy?OJ^XQp7F!lh=>N{-3vml-Ue~5e4z$<=YtrgGT{tx%=7KygR^WEq# zkmnFRi@H$x;*>9AS0~`BfG1r{1}QL@V=Ttw60!xhAMQ&{dU@_R z1!W}ZZNxZ5l$FhlWjHI#z}FX(+;PZWcPypyav4OgZfq4MS?Z6i@;YOz*;$PND+R_W zjbREz=;L#n9tI88= zBYRLDZ){*A&)+Ez#s>Xy{p?(^C5$@6oIza?_uE4JMQBW>bm`8CR9kEV-_iy?!-mg* z{wW`gEAaeGZqwXmX)J7^T~nK z0>5!7<+?V#u`ll7H^T4UDY%EX_~$%F1)owb$s5U<{t z!hybLsI;AU7`%(T=u9kCZxL&{wW}f@i}aTh#TKk7xX(LndCFEXHx2lc!`4++Z5SSa;)mc zKT~W9zF)PC$PhKhO0_MmZA9A1Vk+Njb0kwsm9`U0NG7DYO))*1pHcaAWjnoUhU*75 z!bX*xv363mS&y!b{K|*IF3$&DdcF(vvWT9`5i9DR3%8f!sC;jHLeG7K{M2_(#nnNY z=H9A|XnUEjbO(QdewXsTM|lBHz*Qi9Y@KWKtQ*vent#^$D8y_SCcP)ypQ|GpSNg^^ zW^@jYYsA{ii%@<_TqB$#X9JfK*Kl&=bl_6r8lr}A6tw@Z;~M`Vn#YT4gu6(xAv3N~*I#D)x#hE+*hxm;1kf_);3-*~IBNMC6@9d8el2 z9gF*2L>HB}vzJ$3yep1QIw(F}f3S9L_$88C2qB%jn6MMP&C((o5$!Z}r5jJde8wMk;z zR>%nYO;vhwVyLT&a$zUONP9|~R_rNmS+N^!%z31Xq?iTtRh|*Y7!&kDVu0KRzMO~b ziq@oC`+^*7-6R$8IuxqmM3z&Xnu>23@S&U~E zyU+Yir6D6fgEqoG{Y-u?K3Kj>`EJ5G?lLJRLas@~?Dn z9rCVo^OmUe*873bCo^0k79UmPg zANKM;4?Np!)yK88Wmv6EDEoq3WCM_GMLbWB zmA9)(PfkomUd5xw5ApaDiV0A=0L}v6@!Gp*79cKy{jGI)mgf_9u2h#d=H-3Bq~Xz{ z=LBLdhmg;k^OcF%aCrvtGZFkvbou)Va|j1;5AX-Qw>#5PbCf#0Z9Cf?CzZJKf_9LV z<}l^@Jg%fA_=PV#0=@0F+DTL0H-A6{s z5b0w&@=ka4@gV5~@Y|^G?RbXrS$LlM3@tvf8}W(V%HJc;-;kH;vx@6YYnN{O8YMp_ zx>Hcj6xZgqsPyE-9z2UZTVC58E#D{nG~}D+=A&4e1Ng6026XIXw5aP3BfvQsO=T$T zt}9%MG}{x^{|?;ay0^k(l%MT}JbNx_S%Lj3InE_FR0!yi`h>6$H-zAumAqI-B6(+1 znUHH6>fX5oeFN;t!LvPlo<(_yZ76Sw_e=yjrf2B+*3b*_{rdNaHNZv)M$G00D^txQ z*P48wEhH#UAJF3Vt(U(Ibg2(3KwJ4FQ9Ik&ACg5)T^*2ox(&o8BrtIdM+?GS7_~?Pe9|!dD+~5Z`|e zWq;U2#W?EP8SJ>-4Wq>tDo>RUKW@3>rgBl^`8D*9+zyMW4w`y2G`|;NUu2J!(}=%u z;CGzM@AsH{IDmVB-#VL%jg^IzuK@W9+&5jSRmuTX>&4^Q6S$1 z4sBGMlL`4IaH(@LAzuS7bxtPa%fO}1$t?LiaH(@LOYQ?MbxszNPXXu6$;yRSA7viy z|BpFY;yctm`jr36wdQNU@A2nk7(c*f%sH8w-*epU{^l$0lWM$OlULTWo=w0;F?P;r~yR{s{u+v(OWY|7Q4r3T&_8|;M+Q@+n$J@wL z8IEMjQy7kC%iau!+hRWg*GpU3gJHzpx-uMZD?2fa_*D+W@piH;!*+Xl62ne=*^*(A zBeNKeW%Gdvy;XF19+;wuS;5m)(+VZ>7~U-xXOldNGl)=7TGu-#ey zmtm)~{D@(p=9S*FY98pqu`crcx;$OwyA0c1INDu4$FS%j_cI*r0blFM67M0OV%Y8}A7|Llqd&%WD~qo-D6nSezm^GHjnBf5C9{6uFM!*eP-i!=kUelHo{SxsqY0uPkLa z-d8SR*zPA6G3@k{moqF*m2(-6oGK#>M^BZPF&szif?>PAyntb+znsl5;t}UE92p?b zVK_EGPGi^}D5o;)43v`@7K3CF!;wL1!}buF&oIXA zgBXqvk^LFA^JQO#G5_tuuox=y7>*2;JsFM-mE9N)50jl4#yqwI!|`FV9mDo;*@j_f zxNOC+7$KW892p^-G8`KrGZ@C)L@*p3DRJ}ywMWD?M#>);wnxeD8Fog=Zx|M%<(CXc zM$69`j*XU|FpPP_#|%fu$PXCCc(|Hjj5YtwurpS^$FMj}zRfVkSZ^{MJ53&BI6O{P zGK_stuP_`RCtqaP9xtC~*cmUMVK_WN?qxVSK|ake_7pwAuzkAR%`nDFe`OeBq`xqX zvC%^eV@!0v3!~4)Iw!+XA@5~4F60h|ZA&@~$1M2=hV78Nona>=F_Cfoq{xt47>;B} z1Qa~~nIV76F#38-#$0?fQ(nh#JX8LXVf6Kz7C9me+0wMNpdK|SaTiBFvb7_7k*_g~@xwnDMy&iLhB0P%fnkgpo@E$g2E705mWwgN9)?AC z`6R=U?h>0*Je_oxe`7e@Lq5W=(?gasEP6_uq2T6^^pw~n=+W;f|HN>-r@V*ZaIW0O zFvb#hG3?~ZI~c}T;x>jcmiQgRv9P?E;c%Y3iQ#CTMEuV!H=ZYd&9L1|{)%Czm&92E zUY=eu%COyA;>-n)=ic(?3}akz6~h=;U~iIWzyzlMe?UN}`^k$Kj`Wk~GmNpsEQaI#Yt=IgVkBCB`ru9wHcXzxFvbHd8IBK^ zSqw)<$R-TON5~Mv_DETaIlR&X#sEhd7NaBvGOp(=-;atj-DppXIPAr?=tL+lW#GMe*6uFW8>ukhV2RRRfb~|r@Mu3lm49D8a za~QVU$!QG7+R3R5hucfMZ|6Q6Z7+)$Mn71&a+Cx$dO+6d$fpt_5wtLFt9+1cC_7)*ujfF8E?NUhdgnt8C4ayd+Y9}HE+NxzpCAe_mnVvj2tkEU^|cpeYxqwN-TwV+E2mSBMo+=z-6^qioRKf%PnBi=(B7(iC3JS?r zA`BT69x!53E)3Zm(lh0U+yr-Ix$G92ziE;5H|Q&p{-#Az_IQh=?BSM4+3l7ova`QY z@{_Hh?odDFdEwD?rG0!!+>Fztm1*EGCO~^h&4+&9YL$Yk%(L;nPPTz7&y-eR=$DD$DC}0fkS^| zjWKYT6ItU8Tt40}vke^P2G%4K*IQas4czj+(mLC~)c`lcz+sGS%{Fk+{?fY8z+pUX zU25PkPPQTju5y^P<{3D9gtQhKxH8zr5(8H=Mq(X3RnKwQ%W4CMaig`yz~!GVt@Q@3 ztUy}P6kJVS)RNXU1`cC7>pBBh(?nV~8n_v-t1<&ecD2R8kzL(p;L2J_>rMk#1G{nz z9L7o3JqFH(UEOEk^4m-6egjtqTPrtkQP|p}2Ck-)w00Y~NEc~6Y2aeme-|@w;qKCU z#=v1LV!dGC(AQZn8#p^Gtx5yuz@A?>aEOOnZyC5qA8Ea3;Fe>rR@}hN$d}e(16Mv= zS|1y@*jQtT5jON@CU069Abjj8Uq*U0H0{!qGN zVU5GuZQ#PNwI>Z+IebLSz-7bMo-uGWu(cObaFuyc)bGm%4)X`A(!k9?ANsn1BOmsb zfx|kE^`42tm?3W9uc3@jUBO1Lr_5H3lvp?d=-_R|dTtF>qn%;HZI% zVhkcey8px240e!d;2exMvJ4#7?5tJ>E{Z-rI|WyhmyPzDW8ju&!2cOIf%eSo+V6!1t_*c~seyAao{Shc#9Xa;22P+Z7aBOM zt6ED8To`u0+`u^)Pp&p_h&Nhm3|uAbZ+#M1NPTx1>>z63%4tlP#Gy|v&&!8w*BQ8M z$aZ52t|pKAg|bj0reXn@vm(xtM}5E+16PSY;5Gx7k3Qf|0~dyma12}&)xclPFmU9r zW*fK}=({g8aQPU6Tx#Or!y*O_>oV3n0~beszRZh@WVzo-*)U(uoWE;4A_=p?>hjnVJvw^Eb9d$QwQMB{0fs3P0>0{vX z(Wmq?a5N_wVc=%KAB-_@6e}HX;INKs*#-{lu+}64R|6k0H3e6bSB7?ewt*99=Q9i( z;=0ys12+Tqa$#lyXJu4mQfwZvWI<~>ygwQ11xssdDQ>Rb_2&35zgLQ}P^G@kqsB(w z`onYI)UETBtMe>q+yplpinimPQ<6)xr$7%=iW1PjECbmHz&cq_MHi%NRsXS*xW`(n1l6oI^FTKxV=wTbt@!HRs$iIzriF61yuIeIs zl6-`8KN|9mhK-^Ai&eTPaWeALdpul^*wZsx(W5#<%;}GmZycT*2f0v(=c;s3q7$BD zK1j#MefMR5JMY~WudTZ4nJMiwHZ{7$Zq4>N(@&|?!}xJ zGOq!TdRy+J(m4MMd3b%e1UjJg#P5dEnIYV^bL-kRy_>`Gp}y+1+iO89o`L;+N5#(g zT=bz@dx_#6pGBnOe@@Tz&c+@ItWjT$^W4Z5!Nbji@ctoe;tJT`g?P7$>f>qfMYwIi z(Rw>Qx1D&#dx^AmpMmGe_F0Z+lpJ(!P;Q`}{p2_gJPEve79RqC^@xz0Q3lb?^Yrte zrXM~d<9NEUi6-6|C7S9wz@^<({p{-4$|YL2h+^-;Vlx+?c{g@~o7G>Zm94 zG2G(=XLd1PbWRlUqt4ay>LFj_=R3T^(+d3HOgx;Q1^!3ligUouB>ns7X`bSb&pJu5 z@p9?|4c%8#U-#XAU?gfsW7{-k@0e2iD#{E^su;8S-!QtGa8x_Jn?L0#P($N4E=eF~m%jpOVT$n)hk z*9R&Y$xbo;Q*G7rcV(7ntNbbNZ&5Y^K52i5?iYHhw4FGNvQ(QwJ0ROH1Wjs}U*v1P zVPdxF8v^S!O7x%y_Gjz8bUDcZyxDf&Q01WQPR#aeyMg6g&N{-lWe47ERJ08lp4MdG zahcbC1L@8H-J3u!gW3ni80-uFtZ4C=D|t2u*T0{QPXMj;KD2I2q18B>=l?%5JHZJ(YCr;{)af(5>@1u&HFbYb$4h4vk}}t=08G zn{l>m8$oCFR8%+f{1y5lvd7xZ?wPX3)}{Erz>uva_*n*i{Q8Hz#Gj9Cyf=h=$%*M`8S{4>J#EtXn(FE4?f^YK zuK3{d)7&#*kLM50rnI|=q z{`a^(yq)XA@xn9eXhJv^8!uwf@$AcMYoO;L*aJAk-2?b%m9`Trz$=|&OZ`LyV<&=_ z5N@=F1H1q@o!8`9p^fuv&G7sgK027A^jqIYQu|G|{dRH|p5=LS^1bH9`J#_MYIxl6 zWB+8^eFpmpsqJW-^nU%Cq6;Gcd&0X#b$AS z@OOjtKHfdo8?qfRV;R&&=QeIO!`&rFg{q#%c!n4qOIMDIU(Is`;pZg z)x9sUf0OWjeA28rP$&A<*k&(rqs6AL-;+JVzeN#kU%$Tw^T$*I{A{+d7YD z$0=Q(SReEX_~$w=^6J;G9{Z%!W8>`UZ%muU_UI$bdVKlRq#wH(v7{c*(GhP>q|X6( zo}=^y|6qYniccs%fOMU{!W|@Hfxh}$%m}{delNzHwP5YyL+UDD7 z&|R$2C7QiqKl)sHqo%7V&=rk+??U-(13ZR*JdLu?*2?~MfK2zKL3fl!*H5OiHJRFZ zGA;6v>6dAg-AOBZc7RN!Cq}oN=Jb|E*H5NSnoR#fT#D*xgpW)!g3B)Ri6^MCt3OEg z%c{*%yYjJ>@A@U%)sx_X#s}?52WW#C#{6+`3Lh!{IgpQ-%ZHk~v+t;D-#83hV5s9m1pBhwXWlzsGYvJV{_Ak*wL=zgft^^@sn-()-A=gHK? zN2ZZ!l>NL`HdY9I+Y`Q@bi(cFVU4bzOwVgF{l=5&Fk;81j}U2;eX~~fNr?9ZjamPL z`SywWiFF$7A89@sFdjaT2JLwo?QPHn>CN=xPo_cl9F6V`0d((8gYFoO?v(*_%hI6R zOQTyHK=h6m6+Ck?uBjc$(sx?|Fy`=Um-SpeN$DRdh* zUU<}{d))P+7fwm~v)|%<&;>MJ@YX}3n16oh&HL23qaHp2e6Ec%IGej`AT$TOfnrj) z|2*bhDkekkU|@~LTSrhZ$FK6dwG~LIXa{$_17p2&z_*&S0ltJ{`!qkpe2nIH z%~aY>yyE6b(nR@%^bR1}D8)LCSN=vXPDX1Rs{C-r)VNqB;$oF5E~dtSW2szij`;!2 zgSy#?KZB1P=nL_(ifXLs(42_qWjY=8^_+5VJxB5TCFXS050b8kPs%SuCwUKI>%3k> za%=`Iea&zi>LDQ3spz5(^z~H5_i*q>W5nLZyk?qK=WS8v{fHmr6WR6i+FIVG$V>A@ zl{Z{J??^50{}3Z;$9ePX=k2fMtwCPW$rR{-`y8HI%~f)9Y&B&L94Pm<)wNqk_|TdG zTClC8-5{14^uv!$`GW8H=-^|%=Oc3!?&;+x`#bkrN?y!3P_8|YtCrSH zzpk&(H$j`)A+2}c34NYLx-W2Jet&l3GuV4jP#0SQA8rgL8}loyX{t6CcJCM9tk)Rm zC>-u{ET9l^n<~&$c+jG@&1FQ;rfO?LJNX%+Np^fObWT^ApD0_mJIVRfe!Op4Ik3&P zDs3nJ3Hd1QsPf@VfJ+FE*mzZ6oKcH>%~TrgANiQyI^LBWXajiukC+cKkHkBzF~<+p zZ&MTt;qNdRv53Gr_$im|>4oBj)Rsk7>|zD`#3uft$~iF`o`iDX^N#DkFVyP2C+eN% zomXPL!q1141@OV;ETHEgOVTbI*WS7`lGi~RuU{ih*Pd(?<*EJy_I5t_BRC3}@z;Cs z>xiwYHFVgL=^HN&kjtTcEcN#Zlu=CK)2ie+fpj$y_NB)=LmICyfLHQQxzG>$C!RNt zOQY;pw6a@xb!Cn%Pfnqm^bZZm^q58$b$T=PS?WqL3zkuf75u$V(r4TR8AnikP>f(Y zY#RL=wb3}fH-~rKA4a*e38p@&YPwy4Hd-mLFLfpDzw!EL2RfwvAy{ij90o7d-u%xZ zAM4SHfKD}Fq7frsjJo*RJByiRBfp~J7MtDgdFgrop#P#b03S$`{f87wnsf z<2!QD?a(;cIQGI2Ot!zp(_10@w(_sQZ=*32Su57q<^@! z5&HSiiz6IQKezd`;l}FcRG(-4^z#OINsgBr=RX&?`bqjt_%-D}DXy^JZR;V;f3DT^ zQ^5Kmze)ZRJ}|ENPqLr8bp3e#P}z^+4`<=b_eR+d{15x%nCD9m`{@VyO#k>Br62bj zl=|Kmt_MH=n9KU{;w)yLIa1Td|30hTdJ5W8i6`@3YBT6tu0i|XiXZhEl%}~|0e!n1 z{*B8fAE0~|?z?MoYU~KV+?nQy%8xwrZ#4!~@M{$N(dK7YtF)b%2!6T0X1_8$#V(TL z8!p>V?kbeUcCe6m4~R33QM7rS*EpZ`qDH%}kJkE=c&}s|yw}rdD?_Jefv3yT)hW)> zVx5+1I$dw*w4bNb&ymN}=?|F8CEHr#bb6yE_uvL}dPvb`oi>j4l`ideXn(Y~pq)Cq z3H?%UV~qD}O}EpbTQ%nBjlP-2^f>E@#+%y_i#O$cIt`v?Fi)VZcna8`I#1)NKX{_? z{6_FVwy_!fQ+sDyzB3Iz27?cW$2ic5ImV&BnDnIYTPx6bY66~UEPSbtUe=_+Pm478 z>89~hh1d-7GscIX*=g|e;rq#Xm)|dd-Qi|@{~dz z6)!@&Q+*%JFPyIOV#M>*o&)p+4xVkQ(stry(0#&3_J3mDcA|P;J~0itZ-8!) z&3_tB`j5ZVm%Us>yURZqvY+Y6-UhP&h#0Kd-n*v3Bp!4eNyq^J2naA-Bl+m5@o^Y2CaRZl0eqaF1|J{4m-Gb<*~ih`Wc%Ic@zEuKj}d9`@mwSMct_*I z@%Z>2@n1hXZI=cg_cW4^-5MXi@c4KmfR7r?50ia!%KRv>y=(#>-@-=VA68&oFk8HJ z+f1j4v+@Y=UwHUD;MtGx+>v~Ux4u_yg?psDyToVn=0)*NXcX^+dha_HU_T4TGGPNV zKfxL`&Ep?NSxlefHx|mQ_2z-E5g%AfDsktqN*3lr&2ee%!z<%&F0C4hd-kUCw0Y~R zR3737ze66=$8S@*<9Jx(eBN--QMOF;8H{PvxLzB7ovGDb8`K?*qc2C@nPqQEskg?J zouifAP@$oYFAYJtK(M3TD4~^>+Ujq-> zKC}jcmTp%k+NV7My7az}U)>()neA zHF;JB$n%>t=;ms48*03K)8k`s03Taz;a5G9?Qb{ACV$dKtKULzj65KXa-VYLS8;+L=-pzUxq62*=>Cc1 z37D%tt;ur@!#9(@q%t8_%wabrM77skEKQ0-x~=Oa2Nm0vd}3${!2Y$-hdI zKT34)4r&#?t4s0^RB1c$74po5{4THf-aw{zUI2ZEe6x^6_@0G@{I?+=@oaS$?c(5D z;CdMMy?3}2|5hXq$ zOj^UnHKUb#4Q07kE7QGx47wj>G}-kb%J~52=^VzlwRs&{)qkWHc*xrIDd@6H&{v|i zR8(Xea$4`LIT$aER#c-rdtqdZ=x*Pfhi`ZDb0{+rFNLgheiNQ2n7%vk8NSD%>|=2% z%@A})&t~9U+N#A-oMmL~qHluJxjA%=(09R!=3+T1_HyRvT zMcN?EjIswDym^A93uHp?6^g>~D!mqy4j; zz>l~wEROfM^H+gCf8g@chj=L$;Wo0&C{FOXO9(U@{Q zKanDDELrYspK^<-9B=$U<+N03JMo%V?x~F_x0UOkQp$~@<$i{B zW15GPeJDOqF8Odl?VNo+&ix~Mr~%IM<#WiksqeD;*4b{RD@P^mE#|ts+rv@2Z>8!iY0tY!CfN2b zkVl*U)h?}aImsPEFNa*)>hQxWbbzoch0JN<)7+ljfL zQLlaHCgmf#A@6)D&{qDcDV_-$gZAi_^i_utJLy36g7qS`_mak~$+e?0Ax@PqDOsQc zZw=upPqqmtV<6UC%<lG;DJ|8_ilLo)%YkIgPKo1Y5LDz0T4;N^9=y5zf;CmBI3_U#T>ESArak-Bk zHl@LDj;4om1N5*Y4Z1(RiFQHzSuxHt=iD7MJ-mxps+yz1=hclf?E&&RC2P_rtn_3b z1AhBzvKPV^BKBJ`F%2Hy0FUSk)cm|1$&PWCxt2aC4Z3?8kp0arNuO}1pX@j%{#rx! z;hyXX(53So*$=SnnQ8ENt0wzF(Dal2bId7E)DJ`(kbSEr`(=Kz+xV`zA^SI&CsEsf z9CUa3$o^~^JYJy5z9m5Rhti;1*nsR8YO?qAlRZ9AHaBGdt0((9(7nP(_FtvJV`oiv zI{(nG-j|;k-Etbogh=-3_}o8k zN5xMbY=Oq%bYJa-_w31v3~|TWu**K6qsGI4hiZDJIl#ZDEclik$iq4&nq;#NDP8!k z;|1!X5OhFS#XKoir{=~!anIXQ^qdkO2&CN~w1f0qsOh;G+nBEBXuec)buH$5mnZu? z(4D2(7|UOp29K5||LJ67KC)kw2Hj6y50*Wo$^HUjQF^>v*%-b#{fLq^>063D*-r+) zIX<%Ir@`Ys@W^#vi}|N8Kdw&D6@9&iKEx-1YJvvmbHe?TbvVRD=Z-7tJ?!Uy` zE$IUqXPcWf*<%5+zncc#r47h_jVAk9ezJ>Ua-<=971p|`z5fYx>HI@e_P?aT<0MV? zjRCUXnFig#OcyahwkztZd&58J>sLjZ9Eff8k!kSrJosUKaNVdY^@Bcj^tQ&!-JX8FqdlXy)YnhjH2B%U{2ZsA9@F@s*df)^ z>%@moJ$->W+KKvsjm*b!Z1#5=AD4J_^B3@8w#R>@!9#?3IF2q>YdoCh=|TqR;{G)F zI30YPsLf8-ceou1kZTuB;cWZW^-Lff_GgAr3*dawh4=$7biH!OwRGyf$>4 zcRyNad{lxDI>#Z7cR%p1dEJ_u>gVy@stW9T;JCB{zcXK@?Zg1c-qlBsqtf8}1?F4R zV}@rp96R7KRL>OpDetxgj`PZW===GUXF4SP+x5`PB+?7Lzd9X02YZrVabes4$@?Qy>Lx`qFV;Rw)cfm{=^!^-Z zI3A7vdNlr_@?-x$u5&<()~l+gq28w36{^1QO}n2^{dnl%nGw(5gJ&M3z0~yX z9iL?jxWc1ZheO$q0%!V-80MP+?-U2>eJ1Fr_Amr%aFDYWeEIctmuq?-2)PD8uFc@p z#jO41FU zsnZSMrNHStm}?%WPg=tW)JbdB$#L3fo~DzJ5W@&)qm?2)Tvk#YYx9uxDs3lj2on6SQuT7LuEaKmps`88xQ=012YXM|jB=sWD``$N!u1ALlx`z7X6e*Jz!`rZs$ z+;-^vLqFNyO@r=Im#&J>?jpJvr?8JLq;`b%@oXA&FVN@`&559;kExexdZpMa*~s;p zuDI-b(c2zXkWBxmRO2^Sp8fUZq5XtSe9Fp0SxlGxzC&jSfQBjm^X=isp%+u$y};`<{QNfG z_w#>ugZCi+_czeSGiqM6-m`;)h(~8o8_>RY@df5|C+Y__dgbl`JwG4tP8u|qfTr>- z+IWj}rq0N~bsb_jlxDxcb-pL1tmOXhhV*tW$}02G#r=vFpHtpATBn27)jqU-4_c51 z`wvcxUVqSAcUIXtJ`eAE0=u9}jMbr>8VoQRj*` zl2`cw*Z{AOyr%KA6+F>g>vP0$Y3-Eln)zs+hHmZvALN@wc%-aGTcLeckxYB1ohf!k zvhYoTERi@sS9A9%KKYDd9S6E*EpM+tLd56Sp0122}SqB z#*se(-Jr48Jgv_9qt5D$z3^?@4%okjjI|P0v@GGl;qw&;WPp%f! zX8~6?p8$Ljp7{bX)PB_eqP)5Ey!I`(+y%8bL1M=zOTh|bcSFp_E*y$55S?NH2m3-5 z&UW{w(z=*R3zfz`PK@1f78K(we5*;p-uETw8ye!9UmV1_m#>9sk0#~Ex*+FAIzeY* z;<;2D(#SuJ_JOOsVYj?EcsA|k5$GuD*;>lD4fRd!WRrHD&_!*b&&~D6ZL@&aX(at- zGq4xc>t2=+qbWs|=N;Dhu|vF{ADIpv%7*XMV*mM?)= z4D~xRu!f*)+&Bw=G4#VR6`wX$X|A~|Jzy?=^c9yLx2YpYQy)b4X`Pn7{do!5A#i59 zI!Be6Y|BQw3M}*AC?`WH3 zd)$YZS2r57c>Ml^WMY2NuRI1?)Gq6AJ~Di)(R&c|s9u`*=rAv(UQ*_YfoKEu?Gc z-F(-EN2k1-pI1}3+p4j4(=+rg1m&gJ>w1^Ag3qJ!w0AXVe+cbue;#>ESr1~)d7?Hj zA9T>ZReW$e^yk-aJ(WVYarH4BbbsqpAG;K-6RVH$E|01&@|*k3)aF+&}O6myDEiV34~bey>Y|hpwI;E)3A^sx)Xe@o4(# zw7VutHR2#-`(u4%IWLWJKYG!%(V%aKA8Va#cl%K`)o0g$`W%@?`Ol+#WlzUh7kyXb zV;lHTu}0(EO4{FUwx8@Yc-qc9VQ&3z(Dd^MKVZI>^am+({lM|WjZC+ZXEooY$vh7- z`+X<)u>k%KDE>Ic+Bp8^fxo&jHri`r)}5}@cpL{F>(-O-&Y;>mfp~#BUm7un8-42M zz7#$i*9V;jKFP1H36TAkl)7mg&6Bxq$gg?x8{J=z)8w=uXLGazwQdGJ&i9dPWg0wW zx;&^cSRu&-iI@5!+p(VU3BNT0i9YO=kExGMRVJWZxTDCPdiavU8B+Ulj(L%ridrgV?Ht+Orz}i$0>WAR(7FR_H908Kbl6_XJ}>9`GZ7BG_TvnCIbK@|bU*JRY zpP(7qS;}A=NPU(Bkg`nM(a0S3^PU5g9V2guzx9KmR#2owBy1&;ukE0=-o}=094WQ}Q z7VcGaePhUhHaiA%F#oUhQGgt))1cc_ zqwD9Vx@&b_jku2*|NF>vUK(Y8^nB8v^a+ruAPu^&X>|Q$`lv;+{XF2wl<6Z=SS#CS ztt8Mk9!B|O&%9RhfS0}%^8s%yR6Xm(=2CnV?$@oQl6{5ZW2A*M8`wu&0b03twpsBT z#A*rW#r4Xp=-8CFUN|c@L1aZI1*R8F8JD0L>y_M z=ZX90$qi?`;ebBH=2aQtaq>H?RXfF*iEYJ`5;p2^vz5-z4KDW)J~~g zF+{WPZ}INW+bG-VJ4wBlujtz2WSr<+0=kz>!Z|(BnK!ERq{K|3Tia}>gZ{)?7d=3J z+QR*#&msRID`l?$m6fBF^$yB!yN0m{0-Eo+5JPfCnNSx!ba>Z9pS zXMfw2^5RsUS3i3Z=XW-@tylK9&6Dl;36y;|m5qFLWyib=B`p)1>_c%|1)lWi^L<_~Au4~R_h0H1Fg&PJQdMw@eR&aETX za+~`ll{pmxhaB(1qBU4>7lHG)c-+ZBL+hR-IM3Ls;FE8`KY zg*t$rMjqV2|mb9DBqdUTgEbq-#oU?8xJEsQH9t*t2nT_Cf6Z>0igIu!z@kvXQ^J zyefD<@pcK;u`Y4X{3=yxJ2BGLWf{c~SZ>{B=q#uSu$dJ8;FE3oUK_?)b5W1#Js9vu zdB4bV{X&1#Kk?iH^dG^yLy)IG)1Wpz2=&crHAjHVWHUtbFzo#ho~@?yOsEb#dG1N} z;fi0PWAfV0hu1KzRnm9M+;`h?UJ}OZSSO-7GM^9OdE)yE=#JV6<>7DD9$WXa-}qPY z0^g<2DU{BC3mU@PL!o4Kl6!aj#=?g%FAazt1eS3nmqF|EK5Mu)c=bX1Sk6T~jQ7#I z`kpY>a>@U~-e;39ilHv3&n5d0*&)|gJGgpvQH}jtW}SvPf4qMFvwiZ@J1$Bun(e9f z7S5Jo9Qo6^u{9_thFy`N(Jz^|Uxra`x* zM%Qm#oTt^(M|h8i#`>qD{1p3yOc$q7_NULdant?*@=Q*H=081}ezJVtEIBrycgskY zmOirdO{3fjl*?`EJH%uC>ZffQba#+E0d44UO`a&^G4>^uiFk%wtZXs4PoR@$oBsmc zm%*o5j~`=hccN|m=bG$~1;~CN4Z8ChkbRvdd!e7~kxV(zko_&JaZ|gz3v_?uBm2%Y zcpRt6z9vBSThgF=as#rD*JKa*$sWs;pD9_B_5OQL_F~XI$4B-n(%|vv{-n*14Um0y z8gxGd-5{Gk)->6M_anwq&*tqW@;ux^@hMIA9}uhcYwsP>p!+9{ zuAdKkN|T@7%_AR1=O3Ew_&dzOxE=e%DFXZLYf(PMF*#1L*-O8Q@se8qG4@Blr^?Y| z0V(S+f#oa(U0O4P&kTHbVv{E8RLDwey?2wYH`iZ>dR&v&*h?D7!`ZCsBv~^;&k7R%SeU}|HzTQO~ z$#0E#Fx8>YKAkfaZ@fm_I6HcGU(yG44xl?cMdrrQeO9CE*ACxplJrB{ASboMBZz;S z?T}(2+zuOSm-nLVpnW<|Y2|MA%6-SD-0u(vIni>j(`0@YH2vx*o(A2O8r^R(Cl5M1 z>+dPFQ`U(BZS#@_bhT2`)fnh%7V3!h0MyO5VohXk>~rC{vV*bvt61~KUeUzwK=&3e zmSkmNo`&aW9`YjQZ06j6?$KP+og*}@n&oR<$OVO@xE?Vt~(dGL#6FR3CcMM<@}EHKLxP{ z@Z1D^5UtE;GkIu=d*%ksqv$+iF85x{J58G|R`ta1+$P&o#CylWm~)oVoc~Mk$m8Sd z8nA(>0XEPO?RP*ssJ(odnQW(zA#S7FK!naGbec)pU!&W=IVx=@a-g$z0XD$=aBPBY zfM{AG%hey`Ugy@0(!q5^SF?c;Ds3lzKpwV%DV_~5eTpS8tlNNFPV>5QO0;s85nas& zx~eqdAjm^DfU;6-fM{h#n(H=DMmE6Zp6p`-?_*w=j3ez)aU_Z_A^weT4DPKLkKps~ zFQ7blr$_C{#=KGa0*p7t0-y9(F1@qeybaQuXwvic%bc7-uW>dy75ZTtRo92aSaqEx z)^5a_kl7CY03EQ7xNag8(?Q?X8*NKpH=YPPj6dYQSJw;o(9YHQnG*;P`H6Osh93>Q zPCKca#>vv50a^U`>#Mbs&k)a0d+L4o?V;s6gnVtuclq$&Ud#73@=^bo@1w)Bl^yXq zYjW+UswHBJu#enr%*T)c%m4>&s8zV2DOrJMm=A06kkl+%ENe@o^Qt>hWNb=7f^ zRhCd86&5s8nsl3t?|s(ME!RQHWeI5Z$S;qZ{?gb#*C zCww?MI^m;n(Fp=;i;H6LA)}FZf2NGn`9gHXw^`!*GbDYZB;GXI4sqLxcpF@cah*ut z60sz&e^6Sz`-y&t)+#9`{0-4ufV>Obz7!QWTftbnd;qZP)9Ag0=*+8YseFo+AM|{Q z``sD5%e|J{1^ZsrMzO9(-+{os0r$R8I#TC~ZbNKZJ)?aCAnKI|Q$pJlIm(8@+4y#Z zy%ygp>5u+=m*U6HuJf^3;6LiU!}>?!4|=J>*+s3Omc(2 zc&RJ*uKy=~us-GSaClFWpN&+$_U)WODvdZe%DxHwgu#b;5B_T*uK`STL;i+%B)+}` zE#fr}Uq|v(Agz2e^wAD9uy)igegVz^Mq3Z@{trC&1oF|i=>JKkcv7Z^K#%1+yB0ja z*7$okM}DNVofr&$E{06oJl?POcql~dAJ3MHaC>SWYP?p3c(IFXBOyu7bWRfqMk!ju$JM*VfJ^y;w&@Taqta9_=dDH*HUA8ceT*-d$Z&a-<6R z@NQ5$`1J#Y;k~zqgtbf06G9m}Ulz*ZH1+Qa&TlV?4yAP)rgTIbSJ7EpDxHokYkEFU z)ALuP*Wu9faMzaaQfWK!I`WVXlHa>|Nck7Fu8#F7vM1O|yLd~hLck_q9~HFLLi(b( zKHa<0QnB>%P*~M*IlWIr?}f6Ts9Pt^EW)~J2_-UYTja=7Dc=<2o8sns zgYp4xiF|+Ie6bvvOZiqI-zqoXOOy|=g?#sMKG8vTpnS8CZHFXaRL{nNEu@8W#n z4zeZX!@j?&iEh5fC?DX@kZ%j;vpYzO@?C&@7r6NzpnQN2A>Z|!FVaDNPxxZw!&)Nw z`5h{4C*DTBDCdiIkobO9%DU|DRoYIxihMugd`<^>i13R+Z?Q}7CY81m&m!Lv&KK_> z-zI!1@|C*zeyP%S;tAxN!}-D;<*S6h3i+;b^Q}{9eE%2uF64ZXj`CT;Pe;D#ZoU;N zjq`tz?;Oq-?I@oh{9NRl>*iaa(stqx$Tx}eIUVK0gkOMs3*3B{skEKA1^G_ne6f!5 zPlPW(z5+MjES0tszec`%Q zHj*YG3s6A`%LobzR~W(lrr-z#M;uUyq6C*2=O?2GZlnIj+ZL5kQ4kotLYx2lbC&P@ z-kW>dGCybV|9TmCdcJ3S&U2pgoaa1ey@&jiF_FCHOv7Z^X5VwRSfRgY|{CN(PQOPF}v@nKz5(C z_nr!xPDssBn;uOYAI)18w9!vqlRuH2^gmD+_)Ohw+h7-5!Rfp&4<%h8YKoAyep zy%erJcE&_(b8Mu6q2N!~Jfq)Z3(eac!&_ws25&p2zWn@Pa?$v!$4w^9Wc~JFSuD*i zaG*@%agJWj#4NuZdOrlc+kL#x3%#7FquoSrA)C%)lJW6j#IR}*P5PLvNsyVhtTptbEgsbA=%8#C0zOgnN!b|AAmPYZ^2O+}7RL)RcD!gDxlRJk<|w@^tZY6sAxw%vCu8=w!` zb92%`zkCdRQAwIgTh^~x6KZ$~)csXqvBY+dq`#*h84a#p%FT}gfTo_aFBt@+=n&%o5wkA>IiRoNal7(c)N z*kPJNp6eqDN6s!r|UY+c2__GkI| z{ZIHYat-S{SCNlCSGczN+dZUH+*OuGu5TYv%bbe&mkBpK0f#U5Ta+tYsuy~2HuH%g zLq}#>YL4hQ4>>sxT?8FJ5gmL_QoAS*c3dG1-!4JJoc*DJHS;_g22M&HA{rJ!!y-$= zkZ9oh_g{82grjNLUV?^0_J@XX1vCWHQ@>T23!q_vrQt5)Ph`L2X_z;fhWC}A;kT04 zeYM5G1vCsyPkmcuvTnnEm1&DBj6ae6tfwI{nug6KX!!R2(7;<F=7Oc6nOb9)Y-;l=Hq&RMB%3x`{G5zZ@&pZ+g8!Bwb-`^8(8^RfJ~ z;2P<`Pf-@(W-NdnUx$cKek>r3;ZtH(>VB2y$0W*MXZ(rm2VD8Z#)5_tG`wSfXz*i! zr-9$leZR_dYYw9MY~xR4J3I|V#)1VUXn6Df(BQ`cOT&Xf`qWgr%JgF*G#qLCiR?;G zLy@uIh!Qj$zdtnivB1-in4Ma#GX0nc4KM#m{zP`Rr=iGL@ZxKvDIyQAs^9EO9(=#? zG-PI{W{L(sCPKqAqJi;oyr-eaSnyN{8h)}rH2AT=)6jHU>Oj%p$3$rOC(*$8_}mb# z`d5*$;BzHtz%bo6AN*M0X$VeF{X%8>F%cS4#?Sj-o`xc0!3RswaM%9O;Ku?_!@%jO zZ>UT^CPG8E@h7tX;AudHcHC+0)_}Q#*F9!@C!9Y1U=W;J85ZgNW4&h;*bq9Fl z?}k3*-PhQ1af$j-PDvgcedp_xIU{we%JyR{bvn=Z6WPmrozM@m-_yQ6_;;W$Wt&HJ z^g6`q(FcR3IjOC}D9vg>Ufk67gExR0^x1YbvJi^eWbe`0Q`QF#5>NScYp zpU75-e$t8d9h%QbPF-E#kD1e$v21_)BJ?_HPdmnY{ihNIxl^w#@ z@4B)Nplr>za`PZ}Mn*W8J89k_US#ZiiuK4`Sc0%0jF>VEol2WKQxjVYVIH{?xz*Z< zuana1{oKqm1@_?F#L%`^^KojeZyIw|UoY~WE1ClAofhg+&RJi@=`4`ubRQzW&NP^^ zMz5*Tm!iG&2V-lhe9ue$yZ925zrQnn*8kzH)f<}hEgC3yRGAsd1kbM?@n!n^(oP;!CiaztN1;21Mzdw;~6Z;aX_Fm@#E9Xs3e;Iv7LM(xpQeMC3|e*bF=_|B0Y^r#`A^?Q*R+GcD9Ey7N!~qqfW6h7N%+mJ2oDcI4iY+ zF!h6omh@SvYQn_RC@eTTl^|?lJgn*L)Om!(&h|jx*{QP$lN_0T<<|ShyRh6o$6xMj zPmkIVJL)fawr96+ZbI*DvU-hm)xxtq50+&Xq4!3g?HReAy^O;G%`faaR6_ev=z_!4 zPs;1Lr#xG0{~_!CW^V(zgwN)zg!o2&v##v%z{eMY{lFnz>GSTs%J!p|G{<4>Y=_q9 z&`ZBT5379j8Oi))*3G4(e&NEK$^*{v*|?XG&77{v*9GWlz0p3TKJ^Xqa))%t>n7GH zXS44&`>TXoeUjg|eSM(U^to%tn>Dis1Kxpnm*{ZgZ5rO5V*H708||SpNENI*mX)V_ zOg{?GO}+X>(o;Xx0sVjGwRZiDzH@GBlk!r3$*|gKvhgRfNpOYu)&FJ$Uwrym@@n3- z0RZ>Yq<#9$q@f<$J*}(@X8pIJdu;IesI1|0Q|4@sbQb(jS>|jH--}#XdPm0Rmn`^i z;R=GfXj~4$#i?^er?cPE;QEEu92iSZ2G<1Pkq+SvhPg`T#vrBpsnXG=$C6GojA}c^ z)uOuU!3#_4D&A*U0=_(5HE>=^{K?Z*!TG6k2+Pw|P3NZ;5SFK_cvoN!VR^bLd~@nl z!t!+0z?)O5Z=SBoyg4V*?`_g7_F;z`}_J%N9@E7*)=^FdKOvvh0z`K>stC3 zx^9`-x|7!tAriueYps;onJq;X#g{3I@tj z_r~N{G&UH2BD-1jqVHl09ieskkhoJc{s<@Kp+8ra1shJ>F&)3#Hwf@g8`pH=4$(9^wDF z$4B_opzJrYe|_EyH+RD(H8Ee`nI-5EC#QDMSwdc!Dxmo4?l=6RS%U@*ttpB<44_AG_8yq~w zoTX8ow-F~f5bhv-Kuk*|-B-f%MZ-k5Qzsjn@# zFEjms{gc04V^hQQH_dM&n&Pqq<6V88P@lkWY%TFMaZu`H;hqWZnHKj`!p--y4)=W5Hb%~956(6l z-VA~(Y9H<_9U(lYf#)=f=c~fQ_tOqf2p;yFxx16dUKj+w`L&}(vL4|X9+wJ)XD)c= zT09R358uNM&!M7+I!NxKdSu3@{-AUV$hV-v$j2v*zaslj##BcV|eV`+>a0 zf{tN4-i6KnEOy{87>i}sF>VY=FAhpKFt$nF6MXxzjyhbbvrbAojW&>e;oF>nnnvB8 zWlY>fK5TW{KhhIY8R~x^^o*kpqvE+UqWC=zQ4d_hKes+9`roPgp!45DerqrJF|eR6 zjDNeR$Fu0(U$Bl4ugkOppcnp2KMbob(B|7ib<3*@^9}WZX0;P}l=fN9sc^<=d#=x0 zn!g9lvXx7wOCN0N_Ajn(H=4T8m#L5HX7(HSUN)+3pU<5cFMNybLdL`M7~2@L{dgbf z&8y$@n@+zU&{?AIrF$7u`SxRa!j0(%xiMXFeq0aSxPE{e*A0$RV|$myyKRw`!E{$5 z`+upE_*I5Xq%X|L#J2NX`zH>u`Y{-OGj)D*_~7vQ!GifcuIMVD_4KA~M zd7kysG~Z=bhL5-n9$Q^|NJ?ei3_sJCLd&HZPl6Z!U&=m7Wv`^{mA35fsBFG>QU>%M zaT#R~QeUHwgF{nCDg7qWZ?gLMYf8`e50yR~csktzT{<_bc4)NUCEp$+UCFn{grihD ztf&2nH#XM#M0S(-fqxtPKsU@z6IL#n`hVojPgS>C>RM}gbEEMmvLAE2nGJ6qzY)2c zT%H@dn+{E>{I8Kla*<}N%##b^Oj{0+?mY04E-njSRT=e^S#QgHr}5MOU74~$(l=t; zQ%}<-1BazPuQcn(v(C23+l`;~fAT18WUCc@SM0lP?04^aO{ITIH^%gdDJOGS>Q390Geo8qS|Bm2IE9uTM*$2n@dQRfK+C=uB|A{oX?^PaX^=HoK8-F6Z6dWNq z$v;Kog7BI1ap<4V^4`*DyxiLW--8Zsx9}hrJK!&Jn>^n56WMtV?|9(_r|L46yB6Hn z+P+iz4LXH~#UsuR`Zuv2*f0Ha_kx@bvOGE>wT5!jchVMjCd@hDKeH~K=KE0SP?|FC z<;h0>D0HW9r+?gT`|vb)b~oXX-e{VflH6RWbhzgT?-k&^!q)Fu;pO{J#EWnJk_+Bi z{5)@gi&qtrJ8&z1gmYk$!P(+)P8ZIrzComw`Oo_ej-tv5q6 z-zEDraV7h-aFpuPH(I=RL$hoH#@45i-Rxtc^;5)sDv?cpEXZn2V^H7JRq`=Nni)<$ ze4WqBtMlQe&ZoFK|5A0lhB{wk>#Y5WG~fT=>O5V1gw8@bOnX7c;KwMN@8~d}?W6sPG~c&~4(fOW?jUtg`mq6bBB+bT73l)C_w(!} z?Y-ZA-}T%3O3SLo6wV=RyD-S!eO{2gXHkK?HXWJL{!aQcr2CAebB*yQvKydJv>ADY zrr&*@bazwVyJPZ7__j*d&n2(R64@t}4)+$}iShXy<4~3a&>S&MSn&@l<_$y79CA=WsG$S$Vw>dA-odtJ;X~lJZJiNqH5HQu0b47v8&} zIg(fU`6OsbKSJCiiER3zAp3Y@+0a{6*M}0j%YNMaj`SkdIdDVPO2UcHJzW-T`eZP! zne~w?PfX7&8yak^7)sBycPE;#!3O!J9WVioN}UVtgx0CudjBCRi}*BU45~c%Y5D|o zH1S)3ksg4?%k%h3pMbB;j<3_iNBZ^P&9+bc+n?n}Hxe)1QX%>m*>(@mD}xVF7XAyd z=WiB`_zjKWQK>_P>sD~xN*eNhNx1m_4!DjJ9(b0%pLn_C3+YF)FNBM8ZVmc&;onxe z^!;(v+;^ow+bX!?8OPh{^?{o&1A+(CG! zI*jGMj_Hf^!NE$>!zXOqee}g2**WN#3As7wRK}v?^2gCk<@l8B>G!&}iH(!Dm1T}H zRBczeKwJ@C^7e*DM*DnqWSlH4EagJGN(z=KLP% zBwqu_gTjA7__KuXV(fNf|7~T#F{V!c;_7sx>cm`k2Xj`{X@T)qWS4;}#D6ffyE!59 zer)P0#h*v|^D0cc%{2as?0KYDe)}fs1hZy2#iH z?x>c1HuP`%zEH*Q<&Aw*{iuR^rKj^Y?DQ(bm*=zcS7pl_U%mui2EWd`wUob;dY_~> zBC##act^PAW`?HlctewL_CS-|*}~2H&U*h=Jo}+=^Zje$#q+ztt-L{SLTakgy7z_C z#OWNJ-WQg97(3v9>0RML-Xu2l;a-*A6utqvRNo!w8pGQR;neL+SH~Ac=V{dOG+W0{ z7=Kmv^RABXq>i74clUrRYQJ!*Yrg}w&m^7N@3ZmtL&s{}Fn^Hu&c zDrYX`&b8%UWBgUw+g-V=ZRfSy!@MO|wB6ES)NW&4ogNde1>jy_ac?&Ms_fMc_gUcH zhAiscW7B>E(^8*P8uxax+Hbw_S7p1%vyJ*2-i0TbdKIpx#^vk%rRYqY6w&#U&rudU z_>jtQ?;uOQE--%H|8{h0f5_0s+3*_`=iWdTeG81gD!Yud%DZ=ahjpCmPjc%xU$pC# zMRcqwE1aI{0Cxu4hr1v~cN}Bf1$qxf{fJf8MXa=Avdpyw5WwQ)|Zm_hcrU z@&7%=#((Bk=ImLf(eCYN{O8WC=?iB3r;NPuAHUL?bFtWB=FF?yT016ctkJl-jd4}q zF8tdj-O-W%X6`FxcTxYH*r2kzf1|pd7Jx6ox}L?6fG^L2cNcgf-Xvxi-qbqY9421O zgf}xSZ@&B|`MLi~d`SD6`zPSYfHTy-Jbc4e=){D$4b&`Y>}-ImBkrn@qeK! z%bepxpYK>;%Sx*(z8`jFX`Z|j+?wB6nV6aSmC`T{>_BcMf43Vy_kYPF`P+Tf|FPrv z^fik9-> znUU@pN4#{;A*$;{Cv(9pb5Vh`ougY#EulPEHy6#|YG($NW zA3n<4d(tz_;MAJwvy2bB9PaYWEL%2s|I^_g6uybzpJ?%~HvXz?v%_zA3H{O7+;nQ{ z4y8GaJcm^oUM7scD%(IF%S-jw(2mWO(;|MB+Osp`OD*r#*SdG>84vYcat)8Tl52Rv zQOa(gYVmGEE@aE3r&eWu3+>{U>@l|&hHZ4J*$cZ19;K1HOGuNZzJt_P^&4yay#Mcb zw30Tkzd&{;KRt#7i!;k2^RWyMZz!7gL;ETuVLEgv(~ThqCWR7Hs*a zS^Z9ZH@Gs6RT)Q9#?iKne^wcM|HPFc*${n$t`0%^^wc5Ba~ye&v$8RyJbeEfdBnR& z&m)ueH$kTT|3XeSP_I&Qa;W3icT`vU(xB^0?=t?X><1mc-Uh$Sx+VO&j4Tbgob8-G>y0`h2n;APFE59X$N6d#kd6OF$rJD>D>m9;U4M>;94 z<1HO?Q*Q%LW@S724aE{xtCe^HNp9HyQksmoOF%BwzS1`IltJI^G;ZU6ogQ-Ru$LYAp2gud@pF z<1F20rsfFm(cnGW;{A#6^8GvLQ8~FiU-UD2%Kn~&y|1%B^Cp#J)`S)%vh8Z;bwM`0 z&e~3cS_>fD@?d^yBDAEjfwZQjws-_uwC4S7M@u7h476uZ4~}}$XwLwfK;I?TYlthk zULzc(^!`fL!H73~Z)GC;R?&`s8??jI+1m4Xg)sW#iy8-_dT?g+-$gez;^2k09)D;2 ziR?#&V}ZeWg!Tc&U+oFR!(^iyo^j4pWjv-b=tpVs3cumiz=G7UaAL1&%|X2CF#be# zfb_zvdA;xk>`w-qr3r#>J)JrHxj&foqhp#+GP(Ix9FKRLrZ#L>I0N{4s`FB=;|4qmAZ*A zf2PgW{jAjWg!waVCMOF*=8qb?JJGGTCf2PfradxVYFxo6u#-dagVaLY9nii$r zNti#=X7Ua%O0^L-DV{DoC)GrlKhtLEJ14cCFn^}a(sxekV#2f^i#^Wye*50WsV?k) z;{5H0Xt%%gnYI(4cW-CfRM)bA-={*3M!&6R&()jy7o6)iJPOV;Z{(S8&Nt?C<9Vqs zp}UOEJ=)6XM&sxGAL_Wj_}HJmZ5nIN(>V763^8}%EiI>i)90lIg%i7d$7EZ^YU592 zANcQClwJb+k=y$41VkE>;~_8`a!Qvh_=y{ouQrbRqs4`XmbV4qrBV zG86r`>ZJ9{9o(-lvXy>w%A8-;S^##9@;@zne4nXui|}HurDw0a5dF=h6EA*szu}#w zzv+V11kvwgOZ0zHaRp(y@jL&HM3Z^n(Yy(i-J$c_W79oq<9K+$olnNUryrp{vO5PDgDej(O#MJ~ zI5|_Dt~Gw<=A;!*Cqqjd*VJ?Jar6G+P?OdXhdDQ`KY5a-ozky4*bNaD_%${xK z?3 zy{V7*l;6e)jWzULm03=DwdLu)&aVAwbDev?EkHMt&Yby?EdQgynHXB=)2pq*F)4E< zFxKv4L=(DZ1L?%0X#H+rOv>;t)~(P-JPc)|=g42kOT~S+Ade{r z9q`Ov%K2JBo`CUAxc+%B{s%-fx|y*ZOf7&^h<$zosRpwv$Z^LD36*K|U)HFyVHb)<5Eu& z=Iu@sHZU&rFNAr!(}ZQlrM^a(w>wQ(Vtnc=gn7Hugr&!)9wn^M?!4KB<=W{lcbDSj z`;dV}*#3IUnRV~K#GB67K<_^7&fy6q?9QCrieEcNu21d&B&WaS{c!(%9`=L60_|f; zmieA~4C@zra&L>}_~phSjTPL@&{{9+)W#ZQ1@}~KGAHLXyuTc1vCr0TP;!p6#$}!M#ZDJr90LnYcetg|L z;EX4AU*mYttUAYRyF-kh{eR-c10&DWTm0qT#~pfqJ9D9Q%;@^7?|U9xSHXA(XgoMu zbyV9H@Z{AOEl(z@?m-aoyN00fD>{4#Xdu>LJ`CjF}d5<__&+raS z<@*+$^_8q2%o>9|r)<8T^l9{-BlMdzd>`z?k@d9dsJz&q!+gt*4VJTR1D}F~o)LHh92)uK@{jf|$jH_Q0h|52UP-te?Zzk%w$pY-37EiX@e zAMC@CttKxwd`Gf~JY{0C70F_OYz53av}eVfZ%A?_-6c7jh+Kq);mF$oglk;QOOM=* zyfAX7*2VI|k-seA=Dt82KXUjI;moJ<(<6`16E0c&i|7K*mP!{)5N~l$5U*qNfPa-u zh%R_P@gZ$dpbJWj2|4@Dx6vD+3$CqU+yK4?zoZMUU5y|3Dt_sLYcIkNd4Iz9@dN*e-|2!6<#fSAc8~w{>f(XPhX30?WBLCT@w)}tZ?XNg z-S{~dn8T@>9c07-}Tpj1LrQS!+X6yFvaxOTL~AAotxO> zB|h^K=Ne7F9mBne^6lDJSKqt+CGgUZcVG2y?(Al)-!j%|Y-4R>d(?M17y1Fw8|%C0 z8b9mfs-Nqx!+tEFA4h$Z{@N7lyHOvdzXq|s8}(88ZaUU?qw%7k?`9YmWcOZ&9Fzf~ zIZ69T?_Gy1lmQA`O_*flI^>}YP}p+94p$g5Q3fcik}&P-T!&ng0Sdc-F!hV;kc~1x zVdoO|7wet|Rcs=0xPrF2XR=arq^BwV-c1gs> z>u6l2UBXzqtnz6J+9gf9XpJUV#<{KETRsOX*`MOujLWqH$#3#4n>nbb5A!Wu7_5_& ztsj3oWqNV{>%+^9pF4Guzc;WCYuq$rFEVpF?JnL$VaU!*!qkVOFl6W? z!qkVOFl6Zj!qkVOFl6c&!pzv_%Rsg!6E?aJyRl6+pX~i=*0@PmhFzd`XMQxKu%igm z`!^;WeW39C^$a(MD`q<)OX%Oo#yc3lmoqcJi`jp9^E=LFda&-u~UOhACXG38`!m=+8G8@$GS)sCRE~JPV?jaQjLYk6#0+`A;qn%pTNT=gO~>0e zonvxp-gIW%YE=D^Q^R}NRBqlC@`k#RAKK^RzuWg*%AB8K?2PPreaG#2JFfC})CopE z4}F?)DPMOf;(XU#3i171$9LHhIy+@}29B|o_p$X;H_nRZ?ktz#DP@Nfkp=OW?^Or8 zZ}f7;|9&IixA-*Z=(NUKrRV!ey^F7Jbaaz+y8AxZhkG5ZaLuWZyBcT>mhuh?{4)Gx z-@wQ?VQ(ial5r>d7byLTf#k)7=?S~2NP5j}f;9ul6@}>ut1gmWG8-g0w^^8;uyc!~ zmmMB#7)Z`9Oi$PuMbewGXCr;1Fg;<@iliT{9}4V1-p$yh^_=~Yqk$8R9L;ocv{-Tz zvju<2x#A3V;b(|fzj`Zm%ka*Hkx%Iiy?Np0g+^ycSJS3OXYlRgqB*0N-}F>d?s!-3 z@hTU4atHPyx*+*2mCN`0T)F2{?oRNT^1!j!>kjNs(jSreGIG1C+}M@Imekr2=~hUO zJOVG!D}GLSGB|hPcQ)!%Wtq^7X}`ROG3{~2Fr$O~ys{ko6n#TIWuHEZjm6sqMpnJ9 z(b{Dk|G|a$o2D83-x2;Vm%y*Ofj{l=7qx$-kC^lCLifeyuTKTMt^K6<71K*s8bAGC z`~|oAZiX{d{@e6Rg{vR?IV<0$Un-ow8_jF^Ugh&@{_5>3zHgBZPKsLC{ zYsNd%hoO0tPNYAtdw%53h5JfJKVD5bog2~kSrQ-pw~}<|+`Xq$za^a?w@c!qzs@C{ zAGb@Uqo2+o-ROSlbgIT%bQR;*QvqkZn+w|N5Z6|ckL#9T&jT7$tHGH+-?n=l*AgE9 zrxKrgzpzMI1JhGW3(ER~&L1OZ52>t5$^ul@>{4YB9{`8O%1UUDjX9(}7v=8QOZMEl zu*NV`*YITfrn9pL67*~HrZeNx?Ub+Ihwx{_JkB>0uJ1CQ3JF$vk;Wa`?#ydJHjk2rDCnv6+I(eGj z^`}n>bN&J^HoQ;_=f@%^Hcz zUsj&OOWmV9W zc%g6Uvk&}nq(SpD^%2=Oa-(bGEB7XnlT~L&8`%kFq~5JQ;bb(8jGk)ziR`bD zGxHlJtknk^W99~StT~N!O4{7m_!>u$OVj?;>x;@8qdg7n=xVcWA-U4;ER~WQep@W} zdlF7=o*@5@yRnI}f%nL^p6g_Xz9CuSH?)T`rxk=9Oqk0*h+QW6se>;bkNT9MS^S3P zcf@5*G9g`0Ig%aq!MMzgxpLa0Do=4bZ&OU}#)u~9jhFEs1#OyeHe$RCFMpj(#f=kw=*z;r)(o$a$7dQy%N^VzPF7t zi?5bv)2}YcqGw*LpgziP((tZ-x|jR^q#49D@}4*)^@Przf44k4_}wMO*4kqHOR{s2 z_YnF2IpqvG96{45sV^x0kEH+O5^xM8n~i@-_9W5=A!k!xqWqV@rL(EOx8G^jA0BVy zJn3O8?-QNDYy6%Qx_cVG!8F)Kox5b`m2FS+ZQ=<}Um6%Z>3Z_6Q{EM$^I{_o8XJ+k zd`Ee)Sq%-P&bI!hJi84VwWpB&&64ch;+v=WSB~bDlv}HEYx2rH5893kj$`a8-+rv< zBwxCcw9Axsd0yIciGNe@CX@CUm$u}2+g+5)p0OVT-vdp0@4FuUi^f3jv)#fSM&`6@ zT-cGMK_*^YPFPJm-GJSjit?SzT|mvrkgJy@SKvEPb$g6WJ^Fx>jMxz(tBz+@;{sJ%*{G)ARbL zj@ReGzYE2`WqJHN3!WVr9BKGB#q)XrX%{K&(!8{bh(9_w+N3>dU%dWNto?tqBs*Qa zpx&x0=OAttf4(}1eJ);!AG~#D^w*eUwx>z|IpX5-GgX&%9Hrg0 zBs-3@+z-$=`BWLd5utRil1_HPAmicVbIXPvza6>0erziJ&{*yw*|&tYk(WFVmW4LY z<=~NBj(yay4Y@IKO*4%i2*)P4I~#m<+6xujnJs(t2Ws276+_!@XHG%di;yd0m-CyV zCzTmm9xUSym1y~KoEF}(c>Fl-%C|sEZxLGf?FQwkFGkA%ce3as5iL(u{Hg4zvOoQk zXqgHv$8irITHe7}AX=KHpnEM}s3UiY!21P9O9lEpV9ZS)4Ly?qemim7g0ZQ=O6aN| z%iW4{e$TXkPYH|TbkW9KCXY`8r{>e<_;j;qI~v+1R}9_F?=gzL(-~()U-~f4F?e2u zvkiS8aP%Q3mOlMPuju4=aR(wlYqELO|32AAdO3RDV%G2;^`SdtGp@XIj zj)9($gl$77PXTks4W36$ryF{z96ge4!<$!wp~tU6zWI&w^sX_Z<(vCZs)zcY=#g!m zel;<4H}$4(%{FqLIUTxq?=L-aCkOkd3=+TXDl6N%Pb=PJH1@@G{A}<^?`&giq`hXV zjBi@nUM%~;NQ35evKh7SCU;-9q{i6iDPQejbTj=|GA94s;FcaRw5GX7#CZEOX+y@F ziQrdwkeHL&sk;WxFqS@J$I=fP|B`Gibiu3Sr_k5t&B($#2ffwz*}MG5xOrD@P58Qr zcCTEvoamD~t?7p3;Byc3l(7bE{FnWGaxnXqp0csl|HP+0maI7Xp&nyDlKzPgzCT%U z;I^JJY)8@T_ZVNQ|KfeGtS`IokCPc|XEMi|9%Of7E3*ca#m?29V0N<3f8tKzcL(Gi z$-G1EQOs+u9?QI?7JG*GA$O2oeEXy9%7U=q_{4|w8;^f1FA>LYHI|I~_+}IL$2+N8 z0p967Ib~#g1?{qh4Q2R_vpGY7#c30ydn)<&7$jOOBXaw z9R9x_Nv0P)+Qa(P#5-o+G5L=2Bmej4y1qcZZp_J7=9O!c1E2fq8zW!W6v)^0Ir&O_ z^R8s(g?rx^`MRn=zOISM*Vk@J1_yrOjghY_3gqjmoP34p4<(21ef*7)uigUrx*{iE z!Ev`IgL$8QW8|x=K)!l&@|AhzlgWY2pMPWI>(T=G>dML2@cZsK;tkPVn+jy>(wuA! z|M8>Afzv+!#>iGnfoyHc$yVZI?uqogL9*3YAX_at*=m~481&HNZ;WiMFOaRqm~35k zQ!@PS!+E+ZZ@gNcYx8g{cM<>}J&I-U)R z-lsmE45xhA^0yehZrl~U!PZYDoBsS*X?mTm61~HZeIyy4e~;Cn#prcyEP99k%pT0f zz3|uBB%(L-;I+y0N55K{UZ=-JZ~7D0B@_4GTbf=c|Drb?ej?d){ufHq>+Chr8(eco zGV=-7SBlAl8{%LSoj9$;8Oxme!t} z>{8x}jH^F+XxmRF!{0q<<>2C++)~zxOiX4IC*P7xKlE8k_N4$<4rSV4=jf_f9Le)JKY>_%vrP1bF;y~x4JvKl4atEXXR9uCbD=Q{W~WIDuBabeOWN?D zJCaQwa`HIG%}?U=I$lx6#HMp@PBz{DfaPg1dR==`#>B*jK9U^R;q0tp^g5XvByIZE zPjUzGam(9c^t$<{q4!HSCkGyU(6)audR^ZYy_tW#H5t6(?1Wl!OuRP9QdZw zN5$xMGAMcnHZYzxx$(3Zy{?}adKY4=JmJREV)VMcEP4}9(WidB7kO~{M)anaelnT( z%p+EAi_z<3QuH>h`)D%r)=!t_uj@C4-ky&phr8W)>gi=2CSZL=G-^%8tOw!xHJgAn z8|5`|S{owHuj2%)!FCJ9n4t zmGu>@BPFsg)!R43cKhG_(b)mkmv$b;dJ^$kXUZJLyn*&~X7=X;!nMb(eTT1+M`>Ag8-kX@O};5E9br4jKkc=*KU2oue>_h4`JD)h z?-I(Tap81iFjof(>Yv3j=xKCznJf7CI)p>{v)W6= zA3Xamlg@w8h%W@RYXtFtl(NI2*MW8lq|uMLODKHd{et>joHWuZ7!J=&yancnVaVM#&`K^ z%b$tIM?5ugb$f}sq9;s&)K0?#-WdD?<_K z@3{2~&fId``ZKpwCzG|w#o>(JxM zz#dwFt_x-XX8@du4i*9WtL*CUXbn5N`oiv>_RhYrZ*yDN(zT_#qphzkZ0qUi>It{B z_4YPzY75&tO>Ae|l`iod3Ys1Lg_pE zZnnsamAj?6JM8PClr3F7Tjzw8&7GE-u9mj8R{WdWS}qNjw)bqgqPeF{MVh~LZLQ&& zuFJ#u=Z0r4TD)NX;xiY9mDLU5{CV@)iizXzZtm?3H#GOQw}gFA)f;wg442j|s|cGr zTf+_gz56UOoaIXosYq{oSLfn+SI+3T^3)JwX7o-lB;~5Nzh4uoU~x+y46dmQD_UE7 z7LOkvg80f@#OjL5cudEY6DCBYT1<0hY;Nxj`Co0;9Em`~l5nGIv2a#TTXSnTqxJN#?aFQ{3@I~OPxb96L22*YWLjh~ zf#ZEZRa-~%)^Jt*k}%n}slB(atw+(pnTuDq_ikzKYuP+4T-DXpJquim!*xAfh^v@) zdT5F>e3Tr_f1T+Uyw3CsUuXL9_5Cd^bf}H}9UWVZK&ojZj-x9KpTfR&x*rwyY+2IZ zYxwZ`xBy>^m5cPp%Mia>+b(bG=<24!&bxB{!g*(&IZvTMutx3M-QCgN(!8OgEeLvS zaL~T7rK@ve`=+q1Z}YtH>Tpv}TerSJaCI0qUvX(T^D3uWPM#mWd#1}4aHik<(T|K9 z;qf?Tws*Gmg)<$-GcFHjo;iQfoO%3r=1kI*!aT?0oj2bgo?+1k^?hC4P8BTf8E^eD?d?;YNDwnUSRDE4y6!sI zZj&e6($(5VlTSeZs@3|@`I|!2j7I~Xn)?v3u(zeTGc;qZjmis8u3e+CRxv)jrfOBS z{ETmZ8>hW-V)^0hgEw}ZUaKKomO{9`xo1=VmbT8m-nUPv>+0=or$2{L7+-CRCyYPi z^3%gJ&TzwB82eisM&pc&C2_YBcX##lh3D(v3w-*;VMAq|%!w`iohXhzhR)C=yP~~s zbJ)_+4i$4k5Nr~H&Mu_0A7XNUi^KJ+x1vls7rcG_vaY_q%@`E(-%gHPl2KpF+B(~M z80_h$Yr4YK7Nz8VPFR0wdv|Zx>c`!_t=$+qvM(?Kpkkw`#^&bUw%*O{8>!6Y%^m%1 z7lcsZ3x9jq)!BiSLO1LUyOlIFX-$5HxHHZ$3N)Xn#prggRpW$2Lu8DGe&OivZf#~f zi~lVS*V@3nATSn9duMxJdviywmc4C#{oRJXcHwT{)Y;Y3c81g1rU>d+-HwWR`}!6A zotw}{{W)&uzV^lU8iSbDHp9Wj_6`^hQ@5zlEzKIh!}G0cW+k5)@VN|cNPkXUWTH3n%Lc<9|d7miP zuyH>BL^2&p94xye1z`gT_P1=<(JQ3AAhg9sO-#R1Q8si=Sk+}Ls($3F8T+bFCRPiU zjjX2)TUDdJo-R*&hzYv9t)tsi%bDBibTV);$>Y7dxBXqx|E98_YH99nZfWn^s&Ro7tiXzcZW)LL2F4wmr#DqVchCg*qSVQIe znK*7Rlg*yyPG+5FhG!5N*k+j1cV(X~Cr8&N=xW}8Hg0B2p(h$;8n$l?UCT)mA@58f z(DLirJ37L?9(quJPY*&wgLJe~q4rJ`RC8-Iy$qHr*V3;3&elltu9hUVb;|zrQX1HF zn*0<=+uEK>dq%hI5q6vmf_yFDMo+pR_m9n=(FTQ$K}Lek# z&{%j4#jjbrdP#NC(WmkwJPp#Kdg@&)T=JpthGfmMWi(fWzeKoCUr|+M$d~jWT55pG>Q$>o<==?lY6`d9;5 zVjX#ozIX!`#w)*-rN&j&OKmUoa^__w7vuGc;b$(`$))96EZBt?;g3sX@vW||s9&3` zuF5q;K{yr9wTb0ljP9k$+SRt-x$-J18`dH!Irh15SI+9{H4QG(%0ty#)>N#nsccME ztXbyur}Rj&mUmUmpQR`6UsYSV5+y2yM+zIis-nK3v2s<7@YmESBl>zx#gbK0UTYec z)hw$p*u0$4sU=UVm((=m^{cvy1}W~wnp!mdnucVp>H8L+=<@OFYLiB4Jw6}4s#dzD zstWB?Z~L09XI^~eTPkxMF+YA?MGY#9{Lr6Qp27`R^TStH)UUJ^vwZO7#KYrwsBfc< z%TFH8m`jbV%mEJcZ18MELyr!}B*jv2GkAT&$uBq3U>6D7;dZJJA+_0DU z68T-9Etx-xFOi>7VL5d#nLmoJOV%!9$Z6CfyV4_DP;7mMzqRXVnH+!VgEbe!N6**X zSlLj$+Vl;@EQP15>vF7g{_2bALN>l)ZG(CNiK=Sq)s+lFf->3oVVt5Bi)@S3W*jy`;95UTyo~syzEe(&_rQ6LrhS zV&USJ!fV!`F}(OvuG+m=c+NJ{fG0DozIJW0GUDf`ctf!5murZ$O5NLBwwz+&qU)ly z6_FkhJ#oL{nU}JLy|&JbWKLo|f0TZ2@yc&3m^G-=b-qC?J;lP6zOL4rPPRU_=8bEs z>QEcTl(YGZg)4u4xaMKS(%bNY^j1BLP9KGjN-s3U(z|e_ufn{IQ}5Fk3olG>&^Y|@ z^gcWS>(no0-o$SzP@fQnM`nrlFLv8gcKYQ@}DHg8u3>itI;-i_5#a}F3=_SXtYZ=p` ziIPoUEL`a;jq$KFS$)yk>NS;28yx?Oh3C@OEw89|-9In==B8k2OZIkD6C8ib>(;g)4o{niY(w#8s?WV;jh~&**TazqlG5 zU$?xrK~qWdXVVu8kJ2ZrmsTfXpJ9njzhrHaj+Sc$@m1+dg%{}Q#xv)+>9OPQ-r|MV z+aqy1$MDhFDTU#ZXG4ougO0vp;lg9-j$6L*`s9b3a@S(YV0-393fJC6!j&FVu3%uX z>5GLcz36m}8riFB>#Afe#Z4wZ>5b$X`>MJ|D+B6qt68k@(@@pl%$J?T7~{t>u-3bF zP`TbOzUwMMzs6M&$v8V$1^YZBBF7EeK`||56E1UpZKF0kjPyR-; z8{Ej;y`DL>#pd%@R@FmOjag4I@)h$d|I(UOGJi3>SiGoBlG&D1DqQl5;j*-5*;?91 z&0_mWsqiH%G!(Y4=qMIWn>x(Z8rob%mNs5ov8u*Mghp$d#Ly}Ft?cK|4{iH9O$mM0 zu0$VHRWGeryUHx)NDgZ18!xU&YF?+JY(3)qUsVh7K2H?k>Z^IysI{6L9{MSKwSFsK zHE6bqIxl}}lenMykpr4nE06wcI}{67y^S8r%V5(N3y;!QtXfvfTGet>Ml5|nxY8RX zO#iZLah4v1dv?Uv!&JXw;Yx4nY1F4JFYY(x#LV#cJTPva`*5XSx{ATUSbY{>+^=}` zYbU#IZONu96)w50tEsET9FFW@;VBkw>Zu83UIr@vZ z-q>+U6kk6r5pM9UWqQa2bxBO0ijQ?g!j;~wHEOAV@z1u0(iaO?dcU@q%V7CYEL`cW z9Oc@%{w-@NmnUo2)V$T#$mTB=uKdd@l2ygl*IDRdCdQ&hv~cd5*2;B!T}1VX`>h=M zkUafabe&0bI5nz1THVMJS+(mI>YrwJG;gLyQ5I$<5zDRuD!hAvfMlCQG#9P}yws?F}Xy`Wb?(OIOPvp3|<| zi2vG;ih>L1F&&=XzdV;dkB%bodF`1~7!E;!JQs-{oxf&HRkhy-FP49A@sfFlkqALy ze$yu~>DHRnPj633%*^sE4N+H7xw6_X%NNS4q2H`f@1=hE@p<*L1E$rh@nn>f$LGDI z%fqLIiM`<|67Te`mw;$(+g50lJS>$#UKa^OO#bs0dJFPJ@>)WUio{0*MRCTWG}gIq zr^t@X32@X7;>*6`qcTi8F0DyC|&%MQaWX6cC z*Pyp#Em&*b>egwZc#PIn#S=wzL}}dyCFD{vz>t z`Ri0;S&9YxjfF?JY{r5G!B~G$ye2I4?Ujz-QC>4Ki6#|>4|)2aNPHfhCcbv*QUYy< zD4@4Ud|v)&;lH3CYl6`jU%)Sj*M!BaF&7PIrMF19=`kh3$>HhGqfZJtTI7|XQG&10 zN?t+ys0BOL71mTHtIdwE>FjRIuyhs5d9-}xoAJ)bO-qQ873tq+J za|>5de4dpX zT=~n_#nwUg7N3h#KZ`H?sEmU0M=jVC@TnqMXD5gSe2Ile<>fU%341(BydUu_5jIqa zz#??3AH*j~k*!-$zjzv_Zz2**$MO@Yf_%}0Nd=K()cnWahgs@Qu=@5J!w2um2jhW* z0o|WG0yq*l1~?ATJ<4go$-qotHgEN?Ye+8Zdz6(4J`~dhd@KfMFfE~cIz^{N` z1J465051Xm1!RHOfDxd)EC>z&#sL$7LxIDADZtUdvA_vH2uue~0Zs)@2j&9vfwO>f z0DiwXxB#dCs(@v{3Sc!*2k?$|a53-};B7!7umNZTHUpOeoxo*4A8-ZmF5uk&ZxjUA z1Mdai2iyYO3VaCod*CkMW56eYLEs+XGr)G>vjC4P2M+;X1crdefX9Ka0pA3^1$-O$ z4)8tT`@oNYp8)?C$N;;5UjqLL{1*5<@CV=(;7`D-z#gEC>(FC?gMbMDzt0s+0wx1T z0dE412c`li0W*MEz-ho7;7nj4un1TTyctLUl|T)!6j%k+0!d&ka0##;cn8o7v;v!e zcLH00_m1UUFK#bzIj|MD8sKg0;5y*%fSZ7ufe!*H;0{1PqViGT6F?fc8~6v{KHvf1 zbHG0VUjQBjz6^X7;4PBi8^FH+{|ERt;3+_KJcIi~;NO9t0Y3+J0>1#B1AYVi4tNoG z8Q`7S;LpHrAV3L>0S*Ml0|x_#0Y?Bw0>=Qy0Ve{}fRlllz--_QU>>jlI2$+@I3KtW z5M6(RzwzL2GVs?a154{JMdxPBf!T2-T)7_0iOo$1?~s_5%@gtFz^WQCEzQ-Fz|KY zpMie`o&>%NJPrH+_%ZNP;6DJ~*a@Bmeg*s*cpi8G;P)Yd{{pfAzd;g=0OjbX1AuYB zMBq^1a9|2>G;l0%0uTbzfm47}fzyGxz$+ z8_)=B0NQ}fz@sm5}2nw zaIa|Qx@hO7pr^mHaU*v}dpEbKDnTE&uX?w%o6GO=6W^(Hx^L4>5^q1-25=8R?Dh89 z1fk*HneKa?>Yt3*XAaWOzu=TJgKE>T;+ebIxOl?)8QfqtNcl&$vi@S}wzMimxRHzg zxeHs|lj~{g|%HIWACKso?CQd*x$Vls+wEEn$FfX%@OoB68n=scTcXj zjq9NH5@g8r;%3V_uCS{8dp(jR9Y~|tT+zb2A-xDkSEo|0?c7i_CXT-^Eb^*B2lcP% zwC@S%66NXcHft^^H}ANW?QVXm{<$doHiGJrAMW2o$gf{t*t)f|c?);H?bSgp14j2r zb99Q2dFc!zgg-A-h4NPw$B5ru$rCT6IHDV`F1)`}F*$J~y?sBTuDOqUwVmO*E}q1h z)vV`U>~keo5MbVu;RzS;=jh}iU(ZLHR8~XdAS562p^pDQBfm_4- zmsj=lboRA%hMU?qHHRBJx~}lIIAiy6qjXk3@O%JDxYfMXVj9aQ-AlTTwvD-)zI#c> zD;ArhgpR*8_I7*wyX<2EydA@RPF=rj?c$!Z`3KE!F9gmB*YZ}8eR9UD(Wsu6^*3{~ zb4I^mUabDSfrM)8=OTD-{{~+pQswyDD@pM;pu4+l7YS#za_LosNW8Y7U)n?6wLaAs z?CXh=H+{-pdzB`fKC7jxgJ)~HuF&1&eU#(T1_ixR+DQ&zv&=MP4#>XOfwW&9H<;T@O7rm4b`gB8BGqRg| zA12O=t!;fSpO>3hz1q7M+n1X}f6;iJ7V{4v#pC1k%tKOuCqG>bSwXs-oSE{BCW@Dr zi?=wGARZqt2fpW!6qHktE{AL{>D+Syn|%i_Rj$&3aE4Fl)8)n>qY*YX^JtUTZ4_J3 zPm872uxIbWn`cCnc}}?6U2l)ZC0|}|TZercD=N;G=Hn$N9UW~Q#!?`vuwHuT!l-PG zu|?u#adt6o6hueu(cbw^%GV1Jot39L4m+`r; zt1Im2f@FBq($&2c{A=xNGX7CG?_X&Of<6~-hh6-rb3HQ5fx$LT{g@(-hk*e4`B4_n^#cu zG-2=7EgQOcgiP<6U=_Jpop~mOx!p!1W(?i-$w47eo9Hjc&l!60FM9P*+>Kt3;1v}A zE`%}Cdt>jJFowEk5nE&0y+gdzpX`1VyL(-suspCCrs++O4IRxbmon8dLxAQ#r5-ae zV||WN(Y@L{k{BX0UG6z0&2AW_=Y&gp+F%dQxrp7Z;p!!pFyCD5ZjR93*-MRMQ)5fM zdv784zD8lH938nBb+cXgN!0%e7ItGjk{PhH}kG#cc0HM9g8JlUkU1I z+lY!buj{m3A=PWv62i7-jlfoZ+cq?}ZiFTlS2}rO2S(UQw0%Z#LePdH=}~;Uj4J$F z^sWys=D2mc`ov0Ct)Q*8ZcS}N{o1-Z8&bWdmg7A2K03g^x_b2lx%Ejxt2yb=P&>h| zlUXJZJ`3`0DF7i+nEph*zO^@8m@e+0PyA9qd&BYYzou`kA?=Nx>-G`9x4b@1=j;7< zp{q60!mzl1ii_6*Wn~8wX)GGapBe34%jWdu6+P{|p@+mrB3fdJ)#TiJz9s!KEqL~- zgEvEyZJMXj7nE_o^G)NWxGpA)y?xX4E+LN{n+|QBqr{8CD?vBYrPmddYcjx(Z8WbHuElV$dk=M(xi*GfO4ZB zDk&f~bM*XYX5kQ*ZX1)|v`>-5u{Lt)Xs6=od|R1xYOi9+Vr`~$YPTZEqPFwxRwPYc z+o|1(q>0*&b}JH{Yr7~CSx3Bc6KyrTYQh`z-#1U@q@e&c)-J zQTE+T?FV7r`6xS%nQ*uKrjp2s8jTF%w}o!xnyVV*9X(M`^1W@!yi zm&zKRLi{&5`RkOEn$B)k^;nhaH|r%V@%5rr!VP-4((Ex93rKI|Tg^BZz0)!mTYuwR z_R8b-iyB_5D$x=MbBAW+NBYU{8nEB*1aR(*Uh_4h*M9N*MS}unG>0=bP*yl&`QjO? z7tg2sV%&lLd>up8l3TZ8Korupq0C}g2gm9BGj+03-js3D5JaNue`z))x%Z-+J7Ok`tsDN<{m7#@EyhW5s-QsI7O)aqQT z(9K$Ee);12TJyTBq`sxOqoto!Gygz2hdpMkt~#qx8=#Fm!tCEM&e6Yr`R%%H4g<@< z?FcVg!7NbD+F)inrv}C7$MzMc4eh1M<){Q3H)v!?1kZ zZ|5?_t4zW|`b5B~%3q4V8#{DrMoZP^Z$|5k8Hc#?C_h%@9HwD*AKi?z%*T|)WXCO4 zzf$e86lK|wV{2q*<>QG&0anrtTf5rqFQ=FvG-1iayom3fq-QC826H^e0M9$ZqGfNr zV{DdC+yW6CcaQw~+QX-UB2m5V8)ezS1 zrI?u)h5S;;mUeRrfCc*K&1^H;;fK*TXzV;FJUY_dV zfA?trb^tm$!!vqKqrGlExwXE$t&2kT?1S&&ti0SY4vnvm?}+$)ehJqZ7sS{Y^lt6c zHvWE;)7cV3AB#LJPu&XQVCZgpSDiCM|e z***3&nz!n`Z}Y_c2A20Wg<31TFl>-?vwyFjlF>MSp^>Cqy9uu!1|yU?jS{VncojoY zOv20#NvI_LuYrF*}bs(T=m!C7-tnx2Y5UyQea*mZ@FCI&Nv!{ zKh}G;uw(0yjqWambdeg)#2RM&YVzBW&)M>(|3w`qpHDg8{z<#u*Y0oGyg&7D(p^}E zT#1&i39T-bRGNKec9Cnm~%EueyC(B5jJ~4ZS zam|yTewIlU38IldOTqXmlizYQR`U3zlGsR5n|I_9%dJ;5YY9*iVCl1ZR+xEt-ftp0 zSuwmpN25(eW2@asr84{}|Kc!5rK<*39;;RQ;WVT?7poz)h>Z?|Y+uTy9F52FIhVqW z)TSY1;R~~<_lGKT=@er{%(a?9G{c+{jkkxfpZaLuwjO>$2#emB=)Qd$auM)t&iswx z*B;cb4xLeX{BL%iee8vQn_vEQ&M(cNft=dep6u(eo?i(;i0z7j`7tu$374?46C6La zVZx1I=q#9iSISQiNbkbC+)A=~1NPqH&nhUu>pQFK@L({q(lNc!;}Qx}Kb9u;;NEj_NXE`ifbcDL@*wyn`Is~|UD zbw9wPA6n_|+pONxxP>F>S2p&UH9`A>S!Pz9SGet-L4J8TT;5=-m3^I;F`p0l`CXIP zx<^XP{e0dmKNq#9#q0={pI=R3ZN-+zUgB74GY5Sv+Y9KmamtZP&y=cUdK;IYzQ?p= zar`z;y!e~G`0LacZr|Aq8vX>cjyTUTKV%vGyvv5RzAM_0dtJF2!l*Q%O@rM6S zcE9f}Gl%@T-Qdr_GH=(faA}(Ee`F?~3f9Y6-?8UhUHN~>{Nbz)m5*TSr*8CvpC#ys zal@YT@Ql#!U5flTRaQ&o&d=5PbLOhK3enDiD_JWw(aCdXu)6xj_@!02{o|F&9?h@U zmp|UndG!+-@Us$S?8dx$H4vAp)T!a(=op%($JK|^_+9+=+5R-VV`P4P{zCa{I80;? zK=qDl@(aRwM)HgCfz2+441V9H2pw|sq+T-y$NHp2H+Oh=J%p5^^Yt_s6)aUfezMC)`!OA@&Z^NCkYR|~kxJ|ep$Gr{rG2BV3$&b4k_ci&~kpCF? zin|cE3bz6GHrzhk=Wy@99ap<&x;-N=<6d&no{=eUqFzbzXopL<%zK#62 zm*6(wK8V|gJMQh|$8ExW7`L^N{J3vxB0uiJX7ZmvyKEpoZrDP8+n1<$UATAPPPvTyxVPbcANM)jmvL|DA%95!!d-}aQ!n{(Gq`=Y zH}sJo_h+~d|9|bhe|%h3wLW}iGELGpZBrU(fB;hn5HU?d2@s&@q)khDP2120teER0 z%}kP!$z+(BloSdCjZif}krZ0m#;8@R6wTGB0V~F9)m+WhDg}cUjaaop)OfAls-^Qj zYp=B@dnP&I-p~8KpYQjNnKrY|d7ib_-h1tzXU~~4ke%(Yha81G1zETi_Dj&uA<-vN?t~nG%-;rk$UewZkVW^v{!+yCUf4s9LDoXHY==GMIAjlG<$bV+ zJPdgZGVgxaLv};vU55NamO<7%0DH&*$Qa~`PS`^pfgGUo2VoD{19=Lv`~$ErME)Sl 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 MMr%?GQckV^2O2iQAOHXW literal 232088 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 #include // usleep #include // INET_ADDRSTRLEN @@ -227,6 +230,10 @@ uint64_t getFirmwareVersion() { return ((bus_r(FPGAVERSIONREG) & COMPDATE_MSK) >> COMPDATE_OFST); } +void getHardwareVersion(char *version) { + strcpy(version, "Not applicable"); +} + u_int64_t getDetectorMAC() { #ifdef VIRTUAL return 0; @@ -310,12 +317,29 @@ void setupDetector() { LOG(logINFO, ("Setting up Server for 1 Xilinx Chip Test Board\n")); #ifdef VIRTUAL sharedMemory_setStatus(IDLE); + initializePatternWord(); #endif LOG(logINFOBLUE, ("Setting Default parameters\n")); + initializePatternAddresses(); + setNumFrames(DEFAULT_NUM_FRAMES); setNumTriggers(DEFAULT_NUM_CYCLES); + setTiming(DEFAULT_TIMING_MODE); +} + +/* set parameters - dr */ + +int setDynamicRange(int dr) { + if (dr == 16) + return OK; + return FAIL; +} + +int getDynamicRange(int *retval) { + *retval = DYNAMIC_RANGE; + return OK; } /* parameters - timer */ @@ -338,6 +362,37 @@ void setNumTriggers(int64_t val) { int64_t getNumTriggers() { return getU64BitReg(CYCLESINREG1, CYCLESINREG2); } +int64_t getNumFramesLeft() { + return getU64BitReg(FRAMESOUTREG1, FRAMESOUTREG2); +} + +int64_t getNumTriggersLeft() { + return getU64BitReg(CYCLESOUTREG1, CYCLESOUTREG2); +} + +/* parameters - timing, extsig */ + +void setTiming(enum timingMode arg) { + switch (arg) { + case AUTO_TIMING: + LOG(logINFO, ("Set Timing: Auto\n")); + bus_w(FLOWCONTROLREG, bus_r(FLOWCONTROLREG) & ~TRIGGERENABLE_MSK); + break; + case TRIGGER_EXPOSURE: + LOG(logINFO, ("Set Timing: Trigger\n")); + bus_w(FLOWCONTROLREG, bus_r(FLOWCONTROLREG) | TRIGGERENABLE_MSK); + break; + default: + LOG(logERROR, ("Unknown timing mode %d\n", arg)); + } +} + +enum timingMode getTiming() { + if (bus_r(FLOWCONTROLREG) == TRIGGERENABLE_MSK) + return TRIGGER_EXPOSURE; + return AUTO_TIMING; +} + int setDetectorPosition(int pos[]) { memcpy(detPos, pos, sizeof(detPos)); // TODO diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h index 391a4b327..d9a095e39 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h @@ -19,5 +19,10 @@ enum DACINDEX { D0 }; /** Default Parameters */ -#define DEFAULT_NUM_FRAMES (1) -#define DEFAULT_NUM_CYCLES (1) +#define DEFAULT_NUM_FRAMES (1) +#define DEFAULT_NUM_CYCLES (1) +#define DYNAMIC_RANGE (16) +#define DEFAULT_TIMING_MODE (AUTO_TIMING) + +/* Defines in the Firmware */ +#define WAIT_TIME_PATTERN_READ (10) // TODO? \ No newline at end of file diff --git a/slsDetectorSoftware/generator/commands.yaml b/slsDetectorSoftware/generator/commands.yaml index d1e433668..68f3ca907 100644 --- a/slsDetectorSoftware/generator/commands.yaml +++ b/slsDetectorSoftware/generator/commands.yaml @@ -585,7 +585,7 @@ patioctrl: function: setPatternIOControl patmask: - help: "[64 bit mask]\n\t[Ctb][Mythen3] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern." + help: "[64 bit mask]\n\t[Ctb][Mythen3][Xilinx Ctb] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern." inherit_actions: INTEGER_COMMAND_HEX_WIDTH16 actions: GET: @@ -594,7 +594,7 @@ patmask: function: setPatternMask patsetbit: - help: "[64 bit mask]\n\t[Ctb][Mythen3] Sets the mask applied to every pattern to the selected bits." + help: "[64 bit mask]\n\t[Ctb][Mythen3][Xilinx Ctb] Sets the mask applied to every pattern to the selected bits." inherit_actions: INTEGER_COMMAND_HEX_WIDTH16 actions: GET: @@ -688,7 +688,7 @@ column: function: setColumn timing: - help: "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Moench][Gotthard][Ctb][Gotthard2] [auto|trigger]\n\t[Mythen3] [auto|trigger|gating|trigger_gating]\n\t[Eiger] [auto|trigger|gating|burst_trigger]" + help: "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Moench][Gotthard][Ctb][Gotthard2][Xilinx Ctb] [auto|trigger]\n\t[Mythen3] [auto|trigger|gating|trigger_gating]\n\t[Eiger] [auto|trigger|gating|burst_trigger]" inherit_actions: INTEGER_COMMAND_VEC_ID actions: GET: @@ -1506,7 +1506,7 @@ triggers: dr: inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID - help: "[value]\n\tDynamic Range or number of bits per pixel in detector.\n\t[Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets clkdivider to 2, else to 0.\n\t[Mythen3] Options: 8, 16, 32\n\t[Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16" + help: "[value]\n\tDynamic Range or number of bits per pixel in detector.\n\t[Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets clkdivider to 2, else to 0.\n\t[Mythen3] Options: 8, 16, 32\n\t[Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2][Xilinx Ctb] 16" actions: GET: function: getDynamicRange @@ -1835,7 +1835,7 @@ parameters: savepattern: inherit_actions: EXECUTE_SET_COMMAND_NOID_1ARG - help: "\n\t[Ctb][Mythen3] Saves pattern to file (ascii). \n\t[Ctb] Also executes pattern." + help: "\n\t[Ctb][Mythen3][Xilinx Ctb] Saves pattern to file (ascii). \n\t[Ctb] Also executes pattern." actions: PUT: function: savePattern @@ -1850,7 +1850,7 @@ detectorserverversion: hardwareversion: inherit_actions: GET_COMMAND - help: "\n\t[Jungfrau][Gotthard2][Myhten3][Gotthard][Ctb][Moench] Hardware version of detector. \n\t[Eiger] Hardware version of front FPGA on detector." + help: "\n\tHardware version of detector. \n\t[Eiger] Hardware version of front FPGA on detector." actions: GET: function: getHardwareVersion @@ -1885,14 +1885,14 @@ type: framesl: inherit_actions: GET_COMMAND - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of frames left in acquisition. \n\t[Gotthard2] only in continuous auto mode." + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb][Xilinx Ctb] Number of frames left in acquisition. \n\t[Gotthard2] only in continuous auto mode." actions: GET: function: getNumberOfFramesLeft triggersl: inherit_actions: GET_COMMAND - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of triggers left in acquisition. Only when external trigger used." + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb][Xilinx Ctb] Number of triggers left in acquisition. Only when external trigger used." actions: GET: function: getNumberOfTriggersLeft @@ -1997,7 +1997,7 @@ syncclk: patfname: inherit_actions: GET_COMMAND - help: "\n\t[Ctb][Mythen3] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default file" + help: "\n\t[Ctb][Mythen3][Xilinx Ctb] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default file" actions: GET: function: getPatterFileName @@ -3842,7 +3842,7 @@ diodelay: # pattern is a keyword in yaml, so patternX is used to avoid it patternX: - help: "[fname]\n\t[Mythen3][Ctb] Loads ASCII pattern file directly to server (instead of executing line by line)" + help: "[fname]\n\t[Mythen3][Ctb][Xilinx Ctb] Loads ASCII pattern file directly to server (instead of executing line by line)" command_name: "pattern" actions: PUT: @@ -3855,7 +3855,7 @@ patternX: output: [ 'args.front()' ] patword: - help: "[step or address] [64 bit mask]\n\t[Ctb][Mythen3] 64 bit pattern at address of pattern memory.\n\t[Ctb] read is same as executing pattern" + help: "[step or address] [64 bit mask]\n\t[Ctb][Mythen3][Xilinx Ctb] 64 bit pattern at address of pattern memory.\n\t[Ctb] read is same as executing pattern" actions: GET: argc: 1 @@ -3875,7 +3875,7 @@ patword: output: [ "'['", "ToStringHex(arg0, 4)", '", "', "ToStringHex(arg1, 16)", '"]"' ] patlimits: - help: "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of complete pattern" + help: "[start addr] [stop addr] \n\t[Ctb][Mythen3][Xilinx Ctb] Limits of complete pattern" actions: GET: argc: -1 @@ -3895,7 +3895,7 @@ patlimits: output: [ "'['" , "ToStringHex(arg1, 4)" , '", "' , "ToStringHex(arg2, 4)", "']'" ] patloop: - help: "[0-6] [start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of the loop level provided.\n\t[Mythen3] Level options: 0-3 only." + help: "[0-6] [start addr] [stop addr] \n\t[Ctb][Mythen3][Xilinx Ctb] Limits of the loop level provided.\n\t[Mythen3] Level options: 0-3 only." actions: GET: argc: -1 @@ -3944,7 +3944,7 @@ patloop2: inherit_actions: patloop0 patnloop: - help: "[0-6] [n_cycles] \n\t[Ctb][Mythen3] Number of cycles of the loop level provided.\n\t[Mythen3] Level options: 0-3 only." + help: "[0-6] [n_cycles] \n\t[Ctb][Mythen3][Xilinx Ctb] Number of cycles of the loop level provided.\n\t[Mythen3] Level options: 0-3 only." actions: GET: argc: -1 @@ -3991,7 +3991,7 @@ patnloop2: inherit_actions: patnloop0 patwait: - help: "[0-6] [addr] \n\t[Ctb][Mythen3] Wait address for loop level provided. \n\t[Mythen3] Level options: 0-3 only." + help: "[0-6] [addr] \n\t[Ctb][Mythen3][Xilinx Ctb] Wait address for loop level provided. \n\t[Mythen3] Level options: 0-3 only." actions: GET: argc: -1 @@ -4037,7 +4037,7 @@ patwait2: inherit_actions: patwait0 patwaittime: - help: "[0-6] [n_clk] \n\t[Ctb][Mythen3] Wait time in clock cycles for the loop provided.\n\t[Mythen3] Level options: 0-3 only." + help: "[0-6] [n_clk] \n\t[Ctb][Mythen3][Xilinx Ctb] Wait time in clock cycles for the loop provided.\n\t[Mythen3] Level options: 0-3 only." actions: GET: argc: -1 diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 7001eba45..47a8a4bed 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -322,11 +322,11 @@ class Detector { /** [Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] */ void setDelayAfterTrigger(ns value, Positions pos = {}); - /** [Gotthard][Jungfrau][Moench][CTB][Mythen3] + /** [Gotthard][Jungfrau][Moench][CTB][Mythen3][Xilinx CTB] * [Gotthard2] only in continuous auto mode */ Result getNumberOfFramesLeft(Positions pos = {}) const; - /** [Gotthard][Jungfrau][Moench][CTB][Mythen3] + /** [Gotthard][Jungfrau][Moench][CTB][Mythen3][Xilinx CTB] * Only when external trigger used */ Result getNumberOfTriggersLeft(Positions pos = {}) const; @@ -343,7 +343,7 @@ class Detector { /** * [Eiger] Options: 4, 8, 12, 16, 32. If i is 32, also sets clkdivider to 2, * else sets clkdivider to 1 \n [Mythen3] Options: 8, 16, 32 \n - * [Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16 + * [Jungfrau][Moench][Gotthard][CTB][Mythen3][Gotthard2][Xilinx CTB] 16 */ void setDynamicRange(int value); @@ -353,7 +353,7 @@ class Detector { Result getTimingMode(Positions pos = {}) const; /** - * [Gotthard][Jungfrau][Moench][Gotthard][CTB][Gotthard2] Options: + * [Gotthard][Jungfrau][Moench][Gotthard][CTB][Gotthard2][Xilinx CTB] Options: * AUTO_TIMING, TRIGGER_EXPOSURE \n * [Mythen3] Options: AUTO_TIMING, TRIGGER_EXPOSURE, GATED, TRIGGER_GATED \n * [Eiger] Options: AUTO_TIMING, TRIGGER_EXPOSURE, GATED, BURST_TRIGGER @@ -1846,20 +1846,20 @@ class Detector { * Pattern * * * * ************************************************/ - /** [CTB][Mythen3] Gets the pattern file name including path of the last + /** [CTB][Mythen3][Xilinx CTB] Gets the pattern file name including path of the last * pattern uploaded. \n Returns an empty if nothing was uploaded or via a * server default file*/ Result getPatterFileName(Positions pos = {}) const; - /** [CTB][Mythen3] Loads ASCII pattern file directly to server + /** [CTB][Mythen3][Xilinx CTB] Loads ASCII pattern file directly to server * (instead of executing line by line)*/ void setPattern(const std::string &fname, Positions pos = {}); - /** [CTB][Mythen3] Loads pattern parameters structure directly to + /** [CTB][Mythen3][Xilinx CTB] Loads pattern parameters structure directly to * server */ void setPattern(const Pattern &pat, Positions pos = {}); - /** [CTB][Mythen3] [Ctb][Mythen3] Saves pattern to file + /** [CTB][Mythen3][Xilinx CTB] Saves pattern to file * (ascii). \n [Ctb] Also executes pattern.*/ void savePattern(const std::string &fname); @@ -1872,57 +1872,57 @@ class Detector { /** [CTB] */ void setPatternIOControl(uint64_t word, Positions pos = {}); - /** [CTB][Mythen3] same as executing for ctb */ + /** [CTB][Mythen3][Xilinx CTB] same as executing for ctb */ Result getPatternWord(int addr, Positions pos = {}); - /** [CTB] Caution: If word is -1 reads the addr (same as + /** [CTB][Xilinx CTB] Caution: If word is -1 reads the addr (same as * executing the pattern) * [Mythen3] */ void setPatternWord(int addr, uint64_t word, Positions pos = {}); - /**[CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 + /**[CTB][Mythen3][Xilinx CTB] Options: level: -1 (complete pattern) and 0-2 * levels * @returns array of start address and stop address */ Result> getPatternLoopAddresses(int level, Positions pos = {}) const; - /** [CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 + /** [CTB][Mythen3][Xilinx CTB] Options: level: -1 (complete pattern) and 0-2 * levels */ void setPatternLoopAddresses(int level, int start, int stop, Positions pos = {}); - /**[CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 + /**[CTB][Mythen3][Xilinx CTB] Options: level: -1 (complete pattern) and 0-2 * levels */ Result getPatternLoopCycles(int level, Positions pos = {}) const; - /** [CTB][Mythen3] n: 0-2, level: -1 (complete pattern) and 0-2 + /** [CTB][Mythen3][Xilinx CTB] n: 0-2, level: -1 (complete pattern) and 0-2 * levels */ void setPatternLoopCycles(int level, int n, Positions pos = {}); - /**[CTB][Mythen3] */ + /**[CTB][Mythen3][Xilinx CTB] */ Result getPatternWaitAddr(int level, Positions pos = {}) const; - /** [CTB][Mythen3] Options: level 0-2 */ + /** [CTB][Mythen3][Xilinx CTB] Options: level 0-2 */ void setPatternWaitAddr(int level, int addr, Positions pos = {}); - /** [CTB][Mythen3] */ + /** [CTB][Mythen3][Xilinx CTB] */ Result getPatternWaitTime(int level, Positions pos = {}) const; - /** [CTB][Mythen3] Options: level 0-2 */ + /** [CTB][Mythen3][Xilinx CTB] Options: level 0-2 */ void setPatternWaitTime(int level, uint64_t t, Positions pos = {}); - /** [CTB][Mythen3] */ + /** [CTB][Mythen3][Xilinx CTB] */ Result getPatternMask(Positions pos = {}); - /** [CTB][Mythen3] Selects the bits that will have a pattern mask + /** [CTB][Mythen3][Xilinx CTB] Selects the bits that will have a pattern mask * applied to the selected patmask for every pattern. */ void setPatternMask(uint64_t mask, Positions pos = {}); - /** [CTB][Mythen3] */ + /** [CTB][Mythen3][Xilinx CTB] */ Result getPatternBitMask(Positions pos = {}) const; - /** [CTB][Mythen3] Sets the mask applied to every pattern to the + /** [CTB][Mythen3][Xilinx CTB] Sets the mask applied to every pattern to the * selected bits */ void setPatternBitMask(uint64_t mask, Positions pos = {}); diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp index fb5f75764..191516f61 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp @@ -23,7 +23,7 @@ TEST_CASE("Caller::patfname", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { REQUIRE_THROWS(caller.call("patfname", {}, -1, PUT)); REQUIRE_NOTHROW(caller.call("patfname", {}, -1, GET)); } else { @@ -35,7 +35,7 @@ TEST_CASE("Caller::pattern", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { // no proper test for put REQUIRE_THROWS(caller.call("pattern", {}, -1, GET)); } else { @@ -47,7 +47,7 @@ TEST_CASE("Caller::savepattern", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { REQUIRE_THROWS( caller.call("savepattern", {"/tmp/pattern.txt"}, -1, GET)); if (det.size() == 1) { @@ -108,7 +108,7 @@ TEST_CASE("Caller::patword", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { int addr = 0x23; std::string saddr = ToStringHex(addr, 4); auto prev_val = det.getPatternWord(addr); @@ -118,6 +118,12 @@ TEST_CASE("Caller::patword", "[.cmdcall]") { REQUIRE(oss.str() == "patword [" + saddr + ", 0xc15004808d0a21a4]\n"); } + { + std::ostringstream oss; + caller.call("patword", {saddr, "0x815004808d0a21a4"}, -1, PUT, oss); + REQUIRE(oss.str() == + "patword [" + saddr + ", 0x815004808d0a21a4]\n"); + } { std::ostringstream oss; caller.call("patword", {saddr, "0xaadf0"}, -1, PUT, oss); @@ -143,7 +149,7 @@ TEST_CASE("Caller::patlimits", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternLoopAddresses(-1); { std::ostringstream oss; @@ -169,7 +175,7 @@ TEST_CASE("Caller::patloop", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -217,7 +223,7 @@ TEST_CASE("Caller::patnloop", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -262,7 +268,7 @@ TEST_CASE("Caller::patwait", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -307,7 +313,7 @@ TEST_CASE("Caller::patwaittime", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -352,7 +358,7 @@ TEST_CASE("Caller::patmask", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternMask(); { std::ostringstream oss; @@ -377,7 +383,7 @@ TEST_CASE("Caller::patsetbit", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternBitMask(); { std::ostringstream oss; diff --git a/slsDetectorSoftware/tests/Caller/test-Caller.cpp b/slsDetectorSoftware/tests/Caller/test-Caller.cpp index e1a31e239..76fdf2a91 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller.cpp @@ -87,13 +87,8 @@ TEST_CASE("CALLER::virtual", "[.cmdcall]") { TEST_CASE("CALLER::versions", "[.cmdcall]") { Detector det; Caller caller(&det); - auto det_type = det.getDetectorType().squash(); - if (det_type != defs::XILINX_CHIPTESTBOARD) { - REQUIRE_NOTHROW(caller.call("versions", {}, -1, GET)); - REQUIRE_THROWS(caller.call("versions", {"0"}, -1, PUT)); - } else { - REQUIRE_THROWS(caller.call("versions", {}, -1, GET)); - } + REQUIRE_NOTHROW(caller.call("versions", {}, -1, GET)); + REQUIRE_THROWS(caller.call("versions", {"0"}, -1, PUT)); } TEST_CASE("CALLER::packageversion", "[.cmdcall]") { @@ -127,25 +122,15 @@ TEST_CASE("CALLER::detectorserverversion", "[.cmdcall]") { TEST_CASE("CALLER::hardwareversion", "[.cmdcall]") { Detector det; Caller caller(&det); - auto det_type = det.getDetectorType().squash(); - if (det_type != defs::XILINX_CHIPTESTBOARD) { - REQUIRE_NOTHROW(caller.call("hardwareversion", {}, -1, GET)); - REQUIRE_THROWS(caller.call("hardwareversion", {"0"}, -1, PUT)); - } else { - REQUIRE_THROWS(caller.call("hardwareversion", {}, -1, GET)); - } + REQUIRE_NOTHROW(caller.call("hardwareversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("hardwareversion", {"0"}, -1, PUT)); } TEST_CASE("CALLER::kernelversion", "[.cmdcall]") { Detector det; Caller caller(&det); - auto det_type = det.getDetectorType().squash(); - if (det_type != defs::XILINX_CHIPTESTBOARD) { - REQUIRE_NOTHROW(caller.call("kernelversion", {}, -1, GET)); - REQUIRE_THROWS(caller.call("kernelversion", {"0"}, -1, PUT)); - } else { - REQUIRE_THROWS(caller.call("kernelversion", {}, -1, GET)); - } + REQUIRE_NOTHROW(caller.call("kernelversion", {}, -1, GET)); + REQUIRE_THROWS(caller.call("kernelversion", {"0"}, -1, PUT)); } TEST_CASE("CALLER::serialnumber", "[.cmdcall]") { @@ -959,7 +944,7 @@ TEST_CASE("CALLER::framesl", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::EIGER) { REQUIRE_THROWS(caller.call("framesl", {}, -1, GET)); } else { REQUIRE_NOTHROW(caller.call("framesl", {}, -1, GET)); @@ -970,7 +955,7 @@ TEST_CASE("CALLER::triggersl", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::EIGER) { REQUIRE_THROWS(caller.call("triggersl", {}, -1, GET)); } else { REQUIRE_NOTHROW(caller.call("triggersl", {}, -1, GET)); @@ -1017,45 +1002,41 @@ TEST_CASE("CALLER::dr", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::XILINX_CHIPTESTBOARD) { - if (det_type == defs::EIGER) { - auto dr = det.getDynamicRange().squash(); - std::array vals{4, 8, 16, 32}; - for (const auto val : vals) { - std::ostringstream oss1, oss2; - caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); - REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); - caller.call("dr", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); - } - det.setDynamicRange(dr); - } else if (det_type == defs::MYTHEN3) { - auto dr = det.getDynamicRange().squash(); - // not updated in firmware to support dr 1 - std::array vals{8, 16, 32}; - for (const auto val : vals) { - std::ostringstream oss1, oss2; - caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); - REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); - caller.call("dr", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); - } - det.setDynamicRange(dr); - } else { - // For the other detectors we should get an error message - // except for dr 16 - REQUIRE_THROWS(caller.call("dr", {"4"}, -1, PUT)); - REQUIRE_THROWS(caller.call("dr", {"8"}, -1, PUT)); - REQUIRE_THROWS(caller.call("dr", {"32"}, -1, PUT)); - + if (det_type == defs::EIGER) { + auto dr = det.getDynamicRange().squash(); + std::array vals{4, 8, 16, 32}; + for (const auto val : vals) { std::ostringstream oss1, oss2; - caller.call("dr", {"16"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "dr 16\n"); - caller.call("dr", {"16"}, -1, PUT, oss2); - REQUIRE(oss2.str() == "dr 16\n"); + caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); + REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); + caller.call("dr", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); } + det.setDynamicRange(dr); + } else if (det_type == defs::MYTHEN3) { + auto dr = det.getDynamicRange().squash(); + // not updated in firmware to support dr 1 + std::array vals{8, 16, 32}; + for (const auto val : vals) { + std::ostringstream oss1, oss2; + caller.call("dr", {std::to_string(val)}, -1, PUT, oss1); + REQUIRE(oss1.str() == "dr " + std::to_string(val) + '\n'); + caller.call("dr", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "dr " + std::to_string(val) + '\n'); + } + det.setDynamicRange(dr); } else { - REQUIRE_THROWS(caller.call("dr", {}, -1, GET)); + // For the other detectors we should get an error message + // except for dr 16 + REQUIRE_THROWS(caller.call("dr", {"4"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dr", {"8"}, -1, PUT)); + REQUIRE_THROWS(caller.call("dr", {"32"}, -1, PUT)); + + std::ostringstream oss1, oss2; + caller.call("dr", {"16"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "dr 16\n"); + caller.call("dr", {"16"}, -1, PUT, oss2); + REQUIRE(oss2.str() == "dr 16\n"); } } @@ -1070,66 +1051,61 @@ TEST_CASE("CALLER::timing", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::XILINX_CHIPTESTBOARD) { - auto prev_val = det.getTimingMode(); - det.setTimingMode(defs::AUTO_TIMING); + auto prev_val = det.getTimingMode(); + det.setTimingMode(defs::AUTO_TIMING); + { + std::ostringstream oss1, oss2; + caller.call("timing", {"auto"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing auto\n"); + caller.call("timing", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "timing auto\n"); + } + { + std::ostringstream oss1, oss2; + caller.call("timing", {"trigger"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing trigger\n"); + caller.call("timing", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "timing trigger\n"); + } + if (det_type == defs::EIGER) { { std::ostringstream oss1, oss2; - caller.call("timing", {"auto"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing auto\n"); + caller.call("timing", {"gating"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing gating\n"); caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing auto\n"); + REQUIRE(oss2.str() == "timing gating\n"); } { std::ostringstream oss1, oss2; - caller.call("timing", {"trigger"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing trigger\n"); + caller.call("timing", {"burst_trigger"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing burst_trigger\n"); caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing trigger\n"); + REQUIRE(oss2.str() == "timing burst_trigger\n"); } - if (det_type == defs::EIGER) { - { - std::ostringstream oss1, oss2; - caller.call("timing", {"gating"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing gating\n"); - caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing gating\n"); - } - { - std::ostringstream oss1, oss2; - caller.call("timing", {"burst_trigger"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing burst_trigger\n"); - caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing burst_trigger\n"); - } - REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); - } else if (det_type == defs::MYTHEN3) { - { - std::ostringstream oss1, oss2; - caller.call("timing", {"gating"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing gating\n"); - caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing gating\n"); - } - { - std::ostringstream oss1, oss2; - caller.call("timing", {"trigger_gating"}, -1, PUT, oss1); - REQUIRE(oss1.str() == "timing trigger_gating\n"); - caller.call("timing", {}, -1, GET, oss2); - REQUIRE(oss2.str() == "timing trigger_gating\n"); - } - REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); - } else { - REQUIRE_THROWS(caller.call("timing", {"gating"}, -1, PUT)); - REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); - REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); + } else if (det_type == defs::MYTHEN3) { + { + std::ostringstream oss1, oss2; + caller.call("timing", {"gating"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing gating\n"); + caller.call("timing", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "timing gating\n"); } - for (int i = 0; i != det.size(); ++i) { - det.setTimingMode(prev_val[i], {i}); + { + std::ostringstream oss1, oss2; + caller.call("timing", {"trigger_gating"}, -1, PUT, oss1); + REQUIRE(oss1.str() == "timing trigger_gating\n"); + caller.call("timing", {}, -1, GET, oss2); + REQUIRE(oss2.str() == "timing trigger_gating\n"); } + REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); } else { - REQUIRE_THROWS(caller.call("timing", {}, -1, GET)); - + REQUIRE_THROWS(caller.call("timing", {"gating"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"burst_trigger"}, -1, PUT)); + REQUIRE_THROWS(caller.call("timing", {"trigger_gating"}, -1, PUT)); + } + for (int i = 0; i != det.size(); ++i) { + det.setTimingMode(prev_val[i], {i}); } } diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index f14a99937..33b26e224 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -4,11 +4,11 @@ #define RELEASE "developer" #define APILIB "developer 0x230224" #define APIRECEIVER "developer 0x230224" -#define APIXILINXCTB "developer 0x240109" -#define APICTB "developer 0x240109" -#define APIGOTTHARD "developer 0x240109" -#define APIGOTTHARD2 "developer 0x240109" -#define APIJUNGFRAU "developer 0x240109" -#define APIMYTHEN3 "developer 0x240109" -#define APIMOENCH "developer 0x240109" -#define APIEIGER "developer 0x240109" +#define APICTB "developer 0x240110" +#define APIGOTTHARD "developer 0x240110" +#define APIGOTTHARD2 "developer 0x240110" +#define APIJUNGFRAU "developer 0x240110" +#define APIMYTHEN3 "developer 0x240110" +#define APIMOENCH "developer 0x240110" +#define APIEIGER "developer 0x240110" +#define APIXILINXCTB "developer 0x240110" From daec0dc389a649900ca617ce439950774b5c17ec Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 11 Jan 2024 18:02:30 +0100 Subject: [PATCH 29/38] minor --- slsDetectorServers/slsDetectorServer/src/loadPattern.c | 2 +- .../xilinx_ctbDetectorServer/slsDetectorServer_defs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slsDetectorServers/slsDetectorServer/src/loadPattern.c b/slsDetectorServers/slsDetectorServer/src/loadPattern.c index 6d3349499..7d191f4bc 100644 --- a/slsDetectorServers/slsDetectorServer/src/loadPattern.c +++ b/slsDetectorServers/slsDetectorServer/src/loadPattern.c @@ -21,7 +21,7 @@ uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; extern void bus_w(u_int32_t offset, u_int32_t data); extern u_int32_t bus_r(u_int32_t offset); -//extern int64_t get64BitReg(int aLSB, int aMSB); +//extern int64_t get64BitReg(int aLSB, int aMSB); TODO for all servers (only uint64_t) //extern int64_t set64BitReg(int64_t value, int aLSB, int aMSB); extern uint64_t getU64BitReg(int aLSB, int aMSB); extern void setU64BitReg(uint64_t value, int aLSB, int aMSB); diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h index d9a095e39..c26265e38 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h @@ -25,4 +25,4 @@ enum DACINDEX { D0 }; #define DEFAULT_TIMING_MODE (AUTO_TIMING) /* Defines in the Firmware */ -#define WAIT_TIME_PATTERN_READ (10) // TODO? \ No newline at end of file +#define WAIT_TIME_PATTERN_READ (10) \ No newline at end of file From b69e053bb4540e1498a4e9af6568e2b53ae6e314 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 11 Jan 2024 18:03:34 +0100 Subject: [PATCH 30/38] updated commands generation --- .../generator/extended_commands.yaml | 65 ++++++++++--------- slsDetectorSoftware/src/Caller.cpp | 32 ++++----- 2 files changed, 49 insertions(+), 48 deletions(-) diff --git a/slsDetectorSoftware/generator/extended_commands.yaml b/slsDetectorSoftware/generator/extended_commands.yaml index 173f30a7f..c5e5c67b2 100644 --- a/slsDetectorSoftware/generator/extended_commands.yaml +++ b/slsDetectorSoftware/generator/extended_commands.yaml @@ -2703,8 +2703,8 @@ dr: function_alias: dr help: "[value]\n\tDynamic Range or number of bits per pixel in detector.\n\t[Eiger]\ \ Options: 4, 8, 12, 16, 32. If set to 32, also sets clkdivider to 2, else to\ - \ 0.\n\t[Mythen3] Options: 8, 16, 32\n\t[Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2]\ - \ 16" + \ 0.\n\t[Mythen3] Options: 8, 16, 32\n\t[Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2][Xilinx\ + \ Ctb] 16" infer_action: true template: true drlist: @@ -3970,8 +3970,8 @@ framesl: store_result_in_t: true command_name: framesl function_alias: framesl - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of frames\ - \ left in acquisition. \n\t[Gotthard2] only in continuous auto mode." + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb][Xilinx Ctb] Number\ + \ of frames left in acquisition. \n\t[Gotthard2] only in continuous auto mode." infer_action: true template: true frametime: @@ -4703,8 +4703,8 @@ hardwareversion: store_result_in_t: true command_name: hardwareversion function_alias: hardwareversion - help: "\n\t[Jungfrau][Gotthard2][Myhten3][Gotthard][Ctb][Moench] Hardware version\ - \ of detector. \n\t[Eiger] Hardware version of front FPGA on detector." + help: "\n\tHardware version of detector. \n\t[Eiger] Hardware version of front FPGA\ + \ on detector." infer_action: true template: true highvoltage: @@ -5730,9 +5730,9 @@ patfname: store_result_in_t: true command_name: patfname function_alias: patfname - help: "\n\t[Ctb][Mythen3] Gets the pattern file name including path of the last\ - \ pattern uploaded. Returns an empty if nothing was uploaded or via a server default\ - \ file" + help: "\n\t[Ctb][Mythen3][Xilinx Ctb] Gets the pattern file name including path\ + \ of the last pattern uploaded. Returns an empty if nothing was uploaded or via\ + \ a server default file" infer_action: true template: true patioctrl: @@ -5826,7 +5826,8 @@ patlimits: store_result_in_t: false command_name: patlimits function_alias: patlimits - help: "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of complete pattern" + help: "[start addr] [stop addr] \n\t[Ctb][Mythen3][Xilinx Ctb] Limits of complete\ + \ pattern" infer_action: true patloop: actions: @@ -5899,8 +5900,8 @@ patloop: store_result_in_t: false command_name: patloop function_alias: patloop - help: "[0-6] [start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of the loop level\ - \ provided.\n\t[Mythen3] Level options: 0-3 only." + help: "[0-6] [start addr] [stop addr] \n\t[Ctb][Mythen3][Xilinx Ctb] Limits of the\ + \ loop level provided.\n\t[Mythen3] Level options: 0-3 only." infer_action: true patloop0: actions: @@ -6145,8 +6146,8 @@ patmask: store_result_in_t: false command_name: patmask function_alias: patmask - help: "[64 bit mask]\n\t[Ctb][Mythen3] Selects the bits that will have a pattern\ - \ mask applied to the selected patmask for every pattern." + help: "[64 bit mask]\n\t[Ctb][Mythen3][Xilinx Ctb] Selects the bits that will have\ + \ a pattern mask applied to the selected patmask for every pattern." infer_action: true template: true patnloop: @@ -6209,8 +6210,8 @@ patnloop: store_result_in_t: false command_name: patnloop function_alias: patnloop - help: "[0-6] [n_cycles] \n\t[Ctb][Mythen3] Number of cycles of the loop level provided.\n\ - \t[Mythen3] Level options: 0-3 only." + help: "[0-6] [n_cycles] \n\t[Ctb][Mythen3][Xilinx Ctb] Number of cycles of the loop\ + \ level provided.\n\t[Mythen3] Level options: 0-3 only." infer_action: true patnloop0: actions: @@ -6422,8 +6423,8 @@ patsetbit: store_result_in_t: false command_name: patsetbit function_alias: patsetbit - help: "[64 bit mask]\n\t[Ctb][Mythen3] Sets the mask applied to every pattern to\ - \ the selected bits." + help: "[64 bit mask]\n\t[Ctb][Mythen3][Xilinx Ctb] Sets the mask applied to every\ + \ pattern to the selected bits." infer_action: true template: true patternX: @@ -6448,8 +6449,8 @@ patternX: store_result_in_t: false command_name: pattern function_alias: pattern - help: "[fname]\n\t[Mythen3][Ctb] Loads ASCII pattern file directly to server (instead\ - \ of executing line by line)" + help: "[fname]\n\t[Mythen3][Ctb][Xilinx Ctb] Loads ASCII pattern file directly to\ + \ server (instead of executing line by line)" infer_action: true patternstart: actions: @@ -6532,8 +6533,8 @@ patwait: store_result_in_t: false command_name: patwait function_alias: patwait - help: "[0-6] [addr] \n\t[Ctb][Mythen3] Wait address for loop level provided. \n\t\ - [Mythen3] Level options: 0-3 only." + help: "[0-6] [addr] \n\t[Ctb][Mythen3][Xilinx Ctb] Wait address for loop level provided.\ + \ \n\t[Mythen3] Level options: 0-3 only." infer_action: true patwait0: actions: @@ -6769,8 +6770,8 @@ patwaittime: store_result_in_t: false command_name: patwaittime function_alias: patwaittime - help: "[0-6] [n_clk] \n\t[Ctb][Mythen3] Wait time in clock cycles for the loop provided.\n\ - \t[Mythen3] Level options: 0-3 only." + help: "[0-6] [n_clk] \n\t[Ctb][Mythen3][Xilinx Ctb] Wait time in clock cycles for\ + \ the loop provided.\n\t[Mythen3] Level options: 0-3 only." infer_action: true patwaittime0: actions: @@ -6998,8 +6999,8 @@ patword: store_result_in_t: false command_name: patword function_alias: patword - help: "[step or address] [64 bit mask]\n\t[Ctb][Mythen3] 64 bit pattern at address\ - \ of pattern memory.\n\t[Ctb] read is same as executing pattern" + help: "[step or address] [64 bit mask]\n\t[Ctb][Mythen3][Xilinx Ctb] 64 bit pattern\ + \ at address of pattern memory.\n\t[Ctb] read is same as executing pattern" infer_action: true pedestalmode: actions: @@ -9438,8 +9439,8 @@ savepattern: store_result_in_t: false command_name: savepattern function_alias: savepattern - help: "\n\t[Ctb][Mythen3] Saves pattern to file (ascii). \n\t[Ctb] Also executes\ - \ pattern." + help: "\n\t[Ctb][Mythen3][Xilinx Ctb] Saves pattern to file (ascii). \n\t[Ctb] Also\ + \ executes pattern." infer_action: true template: true scan: @@ -11229,8 +11230,8 @@ timing: store_result_in_t: false command_name: timing function_alias: timing - help: "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Moench][Gotthard][Ctb][Gotthard2]\ - \ [auto|trigger]\n\t[Mythen3] [auto|trigger|gating|trigger_gating]\n\t[Eiger]\ + help: "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Moench][Gotthard][Ctb][Gotthard2][Xilinx\ + \ Ctb] [auto|trigger]\n\t[Mythen3] [auto|trigger|gating|trigger_gating]\n\t[Eiger]\ \ [auto|trigger|gating|burst_trigger]" infer_action: true template: true @@ -11459,8 +11460,8 @@ triggersl: store_result_in_t: true command_name: triggersl function_alias: triggersl - help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of triggers\ - \ left in acquisition. Only when external trigger used." + help: "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb][Xilinx Ctb] Number\ + \ of triggers left in acquisition. Only when external trigger used." infer_action: true template: true trimbits: diff --git a/slsDetectorSoftware/src/Caller.cpp b/slsDetectorSoftware/src/Caller.cpp index 058330b2f..163811d93 100644 --- a/slsDetectorSoftware/src/Caller.cpp +++ b/slsDetectorSoftware/src/Caller.cpp @@ -3516,7 +3516,7 @@ std::string Caller::dr(int action) { Dynamic Range or number of bits per pixel in detector. [Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets clkdivider to 2, else to 0. [Mythen3] Options: 8, 16, 32 - [Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16 )V0G0N" + [Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2][Xilinx Ctb] 16 )V0G0N" << std::endl; return os.str(); } @@ -5242,7 +5242,7 @@ std::string Caller::framesl(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: framesl" << std::endl; os << R"V0G0N( - [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of frames left in acquisition. + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb][Xilinx Ctb] Number of frames left in acquisition. [Gotthard2] only in continuous auto mode. )V0G0N" << std::endl; return os.str(); @@ -6039,7 +6039,7 @@ std::string Caller::hardwareversion(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: hardwareversion" << std::endl; os << R"V0G0N( - [Jungfrau][Gotthard2][Myhten3][Gotthard][Ctb][Moench] Hardware version of detector. + Hardware version of detector. [Eiger] Hardware version of front FPGA on detector. )V0G0N" << std::endl; return os.str(); @@ -7668,7 +7668,7 @@ std::string Caller::patfname(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patfname" << std::endl; os << R"V0G0N( - [Ctb][Mythen3] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default file )V0G0N" + [Ctb][Mythen3][Xilinx Ctb] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default file )V0G0N" << std::endl; return os.str(); } @@ -7771,7 +7771,7 @@ std::string Caller::patlimits(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patlimits" << std::endl; os << R"V0G0N([start addr] [stop addr] - [Ctb][Mythen3] Limits of complete pattern )V0G0N" + [Ctb][Mythen3][Xilinx Ctb] Limits of complete pattern )V0G0N" << std::endl; return os.str(); } @@ -7824,7 +7824,7 @@ std::string Caller::patloop(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patloop" << std::endl; os << R"V0G0N([0-6] [start addr] [stop addr] - [Ctb][Mythen3] Limits of the loop level provided. + [Ctb][Mythen3][Xilinx Ctb] Limits of the loop level provided. [Mythen3] Level options: 0-3 only. )V0G0N" << std::endl; return os.str(); @@ -8047,7 +8047,7 @@ std::string Caller::patmask(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patmask" << std::endl; os << R"V0G0N([64 bit mask] - [Ctb][Mythen3] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern. )V0G0N" + [Ctb][Mythen3][Xilinx Ctb] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern. )V0G0N" << std::endl; return os.str(); } @@ -8110,7 +8110,7 @@ std::string Caller::patnloop(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patnloop" << std::endl; os << R"V0G0N([0-6] [n_cycles] - [Ctb][Mythen3] Number of cycles of the loop level provided. + [Ctb][Mythen3][Xilinx Ctb] Number of cycles of the loop level provided. [Mythen3] Level options: 0-3 only. )V0G0N" << std::endl; return os.str(); @@ -8325,7 +8325,7 @@ std::string Caller::patsetbit(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patsetbit" << std::endl; os << R"V0G0N([64 bit mask] - [Ctb][Mythen3] Sets the mask applied to every pattern to the selected bits. )V0G0N" + [Ctb][Mythen3][Xilinx Ctb] Sets the mask applied to every pattern to the selected bits. )V0G0N" << std::endl; return os.str(); } @@ -8388,7 +8388,7 @@ std::string Caller::pattern(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patternX" << std::endl; os << R"V0G0N([fname] - [Mythen3][Ctb] Loads ASCII pattern file directly to server (instead of executing line by line) )V0G0N" + [Mythen3][Ctb][Xilinx Ctb] Loads ASCII pattern file directly to server (instead of executing line by line) )V0G0N" << std::endl; return os.str(); } @@ -8468,7 +8468,7 @@ std::string Caller::patwait(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patwait" << std::endl; os << R"V0G0N([0-6] [addr] - [Ctb][Mythen3] Wait address for loop level provided. + [Ctb][Mythen3][Xilinx Ctb] Wait address for loop level provided. [Mythen3] Level options: 0-3 only. )V0G0N" << std::endl; return os.str(); @@ -8679,7 +8679,7 @@ std::string Caller::patwaittime(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patwaittime" << std::endl; os << R"V0G0N([0-6] [n_clk] - [Ctb][Mythen3] Wait time in clock cycles for the loop provided. + [Ctb][Mythen3][Xilinx Ctb] Wait time in clock cycles for the loop provided. [Mythen3] Level options: 0-3 only. )V0G0N" << std::endl; return os.str(); @@ -8893,7 +8893,7 @@ std::string Caller::patword(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: patword" << std::endl; os << R"V0G0N([step or address] [64 bit mask] - [Ctb][Mythen3] 64 bit pattern at address of pattern memory. + [Ctb][Mythen3][Xilinx Ctb] 64 bit pattern at address of pattern memory. [Ctb] read is same as executing pattern )V0G0N" << std::endl; return os.str(); @@ -12328,7 +12328,7 @@ std::string Caller::savepattern(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: savepattern" << std::endl; os << R"V0G0N( - [Ctb][Mythen3] Saves pattern to file (ascii). + [Ctb][Mythen3][Xilinx Ctb] Saves pattern to file (ascii). [Ctb] Also executes pattern. )V0G0N" << std::endl; return os.str(); @@ -14727,7 +14727,7 @@ std::string Caller::timing(int action) { os << "Command: timing" << std::endl; os << R"V0G0N([auto|trigger|gating|burst_trigger] Timing Mode of detector. - [Jungfrau][Moench][Gotthard][Ctb][Gotthard2] [auto|trigger] + [Jungfrau][Moench][Gotthard][Ctb][Gotthard2][Xilinx Ctb] [auto|trigger] [Mythen3] [auto|trigger|gating|trigger_gating] [Eiger] [auto|trigger|gating|burst_trigger] )V0G0N" << std::endl; @@ -15134,7 +15134,7 @@ std::string Caller::triggersl(int action) { if (action == slsDetectorDefs::HELP_ACTION) { os << "Command: triggersl" << std::endl; os << R"V0G0N( - [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb] Number of triggers left in acquisition. Only when external trigger used. )V0G0N" + [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][Ctb][Xilinx Ctb] Number of triggers left in acquisition. Only when external trigger used. )V0G0N" << std::endl; return os.str(); } From ffe772896636a9fad1881b65be1c0e433fce4e6c Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 11 Jan 2024 18:04:19 +0100 Subject: [PATCH 31/38] formatting --- .../include/slsDetectorFunctionList.h | 2 +- .../slsDetectorServer/src/arm64.c | 6 +- .../slsDetectorServer/src/common.c | 3 +- .../slsDetectorServer/src/loadPattern.c | 34 +- .../src/slsDetectorServer_funcs.c | 55 +- .../xilinx_ctbDetectorServer/RegisterDefs.h | 564 +++--------------- .../slsDetectorFunctionList.c | 19 +- .../slsDetectorServer_defs.h | 11 +- slsDetectorSoftware/include/sls/Detector.h | 22 +- .../Caller/test-Caller-chiptestboard.cpp | 48 +- .../tests/Caller/test-Caller-pattern.cpp | 33 +- .../tests/Caller/test-Caller-rx.cpp | 47 +- .../tests/Caller/test-Caller.cpp | 110 ++-- slsSupportLib/include/sls/versionAPI.h | 12 +- 14 files changed, 314 insertions(+), 652 deletions(-) diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 6e53976c1..7cbc24cf0 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -742,7 +742,7 @@ u_int32_t runState(enum TLogLevel lev); int calculateDataBytes(); int getTotalNumberOfChannels(); #endif -#if defined(CHIPTESTBOARDD) || defined (XILINX_CHIPTESTBOARDD) +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) void getNumberOfChannels(int *nchanx, int *nchany); #endif #ifndef XILINX_CHIPTESTBOARDD diff --git a/slsDetectorServers/slsDetectorServer/src/arm64.c b/slsDetectorServers/slsDetectorServer/src/arm64.c index 4c28dc703..8fff6550b 100644 --- a/slsDetectorServers/slsDetectorServer/src/arm64.c +++ b/slsDetectorServers/slsDetectorServer/src/arm64.c @@ -10,7 +10,6 @@ #include // open #include // mmap - /* global variables */ #define CSP0 (0xB0010000) #define MEM_SIZE 0x100000 @@ -59,8 +58,8 @@ int mapCSP0(void) { return FAIL; } LOG(logDEBUG1, ("/dev/mem opened\n")); - csp0base = (u_int32_t*)mmap(0, MEM_SIZE, PROT_READ | PROT_WRITE, - MAP_FILE | MAP_SHARED, fd, CSP0); + csp0base = (u_int32_t *)mmap(0, MEM_SIZE, PROT_READ | PROT_WRITE, + MAP_FILE | MAP_SHARED, fd, CSP0); if (csp0base == MAP_FAILED) { LOG(logERROR, ("Can't map memmory area\n")); return FAIL; @@ -72,4 +71,3 @@ int mapCSP0(void) { LOG(logINFO, ("Memory already mapped before\n")); return OK; } - diff --git a/slsDetectorServers/slsDetectorServer/src/common.c b/slsDetectorServers/slsDetectorServer/src/common.c index 79db3df28..1eddaef0a 100644 --- a/slsDetectorServers/slsDetectorServer/src/common.c +++ b/slsDetectorServers/slsDetectorServer/src/common.c @@ -134,7 +134,6 @@ int getKernelVersion(char *retvals) { return OK; } - int validateKernelVersion(char *expectedVersion) { // extract kernel date string char version[255] = {0}; @@ -167,7 +166,7 @@ int validateKernelVersion(char *expectedVersion) { #endif #endif currentVersion[sizeof(currentVersion) - 1] = '\0'; - + // convert kernel date string into time time_t kernelDate; if (getTimeFromString(currentVersion, &kernelDate) == FAIL) { diff --git a/slsDetectorServers/slsDetectorServer/src/loadPattern.c b/slsDetectorServers/slsDetectorServer/src/loadPattern.c index 7d191f4bc..0cec27019 100644 --- a/slsDetectorServers/slsDetectorServer/src/loadPattern.c +++ b/slsDetectorServers/slsDetectorServer/src/loadPattern.c @@ -21,8 +21,8 @@ uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; extern void bus_w(u_int32_t offset, u_int32_t data); extern u_int32_t bus_r(u_int32_t offset); -//extern int64_t get64BitReg(int aLSB, int aMSB); TODO for all servers (only uint64_t) -//extern int64_t set64BitReg(int64_t value, int aLSB, int aMSB); +// extern int64_t get64BitReg(int aLSB, int aMSB); TODO for all servers (only +// uint64_t) extern int64_t set64BitReg(int64_t value, int aLSB, int aMSB); extern uint64_t getU64BitReg(int aLSB, int aMSB); extern void setU64BitReg(uint64_t value, int aLSB, int aMSB); @@ -314,23 +314,23 @@ uint64_t getPatternWaitTime(int level) { switch (level) { case 0: return getU64BitReg(PATTERN_WAIT_TIMER_0_LSB_REG, - PATTERN_WAIT_TIMER_0_MSB_REG); + PATTERN_WAIT_TIMER_0_MSB_REG); case 1: return getU64BitReg(PATTERN_WAIT_TIMER_1_LSB_REG, - PATTERN_WAIT_TIMER_1_MSB_REG); + PATTERN_WAIT_TIMER_1_MSB_REG); case 2: return getU64BitReg(PATTERN_WAIT_TIMER_2_LSB_REG, - PATTERN_WAIT_TIMER_2_MSB_REG); + PATTERN_WAIT_TIMER_2_MSB_REG); #ifndef MYTHEN3D case 3: return getU64BitReg(PATTERN_WAIT_TIMER_3_LSB_REG, - PATTERN_WAIT_TIMER_3_MSB_REG); + PATTERN_WAIT_TIMER_3_MSB_REG); case 4: return getU64BitReg(PATTERN_WAIT_TIMER_4_LSB_REG, - PATTERN_WAIT_TIMER_4_MSB_REG); + PATTERN_WAIT_TIMER_4_MSB_REG); case 5: return getU64BitReg(PATTERN_WAIT_TIMER_5_LSB_REG, - PATTERN_WAIT_TIMER_5_MSB_REG); + PATTERN_WAIT_TIMER_5_MSB_REG); #endif default: return -1; @@ -372,28 +372,28 @@ void setPatternWaitTime(int level, uint64_t t) { switch (level) { case 0: setU64BitReg(t, PATTERN_WAIT_TIMER_0_LSB_REG, - PATTERN_WAIT_TIMER_0_MSB_REG); + PATTERN_WAIT_TIMER_0_MSB_REG); break; case 1: setU64BitReg(t, PATTERN_WAIT_TIMER_1_LSB_REG, - PATTERN_WAIT_TIMER_1_MSB_REG); + PATTERN_WAIT_TIMER_1_MSB_REG); break; case 2: setU64BitReg(t, PATTERN_WAIT_TIMER_2_LSB_REG, - PATTERN_WAIT_TIMER_2_MSB_REG); + PATTERN_WAIT_TIMER_2_MSB_REG); break; #ifndef MYTHEN3D case 3: setU64BitReg(t, PATTERN_WAIT_TIMER_3_LSB_REG, - PATTERN_WAIT_TIMER_3_MSB_REG); + PATTERN_WAIT_TIMER_3_MSB_REG); break; case 4: setU64BitReg(t, PATTERN_WAIT_TIMER_4_LSB_REG, - PATTERN_WAIT_TIMER_4_MSB_REG); + PATTERN_WAIT_TIMER_4_MSB_REG); break; case 5: setU64BitReg(t, PATTERN_WAIT_TIMER_5_LSB_REG, - PATTERN_WAIT_TIMER_5_MSB_REG); + PATTERN_WAIT_TIMER_5_MSB_REG); break; #endif default: @@ -777,7 +777,7 @@ int loadPattern(char *message, enum TLogLevel printLevel, } } // iocontrol -#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) //TODO +#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) // TODO if (ret == OK) { ret = validate_writePatternIOControl(message, pat->ioctrl); } @@ -837,7 +837,7 @@ int getPattern(char *message, patternParameters *pat) { pat->word[i] = retval64; } // iocontrol -#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) //TODO +#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) // TODO if (ret == OK) { validate_readPatternIOControl(); } @@ -973,7 +973,7 @@ int loadPatternFile(char *patFname, char *errMessage) { } // patioctrl -#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) //TODO +#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) // TODO if (!strncmp(line, "patioctrl", strlen("patioctrl"))) { uint64_t arg = 0; diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index d000f5149..2bd34870b 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -7,7 +7,8 @@ #include "sls/sls_detector_funcs.h" #include "slsDetectorFunctionList.h" -#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) || defined(MYTHEN3D) +#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) || \ + defined(MYTHEN3D) #include "Pattern.h" #include "loadPattern.h" #endif @@ -2877,7 +2878,8 @@ int get_frames_left(int file_des) { int64_t retval = -1; #if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \ - !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && !defined(XILINX_CHIPTESTBOARDD) + !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && \ + !defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // get only @@ -2893,7 +2895,8 @@ int get_triggers_left(int file_des) { int64_t retval = -1; #if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \ - !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && !defined(XILINX_CHIPTESTBOARDD) + !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && \ + !defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // get only @@ -3063,7 +3066,8 @@ int set_dynamic_range(int file_des) { case 32: #endif #if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ - defined(CHIPTESTBOARDD) || defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD) + defined(CHIPTESTBOARDD) || defined(GOTTHARD2D) || \ + defined(XILINX_CHIPTESTBOARDD) case 16: #endif if (dr >= 0) { @@ -3336,7 +3340,8 @@ int set_pattern_word(int file_des) { if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else int addr = (int)args[0]; @@ -3364,7 +3369,8 @@ int set_pattern_loop_addresses(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -3410,7 +3416,8 @@ int set_pattern_loop_cycles(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -3439,7 +3446,8 @@ int set_pattern_wait_addr(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -3468,7 +3476,8 @@ int set_pattern_wait_time(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = (int)args[0]; @@ -3498,7 +3507,8 @@ int set_pattern_mask(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Set Pattern Mask to %d\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -3526,7 +3536,8 @@ int get_pattern_mask(int file_des) { LOG(logDEBUG1, ("Get Pattern Mask\n")); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else // only get @@ -3547,7 +3558,8 @@ int set_pattern_bit_mask(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Set Pattern Bit Mask to %d\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -3576,7 +3588,8 @@ int get_pattern_bit_mask(int file_des) { LOG(logDEBUG1, ("Get Pattern Bit Mask\n")); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else // only get @@ -3599,7 +3612,8 @@ int write_adc_register(int file_des) { uint32_t val = args[1]; LOG(logDEBUG1, ("Writing 0x%x to ADC Register 0x%x\n", val, addr)); -#if defined(EIGERD) || defined(GOTTHARD2D) || defined(MYTHEN3D) || defined(XILINX_CHIPTESTBOARDD) +#if defined(EIGERD) || defined(GOTTHARD2D) || defined(MYTHEN3D) || \ + defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else #ifndef VIRTUAL @@ -3994,7 +4008,7 @@ int reset_fpga(int file_des) { LOG(logDEBUG1, ("Reset FPGA\n")); #if defined(EIGERD) || defined(GOTTHARDD) || defined(GOTTHARD2D) || \ - defined(MYTHEN3D) || defined (XILINX_CHIPTESTBOARDD) + defined(MYTHEN3D) || defined(XILINX_CHIPTESTBOARDD) functionNotImplemented(); #else // only set @@ -7794,7 +7808,8 @@ int set_pattern(int file_des) { char args[MAX_STR_LENGTH]; memset(args, 0, MAX_STR_LENGTH); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else @@ -7831,7 +7846,8 @@ int get_pattern_file(int file_des) { LOG(logDEBUG1, ("Getting pattern file name\n")); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -7845,7 +7861,8 @@ int get_pattern(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \ + !defined(MYTHEN3D) functionNotImplemented(); return Server_SendResult(file_des, INT32, NULL, 0); #else @@ -10497,7 +10514,7 @@ int get_hardware_version(int file_des) { getHardwareVersion(retvals); LOG(logDEBUG1, ("hardware version retval: %s\n", retvals)); - + return Server_SendResult(file_des, OTHER, retvals, sizeof(retvals)); } diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h index 1a61383bb..6055a2c94 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/RegisterDefs.h @@ -2,78 +2,60 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package #pragma once - - #define CTRLREG1 (0x0) - #define CTRLREG2 (0x4) - #define STATUSREG1 (0x8) - #define STATUSREG2 (0xC) - #define FPGAVERSIONREG (0x10) #define COMPDATE_OFST (0) #define COMPDATE_MSK (0x00ffffff << COMPDATE_OFST) -#define DETTYPE_OFST (24) -#define DETTYPE_MSK (0x000000ff << DETTYPE_OFST) - +#define DETTYPE_OFST (24) +#define DETTYPE_MSK (0x000000ff << DETTYPE_OFST) #define EMPTY14REG (0x14) - #define EMPTY18REG (0x18) - #define EMPTY1CREG (0x1C) - #define EMPTY20REG (0x20) - #define EMPTY24REG (0x24) - #define PKTPACKETLENGTHREG (0x28) -#define PACKETLENGTH1G_OFST (0) -#define PACKETLENGTH1G_MSK (0x0000ffff << PACKETLENGTH1G_OFST) +#define PACKETLENGTH1G_OFST (0) +#define PACKETLENGTH1G_MSK (0x0000ffff << PACKETLENGTH1G_OFST) #define PACKETLENGTH10G_OFST (16) #define PACKETLENGTH10G_MSK (0x0000ffff << PACKETLENGTH10G_OFST) - #define EMPTY2CREG (0x2C) - #define PKTNOPACKETSREG (0x30) -#define NOPACKETS1G_OFST (0) -#define NOPACKETS1G_MSK (0x0000003f << NOPACKETS1G_OFST) +#define NOPACKETS1G_OFST (0) +#define NOPACKETS1G_MSK (0x0000003f << NOPACKETS1G_OFST) #define NOPACKETS10G_OFST (16) #define NOPACKETS10G_MSK (0x0000003f << NOPACKETS10G_OFST) - #define EMPTY34REG (0x34) - #define PKTCTRLREG (0x38) -#define NOSERVERS_OFST (0) -#define NOSERVERS_MSK (0x0000003f << NOSERVERS_OFST) +#define NOSERVERS_OFST (0) +#define NOSERVERS_MSK (0x0000003f << NOSERVERS_OFST) #define SERVERSTART_OFST (8) #define SERVERSTART_MSK (0x0000001f << SERVERSTART_OFST) -#define ETHINTERF_OFST (16) -#define ETHINTERF_MSK (0x00000001 << ETHINTERF_OFST) - +#define ETHINTERF_OFST (16) +#define ETHINTERF_MSK (0x00000001 << ETHINTERF_OFST) #define EMPTY3CREG (0x3C) - #define PKTCOORDREG1 (0x40) #define COORDX_OFST (0) @@ -81,1268 +63,906 @@ #define COORDY_OFST (16) #define COORDY_MSK (0x0000ffff << COORDY_OFST) - #define EMPTY44REG (0x44) - #define PKTCOORDREG2 (0x48) #define COORDZ_OFST (0) #define COORDZ_MSK (0x0000ffff << COORDZ_OFST) - #define EMPTY4CREG (0x4C) - #define EMPTY50REG (0x50) - #define EMPTY54REG (0x54) - #define EMPTY58REG (0x58) - #define EMPTY5CREG (0x5C) - #define EMPTY60REG (0x60) - #define EMPTY64REG (0x64) - #define EMPTY68REG (0x68) - #define EMPTY6CREG (0x6C) - #define EMPTY70REG (0x70) - #define EMPTY74REG (0x74) - #define EMPTY78REG (0x78) - #define EMPTY7CREG (0x7C) - #define EMPTY80REG (0x80) - #define EMPTY84REG (0x84) - #define EMPTY88REG (0x88) - #define EMPTY8CREG (0x8C) - #define EMPTY90REG (0x90) - #define EMPTY94REG (0x94) - #define EMPTY98REG (0x98) - #define EMPTY9CREG (0x9C) - #define FLOWSTATUSREG (0x100) -#define RSMBUSY_OFST (0) -#define RSMBUSY_MSK (0x00000001 << RSMBUSY_OFST) +#define RSMBUSY_OFST (0) +#define RSMBUSY_MSK (0x00000001 << RSMBUSY_OFST) #define RSMTRGWAIT_OFST (3) #define RSMTRGWAIT_MSK (0x00000001 << RSMTRGWAIT_OFST) -#define CSMBUSY_OFST (17) -#define CSMBUSY_MSK (0x00000001 << CSMBUSY_OFST) - +#define CSMBUSY_OFST (17) +#define CSMBUSY_MSK (0x00000001 << CSMBUSY_OFST) #define EMPTY104REG (0x104) - #define FLOWCONTROLREG (0x108) -#define STARTF_OFST (0) -#define STARTF_MSK (0x00000001 << STARTF_OFST) -#define STOPF_OFST (1) -#define STOPF_MSK (0x00000001 << STOPF_OFST) -#define RSTF_OFST (2) -#define RSTF_MSK (0x00000001 << RSTF_OFST) -#define SWTRIGGERF_OFST (3) -#define SWTRIGGERF_MSK (0x00000001 << SWTRIGGERF_OFST) +#define STARTF_OFST (0) +#define STARTF_MSK (0x00000001 << STARTF_OFST) +#define STOPF_OFST (1) +#define STOPF_MSK (0x00000001 << STOPF_OFST) +#define RSTF_OFST (2) +#define RSTF_MSK (0x00000001 << RSTF_OFST) +#define SWTRIGGERF_OFST (3) +#define SWTRIGGERF_MSK (0x00000001 << SWTRIGGERF_OFST) #define TRIGGERENABLE_OFST (4) #define TRIGGERENABLE_MSK (0x00000001 << TRIGGERENABLE_OFST) - #define EMPTY10CREG (0x10C) - #define TIMEFROMSTARTOUTREG1 (0x110) - #define TIMEFROMSTARTOUTREG2 (0x114) - #define FRAMESFROMSTARTOUTREG1 (0x118) - #define FRAMESFROMSTARTOUTREG2 (0x11C) - #define FRAMETIMEOUTREG1 (0x120) - #define FRAMETIMEOUTREG2 (0x124) - #define DELAYOUTREG1 (0x128) - #define DELAYOUTREG2 (0x12C) - #define CYCLESOUTREG1 (0x130) - #define CYCLESOUTREG2 (0x134) - #define FRAMESOUTREG1 (0x138) - #define FRAMESOUTREG2 (0x13C) - #define PERIODOUTREG1 (0x140) - #define PERIODOUTREG2 (0x144) - #define DELAYINREG1 (0x148) - #define DELAYINREG2 (0x14C) - #define CYCLESINREG1 (0x150) - #define CYCLESINREG2 (0x154) - #define FRAMESINREG1 (0x158) - #define FRAMESINREG2 (0x15C) - #define PERIODINREG1 (0x160) - #define PERIODINREG2 (0x164) - #define EMPTY168REG (0x168) - #define EMPTY16CREG (0x16C) - #define EMPTY170REG (0x170) - #define EMPTY174REG (0x174) - #define EMPTY178REG (0x178) - #define EMPTY17CREG (0x17C) - #define EMPTY180REG (0x180) - #define EMPTY184REG (0x184) - #define EMPTY188REG (0x188) - #define EMPTY18CREG (0x18C) - #define EMPTY190REG (0x190) - #define EMPTY194REG (0x194) - #define EMPTY198REG (0x198) - #define EMPTY19CREG (0x19C) - #define PATTERN_OUT_LSB_REG (0x200) - #define PATTERN_OUT_MSB_REG (0x204) - #define PATTERN_IN_LSB_REG (0x208) - #define PATTERN_IN_MSB_REG (0x20C) - #define PATTERN_MASK_LSB_REG (0x210) - #define PATTERN_MASK_MSB_REG (0x214) - #define PATTERN_SET_LSB_REG (0x218) - #define PATTERN_SET_MSB_REG (0x21C) - #define PATTERN_CNTRL_REG (0x220) -#define PATTERN_CNTRL_WR_OFST (0) -#define PATTERN_CNTRL_WR_MSK (0x00000001 << PATTERN_CNTRL_WR_OFST) -#define PATTERN_CNTRL_RD_OFST (1) -#define PATTERN_CNTRL_RD_MSK (0x00000001 << PATTERN_CNTRL_RD_OFST) +#define PATTERN_CNTRL_WR_OFST (0) +#define PATTERN_CNTRL_WR_MSK (0x00000001 << PATTERN_CNTRL_WR_OFST) +#define PATTERN_CNTRL_RD_OFST (1) +#define PATTERN_CNTRL_RD_MSK (0x00000001 << PATTERN_CNTRL_RD_OFST) #define PATTERN_CNTRL_ADDR_OFST (16) #define PATTERN_CNTRL_ADDR_MSK (0x00001fff << PATTERN_CNTRL_ADDR_OFST) - #define EMPTY224REG (0x224) - #define PATTERN_LIMIT_REG (0x228) #define PATTERN_LIMIT_STRT_OFST (0) #define PATTERN_LIMIT_STRT_MSK (0x00001fff << PATTERN_LIMIT_STRT_OFST) -#define PATTERN_LIMIT_STP_OFST (16) -#define PATTERN_LIMIT_STP_MSK (0x00001fff << PATTERN_LIMIT_STP_OFST) - +#define PATTERN_LIMIT_STP_OFST (16) +#define PATTERN_LIMIT_STP_MSK (0x00001fff << PATTERN_LIMIT_STP_OFST) #define EMPTY22CREG (0x22C) - #define PATTERN_LOOP_0_ADDR_REG (0x230) #define PATTERN_LOOP_0_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_0_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_0_ADDR_STRT_OFST) +#define PATTERN_LOOP_0_ADDR_STRT_MSK \ + (0x00001fff << PATTERN_LOOP_0_ADDR_STRT_OFST) #define PATTERN_LOOP_0_ADDR_STP_OFST (16) #define PATTERN_LOOP_0_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_0_ADDR_STP_OFST) - #define EMPTY234REG (0x234) - #define PATTERN_LOOP_0_ITERATION_REG (0x238) - #define EMPTY23CREG (0x23C) - #define PATTERN_WAIT_0_ADDR_REG (0x240) #define PATTERN_WAIT_0_ADDR_OFST (0) #define PATTERN_WAIT_0_ADDR_MSK (0x00001fff << PATTERN_WAIT_0_ADDR_OFST) - #define EMPTY244REG (0x244) - #define PATTERN_WAIT_TIMER_0_LSB_REG (0x248) - #define PATTERN_WAIT_TIMER_0_MSB_REG (0x24C) - #define PATTERN_LOOP_1_ADDR_REG (0x250) #define PATTERN_LOOP_1_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_1_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_1_ADDR_STRT_OFST) +#define PATTERN_LOOP_1_ADDR_STRT_MSK \ + (0x00001fff << PATTERN_LOOP_1_ADDR_STRT_OFST) #define PATTERN_LOOP_1_ADDR_STP_OFST (16) #define PATTERN_LOOP_1_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_1_ADDR_STP_OFST) - #define EMPTY254REG (0x254) - #define PATTERN_LOOP_1_ITERATION_REG (0x258) - #define EMPTY25CREG (0x25C) - #define PATTERN_WAIT_1_ADDR_REG (0x260) #define PATTERN_WAIT_1_ADDR_OFST (0) #define PATTERN_WAIT_1_ADDR_MSK (0x00001fff << PATTERN_WAIT_1_ADDR_OFST) - #define EMPTY264REG (0x264) - #define PATTERN_WAIT_TIMER_1_LSB_REG (0x268) - #define PATTERN_WAIT_TIMER_1_MSB_REG (0x26C) - #define PATTERN_LOOP_2_ADDR_REG (0x270) #define PATTERN_LOOP_2_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_2_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_2_ADDR_STRT_OFST) +#define PATTERN_LOOP_2_ADDR_STRT_MSK \ + (0x00001fff << PATTERN_LOOP_2_ADDR_STRT_OFST) #define PATTERN_LOOP_2_ADDR_STP_OFST (16) #define PATTERN_LOOP_2_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_2_ADDR_STP_OFST) - #define EMPTY274REG (0x274) - #define PATTERN_LOOP_2_ITERATION_REG (0x278) - #define EMPTY27CREG (0x27C) - #define PATTERN_WAIT_2_ADDR_REG (0x280) #define PATTERN_WAIT_2_ADDR_OFST (0) #define PATTERN_WAIT_2_ADDR_MSK (0x00001fff << PATTERN_WAIT_2_ADDR_OFST) - #define EMPTY284REG (0x284) - #define PATTERN_WAIT_TIMER_2_LSB_REG (0x288) - #define PATTERN_WAIT_TIMER_2_MSB_REG (0x28C) - #define PATTERN_LOOP_3_ADDR_REG (0x290) #define PATTERN_LOOP_3_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_3_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_3_ADDR_STRT_OFST) +#define PATTERN_LOOP_3_ADDR_STRT_MSK \ + (0x00001fff << PATTERN_LOOP_3_ADDR_STRT_OFST) #define PATTERN_LOOP_3_ADDR_STP_OFST (16) #define PATTERN_LOOP_3_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_3_ADDR_STP_OFST) - #define EMPTY294REG (0x294) - #define PATTERN_LOOP_3_ITERATION_REG (0x298) - #define EMPTY29CREG (0x29C) - #define PATTERN_WAIT_3_ADDR_REG (0x300) #define PATTERN_WAIT_3_ADDR_OFST (0) #define PATTERN_WAIT_3_ADDR_MSK (0x00001fff << PATTERN_WAIT_3_ADDR_OFST) - #define EMPTY304REG (0x304) - #define PATTERN_WAIT_TIMER_3_LSB_REG (0x308) - #define PATTERN_WAIT_TIMER_3_MSB_REG (0x30C) - #define PATTERN_LOOP_4_ADDR_REG (0x310) #define PATTERN_LOOP_4_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_4_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_4_ADDR_STRT_OFST) +#define PATTERN_LOOP_4_ADDR_STRT_MSK \ + (0x00001fff << PATTERN_LOOP_4_ADDR_STRT_OFST) #define PATTERN_LOOP_4_ADDR_STP_OFST (16) #define PATTERN_LOOP_4_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_4_ADDR_STP_OFST) - #define EMPTY314REG (0x314) - #define PATTERN_LOOP_4_ITERATION_REG (0x318) - #define EMPTY31CREG (0x31C) - #define PATTERN_WAIT_4_ADDR_REG (0x320) #define PATTERN_WAIT_4_ADDR_OFST (0) #define PATTERN_WAIT_4_ADDR_MSK (0x00001fff << PATTERN_WAIT_4_ADDR_OFST) - #define EMPTY324REG (0x324) - #define PATTERN_WAIT_TIMER_4_LSB_REG (0x328) - #define PATTERN_WAIT_TIMER_4_MSB_REG (0x32C) - #define PATTERN_LOOP_5_ADDR_REG (0x330) #define PATTERN_LOOP_5_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_5_ADDR_STRT_MSK (0x00001fff << PATTERN_LOOP_5_ADDR_STRT_OFST) +#define PATTERN_LOOP_5_ADDR_STRT_MSK \ + (0x00001fff << PATTERN_LOOP_5_ADDR_STRT_OFST) #define PATTERN_LOOP_5_ADDR_STP_OFST (16) #define PATTERN_LOOP_5_ADDR_STP_MSK (0x00001fff << PATTERN_LOOP_5_ADDR_STP_OFST) - #define EMPTY334REG (0x334) - #define PATTERN_LOOP_5_ITERATION_REG (0x338) - #define EMPTY33CREG (0x33C) - #define PATTERN_WAIT_5_ADDR_REG (0x340) #define PATTERN_WAIT_5_ADDR_OFST (0) #define PATTERN_WAIT_5_ADDR_MSK (0x00001fff << PATTERN_WAIT_5_ADDR_OFST) - #define EMPTY344REG (0x344) - #define PATTERN_WAIT_TIMER_5_LSB_REG (0x348) - #define PATTERN_WAIT_TIMER_5_MSB_REG (0x34C) - #define PINIOCTRLREG (0x350) - #define EMPTY354REG (0x354) - #define EMPTY358REG (0x358) - #define EMPTY35CREG (0x35C) - #define EMPTY360REG (0x360) - #define EMPTY364REG (0x364) - #define EMPTY368REG (0x368) - #define EMPTY36CREG (0x36C) - #define EMPTY370REG (0x370) - #define EMPTY374REG (0x374) - #define EMPTY378REG (0x378) - #define EMPTY37CREG (0x37C) - #define EMPTY380REG (0x380) - #define EMPTY384REG (0x384) - #define EMPTY388REG (0x388) - #define EMPTY38CREG (0x38C) - #define EMPTY390REG (0x390) - #define EMPTY394REG (0x394) - #define EMPTY398REG (0x398) - #define EMPTY39CREG (0x39C) - #define EMPTY3A0REG (0x3A0) - #define EMPTY3A4REG (0x3A4) - #define EMPTY3A8REG (0x3A8) - #define EMPTY3ACREG (0x3AC) - #define EMPTY3B0REG (0x3B0) - #define EMPTY3B4REG (0x3B4) - #define EMPTY3B8REG (0x3B8) - #define EMPTY3BCREG (0x3BC) - #define EMPTY3C0REG (0x3C0) - #define EMPTY3C4REG (0x3C4) - #define EMPTY3C8REG (0x3C8) - #define EMPTY3CCREG (0x3CC) - #define EMPTY3D0REG (0x3D0) - #define EMPTY3D4REG (0x3D4) - #define EMPTY3D8REG (0x3D8) - #define EMPTY3DCREG (0x3DC) - #define EMPTY3E0REG (0x3E0) - #define EMPTY3E4REG (0x3E4) - #define EMPTY3E8REG (0x3E8) - #define EMPTY3ECREG (0x3EC) - #define EMPTY3F0REG (0x3F0) - #define EMPTY3F4REG (0x3F4) - #define EMPTY3F8REG (0x3F8) - #define EMPTY3FCREG (0x3FC) - #define EXPCTRLREG (0x400) #define STARTP_OFST (0) #define STARTP_MSK (0x00000001 << STARTP_OFST) - #define EMPTY404REG (0x404) - #define EXPFRAMESREG (0x408) - #define EMPTY40CREG (0x40C) - #define EXPTIMEREG (0x410) - #define EMPTY414REG (0x414) - #define EMPTY418REG (0x418) - #define EMPTY41CREG (0x41C) - #define EMPTY420REG (0x420) - #define EMPTY424REG (0x424) - #define EMPTY428REG (0x428) - #define EMPTY42CREG (0x42C) - #define EMPTY430REG (0x430) - #define EMPTY434REG (0x434) - #define EMPTY438REG (0x438) - #define EMPTY43CREG (0x43C) - #define EMPTY440REG (0x440) - #define EMPTY444REG (0x444) - #define EMPTY448REG (0x448) - #define EMPTY44CREG (0x44C) - #define EMPTY450REG (0x450) - #define EMPTY454REG (0x454) - #define EMPTY458REG (0x458) - #define EMPTY45CREG (0x45C) - #define EMPTY460REG (0x460) - #define EMPTY464REG (0x464) - #define EMPTY468REG (0x468) - #define EMPTY46CREG (0x46C) - #define EMPTY470REG (0x470) - #define EMPTY474REG (0x474) - #define EMPTY478REG (0x478) - #define EMPTY47CREG (0x47C) - #define EMPTY480REG (0x480) - #define EMPTY484REG (0x484) - #define EMPTY488REG (0x488) - #define EMPTY48CREG (0x48C) - #define EMPTY490REG (0x490) - #define EMPTY494REG (0x494) - #define EMPTY498REG (0x498) - #define EMPTY49CREG (0x49C) - #define EMPTY4A0REG (0x4A0) - #define EMPTY4A4REG (0x4A4) - #define EMPTY4A8REG (0x4A8) - #define EMPTY4ACREG (0x4AC) - #define EMPTY4B0REG (0x4B0) - #define EMPTY4B4REG (0x4B4) - #define EMPTY4B8REG (0x4B8) - #define EMPTY4BCREG (0x4BC) - #define EMPTY4C0REG (0x4C0) - #define EMPTY4C4REG (0x4C4) - #define EMPTY4C8REG (0x4C8) - #define EMPTY4CCREG (0x4CC) - #define EMPTY4D0REG (0x4D0) - #define EMPTY4D4REG (0x4D4) - #define EMPTY4D8REG (0x4D8) - #define EMPTY4DCREG (0x4DC) - #define EMPTY4E0REG (0x4E0) - #define EMPTY4E4REG (0x4E4) - #define EMPTY4E8REG (0x4E8) - #define EMPTY4ECREG (0x4EC) - #define EMPTY4F0REG (0x4F0) - #define EMPTY4F4REG (0x4F4) - #define EMPTY4F8REG (0x4F8) - #define EMPTY4FCREG (0x4FC) - #define FIFOTOGBCONTROLREG (0x500) -#define ENABLEDCHANNELS_OFST (0) -#define ENABLEDCHANNELS_MSK (0x00001fff << ENABLEDCHANNELS_OFST) -#define ROMODE_OFST (13) -#define ROMODE_MSK (0x00000007 << ROMODE_OFST) +#define ENABLEDCHANNELS_OFST (0) +#define ENABLEDCHANNELS_MSK (0x00001fff << ENABLEDCHANNELS_OFST) +#define ROMODE_OFST (13) +#define ROMODE_MSK (0x00000007 << ROMODE_OFST) #define COUNTFRAMESFROMUPDATE_OFST (16) #define COUNTFRAMESFROMUPDATE_MSK (0x00000001 << COUNTFRAMESFROMUPDATE_OFST) -#define STARTSTREAMING_P_OFST (17) -#define STARTSTREAMING_P_MSK (0x00000001 << STARTSTREAMING_P_OFST) - +#define STARTSTREAMING_P_OFST (17) +#define STARTSTREAMING_P_MSK (0x00000001 << STARTSTREAMING_P_OFST) #define EMPTY504REG (0x504) - #define NOSAMPLESDREG (0x508) #define NOSAMPLESD_OFST (0) #define NOSAMPLESD_MSK (0x00003fff << NOSAMPLESD_OFST) - #define EMPTY50CREG (0x50C) - #define NOSAMPLESAREG (0x510) #define NOSAMPLESA_OFST (0) #define NOSAMPLESA_MSK (0x00003fff << NOSAMPLESA_OFST) - #define EMPTY514REG (0x514) - #define NOSAMPLESXREG (0x518) #define NOSAMPLESX_OFST (0) #define NOSAMPLESX_MSK (0x00001fff << NOSAMPLESX_OFST) - #define EMPTY51CREG (0x51C) - #define COUNTFRAMESFROMREG1 (0x520) - #define COUNTFRAMESFROMREG2 (0x524) - #define LOCALFRAMENUMBERREG1 (0x528) - #define LOCALFRAMENUMBERREG2 (0x52C) - #define EMPTY530REG (0x530) - #define EMPTY534REG (0x534) - #define EMPTY538REG (0x538) - #define EMPTY53CREG (0x53C) - #define EMPTY540REG (0x540) - #define EMPTY544REG (0x544) - #define EMPTY548REG (0x548) - #define EMPTY54CREG (0x54C) - #define EMPTY550REG (0x550) - #define EMPTY554REG (0x554) - #define EMPTY558REG (0x558) - #define EMPTY55CREG (0x55C) - #define EMPTY560REG (0x560) - #define EMPTY564REG (0x564) - #define EMPTY568REG (0x568) - #define EMPTY56CREG (0x56C) - #define EMPTY570REG (0x570) - #define EMPTY574REG (0x574) - #define EMPTY578REG (0x578) - #define EMPTY57CREG (0x57C) - #define EMPTY580REG (0x580) - #define EMPTY584REG (0x584) - #define EMPTY588REG (0x588) - #define EMPTY58CREG (0x58C) - #define EMPTY590REG (0x590) - #define EMPTY594REG (0x594) - #define EMPTY598REG (0x598) - #define EMPTY59CREG (0x59C) - #define EMPTY5A0REG (0x5A0) - #define EMPTY5A4REG (0x5A4) - #define EMPTY5A8REG (0x5A8) - #define EMPTY5ACREG (0x5AC) - #define EMPTY5B0REG (0x5B0) - #define EMPTY5B4REG (0x5B4) - #define EMPTY5B8REG (0x5B8) - #define EMPTY5BCREG (0x5BC) - #define EMPTY5C0REG (0x5C0) - #define EMPTY5C4REG (0x5C4) - #define EMPTY5C8REG (0x5C8) - #define EMPTY5CCREG (0x5CC) - #define EMPTY5D0REG (0x5D0) - #define EMPTY5D4REG (0x5D4) - #define EMPTY5D8REG (0x5D8) - #define EMPTY5DCREG (0x5DC) - #define EMPTY5E0REG (0x5E0) - #define EMPTY5E4REG (0x5E4) - #define EMPTY5E8REG (0x5E8) - #define EMPTY5ECREG (0x5EC) - #define EMPTY5F0REG (0x5F0) - #define EMPTY5F4REG (0x5F4) - #define EMPTY5F8REG (0x5F8) - #define EMPTY5FCREG (0x5FC) - #define MATTERHORNSPIREG1 (0x600) - #define MATTERHORNSPIREG2 (0x604) - #define MATTERHORNSPICTRL (0x608) #define MATTERHORNSPICTRL_EN_OFST (0) #define MATTERHORNSPICTRL_EN_MSK (0x00000001 << MATTERHORNSPICTRL_EN_OFST) -#define CONFIGSTART_OFST (1) -#define CONFIGSTART_MSK (0x00000001 << CONFIGSTART_OFST) -#define START_P_OFST (2) -#define START_P_MSK (0x00000001 << START_P_OFST) -#define STARTREAD_P_OFST (3) -#define STARTREAD_P_MSK (0x00000001 << STARTREAD_P_OFST) -#define BUSY_OFST (4) -#define BUSY_MSK (0x00000001 << BUSY_OFST) - +#define CONFIGSTART_OFST (1) +#define CONFIGSTART_MSK (0x00000001 << CONFIGSTART_OFST) +#define START_P_OFST (2) +#define START_P_MSK (0x00000001 << START_P_OFST) +#define STARTREAD_P_OFST (3) +#define STARTREAD_P_MSK (0x00000001 << STARTREAD_P_OFST) +#define BUSY_OFST (4) +#define BUSY_MSK (0x00000001 << BUSY_OFST) #define EMPTY60CREG (0x60C) - #define EMPTY610REG (0x610) - #define EMPTY614REG (0x614) - #define EMPTY618REG (0x618) - #define EMPTY61CREG (0x61C) - #define EMPTY620REG (0x620) - #define EMPTY624REG (0x624) - #define EMPTY628REG (0x628) - #define EMPTY62CREG (0x62C) - #define TRANSCEIVERRXCTRL0REG1 (0x630) - #define TRANSCEIVERRXCTRL0REG2 (0x634) - #define TRANSCEIVERRXCTRL1REG1 (0x638) - #define TRANSCEIVERRXCTRL1REG2 (0x63C) - #define TRANSCEIVERRXCTRL2REG (0x640) - #define EMPTY644REG (0x644) - #define TRANSCEIVERRXCTRL3REG (0x648) - #define EMPTY64CREG (0x64C) - #define TRANSCEIVERSTATUS (0x650) #define LINKDOWNLATCHEDOUT_OFST (0) #define LINKDOWNLATCHEDOUT_MSK (0x00000001 << LINKDOWNLATCHEDOUT_OFST) -#define TXUSERCLKACTIVE_OFST (1) -#define TXUSERCLKACTIVE_MSK (0x00000001 << TXUSERCLKACTIVE_OFST) -#define RXUSERCLKACTIVE_OFST (2) -#define RXUSERCLKACTIVE_MSK (0x00000001 << RXUSERCLKACTIVE_OFST) -#define RXCOMMADET_OFST (3) -#define RXCOMMADET_MSK (0x0000000f << RXCOMMADET_OFST) -#define RXBYTEREALIGN_OFST (7) -#define RXBYTEREALIGN_MSK (0x0000000f << RXBYTEREALIGN_OFST) -#define RXBYTEISALIGNED_OFST (11) -#define RXBYTEISALIGNED_MSK (0x0000000f << RXBYTEISALIGNED_OFST) -#define GTWIZRXCDRSTABLE_OFST (15) -#define GTWIZRXCDRSTABLE_MSK (0x00000001 << GTWIZRXCDRSTABLE_OFST) -#define RESETTXDONE_OFST (16) -#define RESETTXDONE_MSK (0x00000001 << RESETTXDONE_OFST) -#define RESETRXDONE_OFST (17) -#define RESETRXDONE_MSK (0x00000001 << RESETRXDONE_OFST) -#define RXPMARESETDONE_OFST (18) -#define RXPMARESETDONE_MSK (0x0000000f << RXPMARESETDONE_OFST) -#define TXPMARESETDONE_OFST (22) -#define TXPMARESETDONE_MSK (0x0000000f << TXPMARESETDONE_OFST) -#define GTTPOWERGOOD_OFST (26) -#define GTTPOWERGOOD_MSK (0x0000000f << GTTPOWERGOOD_OFST) - +#define TXUSERCLKACTIVE_OFST (1) +#define TXUSERCLKACTIVE_MSK (0x00000001 << TXUSERCLKACTIVE_OFST) +#define RXUSERCLKACTIVE_OFST (2) +#define RXUSERCLKACTIVE_MSK (0x00000001 << RXUSERCLKACTIVE_OFST) +#define RXCOMMADET_OFST (3) +#define RXCOMMADET_MSK (0x0000000f << RXCOMMADET_OFST) +#define RXBYTEREALIGN_OFST (7) +#define RXBYTEREALIGN_MSK (0x0000000f << RXBYTEREALIGN_OFST) +#define RXBYTEISALIGNED_OFST (11) +#define RXBYTEISALIGNED_MSK (0x0000000f << RXBYTEISALIGNED_OFST) +#define GTWIZRXCDRSTABLE_OFST (15) +#define GTWIZRXCDRSTABLE_MSK (0x00000001 << GTWIZRXCDRSTABLE_OFST) +#define RESETTXDONE_OFST (16) +#define RESETTXDONE_MSK (0x00000001 << RESETTXDONE_OFST) +#define RESETRXDONE_OFST (17) +#define RESETRXDONE_MSK (0x00000001 << RESETRXDONE_OFST) +#define RXPMARESETDONE_OFST (18) +#define RXPMARESETDONE_MSK (0x0000000f << RXPMARESETDONE_OFST) +#define TXPMARESETDONE_OFST (22) +#define TXPMARESETDONE_MSK (0x0000000f << TXPMARESETDONE_OFST) +#define GTTPOWERGOOD_OFST (26) +#define GTTPOWERGOOD_MSK (0x0000000f << GTTPOWERGOOD_OFST) #define EMPTY654REG (0x654) - #define TRANSCEIVERCONTROL (0x658) -#define GTWIZRESETALL_OFST (0) -#define GTWIZRESETALL_MSK (0x00000001 << GTWIZRESETALL_OFST) +#define GTWIZRESETALL_OFST (0) +#define GTWIZRESETALL_MSK (0x00000001 << GTWIZRESETALL_OFST) #define RESETTXPLLANDDATAPATH_OFST (1) #define RESETTXPLLANDDATAPATH_MSK (0x00000001 << RESETTXPLLANDDATAPATH_OFST) -#define RESETTXDATAPATHIN_OFST (2) -#define RESETTXDATAPATHIN_MSK (0x00000001 << RESETTXDATAPATHIN_OFST) +#define RESETTXDATAPATHIN_OFST (2) +#define RESETTXDATAPATHIN_MSK (0x00000001 << RESETTXDATAPATHIN_OFST) #define RESETRXPLLANDDATAPATH_OFST (3) #define RESETRXPLLANDDATAPATH_MSK (0x00000001 << RESETRXPLLANDDATAPATH_OFST) -#define RESETRXDATAPATHIN_OFST (4) -#define RESETRXDATAPATHIN_MSK (0x00000001 << RESETRXDATAPATHIN_OFST) - +#define RESETRXDATAPATHIN_OFST (4) +#define RESETRXDATAPATHIN_MSK (0x00000001 << RESETRXDATAPATHIN_OFST) #define EMPTY65CREG (0x65C) - #define EMPTY660REG (0x660) - #define EMPTY664REG (0x664) - #define EMPTY668REG (0x668) - #define EMPTY66CREG (0x66C) - #define EMPTY670REG (0x670) - #define EMPTY674REG (0x674) - #define EMPTY678REG (0x678) - #define EMPTY67CREG (0x67C) - #define EMPTY680REG (0x680) - #define EMPTY684REG (0x684) - #define EMPTY688REG (0x688) - #define EMPTY68CREG (0x68C) - #define EMPTY690REG (0x690) - #define EMPTY694REG (0x694) - #define EMPTY698REG (0x698) - #define EMPTY69CREG (0x69C) - #define EMPTY6A0REG (0x6A0) - #define EMPTY6A4REG (0x6A4) - #define EMPTY6A8REG (0x6A8) - #define EMPTY6ACREG (0x6AC) - #define EMPTY6B0REG (0x6B0) - #define EMPTY6B4REG (0x6B4) - #define EMPTY6B8REG (0x6B8) - #define EMPTY6BCREG (0x6BC) - #define EMPTY6C0REG (0x6C0) - #define EMPTY6C4REG (0x6C4) - #define EMPTY6C8REG (0x6C8) - #define EMPTY6CCREG (0x6CC) - #define EMPTY6D0REG (0x6D0) - #define EMPTY6D4REG (0x6D4) - #define EMPTY6D8REG (0x6D8) - #define EMPTY6DCREG (0x6DC) - #define EMPTY6E0REG (0x6E0) - #define EMPTY6E4REG (0x6E4) - #define EMPTY6E8REG (0x6E8) - #define EMPTY6ECREG (0x6EC) - #define EMPTY6F0REG (0x6F0) - #define EMPTY6F4REG (0x6F4) - #define EMPTY6F8REG (0x6F8) - #define EMPTY6FCREG (0x6FC) - #define DBITFIFOCTRLREG (0x700) -#define DBITRD_OFST (0) -#define DBITRD_MSK (0x00000001 << DBITRD_OFST) -#define DBITRST_OFST (1) -#define DBITRST_MSK (0x00000001 << DBITRST_OFST) -#define DBITFULL_OFST (2) -#define DBITFULL_MSK (0x00000001 << DBITFULL_OFST) -#define DBITEMPTY_OFST (3) -#define DBITEMPTY_MSK (0x00000001 << DBITEMPTY_OFST) +#define DBITRD_OFST (0) +#define DBITRD_MSK (0x00000001 << DBITRD_OFST) +#define DBITRST_OFST (1) +#define DBITRST_MSK (0x00000001 << DBITRST_OFST) +#define DBITFULL_OFST (2) +#define DBITFULL_MSK (0x00000001 << DBITFULL_OFST) +#define DBITEMPTY_OFST (3) +#define DBITEMPTY_MSK (0x00000001 << DBITEMPTY_OFST) #define DBITUNDERFLOW_OFST (4) #define DBITUNDERFLOW_MSK (0x00000001 << DBITUNDERFLOW_OFST) -#define DBITOVERFLOW_OFST (5) -#define DBITOVERFLOW_MSK (0x00000001 << DBITOVERFLOW_OFST) - +#define DBITOVERFLOW_OFST (5) +#define DBITOVERFLOW_MSK (0x00000001 << DBITOVERFLOW_OFST) #define EMPTYREG (0x704) - #define DBITFIFODATAREG1 (0x708) - #define DBITFIFODATAREG2 (0x70C) - #define EMPTY710REG (0x710) - #define EMPTY714REG (0x714) - #define EMPTY718REG (0x718) - #define EMPTY71CREG (0x71C) - #define EMPTY720REG (0x720) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c index fd205e545..589693c22 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c @@ -9,11 +9,9 @@ #include "loadPattern.h" - +#include // INET_ADDRSTRLEN #include #include // usleep -#include // INET_ADDRSTRLEN - // Global variable from slsDetectorServer_funcs extern int debugflag; @@ -91,8 +89,7 @@ int checkType() { #ifdef VIRTUAL return OK; #endif - u_int32_t type = - ((bus_r(FPGAVERSIONREG) & DETTYPE_MSK) >> DETTYPE_OFST); + u_int32_t type = ((bus_r(FPGAVERSIONREG) & DETTYPE_MSK) >> DETTYPE_OFST); if (type != XILINX_CHIPTESTBOARD) { LOG(logERROR, ("This is not a Xilinx CTB firmware (read %d, expected %d)\n", type, @@ -102,7 +99,6 @@ int checkType() { return OK; } - int testFpga() { #ifdef VIRTUAL return OK; @@ -111,7 +107,7 @@ int testFpga() { // fixed pattern int ret = OK; - + /* TODO: FIX PATTERN not defined in firmware uint32_t val = bus_r(FIX_PATT_REG); if (val == FIX_PATT_VAL) { @@ -230,9 +226,7 @@ uint64_t getFirmwareVersion() { return ((bus_r(FPGAVERSIONREG) & COMPDATE_MSK) >> COMPDATE_OFST); } -void getHardwareVersion(char *version) { - strcpy(version, "Not applicable"); -} +void getHardwareVersion(char *version) { strcpy(version, "Not applicable"); } u_int64_t getDetectorMAC() { #ifdef VIRTUAL @@ -323,7 +317,6 @@ void setupDetector() { LOG(logINFOBLUE, ("Setting Default parameters\n")); initializePatternAddresses(); - setNumFrames(DEFAULT_NUM_FRAMES); setNumTriggers(DEFAULT_NUM_CYCLES); setTiming(DEFAULT_TIMING_MODE); @@ -430,8 +423,8 @@ enum runStatus getRunStatus() { LOG(logINFOBLUE, ("Status: IDLE\n")); return IDLE; #endif - //TODO: get status - LOG(logINFOBLUE, ("Status: IDLE\n")); + // TODO: get status + LOG(logINFOBLUE, ("Status: IDLE\n")); return IDLE; } diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h index c26265e38..4e15e20d2 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h @@ -17,12 +17,11 @@ enum ADCINDEX { V_PWR_IO }; enum DACINDEX { D0 }; - /** Default Parameters */ -#define DEFAULT_NUM_FRAMES (1) -#define DEFAULT_NUM_CYCLES (1) -#define DYNAMIC_RANGE (16) -#define DEFAULT_TIMING_MODE (AUTO_TIMING) +#define DEFAULT_NUM_FRAMES (1) +#define DEFAULT_NUM_CYCLES (1) +#define DYNAMIC_RANGE (16) +#define DEFAULT_TIMING_MODE (AUTO_TIMING) /* Defines in the Firmware */ -#define WAIT_TIME_PATTERN_READ (10) \ No newline at end of file +#define WAIT_TIME_PATTERN_READ (10) \ No newline at end of file diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 47a8a4bed..55e7826bb 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -353,10 +353,10 @@ class Detector { Result getTimingMode(Positions pos = {}) const; /** - * [Gotthard][Jungfrau][Moench][Gotthard][CTB][Gotthard2][Xilinx CTB] Options: - * AUTO_TIMING, TRIGGER_EXPOSURE \n - * [Mythen3] Options: AUTO_TIMING, TRIGGER_EXPOSURE, GATED, TRIGGER_GATED \n - * [Eiger] Options: AUTO_TIMING, TRIGGER_EXPOSURE, GATED, BURST_TRIGGER + * [Gotthard][Jungfrau][Moench][Gotthard][CTB][Gotthard2][Xilinx CTB] + * Options: AUTO_TIMING, TRIGGER_EXPOSURE \n [Mythen3] Options: AUTO_TIMING, + * TRIGGER_EXPOSURE, GATED, TRIGGER_GATED \n [Eiger] Options: AUTO_TIMING, + * TRIGGER_EXPOSURE, GATED, BURST_TRIGGER */ void setTimingMode(defs::timingMode value, Positions pos = {}); @@ -1846,17 +1846,17 @@ class Detector { * Pattern * * * * ************************************************/ - /** [CTB][Mythen3][Xilinx CTB] Gets the pattern file name including path of the last - * pattern uploaded. \n Returns an empty if nothing was uploaded or via a - * server default file*/ + /** [CTB][Mythen3][Xilinx CTB] Gets the pattern file name including path of + * the last pattern uploaded. \n Returns an empty if nothing was uploaded or + * via a server default file*/ Result getPatterFileName(Positions pos = {}) const; /** [CTB][Mythen3][Xilinx CTB] Loads ASCII pattern file directly to server * (instead of executing line by line)*/ void setPattern(const std::string &fname, Positions pos = {}); - /** [CTB][Mythen3][Xilinx CTB] Loads pattern parameters structure directly to - * server */ + /** [CTB][Mythen3][Xilinx CTB] Loads pattern parameters structure directly + * to server */ void setPattern(const Pattern &pat, Positions pos = {}); /** [CTB][Mythen3][Xilinx CTB] Saves pattern to file @@ -1915,8 +1915,8 @@ class Detector { /** [CTB][Mythen3][Xilinx CTB] */ Result getPatternMask(Positions pos = {}); - /** [CTB][Mythen3][Xilinx CTB] Selects the bits that will have a pattern mask - * applied to the selected patmask for every pattern. */ + /** [CTB][Mythen3][Xilinx CTB] Selects the bits that will have a pattern + * mask applied to the selected patmask for every pattern. */ void setPatternMask(uint64_t mask, Positions pos = {}); /** [CTB][Mythen3][Xilinx CTB] */ diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp index fa4c278f6..510f0ea8b 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-chiptestboard.cpp @@ -24,7 +24,8 @@ TEST_CASE("CALLER::dacname", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2); std::string str_dac_index = "2"; auto prev = det.getDacName(ind); @@ -58,7 +59,8 @@ TEST_CASE("CALLER::dacindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2); std::string str_dac_index = "2"; @@ -83,7 +85,8 @@ TEST_CASE("CALLER::adclist", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { auto prev = det.getAdcNames(); REQUIRE_THROWS(caller.call("adclist", {"a", "s", "d"}, -1, PUT)); @@ -115,7 +118,8 @@ TEST_CASE("CALLER::adcname", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { int ind = 2; std::string str_adc_index = "2"; auto prev = det.getAdcName(ind); @@ -149,7 +153,8 @@ TEST_CASE("CALLER::adcindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { int ind = 2; std::string str_adc_index = "2"; @@ -174,7 +179,8 @@ TEST_CASE("CALLER::signallist", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { auto prev = det.getSignalNames(); REQUIRE_THROWS(caller.call("signallist", {"a", "s", "d"}, -1, PUT)); @@ -206,7 +212,8 @@ TEST_CASE("CALLER::signalname", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { int ind = 2; std::string str_signal_index = "2"; auto prev = det.getSignalName(ind); @@ -240,7 +247,8 @@ TEST_CASE("CALLER::signalindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { int ind = 2; std::string str_signal_index = "2"; @@ -266,7 +274,8 @@ TEST_CASE("CALLER::powerlist", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { auto prev = det.getPowerNames(); REQUIRE_THROWS(caller.call("powerlist", {"a", "s", "d"}, -1, PUT)); @@ -298,7 +307,8 @@ TEST_CASE("CALLER::powername", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2 + defs::V_POWER_A); std::string str_power_index = "2"; auto prev = det.getPowerName(ind); @@ -332,7 +342,8 @@ TEST_CASE("CALLER::powerindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2 + defs::V_POWER_A); std::string str_power_index = "2"; @@ -382,7 +393,8 @@ TEST_CASE("CALLER::slowadclist", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { auto prev = det.getSlowADCNames(); REQUIRE_THROWS(caller.call("slowadclist", {"a", "s", "d"}, -1, PUT)); @@ -414,7 +426,8 @@ TEST_CASE("CALLER::slowadcname", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2 + defs::SLOW_ADC0); std::string str_slowadc_index = "2"; auto prev = det.getSlowADCName(ind); @@ -449,7 +462,8 @@ TEST_CASE("CALLER::slowadcindex", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { defs::dacIndex ind = static_cast(2 + defs::SLOW_ADC0); std::string str_slowadc_index = "2"; @@ -478,13 +492,15 @@ TEST_CASE("CALLER::dac", "[.cmdcall][.dacs]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { for (int i = 0; i < 18; ++i) { SECTION("dac " + std::to_string(i)) { if (det_type == defs::CHIPTESTBOARD) { test_dac_caller(static_cast(i), "dac", 0); } else { - REQUIRE_THROWS(caller.call("dac", {std::to_string(i)}, -1, GET)); + REQUIRE_THROWS( + caller.call("dac", {std::to_string(i)}, -1, GET)); } } } diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp index 191516f61..275612d89 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-pattern.cpp @@ -23,7 +23,8 @@ TEST_CASE("Caller::patfname", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { REQUIRE_THROWS(caller.call("patfname", {}, -1, PUT)); REQUIRE_NOTHROW(caller.call("patfname", {}, -1, GET)); } else { @@ -35,7 +36,8 @@ TEST_CASE("Caller::pattern", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { // no proper test for put REQUIRE_THROWS(caller.call("pattern", {}, -1, GET)); } else { @@ -47,7 +49,8 @@ TEST_CASE("Caller::savepattern", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { REQUIRE_THROWS( caller.call("savepattern", {"/tmp/pattern.txt"}, -1, GET)); if (det.size() == 1) { @@ -108,7 +111,8 @@ TEST_CASE("Caller::patword", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { int addr = 0x23; std::string saddr = ToStringHex(addr, 4); auto prev_val = det.getPatternWord(addr); @@ -149,7 +153,8 @@ TEST_CASE("Caller::patlimits", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternLoopAddresses(-1); { std::ostringstream oss; @@ -175,7 +180,8 @@ TEST_CASE("Caller::patloop", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -223,7 +229,8 @@ TEST_CASE("Caller::patnloop", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -268,7 +275,8 @@ TEST_CASE("Caller::patwait", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -313,7 +321,8 @@ TEST_CASE("Caller::patwaittime", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -358,7 +367,8 @@ TEST_CASE("Caller::patmask", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternMask(); { std::ostringstream oss; @@ -383,7 +393,8 @@ TEST_CASE("Caller::patsetbit", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternBitMask(); { std::ostringstream oss; diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp index e3429dfc2..e5f996318 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp @@ -177,7 +177,8 @@ TEST_CASE("Caller::rx_missingpackets", "[.cmdcall][.rx]") { } auto det_type = det.getDetectorType().squash(); if (det_type != defs::CHIPTESTBOARD && det_type != defs::MOENCH) { - // 0 missing packets (takes into account that acquisition is stopped) + // 0 missing packets (takes into account that acquisition is + // stopped) det.startReceiver(); det.startDetector(); det.stopDetector(); @@ -236,8 +237,8 @@ TEST_CASE("Caller::rx_hostname", "[.cmdcall][.rx]") { if (det_type != defs::XILINX_CHIPTESTBOARD) { auto prev_val = det.getRxHostname(); - // Cannot set rx_hostname (will reset parameters in rxr and no shm variables - // to update) + // Cannot set rx_hostname (will reset parameters in rxr and no shm + // variables to update) // { // // disable receiver // std::ostringstream oss; @@ -597,20 +598,21 @@ TEST_CASE("Caller::rx_roi", "[.cmdcall]") { } { std::ostringstream oss; - caller.call("rx_roi", {"10", "22", "18", "19"}, -1, PUT, oss); + caller.call("rx_roi", {"10", "22", "18", "19"}, -1, PUT, + oss); REQUIRE(oss.str() == "rx_roi [10, 22, 18, 19]\n"); } { std::ostringstream oss; caller.call("rx_roi", {"1", std::to_string(detsize.x - 5), "1", - std::to_string(detsize.y - 5)}, + std::to_string(detsize.y - 5)}, -1, PUT, oss); REQUIRE(oss.str() == std::string("rx_roi [1, ") + - std::to_string(detsize.x - 5) + - std::string(", 1, ") + - std::to_string(detsize.y - 5) + - std::string("]\n")); + std::to_string(detsize.x - 5) + + std::string(", 1, ") + + std::to_string(detsize.y - 5) + + std::string("]\n")); } REQUIRE_THROWS( caller.call("rx_roi", {"-1", "-1", "-1", "-1"}, -1, PUT)); @@ -966,7 +968,6 @@ TEST_CASE("Caller::rx_zmqstartfnum", "[.cmdcall][.rx]") { } } else { REQUIRE_THROWS(caller.call("rx_zmqstartfnum", {}, -1, GET)); - } } @@ -992,18 +993,18 @@ TEST_CASE("Caller::rx_zmqport", "[.cmdcall][.rx]") { for (int i = 0; i != det.size(); ++i) { std::ostringstream oss; caller.call("rx_zmqport", {}, i, GET, oss); - REQUIRE(oss.str() == "rx_zmqport " + - std::to_string(port + i * socketsperdetector) + - '\n'); + REQUIRE(oss.str() == + "rx_zmqport " + + std::to_string(port + i * socketsperdetector) + '\n'); } port = 30001; caller.call("rx_zmqport", {std::to_string(port)}, -1, PUT); for (int i = 0; i != det.size(); ++i) { std::ostringstream oss; caller.call("rx_zmqport", {}, i, GET, oss); - REQUIRE(oss.str() == "rx_zmqport " + - std::to_string(port + i * socketsperdetector) + - '\n'); + REQUIRE(oss.str() == + "rx_zmqport " + + std::to_string(port + i * socketsperdetector) + '\n'); } test_valid_port_caller("rx_zmqport", {}, -1, PUT); test_valid_port_caller("rx_zmqport", {}, 0, PUT); @@ -1053,8 +1054,8 @@ TEST_CASE("Caller::rx_zmqhwm", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type != defs::XILINX_CHIPTESTBOARD) { - auto prev_val = - det.getRxZmqHwm().tsquash("Inconsistent values for rx_zmqhwm to test"); + auto prev_val = det.getRxZmqHwm().tsquash( + "Inconsistent values for rx_zmqhwm to test"); { std::ostringstream oss; caller.call("rx_zmqhwm", {"50"}, -1, PUT, oss); @@ -1155,14 +1156,16 @@ TEST_CASE("Caller::rx_jsonaddheader", "[.cmdcall][.rx]") { { std::ostringstream oss; - caller.call("rx_jsonaddheader", {"key1", "value1", "key2", "value2"}, - -1, PUT, oss); - REQUIRE(oss.str() == "rx_jsonaddheader {key1: value1, key2: value2}\n"); + caller.call("rx_jsonaddheader", + {"key1", "value1", "key2", "value2"}, -1, PUT, oss); + REQUIRE(oss.str() == + "rx_jsonaddheader {key1: value1, key2: value2}\n"); } { std::ostringstream oss; caller.call("rx_jsonaddheader", {}, -1, GET, oss); - REQUIRE(oss.str() == "rx_jsonaddheader {key1: value1, key2: value2}\n"); + REQUIRE(oss.str() == + "rx_jsonaddheader {key1: value1, key2: value2}\n"); } { std::ostringstream oss; diff --git a/slsDetectorSoftware/tests/Caller/test-Caller.cpp b/slsDetectorSoftware/tests/Caller/test-Caller.cpp index 76fdf2a91..5a94f9a61 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller.cpp @@ -179,7 +179,8 @@ TEST_CASE("CALLER::settingslist", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::XILINX_CHIPTESTBOARD) { + if (det_type == defs::CHIPTESTBOARD || + det_type == defs::XILINX_CHIPTESTBOARD) { REQUIRE_THROWS(caller.call("settingslist", {}, -1, GET)); } else { REQUIRE_NOTHROW(caller.call("settingslist", {}, -1, GET)); @@ -829,8 +830,8 @@ TEST_CASE("CALLER::exptime", "[.cmdcall][.time]") { if (det_type != defs::MYTHEN3) { prev_val = det.getExptime().tsquash("inconsistent exptime to test"); } else { - auto t = - det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); + auto t = det.getExptimeForAllGates().tsquash( + "inconsistent exptime to test"); if (t[0] != t[1] || t[1] != t[2]) { throw RuntimeError("inconsistent exptime for all gates"); } @@ -1430,7 +1431,7 @@ TEST_CASE("CALLER::highvoltage", "[.cmdcall]") { } // range 0, 60 - 200 else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || - det_type == defs::CHIPTESTBOARD) { + det_type == defs::CHIPTESTBOARD) { REQUIRE_THROWS(caller.call("highvoltage", {"50"}, -1, PUT)); { std::ostringstream oss1, oss2; @@ -2001,7 +2002,8 @@ TEST_CASE("CALLER::temp_fpga", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::CHIPTESTBOARD && det_type != defs::XILINX_CHIPTESTBOARD) { + if (det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { REQUIRE_NOTHROW(caller.call("temp_fpga", {}, -1, GET)); std::ostringstream oss; REQUIRE_NOTHROW(caller.call("temp_fpga", {}, 0, GET, oss)); @@ -2058,7 +2060,6 @@ TEST_CASE("CALLER::dacvalues", "[.cmdcall]") { REQUIRE_THROWS(caller.call("dacvalues", {}, -1, PUT)); } else { REQUIRE_THROWS(caller.call("dacvalues", {}, -1, GET)); - } } @@ -2066,7 +2067,8 @@ TEST_CASE("CALLER::defaultdac", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::CHIPTESTBOARD && det_type != defs::XILINX_CHIPTESTBOARD) { + if (det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { REQUIRE_THROWS(caller.call("defaultdac", {}, -1, GET)); REQUIRE_THROWS(caller.call("defaultdac", {"blabla"}, -1, PUT)); auto daclist = det.getDacList(); @@ -2125,7 +2127,8 @@ TEST_CASE("CALLER::resetdacs", "[.cmdcall]") { Detector det; Caller caller(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::CHIPTESTBOARD && det_type != defs::XILINX_CHIPTESTBOARD) { + if (det_type != defs::CHIPTESTBOARD && + det_type != defs::XILINX_CHIPTESTBOARD) { auto prev_val = det.getSettings(); REQUIRE_THROWS(caller.call("resetdacs", {}, -1, GET)); @@ -2252,8 +2255,8 @@ TEST_CASE("CALLER::start", "[.cmdcall]") { if (det_type != defs::MYTHEN3) { prev_val = det.getExptime().tsquash("inconsistent exptime to test"); } else { - auto t = - det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); + auto t = det.getExptimeForAllGates().tsquash( + "inconsistent exptime to test"); if (t[0] != t[1] || t[1] != t[2]) { throw RuntimeError("inconsistent exptime for all gates"); } @@ -2261,7 +2264,8 @@ TEST_CASE("CALLER::start", "[.cmdcall]") { } auto prev_frames = det.getNumberOfFrames().tsquash("inconsistent #frames in test"); - auto prev_period = det.getPeriod().tsquash("inconsistent period in test"); + auto prev_period = + det.getPeriod().tsquash("inconsistent period in test"); det.setExptime(-1, std::chrono::microseconds(200)); det.setPeriod(std::chrono::milliseconds(1)); det.setNumberOfFrames(2000); @@ -2296,8 +2300,8 @@ TEST_CASE("CALLER::stop", "[.cmdcall]") { if (det_type != defs::MYTHEN3) { prev_val = det.getExptime().tsquash("inconsistent exptime to test"); } else { - auto t = - det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); + auto t = det.getExptimeForAllGates().tsquash( + "inconsistent exptime to test"); if (t[0] != t[1] || t[1] != t[2]) { throw RuntimeError("inconsistent exptime for all gates"); } @@ -2305,7 +2309,8 @@ TEST_CASE("CALLER::stop", "[.cmdcall]") { } auto prev_frames = det.getNumberOfFrames().tsquash("inconsistent #frames in test"); - auto prev_period = det.getPeriod().tsquash("inconsistent period in test"); + auto prev_period = + det.getPeriod().tsquash("inconsistent period in test"); det.setExptime(-1, std::chrono::microseconds(200)); det.setPeriod(std::chrono::milliseconds(1)); det.setNumberOfFrames(2000); @@ -2324,7 +2329,7 @@ TEST_CASE("CALLER::stop", "[.cmdcall]") { std::ostringstream oss; caller.call("status", {}, -1, GET, oss); REQUIRE(((oss.str() == "status stopped\n") || - (oss.str() == "status idle\n"))); + (oss.str() == "status idle\n"))); } det.setExptime(-1, prev_val); det.setPeriod(prev_period); @@ -2343,8 +2348,8 @@ TEST_CASE("CALLER::status", "[.cmdcall]") { if (det_type != defs::MYTHEN3) { prev_val = det.getExptime().tsquash("inconsistent exptime to test"); } else { - auto t = - det.getExptimeForAllGates().tsquash("inconsistent exptime to test"); + auto t = det.getExptimeForAllGates().tsquash( + "inconsistent exptime to test"); if (t[0] != t[1] || t[1] != t[2]) { throw RuntimeError("inconsistent exptime for all gates"); } @@ -2352,7 +2357,8 @@ TEST_CASE("CALLER::status", "[.cmdcall]") { } auto prev_frames = det.getNumberOfFrames().tsquash("inconsistent #frames in test"); - auto prev_period = det.getPeriod().tsquash("inconsistent period in test"); + auto prev_period = + det.getPeriod().tsquash("inconsistent period in test"); det.setExptime(-1, std::chrono::microseconds(200)); det.setPeriod(std::chrono::milliseconds(1)); det.setNumberOfFrames(2000); @@ -2367,7 +2373,7 @@ TEST_CASE("CALLER::status", "[.cmdcall]") { std::ostringstream oss; caller.call("status", {}, -1, GET, oss); REQUIRE(((oss.str() == "status stopped\n") || - (oss.str() == "status idle\n"))); + (oss.str() == "status idle\n"))); } det.setExptime(-1, prev_val); det.setPeriod(prev_period); @@ -2492,31 +2498,31 @@ TEST_CASE("CALLER::scan", "[.cmdcall]") { } else { { std::ostringstream oss; - caller.call("scan", {ToString(ind), "500", "1500", "500"}, -1, PUT, - oss); - CHECK(oss.str() == - "scan [" + ToString(ind) + ", 500, 1500, 500]\n"); - } - { - std::ostringstream oss; - caller.call("scan", {}, -1, GET, oss); - CHECK(oss.str() == "scan [enabled\ndac " + ToString(ind) + - "\nstart 500\nstop 1500\nstep " - "500\nsettleTime 1ms\n]\n"); - } - { - std::ostringstream oss; - caller.call("scan", {ToString(ind), "500", "1500", "500", "2s"}, -1, + caller.call("scan", {ToString(ind), "500", "1500", "500"}, -1, PUT, oss); CHECK(oss.str() == - "scan [" + ToString(ind) + ", 500, 1500, 500, 2s]\n"); + "scan [" + ToString(ind) + ", 500, 1500, 500]\n"); } { std::ostringstream oss; caller.call("scan", {}, -1, GET, oss); CHECK(oss.str() == "scan [enabled\ndac " + ToString(ind) + - "\nstart 500\nstop 1500\nstep " - "500\nsettleTime 2s\n]\n"); + "\nstart 500\nstop 1500\nstep " + "500\nsettleTime 1ms\n]\n"); + } + { + std::ostringstream oss; + caller.call("scan", {ToString(ind), "500", "1500", "500", "2s"}, + -1, PUT, oss); + CHECK(oss.str() == + "scan [" + ToString(ind) + ", 500, 1500, 500, 2s]\n"); + } + { + std::ostringstream oss; + caller.call("scan", {}, -1, GET, oss); + CHECK(oss.str() == "scan [enabled\ndac " + ToString(ind) + + "\nstart 500\nstop 1500\nstep " + "500\nsettleTime 2s\n]\n"); } { std::ostringstream oss; @@ -2530,18 +2536,18 @@ TEST_CASE("CALLER::scan", "[.cmdcall]") { } { std::ostringstream oss; - caller.call("scan", {ToString(ind), "1500", "500", "-500"}, -1, PUT, - oss); + caller.call("scan", {ToString(ind), "1500", "500", "-500"}, -1, + PUT, oss); CHECK(oss.str() == - "scan [" + ToString(ind) + ", 1500, 500, -500]\n"); + "scan [" + ToString(ind) + ", 1500, 500, -500]\n"); } CHECK_THROWS(caller.call( "scan", {ToString(notImplementedInd), "500", "1500", "500"}, -1, PUT)); - CHECK_THROWS(caller.call("scan", {ToString(ind), "500", "1500", "-500"}, - -1, PUT)); - CHECK_THROWS(caller.call("scan", {ToString(ind), "1500", "500", "500"}, - -1, PUT)); + CHECK_THROWS(caller.call( + "scan", {ToString(ind), "500", "1500", "-500"}, -1, PUT)); + CHECK_THROWS(caller.call( + "scan", {ToString(ind), "1500", "500", "500"}, -1, PUT)); if (det_type == defs::MYTHEN3 || defs::EIGER) { { @@ -2554,8 +2560,8 @@ TEST_CASE("CALLER::scan", "[.cmdcall]") { std::ostringstream oss; caller.call("scan", {}, -1, GET, oss); CHECK(oss.str() == - "scan [enabled\ndac trimbits\nstart 0\nstop 48\nstep " - "16\nsettleTime 2s\n]\n"); + "scan [enabled\ndac trimbits\nstart 0\nstop 48\nstep " + "16\nsettleTime 2s\n]\n"); } } @@ -2567,12 +2573,13 @@ TEST_CASE("CALLER::scan", "[.cmdcall]") { // Reset all dacs to previous value // for (int i = 0; i != det.size(); ++i) { // det.setDAC(ind, previous[i], false, {i}); - // det.setDAC(notImplementedInd, notImplementedPrevious[i], false, - // {i}); + // det.setDAC(notImplementedInd, notImplementedPrevious[i], + // false, {i}); // } } } else { - REQUIRE_THROWS(caller.call("scan", {ToString(defs::DAC_0), "500", "1500", "500"}, -1, PUT)); + REQUIRE_THROWS(caller.call( + "scan", {ToString(defs::DAC_0), "500", "1500", "500"}, -1, PUT)); } } @@ -2684,7 +2691,6 @@ TEST_CASE("CALLER::udp_cleardst", "[.cmdcall]") { /*REQUIRE_NOTHROW(caller.call("udp_cleardst", {}, -1, PUT));*/ } else { REQUIRE_THROWS(caller.call("udp_cleardst", {}, -1, PUT)); - } } @@ -2734,7 +2740,8 @@ TEST_CASE("CALLER::udp_srcmac", "[.cmdcall]") { auto det_type = det.getDetectorType().squash(); if (det_type != defs::XILINX_CHIPTESTBOARD) { auto prev_val = det.getSourceUDPMAC(); - REQUIRE_THROWS(caller.call("udp_srcmac", {"00:00:00:00:00:00"}, -1, PUT)); + REQUIRE_THROWS( + caller.call("udp_srcmac", {"00:00:00:00:00:00"}, -1, PUT)); { std::ostringstream oss; caller.call("udp_srcmac", {"00:50:c2:42:34:12"}, -1, PUT, oss); @@ -2903,7 +2910,6 @@ TEST_CASE("CALLER::udp_validate", "[.cmdcall]") { REQUIRE_NOTHROW(caller.call("udp_validate", {}, -1, PUT)); } else { REQUIRE_THROWS(caller.call("udp_validate", {}, -1, PUT)); - } } diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 33b26e224..3ea267855 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -4,11 +4,11 @@ #define RELEASE "developer" #define APILIB "developer 0x230224" #define APIRECEIVER "developer 0x230224" -#define APICTB "developer 0x240110" -#define APIGOTTHARD "developer 0x240110" +#define APICTB "developer 0x240110" +#define APIGOTTHARD "developer 0x240110" #define APIGOTTHARD2 "developer 0x240110" -#define APIJUNGFRAU "developer 0x240110" -#define APIMYTHEN3 "developer 0x240110" -#define APIMOENCH "developer 0x240110" -#define APIEIGER "developer 0x240110" +#define APIJUNGFRAU "developer 0x240110" +#define APIMYTHEN3 "developer 0x240110" +#define APIMOENCH "developer 0x240110" +#define APIEIGER "developer 0x240110" #define APIXILINXCTB "developer 0x240110" From bd1a125154a0bc2cde395b1d01e097f4c5508316 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 11 Jan 2024 18:07:34 +0100 Subject: [PATCH 32/38] moench default speed set to after init readout configuration (half speed) (#886) --- .../bin/moenchDetectorServer_developer | Bin 295380 -> 295380 bytes .../slsDetectorFunctionList.c | 2 +- .../bin/xilinx_ctbDetectorServer_developer | Bin 233952 -> 233952 bytes slsSupportLib/include/sls/versionAPI.h | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index b52f777db6f08a6e84e81c350ea4d72953913cb1..2dbd7936c3a5e3b9b7d7f9cb7bd090ee0d4bdcde 100755 GIT binary patch delta 111 zcmcc8EOez=Xo4p54CQUpH?C%u*yyr_&y3-51S7-aIv_3(Re0FO;P@~!lo5y-9{a3R zc=!*%xl-ZbKOo;~GvmXCFowsDD;XZY6lm7tZ`b2z+^)yZ)2Uxc$&3Cb|0ni6aXl diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 3ea267855..0c01badcc 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -11,4 +11,4 @@ #define APIMYTHEN3 "developer 0x240110" #define APIMOENCH "developer 0x240110" #define APIEIGER "developer 0x240110" -#define APIXILINXCTB "developer 0x240110" +#define APIXILINXCTB "developer 0x240111" From a03780718e5ff2225f53813180c06f0b0167e836 Mon Sep 17 00:00:00 2001 From: froejdh_e Date: Fri, 12 Jan 2024 09:17:14 +0100 Subject: [PATCH 33/38] Fixed path when building as submodule --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 298343e0d..60ac7bde0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,7 @@ else() # Standard behaviour use libzmq included in this repo (libs/libzmq) FetchContent_Declare( libzmq - URL ${CMAKE_SOURCE_DIR}/libs/libzmq/libzmq-4.3.4.tar.gz + URL ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq-4.3.4.tar.gz URL_HASH MD5=cc20b769ac10afa352e5ed2769bb23b3 ) endif() From aa4012896569cd61787c162b5ac9aa8abd47c69a Mon Sep 17 00:00:00 2001 From: anberga <34126852+anberga@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:01:06 +0100 Subject: [PATCH 34/38] Moench v8 (#892) * new rct structure for moench03 * new moench data structure for offline processing * meonch raw data and zmq process files updated to 7.0.3 version * implemented config file for Zmq file * raw data and zmq work with config file, but only with one file/interface * zmq config change * added config examples for zmq and rawdata --- examples/rawdata.config | 22 + examples/zmq.config | 16 + .../dataStructures/moench03v2Data.h | 240 ++++++++++ .../dataStructures/moench03v2HalfData.h | 240 ++++++++++ .../moench03Interpolation.cpp | 77 ++- .../moenchRawDataProcess.cpp | 447 +++++++++++------- .../moenchExecutables/moenchZmqProcess.cpp | 194 +++++--- 7 files changed, 985 insertions(+), 251 deletions(-) create mode 100644 examples/rawdata.config create mode 100644 examples/zmq.config create mode 100644 slsDetectorCalibration/dataStructures/moench03v2Data.h create mode 100644 slsDetectorCalibration/dataStructures/moench03v2HalfData.h diff --git a/examples/rawdata.config b/examples/rawdata.config new file mode 100644 index 000000000..d8cff656b --- /dev/null +++ b/examples/rawdata.config @@ -0,0 +1,22 @@ +numfiles 1 +nthreads 5, +fifosize 5000 +nsigma 5 +gainfile none +detectorMode counting +threshold 0 +pedestalfile none +nframes 0 +xMin 0 +xMax 400 +yMin 0 +yMax 400 +outdir ./ +indir ./ +flist none +fformat none +runmin 0 +runmax -1 +readnrows 400 +eMin 0 +eMax 16000 diff --git a/examples/zmq.config b/examples/zmq.config new file mode 100644 index 000000000..e4d39fc14 --- /dev/null +++ b/examples/zmq.config @@ -0,0 +1,16 @@ +numinterfaces 1 +rx_zmqip 10.1.2.102 +rx_zmqport 1978 +zmqip 129.129.202.57 +zmqport 1979 +nthreads 6 +fifosize 5000 +nsigma 5 +gainfile none +nbinsx 5 +nbinsy 5 +etafile none +etabinsx 1000 +etabinsy 1000 +etamin -1 +etamax 2 \ No newline at end of file diff --git a/slsDetectorCalibration/dataStructures/moench03v2Data.h b/slsDetectorCalibration/dataStructures/moench03v2Data.h new file mode 100644 index 000000000..44998b6dd --- /dev/null +++ b/slsDetectorCalibration/dataStructures/moench03v2Data.h @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#ifndef MOENCH03v2DATA_H +#define MOENCH03v2DATA_H +//#define MYROOT + +#ifndef MYROOT +#include "sls/sls_detector_defs.h" +#endif + + + + +#ifdef MYROOT + + typedef struct { + uint64_t frameNumber; + uint32_t expLength; + uint32_t packetNumber; + uint64_t bunchId; + uint64_t timestamp; + uint16_t modId; + uint16_t row; + uint16_t column; + uint16_t reserved; + uint32_t debug; + uint16_t roundRNumber; + uint8_t detType; + uint8_t version; + } sls_detector_header; +#define MAX_NUM_PACKETS 512 +// using sls_bitset = std::bitset; +// using bitset_storage = uint8_t[MAX_NUM_PACKETS / 8]; + struct sls_receiver_header { + sls_detector_header detHeader; /**< is the detector header */ + uint8_t packetsMask[64]; /**< is the packets caught bit mask */ + }; +#endif + +#include "slsDetectorData.h" +#ifdef RAWDATA +#define DATA_OFFSET sizeof(header) +#endif +#ifndef RAWDATA +#define DATA_OFFSET 0 +#endif + + +class moench03v2Data : public slsDetectorData { + + private: + int iframe; + const int nRows; + + + + double ghost[200][25]; + + // Single point of definition if we need to customize +#ifndef MYROOT + using header = sls::defs::sls_receiver_header; +#endif +#ifdef MYROOT + sls_receiver_header header; +#endif + public: + /** + Implements the slsReceiverData structure for the moench02 prototype read + out by a module i.e. using the slsReceiver (160x160 pixels, 40 packets + 1286 large etc.) \param c crosstalk parameter for the output buffer + + */ + moench03v2Data(int nrows = 200) + : slsDetectorData(400, nrows*2,2* 400*nrows*2 + DATA_OFFSET), + nRows(nrows) { + + std::cout << "MOENCH width new firmware " << dataSize << std::endl; + + int off=DATA_OFFSET; + for (int ix = 0; ix < 400; ix++) { + for (int iy = 0; iy < nRows*2; iy++) { + dataMap[iy][ix]=off+2*(iy*400+ix); + } + } + + iframe = 0; + // cout << "data struct created" << endl; + }; + + /** + Returns the value of the selected channel for the given dataset as + double. \param data pointer to the dataset (including headers etc) \param + ix pixel number in the x direction \param iy pixel number in the y + direction \returns data for the selected channel, with inversion if + required as double + + */ + double getValue(char *data, int ix, int iy = 0) override { + uint16_t val = getChannel(data, ix, iy) & 0x3fff; + return val; + }; + + virtual void calcGhost(char *data, int ix, int iy) { + double val = 0; + /* for (int ix=0; ix<25; ix++){ */ + /* for (int iy=0; iy<200; iy++) { */ + val = 0; + // cout << "** "; + for (int isc = 0; isc < 16; isc++) { + // for (int ii=0; ii<2; ii++) { + val += getChannel(data, ix + 25 * isc, iy); + // cout << "(" << isc << "," << val << " " ; + val += getChannel(data, ix + 25 * isc, 399 - iy); + // cout << val << " " ; + // } + } + ghost[iy][ix] = val; //-6224; + // cout << " --"<< endl; + /* } */ + /* } */ + // cout << "*" << endl; + } + + virtual void calcGhost(char *data) { + for (int ix = 0; ix < 25; ix++) { + for (int iy = 0; iy < 200; iy++) { + calcGhost(data, ix, iy); + } + } + // cout << "*" << endl; + } + + double getGhost(int ix, int iy) { + if (iy < 200) + return ghost[iy][ix % 25]; + if (iy < 400) + return ghost[399 - iy][ix % 25]; + return 0; + }; + + /** + + Returns the frame number for the given dataset. Purely virtual func. + \param buff pointer to the dataset + \returns frame number + + */ + + int getFrameNumber(char *buff) { +#ifdef RAWDATA + return ((sls::defs::sls_receiver_header *)buff)->detHeader.frameNumber; +#endif +#ifndef RAWDATA + return 1; +#endif + + } + + /** + + Returns the packet number for the given dataset. purely virtual func + \param buff pointer to the dataset + \returns packet number number + + + + */ + int getPacketNumber(char *buff) { +#ifdef RAWDATA + return ((sls::defs::sls_receiver_header *)buff)->detHeader.packetNumber; +#endif +#ifndef RAWDATA + return 0; +#endif + + } + + char *readNextFrame(std::ifstream &filebin) override { + int ff = -1, np = -1; + return readNextFrame(filebin, ff, np); + } + + // not present in base class + virtual char *readNextFrame(std::ifstream &filebin, int &ff) { + int np = -1; + return readNextFrame(filebin, ff, np); + }; + + // not present in base class + virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np) { + char *data = new char[dataSize]; + char *d = readNextFrame(filebin, ff, np, data); + if (d == NULL) { + delete[] data; + data = NULL; + } + return data; + } + + // not present in base class + virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np, + char *data) { + np = 0; + if (filebin.is_open()) { + if (filebin.read(data, dataSize)) { + ff = getFrameNumber(data); + np = getPacketNumber(data); + // std::cout << "**" << ff << " " << dataSize << " " << ff << " " << np << std::endl; + + return data; + } + } + std::cout << "**" << ff << " " << dataSize << " " << ff << " " << np << std::endl; + return nullptr; + } + + /** + + Loops over a memory slot until a complete frame is found (i.e. all + packets 0 to nPackets, same frame number). purely virtual func \param + data pointer to the memory to be analyzed \param ndata reference to the + amount of data found for the frame, in case the frame is incomplete at + the end of the memory slot \param dsize size of the memory slot to be + analyzed \returns pointer to the beginning of the last good frame (might + be incomplete if ndata smaller than dataSize), or NULL if no frame is + found + + */ + char *findNextFrame(char *data, int &ndata, int dsize) override { + if (dsize < dataSize) + ndata = dsize; + else + ndata = dataSize; + return data; + } + + // int getPacketNumber(int x, int y) {return dataMap[y][x]/packetSize;}; +}; + +#endif diff --git a/slsDetectorCalibration/dataStructures/moench03v2HalfData.h b/slsDetectorCalibration/dataStructures/moench03v2HalfData.h new file mode 100644 index 000000000..383f37327 --- /dev/null +++ b/slsDetectorCalibration/dataStructures/moench03v2HalfData.h @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// Copyright (C) 2021 Contributors to the SLS Detector Package +#ifndef MOENCH03v2DATA_H +#define MOENCH03v2DATA_H +//#define MYROOT + +#ifndef MYROOT +#include "sls/sls_detector_defs.h" +#endif + + + + +#ifdef MYROOT + + typedef struct { + uint64_t frameNumber; + uint32_t expLength; + uint32_t packetNumber; + uint64_t bunchId; + uint64_t timestamp; + uint16_t modId; + uint16_t row; + uint16_t column; + uint16_t reserved; + uint32_t debug; + uint16_t roundRNumber; + uint8_t detType; + uint8_t version; + } sls_detector_header; +#define MAX_NUM_PACKETS 512 +// using sls_bitset = std::bitset; +// using bitset_storage = uint8_t[MAX_NUM_PACKETS / 8]; + struct sls_receiver_header { + sls_detector_header detHeader; /**< is the detector header */ + uint8_t packetsMask[64]; /**< is the packets caught bit mask */ + }; +#endif + +#include "slsDetectorData.h" +#ifdef RAWDATA +#define DATA_OFFSET sizeof(header) +#endif +#ifndef RAWDATA +#define DATA_OFFSET 0 +#endif + + +class moench03v2Data : public slsDetectorData { + + private: + int iframe; + const int nRows; + + + + double ghost[200][25]; + + // Single point of definition if we need to customize +#ifndef MYROOT + using header = sls::defs::sls_receiver_header; +#endif +#ifdef MYROOT + sls_receiver_header header; +#endif + public: + /** + Implements the slsReceiverData structure for the moench02 prototype read + out by a module i.e. using the slsReceiver (160x160 pixels, 40 packets + 1286 large etc.) \param c crosstalk parameter for the output buffer + + */ + moench03v2Data(int nrows = 200) + : slsDetectorData(400, nrows*2,2* 400*nrows*2 + DATA_OFFSET), + nRows(nrows) { + + std::cout << "MOENCH width new firmware " << dataSize << std::endl; + + int off=DATA_OFFSET; + for (int ix = 0; ix < 400; ix++) { + for (int iy = 0; iy < nRows*2; iy++) { + dataMap[iy][ix]=off+2*(iy*400+ix); + } + } + + iframe = 0; + // cout << "data struct created" << endl; + }; + + /** + Returns the value of the selected channel for the given dataset as + double. \param data pointer to the dataset (including headers etc) \param + ix pixel number in the x direction \param iy pixel number in the y + direction \returns data for the selected channel, with inversion if + required as double + + */ + double getValue(char *data, int ix, int iy = 0) override { + uint16_t val = getChannel(data, ix, iy) & 0x3fff; + return val; + }; + + virtual void calcGhost(char *data, int ix, int iy) { + double val = 0; + /* for (int ix=0; ix<25; ix++){ */ + /* for (int iy=0; iy<200; iy++) { */ + val = 0; + // cout << "** "; + for (int isc = 0; isc < 16; isc++) { + // for (int ii=0; ii<2; ii++) { + val += getChannel(data, ix + 25 * isc, iy); + // cout << "(" << isc << "," << val << " " ; + val += getChannel(data, ix + 25 * isc, 399 - iy); + // cout << val << " " ; + // } + } + ghost[iy][ix] = val; //-6224; + // cout << " --"<< endl; + /* } */ + /* } */ + // cout << "*" << endl; + } + + virtual void calcGhost(char *data) { + for (int ix = 0; ix < 25; ix++) { + for (int iy = 0; iy < 200; iy++) { + calcGhost(data, ix, iy); + } + } + // cout << "*" << endl; + } + + double getGhost(int ix, int iy) { + if (iy < 200) + return ghost[iy][ix % 25]; + if (iy < 400) + return ghost[399 - iy][ix % 25]; + return 0; + }; + + /** + + Returns the frame number for the given dataset. Purely virtual func. + \param buff pointer to the dataset + \returns frame number + + */ + + int getFrameNumber(char *buff) { +#ifdef RAWDATA + return ((sls::defs::sls_receiver_header *)buff)->detHeader.frameNumber; +#endif +#ifndef RAWDATA + return 1; +#endif + + } + + /** + + Returns the packet number for the given dataset. purely virtual func + \param buff pointer to the dataset + \returns packet number number + + + + */ + int getPacketNumber(char *buff) { +#ifdef RAWDATA + return ((sls::defs::sls_receiver_header *)buff)->detHeader.packetNumber; +#endif +#ifndef RAWDATA + return 0; +#endif + + } + + char *readNextFrame(std::ifstream &filebin) override { + int ff = -1, np = -1; + return readNextFrame(filebin, ff, np); + } + + // not present in base class + virtual char *readNextFrame(std::ifstream &filebin, int &ff) { + int np = -1; + return readNextFrame(filebin, ff, np); + }; + + // not present in base class + virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np) { + char *data = new char[dataSize]; + char *d = readNextFrame(filebin, ff, np, data); + if (d == NULL) { + delete[] data; + data = NULL; + } + return data; + } + + // not present in base class + virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np, + char *data) { + np = 0; + if (filebin.is_open()) { + if (filebin.read(data, dataSize)) { + ff = getFrameNumber(data); + np = getPacketNumber(data); + std::cout << "**" << ff << " " << dataSize << " " << ff << " " << np << std::endl; + + return data; + } + } + std::cout << "**" << ff << " " << dataSize << " " << ff << " " << np << std::endl; + return nullptr; + } + + /** + + Loops over a memory slot until a complete frame is found (i.e. all + packets 0 to nPackets, same frame number). purely virtual func \param + data pointer to the memory to be analyzed \param ndata reference to the + amount of data found for the frame, in case the frame is incomplete at + the end of the memory slot \param dsize size of the memory slot to be + analyzed \returns pointer to the beginning of the last good frame (might + be incomplete if ndata smaller than dataSize), or NULL if no frame is + found + + */ + char *findNextFrame(char *data, int &ndata, int dsize) override { + if (dsize < dataSize) + ndata = dsize; + else + ndata = dataSize; + return data; + } + + // int getPacketNumber(int x, int y) {return dataMap[y][x]/packetSize;}; +}; + +#endif diff --git a/slsDetectorCalibration/moenchExecutables/moench03Interpolation.cpp b/slsDetectorCalibration/moenchExecutables/moench03Interpolation.cpp index 3b17d3bf0..d1bd1c4ad 100644 --- a/slsDetectorCalibration/moenchExecutables/moench03Interpolation.cpp +++ b/slsDetectorCalibration/moenchExecutables/moench03Interpolation.cpp @@ -33,7 +33,7 @@ int main(int argc, char *argv[]) { #ifndef FF if (argc < 9) { cout << "Wrong usage! Should be: " << argv[0] - << " infile etafile outfile runmin runmax ns cmin cmax" << endl; + << " infile etafile outfile runmin runmax ns [cmin cmax xmin xmax ymin ymax]" << endl; return 1; } #endif @@ -41,7 +41,7 @@ int main(int argc, char *argv[]) { #ifdef FF if (argc < 7) { cout << "Wrong usage! Should be: " << argv[0] - << " infile etafile runmin runmax cmin cmax" << endl; + << " infile etafile runmin runmax [cmin cmax xmin xmax ymin ymax]" << endl; return 1; } #endif @@ -65,13 +65,30 @@ int main(int argc, char *argv[]) { nsubpix = atoi(argv[iarg++]); cout << "Subpix: " << nsubpix << endl; #endif - float cmin = atof(argv[iarg++]); - float cmax = atof(argv[iarg++]); + + float cmin = 0; + float cmax=1000000; + if (argc>iarg) + cmin=atof(argv[iarg++]); + if (argc>iarg) + cmax= atof(argv[iarg++]); cout << "Energy min: " << cmin << endl; cout << "Energy max: " << cmax << endl; + int xmin=0, xmax=NC, ymin=0, ymax=NR; + + if (argc>iarg) + xmin=atof(argv[iarg++]); + if (argc>iarg) + xmax= atof(argv[iarg++]); + + if (argc>iarg) + ymin=atof(argv[iarg++]); + if (argc>iarg) + ymax= atof(argv[iarg++]); + // int etabins=500; int etabins = 1000; // nsubpix*2*100; - double etamin = -1, etamax = 2; + double etamin = -0.25, etamax = 1.25; // double etamin=-0.1, etamax=1.1; // double eta3min = -2, eta3max = 2; double sum, totquad; @@ -80,7 +97,7 @@ int main(int argc, char *argv[]) { // double eta3x, eta3y, int3_x, int3_y, noint_x, noint_y; int ix, iy, isx, isy; - int nframes = 0, lastframe = -1; + int nframes = 0, lastframe = -1, iframe, nphFrame; //double d_x, d_y, res = 5, xx, yy; int nph = 0, totph = 0; //badph = 0, @@ -98,7 +115,7 @@ int main(int argc, char *argv[]) { // int nSubPixels = nsubpix; #ifndef NOINTERPOLATION eta2InterpolationPosXY *interp = - new eta2InterpolationPosXY(NC, NR, nsubpix, nsubpix,etabins,etabins, etamin, etamax); + new eta2InterpolationPosXY(NC, NR, nsubpix, nsubpix, etabins, etabins, etamin, etamax); // eta2InterpolationCleverAdaptiveBins *interp=new // eta2InterpolationCleverAdaptiveBins(NC, NR, nsubpix, etabins, etamin, // etamax); @@ -107,8 +124,8 @@ int main(int argc, char *argv[]) { noInterpolation *interp = new noInterpolation(NC, NR, nsubpix); #endif -#ifndef FF int quad; +#ifndef FF #ifndef NOINTERPOLATION char fname[10000]; int ok; @@ -142,19 +159,26 @@ int main(int argc, char *argv[]) { #endif int irun; - for (irun = runmin; irun < runmax; irun++) { + for (irun = runmin; irun <= runmax; irun++) { sprintf(infname, argv[1], irun); #ifndef FF sprintf(outfname, argv[3], irun); #endif + f = fopen(infname, "r"); if (f) { cout << infname << endl; nframes = 0; //f0 = -1; - while (cl.read(f)) { + //iff=0; + while (fread((void*)&iframe, 1, sizeof(int), f)) { + //n=0; + if (fread((void*)&nphFrame, 1, sizeof(int), f)) { + for (int iph=0; iphcalcQuad(cl.get_cluster(), sum, totquad, sDum); -#ifndef FF +// #ifndef FF +// quad = interp->calcEta(cl.get_cluster(), etax, etay, sum, +// totquad, sDum); +// #endif +// #ifdef FF + quad = interp->calcEta(cl.get_cluster(), etax, etay, sum, totquad, sDum); -#endif -#ifdef FF - interp->calcEta(cl.get_cluster(), etax, etay, sum, - totquad, sDum); -#endif + + + /* cl.print(); + cout << "(" << etax <<","<< etay <<")"<< quad<< endl; + */ + //#endif - if (sum > cmin && totquad / sum > 0.8 && totquad / sum < 1.2 && - sum < cmax) { - nph++; + if (totquad > cmin && cl.x >= xmin && cl.x <= xmax && + cl.y >= ymin && cl.y <= ymax && + totquad < cmax) { + + // if (sum > cmin && totquad / sum > 0.8 && totquad / sum < 1.2 && + // sum < cmax) { + nph++; // if (sum>200 && sum<580) { // interp->getInterpolatedPosition(cl.x,cl.y, // totquad,quad,cl.get_cluster(),int_x, int_y); @@ -227,9 +261,12 @@ int main(int argc, char *argv[]) { #ifdef FF interp->writeFlatField(outfname); #endif + } } } - } + } + } + } fclose(f); #ifdef FF diff --git a/slsDetectorCalibration/moenchExecutables/moenchRawDataProcess.cpp b/slsDetectorCalibration/moenchExecutables/moenchRawDataProcess.cpp index 6dcada915..69620e7f4 100644 --- a/slsDetectorCalibration/moenchExecutables/moenchRawDataProcess.cpp +++ b/slsDetectorCalibration/moenchExecutables/moenchRawDataProcess.cpp @@ -13,7 +13,7 @@ #ifndef MOENCH04 #ifndef RECT -#include "moench03T1ReceiverDataNew.h" +#include "moench03v2Data.h" #endif #endif @@ -41,34 +41,147 @@ using namespace std; int main(int argc, char *argv[]) { - if (argc < 4) { + std::map args = { + {"numfiles","1"}, + {"nthreads","5"}, + {"fifosize","5000"}, + {"nsigma","5"}, + {"gainfile","none"}, + {"detectorMode","counting"}, + {"threshold","0"}, + {"pedestalfile","none"}, + {"nframes","0"}, + {"xMin","0"}, + {"xMax","400"}, + {"yMin","0"}, + {"yMax","400"}, + {"eMin","0"}, + {"eMax","16000"}, + {"outdir","./"}, + {"indir","./"}, + {"flist","none"}, + {"fformat","none"}, + {"runmin","0"}, + {"runmax","-1"}, + {"readnrows","400"} + }; + //float *gm; + + int ff, np; + // cout << " data size is " << dsize; + + ifstream filebin; + if (argc < 4) { + std::string name, value,sline; + int ic=0; + ifstream flist; + flist.open (argv[1], std::ifstream::in); + if (flist.is_open()) { + cout << "Using config file " <0 means photon counting" + "threshold>0 means photon counting" << endl; cout << "nframes <0 means sum everything; nframes=0 means one file per " - "run; nframes>0 means one file every nframes" + "run; nframes>0 means one file every nframes" << endl; - return 1; + return EXIT_FAILURE; + } + } else { + args["indir"]=argv[1]; + args["outdir"]=argv[1]; + args["fformat"]=argv[3]; + if (argc >= 5) { + args["runmin"] = argv[4]; + } + args["runmax"] = args["runmin"]; + + if (argc >= 6) { + args["runmax"] = argv[5]; + } + if (argc >= 7) { + args["pedestalfile"] = argv[6]; + } + if (argc >= 8) { + args["threshold"] = argv[7]; + } + if (argc >= 9) { + args["nframes"] = argv[8]; + } + if (argc >= 13) { + args["xMin"] = argv[9]; + args["xMax"] = argv[10]; + args["yMin"] = argv[11]; + args["yMax"] = argv[12]; + } + if (argc > 13) { + args["gainfile"] = argv[13]; + } + + if (atof(args["threshold"].c_str())<0) { + args["detectorMode"]="analog"; + } + } - int fifosize = 1000; - int nthreads = 10; - int csize = 3; - int nsigma = 5; - int nped = 10000; + + for (auto const& x : args) + { + std::cout << x.first // string (key) + << ':' + << x.second // string's value + << std::endl; + } + + + string indir=args["indir"]; + string outdir = args["outdir"]; + string fformat= args["fformat"]; + int runmin = atoi(args["runmin"].c_str()); + int runmax = atoi(args["runmin"].c_str()); + string pedfile =args["pedestalfile"]; + double thr = atof(args["threshold"].c_str()); + double thr1 = 1; + + int nframes = atoi(args["nframes"].c_str()); + + int xmin = atoi(args["xMin"].c_str()), xmax = atoi(args["xMax"].c_str()), ymin = atoi(args["yMin"].c_str()), ymax = atoi(args["yMax"].c_str()); + + string gainfname=args["gainfile"]; + + int fifosize = atoi(args["fifosize"].c_str()); + int nthreads = atoi(args["nthreads"].c_str()); + int nsigma = atoi(args["nsigma"].c_str()); + int nrows = atoi(args["readnrows"].c_str()); + float eMin = atof(args["eMin"].c_str()); + float eMax = atof(args["eMax"].c_str()); + int csize = 3; + int nped = 1000; + int cf = 0; - int numberOfPackets=40; + int numberOfPackets=nrows/8; + #ifdef RECT cout << "Should be rectangular but now it will crash! No data structure defined!" << endl; #endif - + #ifndef MOENCH04 - moench03T1ReceiverDataNew *decoder = new moench03T1ReceiverDataNew(); + moench03v2Data *decoder = new moench03v2Data(100); cout << "MOENCH03!" << endl; #endif @@ -77,7 +190,7 @@ int main(int argc, char *argv[]) { moench04CtbZmq10GbData *decoder = new moench04CtbZmq10GbData(5000,0); cout << "MOENCH04!" << endl; #endif - + #ifdef MOENCH04_DGS moench04CtbZmq10GbData *decoder = new moench04CtbZmq10GbData(5000,5000); cout << "MOENCH04 DGS!" << endl; @@ -86,63 +199,11 @@ int main(int argc, char *argv[]) { #endif - //Read detector size from decoder int nx , ny; decoder->getDetectorSize(nx, ny); - //float *gm; - - int ff, np; - // cout << " data size is " << dsize; - - ifstream filebin; - char *indir = argv[1]; - char *outdir = argv[2]; - char *fformat = argv[3]; - int runmin = 0; - - // cout << "argc is " << argc << endl; - if (argc >= 5) { - runmin = atoi(argv[4]); - } - - int runmax = runmin; - - if (argc >= 6) { - runmax = atoi(argv[5]); - } - - char *pedfile = NULL; - if (argc >= 7) { - pedfile = argv[6]; - } - double thr = 0; - double thr1 = 1; - - if (argc >= 8) { - thr = atof(argv[7]); - } - - int nframes = 0; - - if (argc >= 9) { - nframes = atoi(argv[8]); - } - - int xmin = 0, xmax = nx, ymin = 0, ymax = ny; - if (argc >= 13) { - xmin = atoi(argv[9]); - xmax = atoi(argv[10]); - ymin = atoi(argv[11]); - ymax = atoi(argv[12]); - } - - char *gainfname = NULL; - if (argc > 13) { - gainfname = argv[13]; - cout << "Gain map file name is: " << gainfname << endl; - } - + //Read detector size from decoder + char ffname[10000]; char fname[10000]; char imgfname[10000]; @@ -151,17 +212,6 @@ int main(int argc, char *argv[]) { std::time_t end_time; FILE *of = NULL; - cout << "input directory is " << indir << endl; - cout << "output directory is " << outdir << endl; - cout << "input file is " << fformat << endl; - cout << "runmin is " << runmin << endl; - cout << "runmax is " << runmax << endl; - if (pedfile) - cout << "pedestal file is " << pedfile << endl; - if (thr > 0) - cout << "threshold is " << thr << endl; - cout << "Nframes is " << nframes << endl; - uint32_t nnx, nny; @@ -182,50 +232,62 @@ int main(int argc, char *argv[]) { singlePhotonDetector *filter = new singlePhotonDetector( decoder, csize, nsigma, 1, cm, nped, 200, -1, -1, gainmap, gs); - if (gainfname) { + //if (gainfname) { - if (filter->readGainMap(gainfname)) + if (filter->readGainMap(gainfname.c_str())) cout << "using gain map " << gainfname << endl; else cout << "Could not open gain map " << gainfname << endl; - } else - thr = 0.15 * thr; + // } else + thr = 0.15 * thr; filter->newDataSet(); //int dsize = decoder->getDataSize(); if (thr > 0) { - cout << "threshold is " << thr << endl; - filter->setThreshold(thr); - cf = 0; - + cout << "threshold is " << thr << endl; + filter->setThreshold(thr); + cf = 0; } else - cf = 1; - + cf = 1; + filter->setROI(xmin, xmax, ymin, ymax); + filter->setEnergyRange(eMin, eMax); std::time(&end_time); cout << std::ctime(&end_time) << endl; char *buff; - + // multiThreadedAnalogDetector *mt=new // multiThreadedAnalogDetector(filter,nthreads,fifosize); multiThreadedCountingDetector *mt = new multiThreadedCountingDetector(filter, nthreads, fifosize); -#ifndef ANALOG - mt->setDetectorMode(ePhotonCounting); - cout << "Counting!" << endl; - if (thr > 0) { + + if (args["detectorMode"]=="counting") { + mt->setDetectorMode(ePhotonCounting); + if (thr > 0) { cf = 0; + } + } else { + mt->setDetectorMode(eAnalog); + cf = 0; } -#endif -//{ -#ifdef ANALOG - mt->setDetectorMode(eAnalog); - cout << "Analog!" << endl; - cf = 0; - // thr1=thr; -#endif - // } + + +// #ifndef ANALOG +// mt->setDetectorMode(ePhotonCounting); +// cout << "Counting!" << endl; +// if (thr > 0) { +// cf = 0; +// } +// #endif +// //{ +// #ifdef ANALOG +// mt->setDetectorMode(eAnalog); +// cout << "Analog!" << endl; +// cf = 0; +// // thr1=thr; +// #endif +// // } mt->StartThreads(); mt->popFree(buff); @@ -236,84 +298,117 @@ int main(int argc, char *argv[]) { char froot[1000]; double *ped=new double[nx * ny];//, *ped1; int pos,pos1; + //return 0; + if (pedfile.find(".raw") != std::string::npos) { + pos1=pedfile.rfind("/"); + strcpy(froot,pedfile.substr(pos1).c_str()); + pos=string(froot).find(".raw"); + froot[pos]='\0'; + } - if (pedfile) { - if (string(pedfile).find(".raw") != std::string::npos) { - pos1=string(pedfile).rfind("/"); - strcpy(froot,pedfile+pos1); - pos=string(froot).find(".raw"); - froot[pos]='\0'; - } - - cout << "PEDESTAL " << endl; - if (string(pedfile).find(".tif") == std::string::npos) { - sprintf(fname, "%s", pedfile); + cout << "PEDESTAL " << endl; + if (pedfile.find(".tif") == std::string::npos) { + sprintf(fname, "%s", pedfile.c_str()); cout << fname << endl; std::time(&end_time); //cout << "aaa" << std::ctime(&end_time) << endl; - + mt->setFrameMode(ePedestal); // sprintf(fn,fformat,irun); filebin.open((const char *)(fname), ios::in | ios::binary); // //open file if (filebin.is_open()) { - ff = -1; + ff = -1; while (decoder->readNextFrame(filebin, ff, np, buff)) { - if (np == numberOfPackets) { - mt->pushData(buff); + if (np == numberOfPackets) { + mt->pushData(buff); mt->nextThread(); mt->popFree(buff); ifr++; - if (ifr % 100 == 0) - cout << ifr << " " << ff << " " << np << endl; - } else - cout << ifr << " " << ff << " " << np << endl; + if (ifr % 100 == 0) + cout << ifr << " " << ff << " " << np << endl; + // break; + } else { + cout << ifr << " " << ff << " " << np << endl; + break; + } ff = -1; } filebin.close(); while (mt->isBusy()) { - ; - } + ; - sprintf(imgfname, "%s/%s_ped.tiff", outdir,froot); + } + + sprintf(imgfname, "%s/%s_ped.tiff", outdir.c_str(),froot); mt->writePedestal(imgfname); - sprintf(imgfname, "%s/%s_var.tiff", outdir,froot); + sprintf(imgfname, "%s/%s_var.tiff", outdir.c_str(),froot); mt->writePedestalRMS(imgfname); } else - cout << "Could not open pedestal file " << fname - << " for reading " << endl; - } else { - float *pp = ReadFromTiff(pedfile, nny, nnx); - if (pp && (int)nnx == nx && (int)nny == ny) { - for (int i = 0; i < nx * ny; i++) { + cout << "Could not open pedestal file " << fname + << " for reading " << endl; + } else { + float *pp = ReadFromTiff(pedfile.c_str(), nny, nnx); + if (pp && (int)nnx == nx && (int)nny == ny) { + for (int i = 0; i < nx * ny; i++) { ped[i] = pp[i]; - } - delete[] pp; - mt->setPedestal(ped); - cout << "Pedestal set from tiff file " << pedfile << endl; - } else { - cout << "Could not open pedestal tiff file " << pedfile + } + delete[] pp; + mt->setPedestal(ped); + cout << "Pedestal set from tiff file " << pedfile << endl; + } else { + cout << "Could not open pedestal tiff file " << pedfile << " for reading " << endl; - } - } - std::time(&end_time); - cout << std::ctime(&end_time) << endl; + } } + std::time(&end_time); + cout << std::ctime(&end_time) << endl; + ifr = 0; int ifile = 0; mt->setFrameMode(eFrame); + //t filelist=0; + ifstream flist; + flist.open (args["flist"].c_str(), std::ifstream::in); + if (flist.is_open()) { + cout << "Using file list" << endl; + runmin=0; + runmax=0; + while (flist.getline(ffname,10000)){ + cout << ffname << endl; + runmax++; + } + runmax--; + flist.close(); + cout << "Found " << runmax << " files " << endl; + flist.open (fformat, std::ifstream::in); + } for (int irun = runmin; irun <= runmax; irun++) { cout << "DATA "; // sprintf(fn,fformat,irun); - sprintf(ffname, "%s/%s.raw", indir, fformat); - sprintf(fname, (const char*)ffname, irun); - sprintf(ffname, "%s/%s.tiff", outdir, fformat); - sprintf(imgfname, (const char*)ffname, irun); - sprintf(ffname, "%s/%s.clust", outdir, fformat); - sprintf(cfname, (const char*)ffname, irun); + // sprintf(ffname, "%s/%s.raw", indir, fformat); + // sprintf(fname, (const char*)ffname, irun); + // sprintf(ffname, "%s/%s.tiff", outdir, fformat); + // sprintf(imgfname, (const char*)ffname, irun); + // sprintf(ffname, "%s/%s.clust", outdir, fformat); + // sprintf(cfname, (const char*)ffname, irun); + if (flist.is_open()) { + flist.getline(ffname,10000); + cout << "file list " << ffname << endl; + } else { + //sprintf(ffname,(const char*)fformat,irun); + sprintf(ffname,args["fformat"].c_str(),irun); + cout << "loop " << ffname << endl; + } + cout << "ffname "<< ffname << endl; + sprintf(fname, "%s/%s.raw",indir.c_str(),ffname); + sprintf(imgfname, "%s/%s.tiff",outdir.c_str(),ffname); + sprintf(cfname, "%s/%s.clust",outdir.c_str(),ffname); + + cout << fname << " "; cout << imgfname << endl; std::time(&end_time); @@ -323,7 +418,7 @@ int main(int argc, char *argv[]) { // //open file ifile = 0; if (filebin.is_open()) { - if (thr <= 0 && cf != 0) { // cluster finder + if (cf != 0) { // cluster finder if (of == NULL) { of = fopen(cfname, "w"); if (of) { @@ -341,7 +436,7 @@ int main(int argc, char *argv[]) { ff = -1; ifr = 0; while (decoder->readNextFrame(filebin, ff, np, buff)) { - if (np == numberOfPackets) { + if (np == numberOfPackets) { // //push mt->pushData(buff); // // //pop @@ -350,21 +445,26 @@ int main(int argc, char *argv[]) { ifr++; if (ifr % 100 == 0) - cout << ifr << " " << ff << endl; + cout << ifr << " " << ff << " " << np << endl; + //break; if (nframes > 0) { if (ifr % nframes == 0) { - sprintf(ffname, "%s/%s_f%05d.tiff", outdir, fformat, - ifile); - sprintf(imgfname, (const char*)ffname, irun); + // sprintf(ffname, "%s/%s_f%05d.tiff", outdir, fformat, + // ifile); + // sprintf(imgfname, (const char*)ffname, irun); + sprintf(imgfname, "%s/%s_f%05d.tiff",outdir.c_str(),ffname,ifile); + while (mt->isBusy()) + ; + mt->writeImage(imgfname, thr1); mt->clearImage(); ifile++; } } - } else { - cout << "bp " << ifr << " " << ff << " " << np << endl; - //break; - } + } else { + cout << "bp " << ifr << " " << ff << " " << np << endl; + //break; + } ff = -1; } cout << "--" << endl; @@ -374,13 +474,17 @@ int main(int argc, char *argv[]) { } if (nframes >= 0) { if (nframes > 0) { - sprintf(ffname, "%s/%s_f%05d.tiff", outdir, fformat, ifile); - sprintf(imgfname, (const char*)ffname, irun); + sprintf(imgfname, "%s/%s_f%05d.tiff",outdir.c_str(),ffname,ifile); + // sprintf(ffname, "%s/%s_f%05d.tiff", outdir, fformat, ifile); + //sprintf(imgfname, (const char*)ffname, irun); } else { - sprintf(ffname, "%s/%s.tiff", outdir, fformat); - sprintf(imgfname, (const char*)ffname, irun); + sprintf(imgfname, "%s/%s.tiff",outdir.c_str(),ffname); + // sprintf(ffname, "%s/%s.tiff", outdir, fformat); + // sprintf(imgfname, (const char*)ffname, irun); } - cout << "Writing tiff to " << imgfname << " " << thr1 << endl; + cout << "Writing tiff to " << imgfname << " " << thr1 << endl; + while (mt->isBusy()) + ; mt->writeImage(imgfname, thr1); mt->clearImage(); if (of) { @@ -395,11 +499,16 @@ int main(int argc, char *argv[]) { cout << "Could not open " << fname << " for reading " << endl; } if (nframes < 0) { - sprintf(ffname, "%s/%s.tiff", outdir, fformat); - strcpy(imgfname, ffname); - cout << "Writing tiff to " << imgfname << " " << thr1 << endl; - mt->writeImage(imgfname, thr1); + //sprintf(ffname, "%s/%s.tiff", outdir, fformat); + // strcpy(imgfname, ffname); + sprintf(imgfname, "%s/%s_tot.tiff",outdir.c_str(),ffname); + cout << "Writing tiff to " << imgfname << " " << thr1 << endl; + while (mt->isBusy()) + ; + mt->writeImage(imgfname, thr1); + } + if (flist.is_open()) { + flist.close(); } - return 0; } diff --git a/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp b/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp index 55220f781..f69184230 100644 --- a/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp +++ b/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp @@ -13,7 +13,8 @@ #include "sls/sls_detector_defs.h" #ifndef MOENCH04 //#ifndef RECT -#include "moench03T1ZmqDataNew.h" +#include "moench03v2Data.h" +//#include "moench03T1ZmqDataNew.h" //#endif //#ifdef RECT //#include "moench03T1ZmqDataNewRect.h" @@ -31,6 +32,7 @@ #include #include #include +#include #include //json header in zmq stream @@ -63,36 +65,48 @@ int main(int argc, char *argv[]) { * trial.o [socket ip] [starting port number] [send_socket ip] [send port * number] * - */ - FILE *of = NULL; - int fifosize = 5000; + */ + std::map args = { + {"numinterfaces","1"}, + {"rx_zmqip","10.1.2.102"}, + {"rx_zmqport","7770"}, + {"zmqip","129.129.202.153"}, + {"zmqport","7780"}, + {"nthreads","5"}, + {"fifosize","5000"}, + {"nsigma","5"}, + {"gainfile","none"}, + {"nbinsx","5"}, + {"nbinsy","5"}, + {"etafile","none"}, + {"etabinsx","1000"}, + {"etamin","-1"}, + {"etamax","2"} }; + FILE *of = NULL; int etabins = 1000, etabinsy = 1000; // nsubpix*2*100; double etamin = -1, etamax = 2; int nSubPixelsX = 2; int emin, emax; int nSubPixelsY = 2; + int nthreads = 5; + int fifosize = 5000; + uint32_t nSigma = 5; - // help - if (argc < 3) { - cprintf(RED, "Help: ./trial [receive socket ip] [receive starting port " - "number] [send_socket ip] [send starting port number] " - "[nthreads] [nsubpix] [gainmap] [etafile]\n"); - return EXIT_FAILURE; - } + string etafname;// = NULL; + string gainfname;// = NULL; // receive parameters bool send = false; - char *socketip = argv[1]; - uint32_t portnum = atoi(argv[2]); // send parameters if any - char *socketip2 = 0; - uint32_t portnum2 = 0; + string socketip2;// = 0; + uint32_t portnum2 = 0; + string socketip;// = 0; + uint32_t portnum = 0; sls::zmqHeader zHeader, outHeader; zHeader.jsonversion = SLS_DETECTOR_JSON_HEADER_VERSION; outHeader.jsonversion = SLS_DETECTOR_JSON_HEADER_VERSION; - uint32_t nSigma = 5; int ok; @@ -102,48 +116,85 @@ int main(int argc, char *argv[]) { // time_t begin,end,finished; int rms = 0; - if (argc > 4) { - socketip2 = argv[3]; - portnum2 = atoi(argv[4]); - if (portnum2 > 0) - send = true; - } - cout << "\nrx socket ip : " << socketip << "\nrx port num : " << portnum; - if (send) { - cout << "\ntx socket ip : " << socketip2 - << "\ntx port num : " << portnum2; - } - int nthreads = 5; - if (argc > 5) - nthreads = atoi(argv[5]); + send = true; + // help + if (argc < 5) { + std::string name, value,sline; + int ic=0; + ifstream flist; + flist.open (argv[1], std::ifstream::in); + if (flist.is_open()) { + cout << "Using config file " < 6) { - nSubPixelsX = atoi(argv[6]); - nSubPixelsY = nSubPixelsX; -#ifdef RECT - nSubPixelsX = 2; -#endif - } - cout << "Number of subpixels is: " << nSubPixelsX << " " << nSubPixelsY - << endl; + } + flist.close(); + } else { + cprintf(RED, "Arguments are either: \n [config file] \n or the following list (deprecated): [receive socket ip] [receive starting port " + "number] [send_socket ip] [send starting port number] " + "[nthreads] [nsubpix] [gainmap] [etafile]\n"); + return EXIT_FAILURE; + } + } else { + args["rx_zmqip"]=argv[1]; + args["rx_zmqport"]=argv[2]; + + args["zmqip"]=argv[3]; + args["zmqport"]=argv[4]; + if (argc > 5) + args["nthreads"] = argv[5]; + if (argc > 6) { + args["nbinsx"]=argv[6]; + args["nbinsy"]=argv[6]; + } + + if (argc > 7) { + args["gainfile"]=argv[7]; + } + if (argc > 8) { + args["etafilefile"]=argv[8]; + } - char *gainfname = NULL; - if (argc > 7) { - gainfname = argv[7]; - cout << "Gain map file name is: " << gainfname << endl; } - char *etafname = NULL; - if (argc > 8) { - etafname = argv[8]; - cout << "Eta file name is: " << etafname << endl; + for (auto const& x : args) + { + std::cout << x.first // string (key) + << ':' + << x.second // string's value + << std::endl; + } + + socketip = args["rx_zmqip"]; + portnum = atoi(args["rx_zmqport"].c_str()); + + socketip2 = args["zmqip"]; + portnum2 = atoi(args["zmqport"].c_str()); + + nthreads = atoi(args["nthreads"].c_str()); + nSubPixelsX =atoi(args["nbinsx"].c_str()); + nSubPixelsY =atoi(args["nbinsy"].c_str()); + gainfname = args["gainfile"]; + etafname = args["etafilefile"]; + + if (atoi(args["nuninterfaces"].c_str())>1){ + cprintf(RED, "Sorry, at the moment only a single interface is supported instead of %d\n",atoi(args["nuninterfaces"].c_str())); + return EXIT_FAILURE; } + // slsDetectorData *det=new moench03T1ZmqDataNew(); #ifndef MOENCH04 - cout << "This is a Moench03" << endl; - moench03T1ZmqDataNew *det = new moench03T1ZmqDataNew(); + cout << "This is a Moench03 v2" << endl; + //moench03T1ZmqDataNew *det = new moench03T1ZmqDataNew(); + moench03v2Data *det = new moench03v2Data(); + cout << "MOENCH03!" << endl; #endif #ifdef MOENCH04 cout << "This is a Moench04" << endl; @@ -177,8 +228,8 @@ int main(int argc, char *argv[]) { double *gmap = NULL; uint32_t nnnx, nnny; - if (gainfname) { - gm = ReadFromTiff(gainfname, nnny, nnnx); + //if (gainfname) { + gm = ReadFromTiff(gainfname.c_str(), nnny, nnnx); if (gm && nnnx == (uint)npx && nnny == (uint)npy) { gmap = new double[npx * npy]; for (int i = 0; i < npx * npy; i++) { @@ -187,7 +238,7 @@ int main(int argc, char *argv[]) { delete[] gm; } else cout << "Could not open gain map " << gainfname << endl; - } + //} // analogDetector *filter=new // analogDetector(det,1,NULL,1000); @@ -205,8 +256,8 @@ int main(int argc, char *argv[]) { eta2InterpolationPosXY *interp = new eta2InterpolationPosXY( npx, npy, nSubPixelsX, nSubPixelsY, etabins, etabinsy, etamin, etamax); - if (etafname) - interp->readFlatField(etafname); + //if (etafname) + interp->readFlatField(etafname.c_str()); interpolatingDetector *filter = new interpolatingDetector( det, interp, nSigma, 1, cm, 1000, 10, -1, -1, gainmap, gs); @@ -226,13 +277,13 @@ int main(int argc, char *argv[]) { try { #endif - zmqsocket = new sls::ZmqSocket(socketip, portnum); + zmqsocket = new sls::ZmqSocket(socketip.c_str(), portnum); #ifdef NEWZMQ } catch (...) { cprintf(RED, "Error: Could not create Zmq socket on port %d with ip %s\n", - portnum, socketip); + portnum, socketip.c_str()); delete zmqsocket; return EXIT_FAILURE; } @@ -242,7 +293,7 @@ int main(int argc, char *argv[]) { if (zmqsocket->IsError()) { cprintf(RED, "Error: Could not create Zmq socket on port %d with ip %s\n", - portnum, socketip); + portnum, socketip.c_str()); delete zmqsocket; return EXIT_FAILURE; } @@ -263,14 +314,14 @@ int main(int argc, char *argv[]) { // receive socket try { #endif - zmqsocket2 = new sls::ZmqSocket(portnum2, socketip2); + zmqsocket2 = new sls::ZmqSocket(portnum2, socketip2.c_str()); #ifdef NEWZMQ } catch (...) { cprintf(RED, "Error: Could not create Zmq socket server on port %d and " "ip %s\n", - portnum2, socketip2); + portnum2, socketip2.c_str()); // delete zmqsocket2; // zmqsocket2=NULL; // delete zmqsocket; @@ -284,7 +335,7 @@ int main(int argc, char *argv[]) { cprintf(RED, "AAA Error: Could not create Zmq socket server on port %d " "and ip %s\n", - portnum2, socketip2); + portnum2, socketip2.c_str()); // delete zmqsocket2; // delete zmqsocket; // return EXIT_FAILURE; @@ -722,6 +773,25 @@ int main(int argc, char *argv[]) { cprintf(MAGENTA, "%d %d %d %d\n", xmin, xmax, ymin, ymax); mt->setROI(xmin, xmax, ymin, ymax); + + if (addJsonHeader.find("xMin") != addJsonHeader.end()) { + istringstream(addJsonHeader.at("xMin")) >> xmin; + } + + if (addJsonHeader.find("yMin") != addJsonHeader.end()) { + istringstream(addJsonHeader.at("yMin")) >> ymin; + } + + if (addJsonHeader.find("xMax") != addJsonHeader.end()) { + istringstream(addJsonHeader.at("xMax")) >> xmax; + } + + if (addJsonHeader.find("yMax") != addJsonHeader.end()) { + istringstream(addJsonHeader.at("yMax")) >> ymax; + } + + + if (addJsonHeader.find("dynamicRange") != addJsonHeader.end()) { istringstream(addJsonHeader.at("dynamicRange")) >> dr; dr = 32; @@ -821,7 +891,7 @@ int main(int argc, char *argv[]) { // cout << acqIndex << " " << frameIndex << " " << subFrameIndex << " // "<< detSpec1 << " " << timestamp << " " << packetNumber << endl; // cprintf(GREEN, "frame\n"); - if (packetNumber >= 40) { + if (packetNumber <= 50) { //*((int*)buff)=frameIndex; if (insubframe == 0) f0 = frameIndex; From 8bce89d5dc00e59e44d7e135a0accfbc3b085f2f Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jan 2024 16:11:59 +0100 Subject: [PATCH 35/38] pmod for 7.0.3 and 8.0.0 from previous releases --- .../DetectorSoftware/slsDetectorPackage/files/variants | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/psi-pmodules/DetectorSoftware/slsDetectorPackage/files/variants b/psi-pmodules/DetectorSoftware/slsDetectorPackage/files/variants index 27216a3b2..f9613e15a 100644 --- a/psi-pmodules/DetectorSoftware/slsDetectorPackage/files/variants +++ b/psi-pmodules/DetectorSoftware/slsDetectorPackage/files/variants @@ -3,3 +3,7 @@ slsDetectorPackage/7.0.1_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10 slsDetectorPackage/7.0.1_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10 slsDetectorPackage/7.0.2_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10 slsDetectorPackage/7.0.2_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10 +slsDetectorPackage/7.0.3_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10 +slsDetectorPackage/7.0.3_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10 +slsDetectorPackage/8.0.0_rh7 stable cmake/3.15.5 Qt/5.12.10 +slsDetectorPackage/8.0.0_rh8 stable cmake/3.15.5 Qt/5.12.10 \ No newline at end of file From 5e9fd43d4924339ed9678bab5f262882d957df70 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jan 2024 17:05:07 +0100 Subject: [PATCH 36/38] updated pmod 8.0.1 for rh7 and rh8 --- .../DetectorSoftware/slsDetectorPackage/files/variants | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/psi-pmodules/DetectorSoftware/slsDetectorPackage/files/variants b/psi-pmodules/DetectorSoftware/slsDetectorPackage/files/variants index f9613e15a..9bfcc52e8 100644 --- a/psi-pmodules/DetectorSoftware/slsDetectorPackage/files/variants +++ b/psi-pmodules/DetectorSoftware/slsDetectorPackage/files/variants @@ -6,4 +6,7 @@ slsDetectorPackage/7.0.2_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10 slsDetectorPackage/7.0.3_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10 slsDetectorPackage/7.0.3_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10 slsDetectorPackage/8.0.0_rh7 stable cmake/3.15.5 Qt/5.12.10 -slsDetectorPackage/8.0.0_rh8 stable cmake/3.15.5 Qt/5.12.10 \ No newline at end of file +slsDetectorPackage/8.0.0_rh8 stable cmake/3.15.5 Qt/5.12.10 +slsDetectorPackage/8.0.1_rh7 stable cmake/3.15.5 Qt/5.12.10 +slsDetectorPackage/8.0.1_rh8 stable cmake/3.15.5 Qt/5.12.10 + From a884db0e2ce51fed5f6538a4da73e19c8b5ef870 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 26 Jan 2024 10:41:24 +0100 Subject: [PATCH 37/38] m3 fix to get kernel version properly on nios without an incorrect error msg (#898) --- .../bin/mythen3DetectorServer_developer | Bin 300752 -> 300752 bytes .../slsDetectorServer/src/common.c | 5 +++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index e97d939e2ffcde60d087993d06aa2df307704781..290738b4337b64be8a30ea46b9199191680860f0 100755 GIT binary patch delta 25408 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%0ABZyT9k^K(51xUgGRtC|zmBe-BrO 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
      a;~K9H*^qO$%k^eN?xdDHZ36RG zZXMAI=&OmHP_eG`q!Y@th+1@pXIq-x*_0z|*eJORhRPxu+y!~}qZM6D--~{>!Cg&C sUDWFN5>tSqs^-EfP_SYOc2-qf*9u01jan=4GUsEd$+eAAOsU5I2aNQO)c^nh diff --git a/slsDetectorServers/slsDetectorServer/src/common.c b/slsDetectorServers/slsDetectorServer/src/common.c index 1eddaef0a..64784b543 100644 --- a/slsDetectorServers/slsDetectorServer/src/common.c +++ b/slsDetectorServers/slsDetectorServer/src/common.c @@ -114,10 +114,11 @@ int getTimeFromString(char *buf, time_t *result) { t.tm_mday, t.tm_mon, t.tm_year + 1900, t.tm_hour, t.tm_min, t.tm_sec)); *result = mktime(&t); - if (*result == -1) { + /* Do not check as it fails with nios + if (*result == (time_t)-1) { LOG(logERROR, ("Could not convert time structure to time_t\n")); return FAIL; - } + }*/ return OK; } From d17bc5da626833dcb40b6d73bb14b9a1e6bb4c10 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 30 Jan 2024 09:58:53 +0100 Subject: [PATCH 38/38] moench: changed max shifts of adc clk from 240 to 200 (#900) --- .../bin/moenchDetectorServer_developer | Bin 295380 -> 295308 bytes .../slsDetectorServer_defs.h | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 2dbd7936c3a5e3b9b7d7f9cb7bd090ee0d4bdcde..16b15b856630ec018fefddfde3fe2630ba313e96 100755 GIT binary patch delta 95425 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

      `qh=&JA-tBD@iL~dFe0;;4__A$6Vuy=H*P#` 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 delta 95367 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ට~H>@QVQaq785lsrvNm%DB^c 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

      tF++ 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 diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h index 9b9f23eb5..a2ca7be9b 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h @@ -61,7 +61,7 @@ #define ASIC_FILTER_MAX_RES_VALUE (1) #define MAX_SELECT_CHIP10_VAL (63) -#define MAX_PHASE_SHIFTS (240) +#define MAX_PHASE_SHIFTS (200) #define BIT16_MASK (0xFFFF) #define ADC_DECMT_QUARTER_SPEED (0x3)

    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

  • ir1p#tGJ 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 delta 81149 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 Date: Mon, 23 Oct 2023 15:56:22 +0200 Subject: [PATCH 05/38] fix warning for prev_val (variable size array) in tests (#838) --- slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp index 1be0fb46c..ccc5c9410 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp @@ -689,10 +689,10 @@ TEST_CASE("confadc", "[.cmd]") { auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2) { - int ndet = det.size(); - int nchip = 10; - int nadc = 32; - int prev_val[ndet][nchip][nadc]; + const int ndet = det.size(); + const int nchip = 10; + const int nadc = 32; + std::vector>> prev_val(ndet, std::vector>(nchip, std::vector(nadc))); for (int i = 0; i != ndet; ++i) { for (int j = 0; j != nchip; ++j) { for (int k = 0; k != nadc; ++k) { From ebb352b13ae42a6054af985e7566f93f93eb7dc4 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 6 Nov 2023 16:08:07 +0100 Subject: [PATCH 06/38] Dev: : gui acq finished callback for different status (#850) * fix acquisition finished status to have different status for different modules, but does not have to be error. for eg. jf sync fw (2.4.1 gives idle for master and stopped for slaves when stopping acquiistion) --- slsDetectorSoftware/src/DetectorImpl.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index 9bf392e5a..e22f58fc8 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -1220,10 +1220,26 @@ int DetectorImpl::acquire() { dataProcessingThread.join(); if (acquisition_finished != nullptr) { - int status = Parallel(&Module::getRunStatus, {}).squash(ERROR); + // status + runStatus status = IDLE; + auto statusList = Parallel(&Module::getRunStatus, {}); + status = statusList.squash(ERROR); + // difference, but none error + if (status == ERROR && (!statusList.any(ERROR))) { + // handle jf sync issue (master idle, slaves stopped) + if (statusList.contains_only(IDLE, STOPPED)) { + status = STOPPED; + } + else + status = statusList.squash(RUNNING); + } + + // progress auto a = Parallel(&Module::getReceiverProgress, {}); double progress = (*std::max_element(a.begin(), a.end())); - acquisition_finished(progress, status, acqFinished_p); + + // callback + acquisition_finished(progress, static_cast(status), acqFinished_p); } clock_gettime(CLOCK_REALTIME, &end); From 314a8a0daab93058082398e766da1da19fd679c2 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 6 Nov 2023 16:11:52 +0100 Subject: [PATCH 07/38] handling inconsistent fnums to be -1 in gui, so when one sets 0 (change of value) will also give an exception (#854) --- slsDetectorGui/src/qTabMeasurement.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/slsDetectorGui/src/qTabMeasurement.cpp b/slsDetectorGui/src/qTabMeasurement.cpp index c3282d67e..0bcfb7111 100644 --- a/slsDetectorGui/src/qTabMeasurement.cpp +++ b/slsDetectorGui/src/qTabMeasurement.cpp @@ -803,8 +803,9 @@ void qTabMeasurement::GetNextFrameNumber() { "Inconsistent starting frame number for all detectors."); spinNextFrameNumber->setValue(retval); } - CATCH_DISPLAY("Could not get starting frame number.", - "qTabMeasurement::GetNextFrameNumber") + CATCH_HANDLE("Could not get starting frame number.", + "qTabMeasurement::GetNextFrameNumber", spinNextFrameNumber, + &QSpinBox::setValue, -1) connect(spinNextFrameNumber, SIGNAL(valueChanged(int)), this, SLOT(SetNextFrameNumber(int))); } From 397e846509cc6868ffa41b9bdf4cd722ab6b8df0 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 7 Nov 2023 09:30:46 +0100 Subject: [PATCH 08/38] Dev: fix py virtual test (#846) * draft to fix virtual test when it fails * catching errors in tests and removing sigchild ignore so servers (process in background) executing commands will not fail (pclose no child processes, if sigchld is ignored) fixed * uncommented python loading config * somehow killal slsReciever in second detector test fails even though no receiver running * fixing script for virtual simlator test:fixed issue with check if process running, fixed moench tests --- .../bin/ctbDetectorServer_developer | Bin 327504 -> 328240 bytes .../bin/eigerDetectorServer_developer | Bin 444195 -> 444195 bytes .../bin/gotthard2DetectorServer_developer | Bin 286700 -> 286768 bytes .../bin/gotthardDetectorServer_developer | Bin 276444 -> 277180 bytes .../bin/jungfrauDetectorServer_developer | Bin 312296 -> 312432 bytes .../bin/moenchDetectorServer_developer | Bin 294524 -> 295260 bytes .../bin/mythen3DetectorServer_developer | Bin 296588 -> 300752 bytes .../include/slsDetectorServer_funcs.h | 2 +- .../src/slsDetectorServer_funcs.c | 20 +-- .../tests/test-CmdProxy-jungfrau.cpp | 4 +- .../tests/test-CmdProxy-moench.cpp | 87 +++++++++++ slsDetectorSoftware/tests/test-CmdProxy.cpp | 9 +- slsSupportLib/include/sls/versionAPI.h | 14 +- tests/scripts/test_simulators.py | 138 +++++++++++------- 14 files changed, 200 insertions(+), 74 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index e8aff2c878a0f8050d3d19e0eef8e9f1df954298..d669625a65f84406bb36c69e4643734e758f39d1 100755 GIT binary patch delta 148607 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ÐO5;c$pvF^`$I0t(!vJ)=k*U^F2D0 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
    30! z+UIhtjb>)$9N*5 z^3nS|Df-W0-f+^R##g6%to45Uf4f-UEIkc3uR=9k$H-bi9<|ZC@~Yg`6kWM=X3y$d zT2VwhSX!Yv{_(7-Xob!ER@xgK@ACpfYhF@cc?EOi3SQli|UK%@9K`v7F}W)6?458v0Vra(NnGmYUWsEqb1`_4F)r)-0UA zz(!%TFR<#1d?MFYs2kYYiVZE}9W$JZS|&P=w=i+AjSuo+rC?D@QlBkS`LIQr*T(5R z_R*s5evln8eccb5XY6{@P1g$^*9#Atwc~YO1{KM!+Q|0vJ?_&L_IrF z^^T=Cd&jDUbl!9f-a=OHs*sfnJJ6y7^w8)Au5IuXvp>C})y1!mFqOBucw=|;aR1zY zjo{I%Jtze~1~OL#=+TZKmr8b!i+Af?QoZWgyC=Vv)EDgfYQ1s~c9~rPy2I*lrEunO znU^`U1-t(9Ktb!s=Z;Cb(;Dnb^7_u3q=((!`c_ZUL)`1B2)nvHy+Yj&x8Ld*-8buw zitgJy%Knq*ZWqgM_<5HX{=Y=2CfA=Y;#nOL^}2&siQ3pw$DMpT-)>?sbX!_JlN8Ue z#4}d4ipsWW&Pdm16QtHUl+C^O#DD(D${!y1iMkJZZLjRE?5{@A+bQAg6{g>0JwC*H ztVYo4iToqO-Uf7Y`LuYl9v14g2(O-Nbzlo`tKs{$SjUI;2?@;|ll744pRIwn((=y# zoQ@ll_1w>;qwU7$(y=T^5C1#T(Y`-OH?)F|th)TIfrC-&uR6wePhF(yQMpU(Gp>(`m z$zLnENz7qtQYt?xI z=eg${C)1mMDdCT+3o`9o_1ZKXf+1?IHVVn#Xi zkkR8Tj@>yfWr`en-m-t^H?jj}ur_Hc8N>hajyHL!*C$xB(RU1k3GbSwt#o^VonF~m zY^^_SwKD1SCV5WXoUwy<^V=St@CpfUCgI)9mbMa)O9?KCxC91&(P4K*G3yl{TKmN0 z53em*RKK3Jli~i4K3G)8nB_ypEFYT2J-Wl<@$#V=c@K%Ue`rvz&CGjr=WShkd+j}X zo|fUQp{inyuFl>v-REoQXo}U_$8J>t)uRnDsT%5OkGfaS)u!KC?o>;bYGz!Lb@3^+ zl*mFS|J4t>{)MH|y(8%Unx(FMo364adAR?_$3MRWX@-A6UooNCdpjLWWtp_u zdrNKmf*zZEgjRBdK18sMTP;WM1xku8IgK}7SL6Z(brv}X1}rYm0cA! z&dkgA>2dCE^49JB5!$)~V}{QrA5-6!xpgDXV$EtWeXO z(;S_yXivYNaUMOEs;YnexuaGX@k®vtCByM8eI7oGxMkJiKf)@&u=0loURwqhQA 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 diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 3489643542cab4fc36e0e4cf9ccb2842e315c1b6..a7a6f7b997b8f2322f4e53632af93ded0676dcdd 100755 GIT binary patch delta 68148 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