From a3e6cc90ea619bc51378477feda32ab60d22ac7c Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 27 Feb 2026 17:12:27 +0100 Subject: [PATCH 1/6] server versions werent getting updated (#1407) --- slsDetectorServers/ctbDetectorServer/Makefile | 2 +- .../bin/ctbDetectorServer_developer | Bin 332004 -> 332004 bytes .../eigerDetectorServer/Makefile | 2 +- .../bin/eigerDetectorServer_developer | Bin 448988 -> 448988 bytes .../gotthard2DetectorServer/Makefile | 2 +- .../bin/gotthard2DetectorServer_developer | Bin 296112 -> 296112 bytes .../jungfrauDetectorServer/Makefile | 2 +- .../bin/jungfrauDetectorServer_developer | Bin 316772 -> 316772 bytes .../moenchDetectorServer/Makefile | 2 +- .../bin/moenchDetectorServer_developer | Bin 297704 -> 297704 bytes .../mythen3DetectorServer/Makefile | 2 +- .../bin/mythen3DetectorServer_developer | Bin 306088 -> 306088 bytes .../xilinx_ctbDetectorServer/Makefile | 2 +- .../bin/xilinx_ctbDetectorServer_developer | Bin 306128 -> 306128 bytes slsSupportLib/include/sls/versionAPI.h | 14 +++++++------- 15 files changed, 14 insertions(+), 14 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/Makefile b/slsDetectorServers/ctbDetectorServer/Makefile index 0b56dd825..2bc1a2576 100755 --- a/slsDetectorServers/ctbDetectorServer/Makefile +++ b/slsDetectorServers/ctbDetectorServer/Makefile @@ -28,7 +28,7 @@ boot: $(OBJS) version_name=APICTB version_path=slsDetectorServers/ctbDetectorServer versioning: - cd ../../ && echo $(PWD) && echo `tput setaf 6; python updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` + cd ../../ && echo $(PWD) && echo `tput setaf 6; python etc/updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` $(PROGS): $(OBJS) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 2692e11e1161529df7d36a37f9f38451908afb0e..4684df85c9890374df4155c685944e4002cb3f9b 100755 GIT binary patch delta 52 zcmaE|P~^!%kqMg23lDyqo~Xhi(dg3Z!r1DIZFn}XkS;xynS66 Hi`gsy;}Q|R diff --git a/slsDetectorServers/eigerDetectorServer/Makefile b/slsDetectorServers/eigerDetectorServer/Makefile index 63910c6f9..f7f2be00a 100755 --- a/slsDetectorServers/eigerDetectorServer/Makefile +++ b/slsDetectorServers/eigerDetectorServer/Makefile @@ -28,7 +28,7 @@ boot: $(OBJS) version_name=APIEIGER version_path=slsDetectorServers/eigerDetectorServer versioning: - cd ../../ && echo $(PWD) && echo `tput setaf 6; python updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` + cd ../../ && echo $(PWD) && echo `tput setaf 6; python etc/updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` $(PROGS): $(OBJS) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 8890ca0bc602b5490f220e3da0f7c8b522750bf9..6bfcff97448e55fced7e4f8597246ae951d56c51 100755 GIT binary patch delta 43 wcmcb!S^Caq>4p}@7N!>FEi4U^Oh)G0n4p}@7N!>FEi4U^OokTQnI*1CPRz%HZJDvZCor`RRA~N4j%vj diff --git a/slsDetectorServers/jungfrauDetectorServer/Makefile b/slsDetectorServers/jungfrauDetectorServer/Makefile index 881f2e660..cc92b99c6 100755 --- a/slsDetectorServers/jungfrauDetectorServer/Makefile +++ b/slsDetectorServers/jungfrauDetectorServer/Makefile @@ -27,7 +27,7 @@ boot: $(OBJS) version_name=APIJUNGFRAU version_path=slsDetectorServers/jungfrauDetectorServer versioning: - cd ../../ && echo $(PWD) && echo `tput setaf 6; python updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` + cd ../../ && echo $(PWD) && echo `tput setaf 6; python etc/updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` $(PROGS): $(OBJS) diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 56fbc590f688e49ac4692028f16f3b5ba78eaecd..e9d362f54fd3c7a8e792919ada38363f154b4f06 100755 GIT binary patch delta 51 zcmaE|O8Cht;R%||3lDyuUigJsqS2+*g|XFzX{igdK9iC8b~kI diff --git a/slsDetectorServers/mythen3DetectorServer/Makefile b/slsDetectorServers/mythen3DetectorServer/Makefile index b6d68fac0..0b342191c 100755 --- a/slsDetectorServers/mythen3DetectorServer/Makefile +++ b/slsDetectorServers/mythen3DetectorServer/Makefile @@ -28,7 +28,7 @@ boot: $(OBJS) version_name=APIMYTHEN3 version_path=slsDetectorServers/mythen3DetectorServer versioning: - cd ../../ && echo $(PWD) && echo `tput setaf 6; python updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` + cd ../../ && echo $(PWD) && echo `tput setaf 6; python etc/updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` $(PROGS): $(OBJS) diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 2149b2a6c9a238f6c8a14b36befa49e225769195..42dcef1d98f591e0838f9e080b2891fccec3fed1 100755 GIT binary patch delta 39 xcmV+?0NDSi*Al4L60kJ51BA@YgEzQ`H@E?}H@E_segZN#htf6!x6(EQ)^u{N5s?4@ delta 39 xcmV+?0NDSi*Al4L60kJ514K;DgEzQ`H@E?}H@E_segZK$htf6!x6(EQ)^uHy5Yqqv diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile index 487959d6f..68609daa0 100755 --- a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile +++ b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile @@ -39,7 +39,7 @@ boot: $(OBJS) version_name=APIXILINXCTB version_path=slsDetectorServers/xilinx_ctbDetectorServer versioning: - cd ../../ && echo $(PWD) && echo `tput setaf 6; python updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` + cd ../../ && echo $(PWD) && echo `tput setaf 6; python etc/updateAPIVersion.py $(version_name) $(version_path); tput sgr0;` $(PROGS): $(OBJS) diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer index 074697017a2b83ac1e2e218d74006c948844d9aa..3fb9ec0b3fd62e3d01a5f748f4461b27bc00f58a 100755 GIT binary patch delta 39 scmca`UFgDfp@tU5ElehfOh)G0%@UdPq=1a}v}z_GX5OAw&5~sR03mM;JOBUy delta 39 scmca`UFgDfp@tU5ElehfOokTQ%@UdPq=1a}v}z_GX5OAw&5~sR03mG+JOBUy diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index ad186cee8..d61f4d50c 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -3,10 +3,10 @@ /** API versions */ #define APILIB "0.0.0 0x250909" #define APIRECEIVER "0.0.0 0x250822" -#define APICTB "0.0.0 0x260219" -#define APIGOTTHARD2 "0.0.0 0x260218" -#define APIMOENCH "0.0.0 0x260218" -#define APIEIGER "0.0.0 0x260218" -#define APIXILINXCTB "0.0.0 0x260218" -#define APIJUNGFRAU "0.0.0 0x260218" -#define APIMYTHEN3 "0.0.0 0x260219" +#define APICTB "0.0.0 0x260227" +#define APIGOTTHARD2 "0.0.0 0x260227" +#define APIMOENCH "0.0.0 0x260227" +#define APIEIGER "0.0.0 0x260227" +#define APIXILINXCTB "0.0.0 0x260227" +#define APIJUNGFRAU "0.0.0 0x260227" +#define APIMYTHEN3 "0.0.0 0x260227" From 60f5db12249bc1cdd8403cd3701f8a2dec796772 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 27 Feb 2026 17:17:11 +0100 Subject: [PATCH 2/6] xilinx: slow adcs (#1405) * xilinx: slow adcs * minor * xilinx: max reference voltage back to 2500mV for slow adcs ad7689 --- .../src/slsDetectorServer_funcs.c | 4 +- .../bin/xilinx_ctbDetectorServer_developer | Bin 306128 -> 306128 bytes .../slsDetectorFunctionList.c | 53 +++++++++++------- .../slsDetectorFunctionList.h | 6 +- .../slsDetectorServer_defs.h | 12 ++-- 5 files changed, 46 insertions(+), 29 deletions(-) diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index fa13d9d7a..1fa4fe417 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -1641,7 +1641,9 @@ int get_adc(int file_des) { // valid index if (ret == OK) { LOG(logDEBUG1, ("Getting ADC %d\n", serverAdcIndex)); -#if defined(MYTHEN3D) || defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD) +#if defined(XILINX_CHIPTESTBOARDD) + ret = getADC(serverAdcIndex, &retval, mess); +#elif defined(MYTHEN3D) || defined(GOTTHARD2D) ret = getADC(serverAdcIndex, &retval); if (ret == FAIL) { if (ind == TEMPERATURE_FPGA) { diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer index 3fb9ec0b3fd62e3d01a5f748f4461b27bc00f58a..658096edd77b08046a25bb66c4989b78f0f64b0a 100755 GIT binary patch delta 67581 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 delta 68290 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 aw1`<2ohDzR)+=SWO{VM_{b$dgJ^v5OdD=Mu diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c index 9b30ab682..3d8b1d493 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.c @@ -1482,11 +1482,8 @@ int setPower(enum DACINDEX ind, int val, char *mess) { return OK; } -int getADC(enum ADCINDEX ind, int *value) { +int getADC(enum ADCINDEX ind, int *value, char *mess) { *value = 0; -#ifdef VIRTUAL - return OK; -#endif switch (ind) { // slow adcs case S_ADC0: @@ -1498,44 +1495,60 @@ int getADC(enum ADCINDEX ind, int *value) { case S_ADC6: case S_ADC7: LOG(logDEBUG1, ("Reading Slow ADC Channel %d\n", (int)ind - S_ADC0)); - return getSlowADC((int)ind - S_ADC0, value); + return getSlowADC((int)ind - S_ADC0, value, mess); case TEMP_FPGA: LOG(logDEBUG1, ("Reading FPGA Temperature\n")); - return getTemperature(value); + return getTemperature(value, mess); default: - LOG(logERROR, ("Adc Index %d not defined \n", (int)ind)); + snprintf(mess, MAX_STR_LENGTH, "Adc Index %d not defined\n", (int)ind); + LOG(logERROR, (mess)); return FAIL; } } -int getSlowADC(int ichan, int *retval) { +int getSlowADC(int ichan, int *retval, char *mess) { *retval = 0; -#ifndef VIRTUAL + int fval = 0; + +#ifdef VIRTUAL + fval = 1; +#else char fname[MAX_STR_LENGTH]; memset(fname, 0, MAX_STR_LENGTH); sprintf(fname, SLOWADC_DRIVER_FILE_NAME, ichan); LOG(logDEBUG1, ("fname %s\n", fname)); - - if (readParameterFromFile(fname, "slow adc", retval) == FAIL) { - LOG(logERROR, ("Could not get slow adc\n")); + if (readParameterFromFile(fname, "slow adc", &fval) == FAIL) { + snprintf(mess, MAX_STR_LENGTH, "Could not read slow adc channel %d\n", + ichan); + LOG(logERROR, (mess)); return FAIL; } - // TODO assuming already converted to uV - // convert to uV - // double value = SLOWDAC_CONVERTION_FACTOR_TO_UV * (double)(*retval); - // LOG(logINFO, ("Slow ADC [%d]: %f uV\n", ichan, value)); - //*retval = (int)value; - - LOG(logINFO, ("Slow ADC [%d]: %d uV\n", ichan, (*retval))); #endif + + // value in uV + int refMaxuv = SLOW_ADC_MAX_MV * 1000; + int regMinuv = 0; + int maxSteps = SLOW_ADC_MAX_STEPS; + if (ConvertToDifferentRange(0, maxSteps, regMinuv, refMaxuv, fval, + retval) == FAIL) { + snprintf(mess, MAX_STR_LENGTH, + "Could not convert slow adc channel (fval:0x%x) to uv\n", + fval); + LOG(logERROR, (mess)); + return -1; + } + + LOG(logINFO, + ("\tSlow adc [%d]: %d uV (reg: 0x%x)\n", ichan, *retval, fval)); return OK; } -int getTemperature(int *retval) { +int getTemperature(int *retval, char *mess) { *retval = 0; #ifndef VIRTUAL if (readParameterFromFile(TEMP_DRIVER_FILE_NAME, "temperature", retval) == FAIL) { + snprintf(mess, MAX_STR_LENGTH, "Could not read temperature\n"); LOG(logERROR, ("Could not get temperature\n")); return FAIL; } diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.h b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.h index 64766d63e..8ccea05b8 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorFunctionList.h @@ -143,9 +143,9 @@ int getPowerRail(enum PWRINDEX ind, int *retval, char *mess); int getPower(enum DACINDEX ind, int *retval, char *mess); int setPower(enum DACINDEX ind, int val, char *mess); -int getADC(enum ADCINDEX ind, int *value); -int getSlowADC(int ichan, int *retval); -int getTemperature(int *retval); +int getADC(enum ADCINDEX ind, int *value, char *mess); +int getSlowADC(int ichan, int *retval, char *mess); +int getTemperature(int *retval, char *mess); int setHighVoltage(int val); // parameters - timing, extsig diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h index ef1cef945..591bf7545 100644 --- a/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/xilinx_ctbDetectorServer/slsDetectorServer_defs.h @@ -65,11 +65,13 @@ #define MAX_ANALOG_SAMPLES (0x3FFF) #define MAX_DIGITAL_SAMPLES (0x3FFF) -#define DAC_MIN_MV (0) -#define DAC_MAX_MV (2048) -#define POWER_RGLTR_MIN (1041) -#define POWER_RGLTR_MAX (2661) -#define VIO_MIN_MV (1200) // for fpga to function +#define DAC_MIN_MV (0) +#define DAC_MAX_MV (2048) +#define POWER_RGLTR_MIN (1041) +#define POWER_RGLTR_MAX (2661) +#define VIO_MIN_MV (1200) // for fpga to function +#define SLOW_ADC_MAX_MV (2500) // AD7689 +#define SLOW_ADC_MAX_STEPS (0xFFFF + 1) // AD7689 /* Defines in the Firmware */ #define WAIT_TIME_PATTERN_READ (10) From 6e090dbba2dee80161de528b3c3282b634f5903e Mon Sep 17 00:00:00 2001 From: AliceMazzoleni99 Date: Mon, 2 Mar 2026 14:30:27 +0100 Subject: [PATCH 3/6] Dev/update workflows (#1406) * only run tests for pull-requests * build gui and simulators * trigger upon push to all branches * renamed workflows * added python tests * added colorama and numpy * added slsdet to pythonpath * updated workflow name --- ...8-native.yml => docker-rh8-build-test.yml} | 17 +++++++- .gitea/workflows/docker-rh9-build-test.yml | 40 +++++++++++++++++++ ...8-local.yml => rh8-local-build-deploy.yml} | 4 +- .gitea/workflows/rh8-local-tests.yml | 6 +-- ...9-local.yml => rh9-local-build-deploy.yml} | 4 +- .gitea/workflows/rh9-local-tests.yml | 6 +-- .gitea/workflows/rh9-native.yml | 27 ------------- 7 files changed, 61 insertions(+), 43 deletions(-) rename .gitea/workflows/{rh8-native.yml => docker-rh8-build-test.yml} (56%) create mode 100644 .gitea/workflows/docker-rh9-build-test.yml rename .gitea/workflows/{rh8-local.yml => rh8-local-build-deploy.yml} (87%) rename .gitea/workflows/{rh9-local.yml => rh9-local-build-deploy.yml} (87%) delete mode 100644 .gitea/workflows/rh9-native.yml diff --git a/.gitea/workflows/rh8-native.yml b/.gitea/workflows/docker-rh8-build-test.yml similarity index 56% rename from .gitea/workflows/rh8-native.yml rename to .gitea/workflows/docker-rh8-build-test.yml index 7aae3be69..ed569282d 100644 --- a/.gitea/workflows/rh8-native.yml +++ b/.gitea/workflows/docker-rh8-build-test.yml @@ -1,4 +1,4 @@ -name: Build on RHEL8 +name: Build on RHEL8 docker image on: push: @@ -26,4 +26,17 @@ jobs: - name: C++ unit tests working-directory: ${{gitea.workspace}}/build - run: ctest -j1 --rerun-failed --output-on-failure \ No newline at end of file + run: ctest -j1 --rerun-failed --output-on-failure + + - name: Install Python dependencies + run: | + python3.12 -m pip install --upgrade pip + python3.12 -m pip install pytest + python3.12 -m pip install colorama + python3.12 -m pip install numpy + + - name: Python unit tests + working-directory: ${{gitea.workspace}} + run: | + export PYTHONPATH=$PWD/build/bin:$PYTHONPATH + python3.12 -m pytest python/tests \ No newline at end of file diff --git a/.gitea/workflows/docker-rh9-build-test.yml b/.gitea/workflows/docker-rh9-build-test.yml new file mode 100644 index 000000000..9c2e392fd --- /dev/null +++ b/.gitea/workflows/docker-rh9-build-test.yml @@ -0,0 +1,40 @@ +name: Build on RHEL9 docker image + +on: + push: + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + runs-on: "ubuntu-latest" + container: + image: gitea.psi.ch/detectors/rhel9-detectors-dev + steps: + - uses: actions/checkout@v4 + + + - name: Build library + run: | + mkdir build && cd build + cmake .. -DSLS_USE_PYTHON=ON -DSLS_USE_TESTS=ON -DSLS_USE_SIMULATOR=ON + make -j 2 + + - name: C++ unit tests + working-directory: ${{gitea.workspace}}/build + run: ctest -j1 --rerun-failed --output-on-failure + + - name: Install Python dependencies + run: | + python3.12 -m pip install --upgrade pip + python3.12 -m pip install pytest + python3.12 -m pip install colorama + python3.12 -m pip install numpy + + - name: Python unit tests + working-directory: ${{gitea.workspace}} + run: | + export PYTHONPATH=$PWD/build/bin:$PYTHONPATH + python3.12 -m pytest python/tests \ No newline at end of file diff --git a/.gitea/workflows/rh8-local.yml b/.gitea/workflows/rh8-local-build-deploy.yml similarity index 87% rename from .gitea/workflows/rh8-local.yml rename to .gitea/workflows/rh8-local-build-deploy.yml index 128d3176c..120605dac 100644 --- a/.gitea/workflows/rh8-local.yml +++ b/.gitea/workflows/rh8-local-build-deploy.yml @@ -1,4 +1,4 @@ -name: Build on local RHEL8 +name: Build and Deploy on local RHEL8 on: push: @@ -21,7 +21,7 @@ jobs: conda activate det mkdir build && cd build conda activate det - cmake .. -DSLS_USE_PYTHON=ON + cmake .. -DSLS_USE_PYTHON=ON -DSLS_USE_SIMULATOR=ON -DSLS_USE_GUI=ON make -j 2 - name: Deploy to NFS update server diff --git a/.gitea/workflows/rh8-local-tests.yml b/.gitea/workflows/rh8-local-tests.yml index 8865e43ce..7c0a379fb 100644 --- a/.gitea/workflows/rh8-local-tests.yml +++ b/.gitea/workflows/rh8-local-tests.yml @@ -2,11 +2,7 @@ name: Run Simulator Tests on local RHEL8 on: push: - branches: - - developer - - main - - 'dev/*' - - '*.*.*.rc' + workflow_dispatch: env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) diff --git a/.gitea/workflows/rh9-local.yml b/.gitea/workflows/rh9-local-build-deploy.yml similarity index 87% rename from .gitea/workflows/rh9-local.yml rename to .gitea/workflows/rh9-local-build-deploy.yml index 58de1cb88..94db2a2ec 100644 --- a/.gitea/workflows/rh9-local.yml +++ b/.gitea/workflows/rh9-local-build-deploy.yml @@ -1,4 +1,4 @@ -name: Build on local RHEL9 +name: Build and Deploy on local RHEL9 on: push: @@ -18,7 +18,7 @@ jobs: - name: Build library run: | mkdir build && cd build - cmake -DSLS_USE_PYTHON=ON -DPython_EXECUTABLE=/usr/bin/python3.13 -DPython_INCLUDE_DIR=/usr/include/python3.13 -DPython_LIBRARY=/usr/lib64/libpython3.13.so .. + cmake -DSLS_USE_PYTHON=ON -DPython_EXECUTABLE=/usr/bin/python3.13 -DPython_INCLUDE_DIR=/usr/include/python3.13 -DPython_LIBRARY=/usr/lib64/libpython3.13.so -DSLS_USE_SIMULATOR=ON -DSLS_USE_GUI=ON .. make -j 2 - name: Deploy to NFS update server diff --git a/.gitea/workflows/rh9-local-tests.yml b/.gitea/workflows/rh9-local-tests.yml index 4aa1a9f98..5efc5569f 100644 --- a/.gitea/workflows/rh9-local-tests.yml +++ b/.gitea/workflows/rh9-local-tests.yml @@ -2,11 +2,7 @@ name: Run Simulator Tests on local RHEL9 on: push: - branches: - - developer - - main - - 'dev/*' - - '*.*.*.rc' + workflow_dispatch: env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) diff --git a/.gitea/workflows/rh9-native.yml b/.gitea/workflows/rh9-native.yml deleted file mode 100644 index a019074ef..000000000 --- a/.gitea/workflows/rh9-native.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Build on RHEL9 - -on: - push: - workflow_dispatch: - -permissions: - contents: read - -jobs: - build: - runs-on: "ubuntu-latest" - container: - image: gitea.psi.ch/detectors/rhel9-detectors-dev - steps: - - uses: actions/checkout@v4 - - - - name: Build library - run: | - mkdir build && cd build - cmake .. -DSLS_USE_PYTHON=ON -DSLS_USE_TESTS=ON -DSLS_USE_SIMULATOR=ON - make -j 2 - - - name: C++ unit tests - working-directory: ${{gitea.workspace}}/build - run: ctest -j1 --rerun-failed --output-on-failure \ No newline at end of file From 9f72688b9c2a4e3afe21ccab8957ecfb59339203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Thu, 5 Mar 2026 09:32:21 +0100 Subject: [PATCH 4/6] Adding offset to RegisterAddress (#1413) * implemented + and += for RegisterAddres and tests plus test cleanup --- python/src/bit.cpp | 5 +++- python/tests/test_bits.py | 12 +++++++- .../tests/test-SharedMemory.cpp | 4 ++- slsSupportLib/include/sls/bit_utils.h | 14 +++++++++ slsSupportLib/tests/test-bit_utils.cpp | 29 +++++++++++++++---- 5 files changed, 56 insertions(+), 8 deletions(-) diff --git a/python/src/bit.cpp b/python/src/bit.cpp index 498319f51..7b290cd5a 100644 --- a/python/src/bit.cpp +++ b/python/src/bit.cpp @@ -26,7 +26,10 @@ void init_bit(py::module &m) { .def("__str__", &RegisterAddress::str) .def("value", &RegisterAddress::value) .def(py::self == py::self) - .def(py::self != py::self); + .def(py::self != py::self) + .def("__add__",&RegisterAddress::operator+) + .def("__radd__",&RegisterAddress::operator+) + .def("__iadd__",&RegisterAddress::operator+=, py::return_value_policy::reference_internal); py::class_(m, "BitAddress") .def(py::init()) diff --git a/python/tests/test_bits.py b/python/tests/test_bits.py index e679ea656..d2084c2e5 100644 --- a/python/tests/test_bits.py +++ b/python/tests/test_bits.py @@ -1,4 +1,5 @@ from slsdet.bits import clearbit, clearbit_arr, setbit, setbit_arr +from slsdet import RegisterAddress import numpy as np @@ -47,4 +48,13 @@ def test_setbit_arr(): def test_clearbit_arr(): arr = np.array((5, 5, 5), dtype=np.int8) clearbit_arr(0, arr) - assert all(arr == (4, 4, 4)) \ No newline at end of file + assert all(arr == (4, 4, 4)) + +def test_RegisterAddress_addition(): + r = RegisterAddress(0x10) + r2 = r + 0x5 + assert r2.value() == 0x15 + r3 = 0x5 + r + assert r3.value() == 0x15 + r += 0x5 + assert r.value() == 0x15 \ No newline at end of file diff --git a/slsDetectorSoftware/tests/test-SharedMemory.cpp b/slsDetectorSoftware/tests/test-SharedMemory.cpp index 1f9355a4b..d8a1efb16 100644 --- a/slsDetectorSoftware/tests/test-SharedMemory.cpp +++ b/slsDetectorSoftware/tests/test-SharedMemory.cpp @@ -42,9 +42,11 @@ constexpr int shm_id = 10; // macOS does not expose shm in the filesystem #ifndef __APPLE__ +const char *env_p = std::getenv(SHM_ENV_NAME); +std::string env_name = env_p ? ("_" + std::string(env_p)) : ""; const std::string file_path = std::string("/dev/shm/slsDetectorPackage_detector_") + - std::to_string(shm_id); + std::to_string(shm_id) + env_name; TEST_CASE("Free obsolete (without isValid)", "[detector][shm]") { diff --git a/slsSupportLib/include/sls/bit_utils.h b/slsSupportLib/include/sls/bit_utils.h index af86a8462..559e11b26 100644 --- a/slsSupportLib/include/sls/bit_utils.h +++ b/slsSupportLib/include/sls/bit_utils.h @@ -36,6 +36,15 @@ class RegisterAddress { constexpr bool operator!=(const RegisterAddress &other) const { return (value_ != other.value_); } + constexpr RegisterAddress &operator+=(uint32_t offset) noexcept { + value_ += offset; + return *this; + } + constexpr RegisterAddress operator+(uint32_t offset) const noexcept { + RegisterAddress tmp(*this); + tmp += offset; + return tmp; + } }; class BitAddress { @@ -102,4 +111,9 @@ std::ostream &operator<<(std::ostream &os, const RegisterAddress &r); std::ostream &operator<<(std::ostream &os, const BitAddress &r); std::ostream &operator<<(std::ostream &os, const RegisterValue &r); +constexpr RegisterAddress operator+(uint32_t offset, + const RegisterAddress &addr) noexcept { + return addr + offset; +} + } // namespace sls diff --git a/slsSupportLib/tests/test-bit_utils.cpp b/slsSupportLib/tests/test-bit_utils.cpp index 713e1c2ce..ac9ddad8a 100644 --- a/slsSupportLib/tests/test-bit_utils.cpp +++ b/slsSupportLib/tests/test-bit_utils.cpp @@ -43,7 +43,7 @@ TEST_CASE("Get set bits from 523") { REQUIRE(vec == std::vector{0, 1, 3, 9}); } -TEST_CASE("Convert RegisterAddress using classes ", "[support][.bit_utils]") { +TEST_CASE("Convert RegisterAddress using classes ", "[support]") { std::vector vec_addr{0x305, 0xffffffff, 0x0, 0x34550987, 0x1fff1fff}; std::vector vec_ans{"0x305", "0xffffffff", "0x0", "0x34550987", @@ -64,7 +64,7 @@ TEST_CASE("Convert RegisterAddress using classes ", "[support][.bit_utils]") { } } -TEST_CASE("Convert RegisterValue using classes ", "[support][.bit_utils]") { +TEST_CASE("Convert RegisterValue using classes ", "[support]") { std::vector vec_addr{0x305, 0xffffffff, 0x0, 500254562, 0x1fff1fff}; std::vector vec_ans{"0x305", "0xffffffff", "0x0", "0x1dd14762", @@ -80,11 +80,10 @@ TEST_CASE("Convert RegisterValue using classes ", "[support][.bit_utils]") { CHECK(reg0.str() == vec_ans[i]); CHECK((reg0 | 0xffffffffu) == RegisterValue(0xffffffffu)); CHECK((reg0 | 0x0) == reg0); - CHECK((reg0 | 0x1) == reg0); } } -TEST_CASE("Convert BitAddress using classes", "[support][.bit_utils]") { +TEST_CASE("Convert BitAddress using classes", "[support]") { std::vector vec_addr{ RegisterAddress(0x305), RegisterAddress(0xffffffffu), RegisterAddress(0x0), RegisterAddress(0x34550987), @@ -123,7 +122,7 @@ TEST_CASE("Convert BitAddress using classes", "[support][.bit_utils]") { } TEST_CASE("Output operator gives same result as string", - "[support][.bit_utils]") { + "[support]") { { RegisterAddress addr{0x3456af}; std::ostringstream os; @@ -148,3 +147,23 @@ TEST_CASE("Output operator gives same result as string", } } // namespace sls + +TEST_CASE("RegisterAddress addition with uint", "[support]") { + using sls::RegisterAddress; + + RegisterAddress r{0x10u}; + + // member operator+ + auto r_plus = r + 5u; + CHECK(r_plus == RegisterAddress(0x15u)); + // original unchanged + CHECK(r == RegisterAddress(0x10u)); + + // operator+= + r += 2u; + CHECK(r == RegisterAddress(0x12u)); + + // non-member uint + RegisterAddress + auto uint_plus = 3u + r; // 0x12 + 3 == 0x15 + CHECK(uint_plus == RegisterAddress(0x15u)); +} From a1b8dccdd9ae9ec6bc94b5afcc6c930b2e07d11d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Thu, 5 Mar 2026 11:35:21 +0100 Subject: [PATCH 5/6] added support for int() for RegisterAddress and RegisterValue (#1414) --- python/src/bit.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/src/bit.cpp b/python/src/bit.cpp index 7b290cd5a..bd08390f2 100644 --- a/python/src/bit.cpp +++ b/python/src/bit.cpp @@ -25,6 +25,7 @@ void init_bit(py::module &m) { }) .def("__str__", &RegisterAddress::str) .def("value", &RegisterAddress::value) + .def("__int__", &RegisterAddress::value) .def(py::self == py::self) .def(py::self != py::self) .def("__add__",&RegisterAddress::operator+) @@ -54,6 +55,7 @@ void init_bit(py::module &m) { }) .def("__str__", &RegisterValue::str) .def("value", &RegisterValue::value) + .def("__int__", &RegisterValue::value) .def(py::self == py::self) .def(py::self != py::self) .def("__or__", [](const RegisterValue &lhs, From 384b2480ab3de77d5d26f2cb654dc272226c9688 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Thu, 5 Mar 2026 12:28:57 +0100 Subject: [PATCH 6/6] Dev/fix no rx roi port (#1372) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * rx_roi fixed when there is no roi for a particular port. Fixed tests for it * removing todo check if files created because its not enough to count matching pattern file names, but also look at timestamp and create files with timestamp else you read older ones. For now, checking individual rois is enough * restore md5 --------- Co-authored-by: Erik Fröjdh --- slsDetectorSoftware/src/DetectorImpl.cpp | 7 ++ .../tests/Caller/test-Caller-rx.cpp | 81 ++++++++++++++++++- 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index 300396547..1c0870ae0 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -1831,6 +1831,13 @@ void DetectorImpl::setRxROI(const std::vector &args) { auto moduleGlobalRoi = getModuleROI(iModule); // at most 2 rois per module (for each port) std::vector portRois(nPortsPerModule); + for (auto &roi : portRois) { + roi.setNoRoi(); + if (shm()->numberOfChannels.y == 1) { + roi.ymin = -1; + roi.ymax = -1; + } + } // check overlap with module for (const auto &arg : args) { diff --git a/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp b/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp index f00c239e3..1e489b0b0 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller-rx.cpp @@ -540,6 +540,16 @@ TEST_CASE("rx_roi", "[.detectorintegration][.disable_check_data_file]") { REQUIRE(oss.str() == "rx_roi [[5, 10], [" + stringMin + ", " + stringMax + "]]\n"); + // setting to only one port and verify individual roi + { + REQUIRE_NOTHROW( + caller.call("rx_roi", {"[5, 10, -1, -1]"}, -1, PUT)); + std::ostringstream oss, oss1; + REQUIRE_NOTHROW(caller.call("rx_roi", {}, 0, GET, oss)); + REQUIRE_NOTHROW(caller.call("rx_roi", {}, 1, GET, oss1)); + REQUIRE(oss.str() == "rx_roi [[5, 10]]\n"); + REQUIRE(oss1.str() == "rx_roi [[0, 0]]\n"); + } // verify individual roi { stringMin = std::to_string(moduleSize.x - 50); @@ -643,6 +653,38 @@ TEST_CASE("rx_roi", "[.detectorintegration][.disable_check_data_file]") { REQUIRE(oss.str() == "rx_roi [[5, 10, 20, 30], [" + stringMin + ", " + stringMax + ", 20, 30]]\n"); + // setting to only one port and verify individual roi + { + REQUIRE_NOTHROW( + caller.call("rx_roi", {"[5, 10, 20, 30]"}, -1, PUT)); + std::ostringstream oss, oss1; + REQUIRE_NOTHROW(caller.call("rx_roi", {}, 0, GET, oss)); + // eiger returns 2 values for 2 ports per module + if (det_type == defs::EIGER) { + REQUIRE(oss.str() == + "rx_roi [[5, 10, 20, 30], [0, 0, 0, 0]]\n"); + + } + // others return only 1 roi per module (1 port per module) + else { + REQUIRE(oss.str() == "rx_roi [[5, 10, 20, 30]]\n"); + } + if (det.size() > 1) { + REQUIRE_NOTHROW( + caller.call("rx_roi", {}, 1, GET, oss1)); + // eiger returns 2 values for 2 ports per module + if (det_type == defs::EIGER) { + REQUIRE(oss1.str() == + "rx_roi [[0, 0, 0, 0], [0, 0, 0, 0]]\n"); + + } + // others return only 1 roi per module (1 port per + // module) + else { + REQUIRE(oss1.str() == "rx_roi [[0, 0, 0, 0]]\n"); + } + } + } // verify individual roi { stringMin = std::to_string(portSize.x - delta); @@ -710,6 +752,43 @@ TEST_CASE("rx_roi", "[.detectorintegration][.disable_check_data_file]") { REQUIRE(oss.str() == "rx_roi [[5, 10, 20, 30], [25, 28, " + stringMin + ", " + stringMax + "]]\n"); + // setting to only one port and verify individual roi + { + REQUIRE_NOTHROW( + caller.call("rx_roi", {"[ 5, 10, 20, 30]"}, -1, PUT)); + std::ostringstream oss, oss1; + REQUIRE_NOTHROW(caller.call("rx_roi", {}, 0, GET, oss)); + + // 2 ports + if (((det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) && + (numinterfaces == 2)) || + (det_type == defs::EIGER)) { + REQUIRE(oss.str() == + "rx_roi [[5, 10, 20, 30], [0, 0, 0, 0]]\n"); + } + // others return only 1 roi per module (1 port per module) + else { + REQUIRE(oss.str() == "rx_roi [[5, 10, 20, 30]]\n"); + } + if (det.size() > 2) { + REQUIRE_NOTHROW( + caller.call("rx_roi", {}, 1, GET, oss1)); + // 2 ports + if (((det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) && + (numinterfaces == 2)) || + (det_type == defs::EIGER)) { + REQUIRE(oss1.str() == + "rx_roi [[0, 0, 0, 0], [0, 0, 0, 0]]\n"); + } + // others return only 1 roi per module (1 port per + // module) + else { + REQUIRE(oss1.str() == "rx_roi [[0, 0, 0, 0]]\n"); + } + } + } // verify individual roi { stringMin = std::to_string(portSize.y - delta); @@ -741,7 +820,7 @@ TEST_CASE("rx_roi", "[.detectorintegration][.disable_check_data_file]") { REQUIRE(oss1.str() == "rx_roi [[20, 30, " + stringMin + ", " + std::to_string(portSize.y - 1) + - "], [-1, -1]]\n"); + "], [0, 0, 0, 0]]\n"); } else { REQUIRE(oss1.str() == "rx_roi [[20, 30, " + stringMin + ", " +