replaced udp socket

This commit is contained in:
Erik Frojdh 2020-02-17 17:43:14 +01:00
parent 3ea9b86bf5
commit f1bce15a57
46 changed files with 703 additions and 366 deletions

1
.gitignore vendored
View File

@ -7,6 +7,7 @@ bin/
*.out *.out
*.toc *.toc
*.o *.o
*.so
.* .*
build build
RELEASE.txt RELEASE.txt

View File

@ -4,39 +4,25 @@ language: cpp
os: linux os: linux
env: dist: bionic
matrix:
- CONDA_PY=3.6
- CONDA_PY=3.7
- CONDA_PY=3.8
dist: trusty
install: install:
- sudo apt-get update - sudo apt-get update
- ldd --version - ldd --version
- wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh; - wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh;
- bash miniconda.sh -b -p $HOME/miniconda - bash miniconda.sh -b -p $HOME/miniconda
- export PATH="$HOME/miniconda/bin:$PATH" - source "$HOME/miniconda/etc/profile.d/conda.sh"
- rm -f miniconda.sh - rm -f miniconda.sh
- hash -r - hash -r
- conda config --set always_yes yes --set changeps1 no - conda config --set always_yes yes --set changeps1 no
- conda config --add channels conda-forge - conda config --add channels conda-forge
- conda config --add channels slsdetectorgroup - conda config --add channels slsdetectorgroup
- conda update conda - conda update -q conda
- conda update --all
- conda install conda-build=3.17
- conda install anaconda-client
- conda install conda-verify
# Useful for debugging any issues with conda
- conda info -a - conda info -a
# Useful for debugging any issues with conda
# Replace dep1 dep2 ... with your dependencies - conda create -q -n testenv conda-build anaconda-client conda-verify
- conda create -q -n test-environment python=$CONDA_PY - conda activate testenv
- source activate test-environment
- conda-build . - conda-build .
script: script:
@ -45,7 +31,7 @@ script:
deploy: deploy:
provider: script provider: script
script: find $HOME/miniconda/conda-bld/${TRAVIS_OS_NAME}-64 -name "*.tar.bz2" -exec anaconda -t $CONDA_TOKEN upload --force {} \; script: find $HOME/miniconda/envs/testenv/conda-bld/${TRAVIS_OS_NAME}-64 -name "*.tar.bz2" -exec anaconda -t $CONDA_TOKEN upload --force {} \;
on: on:
branch: developer branch: developer

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.11) cmake_minimum_required(VERSION 3.12)
project(slsDetectorPackage) project(slsDetectorPackage)
set(PROJECT_VERSION 5.0.0) set(PROJECT_VERSION 5.0.0)
include(CheckIPOSupported) include(CheckIPOSupported)
@ -126,7 +126,7 @@ install(TARGETS slsProjectOptions slsProjectWarnings rapidjson
) )
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)
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
@ -174,6 +174,7 @@ if (SLS_USE_INTEGRATION_TESTS)
endif (SLS_USE_INTEGRATION_TESTS) endif (SLS_USE_INTEGRATION_TESTS)
if (SLS_USE_PYTHON) if (SLS_USE_PYTHON)
set(PYBIND11_CPP_STANDARD -std=c++11)
add_subdirectory(libs/pybind11) add_subdirectory(libs/pybind11)
add_subdirectory(python) add_subdirectory(python)
endif(SLS_USE_PYTHON) endif(SLS_USE_PYTHON)

View File

@ -1,3 +1,4 @@
mkdir build mkdir build
mkdir install mkdir install
cd build cd build
@ -6,7 +7,7 @@ cmake .. \
-DCMAKE_INSTALL_PREFIX=install \ -DCMAKE_INSTALL_PREFIX=install \
-DSLS_USE_TEXTCLIENT=ON \ -DSLS_USE_TEXTCLIENT=ON \
-DSLS_USE_RECEIVER=ON \ -DSLS_USE_RECEIVER=ON \
-DSLS_USE_GUI=OFF \ -DSLS_USE_GUI=ON \
-DSLS_USE_TESTS=ON \ -DSLS_USE_TESTS=ON \
-DSLS_USE_PYTHON=OFF \ -DSLS_USE_PYTHON=OFF \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \

View File

@ -1,14 +1,4 @@
# mkdir $PREFIX/lib echo "|<-------- starting python build"
# 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 cd python
${PYTHON} setup.py install ${PYTHON} setup.py install

View File

@ -0,0 +1,7 @@
python:
- 3.6
- 3.7
- 3.8
numpy:
- 1.17

View File

@ -0,0 +1,9 @@
mkdir $PREFIX/lib
mkdir $PREFIX/bin
mkdir $PREFIX/include
cp build/bin/ctbGui $PREFIX/bin/.
cp build/bin/libctbRootLib.so $PREFIX/lib/.

View File

@ -1,15 +1,3 @@
#Copy the GUI
mkdir $PREFIX/lib
mkdir $PREFIX/bin mkdir $PREFIX/bin
mkdir $PREFIX/include
#No libs for gui?
#Binaries
cp build/bin/gui_client $PREFIX/bin/.
cp build/bin/slsDetectorGui $PREFIX/bin/. cp build/bin/slsDetectorGui $PREFIX/bin/.
#Which headers do we need for development??
# cp include/some_lib.h $PREFIX/include/.

View File

@ -8,6 +8,7 @@ source:
build: build:
number: 1 number: 1
binary_relocation: True
rpaths: rpaths:
- lib/ - lib/
@ -16,10 +17,9 @@ requirements:
- {{ compiler('c') }} - {{ compiler('c') }}
- {{compiler('cxx')}} - {{compiler('cxx')}}
- cmake - cmake
# - qwt 6.* #require qt5 investigate befor activating gui - qwt 6.*
# - qt=4.8.7=7 - qt 4.8.*
- zeromq=4.2.5=hfc679d8_5 - zeromq
- pyzmq
- xorg-libx11 - xorg-libx11
- xorg-libice - xorg-libice
- xorg-libxext - xorg-libxext
@ -51,70 +51,46 @@ requirements:
outputs: outputs:
- name: sls_detector_lib - name: slsdetlib
script: copy_lib.sh script: copy_lib.sh
- name: sls_detector requirements:
run:
- libstdcxx-ng
- libgcc-ng
- zeromq
- name: slsdet
script: build_pylib.sh script: build_pylib.sh
requirements: requirements:
build: build:
- python
- {{ compiler('c') }} - {{ compiler('c') }}
- {{compiler('cxx')}} - {{compiler('cxx')}}
- python {{ python }} - {{ pin_subpackage('slsdetlib', exact=True) }}
- setuptools - setuptools
- sls_detector_lib
- pyzmq
- pybind11 2.4
host: host:
- python - python
- pybind11 2.4
- pyzmq run:
- sls_detector_lib
- libstdcxx-ng - libstdcxx-ng
- libgcc-ng - libgcc-ng
run:
- python - python
- numpy - numpy
- sls_detector_lib=developer - {{ pin_subpackage('slsdetlib', exact=True) }}
- pyzmq
- libstdcxx-ng
- libgcc-ng
test: test:
imports: imports:
- sls_detector - slsdet
# requirements: - name: slsdetgui
# build: script: copy_gui.sh
# - {{ compiler('c') }} requirements:
# - {{compiler('cxx')}} run:
- {{ pin_subpackage('slsdetlib', exact=True) }}
# - name: sls_detector_gui - qwt 6.*
# version: "refactor" - qt 4.8.*
# 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

View File

