Compare commits
15 Commits
jungfrau_d
...
debugInter
Author | SHA1 | Date | |
---|---|---|---|
f7695113b8 | |||
27f2321d64 | |||
545684c8e3 | |||
9584ea626d | |||
a2c26664ee | |||
02a36a148f | |||
142b184e62 | |||
dd2fe28ce6 | |||
0afd096eae | |||
98ae93fdde | |||
c654ac7f1f | |||
db2742495a | |||
d0c5c2a6e5 | |||
2c09d394a6 | |||
52f74142b1 |
@ -1,6 +0,0 @@
|
|||||||
BasedOnStyle: LLVM
|
|
||||||
IndentWidth: 4
|
|
||||||
|
|
||||||
UseTab: Never
|
|
||||||
ColumnLimit: 80
|
|
||||||
AlignConsecutiveAssignments: false
|
|
32
.clang-tidy
@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
Checks: '*,
|
|
||||||
-android-cloexec-fopen,
|
|
||||||
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
|
||||||
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
|
||||||
-fuchsia*,
|
|
||||||
-readability-else-after-return,
|
|
||||||
-readability-avoid-const-params-in-decls,
|
|
||||||
-cppcoreguidelines-pro-bounds-constant-array-index,
|
|
||||||
-cppcoreguidelines-pro-type-reinterpret-cast,
|
|
||||||
-llvm-header-guard,
|
|
||||||
-readability-static-accessed-through-instance,
|
|
||||||
-readability-braces-around-statements,
|
|
||||||
-hicpp-signed-bitwise,
|
|
||||||
-hicpp-no-array-decay,
|
|
||||||
-hicpp-braces-around-statements,
|
|
||||||
-google-runtime-references,
|
|
||||||
-google-readability-todo,
|
|
||||||
-google-readability-braces-around-statements'
|
|
||||||
|
|
||||||
HeaderFilterRegex: \.h
|
|
||||||
AnalyzeTemporaryDtors: false
|
|
||||||
FormatStyle: none
|
|
||||||
CheckOptions:
|
|
||||||
- { key: readability-identifier-naming.NamespaceCase, value: lower_case }
|
|
||||||
# - { key: readability-identifier-naming.FunctionCase, value: lower_case }
|
|
||||||
- { key: readability-identifier-naming.ClassCase, value: CamelCase }
|
|
||||||
# - { key: readability-identifier-naming.MethodCase, value: CamelCase }
|
|
||||||
# - { key: readability-identifier-naming.StructCase, value: CamelCase }
|
|
||||||
# - { key: readability-identifier-naming.VariableCase, value: lower_case }
|
|
||||||
- { key: readability-identifier-naming.GlobalConstantCase, value: UPPER_CASE }
|
|
||||||
...
|
|
8
.gitignore
vendored
@ -6,14 +6,6 @@ bin/
|
|||||||
*.log
|
*.log
|
||||||
*.out
|
*.out
|
||||||
*.toc
|
*.toc
|
||||||
*.o
|
|
||||||
.*
|
|
||||||
build
|
build
|
||||||
docs/
|
docs/
|
||||||
RELEASE.txt
|
RELEASE.txt
|
||||||
Testing/
|
|
||||||
|
|
||||||
|
|
||||||
*.pyc
|
|
||||||
*/__pycache__/*
|
|
||||||
|
|
||||||
|
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
|||||||
[submodule "python/pybind11"]
|
|
||||||
path = python/pybind11
|
|
||||||
url = https://github.com/pybind/pybind11.git
|
|
15
.travis.yml
@ -2,13 +2,10 @@ sudo: false
|
|||||||
|
|
||||||
language: cpp
|
language: cpp
|
||||||
|
|
||||||
os: linux
|
|
||||||
|
|
||||||
env:
|
|
||||||
matrix:
|
matrix:
|
||||||
- CONDA_PY=3.6
|
include:
|
||||||
- CONDA_PY=3.7
|
- os: linux
|
||||||
|
env: CONDA_PY=3.6
|
||||||
|
|
||||||
dist: trusty
|
dist: trusty
|
||||||
|
|
||||||
@ -25,9 +22,7 @@ install:
|
|||||||
- conda config --add channels slsdetectorgroup
|
- conda config --add channels slsdetectorgroup
|
||||||
- conda update conda
|
- conda update conda
|
||||||
- conda update --all
|
- conda update --all
|
||||||
- conda install conda-build=3.17
|
- conda install conda-build anaconda-client
|
||||||
- conda install anaconda-client
|
|
||||||
- conda install conda-verify
|
|
||||||
|
|
||||||
# Useful for debugging any issues with conda
|
# Useful for debugging any issues with conda
|
||||||
- conda info -a
|
- conda info -a
|
||||||
@ -39,7 +34,7 @@ install:
|
|||||||
- conda-build .
|
- conda-build .
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
|
- echo "No test scripts to be run!"
|
||||||
|
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
|
192
CMakeLists.txt
Executable file → Normal file
@ -1,185 +1,57 @@
|
|||||||
cmake_minimum_required(VERSION 3.9)
|
cmake_minimum_required(VERSION 2.8)
|
||||||
project(slsDetectorPackage)
|
|
||||||
|
|
||||||
set(PROJECT_VERSION 5.0.0)
|
|
||||||
include(cmake/project_version.cmake)
|
|
||||||
include(CheckIPOSupported)
|
|
||||||
|
|
||||||
# Include additional modules that are used unconditionally
|
|
||||||
include(GNUInstallDirs)
|
|
||||||
|
|
||||||
# If conda build, always set lib dir to 'lib'
|
|
||||||
if($ENV{CONDA_BUILD})
|
|
||||||
set(CMAKE_INSTALL_LIBDIR "lib")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set lower / upper case project names
|
|
||||||
string(TOUPPER "${PROJECT_NAME}" PROJECT_NAME_UPPER)
|
|
||||||
string(TOLOWER "${PROJECT_NAME}" PROJECT_NAME_LOWER)
|
|
||||||
|
|
||||||
# Set targets export name (used by slsDetectorPackage and dependencies)
|
|
||||||
set(TARGETS_EXPORT_NAME "${PROJECT_NAME_LOWER}-targets")
|
|
||||||
#set(namespace "${PROJECT_NAME}::")
|
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||||||
|
set (CALIBRATE OFF)
|
||||||
|
|
||||||
|
option (USE_HDF5 "HDF5 File format" OFF)
|
||||||
|
option (USE_TEXTCLIENT "Text Client" OFF)
|
||||||
|
option (USE_RECEIVER "Receiver" OFF)
|
||||||
|
option (USE_GUI "GUI" OFF)
|
||||||
|
|
||||||
# Check if project is being used directly or via add_subdirectory
|
|
||||||
set(SLS_MASTER_PROJECT OFF)
|
|
||||||
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
|
||||||
set(SLS_MASTER_PROJECT ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option (SLS_USE_HDF5 "HDF5 File format" OFF)
|
|
||||||
option (SLS_USE_TEXTCLIENT "Text Client" ON)
|
|
||||||
option (SLS_USE_RECEIVER "Receiver" ON)
|
|
||||||
option (SLS_USE_GUI "GUI" OFF)
|
|
||||||
option (SLS_USE_TESTS "TESTS" OFF)
|
|
||||||
option (SLS_USE_INTEGRATION_TESTS "Integration Tests" OFF)
|
|
||||||
option(SLS_USE_SANITIZER "Sanitizers for debugging" OFF)
|
|
||||||
option(SLS_USE_PYTHON "Python bindings" OFF)
|
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
||||||
|
|
||||||
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
||||||
message(STATUS "No build type selected, default to Release")
|
|
||||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (default Release)" FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
#Add two fake libraries to manage options
|
|
||||||
add_library(slsProjectOptions INTERFACE)
|
|
||||||
add_library(slsProjectWarnings INTERFACE)
|
|
||||||
target_compile_features(slsProjectOptions INTERFACE cxx_std_11)
|
|
||||||
target_compile_options(slsProjectWarnings INTERFACE
|
|
||||||
-Wall
|
|
||||||
-Wextra
|
|
||||||
-Wno-unused-parameter #Needs to be slowly mitigated
|
|
||||||
# -Wold-style-cast
|
|
||||||
-Wnon-virtual-dtor
|
|
||||||
-Woverloaded-virtual
|
|
||||||
-Wdouble-promotion
|
|
||||||
-Wformat=2
|
|
||||||
-Wredundant-decls
|
|
||||||
# -Wconversion
|
|
||||||
-Wdouble-promotion
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#Testing for minimum version for compilers
|
|
||||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.2)
|
|
||||||
message(FATAL_ERROR "Clang version must be at least 3.2!")
|
|
||||||
endif()
|
|
||||||
target_compile_options(slsProjectWarnings INTERFACE -Wshadow) #Clag does not warn on constructor
|
|
||||||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
|
|
||||||
message(FATAL_ERROR "GCC version must be at least 4.8!")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5)
|
|
||||||
target_compile_options(slsProjectWarnings INTERFACE
|
|
||||||
-Wno-missing-field-initializers)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0)
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0)
|
||||||
target_compile_options(slsProjectWarnings INTERFACE
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++98 -Wno-misleading-indentation")
|
||||||
-Wno-misleading-indentation # mostly in rapidjson remove using clang format
|
else ()
|
||||||
-Wduplicated-cond
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++98")
|
||||||
-Wnull-dereference )
|
|
||||||
endif()
|
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0)
|
|
||||||
target_compile_options(slsProjectWarnings INTERFACE
|
|
||||||
-Wno-class-memaccess )
|
|
||||||
endif()
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
find_package(Qt4)
|
||||||
|
find_package(Qwt 6)
|
||||||
|
find_package(CBF)
|
||||||
|
find_package(Doxygen)
|
||||||
|
# find_package(PNG REQUIRED)
|
||||||
|
|
||||||
if(SLS_USE_SANITIZER)
|
if (USE_HDF5)
|
||||||
target_compile_options(slsProjectOptions INTERFACE -fsanitize=address,undefined)
|
find_package(HDF5 1.10 COMPONENTS CXX)
|
||||||
target_link_libraries(slsProjectOptions INTERFACE -fsanitize=address,undefined)
|
endif (USE_HDF5)
|
||||||
# target_compile_options(slsProjectOptions INTERFACE -fsanitize=thread)
|
|
||||||
# target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
# Install fake the libraries
|
|
||||||
install(TARGETS slsProjectOptions slsProjectWarnings
|
|
||||||
EXPORT "${TARGETS_EXPORT_NAME}"
|
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
|
|
||||||
set(CMAKE_INSTALL_RPATH "$ORIGIN")
|
set(CMAKE_INSTALL_RPATH "$ORIGIN")
|
||||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
||||||
|
|
||||||
find_package(Doxygen)
|
|
||||||
find_package(ZeroMQ 4 REQUIRED)
|
|
||||||
|
|
||||||
if (SLS_USE_TESTS)
|
if (USE_TEXTCLIENT)
|
||||||
enable_testing()
|
|
||||||
add_subdirectory(tests)
|
|
||||||
endif(SLS_USE_TESTS)
|
|
||||||
|
|
||||||
# Common functionallity to detector and receiver
|
|
||||||
add_subdirectory(slsSupportLib)
|
|
||||||
|
|
||||||
if (SLS_USE_TEXTCLIENT)
|
|
||||||
add_subdirectory(slsDetectorSoftware)
|
add_subdirectory(slsDetectorSoftware)
|
||||||
endif (SLS_USE_TEXTCLIENT)
|
endif (USE_TEXTCLIENT)
|
||||||
|
|
||||||
if (SLS_USE_RECEIVER)
|
if (USE_RECEIVER)
|
||||||
if (SLS_USE_HDF5)
|
|
||||||
find_package(HDF5 1.10 COMPONENTS CXX REQUIRED)
|
|
||||||
endif (SLS_USE_HDF5)
|
|
||||||
add_subdirectory(slsReceiverSoftware)
|
add_subdirectory(slsReceiverSoftware)
|
||||||
add_subdirectory(manual/manual-api)
|
add_subdirectory(manual/manual-api)
|
||||||
endif (SLS_USE_RECEIVER)
|
endif (USE_RECEIVER)
|
||||||
|
|
||||||
if (SLS_USE_GUI)
|
|
||||||
find_package(Qt4 REQUIRED)
|
if (USE_GUI)
|
||||||
find_package(Qwt 6 REQUIRED)
|
|
||||||
if (QT4_FOUND AND QWT_FOUND)
|
if (QT4_FOUND AND QWT_FOUND)
|
||||||
add_subdirectory(slsDetectorGui)
|
add_subdirectory(slsDetectorGui)
|
||||||
endif()
|
endif()
|
||||||
endif (SLS_USE_GUI)
|
endif (USE_GUI)
|
||||||
|
|
||||||
if (SLS_USE_INTEGRATION_TESTS)
|
|
||||||
add_subdirectory(integrationTests)
|
|
||||||
endif (SLS_USE_INTEGRATION_TESTS)
|
|
||||||
|
|
||||||
if (SLS_USE_PYTHON)
|
|
||||||
add_subdirectory(python)
|
|
||||||
endif(SLS_USE_PYTHON)
|
|
||||||
|
|
||||||
configure_file( .clang-tidy
|
|
||||||
${CMAKE_BINARY_DIR}/.clang-tidy
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if (DOXYGEN_FOUND)
|
if (CALIBRATE)
|
||||||
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/Doxyfile.in)
|
if (DEFINED ENV{ROOTSYS})
|
||||||
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
|
find_package(ROOT)
|
||||||
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
|
if (ROOT_FOUND)
|
||||||
|
add_subdirectory(calibrationWizards)
|
||||||
# note the option ALL which allows to build the docs together with the application
|
|
||||||
add_custom_target( docs
|
|
||||||
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
COMMENT "Generating API documentation with Doxygen"
|
|
||||||
VERBATIM )
|
|
||||||
else (DOXYGEN_FOUND)
|
|
||||||
message("Doxygen need to be installed to generate the doxygen documentation")
|
|
||||||
endif (DOXYGEN_FOUND)
|
|
||||||
|
|
||||||
|
|
||||||
if(SLS_MASTER_PROJECT)
|
|
||||||
# Set install dir CMake packages
|
|
||||||
set(CMAKE_INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/cmake/sls)
|
|
||||||
# Set the list of exported targets
|
|
||||||
set(PROJECT_LIBRARIES slsSupportLib slsDetectorShared slsReceiverShared)
|
|
||||||
# Generate and install package config file and version
|
|
||||||
include(cmake/package_config.cmake)
|
|
||||||
endif()
|
endif()
|
||||||
|
endif()
|
||||||
|
endif(CALIBRATE)
|
||||||
|
235
Makefile
Executable file
@ -0,0 +1,235 @@
|
|||||||
|
# do not change below this line#
|
||||||
|
|
||||||
|
# Include common definitions
|
||||||
|
include Makefile.include
|
||||||
|
|
||||||
|
INSTALLROOT ?= $(PWD)
|
||||||
|
BINDIR ?= $(INSTALLROOT)/bin
|
||||||
|
DOCDIR ?= $(INSTALLROOT)/manual/docs
|
||||||
|
LIBDIR ?= $(INSTALLROOT)/bin
|
||||||
|
INCDIR ?= $(INSTALLROOT)/include
|
||||||
|
DETAILDOC ?= $(INSTALLROOT)/docs
|
||||||
|
|
||||||
|
WD = $(shell pwd)
|
||||||
|
LIBRARYDIR = $(WD)/slsDetectorSoftware
|
||||||
|
LIBRARYRXRDIR = $(WD)/slsReceiverSoftware
|
||||||
|
CLIENTDIR = $(LIBRARYDIR)/slsDetectorClient
|
||||||
|
GUIDIR = $(WD)/slsDetectorGui
|
||||||
|
RECEIVERDIR = $(LIBRARYRXRDIR)
|
||||||
|
CALWIZDIR = $(WD)/calibrationWizards
|
||||||
|
MANDIR = $(WD)/manual
|
||||||
|
CALIBDIR = $(WD)/slsDetectorCalibration
|
||||||
|
MANAPIDIR = $(MANDIR)/manual-api
|
||||||
|
|
||||||
|
TABSPACE := "\t"
|
||||||
|
|
||||||
|
|
||||||
|
INCLUDES=-I. -I$(LIBRARYDIR)/commonFiles -I$(LIBRARYDIR)/slsDetector -I$(LIBRARYDIR)/usersFunctions -I$(LIBRARYDIR)/multiSlsDetector -I$(LIBRARYDIR)/slsDetectorUtils -I$(LIBRARYDIR)/slsDetectorCommand -I$(LIBRARYDIR)/slsDetectorAnalysis -I$(LIBRARYDIR)/slsReceiverInterface -I$(LIBRARYRXRDIR)/include -I$(LIBRARYDIR)/threadFiles -I$(LIBRARYDIR)/sharedMemory -I$(ASM)
|
||||||
|
|
||||||
|
INCLUDESRXR += -I. -I$(LIBRARYRXRDIR)/include -I$(CALIBDIR) -I$(ASM)
|
||||||
|
#LIBFLAGRXR +=
|
||||||
|
|
||||||
|
$(info )
|
||||||
|
$(info #######################################)
|
||||||
|
$(info # In slsDetectorsPackage Makefile #)
|
||||||
|
$(info #######################################)
|
||||||
|
$(info )
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: all nonstatic static lib libreceiver textclient receiver gui stextclient sreceiver
|
||||||
|
|
||||||
|
#all: lib textclient receiver gui
|
||||||
|
all: textclient receiver gui
|
||||||
|
|
||||||
|
nonstatic: lib libreceiver textclient receiver gui
|
||||||
|
|
||||||
|
static: lib libreceiver stextclient sreceiver gui
|
||||||
|
|
||||||
|
|
||||||
|
lib:
|
||||||
|
cd $(LIBRARYDIR) && $(MAKE) FLAGS='$(FLAGS)' DESTDIR='$(LIBDIR)' LIBRARYDIR='$(LIBRARYDIR)' LIBS='$(LDFLAGDET)' INCLUDES='$(INCLUDES)' LIBDIR='$(LIBDIR)'
|
||||||
|
|
||||||
|
libreceiver:
|
||||||
|
cd $(LIBRARYRXRDIR) && $(MAKE) FLAGS='$(FLAGS)' DESTDIR='$(LIBDIR)' LIBS='$(LDFLAGRXR)' INCLUDES='$(INCLUDESRXR)' LIBDIR='$(LIBDIR)'
|
||||||
|
|
||||||
|
|
||||||
|
stextclient: slsDetectorClient_static
|
||||||
|
|
||||||
|
slsDetectorClient: textclient
|
||||||
|
|
||||||
|
slsDetectorClient_static: #lib
|
||||||
|
cd $(CLIENTDIR) && $(MAKE) static_clients FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBRARYDIR='$(LIBRARYDIR)' LIBS='$(LDFLAGDET)' INCLUDES='$(INCLUDES)' LIBDIR='$(LIBDIR)'
|
||||||
|
@echo ""
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo "# Back in slsDetectorPackage Makefile #"
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo ""
|
||||||
|
|
||||||
|
textclient: #lib
|
||||||
|
cd $(CLIENTDIR) && $(MAKE) FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBRARYDIR='$(LIBRARYDIR)' LIBS='$(LDFLAGDET)' INCLUDES='$(INCLUDES)' LIBDIR='$(LIBDIR)'
|
||||||
|
@echo ""
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo "# Back in slsDetectorPackage Makefile #"
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo ""
|
||||||
|
|
||||||
|
slsReceiver: receiver
|
||||||
|
|
||||||
|
slsReceiver_static: receiver
|
||||||
|
|
||||||
|
receiver: #libreceiver
|
||||||
|
# cd $(RECEIVERDIR) && $(MAKE) receiver FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBS='$(LDFLAGRXR)' INCLUDES='$(INCLUDESRXR)' LIBDIR='$(LIBDIR)'
|
||||||
|
cd $(RECEIVERDIR) && $(MAKE) FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBS='$(LDFLAGRXR)' INCLUDES='$(INCLUDESRXR)' LIBDIR='$(LIBDIR)'
|
||||||
|
cd $(MANAPIDIR) && $(MAKE) slsMultiReceiver
|
||||||
|
@echo ""
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo "# Back in slsDetectorPackage Makefile #"
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo ""
|
||||||
|
|
||||||
|
sreceiver: #libreceiver
|
||||||
|
cd $(RECEIVERDIR) && $(MAKE) static_receiver FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBS='$(LDFLAGRXR)' INCLUDES='$(INCLUDESRXR)' LIBDIR='$(LIBDIR)'
|
||||||
|
@echo ""
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo "# Back in slsDetectorPackage Makefile #"
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo ""
|
||||||
|
|
||||||
|
slsDetectorGUI: #lib
|
||||||
|
cd $(GUIDIR) && $(MAKE) DESTDIR='$(BINDIR)' LIBRARYDIR='$(LIBRARYDIR)' INCLUDES='$(INCLUDES)' LDFLAGDET='$(LDFLAGDETONLY)' LIBDIR='$(LIBDIR)'
|
||||||
|
@echo ""
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo "# Back in slsDetectorPackage Makefile #"
|
||||||
|
@echo "#######################################"
|
||||||
|
@echo ""
|
||||||
|
|
||||||
|
calWiz:
|
||||||
|
cd $(CALWIZDIR) && $(MAKE) DESTDIR=$(BINDIR) #FLAGS=$(FLAGS) LDFLAGDET=$(LDFLAGDET) INCLUDES=$(INCLUDES)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
gui: slsDetectorGUI
|
||||||
|
|
||||||
|
|
||||||
|
doc:
|
||||||
|
$(shell test -d $(DOCDIR) || mkdir -p $(DOCDIR))
|
||||||
|
cd manual && make all DESTDIR=$(DOCDIR)
|
||||||
|
|
||||||
|
htmldoc:
|
||||||
|
make doc
|
||||||
|
$(shell test -d $(DOCDIR) || mkdir -p $(DOCDIR))
|
||||||
|
cd manual && make html DESTDIR=$(DOCDIR)
|
||||||
|
|
||||||
|
detaildoc: createdocs docspdf docshtml removedocs
|
||||||
|
|
||||||
|
createdocs: $(LIBRARYDIR)/doxy.config
|
||||||
|
doxygen $(LIBRARYDIR)/doxy.config
|
||||||
|
|
||||||
|
docspdf:
|
||||||
|
cd slsDetectorPackageDocs/latex && make
|
||||||
|
$(shell test -d $(DETAILDOC) || mkdir -p $(DETAILDOC))
|
||||||
|
$(shell test -d $(DETAILDOC)/pdf || mkdir -p $(DETAILDOC)/pdf)
|
||||||
|
mv slsDetectorPackageDocs/latex/refman.pdf $(DETAILDOC)/pdf/slsDetectorPackageDocs.pdf
|
||||||
|
|
||||||
|
docshtml:
|
||||||
|
$(shell test -d $(DETAILDOC) || mkdir -p $(DETAILDOC))
|
||||||
|
$(shell test -d $(DETAILDOC)/html || mkdir -p $(DETAILDOC)/html)
|
||||||
|
$(shell test -d $(DETAILDOC)/html/slsDetectorPackageDocs && rm -r $(DETAILDOC)/html/slsDetectorPackageDocs)
|
||||||
|
mv slsDetectorPackageDocs/html $(DETAILDOC)/html/slsDetectorPackageDocs
|
||||||
|
|
||||||
|
removedocs:
|
||||||
|
rm -rf slsDetectorPackageDocs;
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
cd $(BINDIR) && rm -rf sls_detector_* slsDetectorGui slsReceiver angularCalibrationWizard energyCalibrationWizard
|
||||||
|
cd $(LIBDIR) && rm -rf libSlsDetector.so libSlsDetector.a libSlsReceiver.so libSlsReceiver.a
|
||||||
|
cd $(LIBRARYDIR) && $(MAKE) clean
|
||||||
|
cd $(LIBRARYRXRDIR) && $(MAKE) clean
|
||||||
|
cd $(CLIENTDIR) && $(MAKE) clean
|
||||||
|
cd $(GUIDIR) && $(MAKE) clean
|
||||||
|
cd $(CALWIZDIR) && $(MAKE) clean
|
||||||
|
cd manual && $(MAKE) clean
|
||||||
|
cd $(DOCDIR) && rm -rf *
|
||||||
|
rm -rf slsDetectorPackageDocs;
|
||||||
|
rm -rf $(DETAILDOC)
|
||||||
|
rm -rf $(MANAPIDIR)/slsMultiReceiver
|
||||||
|
|
||||||
|
|
||||||
|
#install_lib:
|
||||||
|
# cd $(LIBRARYDIR) && $(MAKE) install DESTDIR=$(LIBDIR) INCLUDES=$(INCLUDES)
|
||||||
|
# cd $(LIBRARYDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR)
|
||||||
|
|
||||||
|
mythen_virtual:
|
||||||
|
cd $(LIBRARYDIR) && $(MAKE) mythenVirtualServer DESTDIR=$(BINDIR)
|
||||||
|
|
||||||
|
|
||||||
|
gotthard_virtual:
|
||||||
|
cd $(LIBRARYDIR) && $(MAKE) gotthardVirtualServer DESTDIR=$(BINDIR)
|
||||||
|
|
||||||
|
|
||||||
|
install_client: textclient slsReceiver
|
||||||
|
|
||||||
|
install_gui: gui
|
||||||
|
|
||||||
|
confinstall:
|
||||||
|
make conf;\
|
||||||
|
make install
|
||||||
|
|
||||||
|
install_lib:
|
||||||
|
make lib;\
|
||||||
|
make libreceiver; \
|
||||||
|
make textclient; \
|
||||||
|
make slsReceiver; \
|
||||||
|
make doc; \
|
||||||
|
make htmldoc; \
|
||||||
|
cd $(LIBRARYDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR); \
|
||||||
|
cd $(LIBRARYRXRDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR);
|
||||||
|
|
||||||
|
install:
|
||||||
|
make install_lib; \
|
||||||
|
make gui; \
|
||||||
|
make calWiz; \
|
||||||
|
cd $(LIBRARYDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR);\
|
||||||
|
cd $(LIBRARYRXRDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR);
|
||||||
|
|
||||||
|
conf:
|
||||||
|
set -e; \
|
||||||
|
. ./configure; \
|
||||||
|
@echo "INSTALLROOT is $(INSTALLROOT)"
|
||||||
|
@echo "BINDIR is $(BINDIR)"
|
||||||
|
@echo "LIBDIR is $(LIBDIR)"
|
||||||
|
@echo "INCDIR is $(INCDIR)"
|
||||||
|
@echo "DOCDIR is $(DOCDIR)"
|
||||||
|
|
||||||
|
|
||||||
|
help:
|
||||||
|
@echo "Targets:"
|
||||||
|
@echo "make all compile library, text clients, data reciever"
|
||||||
|
@echo "make lib compile library"
|
||||||
|
@echo "make libreceiver compile receiver library"
|
||||||
|
@echo "make textclient compile the slsDetectorClient dynamically linking the libraries"
|
||||||
|
@echo "make stextclient compile slsDetectorClient statically linking the libraries"
|
||||||
|
@echo "make receiver compile the slsReciever dynamically linking the libraries"
|
||||||
|
@echo "make sreceiver compile the slsReciever statically linking the libraries"
|
||||||
|
@echo "make gui compile slsDetectorGUI - requires a working Qt4 and Qwt installation"
|
||||||
|
@echo "make calWiz compile the calibration wizards - requires a working Root installation"
|
||||||
|
@echo "make doc compile pdf documentation"
|
||||||
|
@echo "make htmldoc compile html (and pdf) documentation"
|
||||||
|
@echo "make install_lib installs the libraries, the text clients, the documentation and the includes for the API"
|
||||||
|
@echo "make install installs all software, including the gui, the cal wizards and the includes for the API"
|
||||||
|
@echo "make confinstall installs all software, including the gui, the cal wizards and the includes for the API, prompting for the install paths"
|
||||||
|
@echo "make clean remove object files and executables"
|
||||||
|
@echo "make help lists possible targets"
|
||||||
|
@echo ""
|
||||||
|
@echo ""
|
||||||
|
@echo "Makefile variables"
|
||||||
|
@echo "DEBUG=1,2 set debug level to 1 (VERBOSE) or 2 (VERYVERBOSE)"
|
||||||
|
@echo ""
|
||||||
|
@echo ""
|
||||||
|
@echo "Variables - to change them run <source configure> :"
|
||||||
|
@echo "INSTALLROOT=<yourdir>: installation root di r, default $PWD"
|
||||||
|
@echo "BINDIR=<yourbin>: binary installation dir below INSTALLROOT, default bin"
|
||||||
|
@echo "LIBDIR=<yourlib>: library installation dir below INSTALLROOT, default lib"
|
||||||
|
@echo "INCDIR=<yourincludes>: header installation dir below INSTALLROOT, default include"
|
||||||
|
@echo "DOCDIR=<yourdoc>: documentation installation dir below INSTALLROOT, default doc"
|
58
Makefile.include
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
##############################################################
|
||||||
|
# Generic
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
CC = g++
|
||||||
|
CXX = $(CC)
|
||||||
|
ASM=$(shell echo "/lib/modules/`uname -r`/build/include")
|
||||||
|
LDFLAGDETONLY = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector
|
||||||
|
LDFLAGDET = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread
|
||||||
|
LDFLAGRXR = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread
|
||||||
|
FLAGS= -Wall -pthread #-DEIGER_DEBUG2
|
||||||
|
# -DVERBOSE
|
||||||
|
|
||||||
|
# Setting up the verbose flags
|
||||||
|
ifeq ($(DEBUG),1)
|
||||||
|
FLAGS = -Wall -DVERBOSE
|
||||||
|
endif
|
||||||
|
ifeq ($(DEBUG),2)
|
||||||
|
FLAGS = -Wall -DVERYVERBOSE
|
||||||
|
endif
|
||||||
|
|
||||||
|
##############################################################
|
||||||
|
# HDF5 specific. Set this to yes, if you want to compile
|
||||||
|
# HDF5 code: in this case, you need HDF5 libraries
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
HDF5 = no
|
||||||
|
HDF5_DIR = /opt/hdf5v1.10.0
|
||||||
|
|
||||||
|
ifeq ($(HDF5),yes)
|
||||||
|
LDFLAGRXR = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L$(HDF5_DIR)/lib -Wl,-rpath=$(HDF5_DIR)/lib -lhdf5 -lhdf5_cpp -lsz -lz -DHDF5C -L/usr/lib64/ -pthread
|
||||||
|
INCLUDESRXR = -I$(HDF5_DIR)/include
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
##############################################################
|
||||||
|
# ROOTSLS specific. Set this to yes, if you want to compile
|
||||||
|
# ROOTSLS code: in this case, you need also root libraries
|
||||||
|
##############################################################
|
||||||
|
|
||||||
|
ROOTSLS = no
|
||||||
|
|
||||||
|
ROOTFLAGS = $(shell root-config --cflags --glibs) -DMYROOT1 #-DALLFILE_DEBUG #-DMYROOT1
|
||||||
|
|
||||||
|
ifeq ($(ROOTSLS),yes)
|
||||||
|
LDFLAGRXR = -L$(LIBDIR) -lSlsReceiver $(ROOTFLAGS) -DROOTSLS
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
define colorecho
|
||||||
|
@tput setaf 6
|
||||||
|
@echo $1
|
||||||
|
@tput sgr0
|
||||||
|
endef
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
4
README.md
Executable file → Normal file
@ -75,13 +75,13 @@ Use cmake to create out-of-source builds, by creating a build folder parallel to
|
|||||||
$ cd ..
|
$ cd ..
|
||||||
$ mkdir slsDetectorPackage-build
|
$ mkdir slsDetectorPackage-build
|
||||||
$ cd slsDetectorPackage-build
|
$ cd slsDetectorPackage-build
|
||||||
$ cmake ../slsDetectorPackage -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_HDF5=OFF
|
$ cmake ../slsDetectorPackage -DCMAKE_BUILD_TYPE=Debug -DUSE_HDF5=OFF
|
||||||
$ make
|
$ make
|
||||||
```
|
```
|
||||||
|
|
||||||
Use the following as an example to compile statically and using specific hdf5 folder
|
Use the following as an example to compile statically and using specific hdf5 folder
|
||||||
```
|
```
|
||||||
$ HDF5_ROOT=/opt/hdf5v1.10.0 cmake ../slsDetectorPackage -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_HDF5=ON
|
$ HDF5_ROOT=/opt/hdf5v1.10.0 cmake ../slsDetectorPackage -DCMAKE_BUILD_TYPE=Debug -DUSE_HDF5=ON
|
||||||
```
|
```
|
||||||
After compiling, the libraries and executables will be found at `bin` directory
|
After compiling, the libraries and executables will be found at `bin` directory
|
||||||
```
|
```
|
||||||
|
508
RELEASE.txt
Executable file → Normal file
@ -0,0 +1,508 @@
|
|||||||
|
SLS Detector Package 4.0.0 released on 27.09.2018
|
||||||
|
=================================================
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
INTRODUCTION
|
||||||
|
|
||||||
|
This document describes the differences between 4.0.0 and 3.1.4 releases.
|
||||||
|
|
||||||
|
Download
|
||||||
|
--------
|
||||||
|
|
||||||
|
The Source Code (Default C++ API):
|
||||||
|
https://github.com/slsdetectorgroup/slsDetectorPackage
|
||||||
|
|
||||||
|
The Conda Lib Package:
|
||||||
|
https://github.com/slsdetectorgroup/sls_detector_lib
|
||||||
|
|
||||||
|
The Conda GUI Package:
|
||||||
|
https://github.com/slsdetectorgroup/sls_detector_gui
|
||||||
|
|
||||||
|
The Python Interface (including the package):
|
||||||
|
https://github.com/slsdetectorgroup/sls_detector
|
||||||
|
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Manual (HTML & PDF):
|
||||||
|
https://www.psi.ch/detectors/documentation
|
||||||
|
slsDetectorPackage/manual/docs/
|
||||||
|
|
||||||
|
Command Line Documentation:
|
||||||
|
manual/docs/html/slsDetectorClientDocs/index.html
|
||||||
|
manual/docs/pdf/slsDetectorClientDocs.pdf
|
||||||
|
|
||||||
|
C++ API Documentation:
|
||||||
|
manual/docs/html/slsDetectorUsersDocs/index.html
|
||||||
|
manual/docs/pdf/slsDetectorUsersDocs.pdf
|
||||||
|
|
||||||
|
C++ API Example:
|
||||||
|
manual/manual-api/mainClient.cpp
|
||||||
|
manual/manual-api/mainReceiver.cpp
|
||||||
|
|
||||||
|
Python API Documentation:
|
||||||
|
https://slsdetectorgroup.github.io/sls_detector/
|
||||||
|
|
||||||
|
Further Documentation:
|
||||||
|
https://www.psi.ch/detectors/users-support
|
||||||
|
|
||||||
|
|
||||||
|
Support
|
||||||
|
-------
|
||||||
|
|
||||||
|
General Software related:
|
||||||
|
dhanya.thattil@psi.ch
|
||||||
|
anna.bergamaschi@psi.ch
|
||||||
|
|
||||||
|
Python related:
|
||||||
|
erik.frojdh@psi.ch
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CONTENTS
|
||||||
|
|
||||||
|
1. Firmware Requirements
|
||||||
|
2. Changes in User Interface
|
||||||
|
3. New/Modified Commands
|
||||||
|
4. Other New Features
|
||||||
|
5. Resolved Issues
|
||||||
|
6. Known Issues
|
||||||
|
7. Next Major Release Plans
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1. Firmware Requirements
|
||||||
|
========================
|
||||||
|
|
||||||
|
Gotthard
|
||||||
|
========
|
||||||
|
Minimum compatible version : 11.01.2013
|
||||||
|
Latest version : 08.02.2018 (50um and 25um Master)
|
||||||
|
09.02.2018 (25 um Slave)
|
||||||
|
Eiger
|
||||||
|
=====
|
||||||
|
Minimum compatible version : 22
|
||||||
|
Latest version : 22
|
||||||
|
|
||||||
|
Jungfrau
|
||||||
|
========
|
||||||
|
Minimum compatible version : 15.06.2018
|
||||||
|
Latest version : 15.06.2018
|
||||||
|
|
||||||
|
|
||||||
|
Detector Upgrade
|
||||||
|
================
|
||||||
|
Gotthard Cannot be upgraded remotely. Requires programming via USB blaster
|
||||||
|
Eiger Can be upgraded remotely via bit files
|
||||||
|
Jungfrau Can be upgraded remotely using sls_detector_put programfpga <pof>
|
||||||
|
|
||||||
|
Instructions available at
|
||||||
|
https://www.psi.ch/detectors/installation-instructions
|
||||||
|
under Detector Upgrade -> [Detector Type] -> Firmware.
|
||||||
|
|
||||||
|
|
||||||
|
Please refer to the link below for more details on the firmware versions.
|
||||||
|
https://www.psi.ch/detectors/firmware.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2. Changes in User Interface
|
||||||
|
============================
|
||||||
|
|
||||||
|
Client
|
||||||
|
------
|
||||||
|
|
||||||
|
1. Shared Memory:
|
||||||
|
|
||||||
|
POSIX shared memory has been implemented and they are typically created in
|
||||||
|
/dev/shm/ folder.
|
||||||
|
|
||||||
|
A multiSlsDetector object will create a shared memory segment with naming style:
|
||||||
|
slsDetectorPackage_x_[_z]
|
||||||
|
and an slsDetector object will create a shared memory segment with naming style:
|
||||||
|
slsDetectorPackage_x_sls_y[_z]
|
||||||
|
|
||||||
|
where
|
||||||
|
x is the multi detector id
|
||||||
|
y is the sls detector id
|
||||||
|
z is the environment variable SLSDETNAME, if set.
|
||||||
|
They can be deleted directly.
|
||||||
|
|
||||||
|
Environment variable SLSDETNAME included for user-friendliness
|
||||||
|
of using 2 different detectors from the same client pc. One needn't use
|
||||||
|
different multi detector id if the SLSDETNAME is different for both consoles.
|
||||||
|
|
||||||
|
Constructor will fail if shared memory size is different (different package
|
||||||
|
releases/detectors). Loading config file cleans shared memory.
|
||||||
|
|
||||||
|
|
||||||
|
2. Exceptions in constructors:
|
||||||
|
|
||||||
|
All constructors that have an error throws an exception. For this release,
|
||||||
|
this is caught within the package and interfaced as error codes or messages
|
||||||
|
to the users using command line or API.
|
||||||
|
|
||||||
|
As a result:
|
||||||
|
- slsDetectorsUsers constructor signature now includes a success flag.
|
||||||
|
- If one uses multiSlsDetector, slsDetector, ZmqSocket classes directly,
|
||||||
|
catch exceptions from constructors.
|
||||||
|
- In future releases, the exception will be thrown
|
||||||
|
outside the package for the users to handle it.
|
||||||
|
|
||||||
|
|
||||||
|
3. API Compatibility:
|
||||||
|
|
||||||
|
Client now checks API version of Detector Server - Client and Receiver - Client
|
||||||
|
when connecting for the first time to detector server or receiver server
|
||||||
|
and the online flags have not been set in shm.
|
||||||
|
|
||||||
|
Upon failure, error messages will ensue and further commands will not
|
||||||
|
be executed. Detector servers referred to are only for Eiger, Jungfrau and Gotthard.
|
||||||
|
|
||||||
|
Previously, the detector server would exit on mismatched Firmware-Detector
|
||||||
|
server mismatch. They now wait for client to ask for compatibility check,
|
||||||
|
which is done the first time client connects to the detector and the
|
||||||
|
online flag in shm has not been set.
|
||||||
|
|
||||||
|
|
||||||
|
4. Commands "type", "id" and "replace" are removed.
|
||||||
|
|
||||||
|
|
||||||
|
Receiver
|
||||||
|
--------
|
||||||
|
|
||||||
|
1. Reciever Header Structure in file writing and call back:
|
||||||
|
|
||||||
|
sls_receiver_header structure added to sls_receiver_defs.h for image headers
|
||||||
|
in file writing.
|
||||||
|
|
||||||
|
#define MAX_NUM_PACKETS 512
|
||||||
|
typedef std::bitset<MAX_NUM_PACKETS> sls_bitset;
|
||||||
|
typedef struct {
|
||||||
|
sls_detector_header detHeader; /**< is the detector header */
|
||||||
|
sls_bitset packetsMask; /**< is the packets caught bit mask */
|
||||||
|
} sls_receiver_header;
|
||||||
|
|
||||||
|
It includes the detector header structure + bitmask of 512 bits,
|
||||||
|
where each bit represents a packet caught. This is useful in saving time
|
||||||
|
in writing to file by not padding missing packets and still retaining useful data.
|
||||||
|
|
||||||
|
The binary and HDF5 writer version number changed from 1.0 to 2.0.
|
||||||
|
The detector header version remains as 1.0.
|
||||||
|
|
||||||
|
registerCallBackRawDataReady modified to give this structure pointer,
|
||||||
|
instead of individual structure member pointers.
|
||||||
|
|
||||||
|
|
||||||
|
2. ZmqSocket class:
|
||||||
|
|
||||||
|
If one uses ZmqSocket.h, then the json header has to be parsed outside
|
||||||
|
the class to allow the user to remove the restriction in extracting all data
|
||||||
|
from the json header.
|
||||||
|
|
||||||
|
|
||||||
|
3. Receiver Call back with modified size:
|
||||||
|
|
||||||
|
registerCallBackRawDataModifyReady call back that is similar to the receiver
|
||||||
|
registerCallBackRawDataReady has been added to allow the call back to
|
||||||
|
specify an updated size of image after call back. This is in view to process
|
||||||
|
an image in call back (including extract only a region of the image) and
|
||||||
|
provide this updated size in callback. This new resized/processed image
|
||||||
|
will be written to file or streamed out via zmq. This is useful in ROI
|
||||||
|
selection in the receiver.
|
||||||
|
|
||||||
|
This also means that the call back is now called before writing to file.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
3. New/Modified Commands
|
||||||
|
========================
|
||||||
|
|
||||||
|
Client
|
||||||
|
------
|
||||||
|
|
||||||
|
1. add (modified):
|
||||||
|
appends detector to end of multi detector list.
|
||||||
|
|
||||||
|
2. replace:
|
||||||
|
sets hostname/ip address for a single detector.
|
||||||
|
|
||||||
|
3. user:
|
||||||
|
get user details from shared memory.
|
||||||
|
|
||||||
|
4. checkdetversion:
|
||||||
|
checks client version compatibility with detector server.
|
||||||
|
|
||||||
|
5. checkrecversion:
|
||||||
|
checks client version compatibility with receiver server.
|
||||||
|
|
||||||
|
|
||||||
|
Receiver
|
||||||
|
--------
|
||||||
|
|
||||||
|
1. rx_zmqip:
|
||||||
|
sets/gets the zmq (TCP) ip of the receiver from where data is streamed
|
||||||
|
out from. (Eg. to the gui or intermediate process). By default, it is
|
||||||
|
the same as the zmqip.
|
||||||
|
|
||||||
|
2. zmqip:
|
||||||
|
sets/gets the zmq (TCP) ip, where client listens to, to reconstuct images.
|
||||||
|
(Eg. from receiver or intermediate process). By default, it is the same
|
||||||
|
as rx_zmqip.
|
||||||
|
|
||||||
|
3. rx_jsonaddheader:
|
||||||
|
sets/gets additional json header to be streamed out with the zmq from
|
||||||
|
receiver. Default is empty. Eg. p rx_jsonaddheader \"what\":\"nothing\"
|
||||||
|
|
||||||
|
4. r_discardpolicy:
|
||||||
|
sets/gets the frame discard policy in the receiver.
|
||||||
|
nodiscard - no discard (default),
|
||||||
|
discardempty - discard only empty frames,
|
||||||
|
discardpartial - discard any partial frame(fastest)
|
||||||
|
|
||||||
|
5. r_padding:
|
||||||
|
sets/gets the frame padding in the receiver.
|
||||||
|
0 does not pad partial frames(fastest),
|
||||||
|
1 (default) pads partial frames.
|
||||||
|
One can look at bitmask in the sls_receiver_header to process the unpadded
|
||||||
|
partial frames later.
|
||||||
|
|
||||||
|
6. activate (modified):
|
||||||
|
Extra option added to pad or unpad images in receivers when deactivated.
|
||||||
|
activate i [padding option], where i is activate/deactivate and padding
|
||||||
|
option is "padding" (default) or "nopadding".
|
||||||
|
|
||||||
|
7. rx_udpsocksize:
|
||||||
|
sets/gets the UDP socket buffer size. Already attempts to set by default
|
||||||
|
to 100mb, 2gb for Jungfrau. Does not remember custom values in client
|
||||||
|
shared memory, so must be initialized each time after setting receiver
|
||||||
|
hostname in config file.
|
||||||
|
|
||||||
|
8. rx_realudpsocksize:
|
||||||
|
gets the actual UDP socket buffer size. Usually double the set udp socket
|
||||||
|
buffer size due to kernel bookkeeping.
|
||||||
|
|
||||||
|
9. r_framesperfile:
|
||||||
|
sets/gets the frames per file in receiver. 0 means infinite or all frames
|
||||||
|
in a single file. Default of Eiger changed from 2k to 10k.
|
||||||
|
|
||||||
|
|
||||||
|
Eiger Specific
|
||||||
|
--------------
|
||||||
|
|
||||||
|
1. status trigger:
|
||||||
|
To trigger internally via software, one can use "status trigger".
|
||||||
|
|
||||||
|
2. subdeadtime:
|
||||||
|
sets/gets sub frame dead time in s in 32 bit mode. Subperiod is set in
|
||||||
|
the detector by subexptime + subdeadtime. This value is normally a
|
||||||
|
constant set by an expert catered to individual detector modules in the
|
||||||
|
config file. Receiver files writes master file metadata subperiod
|
||||||
|
instead of subdeadtime.
|
||||||
|
|
||||||
|
3. gappixels:
|
||||||
|
enables/disables gap pixels in system (detector & receiver). 1 sets,
|
||||||
|
0 unsets. In Receiver, 4 bit gap pixels mode is not implemented, but is
|
||||||
|
implemented in client data call back. Gap pixels are at module level
|
||||||
|
and not at multi module level.
|
||||||
|
|
||||||
|
4. measuredperiod:
|
||||||
|
gets the measured frame period (time between last frame and the previous
|
||||||
|
one) in s. Makes sense only for acquisitions of more than 1 frame.
|
||||||
|
|
||||||
|
5. measuredsubperiod:
|
||||||
|
gets the measured subframe period (time between last subframe and the
|
||||||
|
previous one) in s in 32 bit mode.
|
||||||
|
|
||||||
|
6. flags(modified):
|
||||||
|
extra flags "nooverflow" (default) and "overflow" for sub images in 32
|
||||||
|
bit mode. If set to overflow, it will set MSB of pixel data high if
|
||||||
|
there was any saturation in any of the sub images 32 bit mode.
|
||||||
|
|
||||||
|
|
||||||
|
Jungfrau Specific
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
1. storagecells:
|
||||||
|
sets/gets number of additional storage cells per acquisition. For very
|
||||||
|
advanced users only. Range: 0-15. Default: 0.
|
||||||
|
The #images = #frames * #cycles * (#storagecells +1).
|
||||||
|
|
||||||
|
2. storage_start:
|
||||||
|
sets/gets the storage cell that stores the first acquisition of the series.
|
||||||
|
For very advanced users only. Range: 0-15. Default: 15(0xf).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
4. Other New Features
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Client
|
||||||
|
------
|
||||||
|
|
||||||
|
1. (Jungfrau & Gotthard) Settingsdir and caldir is removed from config file.
|
||||||
|
Default dacs are stored in detector server. Hence, these folders
|
||||||
|
are also removed from slsDetectorPackage/settingsdir. Eiger and Mythen
|
||||||
|
continue to have them.
|
||||||
|
|
||||||
|
2. Depending on 1d position of detectors and detsizechan in config file,
|
||||||
|
row and column (previously xcoord and ycoord) are given to detector
|
||||||
|
servers (Eiger and Jungfrau) to encode into the udp header.
|
||||||
|
|
||||||
|
3. (Eiger) Setting threshold energy changes such as CAL dac is irrelevant
|
||||||
|
when interpolating between two energies and VRS dac is interpolated, not copied.
|
||||||
|
|
||||||
|
4. Users API updated with the following functions:
|
||||||
|
- setReceiverFramesDiscardPolicy
|
||||||
|
- setReceiverPartialFramesPadding
|
||||||
|
- setReceiverFramesPerFile
|
||||||
|
- sendSoftwareTrigger
|
||||||
|
- setSubFrameExposureDeadTime
|
||||||
|
- setSubFrameExposureTime
|
||||||
|
- enableGapPixels
|
||||||
|
- getMeasuredPeriod
|
||||||
|
- getMeasuredSubFramePeriod
|
||||||
|
- setOverflowMode
|
||||||
|
- setNumberOfStorageCells
|
||||||
|
- setStoragecellStart
|
||||||
|
- setThresholdEnergy (overloaded)
|
||||||
|
- resetFramesCaughtInReceiver
|
||||||
|
- setReceiverFifoDepth
|
||||||
|
- setFlowControl10G
|
||||||
|
- setTenGigabitEthernet
|
||||||
|
- getNMods
|
||||||
|
- setReceiverDataStreamingOutIP
|
||||||
|
- setClientDataStreamingInIP
|
||||||
|
|
||||||
|
SlsReceiver
|
||||||
|
-----------
|
||||||
|
|
||||||
|
1. slsMultiReceiver executable added that creates multiple receiver child processes.
|
||||||
|
./slsMultiReceiver [start_tcp_port] [num_receivers] [1 for call back, 0 for none]
|
||||||
|
|
||||||
|
2. Default row and column (previously xcoord and ycoord) are hardcoded
|
||||||
|
for missing packets. (Eiger and Jungfrau)
|
||||||
|
|
||||||
|
|
||||||
|
Gui
|
||||||
|
---
|
||||||
|
|
||||||
|
1. (Jungfrau) Gain plot included. Option under 2D options in Plot tab.
|
||||||
|
|
||||||
|
2. Option to maintain aspect ratio
|
||||||
|
|
||||||
|
3. Start and Stop separated to prevent multiple click syndrome.
|
||||||
|
|
||||||
|
|
||||||
|
Detector Server
|
||||||
|
---------------
|
||||||
|
|
||||||
|
1. (Jungfrau) To use programfpga command, one must start server with -update
|
||||||
|
mode and then restart server without -update mode.
|
||||||
|
|
||||||
|
2. (Jungfrau) ASIC Timer configured at server start up and changed a few
|
||||||
|
startup values for firmware v0.7 such as adc phase, ADC_PORT_INVERT_VAL
|
||||||
|
and ADC offset half speed value.
|
||||||
|
|
||||||
|
3. (Jungfrau) Minimum exposure time of 50 us was implemented.
|
||||||
|
|
||||||
|
4. (Eiger and Jungfrau) They can be configured to have x and y coord values
|
||||||
|
of the detector in their udp header.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5. Resolved Issues
|
||||||
|
==================
|
||||||
|
|
||||||
|
Client
|
||||||
|
------
|
||||||
|
memory leak for multi threading
|
||||||
|
|
||||||
|
1. Compiler flag -std=c++98 enforced. Debug flag removed.
|
||||||
|
|
||||||
|
2. If trimen gives different list from different detectors, it returns a -1.
|
||||||
|
|
||||||
|
3. Version format for each submodule of the package changed to just date YYMMDD.
|
||||||
|
Users class fixed to give correct version, instead of -1.
|
||||||
|
|
||||||
|
4. Getting settings in users class gave -1. Fixed now.
|
||||||
|
|
||||||
|
5. (Jungfrau) Programming FPGA now creates the rawbin file from pof in tmp
|
||||||
|
rather than source file location (for permission issues).
|
||||||
|
|
||||||
|
6. (Gotthard) ROI segmentation fault fixed.
|
||||||
|
|
||||||
|
Receiver
|
||||||
|
--------
|
||||||
|
|
||||||
|
1. Silent feature of receiver fixed.
|
||||||
|
|
||||||
|
2. Socket descriptor misused earlier for success flag, instead exceptions
|
||||||
|
used that are handled inside the package.
|
||||||
|
|
||||||
|
3. Global optind variable initialized to instantiate multiple receivers
|
||||||
|
in same process. Also removed static members to enable this feature.
|
||||||
|
|
||||||
|
4. Socket buffer size attempts to set for each acquiistion and provide
|
||||||
|
warning if no capabilities. Warnings can be removed using instruction with
|
||||||
|
error provided. Default Jungfrau UDP socket buffer size if 2 GB, default is
|
||||||
|
100 MB.
|
||||||
|
|
||||||
|
5. Refactored code a bit for performance and robustness, blocking push
|
||||||
|
in buffer between listener and dataprocessor
|
||||||
|
|
||||||
|
|
||||||
|
Detector Server
|
||||||
|
---------------
|
||||||
|
|
||||||
|
1. (Jungfrau) Stop server also mapped during a reset. Reading power status
|
||||||
|
instead of user input register for power.
|
||||||
|
|
||||||
|
2. (Eiger) Bug fix for saving trimbits to file (Advanced users).
|
||||||
|
|
||||||
|
3. (Gotthard 25um) config.txt is not read again after detector startup,
|
||||||
|
no matter the number of times the detector server is restarted.
|
||||||
|
|
||||||
|
|
||||||
|
6. Known Issues
|
||||||
|
===============
|
||||||
|
|
||||||
|
Receiver
|
||||||
|
--------
|
||||||
|
|
||||||
|
1. HDF5 compression and filters are not implemented yet.
|
||||||
|
|
||||||
|
|
||||||
|
Detector Server
|
||||||
|
---------------
|
||||||
|
|
||||||
|
1. (Eiger) Registers mapped differently between firmware v20 and v22.
|
||||||
|
So, please ensure correct on-board server before switching between
|
||||||
|
firmware versions. Else one cannot ping it anymore. Will need to flash firmware
|
||||||
|
again to recover.
|
||||||
|
|
||||||
|
2. (Gotthard) To switch back to all ADC from single ADC ROI, one must take
|
||||||
|
even number of images for the receiver to understand complete images.
|
||||||
|
This will be fixed in the next firmware upgrade.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
7. Next Major Release Plans
|
||||||
|
===========================
|
||||||
|
|
||||||
|
Client
|
||||||
|
------
|
||||||
|
|
||||||
|
1. Exceptions thrown to the user to be handled.
|
||||||
|
|
||||||
|
2. Compilation using c++11.
|
||||||
|
|
||||||
|
3. Support of Mythen II restricted to this major and its minor releases.
|
||||||
|
|
||||||
|
4. Restructuring and refactoring of client code.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
14934
catch/catch.hpp
1
cleansharedmemory.sh
Normal file
@ -0,0 +1 @@
|
|||||||
|
rm /dev/shm/slsDetectorPackage*;
|
@ -1,175 +0,0 @@
|
|||||||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
||||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
||||||
|
|
||||||
#[=======================================================================[.rst:
|
|
||||||
Catch
|
|
||||||
-----
|
|
||||||
|
|
||||||
This module defines a function to help use the Catch test framework.
|
|
||||||
|
|
||||||
The :command:`catch_discover_tests` discovers tests by asking the compiled test
|
|
||||||
executable to enumerate its tests. This does not require CMake to be re-run
|
|
||||||
when tests change. However, it may not work in a cross-compiling environment,
|
|
||||||
and setting test properties is less convenient.
|
|
||||||
|
|
||||||
This command is intended to replace use of :command:`add_test` to register
|
|
||||||
tests, and will create a separate CTest test for each Catch test case. Note
|
|
||||||
that this is in some cases less efficient, as common set-up and tear-down logic
|
|
||||||
cannot be shared by multiple test cases executing in the same instance.
|
|
||||||
However, it provides more fine-grained pass/fail information to CTest, which is
|
|
||||||
usually considered as more beneficial. By default, the CTest test name is the
|
|
||||||
same as the Catch name; see also ``TEST_PREFIX`` and ``TEST_SUFFIX``.
|
|
||||||
|
|
||||||
.. command:: catch_discover_tests
|
|
||||||
|
|
||||||
Automatically add tests with CTest by querying the compiled test executable
|
|
||||||
for available tests::
|
|
||||||
|
|
||||||
catch_discover_tests(target
|
|
||||||
[TEST_SPEC arg1...]
|
|
||||||
[EXTRA_ARGS arg1...]
|
|
||||||
[WORKING_DIRECTORY dir]
|
|
||||||
[TEST_PREFIX prefix]
|
|
||||||
[TEST_SUFFIX suffix]
|
|
||||||
[PROPERTIES name1 value1...]
|
|
||||||
[TEST_LIST var]
|
|
||||||
)
|
|
||||||
|
|
||||||
``catch_discover_tests`` sets up a post-build command on the test executable
|
|
||||||
that generates the list of tests by parsing the output from running the test
|
|
||||||
with the ``--list-test-names-only`` argument. This ensures that the full
|
|
||||||
list of tests is obtained. Since test discovery occurs at build time, it is
|
|
||||||
not necessary to re-run CMake when the list of tests changes.
|
|
||||||
However, it requires that :prop_tgt:`CROSSCOMPILING_EMULATOR` is properly set
|
|
||||||
in order to function in a cross-compiling environment.
|
|
||||||
|
|
||||||
Additionally, setting properties on tests is somewhat less convenient, since
|
|
||||||
the tests are not available at CMake time. Additional test properties may be
|
|
||||||
assigned to the set of tests as a whole using the ``PROPERTIES`` option. If
|
|
||||||
more fine-grained test control is needed, custom content may be provided
|
|
||||||
through an external CTest script using the :prop_dir:`TEST_INCLUDE_FILES`
|
|
||||||
directory property. The set of discovered tests is made accessible to such a
|
|
||||||
script via the ``<target>_TESTS`` variable.
|
|
||||||
|
|
||||||
The options are:
|
|
||||||
|
|
||||||
``target``
|
|
||||||
Specifies the Catch executable, which must be a known CMake executable
|
|
||||||
target. CMake will substitute the location of the built executable when
|
|
||||||
running the test.
|
|
||||||
|
|
||||||
``TEST_SPEC arg1...``
|
|
||||||
Specifies test cases, wildcarded test cases, tags and tag expressions to
|
|
||||||
pass to the Catch executable with the ``--list-test-names-only`` argument.
|
|
||||||
|
|
||||||
``EXTRA_ARGS arg1...``
|
|
||||||
Any extra arguments to pass on the command line to each test case.
|
|
||||||
|
|
||||||
``WORKING_DIRECTORY dir``
|
|
||||||
Specifies the directory in which to run the discovered test cases. If this
|
|
||||||
option is not provided, the current binary directory is used.
|
|
||||||
|
|
||||||
``TEST_PREFIX prefix``
|
|
||||||
Specifies a ``prefix`` to be prepended to the name of each discovered test
|
|
||||||
case. This can be useful when the same test executable is being used in
|
|
||||||
multiple calls to ``catch_discover_tests()`` but with different
|
|
||||||
``TEST_SPEC`` or ``EXTRA_ARGS``.
|
|
||||||
|
|
||||||
``TEST_SUFFIX suffix``
|
|
||||||
Similar to ``TEST_PREFIX`` except the ``suffix`` is appended to the name of
|
|
||||||
every discovered test case. Both ``TEST_PREFIX`` and ``TEST_SUFFIX`` may
|
|
||||||
be specified.
|
|
||||||
|
|
||||||
``PROPERTIES name1 value1...``
|
|
||||||
Specifies additional properties to be set on all tests discovered by this
|
|
||||||
invocation of ``catch_discover_tests``.
|
|
||||||
|
|
||||||
``TEST_LIST var``
|
|
||||||
Make the list of tests available in the variable ``var``, rather than the
|
|
||||||
default ``<target>_TESTS``. This can be useful when the same test
|
|
||||||
executable is being used in multiple calls to ``catch_discover_tests()``.
|
|
||||||
Note that this variable is only available in CTest.
|
|
||||||
|
|
||||||
#]=======================================================================]
|
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
function(catch_discover_tests TARGET)
|
|
||||||
cmake_parse_arguments(
|
|
||||||
""
|
|
||||||
""
|
|
||||||
"TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST"
|
|
||||||
"TEST_SPEC;EXTRA_ARGS;PROPERTIES"
|
|
||||||
${ARGN}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT _WORKING_DIRECTORY)
|
|
||||||
set(_WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
|
|
||||||
endif()
|
|
||||||
if(NOT _TEST_LIST)
|
|
||||||
set(_TEST_LIST ${TARGET}_TESTS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
## Generate a unique name based on the extra arguments
|
|
||||||
string(SHA1 args_hash "${_TEST_SPEC} ${_EXTRA_ARGS}")
|
|
||||||
string(SUBSTRING ${args_hash} 0 7 args_hash)
|
|
||||||
|
|
||||||
# Define rule to generate test list for aforementioned test executable
|
|
||||||
set(ctest_include_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_include-${args_hash}.cmake")
|
|
||||||
set(ctest_tests_file "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_tests-${args_hash}.cmake")
|
|
||||||
get_property(crosscompiling_emulator
|
|
||||||
TARGET ${TARGET}
|
|
||||||
PROPERTY CROSSCOMPILING_EMULATOR
|
|
||||||
)
|
|
||||||
add_custom_command(
|
|
||||||
TARGET ${TARGET} POST_BUILD
|
|
||||||
BYPRODUCTS "${ctest_tests_file}"
|
|
||||||
COMMAND "${CMAKE_COMMAND}"
|
|
||||||
-D "TEST_TARGET=${TARGET}"
|
|
||||||
-D "TEST_EXECUTABLE=$<TARGET_FILE:${TARGET}>"
|
|
||||||
-D "TEST_EXECUTOR=${crosscompiling_emulator}"
|
|
||||||
-D "TEST_WORKING_DIR=${_WORKING_DIRECTORY}"
|
|
||||||
-D "TEST_SPEC=${_TEST_SPEC}"
|
|
||||||
-D "TEST_EXTRA_ARGS=${_EXTRA_ARGS}"
|
|
||||||
-D "TEST_PROPERTIES=${_PROPERTIES}"
|
|
||||||
-D "TEST_PREFIX=${_TEST_PREFIX}"
|
|
||||||
-D "TEST_SUFFIX=${_TEST_SUFFIX}"
|
|
||||||
-D "TEST_LIST=${_TEST_LIST}"
|
|
||||||
-D "CTEST_FILE=${ctest_tests_file}"
|
|
||||||
-P "${_CATCH_DISCOVER_TESTS_SCRIPT}"
|
|
||||||
VERBATIM
|
|
||||||
)
|
|
||||||
|
|
||||||
file(WRITE "${ctest_include_file}"
|
|
||||||
"if(EXISTS \"${ctest_tests_file}\")\n"
|
|
||||||
" include(\"${ctest_tests_file}\")\n"
|
|
||||||
"else()\n"
|
|
||||||
" add_test(${TARGET}_NOT_BUILT-${args_hash} ${TARGET}_NOT_BUILT-${args_hash})\n"
|
|
||||||
"endif()\n"
|
|
||||||
)
|
|
||||||
|
|
||||||
if(NOT ${CMAKE_VERSION} VERSION_LESS "3.10.0")
|
|
||||||
# Add discovered tests to directory TEST_INCLUDE_FILES
|
|
||||||
set_property(DIRECTORY
|
|
||||||
APPEND PROPERTY TEST_INCLUDE_FILES "${ctest_include_file}"
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
# Add discovered tests as directory TEST_INCLUDE_FILE if possible
|
|
||||||
get_property(test_include_file_set DIRECTORY PROPERTY TEST_INCLUDE_FILE SET)
|
|
||||||
if (NOT ${test_include_file_set})
|
|
||||||
set_property(DIRECTORY
|
|
||||||
PROPERTY TEST_INCLUDE_FILE "${ctest_include_file}"
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Cannot set more than one TEST_INCLUDE_FILE"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
set(_CATCH_DISCOVER_TESTS_SCRIPT
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/CatchAddTests.cmake
|
|
||||||
)
|
|
@ -1,78 +0,0 @@
|
|||||||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
||||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
||||||
|
|
||||||
set(prefix "${TEST_PREFIX}")
|
|
||||||
set(suffix "${TEST_SUFFIX}")
|
|
||||||
set(spec ${TEST_SPEC})
|
|
||||||
set(extra_args ${TEST_EXTRA_ARGS})
|
|
||||||
set(properties ${TEST_PROPERTIES})
|
|
||||||
set(script)
|
|
||||||
set(suite)
|
|
||||||
set(tests)
|
|
||||||
|
|
||||||
function(add_command NAME)
|
|
||||||
set(_args "")
|
|
||||||
foreach(_arg ${ARGN})
|
|
||||||
if(_arg MATCHES "[^-./:a-zA-Z0-9_]")
|
|
||||||
set(_args "${_args} [==[${_arg}]==]") # form a bracket_argument
|
|
||||||
else()
|
|
||||||
set(_args "${_args} ${_arg}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
set(script "${script}${NAME}(${_args})\n" PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# Run test executable to get list of available tests
|
|
||||||
if(NOT EXISTS "${TEST_EXECUTABLE}")
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Specified test executable '${TEST_EXECUTABLE}' does not exist"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" ${spec} --list-test-names-only
|
|
||||||
OUTPUT_VARIABLE output
|
|
||||||
RESULT_VARIABLE result
|
|
||||||
)
|
|
||||||
# Catch --list-test-names-only reports the number of tests, so 0 is... surprising
|
|
||||||
if(${result} EQUAL 0)
|
|
||||||
message(WARNING
|
|
||||||
"Test executable '${TEST_EXECUTABLE}' contains no tests!\n"
|
|
||||||
)
|
|
||||||
elseif(${result} LESS 0)
|
|
||||||
message(FATAL_ERROR
|
|
||||||
"Error running test executable '${TEST_EXECUTABLE}':\n"
|
|
||||||
" Result: ${result}\n"
|
|
||||||
" Output: ${output}\n"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
string(REPLACE "\n" ";" output "${output}")
|
|
||||||
|
|
||||||
# Parse output
|
|
||||||
foreach(line ${output})
|
|
||||||
set(test ${line})
|
|
||||||
# use escape commas to handle properly test cases with commans inside the name
|
|
||||||
string(REPLACE "," "\\," test_name ${test})
|
|
||||||
# ...and add to script
|
|
||||||
add_command(add_test
|
|
||||||
"${prefix}${test}${suffix}"
|
|
||||||
${TEST_EXECUTOR}
|
|
||||||
"${TEST_EXECUTABLE}"
|
|
||||||
"${test_name}"
|
|
||||||
${extra_args}
|
|
||||||
)
|
|
||||||
add_command(set_tests_properties
|
|
||||||
"${prefix}${test}${suffix}"
|
|
||||||
PROPERTIES
|
|
||||||
WORKING_DIRECTORY "${TEST_WORKING_DIR}"
|
|
||||||
${properties}
|
|
||||||
)
|
|
||||||
list(APPEND tests "${prefix}${test}${suffix}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Create a list of all discovered tests, which users may use to e.g. set
|
|
||||||
# properties on the tests
|
|
||||||
add_command(set ${TEST_LIST} ${tests})
|
|
||||||
|
|
||||||
# Write CTest script
|
|
||||||
file(WRITE "${CTEST_FILE}" "${script}")
|
|
0
cmake/FindCBF.cmake
Executable file → Normal file
0
cmake/FindQwt.cmake
Executable file → Normal file
0
cmake/FindROOT.cmake
Executable file → Normal file
@ -1,112 +0,0 @@
|
|||||||
|
|
||||||
# This file is originally from https://github.com/zeromq/azmq and distributed
|
|
||||||
# under Boost Software Lincese 1.0
|
|
||||||
# Boost Software License - Version 1.0 - August 17th, 2003
|
|
||||||
|
|
||||||
# Permission is hereby granted, free of charge, to any person or organization
|
|
||||||
# obtaining a copy of the software and accompanying documentation covered by
|
|
||||||
# this license (the "Software") to use, reproduce, display, distribute,
|
|
||||||
# execute, and transmit the Software, and to prepare derivative works of the
|
|
||||||
# Software, and to permit third-parties to whom the Software is furnished to
|
|
||||||
# do so, all subject to the following:
|
|
||||||
|
|
||||||
# The copyright notices in the Software and this entire statement, including
|
|
||||||
# the above license grant, this restriction and the following disclaimer,
|
|
||||||
# must be included in all copies of the Software, in whole or in part, and
|
|
||||||
# all derivative works of the Software, unless such copies or derivative
|
|
||||||
# works are solely in the form of machine-executable object code generated by
|
|
||||||
# a source language processor.
|
|
||||||
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
|
||||||
# SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
|
||||||
# FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
|
||||||
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
# DEALINGS IN THE SOFTWARE.
|
|
||||||
# --------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Find ZeroMQ Headers/Libs
|
|
||||||
|
|
||||||
# Variables
|
|
||||||
# ZMQ_ROOT - set this to a location where ZeroMQ may be found
|
|
||||||
#
|
|
||||||
# ZeroMQ_FOUND - True of ZeroMQ found
|
|
||||||
# ZeroMQ_INCLUDE_DIRS - Location of ZeroMQ includes
|
|
||||||
# ZeroMQ_LIBRARIES - ZeroMQ libraries
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
|
|
||||||
if (NOT ZMQ_ROOT)
|
|
||||||
set(ZMQ_ROOT "$ENV{ZMQ_ROOT}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT ZMQ_ROOT)
|
|
||||||
find_path(_ZeroMQ_ROOT NAMES include/zmq.h)
|
|
||||||
else()
|
|
||||||
set(_ZeroMQ_ROOT "${ZMQ_ROOT}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_path(ZeroMQ_INCLUDE_DIRS NAMES zmq.h HINTS ${_ZeroMQ_ROOT}/include)
|
|
||||||
|
|
||||||
if (ZeroMQ_INCLUDE_DIRS)
|
|
||||||
set(_ZeroMQ_H ${ZeroMQ_INCLUDE_DIRS}/zmq.h)
|
|
||||||
|
|
||||||
function(_zmqver_EXTRACT _ZeroMQ_VER_COMPONENT _ZeroMQ_VER_OUTPUT)
|
|
||||||
set(CMAKE_MATCH_1 "0")
|
|
||||||
set(_ZeroMQ_expr "^[ \\t]*#define[ \\t]+${_ZeroMQ_VER_COMPONENT}[ \\t]+([0-9]+)$")
|
|
||||||
file(STRINGS "${_ZeroMQ_H}" _ZeroMQ_ver REGEX "${_ZeroMQ_expr}")
|
|
||||||
string(REGEX MATCH "${_ZeroMQ_expr}" ZeroMQ_ver "${_ZeroMQ_ver}")
|
|
||||||
set(${_ZeroMQ_VER_OUTPUT} "${CMAKE_MATCH_1}" PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
_zmqver_EXTRACT("ZMQ_VERSION_MAJOR" ZeroMQ_VERSION_MAJOR)
|
|
||||||
_zmqver_EXTRACT("ZMQ_VERSION_MINOR" ZeroMQ_VERSION_MINOR)
|
|
||||||
_zmqver_EXTRACT("ZMQ_VERSION_PATCH" ZeroMQ_VERSION_PATCH)
|
|
||||||
|
|
||||||
message(STATUS "ZeroMQ version: ${ZeroMQ_VERSION_MAJOR}.${ZeroMQ_VERSION_MINOR}.${ZeroMQ_VERSION_PATCH}")
|
|
||||||
|
|
||||||
# We should provide version to find_package_handle_standard_args in the same format as it was requested,
|
|
||||||
# otherwise it can't check whether version matches exactly.
|
|
||||||
if (ZeroMQ_FIND_VERSION_COUNT GREATER 2)
|
|
||||||
set(ZeroMQ_VERSION "${ZeroMQ_VERSION_MAJOR}.${ZeroMQ_VERSION_MINOR}.${ZeroMQ_VERSION_PATCH}")
|
|
||||||
else()
|
|
||||||
# User has requested ZeroMQ version without patch part => user is not interested in specific patch =>
|
|
||||||
# any patch should be an exact match.
|
|
||||||
set(ZeroMQ_VERSION "${ZeroMQ_VERSION_MAJOR}.${ZeroMQ_VERSION_MINOR}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT ${CMAKE_CXX_PLATFORM_ID} STREQUAL "Windows")
|
|
||||||
find_library(ZeroMQ_LIBRARIES NAMES zmq HINTS ${_ZeroMQ_ROOT}/lib)
|
|
||||||
else()
|
|
||||||
find_library(
|
|
||||||
ZeroMQ_LIBRARY_RELEASE
|
|
||||||
NAMES
|
|
||||||
libzmq
|
|
||||||
"libzmq-${CMAKE_VS_PLATFORM_TOOLSET}-mt-${ZeroMQ_VERSION_MAJOR}_${ZeroMQ_VERSION_MINOR}_${ZeroMQ_VERSION_PATCH}"
|
|
||||||
HINTS
|
|
||||||
${_ZeroMQ_ROOT}/lib
|
|
||||||
)
|
|
||||||
|
|
||||||
find_library(
|
|
||||||
ZeroMQ_LIBRARY_DEBUG
|
|
||||||
NAMES
|
|
||||||
libzmq_d
|
|
||||||
"libzmq-${CMAKE_VS_PLATFORM_TOOLSET}-mt-gd-${ZeroMQ_VERSION_MAJOR}_${ZeroMQ_VERSION_MINOR}_${ZeroMQ_VERSION_PATCH}"
|
|
||||||
HINTS
|
|
||||||
${_ZeroMQ_ROOT}/lib)
|
|
||||||
|
|
||||||
# On Windows we have to use corresponding version (i.e. Release or Debug) of ZeroMQ because of `errno` CRT global variable
|
|
||||||
# See more at http://www.drdobbs.com/avoiding-the-visual-c-runtime-library/184416623
|
|
||||||
set(ZeroMQ_LIBRARIES optimized "${ZeroMQ_LIBRARY_RELEASE}" debug "${ZeroMQ_LIBRARY_DEBUG}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package_handle_standard_args(ZeroMQ FOUND_VAR ZeroMQ_FOUND
|
|
||||||
REQUIRED_VARS ZeroMQ_INCLUDE_DIRS ZeroMQ_LIBRARIES
|
|
||||||
VERSION_VAR ZeroMQ_VERSION)
|
|
||||||
|
|
||||||
if (ZeroMQ_FOUND)
|
|
||||||
mark_as_advanced(ZeroMQ_INCLUDE_DIRS ZeroMQ_LIBRARIES ZeroMQ_VERSION
|
|
||||||
ZeroMQ_VERSION_MAJOR ZeroMQ_VERSION_MINOR ZeroMQ_VERSION_PATCH)
|
|
||||||
endif()
|
|
@ -1,203 +0,0 @@
|
|||||||
#==================================================================================================#
|
|
||||||
# supported macros #
|
|
||||||
# - TEST_CASE, #
|
|
||||||
# - SCENARIO, #
|
|
||||||
# - TEST_CASE_METHOD, #
|
|
||||||
# - CATCH_TEST_CASE, #
|
|
||||||
# - CATCH_SCENARIO, #
|
|
||||||
# - CATCH_TEST_CASE_METHOD. #
|
|
||||||
# #
|
|
||||||
# Usage #
|
|
||||||
# 1. make sure this module is in the path or add this otherwise: #
|
|
||||||
# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/") #
|
|
||||||
# 2. make sure that you've enabled testing option for the project by the call: #
|
|
||||||
# enable_testing() #
|
|
||||||
# 3. add the lines to the script for testing target (sample CMakeLists.txt): #
|
|
||||||
# project(testing_target) #
|
|
||||||
# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake.modules/") #
|
|
||||||
# enable_testing() #
|
|
||||||
# #
|
|
||||||
# find_path(CATCH_INCLUDE_DIR "catch.hpp") #
|
|
||||||
# include_directories(${INCLUDE_DIRECTORIES} ${CATCH_INCLUDE_DIR}) #
|
|
||||||
# #
|
|
||||||
# file(GLOB SOURCE_FILES "*.cpp") #
|
|
||||||
# add_executable(${PROJECT_NAME} ${SOURCE_FILES}) #
|
|
||||||
# #
|
|
||||||
# include(ParseAndAddCatchTests) #
|
|
||||||
# ParseAndAddCatchTests(${PROJECT_NAME}) #
|
|
||||||
# #
|
|
||||||
# The following variables affect the behavior of the script: #
|
|
||||||
# #
|
|
||||||
# PARSE_CATCH_TESTS_VERBOSE (Default OFF) #
|
|
||||||
# -- enables debug messages #
|
|
||||||
# PARSE_CATCH_TESTS_NO_HIDDEN_TESTS (Default OFF) #
|
|
||||||
# -- excludes tests marked with [!hide], [.] or [.foo] tags #
|
|
||||||
# PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME (Default ON) #
|
|
||||||
# -- adds fixture class name to the test name #
|
|
||||||
# PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME (Default ON) #
|
|
||||||
# -- adds cmake target name to the test name #
|
|
||||||
# PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS (Default OFF) #
|
|
||||||
# -- causes CMake to rerun when file with tests changes so that new tests will be discovered #
|
|
||||||
# #
|
|
||||||
# One can also set (locally) the optional variable OptionalCatchTestLauncher to precise the way #
|
|
||||||
# a test should be run. For instance to use test MPI, one can write #
|
|
||||||
# set(OptionalCatchTestLauncher ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${NUMPROC}) #
|
|
||||||
# just before calling this ParseAndAddCatchTests function #
|
|
||||||
# #
|
|
||||||
#==================================================================================================#
|
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 2.8.8)
|
|
||||||
|
|
||||||
option(PARSE_CATCH_TESTS_VERBOSE "Print Catch to CTest parser debug messages" OFF)
|
|
||||||
option(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS "Exclude tests with [!hide], [.] or [.foo] tags" OFF)
|
|
||||||
option(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME "Add fixture class name to the test name" ON)
|
|
||||||
option(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME "Add target name to the test name" ON)
|
|
||||||
option(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS "Add test file to CMAKE_CONFIGURE_DEPENDS property" OFF)
|
|
||||||
|
|
||||||
function(PrintDebugMessage)
|
|
||||||
if(PARSE_CATCH_TESTS_VERBOSE)
|
|
||||||
message(STATUS "ParseAndAddCatchTests: ${ARGV}")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# This removes the contents between
|
|
||||||
# - block comments (i.e. /* ... */)
|
|
||||||
# - full line comments (i.e. // ... )
|
|
||||||
# contents have been read into '${CppCode}'.
|
|
||||||
# !keep partial line comments
|
|
||||||
function(RemoveComments CppCode)
|
|
||||||
string(ASCII 2 CMakeBeginBlockComment)
|
|
||||||
string(ASCII 3 CMakeEndBlockComment)
|
|
||||||
string(REGEX REPLACE "/\\*" "${CMakeBeginBlockComment}" ${CppCode} "${${CppCode}}")
|
|
||||||
string(REGEX REPLACE "\\*/" "${CMakeEndBlockComment}" ${CppCode} "${${CppCode}}")
|
|
||||||
string(REGEX REPLACE "${CMakeBeginBlockComment}[^${CMakeEndBlockComment}]*${CMakeEndBlockComment}" "" ${CppCode} "${${CppCode}}")
|
|
||||||
string(REGEX REPLACE "\n[ \t]*//+[^\n]+" "\n" ${CppCode} "${${CppCode}}")
|
|
||||||
|
|
||||||
set(${CppCode} "${${CppCode}}" PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# Worker function
|
|
||||||
function(ParseFile SourceFile TestTarget)
|
|
||||||
# According to CMake docs EXISTS behavior is well-defined only for full paths.
|
|
||||||
get_filename_component(SourceFile ${SourceFile} ABSOLUTE)
|
|
||||||
if(NOT EXISTS ${SourceFile})
|
|
||||||
message(WARNING "Cannot find source file: ${SourceFile}")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
PrintDebugMessage("parsing ${SourceFile}")
|
|
||||||
file(STRINGS ${SourceFile} Contents NEWLINE_CONSUME)
|
|
||||||
|
|
||||||
# Remove block and fullline comments
|
|
||||||
RemoveComments(Contents)
|
|
||||||
|
|
||||||
# Find definition of test names
|
|
||||||
string(REGEX MATCHALL "[ \t]*(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^\)]+\\)+[ \t\n]*{+[ \t]*(//[^\n]*[Tt][Ii][Mm][Ee][Oo][Uu][Tt][ \t]*[0-9]+)*" Tests "${Contents}")
|
|
||||||
|
|
||||||
if(PARSE_CATCH_TESTS_ADD_TO_CONFIGURE_DEPENDS AND Tests)
|
|
||||||
PrintDebugMessage("Adding ${SourceFile} to CMAKE_CONFIGURE_DEPENDS property")
|
|
||||||
set_property(
|
|
||||||
DIRECTORY
|
|
||||||
APPEND
|
|
||||||
PROPERTY CMAKE_CONFIGURE_DEPENDS ${SourceFile}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
foreach(TestName ${Tests})
|
|
||||||
# Strip newlines
|
|
||||||
string(REGEX REPLACE "\\\\\n|\n" "" TestName "${TestName}")
|
|
||||||
|
|
||||||
# Get test type and fixture if applicable
|
|
||||||
string(REGEX MATCH "(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)[ \t]*\\([^,^\"]*" TestTypeAndFixture "${TestName}")
|
|
||||||
string(REGEX MATCH "(CATCH_)?(TEST_CASE_METHOD|SCENARIO|TEST_CASE)" TestType "${TestTypeAndFixture}")
|
|
||||||
string(REGEX REPLACE "${TestType}\\([ \t]*" "" TestFixture "${TestTypeAndFixture}")
|
|
||||||
|
|
||||||
# Get string parts of test definition
|
|
||||||
string(REGEX MATCHALL "\"+([^\\^\"]|\\\\\")+\"+" TestStrings "${TestName}")
|
|
||||||
|
|
||||||
# Strip wrapping quotation marks
|
|
||||||
string(REGEX REPLACE "^\"(.*)\"$" "\\1" TestStrings "${TestStrings}")
|
|
||||||
string(REPLACE "\";\"" ";" TestStrings "${TestStrings}")
|
|
||||||
|
|
||||||
# Validate that a test name and tags have been provided
|
|
||||||
list(LENGTH TestStrings TestStringsLength)
|
|
||||||
if(TestStringsLength GREATER 2 OR TestStringsLength LESS 1)
|
|
||||||
message(FATAL_ERROR "You must provide a valid test name and tags for all tests in ${SourceFile}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Assign name and tags
|
|
||||||
list(GET TestStrings 0 Name)
|
|
||||||
if("${TestType}" STREQUAL "SCENARIO")
|
|
||||||
set(Name "Scenario: ${Name}")
|
|
||||||
endif()
|
|
||||||
if(PARSE_CATCH_TESTS_ADD_FIXTURE_IN_TEST_NAME AND TestFixture)
|
|
||||||
set(CTestName "${TestFixture}:${Name}")
|
|
||||||
else()
|
|
||||||
set(CTestName "${Name}")
|
|
||||||
endif()
|
|
||||||
if(PARSE_CATCH_TESTS_ADD_TARGET_IN_TEST_NAME)
|
|
||||||
set(CTestName "${TestTarget}:${CTestName}")
|
|
||||||
endif()
|
|
||||||
# add target to labels to enable running all tests added from this target
|
|
||||||
set(Labels ${TestTarget})
|
|
||||||
if(TestStringsLength EQUAL 2)
|
|
||||||
list(GET TestStrings 1 Tags)
|
|
||||||
string(TOLOWER "${Tags}" Tags)
|
|
||||||
# remove target from labels if the test is hidden
|
|
||||||
if("${Tags}" MATCHES ".*\\[!?(hide|\\.)\\].*")
|
|
||||||
list(REMOVE_ITEM Labels ${TestTarget})
|
|
||||||
endif()
|
|
||||||
string(REPLACE "]" ";" Tags "${Tags}")
|
|
||||||
string(REPLACE "[" "" Tags "${Tags}")
|
|
||||||
else()
|
|
||||||
# unset tags variable from previous loop
|
|
||||||
unset(Tags)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND Labels ${Tags})
|
|
||||||
|
|
||||||
list(FIND Labels "!hide" IndexOfHideLabel)
|
|
||||||
set(HiddenTagFound OFF)
|
|
||||||
foreach(label ${Labels})
|
|
||||||
string(REGEX MATCH "^!hide|^\\." result ${label})
|
|
||||||
if(result)
|
|
||||||
set(HiddenTagFound ON)
|
|
||||||
break()
|
|
||||||
endif(result)
|
|
||||||
endforeach(label)
|
|
||||||
if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_LESS "3.9")
|
|
||||||
PrintDebugMessage("Skipping test \"${CTestName}\" as it has [!hide], [.] or [.foo] label")
|
|
||||||
else()
|
|
||||||
PrintDebugMessage("Adding test \"${CTestName}\"")
|
|
||||||
if(Labels)
|
|
||||||
PrintDebugMessage("Setting labels to ${Labels}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Escape commas in the test spec
|
|
||||||
string(REPLACE "," "\\," Name ${Name})
|
|
||||||
|
|
||||||
# Add the test and set its properties
|
|
||||||
add_test(NAME "\"${CTestName}\"" COMMAND ${OptionalCatchTestLauncher} ${TestTarget} ${Name} ${AdditionalCatchParameters})
|
|
||||||
# Old CMake versions do not document VERSION_GREATER_EQUAL, so we use VERSION_GREATER with 3.8 instead
|
|
||||||
if(PARSE_CATCH_TESTS_NO_HIDDEN_TESTS AND ${HiddenTagFound} AND ${CMAKE_VERSION} VERSION_GREATER "3.8")
|
|
||||||
PrintDebugMessage("Setting DISABLED test property")
|
|
||||||
set_tests_properties("\"${CTestName}\"" PROPERTIES DISABLED ON)
|
|
||||||
else()
|
|
||||||
set_tests_properties("\"${CTestName}\"" PROPERTIES FAIL_REGULAR_EXPRESSION "No tests ran"
|
|
||||||
LABELS "${Labels}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# entry point
|
|
||||||
function(ParseAndAddCatchTests TestTarget)
|
|
||||||
PrintDebugMessage("Started parsing ${TestTarget}")
|
|
||||||
get_target_property(SourceFiles ${TestTarget} SOURCES)
|
|
||||||
PrintDebugMessage("Found the following sources: ${SourceFiles}")
|
|
||||||
foreach(SourceFile ${SourceFiles})
|
|
||||||
ParseFile(${SourceFile} ${TestTarget})
|
|
||||||
endforeach()
|
|
||||||
PrintDebugMessage("Finished parsing ${TestTarget}")
|
|
||||||
endfunction()
|
|
@ -1,31 +0,0 @@
|
|||||||
# This cmake code creates the configuration that is found and used by
|
|
||||||
# find_package() of another cmake project
|
|
||||||
|
|
||||||
# get lower and upper case project name for the configuration files
|
|
||||||
|
|
||||||
# configure and install the configuration files
|
|
||||||
include(CMakePackageConfigHelpers)
|
|
||||||
|
|
||||||
configure_package_config_file(
|
|
||||||
"${CMAKE_SOURCE_DIR}/cmake/project-config.cmake.in"
|
|
||||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config.cmake"
|
|
||||||
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME_LOWER}
|
|
||||||
PATH_VARS CMAKE_INSTALL_DIR)
|
|
||||||
|
|
||||||
write_basic_package_version_file(
|
|
||||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake"
|
|
||||||
VERSION ${PROJECT_VERSION}
|
|
||||||
COMPATIBILITY SameMajorVersion)
|
|
||||||
|
|
||||||
install(FILES
|
|
||||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config.cmake"
|
|
||||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake"
|
|
||||||
COMPONENT devel
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME_LOWER})
|
|
||||||
|
|
||||||
if (PROJECT_LIBRARIES OR PROJECT_STATIC_LIBRARIES)
|
|
||||||
install(
|
|
||||||
EXPORT "${TARGETS_EXPORT_NAME}"
|
|
||||||
FILE ${PROJECT_NAME_LOWER}-targets.cmake
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME_LOWER})
|
|
||||||
endif ()
|
|
@ -1,24 +0,0 @@
|
|||||||
# Config file for @PROJECT_NAME_LOWER@
|
|
||||||
#
|
|
||||||
# It defines the following variables:
|
|
||||||
#
|
|
||||||
# @PROJECT_NAME_UPPER@_INCLUDE_DIRS - include directory
|
|
||||||
# @PROJECT_NAME_UPPER@_LIBRARIES - all dynamic libraries
|
|
||||||
# @PROJECT_NAME_UPPER@_STATIC_LIBRARIES - all static libraries
|
|
||||||
|
|
||||||
@PACKAGE_INIT@
|
|
||||||
|
|
||||||
include(CMakeFindDependencyMacro)
|
|
||||||
|
|
||||||
set(SLS_USE_HDF5 "@SLS_USE_HDF5@")
|
|
||||||
|
|
||||||
# Add optional dependencies here
|
|
||||||
find_dependency(Threads)
|
|
||||||
if (SLS_USE_HDF5)
|
|
||||||
find_dependency(HDF5)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set_and_check(@PROJECT_NAME_UPPER@_CMAKE_INCLUDE_DIRS "@PACKAGE_CMAKE_INSTALL_DIR@")
|
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake")
|
|
||||||
check_required_components("@PROJECT_NAME@")
|
|
@ -1,14 +0,0 @@
|
|||||||
#include "project_version.h"
|
|
||||||
/// project version as major.minor.patch string
|
|
||||||
const char* @PROJECT_NAME@_runtime_project_version(){ return "@PROJECT_VERSION@"; }
|
|
||||||
/// package version as string, possibly with git commit: v1.2.3+4+g56789abc
|
|
||||||
const char* @PROJECT_NAME@_runtime_package_version(){ return "@PACKAGE_VERSION@"; }
|
|
||||||
/// project version as integer: major * 10000 + minor * 100 + patch
|
|
||||||
int @PROJECT_NAME@_runtime_version_int() { return @PROJECT_VERSION_INT@; }
|
|
||||||
/// project version as integer: major
|
|
||||||
int @PROJECT_NAME@_runtime_version_major(){ return @PACKAGE_VERSION_MAJOR@; }
|
|
||||||
/// project version as integer: minor
|
|
||||||
int @PROJECT_NAME@_runtime_version_minor(){ return @PACKAGE_VERSION_MINOR@; }
|
|
||||||
/// project version as integer: patch
|
|
||||||
int @PROJECT_NAME@_runtime_version_patch(){ return @PACKAGE_VERSION_PATCH@; }
|
|
||||||
|
|
@ -1,154 +0,0 @@
|
|||||||
#
|
|
||||||
# Sets PROJECT_VERSION and PACKAGE_VERSION
|
|
||||||
#
|
|
||||||
|
|
||||||
# Don't set PROJECT_VERSION to empty string when no VERSION is given to project() command.
|
|
||||||
#if(POLICY CMP0048)
|
|
||||||
# cmake_policy(SET CMP0048 OLD)
|
|
||||||
#endif()
|
|
||||||
|
|
||||||
# Split a version number into separate components
|
|
||||||
# version the version number to split
|
|
||||||
# major variable name to store the major version in
|
|
||||||
# minor variable name to store the minor version in
|
|
||||||
# patch variable name to store the patch version in
|
|
||||||
# extra variable name to store a version suffix in
|
|
||||||
function(version_split version major minor patch extra)
|
|
||||||
string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)?" version_valid ${version})
|
|
||||||
if(version_valid)
|
|
||||||
string(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)(.*)?" "\\1;\\2;\\3;\\4" VERSION_MATCHES ${version})
|
|
||||||
list(GET VERSION_MATCHES 0 version_major)
|
|
||||||
set(${major} ${version_major} PARENT_SCOPE)
|
|
||||||
list(GET VERSION_MATCHES 1 version_minor)
|
|
||||||
set(${minor} ${version_minor} PARENT_SCOPE)
|
|
||||||
list(GET VERSION_MATCHES 2 version_patch)
|
|
||||||
set(${patch} ${version_patch} PARENT_SCOPE)
|
|
||||||
list(GET VERSION_MATCHES 3 version_extra)
|
|
||||||
set(${extra} ${version_extra} PARENT_SCOPE)
|
|
||||||
else(version_valid)
|
|
||||||
message(AUTHOR_WARNING "Bad version ${version}; falling back to 0 (have you made an initial release?)")
|
|
||||||
set(${major} "0" PARENT_SCOPE)
|
|
||||||
set(${minor} "0" PARENT_SCOPE)
|
|
||||||
set(${patch} "0" PARENT_SCOPE)
|
|
||||||
set(${extra} "" PARENT_SCOPE)
|
|
||||||
endif(version_valid)
|
|
||||||
endfunction(version_split)
|
|
||||||
|
|
||||||
##############################
|
|
||||||
# get PROJECT_VERSION from git
|
|
||||||
##############################
|
|
||||||
find_program(GIT_CMD git)
|
|
||||||
mark_as_advanced(GIT_CMD)
|
|
||||||
if (GIT_CMD)
|
|
||||||
execute_process(COMMAND ${GIT_CMD} rev-parse --show-toplevel
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE GIT_TOPLEVEL
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
endif()
|
|
||||||
if (GIT_CMD AND NOT "${GIT_TOPLEVEL}" STREQUAL "")
|
|
||||||
execute_process(COMMAND ${GIT_CMD} rev-parse --short HEAD
|
|
||||||
WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
||||||
OUTPUT_VARIABLE GIT_SHA1
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
#message(STATUS "GIT_SHA1: " ${GIT_SHA1})
|
|
||||||
execute_process(COMMAND ${GIT_CMD} describe --match "*[0-9].[0-9]*" HEAD
|
|
||||||
WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
||||||
OUTPUT_VARIABLE GIT_DESCRIBE
|
|
||||||
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
#message(STATUS "GIT_DESCRIBE: " ${GIT_DESCRIBE})
|
|
||||||
|
|
||||||
# if (GIT_DESCRIBE)
|
|
||||||
# string(REGEX REPLACE "v?([0-9.]+).*" "\\1" GIT_VERSION ${GIT_DESCRIBE})
|
|
||||||
# message(STATUS "GIT_VERSION: " ${GIT_VERSION})
|
|
||||||
|
|
||||||
# # as package version we use the full version from git describe: 1.7.1+7+ge324c81
|
|
||||||
# if (GIT_DESCRIBE MATCHES ".*-g.*")
|
|
||||||
# # convert a git describe string to usable debian version, e.g. v1.7.1-7-ge324c81 to 1.7.1+7+ge324c81
|
|
||||||
# string(REGEX REPLACE "v?([0-9]*.[0-9.]*).*-([0-9]*)-([a-g0-9]*)" "\\1+\\2+\\3" GIT_FULL_VERSION ${GIT_DESCRIBE})
|
|
||||||
# else()
|
|
||||||
# # current HEAD is git tag (i.e. releaase), directly use the version
|
|
||||||
# set(GIT_FULL_VERSION ${GIT_VERSION})
|
|
||||||
# endif()
|
|
||||||
# else ()
|
|
||||||
# # no (suitable) tag found
|
|
||||||
# set(GIT_VERSION "0.0.0")
|
|
||||||
# # get number of commits in repo
|
|
||||||
# execute_process(COMMAND ${GIT_CMD} rev-list --count HEAD
|
|
||||||
# WORKING_DIRECTORY ${GIT_TOPLEVEL}
|
|
||||||
# OUTPUT_VARIABLE GIT_COMMIT_COUNT
|
|
||||||
# OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
# set(GIT_FULL_VERSION 0.0.0+${GIT_COMMIT_COUNT}+g${GIT_SHA1})
|
|
||||||
# endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# get version from package.xml if it exists
|
|
||||||
if (EXISTS "${PROJECT_SOURCE_DIR}/package.xml")
|
|
||||||
file(STRINGS "${PROJECT_SOURCE_DIR}/package.xml" PACKAGE_XML_VERSION_LINE REGEX <version>[0-9.]*</version>)
|
|
||||||
string(REGEX REPLACE .*<version>\([0-9.]*\)</version>.* \\1 PACKAGE_XML_VERSION "${PACKAGE_XML_VERSION_LINE}")
|
|
||||||
MESSAGE(STATUS "PACKAGE_XML_VERSION: " ${PACKAGE_XML_VERSION})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# set version (if not already manually specified)
|
|
||||||
# check versions from different sources and set actually used version
|
|
||||||
if (NOT PROJECT_VERSION)
|
|
||||||
# set PROJECT_VERSION to MAJOR.MINOR.PATCH
|
|
||||||
# PACKAGE_VERSION can have extra info
|
|
||||||
if (GIT_VERSION)
|
|
||||||
set(PROJECT_VERSION ${GIT_VERSION})
|
|
||||||
set(PACKAGE_VERSION ${GIT_FULL_VERSION})
|
|
||||||
elseif (PACKAGE_XML_VERSION)
|
|
||||||
set(PROJECT_VERSION ${PACKAGE_XML_VERSION})
|
|
||||||
set(PACKAGE_VERSION ${PROJECT_VERSION})
|
|
||||||
else ()
|
|
||||||
message(WARNING "PROJECT_VERSION not set. Defaulting to 0.0.0")
|
|
||||||
set(PROJECT_VERSION "0.0.0")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
# if (NOT PACKAGE_VERSION)
|
|
||||||
# message(WARNING "PACKAGE_VERSION not set! Falling back to (${PROJECT_VERSION})")
|
|
||||||
set(PACKAGE_VERSION ${PROJECT_VERSION})
|
|
||||||
# endif ()
|
|
||||||
|
|
||||||
# warn if versions don't match
|
|
||||||
if (GIT_VERSION AND NOT GIT_VERSION MATCHES ${PROJECT_VERSION})
|
|
||||||
message(WARNING "Version from git (${GIT_VERSION}) doesn't match PROJECT_VERSION (${PROJECT_VERSION})")
|
|
||||||
endif()
|
|
||||||
if (PACKAGE_XML_VERSION AND NOT PACKAGE_XML_VERSION MATCHES ${PROJECT_VERSION})
|
|
||||||
message(WARNING "Version from package.xml (${PACKAGE_XML_VERSION}) doesn't match PROJECT_VERSION (${PROJECT_VERSION})")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "PROJECT_VERSION: " ${PROJECT_VERSION})
|
|
||||||
message(STATUS "PACKAGE_VERSION: " ${PACKAGE_VERSION})
|
|
||||||
|
|
||||||
|
|
||||||
version_split(${PROJECT_VERSION} PACKAGE_VERSION_MAJOR PACKAGE_VERSION_MINOR PACKAGE_VERSION_PATCH extra)
|
|
||||||
#message(STATUS "PACKAGE_VERSION_MAJOR: " ${PACKAGE_VERSION_MAJOR})
|
|
||||||
#message(STATUS "PACKAGE_VERSION_MINOR: " ${PACKAGE_VERSION_MINOR})
|
|
||||||
#message(STATUS "PACKAGE_VERSION_PATCH: " ${PACKAGE_VERSION_PATCH})
|
|
||||||
|
|
||||||
# generate an integer version number: major * 10000 + minor * 100 + patch
|
|
||||||
math(EXPR PROJECT_VERSION_INT "${PACKAGE_VERSION_MAJOR} * 10000 + ${PACKAGE_VERSION_MINOR} * 100 + ${PACKAGE_VERSION_PATCH}")
|
|
||||||
|
|
||||||
# make PROJECT_VERSION available as define in the project source
|
|
||||||
#add_definitions(-DPROJECT_VERSION="${PROJECT_VERSION}")
|
|
||||||
#add_definitions(-DPROJECT_VERSION_INT=${PROJECT_VERSION_INT})
|
|
||||||
#add_definitions(-DPACKAGE_VERSION="${PACKAGE_VERSION}")
|
|
||||||
#add_definitions(-DPACKAGE_VERSION_MAJOR=${PACKAGE_VERSION_MAJOR})
|
|
||||||
#add_definitions(-DPACKAGE_VERSION_MINOR=${PACKAGE_VERSION_MINOR})
|
|
||||||
#add_definitions(-DPACKAGE_VERSION_PATCH=${PACKAGE_VERSION_PATCH})
|
|
||||||
|
|
||||||
# set ABI version to major.minor, which will be used for the SOVERSION
|
|
||||||
set(abiversion "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}")
|
|
||||||
|
|
||||||
# generate a version.h file in the binary output dir, don't forget to install it...
|
|
||||||
string(TOUPPER "${PROJECT_NAME}" PROJECT_NAME_UPPER)
|
|
||||||
|
|
||||||
# These files provide compile-time and runtime version information about your project.
|
|
||||||
# To offer the version info to the users of your library, you need to
|
|
||||||
# adapt the following lines in your respective CMakeLists.txt:
|
|
||||||
# add_library(<yourlibraryname> SHARED <your code files> ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/project_version.cc)
|
|
||||||
# install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/project_version.h COMPONENT dev DESTINATION include/<your-include-dir>)
|
|
||||||
# To use it within your library or tests you need to add the include directory:
|
|
||||||
# > target_include_directories(yourtarget PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME})
|
|
||||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/project_version.h.in ${PROJECT_NAME}/project_version.h @ONLY)
|
|
||||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/project_version.cc.in ${PROJECT_NAME}/project_version.cc @ONLY)
|
|
@ -1,34 +0,0 @@
|
|||||||
#ifndef @PROJECT_NAME_UPPER@_VERSION_H_
|
|
||||||
#define @PROJECT_NAME_UPPER@_VERSION_H_
|
|
||||||
|
|
||||||
/// project version as major.minor.patch string
|
|
||||||
#define @PROJECT_NAME_UPPER@_VERSION "@PROJECT_VERSION@"
|
|
||||||
/// project version as integer: major * 10000 + minor * 100 + patch
|
|
||||||
#define @PROJECT_NAME_UPPER@_VERSION_INT @PROJECT_VERSION_INT@
|
|
||||||
#define @PROJECT_NAME_UPPER@_VERSION_MAJOR @PACKAGE_VERSION_MAJOR@
|
|
||||||
#define @PROJECT_NAME_UPPER@_VERSION_MINOR @PACKAGE_VERSION_MINOR@
|
|
||||||
#define @PROJECT_NAME_UPPER@_VERSION_PATCH @PACKAGE_VERSION_PATCH@
|
|
||||||
/// package version as string, possibly with git commit: v1.2.3+4+g56789abc
|
|
||||||
#define @PROJECT_NAME_UPPER@_PACKAGE_VERSION "@PACKAGE_VERSION@"
|
|
||||||
|
|
||||||
///runtime versions, where the above values are linked into a lib and therefore reflect the version
|
|
||||||
///of the library itself (not the version of the header at compile time of the user code)
|
|
||||||
const char* @PROJECT_NAME@_runtime_project_version();
|
|
||||||
const char* @PROJECT_NAME@_runtime_package_version();
|
|
||||||
int @PROJECT_NAME@_runtime_version_int();
|
|
||||||
int @PROJECT_NAME@_runtime_version_major();
|
|
||||||
int @PROJECT_NAME@_runtime_version_minor();
|
|
||||||
int @PROJECT_NAME@_runtime_version_patch();
|
|
||||||
|
|
||||||
///Check consistency of runtime vs compile-time version number. I.e. the header used
|
|
||||||
///for compilation was from the same version as the linked library.
|
|
||||||
inline bool @PROJECT_NAME@_check_version_consistency(bool major_minor_only)
|
|
||||||
{
|
|
||||||
return @PROJECT_NAME@_runtime_version_major() == @PROJECT_NAME_UPPER@_VERSION_MAJOR &&
|
|
||||||
@PROJECT_NAME@_runtime_version_minor() == @PROJECT_NAME_UPPER@_VERSION_MINOR &&
|
|
||||||
(major_minor_only ||
|
|
||||||
@PROJECT_NAME@_runtime_version_patch() == @PROJECT_NAME_UPPER@_VERSION_PATCH);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
53
cmk.sh
@ -7,7 +7,6 @@ TEXTCLIENT=0
|
|||||||
RECEIVER=0
|
RECEIVER=0
|
||||||
GUI=0
|
GUI=0
|
||||||
DEBUG=0
|
DEBUG=0
|
||||||
PYTHON=0
|
|
||||||
|
|
||||||
|
|
||||||
CLEAN=0
|
CLEAN=0
|
||||||
@ -16,11 +15,10 @@ CMAKE_PRE=""
|
|||||||
CMAKE_POST=""
|
CMAKE_POST=""
|
||||||
|
|
||||||
usage() { echo -e "
|
usage() { echo -e "
|
||||||
Usage: $0 [-c] [-b] [-p] [e] [t] [r] [g] [-h] [-d <HDF5 directory>] [-j] <Number of threads>
|
Usage: $0 [-c] [-b] [-h] [-d <HDF5 directory>] [-j]
|
||||||
-[no option]: only make
|
-[no option]: only make
|
||||||
-c: Clean
|
-c: Clean
|
||||||
-b: Builds/Rebuilds CMake files normal mode
|
-b: Builds/Rebuilds CMake files normal mode
|
||||||
-p: Builds/Rebuilds Python API
|
|
||||||
-h: Builds/Rebuilds Cmake files with HDF5 package
|
-h: Builds/Rebuilds Cmake files with HDF5 package
|
||||||
-d: HDF5 Custom Directory
|
-d: HDF5 Custom Directory
|
||||||
-t: Build/Rebuilds only text client
|
-t: Build/Rebuilds only text client
|
||||||
@ -29,12 +27,6 @@ Usage: $0 [-c] [-b] [-p] [e] [t] [r] [g] [-h] [-d <HDF5 directory>] [-j] <Number
|
|||||||
-j: Number of threads to compile through
|
-j: Number of threads to compile through
|
||||||
-e: Debug mode
|
-e: Debug mode
|
||||||
|
|
||||||
Rebuild when you switch to a new build and compile in parallel:
|
|
||||||
./cmk.sh -bj5
|
|
||||||
|
|
||||||
Rebuild python
|
|
||||||
./cmk.sh -p
|
|
||||||
|
|
||||||
For only make:
|
For only make:
|
||||||
./cmk.sh
|
./cmk.sh
|
||||||
|
|
||||||
@ -63,17 +55,12 @@ For rebuilding only certain sections
|
|||||||
|
|
||||||
" ; exit 1; }
|
" ; exit 1; }
|
||||||
|
|
||||||
while getopts ":bpchd:j:trges:" opt ; do
|
while getopts ":bchd:j:trge" opt ; do
|
||||||
case $opt in
|
case $opt in
|
||||||
b)
|
b)
|
||||||
echo "Building of CMake files Required"
|
echo "Building of CMake files Required"
|
||||||
REBUILD=1
|
REBUILD=1
|
||||||
;;
|
;;
|
||||||
p)
|
|
||||||
echo "Compiling Options: Python"
|
|
||||||
PYTHON=1
|
|
||||||
REBUILD=1
|
|
||||||
;;
|
|
||||||
c)
|
c)
|
||||||
echo "Clean Required"
|
echo "Clean Required"
|
||||||
CLEAN=1
|
CLEAN=1
|
||||||
@ -124,29 +111,26 @@ while getopts ":bpchd:j:trges:" opt ; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
#python
|
|
||||||
if [ $PYTHON -eq 1 ]; then
|
|
||||||
CMAKE_POST+=" -DSLS_USE_PYTHON=ON "
|
|
||||||
echo "Enabling Compile Option: Python"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [ $TEXTCLIENT -eq 0 ] && [ $RECEIVER -eq 0 ] && [ $GUI -eq 0 ]; then
|
if [ $TEXTCLIENT -eq 0 ] && [ $RECEIVER -eq 0 ] && [ $GUI -eq 0 ]; then
|
||||||
#CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON -DSLS_USE_RECEIVER=ON -DSLS_USE_GUI=ON "
|
CMAKE_POST+=" -DUSE_TEXTCLIENT=ON -DUSE_RECEIVER=ON -DUSE_GUI=ON "
|
||||||
CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON -DSLS_USE_RECEIVER=ON -DSLS_USE_GUI=OFF "
|
echo "Compile Option: TextClient, Receiver and GUI"
|
||||||
echo "Enabling Compile Option: TextClient, Receiver and GUI"
|
|
||||||
else
|
else
|
||||||
if [ $TEXTCLIENT -eq 1 ]; then
|
if [ $TEXTCLIENT -eq 1 ]; then
|
||||||
CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON "
|
CMAKE_POST+=" -DUSE_TEXTCLIENT=ON "
|
||||||
echo "Enabling Compile Option: TextClient"
|
echo "Compile Option: TextClient"
|
||||||
fi
|
fi
|
||||||
if [ $RECEIVER -eq 1 ]; then
|
if [ $RECEIVER -eq 1 ]; then
|
||||||
CMAKE_POST+=" -DSLS_USE_RECEIVER=ON "
|
CMAKE_POST+=" -DUSE_RECEIVER=ON "
|
||||||
echo "Enabling Compile Option: Receiver"
|
echo "Compile Option: Receiver"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ $GUI -eq 1 ]; then
|
if [ $GUI -eq 1 ]; then
|
||||||
CMAKE_POST+=" -DSLS_USE_GUI=ON "
|
CMAKE_POST+=" -DUSE_GUI=ON "
|
||||||
echo "Enabling Compile Option: GUI"
|
echo "Compile Option: GUI"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -169,19 +153,18 @@ fi
|
|||||||
|
|
||||||
#Debug
|
#Debug
|
||||||
if [ $DEBUG -eq 1 ]; then
|
if [ $DEBUG -eq 1 ]; then
|
||||||
CMAKE_POST+=" -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_SANITIZER=ON "
|
CMAKE_POST+=" -DCMAKE_BUILD_TYPE=Debug "
|
||||||
echo "Debug Option enabled"
|
echo "Debug Option enabled"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
#hdf5 rebuild
|
#hdf5 rebuild
|
||||||
if [ $HDF5 -eq 1 ]; then
|
if [ $HDF5 -eq 1 ]; then
|
||||||
# CMAKE_PRE+="HDF5_ROOT="$HDF5DIR
|
CMAKE_PRE+="HDF5_ROOT="$HDF5DIR
|
||||||
CMAKE_POST+=" -DCMAKE_INSTALL_PREFIX="$HDF5DIR
|
CMAKE_POST+=" -DUSE_HDF5=ON "
|
||||||
CMAKE_POST+=" -DSLS_USE_HDF5=ON "
|
|
||||||
#normal mode rebuild
|
#normal mode rebuild
|
||||||
else
|
else
|
||||||
CMAKE_POST+=" -DSLS_USE_HDF5=OFF "
|
CMAKE_POST+=" -DUSE_HDF5=OFF "
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@ -194,7 +177,7 @@ echo "in "$PWD
|
|||||||
#cmake
|
#cmake
|
||||||
if [ $REBUILD -eq 1 ]; then
|
if [ $REBUILD -eq 1 ]; then
|
||||||
rm -f CMakeCache.txt
|
rm -f CMakeCache.txt
|
||||||
BUILDCOMMAND="$CMAKE_PRE cmake3 $CMAKE_POST .."
|
BUILDCOMMAND="$CMAKE_PRE cmake $CMAKE_POST .."
|
||||||
echo $BUILDCOMMAND
|
echo $BUILDCOMMAND
|
||||||
eval $BUILDCOMMAND
|
eval $BUILDCOMMAND
|
||||||
fi
|
fi
|
||||||
|
15
commitVersions.sh
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
sh updateSvnVersion.sh
|
||||||
|
|
||||||
|
cd slsDetectorGui
|
||||||
|
git commit -a -m "updating versions"
|
||||||
|
git push origin developer:developer
|
||||||
|
|
||||||
|
cd ../slsDetectorSoftware
|
||||||
|
git commit -a -m "updating versions"
|
||||||
|
git push origin developer:developer
|
||||||
|
|
||||||
|
cd ../slsReceiverSoftware
|
||||||
|
git commit -a -m "updating versions"
|
||||||
|
git push origin developer:developer
|
||||||
|
|
||||||
|
cd ..
|
@ -1,19 +0,0 @@
|
|||||||
mkdir build
|
|
||||||
mkdir install
|
|
||||||
cd build
|
|
||||||
cmake .. \
|
|
||||||
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=install \
|
|
||||||
-DSLS_USE_TEXTCLIENT=ON \
|
|
||||||
-DSLS_USE_RECEIVER=ON \
|
|
||||||
-DSLS_USE_GUI=OFF \
|
|
||||||
-DSLS_USE_TESTS=ON \
|
|
||||||
-DSLS_USE_PYTHON=OFF \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DSLS_USE_HDF5=OFF\
|
|
||||||
|
|
||||||
|
|
||||||
cmake --build . -- -j10
|
|
||||||
cmake --build . --target install
|
|
||||||
|
|
||||||
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
|
|
@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
# mkdir $PREFIX/lib
|
|
||||||
# mkdir $PREFIX/include
|
|
||||||
|
|
||||||
|
|
||||||
# #Shared and static libraries
|
|
||||||
# cp build/bin/_sls_detector* $PREFIX/lib/.
|
|
||||||
|
|
||||||
|
|
||||||
# #Binaries
|
|
||||||
# cp -r build/bin/sls_detector $PREFIX/lib/.
|
|
||||||
|
|
||||||
cd python
|
|
||||||
${PYTHON} setup.py install
|
|
@ -1,120 +0,0 @@
|
|||||||
|
|
||||||
package:
|
|
||||||
name: sls_detector_software
|
|
||||||
version: "developer"
|
|
||||||
|
|
||||||
source:
|
|
||||||
- path: ..
|
|
||||||
|
|
||||||
build:
|
|
||||||
number: 1
|
|
||||||
rpaths:
|
|
||||||
- lib/
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- cmake
|
|
||||||
# - qwt 6.* #require qt5 investigate befor activating gui
|
|
||||||
# - qt=4.8.7=7
|
|
||||||
- zeromq=4.2.5=hfc679d8_5
|
|
||||||
- pyzmq
|
|
||||||
- xorg-libx11
|
|
||||||
- xorg-libice
|
|
||||||
- xorg-libxext
|
|
||||||
- xorg-libsm
|
|
||||||
- xorg-libxau
|
|
||||||
- xorg-libxrender
|
|
||||||
- xorg-libxfixes
|
|
||||||
- {{ cdt('mesa-libgl-devel') }} # [linux]
|
|
||||||
- {{ cdt('mesa-libegl-devel') }} # [linux]
|
|
||||||
- {{ cdt('mesa-dri-drivers') }} # [linux]
|
|
||||||
- {{ cdt('libselinux') }} # [linux]
|
|
||||||
- {{ cdt('libxdamage') }} # [linux]
|
|
||||||
- {{ cdt('libxxf86vm') }} # [linux]
|
|
||||||
|
|
||||||
host:
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
- xorg-libx11
|
|
||||||
- xorg-libice
|
|
||||||
- xorg-libxext
|
|
||||||
- xorg-libsm
|
|
||||||
- xorg-libxau
|
|
||||||
- xorg-libxrender
|
|
||||||
- xorg-libxfixes
|
|
||||||
|
|
||||||
run:
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
- name: sls_detector_lib
|
|
||||||
script: copy_lib.sh
|
|
||||||
|
|
||||||
- name: sls_detector
|
|
||||||
script: build_pylib.sh
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- python {{ python }}
|
|
||||||
- setuptools
|
|
||||||
- sls_detector_lib
|
|
||||||
- pyzmq
|
|
||||||
- pybind11 2.2
|
|
||||||
host:
|
|
||||||
- python
|
|
||||||
- pybind11 2.2
|
|
||||||
- pyzmq
|
|
||||||
- sls_detector_lib
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
run:
|
|
||||||
- python
|
|
||||||
- numpy
|
|
||||||
- sls_detector_lib=developer
|
|
||||||
- pyzmq
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
test:
|
|
||||||
imports:
|
|
||||||
- sls_detector
|
|
||||||
|
|
||||||
# requirements:
|
|
||||||
# build:
|
|
||||||
# - {{ compiler('c') }}
|
|
||||||
# - {{compiler('cxx')}}
|
|
||||||
|
|
||||||
# - name: sls_detector_gui
|
|
||||||
# version: "refactor"
|
|
||||||
# script: copy_gui.sh
|
|
||||||
# requirements:
|
|
||||||
# build:
|
|
||||||
# - {{ compiler('c') }}
|
|
||||||
# - {{compiler('cxx')}}
|
|
||||||
# - cmake
|
|
||||||
# - qwt 6.*
|
|
||||||
# - qt=4.8.7=7
|
|
||||||
# - zeromq=4.2.5=hfc679d8_5
|
|
||||||
# - pyzmq
|
|
||||||
# - xorg-libx11
|
|
||||||
# - xorg-libice
|
|
||||||
# - xorg-libxext
|
|
||||||
# - xorg-libsm
|
|
||||||
# - xorg-libxau
|
|
||||||
# - xorg-libxrender
|
|
||||||
# - xorg-libxfixes
|
|
||||||
# - {{ cdt('mesa-libgl-devel') }} # [linux]
|
|
||||||
# - {{ cdt('mesa-libegl-devel') }} # [linux]
|
|
||||||
# - {{ cdt('mesa-dri-drivers') }} # [linux]
|
|
||||||
# - {{ cdt('libselinux') }} # [linux]
|
|
||||||
# - {{ cdt('libxdamage') }} # [linux]
|
|
||||||
# - {{ cdt('libxxf86vm') }} # [linux]
|
|
||||||
# run:
|
|
||||||
# - sls_detector_lib=refactor
|
|
||||||
# - qwt 6.*
|
|
||||||
# - qt=4.8.7=7
|
|
@ -1 +0,0 @@
|
|||||||
ctest -j2
|
|
58
configure
vendored
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
##!/bin/bash
|
||||||
|
|
||||||
|
: ${INSTALLROOT=$PWD}
|
||||||
|
read -p "Installation directory [default:\"$INSTALLROOT\"]:" -e t3
|
||||||
|
if [ -z "$t3" ]
|
||||||
|
then
|
||||||
|
echo
|
||||||
|
else
|
||||||
|
INSTALLROOT=$t3
|
||||||
|
fi
|
||||||
|
echo "INSTALLROOT will be \"$INSTALLROOT\""
|
||||||
|
export INSTALLROOT
|
||||||
|
|
||||||
|
: ${BINDIR="bin"}
|
||||||
|
read -p "Binaries directory [default:\"$BINDIR\"]:" -e t4
|
||||||
|
if [ -z "$t4" ]
|
||||||
|
then
|
||||||
|
BINDIR=$INSTALLROOT/$BINDIR
|
||||||
|
else
|
||||||
|
BINDIR=$INSTALLROOT/$t4
|
||||||
|
fi
|
||||||
|
echo "BINDIR will be \"$BINDIR\""
|
||||||
|
export BINDIR
|
||||||
|
|
||||||
|
: ${LIBDIR="bin"}
|
||||||
|
read -p "Libraries directory [default:\"$LIBDIR\"]:" -e t5
|
||||||
|
if [ -z "$t5" ]
|
||||||
|
then
|
||||||
|
LIBDIR=$INSTALLROOT/$LIBDIR
|
||||||
|
else
|
||||||
|
LIBDIR=$INSTALLROOT/$t5
|
||||||
|
fi
|
||||||
|
echo "LIBDIR will be \"$LIBDIR\""
|
||||||
|
export LIBDIR
|
||||||
|
|
||||||
|
: ${INCDIR="include"}
|
||||||
|
read -p "Includes directory [default:\"$INCDIR\"]:" -e t6
|
||||||
|
if [ -z "$t6" ]
|
||||||
|
then
|
||||||
|
INCDIR=$INSTALLROOT/$INCDIR
|
||||||
|
else
|
||||||
|
INCDIR=$INSTALLROOT/$t6
|
||||||
|
fi
|
||||||
|
echo "INCDIR will be \"$INCDIR\""
|
||||||
|
export INCDIR
|
||||||
|
|
||||||
|
: ${DOCDIR="doc"}
|
||||||
|
read -p "Documentation directory [default:\"$DOCDIR\"]:" -e t7
|
||||||
|
if [ -z "$t7" ]
|
||||||
|
then
|
||||||
|
DOCDIR=$INSTALLROOT/$DOCDIR
|
||||||
|
else
|
||||||
|
DOCDIR=$INSTALLROOT/$t7
|
||||||
|
fi
|
||||||
|
echo "DOCDIR will be \"$DOCDIR\""
|
||||||
|
export DOCDIR
|
||||||
|
|
||||||
|
|
2482
doxygen/Doxyfile.in
0
evalVersionVariables.sh
Executable file → Normal file
24
examples/ang.off
Executable file
@ -0,0 +1,24 @@
|
|||||||
|
module 0 center 6.395E+02 +- 0.00E+00 conversion 6.5660E-05 +- 7.10E-09 offset 0.00000 +- 0.00015
|
||||||
|
module 1 center 6.395E+02 +- 0.00E+00 conversion 6.5650E-05 +- 7.09E-09 offset 5.00211 +- 0.00015
|
||||||
|
module 2 center 6.395E+02 +- 0.00E+00 conversion 6.5625E-05 +- 7.09E-09 offset 10.00733 +- 0.00015
|
||||||
|
module 3 center 6.395E+02 +- 0.00E+00 conversion 6.5618E-05 +- 7.09E-09 offset 15.00742 +- 0.00015
|
||||||
|
module 4 center 6.395E+02 +- 0.00E+00 conversion 6.5642E-05 +- 7.15E-09 offset 20.00620 +- 0.00015
|
||||||
|
module 5 center 6.395E+02 +- 0.00E+00 conversion 6.5612E-05 +- 7.09E-09 offset 25.00281 +- 0.00015
|
||||||
|
module 6 center 6.395E+02 +- 0.00E+00 conversion 6.5623E-05 +- 6.93E-09 offset 30.00704 +- 0.00015
|
||||||
|
module 7 center 6.395E+02 +- 0.00E+00 conversion 6.5605E-05 +- 7.10E-09 offset 34.99715 +- 0.00015
|
||||||
|
module 8 center 6.395E+02 +- 0.00E+00 conversion 6.5643E-05 +- 7.21E-09 offset 39.99533 +- 0.00015
|
||||||
|
module 9 center 6.395E+02 +- 0.00E+00 conversion 6.5638E-05 +- 7.09E-09 offset 44.99969 +- 0.00015
|
||||||
|
module 10 center 6.395E+02 +- 0.00E+00 conversion 6.5638E-05 +- 6.94E-09 offset 49.99859 +- 0.00015
|
||||||
|
module 11 center 6.395E+02 +- 0.00E+00 conversion 6.5644E-05 +- 7.10E-09 offset 54.99499 +- 0.00015
|
||||||
|
module 12 center 6.395E+02 +- 0.00E+00 conversion 6.5618E-05 +- 7.09E-09 offset 59.99120 +- 0.00015
|
||||||
|
module 13 center 6.395E+02 +- 0.00E+00 conversion 6.5607E-05 +- 7.11E-09 offset 64.98880 +- 0.00015
|
||||||
|
module 14 center 6.395E+02 +- 0.00E+00 conversion 6.5609E-05 +- 7.09E-09 offset 69.98205 +- 0.00015
|
||||||
|
module 15 center 6.395E+02 +- 0.00E+00 conversion 6.5611E-05 +- 7.09E-09 offset 74.98379 +- 0.00015
|
||||||
|
module 16 center 6.395E+02 +- 0.00E+00 conversion 6.5619E-05 +- 4.72E-09 offset 79.98559 +- 0.00015
|
||||||
|
module 17 center 6.395E+02 +- 0.00E+00 conversion 6.5604E-05 +- 7.09E-09 offset 84.98376 +- 0.00015
|
||||||
|
module 18 center 6.395E+02 +- 0.00E+00 conversion 6.5605E-05 +- 7.09E-09 offset 89.98307 +- 0.00015
|
||||||
|
module 19 center 6.395E+02 +- 0.00E+00 conversion 6.5616E-05 +- 7.09E-09 offset 94.98907 +- 0.00015
|
||||||
|
module 20 center 6.395E+02 +- 0.00E+00 conversion 6.5634E-05 +- 7.08E-09 offset 99.97965 +- 0.00015
|
||||||
|
module 21 center 6.395E+02 +- 0.00E+00 conversion 6.5608E-05 +- 4.16E-09 offset 104.99732 +- 0.00016
|
||||||
|
module 22 center 6.395E+02 +- 0.00E+00 conversion 6.5608E-05 +- 7.09E-09 offset 109.98646 +- 0.00015
|
||||||
|
module 23 center 6.395E+02 +- 0.00E+00 conversion 6.5649E-05 +- 7.09E-09 offset 114.98765 +- 0.00015
|
5
examples/bad.chans
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
15
|
||||||
|
1528
|
||||||
|
5000
|
||||||
|
6513
|
||||||
|
|
8
examples/gotthard_two.config → examples/bchip2modules.config
Executable file → Normal file
@ -2,6 +2,9 @@ detsizechan 2560 1
|
|||||||
|
|
||||||
hostname bchip074+bchip075+
|
hostname bchip074+bchip075+
|
||||||
|
|
||||||
|
#replace my_installation_path
|
||||||
|
settingsdir /my_installation_path/slsDetectorPackage/settingsdir/gotthard
|
||||||
|
caldir /my_installation_path/slsDetectorPackage/settingsdir/gotthard
|
||||||
|
|
||||||
0:extsig:0 trigger_in_rising_edge
|
0:extsig:0 trigger_in_rising_edge
|
||||||
0:rx_tcpport 1954
|
0:rx_tcpport 1954
|
||||||
@ -11,6 +14,7 @@ hostname bchip074+bchip075+
|
|||||||
1:extsig:0 trigger_in_rising_edge
|
1:extsig:0 trigger_in_rising_edge
|
||||||
1:rx_tcpport 1955
|
1:rx_tcpport 1955
|
||||||
1:rx_udpport 50002
|
1:rx_udpport 50002
|
||||||
|
#1:detectorip 10.1.1.52
|
||||||
1:vhighvoltage 0
|
1:vhighvoltage 0
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
@ -47,11 +51,11 @@ rx_datastream 1
|
|||||||
rx_hostname my_receiver_hostname
|
rx_hostname my_receiver_hostname
|
||||||
rx_datastream 1
|
rx_datastream 1
|
||||||
outdir /tmp/
|
outdir /tmp/
|
||||||
|
angconv none
|
||||||
|
threaded 1
|
||||||
|
|
||||||
settings veryhighgain
|
settings veryhighgain
|
||||||
exptime 0.000005
|
exptime 0.000005
|
||||||
period 0.0001
|
period 0.0001
|
||||||
|
|
||||||
vhighvoltage 90
|
vhighvoltage 90
|
||||||
|
|
61
examples/bchip2modules_pc8829.config
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
detsizechan 2560 1
|
||||||
|
|
||||||
|
hostname bchip074+bchip075+
|
||||||
|
|
||||||
|
#replace my_installation_path
|
||||||
|
settingsdir /my_installation_path/slsDetectorPackage/settingsdir/gotthard
|
||||||
|
caldir /my_installation_path/slsDetectorPackage/settingsdir/gotthard
|
||||||
|
|
||||||
|
0:extsig:0 trigger_in_rising_edge
|
||||||
|
0:rx_tcpport 1954
|
||||||
|
0:rx_udpport 50001
|
||||||
|
0:vhighvoltage 0
|
||||||
|
|
||||||
|
1:extsig:0 trigger_in_rising_edge
|
||||||
|
1:rx_tcpport 1955
|
||||||
|
1:rx_udpport 50002
|
||||||
|
#1:detectorip 10.1.1.52
|
||||||
|
1:vhighvoltage 0
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#########
|
||||||
|
######### Uncomment this part to use the gotthard25umZmq process
|
||||||
|
#########
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
# #replace my_receiver_hostname with the hostname of IP of the machine where the receiver runs
|
||||||
|
#0:rx_zmqip my_receiver_hostname
|
||||||
|
#0:rx_zmqport 30003
|
||||||
|
# #replace my_client_hostname with the hostname of IP of the machine where the client/GUI or softIOC runs
|
||||||
|
#0:zmqip my_client_hostname
|
||||||
|
#0:zmqport 40003
|
||||||
|
|
||||||
|
# #replace my_receiver_hostname with the hostname of IP of the machine where the receiver runs
|
||||||
|
#1:rx_zmqip my_receiver_hostname
|
||||||
|
#1:rx_zmqport 30004
|
||||||
|
# #replace my_client_hostname with the hostname of IP of the machine where the client/GUI or softIOC runs
|
||||||
|
#1:zmqip my_client_hostname
|
||||||
|
#1:zmqport 40004
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
#########
|
||||||
|
######### until here
|
||||||
|
#########
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
|
||||||
|
r_readfreq 1
|
||||||
|
rx_datastream 1
|
||||||
|
|
||||||
|
#replace my_receiver_hostname with the hostname of 1Gb IP of the machine where the receiver runs
|
||||||
|
rx_hostname my_receiver_hostname
|
||||||
|
rx_datastream 1
|
||||||
|
outdir /tmp/
|
||||||
|
angconv none
|
||||||
|
threaded 1
|
||||||
|
|
||||||
|
settings veryhighgain
|
||||||
|
exptime 0.000005
|
||||||
|
period 0.0001
|
||||||
|
|
||||||
|
vhighvoltage 90
|
0
examples/config_gen_script/beb_31_25.config_gen
Executable file → Normal file
0
examples/config_gen_script/eiger_2m_1gb.config_gen
Executable file → Normal file
@ -1,39 +0,0 @@
|
|||||||
hostname hostname1+hostname2+hostname3+hostname55+
|
|
||||||
header_var1 wow
|
|
||||||
header_var2 great
|
|
||||||
header_var3 very nice
|
|
||||||
|
|
||||||
0:counter1 100
|
|
||||||
0:counter2 1024
|
|
||||||
0:counter3 1500
|
|
||||||
0:forallmodules val_mod1
|
|
||||||
0:constant1 const1
|
|
||||||
0:constant2 const2
|
|
||||||
0:constant3 const3 /path/to/something
|
|
||||||
|
|
||||||
1:counter1 101
|
|
||||||
1:counter2 1036
|
|
||||||
1:counter3 1503
|
|
||||||
1:forallmodules val_mod2
|
|
||||||
1:constant1 const1
|
|
||||||
1:constant2 const2
|
|
||||||
1:constant3 const3 /path/to/something
|
|
||||||
|
|
||||||
2:counter1 102
|
|
||||||
2:counter2 1048
|
|
||||||
2:counter3 1506
|
|
||||||
2:forallmodules val_mod3
|
|
||||||
2:constant1 const1
|
|
||||||
2:constant2 const2
|
|
||||||
2:constant3 const3 /path/to/something
|
|
||||||
|
|
||||||
3:counter1 103
|
|
||||||
3:counter2 1060
|
|
||||||
3:counter3 1509
|
|
||||||
3:forallmodules val_mod4
|
|
||||||
3:constant1 const1
|
|
||||||
3:constant2 const2
|
|
||||||
3:constant3 const3 /path/to/something
|
|
||||||
|
|
||||||
footer1 foot1
|
|
||||||
footer2 somethingelseathebottom
|
|
@ -1,47 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# local variables
|
|
||||||
a_variable=/path/to/something
|
|
||||||
|
|
||||||
# HOSTNAMES is special
|
|
||||||
# Beside of the hostname line it also defines the amount of modules
|
|
||||||
# for the body part
|
|
||||||
# take care for the last space
|
|
||||||
HOSTNAMES="hostname1 hostname2 hostname3 hostname55 "
|
|
||||||
|
|
||||||
## header contains constant values at the beginning of the file
|
|
||||||
header=(
|
|
||||||
header_var1="wow"
|
|
||||||
header_var2="great"
|
|
||||||
header_var3="very nice"
|
|
||||||
)
|
|
||||||
|
|
||||||
## the body part is for each half module
|
|
||||||
# counters will count automatically
|
|
||||||
# the number behind ':' indicates the incrementation value
|
|
||||||
|
|
||||||
counters=(
|
|
||||||
counter1="100:1"
|
|
||||||
counter2="1024:12"
|
|
||||||
counter3="1500:3"
|
|
||||||
)
|
|
||||||
|
|
||||||
# constant values
|
|
||||||
constants=(
|
|
||||||
constant1="const1"
|
|
||||||
constant2="const2"
|
|
||||||
constant3="const3 ${a_variable}"
|
|
||||||
)
|
|
||||||
|
|
||||||
# lists contains space separated lists each value for each half module
|
|
||||||
lists=(
|
|
||||||
forallmodules="val_mod1 val_mod2 val_mod3 val_mod4"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
## footer contains constant values for the end of the file
|
|
||||||
footer=(
|
|
||||||
footer1=foot1
|
|
||||||
footer2=somethingelseathebottom
|
|
||||||
)
|
|
||||||
|
|
0
examples/eiger_10Gb.config
Executable file → Normal file
0
examples/eiger_1Gb.config
Executable file → Normal file
0
examples/gotthard.config
Executable file → Normal file
0
examples/gotthard_setup.det
Executable file → Normal file
5
examples/howto_gotthard_twomodules.txt → examples/howto_gotthatd_twomodules.txt
Executable file → Normal file
@ -1,6 +1,6 @@
|
|||||||
Turn on the two receivers:
|
Turn on the two receivers:
|
||||||
slsReceiver -t1954 &
|
slsReceiver --rx_tcpport 1954 &
|
||||||
slsReceiver -t1955 &
|
slsReceiver --rx_tcpport 1955 &
|
||||||
|
|
||||||
Switch on the photon conversion on the receiver machine (replace my_receiver_hostname):
|
Switch on the photon conversion on the receiver machine (replace my_receiver_hostname):
|
||||||
gotthard25umZmq my_receiver_hostname 30003 my_receiver_hostname 40003 &
|
gotthard25umZmq my_receiver_hostname 30003 my_receiver_hostname 40003 &
|
||||||
@ -11,3 +11,4 @@ sls_detector_put config bchip2modules.config
|
|||||||
|
|
||||||
Start your measurements using the command line, the slsDetectorGui or the EPICS driver
|
Start your measurements using the command line, the slsDetectorGui or the EPICS driver
|
||||||
|
|
||||||
|
|
0
examples/jungfrau.config
Executable file → Normal file
0
examples/jungfrau_two.config
Executable file → Normal file
44
examples/moench01_T1_lab.config → examples/moench03_T1_lab.config
Executable file → Normal file
@ -1,4 +1,4 @@
|
|||||||
hostname bchip085+
|
hostname bchip020+
|
||||||
|
|
||||||
patword 0000 0000000000000000
|
patword 0000 0000000000000000
|
||||||
patword 0001 0000000000000000
|
patword 0001 0000000000000000
|
||||||
@ -416,28 +416,32 @@ patwaittime2 0
|
|||||||
|
|
||||||
|
|
||||||
####mcp2011
|
####mcp2011
|
||||||
#0:rx_udpip 10.1.1.102
|
0:rx_tcpport 1954
|
||||||
|
0:rx_udpip 10.1.1.102
|
||||||
|
0:detectorip 10.1.1.19
|
||||||
|
0:rx_udpport 32411
|
||||||
|
####gui listening to
|
||||||
|
zmqip 129.129.202.106
|
||||||
|
zmqport 50001
|
||||||
|
####data streaming out of
|
||||||
|
rx_zmqip 10.1.2.103
|
||||||
|
rx_zmqport 50003
|
||||||
|
|
||||||
|
0:rx_hostname mpc2011
|
||||||
|
|
||||||
|
|
||||||
|
####pcmoench01
|
||||||
|
#0:rx_tcpport 1977
|
||||||
|
#0:rx_udpip 10.1.1.100
|
||||||
#0:detectorip 10.1.1.19
|
#0:detectorip 10.1.1.19
|
||||||
#0:rx_udpport 32410
|
#0:rx_udpport 32410
|
||||||
####gui listening to
|
|
||||||
#zmqip 129.129.202.131
|
|
||||||
#zmqport 30001
|
|
||||||
####data streaming out of
|
|
||||||
#rx_zmqip 10.1.2.103
|
|
||||||
#rx_zmqport 30003
|
|
||||||
#0:rx_hostname mpc2011
|
|
||||||
|
|
||||||
####mx-test-1
|
|
||||||
0:rx_udpip 10.1.1.100
|
|
||||||
0:detectorip 10.1.1.19
|
|
||||||
0:rx_udpport 32410
|
|
||||||
####gui listening to (on receiver pc)
|
####gui listening to (on receiver pc)
|
||||||
zmqip 129.129.202.92
|
#zmqip 129.129.202.92
|
||||||
zmqport 30001
|
#zmqport 50001
|
||||||
####data streaming out of
|
####data streaming out of
|
||||||
rx_zmqip 10.1.1.100
|
#rx_zmqip 10.1.1.100
|
||||||
rx_zmqport 30003
|
#rx_zmqport 50003
|
||||||
0:rx_hostname pcmoench01
|
#0:rx_hostname mx-test-1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -487,5 +491,3 @@ period 0.1
|
|||||||
outdir /scratch/
|
outdir /scratch/
|
||||||
enablefwrite 0
|
enablefwrite 0
|
||||||
|
|
||||||
|
|
||||||
|
|
32
examples/mythen.config
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
type Mythen+
|
||||||
|
0:hostname mcs1x21
|
||||||
|
0:port 1952
|
||||||
|
0:stopport 1953
|
||||||
|
0:settingsdir /afs/psi.ch/user/b/bergamaschi
|
||||||
|
0:outdir /afs/psi.ch/user/b/bergamaschi
|
||||||
|
0:angdir 1.000000
|
||||||
|
0:moveflag 1.000000
|
||||||
|
0:lock 0
|
||||||
|
0:caldir /afs/psi.ch/user/b/bergamaschi
|
||||||
|
0:ffdir /afs/psi.ch/user/b/bergamaschi
|
||||||
|
0:nmod 1
|
||||||
|
0:waitstates 13
|
||||||
|
0:setlength 3
|
||||||
|
0:clkdivider 6
|
||||||
|
0:extsig:0 gate_in_active_high
|
||||||
|
0:extsig:1 trigger_in_rising_edge
|
||||||
|
0:extsig:2 off
|
||||||
|
0:extsig:3 off
|
||||||
|
master -1
|
||||||
|
sync none
|
||||||
|
outdir /afs/psi.ch/user/b/bergamaschi
|
||||||
|
ffdir /afs/psi.ch/user/b/bergamaschi
|
||||||
|
headerbefore none
|
||||||
|
headerafter none
|
||||||
|
headerbeforepar none
|
||||||
|
headerafterpar none
|
||||||
|
badchannels none
|
||||||
|
angconv none
|
||||||
|
globaloff 0.000000
|
||||||
|
binsize 0.001000
|
||||||
|
threaded 1
|
1
examples/receiver.config
Normal file
@ -0,0 +1 @@
|
|||||||
|
dataport 1955
|
0
examples/scripts/.parab
Executable file → Normal file
142
examples/scripts/HeaderBeforeAfter.awk
Executable file
@ -0,0 +1,142 @@
|
|||||||
|
#! /bin/awk -f
|
||||||
|
|
||||||
|
# this is an awk script to start a run
|
||||||
|
# you first need to run inimodule.awk to initialize
|
||||||
|
# the pattern, set Vc and set the trimbits
|
||||||
|
#
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# revision history #
|
||||||
|
#####################################################################
|
||||||
|
# 31.10.2001 first version #
|
||||||
|
#####################################################################
|
||||||
|
# #
|
||||||
|
# Bernd Schmitt #
|
||||||
|
# #
|
||||||
|
# bernd.schmitt@psi.ch #
|
||||||
|
# #
|
||||||
|
#####################################################################
|
||||||
|
# #
|
||||||
|
# modifications: #
|
||||||
|
# #
|
||||||
|
# 1.3.2002 BS adapted for use with DCB #
|
||||||
|
# #
|
||||||
|
# 25.5.2002 BS adapted to new convert program #
|
||||||
|
# #
|
||||||
|
# 29.5.2002 sleep -> usleep for meas. time , TS #
|
||||||
|
# #
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
|
||||||
|
# initialize variables
|
||||||
|
NPAR=3
|
||||||
|
|
||||||
|
PAR[1]="nrun"
|
||||||
|
PAR[2]="fn"
|
||||||
|
PAR[3]="par"
|
||||||
|
|
||||||
|
# initialize default values
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PARVAL[1] = 100
|
||||||
|
PARVAL[2] = "microstrip_july2007"
|
||||||
|
PARVAL[3]=0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC);
|
||||||
|
|
||||||
|
# read command line defined variables
|
||||||
|
if (ARGC>1) {
|
||||||
|
printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC);
|
||||||
|
for (i=1; i<=ARGC; i++) {
|
||||||
|
printf("%s \n", ARGV[i]);
|
||||||
|
nsplit=split(ARGV[i],array,"=")
|
||||||
|
VAR = array[1];
|
||||||
|
VAL = array[2];
|
||||||
|
|
||||||
|
for (j=1; j<=NPAR; j++) {
|
||||||
|
if ( VAR==PAR[j] ) {
|
||||||
|
PARVAL[j] = VAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
run=PARVAL[1]
|
||||||
|
fn=PARVAL[2]
|
||||||
|
par=PARVAL[3]
|
||||||
|
|
||||||
|
|
||||||
|
# print command line arguments
|
||||||
|
for (i=1; i<=NPAR; i++){
|
||||||
|
printf("\t... %2i.\t%7s = %s\n", i, PAR[i], PARVAL[i] );
|
||||||
|
}
|
||||||
|
printf("\n\n");
|
||||||
|
|
||||||
|
# generate parameter file
|
||||||
|
|
||||||
|
fnamep=fn".parab"
|
||||||
|
printf("header before\n")>> fnamep
|
||||||
|
system("date >>"fnamep)
|
||||||
|
printf("run=%i \n", run ) >> fnamep
|
||||||
|
|
||||||
|
#print detector parameters to file
|
||||||
|
if (par==1) {
|
||||||
|
|
||||||
|
command="sls_detector_get exptime| awk -F \" \" '{print $2}'"
|
||||||
|
command | getline var
|
||||||
|
printf("acquisition time = %11.6f second(s)\n", var) >> fnamep
|
||||||
|
|
||||||
|
command="sls_detector_get settings| awk -F \" \" '{print $2}'"
|
||||||
|
command | getline var
|
||||||
|
printf("settings = %s\n", var) >> fnamep;
|
||||||
|
|
||||||
|
command="sls_detector_get threshold| awk -F \" \" '{print $2}'"
|
||||||
|
command | getline var
|
||||||
|
printf("threshold energy = %d eV\n", var) >> fnamep;
|
||||||
|
|
||||||
|
command="sls_detector_get badchannels| awk -F \" \" '{print $2}'"
|
||||||
|
command | getline var
|
||||||
|
printf("bad channel list = %s\n",var) >> fnamep;
|
||||||
|
|
||||||
|
|
||||||
|
command="sls_detector_get angconv| awk -F \" \" '{print $2}'"
|
||||||
|
command | getline var
|
||||||
|
printf("angle calibration conversion = %s\n",var) >> fnamep;
|
||||||
|
|
||||||
|
|
||||||
|
command="sls_detector_get globaloff| awk -F \" \" '{print $2}'"
|
||||||
|
command | getline var
|
||||||
|
printf("beamline offset = %f deg\n", var) >> fnamep;
|
||||||
|
|
||||||
|
command="sls_detector_get fineoff| awk -F \" \" '{print $2}'"
|
||||||
|
command | getline var
|
||||||
|
printf("fine offset = %f deg\n", var) >> fnamep;
|
||||||
|
|
||||||
|
command="sls_detector_get flatfield| awk -F \" \" '{print $2}'"
|
||||||
|
command | getline var
|
||||||
|
printf("Flat field corrections = %s\n",var) >> fnamep;
|
||||||
|
|
||||||
|
command="sls_detector_get ratecorr| awk -F \" \" '{print $2}'"
|
||||||
|
command | getline var
|
||||||
|
printf("Dead time corrections tau = %d ns\n",var) >> fnamep;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#print beamline parameters to file
|
||||||
|
|
||||||
|
#read detector position
|
||||||
|
system("caget X04SA-ES2-TH2:RO.RBV >>"fnamep)
|
||||||
|
#read I0
|
||||||
|
system("caget X04SA-ES2-SC:CH6>>"fnamep)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
87
examples/scripts/ScanScript.awk
Executable file
@ -0,0 +1,87 @@
|
|||||||
|
#! /bin/awk -f
|
||||||
|
|
||||||
|
# this is an awk script to start a run
|
||||||
|
# you first need to run inimodule.awk to initialize
|
||||||
|
# the pattern, set Vc and set the trimbits
|
||||||
|
#
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# revision history #
|
||||||
|
#####################################################################
|
||||||
|
# 31.10.2001 first version #
|
||||||
|
#####################################################################
|
||||||
|
# #
|
||||||
|
# Bernd Schmitt #
|
||||||
|
# #
|
||||||
|
# bernd.schmitt@psi.ch #
|
||||||
|
# #
|
||||||
|
#####################################################################
|
||||||
|
# #
|
||||||
|
# modifications: #
|
||||||
|
# #
|
||||||
|
# 1.3.2002 BS adapted for use with DCB #
|
||||||
|
# #
|
||||||
|
# 25.5.2002 BS adapted to new convert program #
|
||||||
|
# #
|
||||||
|
# 29.5.2002 sleep -> usleep for meas. time , TS #
|
||||||
|
# #
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
|
||||||
|
# initialize variables
|
||||||
|
NPAR=4
|
||||||
|
|
||||||
|
PAR[1]="nrun"
|
||||||
|
PAR[2]="fn"
|
||||||
|
PAR[3]="var"
|
||||||
|
PAR[4]="par"
|
||||||
|
|
||||||
|
|
||||||
|
# initialize default values
|
||||||
|
PARVAL[1] = 100
|
||||||
|
PARVAL[2] = "myfname"
|
||||||
|
PARVAL[3] = 0
|
||||||
|
PARVAL[2] = "none"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# read command line defined variables
|
||||||
|
if (ARGC>1) {
|
||||||
|
printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC);
|
||||||
|
for (i=1; i<=ARGC; i++) {
|
||||||
|
|
||||||
|
nsplit=split(ARGV[i],array,"=")
|
||||||
|
VAR = array[1];
|
||||||
|
VAL = array[2];
|
||||||
|
|
||||||
|
for (j=1; j<=NPAR; j++) {
|
||||||
|
if ( VAR==PAR[j] ) {
|
||||||
|
PARVAL[j] = VAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
run=PARVAL[1]
|
||||||
|
fn=PARVAL[2]
|
||||||
|
var=PARVAL[3]
|
||||||
|
par=PARVAL[4]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# print command line arguments
|
||||||
|
for (i=1; i<=NPAR; i++){
|
||||||
|
printf("\t... %2i.\t%7s = %s\n", i, PAR[i], PARVAL[i] );
|
||||||
|
}
|
||||||
|
|
||||||
|
#execute you command hereafter e.g. change temperature etc.
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
100
examples/scripts/ScriptBeforeAfter.awk
Executable file
@ -0,0 +1,100 @@
|
|||||||
|
#! /bin/awk -f
|
||||||
|
|
||||||
|
# this is an awk script to start a run
|
||||||
|
# you first need to run inimodule.awk to initialize
|
||||||
|
# the pattern, set Vc and set the trimbits
|
||||||
|
#
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# revision history #
|
||||||
|
#####################################################################
|
||||||
|
# 31.10.2001 first version #
|
||||||
|
#####################################################################
|
||||||
|
# #
|
||||||
|
# Bernd Schmitt #
|
||||||
|
# #
|
||||||
|
# bernd.schmitt@psi.ch #
|
||||||
|
# #
|
||||||
|
#####################################################################
|
||||||
|
# #
|
||||||
|
# modifications: #
|
||||||
|
# #
|
||||||
|
# 1.3.2002 BS adapted for use with DCB #
|
||||||
|
# #
|
||||||
|
# 25.5.2002 BS adapted to new convert program #
|
||||||
|
# #
|
||||||
|
# 29.5.2002 sleep -> usleep for meas. time , TS #
|
||||||
|
# #
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
|
||||||
|
# initialize variables
|
||||||
|
NPAR=7
|
||||||
|
|
||||||
|
PAR[1]="nrun"
|
||||||
|
PAR[2]="fn"
|
||||||
|
PAR[3]="par"
|
||||||
|
PAR[4]="sv0"
|
||||||
|
PAR[5]="sv1"
|
||||||
|
PAR[6]="p0"
|
||||||
|
PAR[7]="p1"
|
||||||
|
|
||||||
|
# initialize default values
|
||||||
|
PARVAL[1] = 100
|
||||||
|
PARVAL[2] = "myfname"
|
||||||
|
PARVAL[3] = 1
|
||||||
|
PARVAL[4] = 0
|
||||||
|
PARVAL[5] = 0
|
||||||
|
PARVAL[6] = "none"
|
||||||
|
PARVAL[7] = "none"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# read command line defined variables
|
||||||
|
if (ARGC>1) {
|
||||||
|
printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC);
|
||||||
|
for (i=1; i<=ARGC; i++) {
|
||||||
|
|
||||||
|
nsplit=split(ARGV[i],array,"=")
|
||||||
|
VAR = array[1];
|
||||||
|
VAL = array[2];
|
||||||
|
|
||||||
|
for (j=1; j<=NPAR; j++) {
|
||||||
|
if ( VAR==PAR[j] ) {
|
||||||
|
PARVAL[j] = VAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
run=PARVAL[1]
|
||||||
|
fn=PARVAL[2]
|
||||||
|
"par"PAR[3]=
|
||||||
|
sv0=PAR[4]
|
||||||
|
sv1=PAR[5]
|
||||||
|
p0=PAR[6]
|
||||||
|
p1=PAR[7]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# print command line arguments
|
||||||
|
for (i=1; i<=NPAR; i++){
|
||||||
|
printf("\t... %2i.\t%7s = %s\n", i, PAR[i], PARVAL[i] );
|
||||||
|
}
|
||||||
|
# printf("\n\n");
|
||||||
|
# system("close_shutter_g95")
|
||||||
|
|
||||||
|
# execute your actions hereafter
|
||||||
|
if (par==1) {
|
||||||
|
#open shutter
|
||||||
|
} else {
|
||||||
|
#close shutter
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
79
examples/scripts/StartStopScript.awk
Executable file
@ -0,0 +1,79 @@
|
|||||||
|
#! /bin/awk -f
|
||||||
|
|
||||||
|
# this is an awk script to start a run
|
||||||
|
# you first need to run inimodule.awk to initialize
|
||||||
|
# the pattern, set Vc and set the trimbits
|
||||||
|
#
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
# revision history #
|
||||||
|
#####################################################################
|
||||||
|
# 31.10.2001 first version #
|
||||||
|
#####################################################################
|
||||||
|
# #
|
||||||
|
# Bernd Schmitt #
|
||||||
|
# #
|
||||||
|
# bernd.schmitt@psi.ch #
|
||||||
|
# #
|
||||||
|
#####################################################################
|
||||||
|
# #
|
||||||
|
# modifications: #
|
||||||
|
# #
|
||||||
|
# 1.3.2002 BS adapted for use with DCB #
|
||||||
|
# #
|
||||||
|
# 25.5.2002 BS adapted to new convert program #
|
||||||
|
# #
|
||||||
|
# 29.5.2002 sleep -> usleep for meas. time , TS #
|
||||||
|
# #
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
|
||||||
|
# initialize variables
|
||||||
|
NPAR=2
|
||||||
|
|
||||||
|
PAR[1]="nrun"
|
||||||
|
PAR[2]="par"
|
||||||
|
|
||||||
|
|
||||||
|
# initialize default values
|
||||||
|
PARVAL[1] = 100
|
||||||
|
PARVAL[2] = "none"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# read command line defined variables
|
||||||
|
if (ARGC>1) {
|
||||||
|
printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC);
|
||||||
|
for (i=1; i<=ARGC; i++) {
|
||||||
|
|
||||||
|
nsplit=split(ARGV[i],array,"=")
|
||||||
|
VAR = array[1];
|
||||||
|
VAL = array[2];
|
||||||
|
|
||||||
|
for (j=1; j<=NPAR; j++) {
|
||||||
|
if ( VAR==PAR[j] ) {
|
||||||
|
PARVAL[j] = VAL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
run=PARVAL[1]
|
||||||
|
par=PARVAL[2]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# print command line arguments
|
||||||
|
for (i=1; i<=NPAR; i++){
|
||||||
|
printf("\t... %2i.\t%7s = %s\n", i, PAR[i], PARVAL[i] );
|
||||||
|
}
|
||||||
|
#execute action hereafter
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
0
examples/two_gotthard.config
Executable file → Normal file
64
examples/two_no_receiver.config
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
#####Any line with a # is not read######
|
||||||
|
|
||||||
|
#type Gotthard+
|
||||||
|
hostname bchip007+bchip009+
|
||||||
|
|
||||||
|
#0:hostname bchip007
|
||||||
|
#0:port 1952
|
||||||
|
#0:stopport 1953
|
||||||
|
#0:rx_tcpport 1956
|
||||||
|
0:settingsdir /home/l_msdetect/dhanya/slsDetectorsPackage/settingsdir/gotthard
|
||||||
|
0:angdir 1.000000
|
||||||
|
0:moveflag 0.000000
|
||||||
|
0:lock 0
|
||||||
|
0:caldir /home/l_msdetect/dhanya/slsDetectorsPackage/settingsdir/gotthard
|
||||||
|
0:ffdir /home/l_msdetect
|
||||||
|
0:extsig:0 off
|
||||||
|
0:extsig:1 off
|
||||||
|
0:extsig:2 off
|
||||||
|
0:extsig:3 off
|
||||||
|
#0:detectorip 10.1.1.2
|
||||||
|
#0:detectormac 00:aa:bb:cc:dd:ee
|
||||||
|
#0:rx_udpport 50001
|
||||||
|
#0:rx_udpip 10.1.1.1
|
||||||
|
#0:rx_hostname 129.129.202.134
|
||||||
|
0:outdir /data/speedt
|
||||||
|
0:vhighvoltage 120
|
||||||
|
|
||||||
|
|
||||||
|
#1:hostname bchip009
|
||||||
|
#1:port 1952
|
||||||
|
#1:stopport 1953
|
||||||
|
1:rx_tcpport 1957
|
||||||
|
1:settingsdir /home/l_msdetect/dhanya/slsDetectorsPackage/settingsdir/gotthard
|
||||||
|
1:angdir 1.000000
|
||||||
|
1:moveflag 0.000000
|
||||||
|
1:lock 0
|
||||||
|
1:caldir /home/l_msdetect/dhanya/slsDetectorsPackage/settingsdir/gotthard
|
||||||
|
1:ffdir /home/l_msdetect
|
||||||
|
1:extsig:0 off
|
||||||
|
1:extsig:1 off
|
||||||
|
1:extsig:2 off
|
||||||
|
1:extsig:3 off
|
||||||
|
#1:detectorip 10.1.2.2
|
||||||
|
#1:detectormac 00:aa:bb:cc:dd:ee
|
||||||
|
#1:rx_udpport 50004
|
||||||
|
#1:rx_udpip 10.1.2.1
|
||||||
|
#1:rx_hostname 129.129.202.134
|
||||||
|
1:outdir /data/speedt
|
||||||
|
1:vhighvoltage 120
|
||||||
|
|
||||||
|
|
||||||
|
master -1
|
||||||
|
sync none
|
||||||
|
outdir /data/speedt
|
||||||
|
ffdir /home/l_msdetect
|
||||||
|
headerbefore none
|
||||||
|
headerafter none
|
||||||
|
headerbeforepar none
|
||||||
|
headerafterpar none
|
||||||
|
badchannels none
|
||||||
|
angconv none
|
||||||
|
globaloff 0.000000
|
||||||
|
binsize 0.001000
|
||||||
|
threaded 1
|
@ -1,49 +0,0 @@
|
|||||||
# MESSAGE( STATUS "CMAKE_CURRENT_SOURCE_DIR: " ${CMAKE_CURRENT_SOURCE_DIR} )
|
|
||||||
# MESSAGE( STATUS "PROJECT_SOURCE_DIR: " ${PROJECT_SOURCE_DIR} )
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# include_directories(
|
|
||||||
# ${PROJECT_SOURCE_DIR}/catch
|
|
||||||
# )
|
|
||||||
|
|
||||||
target_sources(tests PRIVATE
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/test-integrationMulti.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/test-integrationDectector.cpp
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/test-eigerIntegration.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
# if(SLS_USE_TESTS)
|
|
||||||
# set(TEST_SOURCES
|
|
||||||
# src/test-slsDetector.cpp
|
|
||||||
# src/test.cpp
|
|
||||||
# )
|
|
||||||
# add_executable(detector_test ${TEST_SOURCES})
|
|
||||||
|
|
||||||
# target_link_libraries(detector_test
|
|
||||||
# slsDetectorShared
|
|
||||||
# slsProjectOptions
|
|
||||||
# slsProjectWarnings
|
|
||||||
# slsSupportLib
|
|
||||||
# pthread
|
|
||||||
# rt
|
|
||||||
# )
|
|
||||||
# set_target_properties(detector_test PROPERTIES
|
|
||||||
# RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
||||||
# )
|
|
||||||
|
|
||||||
# add_executable(a src/a.cpp)
|
|
||||||
# target_link_libraries(a
|
|
||||||
# slsProjectOptions
|
|
||||||
# slsProjectWarnings
|
|
||||||
# slsDetectorShared
|
|
||||||
# slsSupportLib
|
|
||||||
# pthread
|
|
||||||
# rt
|
|
||||||
# )
|
|
||||||
# set_target_properties(a PROPERTIES
|
|
||||||
# RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
||||||
# )
|
|
||||||
|
|
||||||
# endif()
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
|||||||
|
|
||||||
#include "catch.hpp"
|
|
||||||
|
|
||||||
#include "ClientSocket.h"
|
|
||||||
#include "Timer.h"
|
|
||||||
#include "logger.h"
|
|
||||||
#include "network_utils.h"
|
|
||||||
#include "slsDetector.h"
|
|
||||||
#include "sls_detector_defs.h"
|
|
||||||
#include "sls_detector_exceptions.h"
|
|
||||||
#include "sls_detector_funcs.h"
|
|
||||||
#include <iomanip>
|
|
||||||
#include <iostream>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <string>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
#include "network_utils.h"
|
|
||||||
|
|
||||||
using namespace sls;
|
|
||||||
using ROI = slsDetectorDefs::ROI;
|
|
||||||
|
|
||||||
// Easy printing of an ROI
|
|
||||||
std::ostream &operator<<(std::ostream &out, const ROI &r) {
|
|
||||||
return out << "xmin: " << std::setw(5) << r.xmin
|
|
||||||
<< " xmax: " << std::setw(5) << r.xmax
|
|
||||||
<< " ymin: " << std::setw(5) << r.ymin
|
|
||||||
<< " ymax: " << std::setw(5) << r.ymax;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
|
|
||||||
std::cout << "nullptr: " << sizeof(nullptr) << "\n";
|
|
||||||
// int ret[]{0,0,0};
|
|
||||||
// for (auto i: ret)
|
|
||||||
// std::cout << i << "\n";
|
|
||||||
// uint32_t imageSize = 101;
|
|
||||||
// uint32_t packetSize = 100;
|
|
||||||
// std::cout << "a: " << std::ceil((double)imageSize / (double)packetSize) <<'\n';
|
|
||||||
// std::cout << "b: " << imageSize / packetSize <<'\n';
|
|
||||||
// std::cout << "c: " << static_cast<double>(imageSize / packetSize) << '\n';
|
|
||||||
// std::cout << "c: " << (imageSize + packetSize-1) / packetSize << '\n';
|
|
||||||
|
|
||||||
// slsDetectorDefs::ROI roilimits[5];
|
|
||||||
// roilimits[0].xmin = 5;
|
|
||||||
// roilimits[0].xmax = 12;
|
|
||||||
// roilimits[0].ymin = 5;
|
|
||||||
// roilimits[0].ymax = 15;
|
|
||||||
|
|
||||||
// roilimits[1].xmin = 0;
|
|
||||||
// roilimits[1].xmax = 3;
|
|
||||||
// roilimits[1].ymin = 20;
|
|
||||||
// roilimits[1].ymax = 25;
|
|
||||||
|
|
||||||
// roilimits[2].xmin = 500;
|
|
||||||
// roilimits[2].xmax = 600;
|
|
||||||
// roilimits[2].ymin = 100;
|
|
||||||
// roilimits[2].ymax = 200;
|
|
||||||
|
|
||||||
// roilimits[3].xmin = 300;
|
|
||||||
// roilimits[3].xmax = 500;
|
|
||||||
// roilimits[3].ymin = 800;
|
|
||||||
// roilimits[3].ymax = 900;
|
|
||||||
|
|
||||||
// roilimits[4].xmin = 1000;
|
|
||||||
// roilimits[4].xmax = 2000;
|
|
||||||
// roilimits[4].ymin = 300;
|
|
||||||
// roilimits[4].ymax = 500;
|
|
||||||
|
|
||||||
// std::cout << "Before sorting:\n";
|
|
||||||
// for (auto r : roilimits) {
|
|
||||||
// std::cout << r << '\n';
|
|
||||||
// }
|
|
||||||
|
|
||||||
// std::sort(std::begin(roilimits), std::end(roilimits),
|
|
||||||
// [](ROI a, ROI b) { return a.xmin < b.xmin; });
|
|
||||||
|
|
||||||
// std::cout << "After sorting: \n";
|
|
||||||
// for (auto r : roilimits) {
|
|
||||||
// std::cout << r << '\n';
|
|
||||||
// }
|
|
||||||
}
|
|
@ -1,199 +0,0 @@
|
|||||||
#include "catch.hpp"
|
|
||||||
#include "multiSlsDetector.h"
|
|
||||||
#include "string_utils.h"
|
|
||||||
#include "tests/globals.h"
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
class MultiDetectorFixture {
|
|
||||||
protected:
|
|
||||||
multiSlsDetector d;
|
|
||||||
|
|
||||||
public:
|
|
||||||
MultiDetectorFixture() : d(0, true, true) {
|
|
||||||
d.setHostname(hostname.c_str());
|
|
||||||
if (my_ip != "undefined")
|
|
||||||
d.setReceiverHostname(my_ip);
|
|
||||||
}
|
|
||||||
~MultiDetectorFixture() { d.freeSharedMemory(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Set and get dacs",
|
|
||||||
"[.eigerintegration][cli]") {
|
|
||||||
auto th = 1000;
|
|
||||||
|
|
||||||
// set and read back each individual dac of EIGER
|
|
||||||
d.setDAC(0, di::E_SvP, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_SvP, 0) == 0);
|
|
||||||
d.setDAC(4000, di::E_SvN, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_SvN, 0) == 4000);
|
|
||||||
d.setDAC(2000, di::E_Vtr, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vtr, 0) == 2000);
|
|
||||||
d.setDAC(3500, di::E_Vrf, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vrf, 0) == 3500);
|
|
||||||
d.setDAC(1400, di::E_Vrs, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vrs, 0) == 1400);
|
|
||||||
d.setDAC(2556, di::E_Vtgstv, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vtgstv, 0) == 2556);
|
|
||||||
d.setDAC(1500, di::E_Vcmp_ll, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_ll, 0) == 1500);
|
|
||||||
d.setDAC(1400, di::E_Vcmp_lr, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_lr, 0) == 1400);
|
|
||||||
d.setDAC(4000, di::E_cal, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_cal, 0) == 4000);
|
|
||||||
d.setDAC(1300, di::E_Vcmp_rl, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_rl, 0) == 1300);
|
|
||||||
d.setDAC(1200, di::E_Vcmp_rr, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_rr, 0) == 1200);
|
|
||||||
d.setDAC(1100, di::E_rxb_rb, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_rxb_rb, 0) == 1100);
|
|
||||||
d.setDAC(1100, di::E_rxb_lb, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_rxb_lb, 0) == 1100);
|
|
||||||
d.setDAC(1500, di::E_Vcp, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcp, 0) == 1500);
|
|
||||||
d.setDAC(2000, di::E_Vcn, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcn, 0) == 2000);
|
|
||||||
d.setDAC(1550, di::E_Vis, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vis, 0) == 1550);
|
|
||||||
d.setDAC(660, di::IO_DELAY, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::IO_DELAY, 0) == 660);
|
|
||||||
|
|
||||||
// setting threshold sets all individual vcmp
|
|
||||||
d.setDAC(th, di::THRESHOLD, 0);
|
|
||||||
CHECK(d.setDAC(-1, di::THRESHOLD, 0) == th);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_ll, 0) == th);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_lr, 0) == th);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_rl, 0) == th);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_rr, 0) == th);
|
|
||||||
|
|
||||||
// different values gives -1
|
|
||||||
if (d.getNumberOfDetectors() > 1) {
|
|
||||||
d.setDAC(1600, di::E_Vcmp_ll, 0, 0);
|
|
||||||
d.setDAC(1700, di::E_Vcmp_ll, 0, 1);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_ll, 0, 0) == 1600);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_ll, 0, 1) == 1700);
|
|
||||||
CHECK(d.setDAC(-1, di::E_Vcmp_ll, 0) == -1);
|
|
||||||
CHECK(d.setDAC(-1, di::THRESHOLD, 0) == -1);
|
|
||||||
CHECK(d.setDAC(-1, di::THRESHOLD, 0, 0) == -1);
|
|
||||||
CHECK(d.setDAC(-1, di::THRESHOLD, 0, 1) == -1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Read temperatures",
|
|
||||||
"[.eigerintegration][cli]") {
|
|
||||||
std::vector<di> tempindex{di::TEMPERATURE_FPGA, di::TEMPERATURE_FPGA2,
|
|
||||||
di::TEMPERATURE_FPGA3};
|
|
||||||
for (auto index : tempindex) {
|
|
||||||
for (int i = 0; i != d.getNumberOfDetectors(); ++i) {
|
|
||||||
double temp = static_cast<double>(d.getADC(index, 0)) / 1000;
|
|
||||||
CHECK(temp > 20);
|
|
||||||
CHECK(temp < 60);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int to_time(uint32_t reg) {
|
|
||||||
uint32_t clocks = reg >> 3;
|
|
||||||
uint32_t exponent = (reg & 0b111) + 1;
|
|
||||||
return clocks * pow(10, exponent);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Read/write register",
|
|
||||||
"[.eigerintegration][cli]") {
|
|
||||||
d.setTimer(ti::MEASUREMENTS_NUMBER, 1);
|
|
||||||
d.setNumberOfFrames(1);
|
|
||||||
d.setExposureTime(10000);
|
|
||||||
d.acquire();
|
|
||||||
CHECK(to_time(d.readRegister(0x4, 0)) == 10000);
|
|
||||||
|
|
||||||
d.writeRegister(0x4, 500);
|
|
||||||
CHECK(d.readRegister(0x4) == 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Set dynamic range",
|
|
||||||
"[.eigerintegration][cli][dr]") {
|
|
||||||
std::vector<int> dynamic_range{4, 8, 16, 32};
|
|
||||||
for (auto dr : dynamic_range) {
|
|
||||||
d.setDynamicRange(dr);
|
|
||||||
CHECK(d.setDynamicRange() == dr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Set clock divider",
|
|
||||||
"[.eigerintegration][cli][this]") {
|
|
||||||
for (int i = 0; i != 3; ++i) {
|
|
||||||
d.setSpeed(sv::CLOCK_DIVIDER, i);
|
|
||||||
CHECK(d.setSpeed(sv::CLOCK_DIVIDER) == i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Get time left",
|
|
||||||
"[.eigerintegration][cli]") {
|
|
||||||
CHECK_THROWS(d.getTimeLeft(ti::PROGRESS));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Get ID", "[.eigerintegration][cli]") {
|
|
||||||
std::string hn = hostname;
|
|
||||||
hn.erase(std::remove(begin(hn), end(hn), 'b'), end(hn));
|
|
||||||
hn.erase(std::remove(begin(hn), end(hn), 'e'), end(hn));
|
|
||||||
auto hostnames = sls::split(hn, '+');
|
|
||||||
CHECK(hostnames.size() == d.getNumberOfDetectors());
|
|
||||||
for (int i = 0; i != d.getNumberOfDetectors(); ++i) {
|
|
||||||
CHECK(d.getId(defs::DETECTOR_SERIAL_NUMBER, 0) ==
|
|
||||||
std::stoi(hostnames[0]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Lock server",
|
|
||||||
"[.eigerintegration][cli]") {
|
|
||||||
|
|
||||||
d.lockServer(1);
|
|
||||||
CHECK(d.lockServer() == 1);
|
|
||||||
d.lockServer(0);
|
|
||||||
CHECK(d.lockServer() == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Settings", "[.eigerintegration][cli]") {
|
|
||||||
CHECK(d.setSettings(defs::STANDARD) == defs::STANDARD);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "Set readout flags",
|
|
||||||
"[.eigerintegration][cli]") {
|
|
||||||
d.setReadOutFlags(defs::PARALLEL);
|
|
||||||
CHECK((d.setReadOutFlags() & defs::PARALLEL));
|
|
||||||
|
|
||||||
d.setReadOutFlags(defs::NONPARALLEL);
|
|
||||||
CHECK_FALSE((d.setReadOutFlags() & defs::PARALLEL));
|
|
||||||
CHECK((d.setReadOutFlags() & defs::NONPARALLEL));
|
|
||||||
}
|
|
||||||
|
|
||||||
// TEST_CASE_METHOD(MultiDetectorFixture, "Flow control and tengiga",
|
|
||||||
// "[.eigerintegration][cli]") {
|
|
||||||
// d.setFlowControl10G(1);
|
|
||||||
// CHECK(d.setFlowControl10G() == 1);
|
|
||||||
// d.setFlowControl10G(0);
|
|
||||||
// CHECK(d.setFlowControl10G() == 0);
|
|
||||||
|
|
||||||
// d.enableTenGigabitEthernet(1);
|
|
||||||
// CHECK(d.enableTenGigabitEthernet() == 1);
|
|
||||||
// d.enableTenGigabitEthernet(0);
|
|
||||||
// CHECK(d.enableTenGigabitEthernet() == 0);
|
|
||||||
// }
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "activate", "[.eigerintegration][cli]") {
|
|
||||||
d.activate(0);
|
|
||||||
CHECK(d.activate() == 0);
|
|
||||||
d.activate(1);
|
|
||||||
CHECK(d.activate() == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "all trimbits",
|
|
||||||
"[.eigerintegration][cli]") {
|
|
||||||
d.setAllTrimbits(32);
|
|
||||||
CHECK(d.setAllTrimbits(-1) == 32);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE_METHOD(MultiDetectorFixture, "rate correction",
|
|
||||||
"[.eigerintegration][cli]") {
|
|
||||||
d.setRateCorrection(200);
|
|
||||||
CHECK(d.getRateCorrection() == 200);
|
|
||||||
}
|
|
@ -1,482 +0,0 @@
|
|||||||
|
|
||||||
#include "catch.hpp"
|
|
||||||
|
|
||||||
#include "ClientSocket.h"
|
|
||||||
#include "logger.h"
|
|
||||||
#include "multiSlsDetector.h"
|
|
||||||
#include "slsDetector.h"
|
|
||||||
#include "sls_detector_defs.h"
|
|
||||||
|
|
||||||
#include "Timer.h"
|
|
||||||
#include "sls_detector_funcs.h"
|
|
||||||
#include <iostream>
|
|
||||||
#include <vector>
|
|
||||||
#define VERBOSE
|
|
||||||
|
|
||||||
// Header holding all configurations for different detectors
|
|
||||||
#include "tests/config.h"
|
|
||||||
#include "tests/globals.h"
|
|
||||||
|
|
||||||
// using dt = slsDetectorDefs::detectorType;
|
|
||||||
// extern std::string hostname;
|
|
||||||
// extern std::string detector_type;
|
|
||||||
// extern dt type;
|
|
||||||
|
|
||||||
TEST_CASE("Single detector no receiver", "[.integration][.single]") {
|
|
||||||
auto t = slsDetector::getTypeFromDetector(hostname);
|
|
||||||
CHECK(t == type);
|
|
||||||
|
|
||||||
slsDetector d(t);
|
|
||||||
CHECK(d.getDetectorTypeAsEnum() == t);
|
|
||||||
CHECK(d.getDetectorTypeAsString() == detector_type);
|
|
||||||
|
|
||||||
d.setHostname(hostname);
|
|
||||||
CHECK(d.getHostname() == hostname);
|
|
||||||
|
|
||||||
d.setOnline(true);
|
|
||||||
CHECK(d.getOnlineFlag() == true);
|
|
||||||
|
|
||||||
CHECK(d.setDetectorType() == type);
|
|
||||||
|
|
||||||
d.freeSharedMemory();
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Set control port then create a new object with this control port",
|
|
||||||
"[.integration][.single]") {
|
|
||||||
/*
|
|
||||||
TODO!
|
|
||||||
Standard port but should not be hardcoded
|
|
||||||
Is this the best way to initialize the detectors
|
|
||||||
Using braces to make the object go out of scope
|
|
||||||
*/
|
|
||||||
int old_cport = DEFAULT_PORTNO;
|
|
||||||
int old_sport = DEFAULT_PORTNO + 1;
|
|
||||||
int new_cport = 1993;
|
|
||||||
int new_sport = 2000;
|
|
||||||
{
|
|
||||||
slsDetector d(type);
|
|
||||||
d.setHostname(hostname);
|
|
||||||
d.setOnline(true);
|
|
||||||
CHECK(d.getControlPort() == old_cport);
|
|
||||||
d.setControlPort(new_cport);
|
|
||||||
CHECK(d.getStopPort() == old_sport);
|
|
||||||
d.setStopPort(new_sport);
|
|
||||||
d.freeSharedMemory();
|
|
||||||
}
|
|
||||||
{
|
|
||||||
slsDetector d(type);
|
|
||||||
d.setHostname(hostname);
|
|
||||||
d.setControlPort(new_cport);
|
|
||||||
d.setStopPort(new_sport);
|
|
||||||
CHECK(d.getControlPort() == new_cport);
|
|
||||||
CHECK(d.getStopPort() == new_sport);
|
|
||||||
|
|
||||||
d.setOnline(true);
|
|
||||||
|
|
||||||
// Reset standard ports
|
|
||||||
d.setControlPort(old_cport);
|
|
||||||
d.setStopPort(old_sport);
|
|
||||||
d.freeSharedMemory();
|
|
||||||
}
|
|
||||||
|
|
||||||
slsDetector d(type);
|
|
||||||
d.setHostname(hostname);
|
|
||||||
d.setOnline(true);
|
|
||||||
CHECK(d.getStopPort() == DEFAULT_PORTNO + 1);
|
|
||||||
d.freeSharedMemory();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("single EIGER detector no receiver basic set and get",
|
|
||||||
"[.integration][eiger]") {
|
|
||||||
// TODO! this test should take command line arguments for config
|
|
||||||
SingleDetectorConfig c;
|
|
||||||
|
|
||||||
// Read type by connecting to the detector
|
|
||||||
auto type = slsDetector::getTypeFromDetector(c.hostname);
|
|
||||||
CHECK(type == c.type_enum);
|
|
||||||
|
|
||||||
// Create slsDetector of said type and set hostname and detector online
|
|
||||||
slsDetector d(type);
|
|
||||||
CHECK(d.getDetectorTypeAsEnum() == type);
|
|
||||||
CHECK(d.getDetectorTypeAsString() == c.type_string);
|
|
||||||
|
|
||||||
d.setHostname(c.hostname);
|
|
||||||
CHECK(d.getHostname() == c.hostname);
|
|
||||||
|
|
||||||
d.setOnline(true);
|
|
||||||
CHECK(d.getOnlineFlag() == true);
|
|
||||||
|
|
||||||
CHECK(d.getReceiverOnline() == false);
|
|
||||||
CHECK(d.checkDetectorVersionCompatibility() == slsDetectorDefs::OK);
|
|
||||||
|
|
||||||
// Setting and reading exposure time
|
|
||||||
auto t = 1000000000;
|
|
||||||
d.setTimer(slsDetectorDefs::timerIndex::ACQUISITION_TIME, t);
|
|
||||||
CHECK(d.setTimer(slsDetectorDefs::timerIndex::ACQUISITION_TIME) == t);
|
|
||||||
|
|
||||||
// size of an eiger half module with and without gap pixels
|
|
||||||
CHECK(d.getTotalNumberOfChannels() == 256 * 256 * 4);
|
|
||||||
CHECK(d.getTotalNumberOfChannels(slsDetectorDefs::dimension::X) == 1024);
|
|
||||||
CHECK(d.getTotalNumberOfChannels(slsDetectorDefs::dimension::Y) == 256);
|
|
||||||
// CHECK(d.getTotalNumberOfChannels(slsDetectorDefs::dimension::Z) == 1);
|
|
||||||
CHECK(d.getTotalNumberOfChannelsInclGapPixels(
|
|
||||||
slsDetectorDefs::dimension::X) == 1024);
|
|
||||||
CHECK(d.getTotalNumberOfChannelsInclGapPixels(
|
|
||||||
slsDetectorDefs::dimension::Y) == 256);
|
|
||||||
// CHECK(d.getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::dimension::Z)
|
|
||||||
// == 1);
|
|
||||||
|
|
||||||
CHECK(d.getNChans() == 256 * 256);
|
|
||||||
CHECK(d.getNChans(slsDetectorDefs::dimension::X) == 256);
|
|
||||||
CHECK(d.getNChans(slsDetectorDefs::dimension::Y) == 256);
|
|
||||||
// CHECK(d.getNChans(slsDetectorDefs::dimension::Z) == 1);
|
|
||||||
|
|
||||||
CHECK(d.getNChips() == 4);
|
|
||||||
CHECK(d.getNChips(slsDetectorDefs::dimension::X) == 4);
|
|
||||||
CHECK(d.getNChips(slsDetectorDefs::dimension::Y) == 1);
|
|
||||||
// CHECK(d.getNChips(slsDetectorDefs::dimension::Z) == 1);
|
|
||||||
|
|
||||||
d.freeSharedMemory();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("Locking mechanism and last ip", "[.integration][.single]") {
|
|
||||||
slsDetector d(type);
|
|
||||||
d.setHostname(hostname);
|
|
||||||
d.setOnline(true);
|
|
||||||
|
|
||||||
// Check that detector server is unlocked then lock
|
|
||||||
CHECK(d.lockServer() == 0);
|
|
||||||
d.lockServer(1);
|
|
||||||
CHECK(d.lockServer() == 1);
|
|
||||||
|
|
||||||
// Can we still access the detector while it's locked
|
|
||||||
auto t = 1300000000;
|
|
||||||
d.setTimer(slsDetectorDefs::timerIndex::ACQUISITION_TIME, t);
|
|
||||||
CHECK(d.setTimer(slsDetectorDefs::timerIndex::ACQUISITION_TIME) == t);
|
|
||||||
|
|
||||||
// unlock again and free
|
|
||||||
d.lockServer(0);
|
|
||||||
CHECK(d.lockServer() == 0);
|
|
||||||
|
|
||||||
CHECK(d.getLastClientIP() == my_ip);
|
|
||||||
d.freeSharedMemory();
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Set settings", "[.integration][.single]"){
|
|
||||||
slsDetector d(type);
|
|
||||||
d.setHostname(hostname);
|
|
||||||
d.setOnline(true);
|
|
||||||
CHECK(d.setSettings(defs::STANDARD) == defs::STANDARD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("Timer functions", "[.integration][cli]") {
|
|
||||||
// FRAME_NUMBER, /**< number of real time frames: total number of
|
|
||||||
// acquisitions is number or frames*number of cycles */ ACQUISITION_TIME,
|
|
||||||
// /**< exposure time */ FRAME_PERIOD, /**< period between exposures */
|
|
||||||
// DELAY_AFTER_TRIGGER, /**< delay between trigger and start of exposure or
|
|
||||||
// readout (in triggered mode) */ GATES_NUMBER, /**< number of gates per
|
|
||||||
// frame (in gated mode) */ CYCLES_NUMBER, /**< number of cycles: total
|
|
||||||
// number of acquisitions is number or frames*number of cycles */
|
|
||||||
// ACTUAL_TIME, /**< Actual time of the detector's internal timer */
|
|
||||||
// MEASUREMENT_TIME, /**< Time of the measurement from the detector (fifo)
|
|
||||||
// */
|
|
||||||
|
|
||||||
// PROGRESS, /**< fraction of measurement elapsed - only get! */
|
|
||||||
// MEASUREMENTS_NUMBER,
|
|
||||||
// FRAMES_FROM_START,
|
|
||||||
// FRAMES_FROM_START_PG,
|
|
||||||
// SAMPLES,
|
|
||||||
// SUBFRAME_ACQUISITION_TIME, /**< subframe exposure time */
|
|
||||||
// STORAGE_CELL_NUMBER, /**<number of storage cells */
|
|
||||||
// SUBFRAME_DEADTIME, /**< subframe deadtime */
|
|
||||||
// MEASURED_PERIOD, /**< measured period */
|
|
||||||
// MEASURED_SUBPERIOD, /**< measured subperiod */
|
|
||||||
// MAX_TIMERS
|
|
||||||
|
|
||||||
slsDetector d(type);
|
|
||||||
d.setHostname(hostname);
|
|
||||||
d.setOnline(true);
|
|
||||||
|
|
||||||
// Number of frames
|
|
||||||
auto frames = 5;
|
|
||||||
d.setTimer(slsDetectorDefs::timerIndex::FRAME_NUMBER, frames);
|
|
||||||
CHECK(d.setTimer(slsDetectorDefs::timerIndex::FRAME_NUMBER) == frames);
|
|
||||||
|
|
||||||
auto exptime = 2000000000;
|
|
||||||
d.setTimer(slsDetectorDefs::timerIndex::ACQUISITION_TIME, exptime);
|
|
||||||
CHECK(d.setTimer(slsDetectorDefs::timerIndex::ACQUISITION_TIME) == exptime);
|
|
||||||
|
|
||||||
auto period = 2000000000;
|
|
||||||
d.setTimer(slsDetectorDefs::timerIndex::FRAME_PERIOD, period);
|
|
||||||
CHECK(d.setTimer(slsDetectorDefs::timerIndex::FRAME_PERIOD) == period);
|
|
||||||
|
|
||||||
if (type != dt::EIGER) {
|
|
||||||
auto delay = 10000;
|
|
||||||
d.setTimer(slsDetectorDefs::timerIndex::DELAY_AFTER_TRIGGER, delay);
|
|
||||||
CHECK(d.setTimer(slsDetectorDefs::timerIndex::DELAY_AFTER_TRIGGER) ==
|
|
||||||
delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type != dt::EIGER) {
|
|
||||||
auto gates = 1;
|
|
||||||
d.setTimer(slsDetectorDefs::timerIndex::GATES_NUMBER, gates);
|
|
||||||
CHECK(d.setTimer(slsDetectorDefs::timerIndex::GATES_NUMBER) == gates);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto cycles = 2;
|
|
||||||
d.setTimer(slsDetectorDefs::timerIndex::CYCLES_NUMBER, cycles);
|
|
||||||
CHECK(d.setTimer(slsDetectorDefs::timerIndex::CYCLES_NUMBER) == cycles);
|
|
||||||
|
|
||||||
if (type == dt::EIGER) {
|
|
||||||
auto subtime = 200;
|
|
||||||
d.setTimer(slsDetectorDefs::timerIndex::SUBFRAME_ACQUISITION_TIME,
|
|
||||||
subtime);
|
|
||||||
CHECK(d.setTimer(
|
|
||||||
slsDetectorDefs::timerIndex::SUBFRAME_ACQUISITION_TIME) ==
|
|
||||||
subtime);
|
|
||||||
}
|
|
||||||
// for (int i =0; i!=frames; ++i)
|
|
||||||
d.startAndReadAll();
|
|
||||||
|
|
||||||
d.freeSharedMemory();
|
|
||||||
|
|
||||||
// If we add a timer we should add tests for the timer
|
|
||||||
CHECK(slsDetectorDefs::MAX_TIMERS == 19);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TEST_CASE("Aquire", "[.integration][eiger]"){
|
|
||||||
// SingleDetectorConfig c;
|
|
||||||
// auto type = slsDetector::getTypeFromDetector(c.hostname);
|
|
||||||
// slsDetector d(type);
|
|
||||||
// d.setHostname(c.hostname);
|
|
||||||
// d.setOnline(true);
|
|
||||||
|
|
||||||
// auto period = 1000000000;
|
|
||||||
// auto exptime = 100000000;
|
|
||||||
// d.setTimer(slsDetectorDefs::timerIndex::FRAME_NUMBER, 5);
|
|
||||||
// d.setTimer(slsDetectorDefs::timerIndex::ACQUISITION_TIME, exptime);
|
|
||||||
// d.setTimer(slsDetectorDefs::timerIndex::FRAME_PERIOD, period);
|
|
||||||
// d.startAndReadAll();
|
|
||||||
|
|
||||||
// auto rperiod =
|
|
||||||
// d.getTimeLeft(slsDetectorDefs::timerIndex::MEASURED_PERIOD);
|
|
||||||
// CHECK(rperiod == 0.1);
|
|
||||||
|
|
||||||
// d.freeSharedMemory();
|
|
||||||
// }
|
|
||||||
|
|
||||||
TEST_CASE(
|
|
||||||
"Eiger Dynamic Range with effect on rate correction and clock divider",
|
|
||||||
"[.eigerintegration]") {
|
|
||||||
SingleDetectorConfig c;
|
|
||||||
|
|
||||||
int ratecorr = 125;
|
|
||||||
|
|
||||||
// pick up multi detector from shm id 0
|
|
||||||
multiSlsDetector m(0);
|
|
||||||
|
|
||||||
// ensure eiger detector type, hostname and online
|
|
||||||
REQUIRE(m.getDetectorTypeAsEnum() == c.type_enum);
|
|
||||||
REQUIRE(m.getHostname() == c.hostname);
|
|
||||||
REQUIRE(m.setOnline(true) == slsDetectorDefs::ONLINE_FLAG);
|
|
||||||
|
|
||||||
// starting state with rate correction off
|
|
||||||
CHECK(m.setRateCorrection(0) == 0);
|
|
||||||
|
|
||||||
// dr 16: clk divider, no change for ratecorr
|
|
||||||
CHECK(m.setDynamicRange(16) == 16);
|
|
||||||
CHECK(m.setSpeed(slsDetectorDefs::CLOCK_DIVIDER) == 1);
|
|
||||||
CHECK(m.getRateCorrection() == 0);
|
|
||||||
|
|
||||||
// dr 32: clk divider, no change for ratecorr
|
|
||||||
CHECK(m.setDynamicRange(32) == 32);
|
|
||||||
CHECK(m.setSpeed(slsDetectorDefs::CLOCK_DIVIDER) == 2);
|
|
||||||
CHECK(m.getRateCorrection() == 0);
|
|
||||||
|
|
||||||
// other drs: no change for clk divider, no change for ratecorr
|
|
||||||
CHECK(m.setDynamicRange(8) == 8);
|
|
||||||
CHECK(m.setSpeed(slsDetectorDefs::CLOCK_DIVIDER) == 2);
|
|
||||||
CHECK(m.getRateCorrection() == 0);
|
|
||||||
CHECK(m.setDynamicRange(4) == 4);
|
|
||||||
CHECK(m.setSpeed(slsDetectorDefs::CLOCK_DIVIDER) == 2);
|
|
||||||
CHECK(m.getRateCorrection() == 0);
|
|
||||||
|
|
||||||
// switching on rate correction with dr 16, 32
|
|
||||||
m.setDynamicRange(16);
|
|
||||||
m.setRateCorrection(ratecorr);
|
|
||||||
CHECK(m.getRateCorrection() == ratecorr);
|
|
||||||
m.setDynamicRange(32);
|
|
||||||
CHECK(m.getRateCorrection() == ratecorr);
|
|
||||||
|
|
||||||
// ratecorr fail with dr 4 or 8
|
|
||||||
CHECK_THROWS_AS(m.setDynamicRange(8), sls::NonCriticalError);
|
|
||||||
CHECK(m.getRateCorrection() == 0);
|
|
||||||
m.setDynamicRange(16);
|
|
||||||
m.setDynamicRange(16);
|
|
||||||
m.setRateCorrection(ratecorr);
|
|
||||||
m.setDynamicRange(16);
|
|
||||||
m.setRateCorrection(ratecorr);
|
|
||||||
CHECK_THROWS_AS(m.setDynamicRange(4), sls::NonCriticalError);
|
|
||||||
CHECK(m.getRateCorrection() == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Chiptestboard Loading Patterns", "[.ctbintegration]") {
|
|
||||||
SingleDetectorConfig c;
|
|
||||||
|
|
||||||
// pick up multi detector from shm id 0
|
|
||||||
multiSlsDetector m(0);
|
|
||||||
|
|
||||||
// ensure ctb detector type, hostname and online
|
|
||||||
REQUIRE(m.getDetectorTypeAsEnum() == c.type_enum);
|
|
||||||
REQUIRE(m.getHostname() == c.hostname);
|
|
||||||
REQUIRE(m.setOnline(true) == slsDetectorDefs::ONLINE_FLAG);
|
|
||||||
|
|
||||||
uint64_t word = 0;
|
|
||||||
int addr = 0;
|
|
||||||
int level = 0;
|
|
||||||
const int MAX_ADDR = 0x7fff;
|
|
||||||
|
|
||||||
word = 0xc000000000f47ff;
|
|
||||||
CHECK(m.setPatternIOControl(word) == word);
|
|
||||||
CHECK(m.setPatternIOControl(-1) == word);
|
|
||||||
CHECK(m.setPatternIOControl(0) == 0);
|
|
||||||
|
|
||||||
CHECK(m.setPatternClockControl(word) == word);
|
|
||||||
CHECK(m.setPatternClockControl(-1) == word);
|
|
||||||
CHECK(m.setPatternClockControl(0) == 0);
|
|
||||||
|
|
||||||
// testing pattern word will execute the pattern as well
|
|
||||||
addr = 0;
|
|
||||||
m.setPatternWord(addr, word);
|
|
||||||
CHECK(m.setPatternWord(addr, -1) == word);
|
|
||||||
addr = MAX_ADDR - 1;
|
|
||||||
m.setPatternWord(addr, word);
|
|
||||||
CHECK(m.setPatternWord(addr, -1) == word);
|
|
||||||
addr = 0x2FF;
|
|
||||||
m.setPatternWord(addr, word);
|
|
||||||
CHECK(m.setPatternWord(addr, -1) == word);
|
|
||||||
addr = MAX_ADDR;
|
|
||||||
CHECK_THROWS_AS(m.setPatternWord(addr, word), sls::NonCriticalError);
|
|
||||||
CHECK_THROWS_WITH(m.setPatternWord(addr, word),
|
|
||||||
Catch::Matchers::Contains("be between 0 and"));
|
|
||||||
addr = -1;
|
|
||||||
CHECK_THROWS_AS(m.setPatternWord(addr, word), sls::NonCriticalError);
|
|
||||||
CHECK_THROWS_WITH(m.setPatternWord(addr, word),
|
|
||||||
Catch::Matchers::Contains("be between 0 and"));
|
|
||||||
|
|
||||||
addr = 0x2FF;
|
|
||||||
for (level = 0; level < 3; ++level) {
|
|
||||||
CHECK(m.setPatternWaitAddr(level, addr) == addr);
|
|
||||||
CHECK(m.setPatternWaitAddr(level, -1) == addr);
|
|
||||||
}
|
|
||||||
CHECK_THROWS_WITH(m.setPatternWaitAddr(-1, addr),
|
|
||||||
Catch::Matchers::Contains("be between 0 and"));
|
|
||||||
CHECK_THROWS_WITH(m.setPatternWaitAddr(0, MAX_ADDR),
|
|
||||||
Catch::Matchers::Contains("be between 0 and"));
|
|
||||||
|
|
||||||
for (level = 0; level < 3; ++level) {
|
|
||||||
CHECK(m.setPatternWaitTime(level, word) == word);
|
|
||||||
CHECK(m.setPatternWaitTime(level, -1) == word);
|
|
||||||
}
|
|
||||||
CHECK_THROWS_WITH(m.setPatternWaitTime(-1, word),
|
|
||||||
Catch::Matchers::Contains("be between 0 and"));
|
|
||||||
|
|
||||||
{
|
|
||||||
int startaddr = addr;
|
|
||||||
int stopaddr = addr + 5;
|
|
||||||
int nloops = 2;
|
|
||||||
for (level = 0; level < 3; ++level) {
|
|
||||||
m.setPatternLoops(level, startaddr, stopaddr, nloops);
|
|
||||||
auto r = m.getPatternLoops(level);
|
|
||||||
CHECK(r[0] == startaddr);
|
|
||||||
CHECK(r[1] == stopaddr);
|
|
||||||
CHECK(r[2] == nloops);
|
|
||||||
}
|
|
||||||
m.setPatternLoops(-1, startaddr, stopaddr, nloops);
|
|
||||||
auto r = m.getPatternLoops(-1);
|
|
||||||
CHECK(r[0] == startaddr);
|
|
||||||
CHECK(r[1] == stopaddr);
|
|
||||||
CHECK(r[2] == -1);
|
|
||||||
|
|
||||||
CHECK_THROWS_WITH(m.setPatternLoops(-1, startaddr, MAX_ADDR, nloops),
|
|
||||||
Catch::Matchers::Contains("be less than"));
|
|
||||||
CHECK_THROWS_WITH(m.setPatternLoops(-1, MAX_ADDR, stopaddr, nloops),
|
|
||||||
Catch::Matchers::Contains("be less than"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("Chiptestboard Dbit offset, list, sampling, advinvert", "[.ctbintegration][dbit]") {
|
|
||||||
SingleDetectorConfig c;
|
|
||||||
|
|
||||||
// pick up multi detector from shm id 0
|
|
||||||
multiSlsDetector m(0);
|
|
||||||
|
|
||||||
// ensure ctb detector type, hostname and online
|
|
||||||
REQUIRE(m.getDetectorTypeAsEnum() == c.type_enum);
|
|
||||||
REQUIRE(m.getHostname() == c.hostname);
|
|
||||||
REQUIRE(m.setOnline(true) == slsDetectorDefs::ONLINE_FLAG);
|
|
||||||
|
|
||||||
// dbit offset
|
|
||||||
m.setReceiverDbitOffset(0);
|
|
||||||
CHECK(m.getReceiverDbitOffset() == 0);
|
|
||||||
m.setReceiverDbitOffset(-1);
|
|
||||||
CHECK(m.getReceiverDbitOffset() == 0);
|
|
||||||
m.setReceiverDbitOffset(5);
|
|
||||||
CHECK(m.getReceiverDbitOffset() == 5);
|
|
||||||
|
|
||||||
// dbit list
|
|
||||||
|
|
||||||
std::vector <int> list = m.getReceiverDbitList();
|
|
||||||
list.clear();
|
|
||||||
for (int i = 0; i < 10; ++i)
|
|
||||||
list.push_back(i);
|
|
||||||
m.setReceiverDbitList(list);
|
|
||||||
|
|
||||||
CHECK(m.getReceiverDbitList().size() == 10);
|
|
||||||
|
|
||||||
list.push_back(64);
|
|
||||||
CHECK_THROWS_AS(m.setReceiverDbitList(list), sls::RuntimeError);
|
|
||||||
CHECK_THROWS_WITH(m.setReceiverDbitList(list),
|
|
||||||
Catch::Matchers::Contains("be between 0 and 63"));
|
|
||||||
|
|
||||||
list.clear();
|
|
||||||
for (int i = 0; i < 65; ++i)
|
|
||||||
list.push_back(i);
|
|
||||||
CHECK(list.size() == 65);
|
|
||||||
CHECK_THROWS_WITH(m.setReceiverDbitList(list),
|
|
||||||
Catch::Matchers::Contains("be greater than 64"));
|
|
||||||
|
|
||||||
list.clear();
|
|
||||||
m.setReceiverDbitList(list);
|
|
||||||
CHECK(m.getReceiverDbitList().empty());
|
|
||||||
|
|
||||||
// adcinvert
|
|
||||||
m.setADCInvert(0);
|
|
||||||
CHECK(m.getADCInvert() == 0);
|
|
||||||
m.setADCInvert(5);
|
|
||||||
CHECK(m.getADCInvert() == 5);
|
|
||||||
m.setADCInvert(-1);
|
|
||||||
CHECK(m.getADCInvert() == -1);
|
|
||||||
|
|
||||||
// ext sampling reg
|
|
||||||
m.setExternalSamplingSource(0);
|
|
||||||
CHECK(m.getExternalSamplingSource() == 0);
|
|
||||||
m.setExternalSamplingSource(62);
|
|
||||||
CHECK(m.getExternalSamplingSource() == 62);
|
|
||||||
CHECK_THROWS_WITH(m.setExternalSamplingSource(64),
|
|
||||||
Catch::Matchers::Contains("be 0-63"));
|
|
||||||
CHECK(m.getExternalSamplingSource() == 62);
|
|
||||||
m.setExternalSampling(1);
|
|
||||||
CHECK(m.getExternalSampling() == 1);
|
|
||||||
m.setExternalSampling(0);
|
|
||||||
CHECK(m.getExternalSampling() == 0);
|
|
||||||
m.setExternalSampling(1);
|
|
||||||
CHECK(m.getExternalSampling() == 1);
|
|
||||||
CHECK(m.readRegister(0x7b) == 0x1003E);
|
|
||||||
|
|
||||||
}
|
|
@ -1,110 +0,0 @@
|
|||||||
#include "catch.hpp"
|
|
||||||
#include "multiSlsDetector.h"
|
|
||||||
#include "string_utils.h"
|
|
||||||
#include "tests/globals.h"
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
using namespace Catch::literals;
|
|
||||||
|
|
||||||
TEST_CASE("Initialize a multi detector", "[.integration][.multi]") {
|
|
||||||
auto hostnames = sls::split(hostname, '+');
|
|
||||||
|
|
||||||
multiSlsDetector d(0, true, true);
|
|
||||||
d.setHostname(hostname.c_str());
|
|
||||||
REQUIRE(d.setOnline() == true); // get!
|
|
||||||
|
|
||||||
CHECK(d.getHostname() == hostname);
|
|
||||||
for (size_t i = 0; i != hostnames.size(); ++i) {
|
|
||||||
CHECK(d.getHostname(i) == hostnames[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
CHECK(d.getDetectorTypeAsEnum() == type);
|
|
||||||
CHECK(d.getDetectorTypeAsString() == detector_type);
|
|
||||||
|
|
||||||
CHECK(d.getNumberOfDetectors() == hostnames.size());
|
|
||||||
d.freeSharedMemory();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("Set and read timers", "[.integration][.multi]") {
|
|
||||||
|
|
||||||
multiSlsDetector d(0, true, true);
|
|
||||||
d.setHostname(hostname.c_str());
|
|
||||||
|
|
||||||
// FRAME_NUMBER
|
|
||||||
int n_frames = 3;
|
|
||||||
d.setNumberOfFrames(n_frames);
|
|
||||||
CHECK(d.setNumberOfFrames() == n_frames);
|
|
||||||
|
|
||||||
// ACQUISITION_TIME
|
|
||||||
double exptime = 0.3;
|
|
||||||
d.setExposureTime(exptime, true);
|
|
||||||
CHECK(d.setExposureTime(-1, true) == Approx(exptime));
|
|
||||||
CHECK(d.setExposureTime(-1) == Approx(exptime * 1E9));
|
|
||||||
|
|
||||||
// FRAME_PERIOD,
|
|
||||||
double period = 0.5;
|
|
||||||
d.setExposurePeriod(period, true);
|
|
||||||
CHECK(d.setExposurePeriod(-1, true) == Approx(period));
|
|
||||||
CHECK(d.setExposurePeriod(-1) == Approx(period * 1E9));
|
|
||||||
|
|
||||||
// DELAY_AFTER_TRIGGER,
|
|
||||||
// GATES_NUMBER,
|
|
||||||
// CYCLES_NUMBER,
|
|
||||||
// ACTUAL_TIME
|
|
||||||
// MEASUREMENT_TIME
|
|
||||||
|
|
||||||
// PROGRESS, /**< fraction of measurement elapsed - only get! */
|
|
||||||
// MEASUREMENTS_NUMBER,
|
|
||||||
|
|
||||||
int measurements = 2;
|
|
||||||
d.setTimer(ti::MEASUREMENTS_NUMBER, measurements);
|
|
||||||
CHECK(d.setTimer(ti::MEASUREMENTS_NUMBER, -1) == measurements);
|
|
||||||
|
|
||||||
// FRAMES_FROM_START,
|
|
||||||
// FRAMES_FROM_START_PG,
|
|
||||||
// SAMPLES,
|
|
||||||
|
|
||||||
// SUBFRAME_ACQUISITION_TIME, /**< subframe exposure time */
|
|
||||||
double subframe_exposure = 2000000; // ns
|
|
||||||
if (type == dt::EIGER) {
|
|
||||||
d.setSubFrameExposureTime(subframe_exposure);
|
|
||||||
CHECK(d.setSubFrameExposureTime(-1) == Approx(subframe_exposure));
|
|
||||||
}
|
|
||||||
|
|
||||||
// STORAGE_CELL_NUMBER, /**<number of storage cells */
|
|
||||||
|
|
||||||
// SUBFRAME_DEADTIME, /**< subframe deadtime */
|
|
||||||
double subframe_deadtime = 4000; // ns
|
|
||||||
if (type == dt::EIGER) {
|
|
||||||
d.setSubFrameExposureDeadTime(subframe_deadtime);
|
|
||||||
CHECK(d.setSubFrameExposureDeadTime(-1) == Approx(subframe_deadtime));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (type == dt::EIGER) {
|
|
||||||
// 32bit is needed for subframe exposure
|
|
||||||
d.setDynamicRange(32);
|
|
||||||
CHECK(d.setDynamicRange(-1) == 32);
|
|
||||||
d.setReadOutFlags(ro::PARALLEL);
|
|
||||||
|
|
||||||
// Needed to have measured values
|
|
||||||
d.acquire();
|
|
||||||
|
|
||||||
// MEASURED_PERIOD, /**< measured period */
|
|
||||||
for (int i = 0; i != d.getNumberOfDetectors(); ++i) {
|
|
||||||
CHECK(d.getMeasuredPeriod(true, i) == Approx(period));
|
|
||||||
}
|
|
||||||
|
|
||||||
// MEASURED_SUBPERIOD, /**< measured subperiod */
|
|
||||||
for (int i = 0; i != d.getNumberOfDetectors(); ++i) {
|
|
||||||
CHECK(d.getMeasuredSubFramePeriod(false, i) ==
|
|
||||||
Approx(subframe_deadtime + subframe_exposure));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MAX_TIMERS
|
|
||||||
|
|
||||||
d.freeSharedMemory();
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
// tests-main.cpp
|
|
||||||
#define CATCH_CONFIG_MAIN
|
|
||||||
#include "catch.hpp"
|
|
0
manual/Makefile
Executable file → Normal file
0
manual/index.html
Executable file → Normal file
9
manual/manual-api/CMakeLists.txt
Executable file → Normal file
@ -3,8 +3,8 @@ set(SOURCES
|
|||||||
)
|
)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
../../slsSupportLib/include
|
|
||||||
../../slsReceiverSoftware/include
|
../../slsReceiverSoftware/include
|
||||||
|
../../slsDetectorSoftware/slsDetectorAnalysis
|
||||||
../../build/bin
|
../../build/bin
|
||||||
../../slsdetectorSoftware/slsDetector
|
../../slsdetectorSoftware/slsDetector
|
||||||
)
|
)
|
||||||
@ -16,12 +16,15 @@ add_executable(slsMultiReceiver
|
|||||||
target_link_libraries(slsMultiReceiver
|
target_link_libraries(slsMultiReceiver
|
||||||
slsReceiverShared
|
slsReceiverShared
|
||||||
pthread
|
pthread
|
||||||
${ZeroMQ_LIBRARIES}
|
zmq
|
||||||
rt
|
rt
|
||||||
|
${HDF5_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
if (HDF5_FOUND)
|
if (HDF5_FOUND)
|
||||||
target_link_libraries(slsMultiReceiver ${HDF5_LIBRARIES})
|
target_link_libraries(slsMultiReceiver
|
||||||
|
${HDF5_LIBRARIES}
|
||||||
|
)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
|
6
manual/manual-api/Makefile
Executable file → Normal file
@ -1,9 +1,9 @@
|
|||||||
PKGDIR = ../..
|
PKGDIR = ../..
|
||||||
LIBDIR = $(PKGDIR)/bin
|
LIBDIR = $(PKGDIR)/build/bin
|
||||||
INCLUDES = -I . -I$(PKGDIR)/slsSupportLib/include -I$(LIBDIR) -I$(PKGDIR)/slsDetectorSoftware/slsDetector -I$(PKGDIR)/slsReceiversoftware/include
|
INCLUDES = -I . -I$(PKGDIR)/slsReceiverSoftware/include -I$(PKGDIR)/slsDetectorSoftware/slsDetectorAnalysis -I$(LIBDIR) -I$(PKGDIR)/slsDetectorSoftware/slsDetector
|
||||||
SRC_DET = mainClient.cpp
|
SRC_DET = mainClient.cpp
|
||||||
SRC_REC = mainReceiver.cpp
|
SRC_REC = mainReceiver.cpp
|
||||||
ZMQLIBDIR = $(PKGDIR)/slsSupportLib/include
|
ZMQLIBDIR = $(PKGDIR)/slsReceiverSoftware/include
|
||||||
LDFLAG_DET = -I. -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread -lrt -L$(ZMQLIBDIR) -Wl,-rpath=$(ZMQLIBDIR) -lzmq
|
LDFLAG_DET = -I. -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread -lrt -L$(ZMQLIBDIR) -Wl,-rpath=$(ZMQLIBDIR) -lzmq
|
||||||
LDFLAG_REC = -I. -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread -lrt -L$(ZMQLIBDIR) -Wl,-rpath=$(ZMQLIBDIR) -lzmq
|
LDFLAG_REC = -I. -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread -lrt -L$(ZMQLIBDIR) -Wl,-rpath=$(ZMQLIBDIR) -lzmq
|
||||||
DESTDIR ?= ../docs
|
DESTDIR ?= ../docs
|
||||||
|
0
manual/manual-api/mainClient.cpp
Executable file → Normal file
54
manual/manual-api/mainReceiver.cpp
Executable file → Normal file
@ -16,21 +16,21 @@ It is linked in manual/manual-api from slsReceiverSoftware/include ]
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sls_detector_defs.h"
|
#include "sls_receiver_defs.h"
|
||||||
#include "slsReceiverUsers.h"
|
#include "slsReceiverUsers.h"
|
||||||
|
|
||||||
#include <csignal> //SIGINT
|
|
||||||
#include <cstdlib> //system
|
|
||||||
#include <cstring>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h> //SIGINT
|
||||||
|
#include <cstdlib> //system
|
||||||
//#include "utilities.h"
|
//#include "utilities.h"
|
||||||
//#include "logger.h"
|
//#include "logger.h"
|
||||||
#include <cerrno>
|
|
||||||
#include <string>
|
|
||||||
#include <sys/types.h> //wait
|
#include <sys/types.h> //wait
|
||||||
#include <sys/wait.h> //wait
|
#include <sys/wait.h> //wait
|
||||||
#include <syscall.h> //tid
|
#include <string>
|
||||||
#include <unistd.h> //usleep
|
#include <unistd.h> //usleep
|
||||||
|
#include <errno.h>
|
||||||
|
#include <syscall.h> //tid
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
@ -96,20 +96,20 @@ void AcquisitionFinished(uint64_t frames, void*p){
|
|||||||
* @param p pointer to object
|
* @param p pointer to object
|
||||||
*/
|
*/
|
||||||
void GetData(char* metadata, char* datapointer, uint32_t datasize, void* p){
|
void GetData(char* metadata, char* datapointer, uint32_t datasize, void* p){
|
||||||
slsDetectorDefs::sls_receiver_header* header = (slsDetectorDefs::sls_receiver_header*)metadata;
|
slsReceiverDefs::sls_receiver_header* header = (slsReceiverDefs::sls_receiver_header*)metadata;
|
||||||
slsDetectorDefs::sls_detector_header detectorHeader = header->detHeader;
|
slsReceiverDefs::sls_detector_header detectorHeader = header->detHeader;
|
||||||
|
|
||||||
PRINT_IN_COLOR (detectorHeader.modId?detectorHeader.modId:detectorHeader.row,
|
PRINT_IN_COLOR (detectorHeader.modId?detectorHeader.modId:detectorHeader.row,
|
||||||
"#### %d GetData: ####\n"
|
"#### %d GetData: ####\n"
|
||||||
"frameNumber: %lu\t\texpLength: %u\t\tpacketNumber: %u\t\tbunchId: %lu"
|
"frameNumber: %llu\t\texpLength: %u\t\tpacketNumber: %u\t\tbunchId: %llu"
|
||||||
"\t\ttimestamp: %lu\t\tmodId: %u\t\t"
|
"\t\ttimestamp: %llu\t\tmodId: %u\t\t"
|
||||||
"row: %u\t\tcolumn: %u\t\treserved: %u\t\tdebug: %u"
|
"row: %u\t\tcolumn: %u\t\treserved: %u\t\tdebug: %u"
|
||||||
"\t\troundRNumber: %u\t\tdetType: %u\t\tversion: %u"
|
"\t\troundRNumber: %u\t\tdetType: %u\t\tversion: %u"
|
||||||
//"\t\tpacketsMask:%s"
|
//"\t\tpacketsMask:%s"
|
||||||
"\t\tfirstbytedata: 0x%x\t\tdatsize: %u\n\n",
|
"\t\tfirstbytedata: 0x%x\t\tdatsize: %u\n\n",
|
||||||
detectorHeader.row, (long unsigned int)detectorHeader.frameNumber,
|
detectorHeader.row, (long long unsigned int)detectorHeader.frameNumber,
|
||||||
detectorHeader.expLength, detectorHeader.packetNumber, (long unsigned int)detectorHeader.bunchId,
|
detectorHeader.expLength, detectorHeader.packetNumber, (long long unsigned int)detectorHeader.bunchId,
|
||||||
(long unsigned int)detectorHeader.timestamp, detectorHeader.modId,
|
(long long unsigned int)detectorHeader.timestamp, detectorHeader.modId,
|
||||||
detectorHeader.row, detectorHeader.column, detectorHeader.reserved,
|
detectorHeader.row, detectorHeader.column, detectorHeader.reserved,
|
||||||
detectorHeader.debug, detectorHeader.roundRNumber,
|
detectorHeader.debug, detectorHeader.roundRNumber,
|
||||||
detectorHeader.detType, detectorHeader.version,
|
detectorHeader.detType, detectorHeader.version,
|
||||||
@ -130,8 +130,8 @@ void GetData(char* metadata, char* datapointer, uint32_t datasize, void* p){
|
|||||||
* @param p pointer to object
|
* @param p pointer to object
|
||||||
*/
|
*/
|
||||||
void GetData(char* metadata, char* datapointer, uint32_t &revDatasize, void* p){
|
void GetData(char* metadata, char* datapointer, uint32_t &revDatasize, void* p){
|
||||||
slsDetectorDefs::sls_receiver_header* header = (slsDetectorDefs::sls_receiver_header*)metadata;
|
slsReceiverDefs::sls_receiver_header* header = (slsReceiverDefs::sls_receiver_header*)metadata;
|
||||||
slsDetectorDefs::sls_detector_header detectorHeader = header->detHeader;
|
slsReceiverDefs::sls_detector_header detectorHeader = header->detHeader;
|
||||||
|
|
||||||
PRINT_IN_COLOR (detectorHeader.modId?detectorHeader.modId:detectorHeader.row,
|
PRINT_IN_COLOR (detectorHeader.modId?detectorHeader.modId:detectorHeader.row,
|
||||||
"#### %d GetData: ####\n"
|
"#### %d GetData: ####\n"
|
||||||
@ -187,7 +187,7 @@ int main(int argc, char *argv[]) {
|
|||||||
sa.sa_flags=0; // no flags
|
sa.sa_flags=0; // no flags
|
||||||
sa.sa_handler=sigInterruptHandler; // handler function
|
sa.sa_handler=sigInterruptHandler; // handler function
|
||||||
sigemptyset(&sa.sa_mask); // dont block additional signals during invocation of handler
|
sigemptyset(&sa.sa_mask); // dont block additional signals during invocation of handler
|
||||||
if (sigaction(SIGINT, &sa, nullptr) == -1) {
|
if (sigaction(SIGINT, &sa, NULL) == -1) {
|
||||||
cprintf(RED, "Could not set handler function for SIGINT\n");
|
cprintf(RED, "Could not set handler function for SIGINT\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,7 +197,7 @@ int main(int argc, char *argv[]) {
|
|||||||
asa.sa_flags=0; // no flags
|
asa.sa_flags=0; // no flags
|
||||||
asa.sa_handler=SIG_IGN; // handler function
|
asa.sa_handler=SIG_IGN; // handler function
|
||||||
sigemptyset(&asa.sa_mask); // dont block additional signals during invocation of handler
|
sigemptyset(&asa.sa_mask); // dont block additional signals during invocation of handler
|
||||||
if (sigaction(SIGPIPE, &asa, nullptr) == -1) {
|
if (sigaction(SIGPIPE, &asa, NULL) == -1) {
|
||||||
cprintf(RED, "Could not set handler function for SIGPIPE\n");
|
cprintf(RED, "Could not set handler function for SIGPIPE\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,10 +221,10 @@ int main(int argc, char *argv[]) {
|
|||||||
char temp[10];
|
char temp[10];
|
||||||
sprintf(temp,"%d",startTCPPort + i);
|
sprintf(temp,"%d",startTCPPort + i);
|
||||||
char* args[] = {(char*)"ignored", (char*)"--rx_tcpport", temp};
|
char* args[] = {(char*)"ignored", (char*)"--rx_tcpport", temp};
|
||||||
int ret = slsDetectorDefs::OK;
|
int ret = slsReceiverDefs::OK;
|
||||||
/** - create slsReceiverUsers object with appropriate arguments */
|
/** - create slsReceiverUsers object with appropriate arguments */
|
||||||
slsReceiverUsers *receiver = new slsReceiverUsers(3, args, ret);
|
slsReceiverUsers *receiver = new slsReceiverUsers(3, args, ret);
|
||||||
if(ret==slsDetectorDefs::FAIL){
|
if(ret==slsReceiverDefs::FAIL){
|
||||||
delete receiver;
|
delete receiver;
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@ -236,22 +236,22 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
/** - Call back for start acquisition */
|
/** - Call back for start acquisition */
|
||||||
cprintf(BLUE, "Registering StartAcq()\n");
|
cprintf(BLUE, "Registering StartAcq()\n");
|
||||||
receiver->registerCallBackStartAcquisition(StartAcq, nullptr);
|
receiver->registerCallBackStartAcquisition(StartAcq, NULL);
|
||||||
|
|
||||||
/** - Call back for acquisition finished */
|
/** - Call back for acquisition finished */
|
||||||
cprintf(BLUE, "Registering AcquisitionFinished()\n");
|
cprintf(BLUE, "Registering AcquisitionFinished()\n");
|
||||||
receiver->registerCallBackAcquisitionFinished(AcquisitionFinished, nullptr);
|
receiver->registerCallBackAcquisitionFinished(AcquisitionFinished, NULL);
|
||||||
|
|
||||||
/* - Call back for raw data */
|
/* - Call back for raw data */
|
||||||
cprintf(BLUE, "Registering GetData() \n");
|
cprintf(BLUE, "Registering GetData() \n");
|
||||||
if (withCallback == 1) receiver->registerCallBackRawDataReady(GetData,nullptr);
|
if (withCallback == 1) receiver->registerCallBackRawDataReady(GetData,NULL);
|
||||||
else if (withCallback == 2) receiver->registerCallBackRawDataModifyReady(GetData,nullptr);
|
else if (withCallback == 2) receiver->registerCallBackRawDataModifyReady(GetData,NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** - start tcp server thread */
|
/** - start tcp server thread */
|
||||||
if (receiver->start() == slsDetectorDefs::FAIL){
|
if (receiver->start() == slsReceiverDefs::FAIL){
|
||||||
delete receiver;
|
delete receiver;
|
||||||
cprintf(BLUE,"Exiting Child Process [ Tid: %ld ]\n", (long)syscall(SYS_gettid));
|
cprintf(BLUE,"Exiting Child Process [ Tid: %ld ]\n", (long)syscall(SYS_gettid));
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
@ -272,7 +272,7 @@ int main(int argc, char *argv[]) {
|
|||||||
sa.sa_flags=0; // no flags
|
sa.sa_flags=0; // no flags
|
||||||
sa.sa_handler=SIG_IGN; // handler function
|
sa.sa_handler=SIG_IGN; // handler function
|
||||||
sigemptyset(&sa.sa_mask); // dont block additional signals during invocation of handler
|
sigemptyset(&sa.sa_mask); // dont block additional signals during invocation of handler
|
||||||
if (sigaction(SIGINT, &sa, nullptr) == -1) {
|
if (sigaction(SIGINT, &sa, NULL) == -1) {
|
||||||
cprintf(RED, "Could not set handler function for SIGINT\n");
|
cprintf(RED, "Could not set handler function for SIGINT\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,7 +283,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
/** - Parent process waits for all child processes to exit */
|
/** - Parent process waits for all child processes to exit */
|
||||||
for(;;) {
|
for(;;) {
|
||||||
pid_t childPid = waitpid (-1, nullptr, 0);
|
pid_t childPid = waitpid (-1, NULL, 0);
|
||||||
|
|
||||||
// no child closed
|
// no child closed
|
||||||
if (childPid == -1) {
|
if (childPid == -1) {
|
||||||
|
0
manual/manual-api/slsDetectorUsers.doxy
Executable file → Normal file
0
manual/manual-calwiz/Advanced.png
Executable file → Normal file
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
0
manual/manual-calwiz/Constant_step.png
Executable file → Normal file
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
0
manual/manual-calwiz/GUI_Advanced.eps
Executable file → Normal file
0
manual/manual-calwiz/GUI_ThresholdScan.eps
Executable file → Normal file
0
manual/manual-calwiz/Makefile
Executable file → Normal file
0
manual/manual-calwiz/addEnergy.eps
Executable file → Normal file
0
manual/manual-calwiz/addEnergy.png
Executable file → Normal file
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
0
manual/manual-calwiz/ancCal.tex
Executable file → Normal file
0
manual/manual-calwiz/angleFit.eps
Executable file → Normal file
0
manual/manual-calwiz/angleFit.png
Executable file → Normal file
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
0
manual/manual-calwiz/angularCalibrationHowTo.tex
Executable file → Normal file
0
manual/manual-calwiz/calibrateModule.eps
Executable file → Normal file
0
manual/manual-calwiz/calibrateModule.png
Executable file → Normal file
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
0
manual/manual-calwiz/calibrationWizardsHowTo.tex
Executable file → Normal file
0
manual/manual-calwiz/enCal.tex
Executable file → Normal file
0
manual/manual-calwiz/enable_angcal.eps
Executable file → Normal file
0
manual/manual-calwiz/eneble_angcal.png
Executable file → Normal file
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
0
manual/manual-calwiz/energyCalibrationHowTo.tex
Executable file → Normal file
0
manual/manual-calwiz/fig4.eps
Executable file → Normal file
0
manual/manual-calwiz/fig5.eps
Executable file → Normal file
0
manual/manual-calwiz/fig7.eps
Executable file → Normal file
0
manual/manual-calwiz/fig8.eps
Executable file → Normal file
0
manual/manual-calwiz/installation.tex
Executable file → Normal file
0
manual/manual-calwiz/peakFit.eps
Executable file → Normal file
0
manual/manual-calwiz/peakFit.png
Executable file → Normal file
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
0
manual/manual-calwiz/position_scan.eps
Executable file → Normal file
0
manual/manual-calwiz/position_scan.png
Executable file → Normal file
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
0
manual/manual-calwiz/setupAngcal.eps
Executable file → Normal file
0
manual/manual-calwiz/setupAngcal.png
Executable file → Normal file
Before Width: | Height: | Size: 264 KiB After Width: | Height: | Size: 264 KiB |