From ed5a1cdf1c098757bc1ecd112e5b029aab525c99 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 15 Mar 2022 17:17:28 +0100 Subject: [PATCH 1/5] eiger: get nextframenumber for 10g fixed (was connected to 1g registers for get), eiger/jungfrau/ctb/moench: if after a stop the next framenumbers are inconsistent, then it will get their max value andf set to +1 --- slsDetectorServers/eigerDetectorServer/Beb.c | 10 +++++----- slsDetectorSoftware/src/Detector.cpp | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/Beb.c b/slsDetectorServers/eigerDetectorServer/Beb.c index 90512c7b1..ab602b475 100644 --- a/slsDetectorServers/eigerDetectorServer/Beb.c +++ b/slsDetectorServers/eigerDetectorServer/Beb.c @@ -1251,20 +1251,20 @@ int Beb_GetNextFrameNumber(uint64_t *retval, int tengigaEnable) { else { uint64_t left10g = - Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_MSB_OFST); - temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_LSB_OFST); + Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_10G_LEFT_MSB_OFST); + temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_10G_LEFT_LSB_OFST); left10g = ((left10g << 32) | temp) >> 16; ++left10g; // increment for firmware uint64_t right10g = - Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_MSB_OFST); - temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_LSB_OFST); + Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_10G_LEFT_MSB_OFST); + temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_10G_LEFT_LSB_OFST); right10g = ((right10g << 32) | temp) >> 16; Beb_close(fd, csp0base); ++right10g; // increment for firmware if (left10g != right10g) { - LOG(logERROR, ("Retrieved inconsistent frame numbers from `0g left " + LOG(logERROR, ("Retrieved inconsistent frame numbers from 10g left " "%llu and right %llu\n", (long long int)left10g, (long long int)right10g)); *retval = (left10g > right10g) diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 025370bf7..94b4630cb 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -783,6 +783,25 @@ void Detector::startDetectorReadout() { void Detector::stopDetector(Positions pos) { pimpl->Parallel(&Module::stopAcquisition, pos); + + // validate consistent frame numbers + switch (getDetectorType().squash()) { + case defs::EIGER: + case defs::JUNGFRAU: + case defs::MOENCH: + case defs::CHIPTESTBOARD: { + auto res = getNextFrameNumber(pos); + if (!res.equal()) { + uint64_t maxVal = 0; + for (auto it : res) { + maxVal = std::max(maxVal, it); + } + setNextFrameNumber(maxVal + 1); + } + } break; + default: + break; + } } Result Detector::getDetectorStatus(Positions pos) const { @@ -1563,7 +1582,6 @@ std::vector Detector::getGainModeList() const { return std::vector{ defs::DYNAMIC, defs::FORCE_SWITCH_G1, defs::FORCE_SWITCH_G2, defs::FIX_G1, defs::FIX_G2, defs::FIX_G0}; - break; default: throw RuntimeError("Gain mode is not implemented for this detector."); } From 9e050060f3c75c33cf85b1d13e4c9cc39908e460 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 15 Mar 2022 17:18:56 +0100 Subject: [PATCH 2/5] eiger binary in --- .../bin/eigerDetectorServer_developer | Bin 413415 -> 413415 bytes slsSupportLib/include/sls/versionAPI.h | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 8f791e4b0d9f46cbcde467f778bab09d397d443f..3eb68629edbf82c343199a255138b941d90a18dc 100755 GIT binary patch delta 157 zcmaDpSMvE>$qiOAOw6Lw12`E~CL73b0ojum*hx>em*txLRz|3KvCQ_xGK>yRic35g z*g0zwq$?)KGniN~FfagVg9dp9ml|f~3X2AYmgy|$qiOAOiaqt12`E~CL73b0ojum*hx>em*txLRz|3KvCQ_xGK>yRiYguq z?3^_T(iIcr8B8n~7#M)GL4!PlOARw~g+&7c%XF4_#(0o2woa%r8>li1WM$i1;u)h1 ifY!7>=w}3CrtJ^ Date: Wed, 16 Mar 2022 11:35:27 +0100 Subject: [PATCH 3/5] added tests --- RELEASE.txt | 2 ++ slsDetectorSoftware/tests/test-CmdProxy.cpp | 35 +++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/RELEASE.txt b/RELEASE.txt index 23e0e1ade..2f9b0e55b 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -42,6 +42,8 @@ This document describes the differences between v7.0.0 and v6.x.x - start non blocking acquisition at modular level - hostname cmd failed when connecting to servers in update mode (ctb, moench, jungfrau, eiger) - missingpackets signed (negative => extra packets) +- 10g eiger nextframenumber get fixed. +- stop, able to set nextframenumber to a consistent (max + 1) for all modules if different (eiger/ctb/jungfrau/moench) 2. Resolved Issues diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index 4a593eb95..c0565d471 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -2126,6 +2126,41 @@ TEST_CASE("nextframenumber", "[.cmd]") { proxy.Call("nextframenumber", {"1"}, -1, PUT, oss); REQUIRE(oss.str() == "nextframenumber 1\n"); } + + 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(1); + det.setExptime(std::chrono::microseconds(200)); + det.setPeriod(std::chrono::milliseconds(1)); + det.startDetector(); + std::this_thread::sleep_for(std::chrono::seconds(2)); + auto currentfnum = + det.getNextFrameNumber().tsquash("inconsistent frame nr in test"); + REQUIRE(currentfnum == 2); + if (det_type == defs::EIGER) { + auto prev_tengiga = + det.getTenGiga().tsquash("inconsistent ten giga enable"); + det.setTenGiga(true); + det.setNextFrameNumber(1); + det.startDetector(); + std::this_thread::sleep_for(std::chrono::seconds(2)); + auto currentfnum = det.getNextFrameNumber().tsquash( + "inconsistent frame nr in test"); + REQUIRE(currentfnum == 2); + det.setTenGiga(prev_tengiga); + } + + det.setTimingMode(prev_timing); + det.setNumberOfFrames(prev_frames); + det.setExptime(prev_exptime); + det.setPeriod(prev_period); for (int i = 0; i != det.size(); ++i) { det.setNextFrameNumber(prev_sfnum[i], {i}); } From 561777dad6cbe586f467f7bc28037502ee4a4a56 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 17 Mar 2022 09:02:40 +0100 Subject: [PATCH 4/5] fixed clang--format version --- python/scripts/generate_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/scripts/generate_functions.py b/python/scripts/generate_functions.py index bf943330a..9f91af962 100644 --- a/python/scripts/generate_functions.py +++ b/python/scripts/generate_functions.py @@ -15,7 +15,7 @@ import sys from parse import system_include_paths, clang_format_version -required_version = 13 +required_version = 12 RED = '\033[91m' ENDC = '\033[0m' if (ver := clang_format_version()) != required_version: From 78823760b37b1d93aef97262d0ec78ef3b2fb148 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 17 Mar 2022 09:52:39 +0100 Subject: [PATCH 5/5] more checks in generate functions --- python/scripts/generate_functions.py | 128 ++++++++++++++++++--------- 1 file changed, 85 insertions(+), 43 deletions(-) diff --git a/python/scripts/generate_functions.py b/python/scripts/generate_functions.py index 9f91af962..7be880913 100644 --- a/python/scripts/generate_functions.py +++ b/python/scripts/generate_functions.py @@ -6,57 +6,57 @@ sls::Detector class. The tool needs the libclang bindings to be installed. When the Detector API is updated this file should be run -manually +manually. """ from clang import cindex import subprocess import argparse import sys - +import time +from pathlib import Path from parse import system_include_paths, clang_format_version -required_version = 12 -RED = '\033[91m' +REDC = '\033[91m' +GREENC = '\033[92m' ENDC = '\033[0m' -if (ver := clang_format_version()) != required_version: - print(f'{RED}Clang format version {required_version} required, detected: {ver}. Bye!{ENDC}') - sys.exit(1) +def red(msg): + return f'{REDC}{msg}{ENDC}' + +def green(msg): + return f'{GREENC}{msg}{ENDC}' + +def check_clang_format_version(required_version): + if (ver := clang_format_version()) != required_version: + msg = red(f'Clang format version {required_version} required, detected: {ver}. Bye!') + print(msg) + sys.exit(1) + else: + msg = green(f'Found clang-format version {ver}') + print(msg) + +def check_for_compile_commands_json(path): + # print(f"Looking for compile data base in: {path}") + compile_data_base_file = path/'compile_commands.json' + if not compile_data_base_file.exists(): + msg = red(f"No compile_commands.json file found in {path}. Bye!") + print(msg) + sys.exit(1) + else: + msg = green(f'Found: {compile_data_base_file}') + print(msg) default_build_path = "/home/l_frojdh/sls/build/" fpath = "../../slsDetectorSoftware/src/Detector.cpp" -parser = argparse.ArgumentParser() -parser.add_argument( - "-p", - "--build_path", - help="Path to the build database", - type=str, - default=default_build_path, -) -cargs = parser.parse_args() -db = cindex.CompilationDatabase.fromDirectory(cargs.build_path) -index = cindex.Index.create() -args = db.getCompileCommands(fpath) -args = list(iter(args).__next__().arguments)[0:-1] -args = args + "-x c++ --std=c++11".split() -syspath = system_include_paths("clang++") -incargs = ["-I" + inc for inc in syspath] -args = args + incargs - - -tu = index.parse(fpath, args=args) m = [] ag = [] - lines = [] - ag2 = [] - cn = [] def get_arguments(node): @@ -119,25 +119,67 @@ def visit(node): lines.append( f'.def("{child.spelling}",{fs} &Detector::{child.spelling}{args})' ) - print(f'&Detector::{child.spelling}{args})') + if cargs.verbose: + print(f'&Detector::{child.spelling}{args})') cn.append(child) for child in node.get_children(): visit(child) -visit(tu.cursor) +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-p", + "--build_path", + help="Path to the build database", + type=Path, + default=default_build_path, + ) + parser.add_argument( + "-v", + "--verbose", + help="more output", + action='store_true', + ) + cargs = parser.parse_args() + + check_clang_format_version(12) + check_for_compile_commands_json(cargs.build_path) + print("Parsing functions in Detector.h - ", end = "", flush = True) + t0 = time.perf_counter() + #parse functions + db = cindex.CompilationDatabase.fromDirectory(cargs.build_path) + index = cindex.Index.create() + args = db.getCompileCommands(fpath) + args = list(iter(args).__next__().arguments)[0:-1] + args = args + "-x c++ --std=c++11".split() + syspath = system_include_paths("clang++") + incargs = ["-I" + inc for inc in syspath] + args = args + incargs + tu = index.parse(fpath, args=args) + visit(tu.cursor) + print(green('OK')) + print(f'Parsing took {time.perf_counter()-t0:.3f}s') -with open("../src/detector_in.cpp") as f: - data = f.read() -s = "".join(lines) -s += ";" -text = data.replace("[[FUNCTIONS]]", s) -warning = "/* WARINING This file is auto generated any edits might be overwritten without warning */\n\n" -with open("../src/detector.cpp", "w") as f: - f.write(warning) - f.write(text) + print("Read detector_in.cpp - ", end = "") + with open("../src/detector_in.cpp") as f: + data = f.read() + s = "".join(lines) + s += ";" + text = data.replace("[[FUNCTIONS]]", s) + warning = "/* WARINING This file is auto generated any edits might be overwritten without warning */\n\n" + print(green("OK")) + print("Writing to detector.cpp - ", end = "") + with open("../src/detector.cpp", "w") as f: + f.write(warning) + f.write(text) + print(green('OK')) -# run clang format on the output -subprocess.run(["clang-format", "../src/detector.cpp", "-i"]) + # run clang format on the output + print('Running clang format on generated source -', end = "") + subprocess.run(["clang-format", "../src/detector.cpp", "-i"]) + print(green(" OK")) + print("Changes since last commit:") + subprocess.run(['git', 'diff', '../src/detector.cpp'])