@ -71,6 +71,11 @@ target_link_libraries(ctbRootLib PUBLIC
${ROOT_EXE_LINKER_FLAGS} ${ROOT_EXE_LINKER_FLAGS}
) )
set_target_properties(
ctbRootLib PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
target_link_libraries(ctbGui PUBLIC target_link_libraries(ctbGui PUBLIC
slsDetectorShared slsDetectorShared
slsSupportLib slsSupportLib
@ -80,4 +85,5 @@ target_link_libraries(ctbGui PUBLIC
set_target_properties(ctbGui PROPERTIES set_target_properties(ctbGui PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
) )

View File

@ -12,7 +12,7 @@ file writing etc.
.. code-block:: python .. code-block:: python
from sls_detector import Eiger from slsdet import Eiger
d = Eiger() d = Eiger()
threshold = range(0, 2000, 200) threshold = range(0, 2000, 200)

View File

@ -1,20 +1,22 @@
pybind11_add_module(_sls_detector # find_package (Python COMPONENTS Interpreter Development)
pybind11_add_module(_slsdet
src/main.cpp src/main.cpp
src/enums.cpp src/enums.cpp
src/detector.cpp src/detector.cpp
src/network.cpp src/network.cpp
) )
target_link_libraries(_sls_detector PUBLIC target_link_libraries(_slsdet PUBLIC
slsDetectorShared slsDetectorShared
slsReceiverShared slsReceiverShared
slsSupportLib slsSupportLib
zmq ) )
set_target_properties(_sls_detector PROPERTIES set_target_properties(_slsdet PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
) )
@ -38,8 +40,8 @@ set( PYTHON_FILES
) )
foreach(FILE ${PYTHON_FILES}) foreach(FILE ${PYTHON_FILES})
configure_file( sls_detector/${FILE} configure_file( slsdet/${FILE}
${CMAKE_BINARY_DIR}/bin/sls_detector/${FILE} ) ${CMAKE_BINARY_DIR}/bin/slsdet/${FILE} )
endforeach(FILE ${PYTHON_FILES}) endforeach(FILE ${PYTHON_FILES})

View File

@ -8,7 +8,7 @@ import sys
import setuptools import setuptools
import os import os
__version__ = 'refactor' __version__ = 'udp'
def get_conda_path(): def get_conda_path():
@ -19,31 +19,32 @@ def get_conda_path():
return os.environ['CONDA_PREFIX'] return os.environ['CONDA_PREFIX']
class get_pybind_include(object): # class get_pybind_include(object):
"""Helper class to determine the pybind11 include path # """Helper class to determine the pybind11 include path
The purpose of this class is to postpone importing pybind11 # The purpose of this class is to postpone importing pybind11
until it is actually installed, so that the ``get_include()`` # until it is actually installed, so that the ``get_include()``
method can be invoked. """ # method can be invoked. """
def __init__(self, user=False): # def __init__(self, user=False):
self.user = user # self.user = user
def __str__(self): # def __str__(self):
import pybind11 # import pybind11
return pybind11.get_include(self.user) # return pybind11.get_include(self.user)
ext_modules = [ ext_modules = [
Extension( Extension(
'_sls_detector', '_slsdet',
['src/main.cpp', ['src/main.cpp',
'src/enums.cpp', 'src/enums.cpp',
'src/detector.cpp', 'src/detector.cpp',
'src/network.cpp'], 'src/network.cpp'],
include_dirs=[ include_dirs=[
# Path to pybind11 headers # Path to pybind11 headers
get_pybind_include(), # get_pybind_include(),
get_pybind_include(user=True), # get_pybind_include(user=True),
os.path.join('../libs/pybind11/include'),
os.path.join(get_conda_path(), 'include/slsDetectorPackage'), os.path.join(get_conda_path(), 'include/slsDetectorPackage'),
], ],
@ -109,20 +110,28 @@ class BuildExt(build_ext):
opts.append('/DVERSION_INFO=\\"%s\\"' % self.distribution.get_version()) opts.append('/DVERSION_INFO=\\"%s\\"' % self.distribution.get_version())
for ext in self.extensions: for ext in self.extensions:
ext.extra_compile_args = opts ext.extra_compile_args = opts
print('**************************************************')
print(ct)
print(opts)
print('**************************************************')
build_ext.build_extensions(self) build_ext.build_extensions(self)
def get_shared_lib():
return [f for f in os.listdir('.') if '_slsdet' in f]
setup( setup(
name='sls_detector', name='slsdet',
version=__version__, version=__version__,
author='Erik Frojdh', author='Erik Frojdh',
author_email='erik.frojdh@psi.ch', author_email='erik.frojdh@psi.ch',
url='https://github.com/slsdetectorgroup/sls_detector', url='https://github.com/slsdetectorgroup/slsDetectorPackage',
description='Detector API for SLS Detector Group detectors', description='Detector API for SLS Detector Group detectors',
long_description='', long_description='',
packages=find_packages(exclude=['contrib', 'docs', 'tests']), packages=find_packages(exclude=['contrib', 'docs', 'tests']),
ext_modules=ext_modules, ext_modules=ext_modules,
install_requires=['pybind11>=2.2'],
cmdclass={'build_ext': BuildExt}, cmdclass={'build_ext': BuildExt},
zip_safe=False, zip_safe=False,
) )

View File

@ -1,23 +0,0 @@
# from .detector import Detector, DetectorError, free_shared_memory
from .eiger import Eiger
from .ctb import Ctb
from .dacs import DetectorDacs, Dac
from .detector import Detector
from .jungfrau import Jungfrau
from .mythen3 import Mythen3
# from .jungfrau_ctb import JungfrauCTB
# from _sls_detector import DetectorApi
import _sls_detector
defs = _sls_detector.slsDetectorDefs
runStatus = _sls_detector.slsDetectorDefs.runStatus
speedLevel = _sls_detector.slsDetectorDefs.speedLevel
timingMode = _sls_detector.slsDetectorDefs.timingMode
dacIndex = _sls_detector.slsDetectorDefs.dacIndex
detectorType = _sls_detector.slsDetectorDefs.detectorType
detectorSettings = _sls_detector.slsDetectorDefs.detectorSettings
readoutMode = _sls_detector.slsDetectorDefs.readoutMode
IpAddr = _sls_detector.IpAddr
MacAddr = _sls_detector.MacAddr

23
python/slsdet/__init__.py Executable file
View File

@ -0,0 +1,23 @@
# from .detector import Detector, DetectorError, free_shared_memory
from .eiger import Eiger
from .ctb import Ctb
from .dacs import DetectorDacs, Dac
from .detector import Detector
from .jungfrau import Jungfrau
from .mythen3 import Mythen3
# from .jungfrau_ctb import JungfrauCTB
# from _slsdet import DetectorApi
import _slsdet
defs = _slsdet.slsDetectorDefs
runStatus = _slsdet.slsDetectorDefs.runStatus
speedLevel = _slsdet.slsDetectorDefs.speedLevel
timingMode = _slsdet.slsDetectorDefs.timingMode
dacIndex = _slsdet.slsDetectorDefs.dacIndex
detectorType = _slsdet.slsDetectorDefs.detectorType
detectorSettings = _slsdet.slsDetectorDefs.detectorSettings
readoutMode = _slsdet.slsDetectorDefs.readoutMode
IpAddr = _slsdet.IpAddr
MacAddr = _slsdet.MacAddr

View File

@ -1,8 +1,8 @@
from .detector import Detector from .detector import Detector
from .utils import element_if_equal from .utils import element_if_equal
from .dacs import DetectorDacs from .dacs import DetectorDacs
import _sls_detector import _slsdet
dacIndex = _sls_detector.slsDetectorDefs.dacIndex dacIndex = _slsdet.slsDetectorDefs.dacIndex
from .detector_property import DetectorProperty from .detector_property import DetectorProperty
class CtbDacs(DetectorDacs): class CtbDacs(DetectorDacs):

View File

@ -1,9 +1,9 @@
from .detector_property import DetectorProperty from .detector_property import DetectorProperty
from functools import partial from functools import partial
import numpy as np import numpy as np
import _sls_detector import _slsdet
from .detector import freeze from .detector import freeze
dacIndex = _sls_detector.slsDetectorDefs.dacIndex dacIndex = _slsdet.slsDetectorDefs.dacIndex
class Dac(DetectorProperty): class Dac(DetectorProperty):
""" """
This class represents a dac on the detector. One instance handles all This class represents a dac on the detector. One instance handles all

View File

@ -1,5 +1,5 @@
from _sls_detector import CppDetectorApi from _slsdet import CppDetectorApi
from _sls_detector import slsDetectorDefs from _slsdet import slsDetectorDefs
runStatus = slsDetectorDefs.runStatus runStatus = slsDetectorDefs.runStatus
speedLevel = slsDetectorDefs.speedLevel speedLevel = slsDetectorDefs.speedLevel

View File

@ -11,8 +11,8 @@ from .detector import Detector
# from .adcs import Adc, DetectorAdcs # from .adcs import Adc, DetectorAdcs
from .dacs import DetectorDacs from .dacs import DetectorDacs
import _sls_detector import _slsdet
dacIndex = _sls_detector.slsDetectorDefs.dacIndex dacIndex = _slsdet.slsDetectorDefs.dacIndex
from .detector_property import DetectorProperty from .detector_property import DetectorProperty
# from .utils import element_if_equal # from .utils import element_if_equal
# from sls_detector.errors import DetectorValueError, DetectorError # from sls_detector.errors import DetectorValueError, DetectorError

View File

@ -9,8 +9,8 @@ from .detector import Detector, freeze
# from .adcs import Adc, DetectorAdcs # from .adcs import Adc, DetectorAdcs
from .dacs import DetectorDacs from .dacs import DetectorDacs
import _sls_detector import _slsdet
dacIndex = _sls_detector.slsDetectorDefs.dacIndex dacIndex = _slsdet.slsDetectorDefs.dacIndex
from .detector_property import DetectorProperty from .detector_property import DetectorProperty
# @freeze # @freeze

View File

@ -9,8 +9,8 @@ from .detector import Detector, freeze
# from .adcs import Adc, DetectorAdcs # from .adcs import Adc, DetectorAdcs
from .dacs import DetectorDacs from .dacs import DetectorDacs
import _sls_detector import _slsdet
dacIndex = _sls_detector.slsDetectorDefs.dacIndex dacIndex = _slsdet.slsDetectorDefs.dacIndex
from .detector_property import DetectorProperty from .detector_property import DetectorProperty
# vcassh 1200, # vcassh 1200,

View File

@ -5,7 +5,7 @@ but not directly used in controlling the detector
from collections import namedtuple from collections import namedtuple
import _sls_detector #C++ lib import _slsdet #C++ lib
import functools import functools
@ -29,7 +29,7 @@ def list_to_bitmask(values):
return mask return mask
def to_geo(value): def to_geo(value):
if isinstance(value, _sls_detector.xy): if isinstance(value, _slsdet.xy):
return Geometry(x = value.x, y = value.y) return Geometry(x = value.x, y = value.y)
else: else:
raise ValueError("Can only convert sls_detector.xy") raise ValueError("Can only convert sls_detector.xy")

View File

@ -2,7 +2,7 @@ C++ API
===================================================== =====================================================
.. py:currentmodule:: _sls_detector .. py:currentmodule:: _slsdet
.. autoclass:: DetectorApi .. autoclass:: DetectorApi
:members: :members:

View File

@ -610,6 +610,8 @@ void init_det(py::module &m) {
py::arg() = Positions{}) py::arg() = Positions{})
.def("writeAdcRegister", &Detector::writeAdcRegister, py::arg(), .def("writeAdcRegister", &Detector::writeAdcRegister, py::arg(),
py::arg(), py::arg() = Positions{}) py::arg(), py::arg() = Positions{})
.def("getInitialChecks", &Detector::getInitialChecks)
.def("setInitialChecks", &Detector::setInitialChecks, py::arg())
.def("getControlPort", &Detector::getControlPort, .def("getControlPort", &Detector::getControlPort,
py::arg() = Positions{}) py::arg() = Positions{})
.def("setControlPort", &Detector::setControlPort, py::arg(), .def("setControlPort", &Detector::setControlPort, py::arg(),

View File

@ -19,7 +19,7 @@ void init_enums(py::module &);
void init_experimental(py::module &); void init_experimental(py::module &);
void init_det(py::module &); void init_det(py::module &);
void init_network(py::module &); void init_network(py::module &);
PYBIND11_MODULE(_sls_detector, m) { PYBIND11_MODULE(_slsdet, m) {
m.doc() = R"pbdoc( m.doc() = R"pbdoc(
C/C++ API C/C++ API
----------------------- -----------------------

View File

@ -16,12 +16,12 @@ def d():
def test_acq_call(d, mocker): def test_acq_call(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.acq') m = mocker.patch('_slsdet.DetectorApi.acq')
d.acq() d.acq()
m.assert_called_once_with() m.assert_called_once_with()
def test_busy_call(d, mocker): def test_busy_call(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getAcquiringFlag') m = mocker.patch('_slsdet.DetectorApi.getAcquiringFlag')
m.return_value = False m.return_value = False
assert d.busy == False assert d.busy == False
@ -31,103 +31,103 @@ def test_assign_to_detector_type(d):
d.detector_type = 'Eiger' d.detector_type = 'Eiger'
def test_det_type(d, mocker): def test_det_type(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getDetectorType') m = mocker.patch('_slsdet.DetectorApi.getDetectorType')
m.return_value = 'Eiger' m.return_value = 'Eiger'
assert d.detector_type == 'Eiger' assert d.detector_type == 'Eiger'
def test_set_dynamic_range_4(d, mocker): def test_set_dynamic_range_4(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setDynamicRange') m = mocker.patch('_slsdet.DetectorApi.setDynamicRange')
d.dynamic_range = 4 d.dynamic_range = 4
m.assert_called_with(4) m.assert_called_with(4)
def test_set_dynamic_range_8(d, mocker): def test_set_dynamic_range_8(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setDynamicRange') m = mocker.patch('_slsdet.DetectorApi.setDynamicRange')
d.dynamic_range = 8 d.dynamic_range = 8
m.assert_called_with(8) m.assert_called_with(8)
def test_set_dynamic_range_16(d, mocker): def test_set_dynamic_range_16(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setDynamicRange') m = mocker.patch('_slsdet.DetectorApi.setDynamicRange')
d.dynamic_range = 16 d.dynamic_range = 16
m.assert_called_with(16) m.assert_called_with(16)
def test_set_dynamic_range_32(d, mocker): def test_set_dynamic_range_32(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setDynamicRange') m = mocker.patch('_slsdet.DetectorApi.setDynamicRange')
d.dynamic_range = 32 d.dynamic_range = 32
m.assert_called_with(32) m.assert_called_with(32)
def test_set_dynamic_range_raises_exception(d, mocker): def test_set_dynamic_range_raises_exception(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setDynamicRange') mocker.patch('_slsdet.DetectorApi.setDynamicRange')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.dynamic_range = 17 d.dynamic_range = 17
def test_get_dynamic_range_32(d, mocker): def test_get_dynamic_range_32(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getDynamicRange') m = mocker.patch('_slsdet.DetectorApi.getDynamicRange')
m.return_value = 32 m.return_value = 32
dr = d.dynamic_range dr = d.dynamic_range
assert dr == 32 assert dr == 32
def test_eiger_matrix_reset(d, mocker): def test_eiger_matrix_reset(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getCounterBit') m = mocker.patch('_slsdet.DetectorApi.getCounterBit')
m.return_value = True m.return_value = True
assert d.eiger_matrix_reset == True assert d.eiger_matrix_reset == True
def test_set_eiger_matrix_reset(d, mocker): def test_set_eiger_matrix_reset(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setCounterBit') m = mocker.patch('_slsdet.DetectorApi.setCounterBit')
d.eiger_matrix_reset = True d.eiger_matrix_reset = True
m.assert_called_once_with(True) m.assert_called_once_with(True)
def test_get_exposure_time(d, mocker): def test_get_exposure_time(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getExposureTime') m = mocker.patch('_slsdet.DetectorApi.getExposureTime')
m.return_value = 100000000 m.return_value = 100000000
assert d.exposure_time == 0.1 assert d.exposure_time == 0.1
def test_set_exposure_time(d, mocker): def test_set_exposure_time(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setExposureTime') m = mocker.patch('_slsdet.DetectorApi.setExposureTime')
d.exposure_time = 1.5 d.exposure_time = 1.5
m.assert_called_once_with(1500000000) m.assert_called_once_with(1500000000)
def test_set_exposure_time_less_than_zero(d, mocker): def test_set_exposure_time_less_than_zero(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setExposureTime') mocker.patch('_slsdet.DetectorApi.setExposureTime')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.exposure_time = -7 d.exposure_time = -7
def test_get_file_index(d, mocker): def test_get_file_index(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getFileIndex') m = mocker.patch('_slsdet.DetectorApi.getFileIndex')
m.return_value = 8 m.return_value = 8
assert d.file_index == 8 assert d.file_index == 8
def test_set_file_index(d, mocker): def test_set_file_index(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setFileIndex') m = mocker.patch('_slsdet.DetectorApi.setFileIndex')
d.file_index = 9 d.file_index = 9
m.assert_called_with(9) m.assert_called_with(9)
def test_set_file_index_raises_on_neg(d, mocker): def test_set_file_index_raises_on_neg(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setFileIndex') mocker.patch('_slsdet.DetectorApi.setFileIndex')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.file_index = -9 d.file_index = -9
def test_get_file_name(d, mocker): def test_get_file_name(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getFileName') m = mocker.patch('_slsdet.DetectorApi.getFileName')
d.file_name d.file_name
m.assert_called_once_with() m.assert_called_once_with()
def test_set_file_name(d, mocker): def test_set_file_name(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setFileName') m = mocker.patch('_slsdet.DetectorApi.setFileName')
d.file_name = 'hej' d.file_name = 'hej'
m.assert_called_once_with('hej') m.assert_called_once_with('hej')
def test_get_file_path(d, mocker): def test_get_file_path(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getFilePath') m = mocker.patch('_slsdet.DetectorApi.getFilePath')
d.file_path d.file_path
m.assert_called_once_with() m.assert_called_once_with()
def test_set_file_path_when_path_exists(d, mocker): def test_set_file_path_when_path_exists(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setFilePath') m = mocker.patch('_slsdet.DetectorApi.setFilePath')
#To avoid raising an exception because path is not there #To avoid raising an exception because path is not there
mock_os = mocker.patch('os.path.exists') mock_os = mocker.patch('os.path.exists')
mock_os.return_value = True mock_os.return_value = True
@ -135,25 +135,25 @@ def test_set_file_path_when_path_exists(d, mocker):
m.assert_called_once_with('/path/to/something/') m.assert_called_once_with('/path/to/something/')
def test_set_file_path_raises_when_not_exists(d, mocker): def test_set_file_path_raises_when_not_exists(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setFilePath') mocker.patch('_slsdet.DetectorApi.setFilePath')
mock_os = mocker.patch('os.path.exists') mock_os = mocker.patch('os.path.exists')
mock_os.return_value = False mock_os.return_value = False
with pytest.raises(FileNotFoundError): with pytest.raises(FileNotFoundError):
d.file_path = '/path/to/something/' d.file_path = '/path/to/something/'
def test_get_file_write(d, mocker): def test_get_file_write(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getFileWrite') m = mocker.patch('_slsdet.DetectorApi.getFileWrite')
m.return_value = False m.return_value = False
assert d.file_write == False assert d.file_write == False
def test_set_file_write(d, mocker): def test_set_file_write(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setFileWrite') m = mocker.patch('_slsdet.DetectorApi.setFileWrite')
d.file_write = True d.file_write = True
m.assert_called_once_with(True) m.assert_called_once_with(True)
def test_get_firmware_version(d, mocker): def test_get_firmware_version(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getFirmwareVersion') m = mocker.patch('_slsdet.DetectorApi.getFirmwareVersion')
m.return_value = 20 m.return_value = 20
assert d.firmware_version == 20 assert d.firmware_version == 20
@ -162,38 +162,38 @@ def test_cannot_set_fw_version(d):
d.firmware_version = 20 d.firmware_version = 20
def test_get_high_voltage_call_signature(d, mocker): def test_get_high_voltage_call_signature(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getDac') m = mocker.patch('_slsdet.DetectorApi.getDac')
d.high_voltage d.high_voltage
m.assert_called_once_with('vhighvoltage', -1) m.assert_called_once_with('vhighvoltage', -1)
def test_get_high_voltage(d, mocker): def test_get_high_voltage(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getDac') m = mocker.patch('_slsdet.DetectorApi.getDac')
m.return_value = 80 m.return_value = 80
assert d.high_voltage == 80 assert d.high_voltage == 80
#self._api.setDac('vhighvoltage', -1, voltage) #self._api.setDac('vhighvoltage', -1, voltage)
def test_set_high_voltage(d, mocker): def test_set_high_voltage(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setDac') m = mocker.patch('_slsdet.DetectorApi.setDac')
d.high_voltage = 80 d.high_voltage = 80
m.assert_called_once_with('vhighvoltage', -1, 80) m.assert_called_once_with('vhighvoltage', -1, 80)
def test_decode_hostname_two_names(d, mocker): def test_decode_hostname_two_names(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getHostname') m = mocker.patch('_slsdet.DetectorApi.getHostname')
m.return_value = 'beb059+beb048+' m.return_value = 'beb059+beb048+'
assert d.hostname == ['beb059', 'beb048'] assert d.hostname == ['beb059', 'beb048']
def test_decode_hostname_four_names(d, mocker): def test_decode_hostname_four_names(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getHostname') m = mocker.patch('_slsdet.DetectorApi.getHostname')
m.return_value = 'beb059+beb048+beb120+beb153+' m.return_value = 'beb059+beb048+beb120+beb153+'
assert d.hostname == ['beb059', 'beb048', 'beb120', 'beb153'] assert d.hostname == ['beb059', 'beb048', 'beb120', 'beb153']
def test_decode_hostname_blank(d, mocker): def test_decode_hostname_blank(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getHostname') m = mocker.patch('_slsdet.DetectorApi.getHostname')
m.return_value = '' m.return_value = ''
assert d.hostname == [] assert d.hostname == []
def test_get_image_size_gives_correct_size(d, mocker): def test_get_image_size_gives_correct_size(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getImageSize') m = mocker.patch('_slsdet.DetectorApi.getImageSize')
m.return_value = (512,1024) m.return_value = (512,1024)
im_size = d.image_size im_size = d.image_size
assert im_size.rows == 512 assert im_size.rows == 512
@ -202,7 +202,7 @@ def test_get_image_size_gives_correct_size(d, mocker):
def test_load_config(d, mocker): def test_load_config(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.readConfigurationFile') m = mocker.patch('_slsdet.DetectorApi.readConfigurationFile')
#To avoid raising an exception because path is not there #To avoid raising an exception because path is not there
mock_os = mocker.patch('os.path.isfile') mock_os = mocker.patch('os.path.isfile')
mock_os.return_value = True mock_os.return_value = True
@ -210,14 +210,14 @@ def test_load_config(d, mocker):
m.assert_called_once_with('/path/to/my/file.config') m.assert_called_once_with('/path/to/my/file.config')
def test_load_config_raises_when_file_is_not_found(d, mocker): def test_load_config_raises_when_file_is_not_found(d, mocker):
mocker.patch('_sls_detector.DetectorApi.readConfigurationFile') mocker.patch('_slsdet.DetectorApi.readConfigurationFile')
mock_os = mocker.patch('os.path.isfile') mock_os = mocker.patch('os.path.isfile')
mock_os.return_value = False mock_os.return_value = False
with pytest.raises(FileNotFoundError): with pytest.raises(FileNotFoundError):
d.load_config('/path/to/my/file.config') d.load_config('/path/to/my/file.config')
def test_load_parameters(d, mocker): def test_load_parameters(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.readParametersFile') m = mocker.patch('_slsdet.DetectorApi.readParametersFile')
#To avoid raising an exception because path is not there #To avoid raising an exception because path is not there
mock_os = mocker.patch('os.path.isfile') mock_os = mocker.patch('os.path.isfile')
mock_os.return_value = True mock_os.return_value = True
@ -225,7 +225,7 @@ def test_load_parameters(d, mocker):
m.assert_called_once_with('/path/to/my/file.par') m.assert_called_once_with('/path/to/my/file.par')
def test_load_parameters_raises_when_file_is_not_found(d, mocker): def test_load_parameters_raises_when_file_is_not_found(d, mocker):
mocker.patch('_sls_detector.DetectorApi.readParametersFile') mocker.patch('_slsdet.DetectorApi.readParametersFile')
mock_os = mocker.patch('os.path.isfile') mock_os = mocker.patch('os.path.isfile')
mock_os.return_value = False mock_os.return_value = False
with pytest.raises(FileNotFoundError): with pytest.raises(FileNotFoundError):
@ -233,14 +233,14 @@ def test_load_parameters_raises_when_file_is_not_found(d, mocker):
#getDetectorGeometry #getDetectorGeometry
def test_get_module_geometry_gives_correct_size(d, mocker): def test_get_module_geometry_gives_correct_size(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getDetectorGeometry') m = mocker.patch('_slsdet.DetectorApi.getDetectorGeometry')
m.return_value = (13,7) m.return_value = (13,7)
g = d.module_geometry g = d.module_geometry
assert g.vertical == 7 assert g.vertical == 7
assert g.horizontal == 13 assert g.horizontal == 13
def test_get_module_geometry_access(d, mocker): def test_get_module_geometry_access(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getDetectorGeometry') m = mocker.patch('_slsdet.DetectorApi.getDetectorGeometry')
m.return_value = (12,3) m.return_value = (12,3)
assert d.module_geometry[0] == 12 assert d.module_geometry[0] == 12
assert d.module_geometry[1] == 3 assert d.module_geometry[1] == 3
@ -248,237 +248,237 @@ def test_get_module_geometry_access(d, mocker):
assert d.module_geometry.horizontal == 12 assert d.module_geometry.horizontal == 12
def test_get_n_frames(d, mocker): def test_get_n_frames(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getNumberOfFrames') m = mocker.patch('_slsdet.DetectorApi.getNumberOfFrames')
m.return_value = 3 m.return_value = 3
assert d.n_frames == 3 assert d.n_frames == 3
def test_set_n_frames(d, mocker): def test_set_n_frames(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setNumberOfFrames') m = mocker.patch('_slsdet.DetectorApi.setNumberOfFrames')
d.n_frames = 9 d.n_frames = 9
m.assert_called_once_with(9) m.assert_called_once_with(9)
def test_set_n_frames_raises_on_neg(d, mocker): def test_set_n_frames_raises_on_neg(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setNumberOfFrames') mocker.patch('_slsdet.DetectorApi.setNumberOfFrames')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.n_frames = -1 d.n_frames = -1
def test_set_n_frames_raises_on_zero(d, mocker): def test_set_n_frames_raises_on_zero(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setNumberOfFrames') mocker.patch('_slsdet.DetectorApi.setNumberOfFrames')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.n_frames = 0 d.n_frames = 0
def test_get_n_modules(d, mocker): def test_get_n_modules(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getNumberOfDetectors') m = mocker.patch('_slsdet.DetectorApi.getNumberOfDetectors')
m.return_value = 12 m.return_value = 12
assert d.n_modules == 12 assert d.n_modules == 12
def test_get_period_time(d, mocker): def test_get_period_time(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getPeriod') m = mocker.patch('_slsdet.DetectorApi.getPeriod')
m.return_value = 130000000 m.return_value = 130000000
assert d.period == 0.13 assert d.period == 0.13
def test_set_period_time(d, mocker): def test_set_period_time(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setPeriod') m = mocker.patch('_slsdet.DetectorApi.setPeriod')
d.period = 1.953 d.period = 1.953
m.assert_called_once_with(1953000000) m.assert_called_once_with(1953000000)
def test_set_period_time_less_than_zero(d, mocker): def test_set_period_time_less_than_zero(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setPeriod') mocker.patch('_slsdet.DetectorApi.setPeriod')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.period = -7 d.period = -7
def test_pulse_chip_call(d, mocker): def test_pulse_chip_call(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.pulseChip') m = mocker.patch('_slsdet.DetectorApi.pulseChip')
d.pulse_chip(15) d.pulse_chip(15)
m.assert_called_once_with(15) m.assert_called_once_with(15)
def test_pulse_chip_call_minus_one(d, mocker): def test_pulse_chip_call_minus_one(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.pulseChip') m = mocker.patch('_slsdet.DetectorApi.pulseChip')
d.pulse_chip(-1) d.pulse_chip(-1)
m.assert_called_once_with(-1) m.assert_called_once_with(-1)
def test_pulse_chip_asserts_on_smaller_than_minus_one(d, mocker): def test_pulse_chip_asserts_on_smaller_than_minus_one(d, mocker):
mocker.patch('_sls_detector.DetectorApi.pulseChip') mocker.patch('_slsdet.DetectorApi.pulseChip')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.pulse_chip(-3) d.pulse_chip(-3)
#--------------------------------------------------------------------subexptime #--------------------------------------------------------------------subexptime
def test_get_sub_exposure_time(d, mocker): def test_get_sub_exposure_time(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getSubExposureTime') m = mocker.patch('_slsdet.DetectorApi.getSubExposureTime')
m.return_value = 2370000 m.return_value = 2370000
assert d.sub_exposure_time == 0.00237 assert d.sub_exposure_time == 0.00237
def test_set_sub_exposure_time(d, mocker): def test_set_sub_exposure_time(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setSubExposureTime') m = mocker.patch('_slsdet.DetectorApi.setSubExposureTime')
d.sub_exposure_time = 0.002 d.sub_exposure_time = 0.002
m.assert_called_once_with(2000000) m.assert_called_once_with(2000000)
def test_set_sub_exposure_time_raises_on_zero(d, mocker): def test_set_sub_exposure_time_raises_on_zero(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setSubExposureTime') mocker.patch('_slsdet.DetectorApi.setSubExposureTime')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.sub_exposure_time = 0 d.sub_exposure_time = 0
#-------------------------------------------------------------Rate correction #-------------------------------------------------------------Rate correction
def test_get_rate_correction(d, mocker): def test_get_rate_correction(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getRateCorrection') m = mocker.patch('_slsdet.DetectorApi.getRateCorrection')
m.return_value = [132,129] m.return_value = [132,129]
assert d.rate_correction == [132,129] assert d.rate_correction == [132,129]
def test_set_rate_correction(d, mocker): def test_set_rate_correction(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setRateCorrection') m = mocker.patch('_slsdet.DetectorApi.setRateCorrection')
mock_n = mocker.patch('_sls_detector.DetectorApi.getNumberOfDetectors') mock_n = mocker.patch('_slsdet.DetectorApi.getNumberOfDetectors')
mock_n.return_value = 3 mock_n.return_value = 3
d.rate_correction = [123,90,50] d.rate_correction = [123,90,50]
m.assert_called_once_with([123,90,50]) m.assert_called_once_with([123,90,50])
def test_set_rate_correction_raises_on_wrong_number_of_values(d, mocker): def test_set_rate_correction_raises_on_wrong_number_of_values(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setRateCorrection') mocker.patch('_slsdet.DetectorApi.setRateCorrection')
mock_n = mocker.patch('_sls_detector.DetectorApi.getNumberOfDetectors') mock_n = mocker.patch('_slsdet.DetectorApi.getNumberOfDetectors')
mock_n.return_value = 4 mock_n.return_value = 4
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.rate_correction = [123,90,50] d.rate_correction = [123,90,50]
#----------------------------------------------------------------Readout clock #----------------------------------------------------------------Readout clock
def test_get_readout_clock_0(d, mocker): def test_get_readout_clock_0(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getReadoutClockSpeed') m = mocker.patch('_slsdet.DetectorApi.getReadoutClockSpeed')
m.return_value = 0 m.return_value = 0
assert d.readout_clock == 'Full Speed' assert d.readout_clock == 'Full Speed'
def test_get_readout_clock_1(d, mocker): def test_get_readout_clock_1(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getReadoutClockSpeed') m = mocker.patch('_slsdet.DetectorApi.getReadoutClockSpeed')
m.return_value = 1 m.return_value = 1
assert d.readout_clock == 'Half Speed' assert d.readout_clock == 'Half Speed'
def test_get_readout_clock_2(d, mocker): def test_get_readout_clock_2(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getReadoutClockSpeed') m = mocker.patch('_slsdet.DetectorApi.getReadoutClockSpeed')
m.return_value = 2 m.return_value = 2
assert d.readout_clock == 'Quarter Speed' assert d.readout_clock == 'Quarter Speed'
def test_get_readout_clock_3(d, mocker): def test_get_readout_clock_3(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getReadoutClockSpeed') m = mocker.patch('_slsdet.DetectorApi.getReadoutClockSpeed')
m.return_value = 3 m.return_value = 3
assert d.readout_clock == 'Super Slow Speed' assert d.readout_clock == 'Super Slow Speed'
def test_set_readout_clock_0(d, mocker): def test_set_readout_clock_0(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setReadoutClockSpeed') m = mocker.patch('_slsdet.DetectorApi.setReadoutClockSpeed')
d.readout_clock = 'Full Speed' d.readout_clock = 'Full Speed'
m.assert_called_once_with(0) m.assert_called_once_with(0)
def test_set_readout_clock_1(d, mocker): def test_set_readout_clock_1(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setReadoutClockSpeed') m = mocker.patch('_slsdet.DetectorApi.setReadoutClockSpeed')
d.readout_clock = 'Half Speed' d.readout_clock = 'Half Speed'
m.assert_called_once_with(1) m.assert_called_once_with(1)
def test_set_readout_clock_2(d, mocker): def test_set_readout_clock_2(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setReadoutClockSpeed') m = mocker.patch('_slsdet.DetectorApi.setReadoutClockSpeed')
d.readout_clock = 'Quarter Speed' d.readout_clock = 'Quarter Speed'
m.assert_called_once_with(2) m.assert_called_once_with(2)
def test_set_readout_clock_3(d, mocker): def test_set_readout_clock_3(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setReadoutClockSpeed') m = mocker.patch('_slsdet.DetectorApi.setReadoutClockSpeed')
d.readout_clock = 'Super Slow Speed' d.readout_clock = 'Super Slow Speed'
m.assert_called_once_with(3) m.assert_called_once_with(3)
#----------------------------------------------------------------rx_datastream #----------------------------------------------------------------rx_datastream
def test_get_rx_datastream(d, mocker): def test_get_rx_datastream(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getRxDataStreamStatus') m = mocker.patch('_slsdet.DetectorApi.getRxDataStreamStatus')
m.return_value = False m.return_value = False
assert d.rx_datastream == False assert d.rx_datastream == False
def test_set_rx_datastream(d, mocker): def test_set_rx_datastream(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setRxDataStreamStatus') m = mocker.patch('_slsdet.DetectorApi.setRxDataStreamStatus')
d.rx_datastream = True d.rx_datastream = True
m.assert_called_once_with(True) m.assert_called_once_with(True)
def test_get_rx_zmqip(d, mocker): def test_get_rx_zmqip(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getNetworkParameter') m = mocker.patch('_slsdet.DetectorApi.getNetworkParameter')
d.rx_zmqip d.rx_zmqip
m.assert_called_once_with('rx_zmqip') m.assert_called_once_with('rx_zmqip')
def test_get_rx_zmqport_call(d, mocker): def test_get_rx_zmqport_call(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getNetworkParameter') m = mocker.patch('_slsdet.DetectorApi.getNetworkParameter')
d.rx_zmqport d.rx_zmqport
m.assert_called_once_with('rx_zmqport') m.assert_called_once_with('rx_zmqport')
def test_get_rx_zmqport_decode(d, mocker): def test_get_rx_zmqport_decode(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getNetworkParameter') m = mocker.patch('_slsdet.DetectorApi.getNetworkParameter')
m.return_value = '30001+30003+' m.return_value = '30001+30003+'
assert d.rx_zmqport == [30001, 30002, 30003, 30004] assert d.rx_zmqport == [30001, 30002, 30003, 30004]
def test_get_rx_zmqport_empty(d, mocker): def test_get_rx_zmqport_empty(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getNetworkParameter') m = mocker.patch('_slsdet.DetectorApi.getNetworkParameter')
m.return_value = '' m.return_value = ''
assert d.rx_zmqport == [] assert d.rx_zmqport == []
#--------------------------------------------------------------------status #--------------------------------------------------------------------status
def test_status_call(d, mocker): def test_status_call(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getRunStatus') m = mocker.patch('_slsdet.DetectorApi.getRunStatus')
d.status d.status
m.assert_called_once_with() m.assert_called_once_with()
def test_start_acq_call(d, mocker): def test_start_acq_call(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.startAcquisition') m = mocker.patch('_slsdet.DetectorApi.startAcquisition')
d.start_acq() d.start_acq()
m.assert_called_once_with() m.assert_called_once_with()
def test_stop_acq_call(d, mocker): def test_stop_acq_call(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.stopAcquisition') m = mocker.patch('_slsdet.DetectorApi.stopAcquisition')
d.stop_acq() d.stop_acq()
m.assert_called_once_with() m.assert_called_once_with()
#--------------------------------------------------------------------subexptime #--------------------------------------------------------------------subexptime
def test_get_sub_exposure_time(d, mocker): def test_get_sub_exposure_time(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getSubExposureTime') m = mocker.patch('_slsdet.DetectorApi.getSubExposureTime')
m.return_value = 2370000 m.return_value = 2370000
assert d.sub_exposure_time == 0.00237 assert d.sub_exposure_time == 0.00237
def test_set_sub_exposure_time(d, mocker): def test_set_sub_exposure_time(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setSubExposureTime') m = mocker.patch('_slsdet.DetectorApi.setSubExposureTime')
d.sub_exposure_time = 0.002 d.sub_exposure_time = 0.002
m.assert_called_once_with(2000000) m.assert_called_once_with(2000000)
def test_set_sub_exposure_time_raises_on_zero(d, mocker): def test_set_sub_exposure_time_raises_on_zero(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setSubExposureTime') mocker.patch('_slsdet.DetectorApi.setSubExposureTime')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.sub_exposure_time = 0 d.sub_exposure_time = 0
#------------------------------------------------------------------timing mode #------------------------------------------------------------------timing mode
def test_get_timing_mode(d, mocker): def test_get_timing_mode(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getTimingMode') m = mocker.patch('_slsdet.DetectorApi.getTimingMode')
d.timing_mode d.timing_mode
m.assert_called_once_with() m.assert_called_once_with()
def test_set_timing_mode(d, mocker): def test_set_timing_mode(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setTimingMode') m = mocker.patch('_slsdet.DetectorApi.setTimingMode')
d.timing_mode = 'auto' d.timing_mode = 'auto'
m.assert_called_once_with('auto') m.assert_called_once_with('auto')
#----------------------------------------------------------------vthreshold #----------------------------------------------------------------vthreshold
def test_get_vthreshold(d, mocker): def test_get_vthreshold(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getDac') m = mocker.patch('_slsdet.DetectorApi.getDac')
d.vthreshold d.vthreshold
m.assert_called_once_with('vthreshold', -1) m.assert_called_once_with('vthreshold', -1)
def test_set_vthreshold(d, mocker): def test_set_vthreshold(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setDac') m = mocker.patch('_slsdet.DetectorApi.setDac')
d.vthreshold = 1675 d.vthreshold = 1675
m.assert_called_once_with('vthreshold', -1, 1675) m.assert_called_once_with('vthreshold', -1, 1675)
#----------------------------------------------------------------trimbits #----------------------------------------------------------------trimbits
def test_get_trimbits(d, mocker): def test_get_trimbits(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.getAllTrimbits') m = mocker.patch('_slsdet.DetectorApi.getAllTrimbits')
d.trimbits d.trimbits
m.assert_called_once_with() m.assert_called_once_with()
def test_set_trimbits(d, mocker): def test_set_trimbits(d, mocker):
m = mocker.patch('_sls_detector.DetectorApi.setAllTrimbits') m = mocker.patch('_slsdet.DetectorApi.setAllTrimbits')
d.trimbits = 15 d.trimbits = 15
m.assert_called_once_with(15) m.assert_called_once_with(15)
def test_set_trimbits_raises_outside_range(d, mocker): def test_set_trimbits_raises_outside_range(d, mocker):
mocker.patch('_sls_detector.DetectorApi.setAllTrimbits') mocker.patch('_slsdet.DetectorApi.setAllTrimbits')
with pytest.raises(ValueError): with pytest.raises(ValueError):
d.trimbits = 69 d.trimbits = 69

View File

@ -15,7 +15,7 @@ from pytest_mock import mocker
import sys import sys
sys.path.append('/home/l_frojdh/slsdetectorgrup/sls_detector') sys.path.append('/home/l_frojdh/slsdetectorgrup/sls_detector')
import _sls_detector import _slsdet
from sls_detector.errors import DetectorValueError, DetectorError from sls_detector.errors import DetectorValueError, DetectorError
from sls_detector.utils import all_equal, element_if_equal from sls_detector.utils import all_equal, element_if_equal
@ -47,7 +47,7 @@ def test_set_counters_single(d, mocker):
# def test_busy_call(d, mocker): # def test_busy_call(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getAcquiringFlag') # m = mocker.patch('_slsdet.DetectorApi.getAcquiringFlag')
# m.return_value = False # m.return_value = False
# assert d.busy == False # assert d.busy == False
@ -73,34 +73,34 @@ def test_set_counters_single(d, mocker):
# d.detector_type = 'Eiger' # d.detector_type = 'Eiger'
# def test_det_type(d, mocker): # def test_det_type(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getDetectorType') # m = mocker.patch('_slsdet.DetectorApi.getDetectorType')
# m.return_value = 'Eiger' # m.return_value = 'Eiger'
# assert d.detector_type == 'Eiger' # assert d.detector_type == 'Eiger'
# def test_get_exposure_time(d, mocker): # def test_get_exposure_time(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getExposureTime') # m = mocker.patch('_slsdet.DetectorApi.getExposureTime')
# m.return_value = 100000000 # m.return_value = 100000000
# assert d.exposure_time == 0.1 # assert d.exposure_time == 0.1
# def test_set_exposure_time(d, mocker): # def test_set_exposure_time(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setExposureTime') # m = mocker.patch('_slsdet.DetectorApi.setExposureTime')
# d.exposure_time = 1.5 # d.exposure_time = 1.5
# m.assert_called_once_with(1500000000) # m.assert_called_once_with(1500000000)
# def test_set_exposure_time_less_than_zero(d, mocker): # def test_set_exposure_time_less_than_zero(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.setExposureTime') # mocker.patch('_slsdet.DetectorApi.setExposureTime')
# with pytest.raises(DetectorValueError): # with pytest.raises(DetectorValueError):
# d.exposure_time = -7 # d.exposure_time = -7
# def test_get_file_index(d, mocker): # def test_get_file_index(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getFileIndex') # m = mocker.patch('_slsdet.DetectorApi.getFileIndex')
# m.return_value = 8 # m.return_value = 8
# assert d.file_index == 8 # assert d.file_index == 8
# def test_set_file_index(d, mocker): # def test_set_file_index(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setFileIndex') # m = mocker.patch('_slsdet.DetectorApi.setFileIndex')
# d.file_index = 9 # d.file_index = 9
# m.assert_called_with(9) # m.assert_called_with(9)
@ -112,28 +112,28 @@ def test_set_counters_single(d, mocker):
# assert d.dynamic_range == -100 # assert d.dynamic_range == -100
# def test_set_file_index_raises_on_neg(d, mocker): # def test_set_file_index_raises_on_neg(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.setFileIndex') # mocker.patch('_slsdet.DetectorApi.setFileIndex')
# with pytest.raises(ValueError): # with pytest.raises(ValueError):
# d.file_index = -9 # d.file_index = -9
# def test_get_file_name(d, mocker): # def test_get_file_name(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getFileName') # m = mocker.patch('_slsdet.DetectorApi.getFileName')
# d.file_name # d.file_name
# m.assert_called_once_with() # m.assert_called_once_with()
# def test_set_file_name(d, mocker): # def test_set_file_name(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setFileName') # m = mocker.patch('_slsdet.DetectorApi.setFileName')
# d.file_name = 'hej' # d.file_name = 'hej'
# m.assert_called_once_with('hej') # m.assert_called_once_with('hej')
# def test_get_file_path(d, mocker): # def test_get_file_path(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getFilePath') # m = mocker.patch('_slsdet.DetectorApi.getFilePath')
# d.file_path # d.file_path
# m.assert_called_once_with() # m.assert_called_once_with()
# def test_set_file_path_when_path_exists(d, mocker): # def test_set_file_path_when_path_exists(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setFilePath') # m = mocker.patch('_slsdet.DetectorApi.setFilePath')
# #To avoid raising an exception because path is not there # #To avoid raising an exception because path is not there
# mock_os = mocker.patch('os.path.exists') # mock_os = mocker.patch('os.path.exists')
# mock_os.return_value = True # mock_os.return_value = True
@ -141,25 +141,25 @@ def test_set_counters_single(d, mocker):
# m.assert_called_once_with('/path/to/something/') # m.assert_called_once_with('/path/to/something/')
# def test_set_file_path_raises_when_not_exists(d, mocker): # def test_set_file_path_raises_when_not_exists(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.setFilePath') # mocker.patch('_slsdet.DetectorApi.setFilePath')
# mock_os = mocker.patch('os.path.exists') # mock_os = mocker.patch('os.path.exists')
# mock_os.return_value = False # mock_os.return_value = False
# with pytest.raises(FileNotFoundError): # with pytest.raises(FileNotFoundError):
# d.file_path = '/path/to/something/' # d.file_path = '/path/to/something/'
# def test_get_file_write(d, mocker): # def test_get_file_write(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getFileWrite') # m = mocker.patch('_slsdet.DetectorApi.getFileWrite')
# m.return_value = False # m.return_value = False
# assert d.file_write == False # assert d.file_write == False
# def test_set_file_write(d, mocker): # def test_set_file_write(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setFileWrite') # m = mocker.patch('_slsdet.DetectorApi.setFileWrite')
# d.file_write = True # d.file_write = True
# m.assert_called_once_with(True) # m.assert_called_once_with(True)
# def test_get_firmware_version(d, mocker): # def test_get_firmware_version(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getFirmwareVersion') # m = mocker.patch('_slsdet.DetectorApi.getFirmwareVersion')
# m.return_value = 20 # m.return_value = 20
# assert d.firmware_version == 20 # assert d.firmware_version == 20
@ -168,38 +168,38 @@ def test_set_counters_single(d, mocker):
# d.firmware_version = 20 # d.firmware_version = 20
# def test_get_high_voltage_call_signature(d, mocker): # def test_get_high_voltage_call_signature(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getDac') # m = mocker.patch('_slsdet.DetectorApi.getDac')
# d.high_voltage # d.high_voltage
# m.assert_called_once_with('vhighvoltage', -1) # m.assert_called_once_with('vhighvoltage', -1)
# def test_get_high_voltage(d, mocker): # def test_get_high_voltage(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getDac') # m = mocker.patch('_slsdet.DetectorApi.getDac')
# m.return_value = 80 # m.return_value = 80
# assert d.high_voltage == 80 # assert d.high_voltage == 80
# #self._api.setDac('vhighvoltage', -1, voltage) # #self._api.setDac('vhighvoltage', -1, voltage)
# def test_set_high_voltage(d, mocker): # def test_set_high_voltage(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setDac') # m = mocker.patch('_slsdet.DetectorApi.setDac')
# d.high_voltage = 80 # d.high_voltage = 80
# m.assert_called_once_with('vhighvoltage', -1, 80) # m.assert_called_once_with('vhighvoltage', -1, 80)
# def test_decode_hostname_two_names(d, mocker): # def test_decode_hostname_two_names(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getHostname') # m = mocker.patch('_slsdet.DetectorApi.getHostname')
# m.return_value = 'beb059+beb048+' # m.return_value = 'beb059+beb048+'
# assert d.hostname == ['beb059', 'beb048'] # assert d.hostname == ['beb059', 'beb048']
# def test_decode_hostname_four_names(d, mocker): # def test_decode_hostname_four_names(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getHostname') # m = mocker.patch('_slsdet.DetectorApi.getHostname')
# m.return_value = 'beb059+beb048+beb120+beb153+' # m.return_value = 'beb059+beb048+beb120+beb153+'
# assert d.hostname == ['beb059', 'beb048', 'beb120', 'beb153'] # assert d.hostname == ['beb059', 'beb048', 'beb120', 'beb153']
# def test_decode_hostname_blank(d, mocker): # def test_decode_hostname_blank(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getHostname') # m = mocker.patch('_slsdet.DetectorApi.getHostname')
# m.return_value = '' # m.return_value = ''
# assert d.hostname == [] # assert d.hostname == []
# def test_get_image_size_gives_correct_size(d, mocker): # def test_get_image_size_gives_correct_size(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getImageSize') # m = mocker.patch('_slsdet.DetectorApi.getImageSize')
# m.return_value = (512,1024) # m.return_value = (512,1024)
# im_size = d.image_size # im_size = d.image_size
# assert im_size.rows == 512 # assert im_size.rows == 512
@ -208,7 +208,7 @@ def test_set_counters_single(d, mocker):
# def test_load_config(d, mocker): # def test_load_config(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.readConfigurationFile') # m = mocker.patch('_slsdet.DetectorApi.readConfigurationFile')
# #To avoid raising an exception because path is not there # #To avoid raising an exception because path is not there
# mock_os = mocker.patch('os.path.isfile') # mock_os = mocker.patch('os.path.isfile')
# mock_os.return_value = True # mock_os.return_value = True
@ -216,14 +216,14 @@ def test_set_counters_single(d, mocker):
# m.assert_called_once_with('/path/to/my/file.config') # m.assert_called_once_with('/path/to/my/file.config')
# def test_load_config_raises_when_file_is_not_found(d, mocker): # def test_load_config_raises_when_file_is_not_found(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.readConfigurationFile') # mocker.patch('_slsdet.DetectorApi.readConfigurationFile')
# mock_os = mocker.patch('os.path.isfile') # mock_os = mocker.patch('os.path.isfile')
# mock_os.return_value = False # mock_os.return_value = False
# with pytest.raises(FileNotFoundError): # with pytest.raises(FileNotFoundError):
# d.load_config('/path/to/my/file.config') # d.load_config('/path/to/my/file.config')
# def test_load_parameters(d, mocker): # def test_load_parameters(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.readParametersFile') # m = mocker.patch('_slsdet.DetectorApi.readParametersFile')
# #To avoid raising an exception because path is not there # #To avoid raising an exception because path is not there
# mock_os = mocker.patch('os.path.isfile') # mock_os = mocker.patch('os.path.isfile')
# mock_os.return_value = True # mock_os.return_value = True
@ -231,7 +231,7 @@ def test_set_counters_single(d, mocker):
# m.assert_called_once_with('/path/to/my/file.par') # m.assert_called_once_with('/path/to/my/file.par')
# def test_load_parameters_raises_when_file_is_not_found(d, mocker): # def test_load_parameters_raises_when_file_is_not_found(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.readParametersFile') # mocker.patch('_slsdet.DetectorApi.readParametersFile')
# mock_os = mocker.patch('os.path.isfile') # mock_os = mocker.patch('os.path.isfile')
# mock_os.return_value = False # mock_os.return_value = False
# with pytest.raises(FileNotFoundError): # with pytest.raises(FileNotFoundError):
@ -239,14 +239,14 @@ def test_set_counters_single(d, mocker):
# #getDetectorGeometry # #getDetectorGeometry
# def test_get_module_geometry_gives_correct_size(d, mocker): # def test_get_module_geometry_gives_correct_size(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getDetectorGeometry') # m = mocker.patch('_slsdet.DetectorApi.getDetectorGeometry')
# m.return_value = (13,7) # m.return_value = (13,7)
# g = d.module_geometry # g = d.module_geometry
# assert g.vertical == 7 # assert g.vertical == 7
# assert g.horizontal == 13 # assert g.horizontal == 13
# def test_get_module_geometry_access(d, mocker): # def test_get_module_geometry_access(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getDetectorGeometry') # m = mocker.patch('_slsdet.DetectorApi.getDetectorGeometry')
# m.return_value = (12,3) # m.return_value = (12,3)
# assert d.module_geometry[0] == 12 # assert d.module_geometry[0] == 12
# assert d.module_geometry[1] == 3 # assert d.module_geometry[1] == 3
@ -259,12 +259,12 @@ def test_set_counters_single(d, mocker):
# assert t.vertical == 0 # assert t.vertical == 0
# def test_get_n_frames(d, mocker): # def test_get_n_frames(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getNumberOfFrames') # m = mocker.patch('_slsdet.DetectorApi.getNumberOfFrames')
# m.return_value = 3 # m.return_value = 3
# assert d.n_frames == 3 # assert d.n_frames == 3
# def test_set_n_frames(d, mocker): # def test_set_n_frames(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setNumberOfFrames') # m = mocker.patch('_slsdet.DetectorApi.setNumberOfFrames')
# d.n_frames = 9 # d.n_frames = 9
# m.assert_called_once_with(9) # m.assert_called_once_with(9)
@ -272,12 +272,12 @@ def test_set_counters_single(d, mocker):
# assert d.n_frames == -100 # assert d.n_frames == -100
# def test_set_n_frames_raises_on_neg(d, mocker): # def test_set_n_frames_raises_on_neg(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.setNumberOfFrames') # mocker.patch('_slsdet.DetectorApi.setNumberOfFrames')
# with pytest.raises(DetectorValueError): # with pytest.raises(DetectorValueError):
# d.n_frames = -1 # d.n_frames = -1
# def test_set_n_frames_raises_on_zero(d, mocker): # def test_set_n_frames_raises_on_zero(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.setNumberOfFrames') # mocker.patch('_slsdet.DetectorApi.setNumberOfFrames')
# with pytest.raises(DetectorValueError): # with pytest.raises(DetectorValueError):
# d.n_frames = 0 # d.n_frames = 0
@ -285,12 +285,12 @@ def test_set_counters_single(d, mocker):
# assert d.n_cycles == -100 # assert d.n_cycles == -100
# def test_set_n_cycles_raises_on_zero(d, mocker): # def test_set_n_cycles_raises_on_zero(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.setCycles') # mocker.patch('_slsdet.DetectorApi.setCycles')
# with pytest.raises(DetectorValueError): # with pytest.raises(DetectorValueError):
# d.n_cycles = 0 # d.n_cycles = 0
# def test_set_n_cycles(d, mocker): # def test_set_n_cycles(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setCycles') # m = mocker.patch('_slsdet.DetectorApi.setCycles')
# d.n_cycles = 56 # d.n_cycles = 56
# m.assert_called_once_with(56) # m.assert_called_once_with(56)
@ -300,12 +300,12 @@ def test_set_counters_single(d, mocker):
# assert d.n_measurements == -100 # assert d.n_measurements == -100
# def test_set_n_measurements_raises_on_zero(d, mocker): # def test_set_n_measurements_raises_on_zero(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.setNumberOfMeasurements') # mocker.patch('_slsdet.DetectorApi.setNumberOfMeasurements')
# with pytest.raises(DetectorValueError): # with pytest.raises(DetectorValueError):
# d.n_measurements = 0 # d.n_measurements = 0
# def test_set_n_measurements(d, mocker): # def test_set_n_measurements(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setNumberOfMeasurements') # m = mocker.patch('_slsdet.DetectorApi.setNumberOfMeasurements')
# d.n_measurements = 560 # d.n_measurements = 560
# m.assert_called_once_with(560) # m.assert_called_once_with(560)
@ -313,33 +313,33 @@ def test_set_counters_single(d, mocker):
# assert d.n_modules == 0 # assert d.n_modules == 0
# def test_get_n_modules(d, mocker): # def test_get_n_modules(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getNumberOfDetectors') # m = mocker.patch('_slsdet.DetectorApi.getNumberOfDetectors')
# m.return_value = 12 # m.return_value = 12
# assert d.n_modules == 12 # assert d.n_modules == 12
# def test_get_period_time(d, mocker): # def test_get_period_time(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getPeriod') # m = mocker.patch('_slsdet.DetectorApi.getPeriod')
# m.return_value = 130000000 # m.return_value = 130000000
# assert d.period == 0.13 # assert d.period == 0.13
# def test_set_period_time(d, mocker): # def test_set_period_time(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setPeriod') # m = mocker.patch('_slsdet.DetectorApi.setPeriod')
# d.period = 1.953 # d.period = 1.953
# m.assert_called_once_with(1953000000) # m.assert_called_once_with(1953000000)
# def test_set_period_time_less_than_zero(d, mocker): # def test_set_period_time_less_than_zero(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.setPeriod') # mocker.patch('_slsdet.DetectorApi.setPeriod')
# with pytest.raises(ValueError): # with pytest.raises(ValueError):
# d.period = -7 # d.period = -7
# def test_get_online(d, mocker): # def test_get_online(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getOnline') # m = mocker.patch('_slsdet.DetectorApi.getOnline')
# d.online # d.online
# m.assert_called_once_with() # m.assert_called_once_with()
# def test_set_online(d, mocker): # def test_set_online(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setOnline') # m = mocker.patch('_slsdet.DetectorApi.setOnline')
# d.online = True # d.online = True
# m.assert_called_once_with(True) # m.assert_called_once_with(True)
@ -347,116 +347,116 @@ def test_set_counters_single(d, mocker):
# assert d.last_client_ip == '' # assert d.last_client_ip == ''
# def test_last_cliten_ip_call(d, mocker): # def test_last_cliten_ip_call(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getLastClientIP') # m = mocker.patch('_slsdet.DetectorApi.getLastClientIP')
# d.last_client_ip # d.last_client_ip
# m.assert_called_once_with() # m.assert_called_once_with()
# #-------------------------------------------------------------Rate correction # #-------------------------------------------------------------Rate correction
# def test_get_rate_correction(d, mocker): # def test_get_rate_correction(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getRateCorrection') # m = mocker.patch('_slsdet.DetectorApi.getRateCorrection')
# m.return_value = [132,129] # m.return_value = [132,129]
# assert d.rate_correction == [132,129] # assert d.rate_correction == [132,129]
# def test_set_rate_correction(d, mocker): # def test_set_rate_correction(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setRateCorrection') # m = mocker.patch('_slsdet.DetectorApi.setRateCorrection')
# mock_n = mocker.patch('_sls_detector.DetectorApi.getNumberOfDetectors') # mock_n = mocker.patch('_slsdet.DetectorApi.getNumberOfDetectors')
# mock_n.return_value = 3 # mock_n.return_value = 3
# d.rate_correction = [123,90,50] # d.rate_correction = [123,90,50]
# m.assert_called_once_with([123,90,50]) # m.assert_called_once_with([123,90,50])
# def test_set_rate_correction_raises_on_wrong_number_of_values(d, mocker): # def test_set_rate_correction_raises_on_wrong_number_of_values(d, mocker):
# mocker.patch('_sls_detector.DetectorApi.setRateCorrection') # mocker.patch('_slsdet.DetectorApi.setRateCorrection')
# mock_n = mocker.patch('_sls_detector.DetectorApi.getNumberOfDetectors') # mock_n = mocker.patch('_slsdet.DetectorApi.getNumberOfDetectors')
# mock_n.return_value = 4 # mock_n.return_value = 4
# with pytest.raises(ValueError): # with pytest.raises(ValueError):
# d.rate_correction = [123,90,50] # d.rate_correction = [123,90,50]
# #----------------------------------------------------------------Readout clock # #----------------------------------------------------------------Readout clock
# def test_get_readout_clock_0(d, mocker): # def test_get_readout_clock_0(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getReadoutClockSpeed') # m = mocker.patch('_slsdet.DetectorApi.getReadoutClockSpeed')
# m.return_value = 0 # m.return_value = 0
# assert d.readout_clock == 'Full Speed' # assert d.readout_clock == 'Full Speed'
# def test_get_readout_clock_1(d, mocker): # def test_get_readout_clock_1(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getReadoutClockSpeed') # m = mocker.patch('_slsdet.DetectorApi.getReadoutClockSpeed')
# m.return_value = 1 # m.return_value = 1
# assert d.readout_clock == 'Half Speed' # assert d.readout_clock == 'Half Speed'
# def test_get_readout_clock_2(d, mocker): # def test_get_readout_clock_2(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getReadoutClockSpeed') # m = mocker.patch('_slsdet.DetectorApi.getReadoutClockSpeed')
# m.return_value = 2 # m.return_value = 2
# assert d.readout_clock == 'Quarter Speed' # assert d.readout_clock == 'Quarter Speed'
# def test_get_readout_clock_3(d, mocker): # def test_get_readout_clock_3(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getReadoutClockSpeed') # m = mocker.patch('_slsdet.DetectorApi.getReadoutClockSpeed')
# m.return_value = 3 # m.return_value = 3
# assert d.readout_clock == 'Super Slow Speed' # assert d.readout_clock == 'Super Slow Speed'
# def test_set_readout_clock_0(d, mocker): # def test_set_readout_clock_0(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setReadoutClockSpeed') # m = mocker.patch('_slsdet.DetectorApi.setReadoutClockSpeed')
# d.readout_clock = 'Full Speed' # d.readout_clock = 'Full Speed'
# m.assert_called_once_with(0) # m.assert_called_once_with(0)
# def test_set_readout_clock_1(d, mocker): # def test_set_readout_clock_1(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setReadoutClockSpeed') # m = mocker.patch('_slsdet.DetectorApi.setReadoutClockSpeed')
# d.readout_clock = 'Half Speed' # d.readout_clock = 'Half Speed'
# m.assert_called_once_with(1) # m.assert_called_once_with(1)
# def test_set_readout_clock_2(d, mocker): # def test_set_readout_clock_2(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setReadoutClockSpeed') # m = mocker.patch('_slsdet.DetectorApi.setReadoutClockSpeed')
# d.readout_clock = 'Quarter Speed' # d.readout_clock = 'Quarter Speed'
# m.assert_called_once_with(2) # m.assert_called_once_with(2)
# def test_set_readout_clock_3(d, mocker): # def test_set_readout_clock_3(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setReadoutClockSpeed') # m = mocker.patch('_slsdet.DetectorApi.setReadoutClockSpeed')
# d.readout_clock = 'Super Slow Speed' # d.readout_clock = 'Super Slow Speed'
# m.assert_called_once_with(3) # m.assert_called_once_with(3)
# #----------------------------------------------------------------rx_datastream # #----------------------------------------------------------------rx_datastream
# def test_get_rx_datastream(d, mocker): # def test_get_rx_datastream(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getRxDataStreamStatus') # m = mocker.patch('_slsdet.DetectorApi.getRxDataStreamStatus')
# m.return_value = False # m.return_value = False
# assert d.rx_datastream == False # assert d.rx_datastream == False
# def test_set_rx_datastream(d, mocker): # def test_set_rx_datastream(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setRxDataStreamStatus') # m = mocker.patch('_slsdet.DetectorApi.setRxDataStreamStatus')
# d.rx_datastream = True # d.rx_datastream = True
# m.assert_called_once_with(True) # m.assert_called_once_with(True)
# def test_get_rx_zmqip(d, mocker): # def test_get_rx_zmqip(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getNetworkParameter') # m = mocker.patch('_slsdet.DetectorApi.getNetworkParameter')
# d.rx_zmqip # d.rx_zmqip
# m.assert_called_once_with('rx_zmqip') # m.assert_called_once_with('rx_zmqip')
# def test_get_rx_zmqport_call(d, mocker): # def test_get_rx_zmqport_call(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getNetworkParameter') # m = mocker.patch('_slsdet.DetectorApi.getNetworkParameter')
# d.rx_zmqport # d.rx_zmqport
# m.assert_called_once_with('rx_zmqport') # m.assert_called_once_with('rx_zmqport')
# def test_get_rx_zmqport_decode(d, mocker): # def test_get_rx_zmqport_decode(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getNetworkParameter') # m = mocker.patch('_slsdet.DetectorApi.getNetworkParameter')
# m.return_value = ['30001', '30003'] # m.return_value = ['30001', '30003']
# assert d.rx_zmqport == [30001, 30003] # assert d.rx_zmqport == [30001, 30003]
# def test_get_rx_zmqport_empty(d, mocker): # def test_get_rx_zmqport_empty(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getNetworkParameter') # m = mocker.patch('_slsdet.DetectorApi.getNetworkParameter')
# m.return_value = '' # m.return_value = ''
# assert d.rx_zmqport == [] # assert d.rx_zmqport == []
# #--------------------------------------------------------------------status # #--------------------------------------------------------------------status
# def test_status_call(d, mocker): # def test_status_call(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getRunStatus') # m = mocker.patch('_slsdet.DetectorApi.getRunStatus')
# d.status # d.status
# m.assert_called_once_with() # m.assert_called_once_with()
# def test_start_detecor(d, mocker): # def test_start_detecor(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.startAcquisition') # m = mocker.patch('_slsdet.DetectorApi.startAcquisition')
# d.start_detector() # d.start_detector()
# m.assert_called_once_with() # m.assert_called_once_with()
# def test_stop_acq_call(d, mocker): # def test_stop_acq_call(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.stopAcquisition') # m = mocker.patch('_slsdet.DetectorApi.stopAcquisition')
# d.stop_detector() # d.stop_detector()
# m.assert_called_once_with() # m.assert_called_once_with()
@ -464,23 +464,23 @@ def test_set_counters_single(d, mocker):
# #------------------------------------------------------------------timing mode # #------------------------------------------------------------------timing mode
# def test_get_timing_mode(d, mocker): # def test_get_timing_mode(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getTimingMode') # m = mocker.patch('_slsdet.DetectorApi.getTimingMode')
# d.timing_mode # d.timing_mode
# m.assert_called_once_with() # m.assert_called_once_with()
# def test_set_timing_mode(d, mocker): # def test_set_timing_mode(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setTimingMode') # m = mocker.patch('_slsdet.DetectorApi.setTimingMode')
# d.timing_mode = 'auto' # d.timing_mode = 'auto'
# m.assert_called_once_with('auto') # m.assert_called_once_with('auto')
# #----------------------------------------------------------------vthreshold # #----------------------------------------------------------------vthreshold
# def test_get_vthreshold(d, mocker): # def test_get_vthreshold(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.getDac') # m = mocker.patch('_slsdet.DetectorApi.getDac')
# d.vthreshold # d.vthreshold
# m.assert_called_once_with('vthreshold', -1) # m.assert_called_once_with('vthreshold', -1)
# def test_set_vthreshold(d, mocker): # def test_set_vthreshold(d, mocker):
# m = mocker.patch('_sls_detector.DetectorApi.setDac') # m = mocker.patch('_slsdet.DetectorApi.setDac')
# d.vthreshold = 1675 # d.vthreshold = 1675
# m.assert_called_once_with('vthreshold', -1, 1675) # m.assert_called_once_with('vthreshold', -1, 1675)

View File

@ -19,3 +19,18 @@ target_link_libraries(result
set_target_properties(result PROPERTIES set_target_properties(result PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
) )
add_executable(udp udp.cpp)
target_link_libraries(udp
slsDetectorShared
slsSupportLib
pthread
rt
fmt
)
set_target_properties(udp PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)

65
sample/udp.cpp Normal file
View File

@ -0,0 +1,65 @@
#include "UdpRxSocket.h"
#include "sls_detector_defs.h"
#include <chrono>
#include <fmt/format.h>
#include <iostream>
#include <thread>
#include "network_utils.h"
// Assume packages arrive in order
// Assume frame nr starts from 0
using header_t = slsDetectorDefs::sls_detector_header;
int main() {
fmt::print("Hej!\n");
constexpr ssize_t packet_size = 4144;
constexpr ssize_t payload_size = packet_size - sizeof(header_t);
int port = 50012;
char * buffer = new char[packet_size];
sls::UdpRxSocket s(port, packet_size, "10.1.1.107");
int n = 0;
while(true){
// s.ReceiveDataOnly(buffer);
if (s.ReceivePacket())
std::cout << n++ << std::endl;
}
// auto header = reinterpret_cast<header_t *>(s.buffer());
// char *data = s.buffer() + sizeof(header_t);
// fmt::print("buffer start: {}\nheader: {}\ndata: {}\n", fmt::ptr(s.buffer()),
// fmt::ptr(header), fmt::ptr(data));
// int n = 0;
// fmt::print("Buffer size: {}\n", s.buffer_size());
// std::vector<uint16_t> image(n_pixels);
// char *image_data = (char *)image.data();
// uint64_t frame_nr = 0;
// while (true) {
// if (s.ReceivePacket()) {
// // fmt::print("frame: {} pkt: {} dst: {}\n", header->frameNumber,
// // header->packetNumber, header->packetNumber*payload_size);
// if (header->frameNumber != frame_nr) {
// // dispatch frame
// fmt::print("frame {} done! got: {} pkgs\n", frame_nr, n);
// frame_nr = header->frameNumber;
// n = 0;
// std::this_thread::sleep_for(std::chrono::milliseconds(1));
// }
// ++n;
// memcpy(image_data + header->packetNumber * payload_size, data,
// payload_size);
// } else {
// std::cout << "timeout\n";
// }
// }
}

View File

@ -1,5 +1,8 @@
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
find_package(PNG REQUIRED)
find_package(ZLIB REQUIRED)
set(SOURCES set(SOURCES
slsDetectorPlotting/src/SlsQt1DPlot.cxx slsDetectorPlotting/src/SlsQt1DPlot.cxx
slsDetectorPlotting/src/SlsQt1DZoomer.cxx slsDetectorPlotting/src/SlsQt1DZoomer.cxx
@ -89,8 +92,8 @@ target_link_libraries(slsDetectorGui PUBLIC
${QT_QTCORE_LIBRARIES} ${QT_QTCORE_LIBRARIES}
${QT_QTGUI_LIBRARIES} ${QT_QTGUI_LIBRARIES}
${QWT_LIBRARIES} ${QWT_LIBRARIES}
png PNG::PNG
z ZLIB::ZLIB
Qt4::QtOpenGL Qt4::QtOpenGL
Qt4::QtSvg Qt4::QtSvg
) )

View File

@ -28,7 +28,7 @@ target_compile_definitions(jungfrauDetectorServer_virtual
) )
target_link_libraries(jungfrauDetectorServer_virtual target_link_libraries(jungfrauDetectorServer_virtual
PUBLIC pthread rt PUBLIC pthread rt slsProjectOptions slsProjectWarnings
) )
set_target_properties(jungfrauDetectorServer_virtual PROPERTIES set_target_properties(jungfrauDetectorServer_virtual PROPERTIES

View File

@ -33,6 +33,8 @@ target_link_libraries(slsDetectorShared PUBLIC
slsProjectWarnings slsProjectWarnings
slsSupportLib slsSupportLib
${ZeroMQ_LIBRARIES} ${ZeroMQ_LIBRARIES}
pthread
rt
) )
set(PUBLICHEADERS set(PUBLICHEADERS

View File

@ -12,6 +12,7 @@
#include "container_utils.h" // For sls::make_unique<> #include "container_utils.h" // For sls::make_unique<>
#include "genericSocket.h" #include "genericSocket.h"
#include "sls_detector_exceptions.h" #include "sls_detector_exceptions.h"
#include "UdpRxSocket.h"
#include <cerrno> #include <cerrno>
#include <cstring> #include <cstring>
@ -147,7 +148,6 @@ void Listener::SetGeneralData(GeneralData* g) {
void Listener::CreateUDPSockets() { void Listener::CreateUDPSockets() {
if (!(*activated)) { if (!(*activated)) {
return; return;
} }
@ -163,7 +163,7 @@ void Listener::CreateUDPSockets() {
ShutDownUDPSocket(); ShutDownUDPSocket();
try{ try{
udpSocket = sls::make_unique<genericSocket>(*udpPortNumber, genericSocket::UDP, udpSocket = sls::make_unique<SELECTED_SOCKET>(*udpPortNumber, genericSocket::UDP,
generalData->packetSize, ((*eth).length() ? (*eth).c_str() : nullptr), generalData->headerPacketSize, generalData->packetSize, ((*eth).length() ? (*eth).c_str() : nullptr), generalData->headerPacketSize,
*udpSocketBufferSize); *udpSocketBufferSize);
FILE_LOG(logINFO) << index << ": UDP port opened at port " << *udpPortNumber; FILE_LOG(logINFO) << index << ": UDP port opened at port " << *udpPortNumber;
@ -213,7 +213,7 @@ void Listener::CreateDummySocketForUDPSocketBufferSize(int64_t s) {
//create dummy socket //create dummy socket
try { try {
genericSocket g(*udpPortNumber, genericSocket::UDP, SELECTED_SOCKET g(*udpPortNumber, genericSocket::UDP,
generalData->packetSize, ((*eth).length() ? (*eth).c_str() : nullptr), generalData->headerPacketSize, generalData->packetSize, ((*eth).length() ? (*eth).c_str() : nullptr), generalData->headerPacketSize,
*udpSocketBufferSize); *udpSocketBufferSize);

View File

@ -16,6 +16,13 @@
class GeneralData; class GeneralData;
class Fifo; class Fifo;
class genericSocket; class genericSocket;
namespace sls{
class UdpRxSocket;
}
// #define SELECTED_SOCKET genericSocket
#define SELECTED_SOCKET sls::UdpRxSocket
class Listener : private virtual slsDetectorDefs, public ThreadObject { class Listener : private virtual slsDetectorDefs, public ThreadObject {
@ -187,7 +194,7 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject {
std::atomic<runStatus>* status; std::atomic<runStatus>* status;
/** UDP Socket - Detector to Receiver */ /** UDP Socket - Detector to Receiver */
std::unique_ptr<genericSocket> udpSocket; std::unique_ptr<SELECTED_SOCKET> udpSocket;
/** UDP Port Number */ /** UDP Port Number */
uint32_t* udpPortNumber; uint32_t* udpPortNumber;

View File

@ -58,6 +58,7 @@ set_target_properties(slsSupportLib PROPERTIES
target_link_libraries(slsSupportLib target_link_libraries(slsSupportLib
slsProjectOptions slsProjectOptions
slsProjectWarnings slsProjectWarnings
${ZeroMQ_LIBRARIES}
rapidjson) rapidjson)
if (SLS_USE_TESTS) if (SLS_USE_TESTS)

View File

@ -0,0 +1,151 @@
/*
UdpRxSocket provies socket control to receive
data on a udp socket.
It provides a drop in replacement for
genericSocket. But please be careful since
this might be deprecated in the future
*/
#include "genericSocket.h"
#include "network_utils.h"
#include "sls_detector_exceptions.h"
#include <cstdint>
#include <errno.h>
#include <iostream>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <vector>
namespace sls {
class UdpRxSocket {
const ssize_t packet_size;
char *buff;
int fd = -1;
public:
UdpRxSocket(int port, ssize_t packet_size, const char *hostname = nullptr,
ssize_t buffer_size = 0)
: packet_size(packet_size) {
/* hostname = nullptr -> wildcard */
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
struct addrinfo *res = 0;
const std::string portname = std::to_string(port);
if (getaddrinfo(hostname, portname.c_str(), &hints, &res)) {
throw RuntimeError("Failed at getaddrinfo with " +
std::string(hostname));
}
fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (fd == -1) {
throw RuntimeError("Failed to create UDP RX socket");
}
if (bind(fd, res->ai_addr, res->ai_addrlen) == -1) {
throw RuntimeError("Failed to bind UDP RX socket");
}
freeaddrinfo(res);
// If we get a specified buffer size that is larger than the set one
// we set it. Otherwise we leave it there since it could have been
// set by the rx_udpsocksize command
if (buffer_size) {
auto current = getBufferSize() / 2;
if (current < buffer_size) {
setBufferSize(buffer_size);
if (getBufferSize() / 2 < buffer_size) {
FILE_LOG(logWARNING)
<< "Could not set buffer size. Got: "
<< getBufferSize() / 2 << " instead of " << buffer_size;
}
}
}
// Allocate at the end to avoid memory leak if we throw
buff = new char[packet_size];
}
// Delegating constructor to allow drop in replacement for old socket class
// This one might be removed in the future
UdpRxSocket(unsigned short int const port_number,
genericSocket::communicationProtocol p,
int ps = DEFAULT_PACKET_SIZE, const char *eth = NULL,
int hsize = 0, uint64_t buf_size = SOCKET_BUFFER_SIZE)
: UdpRxSocket(port_number, ps, InterfaceNameToIp(eth).str().c_str(),
buf_size) {}
~UdpRxSocket() {
delete[] buff;
Shutdown();
}
const char *LastPacket() const noexcept { return buff; }
constexpr ssize_t getPacketSize() const noexcept { return packet_size; }
bool ReceivePacket() noexcept {
auto bytes_received =
recvfrom(fd, buff, packet_size, 0, nullptr, nullptr);
return bytes_received == packet_size;
}
bool ReceivePacket(char *dst) noexcept {
auto bytes_received =
recvfrom(fd, buff, packet_size, 0, nullptr, nullptr);
return bytes_received == packet_size;
}
// Only for backwards compatibility this function will be removed during
// refactoring of the receiver
ssize_t ReceiveDataOnly(char *dst) {
auto r = recvfrom(fd, dst, packet_size, 0, nullptr, nullptr);
constexpr ssize_t eiger_header_packet =
40; // only detector that has this
if (r == eiger_header_packet) {
FILE_LOG(logWARNING) << "Got header pkg";
r = recvfrom(fd, dst, packet_size, 0, nullptr, nullptr);
}
return r;
}
ssize_t getBufferSize() const {
uint64_t ret_size = 0;
socklen_t optlen = sizeof(uint64_t);
if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, &ret_size, &optlen) == -1)
return -1;
else
return ret_size;
}
// Only for backwards compatibility will be removed
ssize_t getActualUDPSocketBufferSize() const { return getBufferSize(); }
// Only for backwards compatibility will be removed
void ShutDownSocket() { Shutdown(); }
void setBufferSize(ssize_t size) {
socklen_t optlen = sizeof(size);
if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &size, optlen)) {
throw RuntimeError("Could not set socket buffer size");
}
}
void Shutdown() {
shutdown(fd, SHUT_RDWR);
if (fd >= 0) {
close(fd);
fd = -1;
}
}
};
} // namespace sls

View File

@ -62,7 +62,7 @@ class MacAddr {
IpAddr HostnameToIp(const char *hostname); IpAddr HostnameToIp(const char *hostname);
std::string IpToInterfaceName(const std::string& ip); std::string IpToInterfaceName(const std::string& ip);
MacAddr InterfaceNameToMac(const std::string& inf); MacAddr InterfaceNameToMac(const std::string& inf);
IpAddr InterfaceNameToIp(const std::string& ifn);
std::ostream &operator<<(std::ostream &out, const IpAddr &addr); std::ostream &operator<<(std::ostream &out, const IpAddr &addr);
std::ostream &operator<<(std::ostream &out, const MacAddr &addr); std::ostream &operator<<(std::ostream &out, const MacAddr &addr);

View File

@ -1,34 +1,31 @@
#include "sls_detector_exceptions.h" #include "sls_detector_exceptions.h"
#include <algorithm> #include <algorithm>
#include <arpa/inet.h>
#include <cassert> #include <cassert>
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
#include <ifaddrs.h>
#include <iomanip> #include <iomanip>
#include <sstream> #include <net/if.h>
#include <sys/prctl.h>
#include <arpa/inet.h>
#include <netdb.h> #include <netdb.h>
#include <sstream>
#include <sys/ioctl.h>
#include <sys/prctl.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/ioctl.h>
#include <ifaddrs.h>
#include <net/if.h>
#include "network_utils.h" #include "network_utils.h"
namespace sls { namespace sls {
IpAddr::IpAddr(const std::string &address) { IpAddr::IpAddr(const std::string &address) {
inet_pton(AF_INET, address.c_str(), &addr_); inet_pton(AF_INET, address.c_str(), &addr_);
} }
IpAddr::IpAddr(const char *address) { inet_pton(AF_INET, address, &addr_); } IpAddr::IpAddr(const char *address) { inet_pton(AF_INET, address, &addr_); }
std::string IpAddr::str() const { std::string IpAddr::str() const { return arr().data(); }
return arr().data();
}
std::array<char, INET_ADDRSTRLEN> IpAddr::arr() const { std::array<char, INET_ADDRSTRLEN> IpAddr::arr() const {
std::array<char, INET_ADDRSTRLEN> ipstring{}; std::array<char, INET_ADDRSTRLEN> ipstring{};
@ -122,6 +119,35 @@ std::string IpToInterfaceName(const std::string &ip) {
return std::string(buf); return std::string(buf);
} }
IpAddr InterfaceNameToIp(const std::string &ifn) {
struct ifaddrs *ifaddr, *ifa;
// int family, s;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
return {};
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continue;
auto s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host,
NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if ((strcmp(ifa->ifa_name, ifn.c_str()) == 0) &&
(ifa->ifa_addr->sa_family == AF_INET)) {
if (s != 0) {
return {};
}
break;
}
}
freeifaddrs(ifaddr);
return IpAddr{host};
}
MacAddr InterfaceNameToMac(const std::string &inf) { MacAddr InterfaceNameToMac(const std::string &inf) {
// TODO! Copied from genericSocket needs to be refactored! // TODO! Copied from genericSocket needs to be refactored!
struct ifreq ifr; struct ifreq ifr;
@ -133,13 +159,13 @@ MacAddr InterfaceNameToMac(const std::string& inf) {
strncpy(ifr.ifr_name, inf.c_str(), sizeof(ifr.ifr_name) - 1); strncpy(ifr.ifr_name, inf.c_str(), sizeof(ifr.ifr_name) - 1);
ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0'; ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
if (-1 == ioctl(sock, SIOCGIFHWADDR, &ifr)) { if (-1 == ioctl(sock, SIOCGIFHWADDR, &ifr)) {
perror("ioctl(SIOCGIFHWADDR) "); perror("ioctl(SIOCGIFHWADDR) ");
return MacAddr{}; return MacAddr{};
} }
for (int j = 0, k = 0; j < 6; j++) { for (int j = 0, k = 0; j < 6; j++) {
k+=snprintf(mac+k, mac_len-k-1, j ? ":%02X" : "%02X", k += snprintf(
mac + k, mac_len - k - 1, j ? ":%02X" : "%02X",
(int)(unsigned int)(unsigned char)ifr.ifr_hwaddr.sa_data[j]); (int)(unsigned int)(unsigned char)ifr.ifr_hwaddr.sa_data[j]);
} }
mac[mac_len - 1] = '\0'; mac[mac_len - 1] = '\0';
@ -148,7 +174,6 @@ MacAddr InterfaceNameToMac(const std::string& inf) {
close(sock); close(sock);
} }
return MacAddr(mac); return MacAddr(mac);
} }
} // namespace sls } // namespace sls

View File

@ -8,4 +8,5 @@ target_sources(tests PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/test-FixedCapacityContainer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-FixedCapacityContainer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test-ToString.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-ToString.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test-TypeTraits.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-TypeTraits.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test-UdpRxSocket.cpp
) )

View File

@ -0,0 +1,89 @@
#include "UdpRxSocket.h"
#include "catch.hpp"
#include "sls_detector_exceptions.h"
#include <future>
#include <thread>
#include <vector>
int open_socket(int port) {
const char *host = nullptr; // localhost
// Create a socket for sending
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
struct addrinfo *res = 0;
const std::string portname = std::to_string(port);
if (getaddrinfo(host, portname.c_str(), &hints, &res)) {
throw sls::RuntimeError("Failed at getaddrinfo with " +
std::string(host));
}
int fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (fd == -1) {
throw sls::RuntimeError("Failed to create UDP RX socket");
}
if (connect(fd, res->ai_addr, res->ai_addrlen)){
throw sls::RuntimeError("Failed to connect socket");
}
freeaddrinfo(res);
return fd;
}
TEST_CASE("Receive a packet on localhost") {
constexpr int port = 50001;
std::vector<int> data_to_send{4, 5, 3, 2, 5, 7, 2, 3};
ssize_t packet_size =
sizeof(decltype(data_to_send)::value_type) * data_to_send.size();
sls::UdpRxSocket udpsock{port, packet_size};
int fd = open_socket(port);
// int n = sendto(fd, data_to_send.data(), packet_size, 0, res->ai_addr,
// res->ai_addrlen);
auto n = write(fd, data_to_send.data(), packet_size);
CHECK(n == packet_size);
CHECK(udpsock.ReceivePacket());
close(fd);
// Copy data from buffer and compare values
std::vector<int> data_received(data_to_send.size());
memcpy(data_received.data(), udpsock.LastPacket(), udpsock.getPacketSize());
CHECK(data_received.size() == data_to_send.size()); // sanity check
for (size_t i = 0; i != data_to_send.size(); ++i) {
CHECK(data_to_send[i] == data_received[i]);
}
}
TEST_CASE("Shutdown socket without hanging") {
constexpr int port = 50001;
constexpr ssize_t packet_size = 8000;
sls::UdpRxSocket s{port, packet_size};
// Start a thread and wait for package
// if the socket is left open we would block
std::future<bool> ret =
std::async(static_cast<bool (sls::UdpRxSocket::*)()>(
&sls::UdpRxSocket::ReceivePacket),
&s);
s.Shutdown();
auto r = ret.get();
CHECK(r == false); // since we didn't get the packet
}
TEST_CASE("Too small packet"){
constexpr int port = 50001;
sls::UdpRxSocket s(port, 2*sizeof(uint32_t));
auto fd = open_socket(port);
uint32_t val = 10;
write(fd, &val, sizeof(val));
CHECK(s.ReceivePacket() == false);
close(fd);
}