mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-17 07:17:13 +02:00
Compare commits
1 Commits
dacnames
...
cmakemoenc
Author | SHA1 | Date | |
---|---|---|---|
e229cd0ba7 |
@ -275,7 +275,6 @@ if(SLS_BUILD_DOCS)
|
|||||||
endif(SLS_BUILD_DOCS)
|
endif(SLS_BUILD_DOCS)
|
||||||
|
|
||||||
if(SLS_USE_MOENCH)
|
if(SLS_USE_MOENCH)
|
||||||
add_subdirectory(slsDetectorCalibration/tiffio)
|
|
||||||
add_subdirectory(slsDetectorCalibration/moenchExecutables)
|
add_subdirectory(slsDetectorCalibration/moenchExecutables)
|
||||||
endif(SLS_USE_MOENCH)
|
endif(SLS_USE_MOENCH)
|
||||||
|
|
||||||
|
40
RELEASE.txt
40
RELEASE.txt
@ -1,7 +1,7 @@
|
|||||||
SLS Detector Package Minor Release 7.0.0 released on 25.11.2021
|
SLS Detector Package Minor Release 6.1.0 released on 25.11.2021
|
||||||
===============================================================
|
===============================================================
|
||||||
|
|
||||||
This document describes the differences between v7.0.0 and v6.x.x
|
This document describes the differences between v6.1.0 and v6.0.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -21,42 +21,10 @@ This document describes the differences between v7.0.0 and v6.x.x
|
|||||||
|
|
||||||
- Fixed minor warnings (will fix commandline print of excess packets for missing packets)
|
- Fixed minor warnings (will fix commandline print of excess packets for missing packets)
|
||||||
- ctb slow adcs and any other adcs (other than temp) goes to the control Server
|
- ctb slow adcs and any other adcs (other than temp) goes to the control Server
|
||||||
- number of udp interfaces is 2 for Eiger (CHANGE IN API??)
|
|
||||||
- added module id for virtual servers into the udp header
|
|
||||||
- refactoring (rxr)
|
|
||||||
- fixed patsetbit and patsetmask for moench
|
- fixed patsetbit and patsetmask for moench
|
||||||
- changed default vref of adc9257 to 2V for moench (from 1.33V)
|
- changed default vref of adc9257 to 2V for moench (from 1.33V)
|
||||||
- moench and ctb - can set the starting frame number of next acquisition
|
|
||||||
- mythen server kernel check incompatible (cet timezone)
|
|
||||||
- rx_arping
|
|
||||||
- rx_threadsids max is now 9 (breaking api)
|
|
||||||
- fixed datastream disabling for eiger. Its only available in 10g mode.
|
|
||||||
- m3 server crash (vthrehsold dac names were not provided)
|
|
||||||
- allow vtrim to be interpolated for Eiger settings
|
|
||||||
- m3 setThresholdEnergy and setAllThresholdEnergy was overwriting gaincaps with settings enum
|
|
||||||
- can set localhost with virtual server with minimum configuration: (hostname localhost, rx_hostname localhost, udp_dstip auto)
|
|
||||||
- increases the progress according to listened index. (not processed index)
|
|
||||||
- current frame index points to listened frame index (not processed index)
|
|
||||||
- when in discard partial frames or empty mode, the frame number doesnt increase by 1, it increases to that number (so its faster)
|
|
||||||
- file write disabled by default
|
|
||||||
- eiger 12 bit mode
|
|
||||||
- start non blocking acquisition at modular level
|
|
||||||
- connect master commands to api (allow set master for eiger)
|
|
||||||
--ignore-config command line
|
|
||||||
- command line argument 'master' mainly for virtual servers (also master/top for real eiger), only one virtual server for eiger, use command lines for master/top
|
|
||||||
- stop servers also check for errors at startup( in case it was running with an older version)
|
|
||||||
- hostname cmd failed when connecting to servers in update mode (ctb, moench, jungfrau, eiger)
|
|
||||||
- missingpackets signed (negative => extra packets)
|
|
||||||
- framescaught and frameindex now returns a vector for each port
|
|
||||||
- progress looks at activated or enabled ports, so progress does not stagnate
|
|
||||||
- (eiger) disable datastreaming also for virtual servers only for 10g
|
|
||||||
- missing packets also takes care of disabled ports
|
|
||||||
- added geometry to metadata
|
|
||||||
- 10g eiger nextframenumber get fixed.
|
|
||||||
- stop, able to set nextframenumber to a consistent (max + 1) for all modules if different (eiger/ctb/jungfrau/moench)
|
|
||||||
- ctb: can set names for all the dacs
|
|
||||||
- fpga/kernel programming, checks if drive is a special file and not a normal file
|
|
||||||
- gotthard 25 um image reconstructed in gui and virtual hdf5 (firmware updated for slave to reverse channels)
|
|
||||||
|
|
||||||
2. Resolved Issues
|
2. Resolved Issues
|
||||||
==================
|
==================
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
|
|
||||||
#Copy the Moench executables
|
#Copy the Moench executables
|
||||||
mkdir -p $PREFIX/bin
|
mkdir -p $PREFIX/bin
|
||||||
cp build/install/bin/moench* $PREFIX/bin/.
|
cp build/install/bin/moench04ZmqProcess $PREFIX/bin/.
|
||||||
|
cp build/install/bin/moenchZmqProcess $PREFIX/bin/.
|
@ -34,7 +34,7 @@ add_executable(ctbGui
|
|||||||
ctbAdcs.cpp
|
ctbAdcs.cpp
|
||||||
ctbPattern.cpp
|
ctbPattern.cpp
|
||||||
ctbAcquisition.cpp
|
ctbAcquisition.cpp
|
||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/tiffio/src/tiffIO.cpp
|
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/tiffIO.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -43,7 +43,6 @@ target_include_directories(ctbGui PRIVATE
|
|||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/dataStructures
|
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/dataStructures
|
||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/interpolations
|
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/interpolations
|
||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/
|
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/
|
||||||
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/tiffio/include/
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Headders needed for ROOT dictionary generation
|
# Headders needed for ROOT dictionary generation
|
||||||
|
@ -21,10 +21,9 @@ fi
|
|||||||
|
|
||||||
if [ -f "$infile" ]
|
if [ -f "$infile" ]
|
||||||
then
|
then
|
||||||
dir=$(dirname $infile)
|
gcc -DINFILE="\"$infile\"" -DOUTFILE="\"$outfile\"" -DOUTFILEBIN="\"$outfilebin\"" -o $exe generator.c ;
|
||||||
gcc -DINFILE="\"$infile\"" -DOUTFILE="\"$outfile\"" -DOUTFILEBIN="\"$outfilebin\"" -o $exe generator.c -I$dir;
|
|
||||||
echo compiling
|
echo compiling
|
||||||
echo gcc -DINFILE="\"$infile\"" -DOUTFILE="\"$outfile\"" -DOUTFILEBIN="\"$outfilebin\"" -o $exe generator.c -I$dir;
|
echo gcc -DINFILE="\"$infile\"" -DOUTFILE="\"$outfile\"" -DOUTFILEBIN="\"$outfilebin\"" -o $exe generator.c ;
|
||||||
$exe ;
|
$exe ;
|
||||||
echo cleaning
|
echo cleaning
|
||||||
rm $exe
|
rm $exe
|
||||||
|
@ -3,33 +3,33 @@
|
|||||||
### edit with hostname or IP address of your detector
|
### edit with hostname or IP address of your detector
|
||||||
############################################
|
############################################
|
||||||
#hostname bchip181+
|
#hostname bchip181+
|
||||||
hostname bchip119.psi.ch
|
hostname bchip181+
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
### edit with hostname or 1Gbs IP address of your server
|
### edit with hostname or 1Gbs IP address of your server
|
||||||
############################################
|
############################################
|
||||||
rx_hostname mpc2011:1777
|
rx_hostname mpc2011
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
### edit with 10 Gbs IP of your server
|
### edit with 10 Gbs IP of your server
|
||||||
############################################
|
############################################
|
||||||
udp_dstip 10.1.2.102
|
udp_dstip 10.1.1.102
|
||||||
#############################################
|
#############################################
|
||||||
### edit with any number in the subnet of your server (first 3 numbers as above)
|
### edit with any number in the subnet of your server (first 3 numbers as above)
|
||||||
############################################
|
############################################
|
||||||
udp_srcip 10.1.2.19
|
udp_srcip 10.1.1.19
|
||||||
udp_dstport 32000
|
udp_dstport 32411
|
||||||
|
|
||||||
#############################################
|
#############################################
|
||||||
### edit with 10 Gbs IP of your server
|
### edit with 10 Gbs IP of your server
|
||||||
############################################
|
############################################
|
||||||
rx_zmqip 10.1.2.102
|
rx_zmqip 10.1.1.102
|
||||||
rx_zmqport 77000
|
rx_zmqport 50003
|
||||||
#############################################
|
#############################################
|
||||||
### edit with 1 Gbs IP of PC where you will run the GUI
|
### edit with 1 Gbs IP of PC where you will run the GUI
|
||||||
############################################
|
############################################
|
||||||
zmqip 129.129.202.132
|
zmqip 129.129.202.98
|
||||||
zmqport 77001
|
zmqport 50001
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ rx_zmqstream 1
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
frames 1000
|
frames 100000
|
||||||
period 0.0006
|
period 0.0006
|
||||||
exptime 0.00035
|
exptime 0.00035
|
||||||
|
|
||||||
@ -62,9 +62,3 @@ highvoltage 90
|
|||||||
#adcreg 0x14 0x40
|
#adcreg 0x14 0x40
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
frames 10
|
|
||||||
period 0.1
|
|
||||||
rx_jsonpara subframes 1
|
|
||||||
rx_jsonpara frameMode raw
|
|
||||||
rx_jsonpara detectorMode analog
|
|
||||||
|
5868
libs/catch/catch.hpp
5868
libs/catch/catch.hpp
File diff suppressed because it is too large
Load Diff
@ -13,8 +13,8 @@ import subprocess
|
|||||||
|
|
||||||
from parse import remove_comments
|
from parse import remove_comments
|
||||||
|
|
||||||
|
allow_bitwise_op = ["M3_GainCaps"]
|
||||||
allow_bitwise_op = ["streamingInterface", "M3_GainCaps"]
|
allow_bitwise_op = ["streamingInterface"]
|
||||||
|
|
||||||
op_key = {"operator|": "|",
|
op_key = {"operator|": "|",
|
||||||
"operator&" : "&"}
|
"operator&" : "&"}
|
||||||
|
@ -6,57 +6,49 @@ sls::Detector class. The tool needs the libclang bindings
|
|||||||
to be installed.
|
to be installed.
|
||||||
|
|
||||||
When the Detector API is updated this file should be run
|
When the Detector API is updated this file should be run
|
||||||
manually.
|
manually
|
||||||
"""
|
"""
|
||||||
from clang import cindex
|
from clang import cindex
|
||||||
import subprocess
|
import subprocess
|
||||||
import argparse
|
import argparse
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
from pathlib import Path
|
|
||||||
from parse import system_include_paths, clang_format_version
|
|
||||||
|
|
||||||
REDC = '\033[91m'
|
|
||||||
GREENC = '\033[92m'
|
|
||||||
ENDC = '\033[0m'
|
|
||||||
def red(msg):
|
|
||||||
return f'{REDC}{msg}{ENDC}'
|
|
||||||
|
|
||||||
def green(msg):
|
|
||||||
return f'{GREENC}{msg}{ENDC}'
|
|
||||||
|
|
||||||
def check_clang_format_version(required_version):
|
|
||||||
if (ver := clang_format_version()) != required_version:
|
|
||||||
msg = red(f'Clang format version {required_version} required, detected: {ver}. Bye!')
|
|
||||||
print(msg)
|
|
||||||
sys.exit(1)
|
|
||||||
else:
|
|
||||||
msg = green(f'Found clang-format version {ver}')
|
|
||||||
print(msg)
|
|
||||||
|
|
||||||
def check_for_compile_commands_json(path):
|
|
||||||
# print(f"Looking for compile data base in: {path}")
|
|
||||||
compile_data_base_file = path/'compile_commands.json'
|
|
||||||
if not compile_data_base_file.exists():
|
|
||||||
msg = red(f"No compile_commands.json file found in {path}. Bye!")
|
|
||||||
print(msg)
|
|
||||||
sys.exit(1)
|
|
||||||
else:
|
|
||||||
msg = green(f'Found: {compile_data_base_file}')
|
|
||||||
print(msg)
|
|
||||||
|
|
||||||
|
from parse import system_include_paths
|
||||||
|
|
||||||
default_build_path = "/home/l_frojdh/sls/build/"
|
default_build_path = "/home/l_frojdh/sls/build/"
|
||||||
fpath = "../../slsDetectorSoftware/src/Detector.cpp"
|
fpath = "../../slsDetectorSoftware/src/Detector.cpp"
|
||||||
|
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument(
|
||||||
|
"-p",
|
||||||
|
"--build_path",
|
||||||
|
help="Path to the build database",
|
||||||
|
type=str,
|
||||||
|
default=default_build_path,
|
||||||
|
)
|
||||||
|
cargs = parser.parse_args()
|
||||||
|
|
||||||
|
db = cindex.CompilationDatabase.fromDirectory(cargs.build_path)
|
||||||
|
index = cindex.Index.create()
|
||||||
|
args = db.getCompileCommands(fpath)
|
||||||
|
args = list(iter(args).__next__().arguments)[0:-1]
|
||||||
|
args = args + "-x c++ --std=c++11".split()
|
||||||
|
syspath = system_include_paths("clang++")
|
||||||
|
incargs = ["-I" + inc for inc in syspath]
|
||||||
|
args = args + incargs
|
||||||
|
|
||||||
|
|
||||||
|
tu = index.parse(fpath, args=args)
|
||||||
|
|
||||||
|
|
||||||
m = []
|
m = []
|
||||||
ag = []
|
ag = []
|
||||||
|
|
||||||
lines = []
|
lines = []
|
||||||
|
|
||||||
ag2 = []
|
ag2 = []
|
||||||
|
|
||||||
cn = []
|
cn = []
|
||||||
|
|
||||||
def get_arguments(node):
|
def get_arguments(node):
|
||||||
@ -74,7 +66,7 @@ def get_arguments_with_default(node):
|
|||||||
args = []
|
args = []
|
||||||
for arg in node.get_arguments():
|
for arg in node.get_arguments():
|
||||||
tokens = [t.spelling for t in arg.get_tokens()]
|
tokens = [t.spelling for t in arg.get_tokens()]
|
||||||
# print(tokens)
|
print(tokens)
|
||||||
if '=' in tokens:
|
if '=' in tokens:
|
||||||
if arg.type.spelling == "sls::Positions": #TODO! automate
|
if arg.type.spelling == "sls::Positions": #TODO! automate
|
||||||
args.append("py::arg() = Positions{}")
|
args.append("py::arg() = Positions{}")
|
||||||
@ -119,67 +111,33 @@ def visit(node):
|
|||||||
lines.append(
|
lines.append(
|
||||||
f'.def("{child.spelling}",{fs} &Detector::{child.spelling}{args})'
|
f'.def("{child.spelling}",{fs} &Detector::{child.spelling}{args})'
|
||||||
)
|
)
|
||||||
if cargs.verbose:
|
|
||||||
print(f'&Detector::{child.spelling}{args})')
|
|
||||||
cn.append(child)
|
cn.append(child)
|
||||||
for child in node.get_children():
|
for child in node.get_children():
|
||||||
visit(child)
|
visit(child)
|
||||||
|
|
||||||
|
# .def("setRxHostname",
|
||||||
|
# (void (Detector::*)(const std::string &, Positions)) &
|
||||||
|
# Detector::setRxHostname,
|
||||||
|
# py::arg(), py::arg() = Positions{})
|
||||||
|
# .def("setRxHostname",
|
||||||
|
# (void (Detector::*)(const std::vector<std::string> &)) &
|
||||||
|
# Detector::setRxHostname,
|
||||||
|
# py::arg())
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
parser = argparse.ArgumentParser()
|
|
||||||
parser.add_argument(
|
|
||||||
"-p",
|
|
||||||
"--build_path",
|
|
||||||
help="Path to the build database",
|
|
||||||
type=Path,
|
|
||||||
default=default_build_path,
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"-v",
|
|
||||||
"--verbose",
|
|
||||||
help="more output",
|
|
||||||
action='store_true',
|
|
||||||
)
|
|
||||||
cargs = parser.parse_args()
|
|
||||||
|
|
||||||
check_clang_format_version(12)
|
visit(tu.cursor)
|
||||||
check_for_compile_commands_json(cargs.build_path)
|
|
||||||
|
|
||||||
print("Parsing functions in Detector.h - ", end = "", flush = True)
|
|
||||||
t0 = time.perf_counter()
|
|
||||||
#parse functions
|
|
||||||
db = cindex.CompilationDatabase.fromDirectory(cargs.build_path)
|
|
||||||
index = cindex.Index.create()
|
|
||||||
args = db.getCompileCommands(fpath)
|
|
||||||
args = list(iter(args).__next__().arguments)[0:-1]
|
|
||||||
args = args + "-x c++ --std=c++11".split()
|
|
||||||
syspath = system_include_paths("clang++")
|
|
||||||
incargs = ["-I" + inc for inc in syspath]
|
|
||||||
args = args + incargs
|
|
||||||
tu = index.parse(fpath, args=args)
|
|
||||||
visit(tu.cursor)
|
|
||||||
print(green('OK'))
|
|
||||||
print(f'Parsing took {time.perf_counter()-t0:.3f}s')
|
|
||||||
|
|
||||||
print("Read detector_in.cpp - ", end = "")
|
with open("../src/detector_in.cpp") as f:
|
||||||
with open("../src/detector_in.cpp") as f:
|
data = f.read()
|
||||||
data = f.read()
|
s = "".join(lines)
|
||||||
s = "".join(lines)
|
s += ";"
|
||||||
s += ";"
|
text = data.replace("[[FUNCTIONS]]", s)
|
||||||
text = data.replace("[[FUNCTIONS]]", s)
|
warning = "/* WARINING This file is auto generated any edits might be overwritten without warning */\n\n"
|
||||||
warning = "/* WARINING This file is auto generated any edits might be overwritten without warning */\n\n"
|
with open("../src/detector.cpp", "w") as f:
|
||||||
print(green("OK"))
|
f.write(warning)
|
||||||
print("Writing to detector.cpp - ", end = "")
|
f.write(text)
|
||||||
with open("../src/detector.cpp", "w") as f:
|
|
||||||
f.write(warning)
|
|
||||||
f.write(text)
|
|
||||||
print(green('OK'))
|
|
||||||
|
|
||||||
# run clang format on the output
|
# run clang format on the output
|
||||||
print('Running clang format on generated source -', end = "")
|
subprocess.run(["clang-format", "../src/detector.cpp", "-i"])
|
||||||
subprocess.run(["clang-format", "../src/detector.cpp", "-i"])
|
|
||||||
print(green(" OK"))
|
|
||||||
|
|
||||||
print("Changes since last commit:")
|
|
||||||
subprocess.run(['git', 'diff', '../src/detector.cpp'])
|
|
||||||
|
@ -5,12 +5,6 @@ import subprocess
|
|||||||
from subprocess import PIPE
|
from subprocess import PIPE
|
||||||
import os
|
import os
|
||||||
|
|
||||||
def clang_format_version():
|
|
||||||
p = subprocess.run(['clang-format', '--version'], capture_output = True)
|
|
||||||
ver = p.stdout.decode().split()[2]
|
|
||||||
major = int(ver.split('.')[0])
|
|
||||||
return major
|
|
||||||
|
|
||||||
|
|
||||||
def remove_comments(text):
|
def remove_comments(text):
|
||||||
def replacer(match):
|
def replacer(match):
|
||||||
|
@ -1,45 +1,43 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
from .detector import Detector, freeze
|
from .detector import Detector
|
||||||
from .utils import element_if_equal
|
from .utils import element_if_equal
|
||||||
from .dacs import DetectorDacs, NamedDacs
|
from .dacs import DetectorDacs
|
||||||
import _slsdet
|
import _slsdet
|
||||||
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
||||||
from .detector_property import DetectorProperty
|
from .detector_property import DetectorProperty
|
||||||
|
|
||||||
# class CtbDacs(DetectorDacs):
|
class CtbDacs(DetectorDacs):
|
||||||
# """
|
"""
|
||||||
# Ctb dacs
|
Ctb dacs
|
||||||
# """
|
"""
|
||||||
# _dacs = [('dac0', dacIndex(0), 0, 4000, 1400),
|
_dacs = [('dac0', dacIndex(0), 0, 4000, 1400),
|
||||||
# ('dac1', dacIndex(1), 0, 4000, 1200),
|
('dac1', dacIndex(1), 0, 4000, 1200),
|
||||||
# ('dac2', dacIndex(2), 0, 4000, 900),
|
('dac2', dacIndex(2), 0, 4000, 900),
|
||||||
# ('dac3', dacIndex(3), 0, 4000, 1050),
|
('dac3', dacIndex(3), 0, 4000, 1050),
|
||||||
# ('dac4', dacIndex(4), 0, 4000, 1400),
|
('dac4', dacIndex(4), 0, 4000, 1400),
|
||||||
# ('dac5', dacIndex(5), 0, 4000, 655),
|
('dac5', dacIndex(5), 0, 4000, 655),
|
||||||
# ('dac6', dacIndex(6), 0, 4000, 2000),
|
('dac6', dacIndex(6), 0, 4000, 2000),
|
||||||
# ('dac7', dacIndex(7), 0, 4000, 1400),
|
('dac7', dacIndex(7), 0, 4000, 1400),
|
||||||
# ('dac8', dacIndex(8), 0, 4000, 850),
|
('dac8', dacIndex(8), 0, 4000, 850),
|
||||||
# ('dac9', dacIndex(9), 0, 4000, 2000),
|
('dac9', dacIndex(9), 0, 4000, 2000),
|
||||||
# ('dac10', dacIndex(10), 0, 4000, 2294),
|
('dac10', dacIndex(10), 0, 4000, 2294),
|
||||||
# ('dac11', dacIndex(11), 0, 4000, 983),
|
('dac11', dacIndex(11), 0, 4000, 983),
|
||||||
# ('dac12', dacIndex(12), 0, 4000, 1475),
|
('dac12', dacIndex(12), 0, 4000, 1475),
|
||||||
# ('dac13', dacIndex(13), 0, 4000, 1200),
|
('dac13', dacIndex(13), 0, 4000, 1200),
|
||||||
# ('dac14', dacIndex(14), 0, 4000, 1600),
|
('dac14', dacIndex(14), 0, 4000, 1600),
|
||||||
# ('dac15', dacIndex(15), 0, 4000, 1455),
|
('dac15', dacIndex(15), 0, 4000, 1455),
|
||||||
# ('dac16', dacIndex(16), 0, 4000, 0),
|
('dac16', dacIndex(16), 0, 4000, 0),
|
||||||
# ('dac17', dacIndex(17), 0, 4000, 1000),
|
('dac17', dacIndex(17), 0, 4000, 1000),
|
||||||
# ]
|
]
|
||||||
# _dacnames = [_d[0] for _d in _dacs]
|
_dacnames = [_d[0] for _d in _dacs]
|
||||||
|
|
||||||
from .utils import element
|
from .utils import element
|
||||||
@freeze
|
|
||||||
class Ctb(Detector):
|
class Ctb(Detector):
|
||||||
def __init__(self, id = 0):
|
def __init__(self, id = 0):
|
||||||
super().__init__(id)
|
super().__init__(id)
|
||||||
self._frozen = False
|
self._frozen = False
|
||||||
# self._dacs = CtbDacs(self)
|
self._dacs = CtbDacs(self)
|
||||||
self._dacs = NamedDacs(self)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def dacs(self):
|
def dacs(self):
|
||||||
|
@ -36,79 +36,6 @@ class Dac(DetectorProperty):
|
|||||||
dacstr = ''.join([f'{item:5d}' for item in self.get()])
|
dacstr = ''.join([f'{item:5d}' for item in self.get()])
|
||||||
return f'{self.__name__:15s}:{dacstr}'
|
return f'{self.__name__:15s}:{dacstr}'
|
||||||
|
|
||||||
class NamedDacs:
|
|
||||||
"""
|
|
||||||
New implementation of the detector dacs. Used at the momen for
|
|
||||||
Ctb but should replace the old one for all detectors
|
|
||||||
"""
|
|
||||||
_frozen = False
|
|
||||||
_direct_access = ['_detector', '_current', '_dacnames']
|
|
||||||
def __init__(self, detector):
|
|
||||||
self._detector = detector
|
|
||||||
self._current = 0
|
|
||||||
|
|
||||||
self._dacnames = [n.replace(" ", "") for n in detector.getDacNames()]
|
|
||||||
# # Populate the dacs
|
|
||||||
for i,name in enumerate(self._dacnames):
|
|
||||||
#name, enum, low, high, default, detector
|
|
||||||
setattr(self, name, Dac(name, dacIndex(i), 0, 4000, 1000, detector))
|
|
||||||
|
|
||||||
self._frozen = True
|
|
||||||
|
|
||||||
# def __getattr__(self, name):
|
|
||||||
# return self.__getattribute__('_' + name)
|
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
|
||||||
if not self._frozen:
|
|
||||||
#durining init we need to be able to set up the class
|
|
||||||
super().__setattr__(name, value)
|
|
||||||
else:
|
|
||||||
#Later we restrict us to manipulate dacs and a few fields
|
|
||||||
if name in self._direct_access:
|
|
||||||
super().__setattr__(name, value)
|
|
||||||
elif name in self._dacnames:
|
|
||||||
return self.__getattribute__(name).__setitem__(slice(None, None, None), value)
|
|
||||||
else:
|
|
||||||
raise AttributeError(f'Dac not found: {name}')
|
|
||||||
|
|
||||||
def __next__(self):
|
|
||||||
if self._current >= len(self._dacnames):
|
|
||||||
self._current = 0
|
|
||||||
raise StopIteration
|
|
||||||
else:
|
|
||||||
self._current += 1
|
|
||||||
return self.__getattribute__(self._dacnames[self._current-1])
|
|
||||||
# return self.__getattr__(self._dacnames[self._current-1])
|
|
||||||
|
|
||||||
def __iter__(self):
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
r_str = ['========== DACS =========']
|
|
||||||
r_str += [repr(dac) for dac in self]
|
|
||||||
return '\n'.join(r_str)
|
|
||||||
def get_asarray(self):
|
|
||||||
"""
|
|
||||||
Read the dacs into a numpy array with dimensions [ndacs, nmodules]
|
|
||||||
"""
|
|
||||||
dac_array = np.zeros((len(self._dacnames), len(self._detector)))
|
|
||||||
for i, _d in enumerate(self):
|
|
||||||
dac_array[i,:] = _d[:]
|
|
||||||
return dac_array
|
|
||||||
|
|
||||||
def to_array(self):
|
|
||||||
return self.get_asarray()
|
|
||||||
|
|
||||||
def set_from_array(self, dac_array):
|
|
||||||
"""
|
|
||||||
Set the dacs from an numpy array with dac values. [ndacs, nmodules]
|
|
||||||
"""
|
|
||||||
dac_array = dac_array.astype(np.int)
|
|
||||||
for i, _d in enumerate(self):
|
|
||||||
_d[:] = dac_array[i]
|
|
||||||
|
|
||||||
def from_array(self, dac_array):
|
|
||||||
self.set_from_array(dac_array)
|
|
||||||
|
|
||||||
class DetectorDacs:
|
class DetectorDacs:
|
||||||
_dacs = []
|
_dacs = []
|
||||||
@ -123,7 +50,7 @@ class DetectorDacs:
|
|||||||
# Index to support iteration
|
# Index to support iteration
|
||||||
self._current = 0
|
self._current = 0
|
||||||
|
|
||||||
# Name the attributes?
|
# Populate the dacs
|
||||||
for _d in self._dacs:
|
for _d in self._dacs:
|
||||||
setattr(self, '_'+_d[0], Dac(*_d, detector))
|
setattr(self, '_'+_d[0], Dac(*_d, detector))
|
||||||
|
|
||||||
@ -132,9 +59,6 @@ class DetectorDacs:
|
|||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
return self.__getattribute__('_' + name)
|
return self.__getattribute__('_' + name)
|
||||||
|
|
||||||
@property
|
|
||||||
def dacnames(self):
|
|
||||||
return [_d[0] for _d in _dacs]
|
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
if name in self._dacnames:
|
if name in self._dacnames:
|
||||||
|
@ -258,7 +258,7 @@ class Detector(CppDetectorApi):
|
|||||||
@element
|
@element
|
||||||
def rx_threads(self):
|
def rx_threads(self):
|
||||||
"""
|
"""
|
||||||
Get thread ids from the receiver in order of [parent, tcp, listener 0, processor 0, streamer 0, listener 1, processor 1, streamer 1, arping].
|
Get thread ids from the receiver in order of [parent, tcp, listener 0, processor 0, streamer 0, listener 1, processor 1, streamer 1].
|
||||||
|
|
||||||
Note
|
Note
|
||||||
-----
|
-----
|
||||||
@ -268,17 +268,6 @@ class Detector(CppDetectorApi):
|
|||||||
"""
|
"""
|
||||||
return self.getRxThreadIds()
|
return self.getRxThreadIds()
|
||||||
|
|
||||||
@property
|
|
||||||
@element
|
|
||||||
def rx_arping(self):
|
|
||||||
"""Starts a thread in slsReceiver to arping the interface it is listening every minute. Useful in 10G mode. """
|
|
||||||
return self.getRxArping()
|
|
||||||
|
|
||||||
@rx_arping.setter
|
|
||||||
def rx_arping(self, value):
|
|
||||||
ut.set_using_dict(self.setRxArping, value)
|
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def dr(self):
|
def dr(self):
|
||||||
@ -287,7 +276,7 @@ class Detector(CppDetectorApi):
|
|||||||
|
|
||||||
Note
|
Note
|
||||||
-----
|
-----
|
||||||
[Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets clkdivider to 2 (quarter speed), else to 0 (full speed)\n
|
[Eiger] Options: 4, 8, 16, 32. If set to 32, also sets clkdivider to 2 (quarter speed), else to 0 (full speed)\n
|
||||||
[Mythen3] Options: 8, 16, 32 \n
|
[Mythen3] Options: 8, 16, 32 \n
|
||||||
[Jungfrau][Gotthard][Ctb][Moench][Mythen3][Gotthard2] 16
|
[Jungfrau][Gotthard][Ctb][Moench][Mythen3][Gotthard2] 16
|
||||||
"""
|
"""
|
||||||
@ -599,13 +588,13 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def rx_framescaught(self):
|
def rx_framescaught(self):
|
||||||
"""Number of frames caught by each port in receiver."""
|
"""Number of frames caught by receiver."""
|
||||||
return self.getFramesCaught()
|
return self.getFramesCaught()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def nextframenumber(self):
|
def nextframenumber(self):
|
||||||
"""[Eiger][Jungfrau][Moench][CTB] Next frame number. Stopping acquisition might result in different frame numbers for different modules. """
|
"""[Eiger][Jungfrau] Next frame number. Stopping acquisition might result in different frame numbers for different modules. """
|
||||||
return self.getNextFrameNumber()
|
return self.getNextFrameNumber()
|
||||||
|
|
||||||
@nextframenumber.setter
|
@nextframenumber.setter
|
||||||
@ -1474,19 +1463,6 @@ class Detector(CppDetectorApi):
|
|||||||
def trimval(self, value):
|
def trimval(self, value):
|
||||||
ut.set_using_dict(self.setAllTrimbits, value)
|
ut.set_using_dict(self.setAllTrimbits, value)
|
||||||
|
|
||||||
@property
|
|
||||||
@element
|
|
||||||
def master(self):
|
|
||||||
"""
|
|
||||||
[Eiger] Sets half module to master and others to slaves.\n
|
|
||||||
[Gotthard][Gotthard2][Mythen3][Eiger] Gets if the current module/ half module is master.
|
|
||||||
"""
|
|
||||||
return self.getMaster()
|
|
||||||
|
|
||||||
@master.setter
|
|
||||||
def master(self, value):
|
|
||||||
ut.set_using_dict(self.setMaster, value)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def lock(self):
|
def lock(self):
|
||||||
@ -1571,16 +1547,8 @@ class Detector(CppDetectorApi):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def daclist(self):
|
def daclist(self):
|
||||||
"""
|
"""Gets the list of enums for every dac for this detector."""
|
||||||
List of enums for every dac for this detector.
|
return self.getDacList()
|
||||||
:setter: Only implemented for Chiptestboard
|
|
||||||
|
|
||||||
"""
|
|
||||||
return self.getDacNames()
|
|
||||||
|
|
||||||
@daclist.setter
|
|
||||||
def daclist(self, value):
|
|
||||||
self.setDacNames(value)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def dacvalues(self):
|
def dacvalues(self):
|
||||||
@ -1926,13 +1894,13 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def rx_frameindex(self):
|
def rx_frameindex(self):
|
||||||
"""Current frame index received for each port in receiver during acquisition."""
|
"""Current frame index received in receiver during acquisition."""
|
||||||
return self.getRxCurrentFrameIndex()
|
return self.getRxCurrentFrameIndex()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def rx_missingpackets(self):
|
def rx_missingpackets(self):
|
||||||
"""Gets the number of missing packets for each port in receiver. Negative number denotes extra packets. """
|
"""Gets the number of missing packets for each port in receiver."""
|
||||||
return self.getNumMissingPackets()
|
return self.getNumMissingPackets()
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -1945,7 +1913,7 @@ class Detector(CppDetectorApi):
|
|||||||
def datastream(self):
|
def datastream(self):
|
||||||
"""
|
"""
|
||||||
datastream [left|right] [0, 1]
|
datastream [left|right] [0, 1]
|
||||||
[Eiger] Enables or disables data streaming from left or/and right side of detector for 10GbE mode. 1 (enabled) by default.
|
[Eiger] Enables or disables data streaming from left or/and right side of detector. 1 (enabled) by default.
|
||||||
"""
|
"""
|
||||||
result = {}
|
result = {}
|
||||||
for port in [defs.LEFT, defs.RIGHT]:
|
for port in [defs.LEFT, defs.RIGHT]:
|
||||||
@ -2147,21 +2115,6 @@ class Detector(CppDetectorApi):
|
|||||||
"""
|
"""
|
||||||
return ut.reduce_time(self.getMeasuredSubFramePeriod())
|
return ut.reduce_time(self.getMeasuredSubFramePeriod())
|
||||||
|
|
||||||
@property
|
|
||||||
@element
|
|
||||||
def top(self):
|
|
||||||
"""[Eiger] Sets half module to top (1), else bottom.
|
|
||||||
|
|
||||||
Note
|
|
||||||
-----
|
|
||||||
Advanced Function!
|
|
||||||
"""
|
|
||||||
return self.getTop()
|
|
||||||
|
|
||||||
@top.setter
|
|
||||||
def top(self, value):
|
|
||||||
ut.set_using_dict(self.setTop, value)
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
------------------<<<Jungfrau specific>>>-------------------------
|
------------------<<<Jungfrau specific>>>-------------------------
|
||||||
"""
|
"""
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
|
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
/* WARINING This file is auto generated any edits might be overwritten without
|
/* WARINING This file is auto generated any edits might be overwritten without
|
||||||
* warning */
|
* warning */
|
||||||
|
|
||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#include <pybind11/chrono.h>
|
#include <pybind11/chrono.h>
|
||||||
#include <pybind11/operators.h>
|
#include <pybind11/operators.h>
|
||||||
#include <pybind11/pybind11.h>
|
#include <pybind11/pybind11.h>
|
||||||
@ -173,12 +173,6 @@ void init_det(py::module &m) {
|
|||||||
.def("setFlipRows",
|
.def("setFlipRows",
|
||||||
(void (Detector::*)(bool, sls::Positions)) & Detector::setFlipRows,
|
(void (Detector::*)(bool, sls::Positions)) & Detector::setFlipRows,
|
||||||
py::arg(), py::arg() = Positions{})
|
py::arg(), py::arg() = Positions{})
|
||||||
.def("getMaster",
|
|
||||||
(Result<bool>(Detector::*)(sls::Positions) const) &
|
|
||||||
Detector::getMaster,
|
|
||||||
py::arg() = Positions{})
|
|
||||||
.def("setMaster", (void (Detector::*)(bool, int)) & Detector::setMaster,
|
|
||||||
py::arg(), py::arg())
|
|
||||||
.def("isVirtualDetectorServer",
|
.def("isVirtualDetectorServer",
|
||||||
(Result<bool>(Detector::*)(sls::Positions) const) &
|
(Result<bool>(Detector::*)(sls::Positions) const) &
|
||||||
Detector::isVirtualDetectorServer,
|
Detector::isVirtualDetectorServer,
|
||||||
@ -476,9 +470,7 @@ void init_det(py::module &m) {
|
|||||||
(void (Detector::*)()) & Detector::clearAcquiringFlag)
|
(void (Detector::*)()) & Detector::clearAcquiringFlag)
|
||||||
.def("startReceiver", (void (Detector::*)()) & Detector::startReceiver)
|
.def("startReceiver", (void (Detector::*)()) & Detector::startReceiver)
|
||||||
.def("stopReceiver", (void (Detector::*)()) & Detector::stopReceiver)
|
.def("stopReceiver", (void (Detector::*)()) & Detector::stopReceiver)
|
||||||
.def("startDetector",
|
.def("startDetector", (void (Detector::*)()) & Detector::startDetector)
|
||||||
(void (Detector::*)(sls::Positions)) & Detector::startDetector,
|
|
||||||
py::arg() = Positions{})
|
|
||||||
.def("startDetectorReadout",
|
.def("startDetectorReadout",
|
||||||
(void (Detector::*)()) & Detector::startDetectorReadout)
|
(void (Detector::*)()) & Detector::startDetectorReadout)
|
||||||
.def("stopDetector",
|
.def("stopDetector",
|
||||||
@ -493,17 +485,14 @@ void init_det(py::module &m) {
|
|||||||
Detector::getReceiverStatus,
|
Detector::getReceiverStatus,
|
||||||
py::arg() = Positions{})
|
py::arg() = Positions{})
|
||||||
.def("getFramesCaught",
|
.def("getFramesCaught",
|
||||||
(Result<std::vector<int64_t>>(Detector::*)(sls::Positions) const) &
|
(Result<int64_t>(Detector::*)(sls::Positions) const) &
|
||||||
Detector::getFramesCaught,
|
Detector::getFramesCaught,
|
||||||
py::arg() = Positions{})
|
py::arg() = Positions{})
|
||||||
.def("getNumMissingPackets",
|
.def(
|
||||||
(Result<std::vector<int64_t>>(Detector::*)(sls::Positions) const) &
|
"getNumMissingPackets",
|
||||||
Detector::getNumMissingPackets,
|
(Result<std::vector<uint64_t>>(Detector::*)(sls::Positions) const) &
|
||||||
py::arg() = Positions{})
|
Detector::getNumMissingPackets,
|
||||||
.def("getRxCurrentFrameIndex",
|
py::arg() = Positions{})
|
||||||
(Result<std::vector<int64_t>>(Detector::*)(sls::Positions) const) &
|
|
||||||
Detector::getRxCurrentFrameIndex,
|
|
||||||
py::arg() = Positions{})
|
|
||||||
.def("getNextFrameNumber",
|
.def("getNextFrameNumber",
|
||||||
(Result<uint64_t>(Detector::*)(sls::Positions) const) &
|
(Result<uint64_t>(Detector::*)(sls::Positions) const) &
|
||||||
Detector::getNextFrameNumber,
|
Detector::getNextFrameNumber,
|
||||||
@ -776,16 +765,9 @@ void init_det(py::module &m) {
|
|||||||
Detector::getRxLastClientIP,
|
Detector::getRxLastClientIP,
|
||||||
py::arg() = Positions{})
|
py::arg() = Positions{})
|
||||||
.def("getRxThreadIds",
|
.def("getRxThreadIds",
|
||||||
(Result<std::array<pid_t, 9>>(Detector::*)(sls::Positions) const) &
|
(Result<std::array<pid_t, 8>>(Detector::*)(sls::Positions) const) &
|
||||||
Detector::getRxThreadIds,
|
Detector::getRxThreadIds,
|
||||||
py::arg() = Positions{})
|
py::arg() = Positions{})
|
||||||
.def("getRxArping",
|
|
||||||
(Result<bool>(Detector::*)(sls::Positions) const) &
|
|
||||||
Detector::getRxArping,
|
|
||||||
py::arg() = Positions{})
|
|
||||||
.def("setRxArping",
|
|
||||||
(void (Detector::*)(bool, sls::Positions)) & Detector::setRxArping,
|
|
||||||
py::arg(), py::arg() = Positions{})
|
|
||||||
.def("getFileFormat",
|
.def("getFileFormat",
|
||||||
(Result<defs::fileFormat>(Detector::*)(sls::Positions) const) &
|
(Result<defs::fileFormat>(Detector::*)(sls::Positions) const) &
|
||||||
Detector::getFileFormat,
|
Detector::getFileFormat,
|
||||||
@ -1015,13 +997,6 @@ void init_det(py::module &m) {
|
|||||||
sls::Positions)) &
|
sls::Positions)) &
|
||||||
Detector::setDataStream,
|
Detector::setDataStream,
|
||||||
py::arg(), py::arg(), py::arg() = Positions{})
|
py::arg(), py::arg(), py::arg() = Positions{})
|
||||||
.def("getTop",
|
|
||||||
(Result<bool>(Detector::*)(sls::Positions) const) &
|
|
||||||
Detector::getTop,
|
|
||||||
py::arg() = Positions{})
|
|
||||||
.def("setTop",
|
|
||||||
(void (Detector::*)(bool, sls::Positions)) & Detector::setTop,
|
|
||||||
py::arg(), py::arg() = Positions{})
|
|
||||||
.def("getChipVersion",
|
.def("getChipVersion",
|
||||||
(Result<double>(Detector::*)(sls::Positions) const) &
|
(Result<double>(Detector::*)(sls::Positions) const) &
|
||||||
Detector::getChipVersion,
|
Detector::getChipVersion,
|
||||||
@ -1280,6 +1255,10 @@ void init_det(py::module &m) {
|
|||||||
(Result<std::array<ns, 3>>(Detector::*)(sls::Positions) const) &
|
(Result<std::array<ns, 3>>(Detector::*)(sls::Positions) const) &
|
||||||
Detector::getGateDelayForAllGates,
|
Detector::getGateDelayForAllGates,
|
||||||
py::arg() = Positions{})
|
py::arg() = Positions{})
|
||||||
|
.def("getMaster",
|
||||||
|
(Result<bool>(Detector::*)(sls::Positions) const) &
|
||||||
|
Detector::getMaster,
|
||||||
|
py::arg() = Positions{})
|
||||||
.def("getChipStatusRegister",
|
.def("getChipStatusRegister",
|
||||||
(Result<int>(Detector::*)(sls::Positions) const) &
|
(Result<int>(Detector::*)(sls::Positions) const) &
|
||||||
Detector::getChipStatusRegister,
|
Detector::getChipStatusRegister,
|
||||||
@ -1427,19 +1406,6 @@ void init_det(py::module &m) {
|
|||||||
(void (Detector::*)(bool, sls::Positions)) &
|
(void (Detector::*)(bool, sls::Positions)) &
|
||||||
Detector::setLEDEnable,
|
Detector::setLEDEnable,
|
||||||
py::arg(), py::arg() = Positions{})
|
py::arg(), py::arg() = Positions{})
|
||||||
.def("setDacNames",
|
|
||||||
(void (Detector::*)(const std::vector<std::string>)) &
|
|
||||||
Detector::setDacNames,
|
|
||||||
py::arg())
|
|
||||||
.def("getDacNames", (std::vector<std::string>(Detector::*)() const) &
|
|
||||||
Detector::getDacNames)
|
|
||||||
.def("getDacIndex",
|
|
||||||
(defs::dacIndex(Detector::*)(const std::string &)) &
|
|
||||||
Detector::getDacIndex,
|
|
||||||
py::arg())
|
|
||||||
.def("getDacName",
|
|
||||||
(std::string(Detector::*)(defs::dacIndex)) & Detector::getDacName,
|
|
||||||
py::arg())
|
|
||||||
.def("setPattern",
|
.def("setPattern",
|
||||||
(void (Detector::*)(const std::string &, sls::Positions)) &
|
(void (Detector::*)(const std::string &, sls::Positions)) &
|
||||||
Detector::setPattern,
|
Detector::setPattern,
|
||||||
@ -1544,10 +1510,9 @@ void init_det(py::module &m) {
|
|||||||
Detector::setAdditionalJsonParameter,
|
Detector::setAdditionalJsonParameter,
|
||||||
py::arg(), py::arg(), py::arg() = Positions{})
|
py::arg(), py::arg(), py::arg() = Positions{})
|
||||||
.def("programFPGA",
|
.def("programFPGA",
|
||||||
(void (Detector::*)(const std::string &, const bool,
|
(void (Detector::*)(const std::string &, sls::Positions)) &
|
||||||
sls::Positions)) &
|
|
||||||
Detector::programFPGA,
|
Detector::programFPGA,
|
||||||
py::arg(), py::arg(), py::arg() = Positions{})
|
py::arg(), py::arg() = Positions{})
|
||||||
.def("resetFPGA",
|
.def("resetFPGA",
|
||||||
(void (Detector::*)(sls::Positions)) & Detector::resetFPGA,
|
(void (Detector::*)(sls::Positions)) & Detector::resetFPGA,
|
||||||
py::arg() = Positions{})
|
py::arg() = Positions{})
|
||||||
@ -1582,7 +1547,7 @@ void init_det(py::module &m) {
|
|||||||
Detector::getUpdateMode,
|
Detector::getUpdateMode,
|
||||||
py::arg() = Positions{})
|
py::arg() = Positions{})
|
||||||
.def("setUpdateMode",
|
.def("setUpdateMode",
|
||||||
(void (Detector::*)(const bool, sls::Positions)) &
|
(void (Detector::*)(bool, sls::Positions)) &
|
||||||
Detector::setUpdateMode,
|
Detector::setUpdateMode,
|
||||||
py::arg(), py::arg() = Positions{})
|
py::arg(), py::arg() = Positions{})
|
||||||
.def("readRegister",
|
.def("readRegister",
|
||||||
@ -1674,5 +1639,9 @@ void init_det(py::module &m) {
|
|||||||
Detector::getMeasurementTime,
|
Detector::getMeasurementTime,
|
||||||
py::arg() = Positions{})
|
py::arg() = Positions{})
|
||||||
.def("getUserDetails",
|
.def("getUserDetails",
|
||||||
(std::string(Detector::*)() const) & Detector::getUserDetails);
|
(std::string(Detector::*)() const) & Detector::getUserDetails)
|
||||||
|
.def("getRxCurrentFrameIndex",
|
||||||
|
(Result<uint64_t>(Detector::*)(sls::Positions) const) &
|
||||||
|
Detector::getRxCurrentFrameIndex,
|
||||||
|
py::arg() = Positions{});
|
||||||
}
|
}
|
||||||
|
@ -273,8 +273,7 @@ void init_enums(py::module &m) {
|
|||||||
slsDetectorDefs::timingSourceType::TIMING_EXTERNAL)
|
slsDetectorDefs::timingSourceType::TIMING_EXTERNAL)
|
||||||
.export_values();
|
.export_values();
|
||||||
|
|
||||||
py::enum_<slsDetectorDefs::M3_GainCaps>(Defs, "M3_GainCaps",
|
py::enum_<slsDetectorDefs::M3_GainCaps>(Defs, "M3_GainCaps")
|
||||||
py::arithmetic())
|
|
||||||
.value("M3_C10pre", slsDetectorDefs::M3_GainCaps::M3_C10pre)
|
.value("M3_C10pre", slsDetectorDefs::M3_GainCaps::M3_C10pre)
|
||||||
.value("M3_C15sh", slsDetectorDefs::M3_GainCaps::M3_C15sh)
|
.value("M3_C15sh", slsDetectorDefs::M3_GainCaps::M3_C15sh)
|
||||||
.value("M3_C30sh", slsDetectorDefs::M3_GainCaps::M3_C30sh)
|
.value("M3_C30sh", slsDetectorDefs::M3_GainCaps::M3_C30sh)
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include "pedestalSubtraction.h"
|
#include "pedestalSubtraction.h"
|
||||||
#include "slsDetectorData.h"
|
#include "slsDetectorData.h"
|
||||||
#include "slsInterpolation.h"
|
#include "slsInterpolation.h"
|
||||||
#include "sls/tiffIO.h"
|
#include "tiffIO.h"
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
#ifdef ROOTSPECTRUM
|
#ifdef ROOTSPECTRUM
|
||||||
|
@ -2,9 +2,49 @@
|
|||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
#ifndef MOENCH03T1RECDATANEW_H
|
#ifndef MOENCH03T1RECDATANEW_H
|
||||||
#define MOENCH03T1RECDATANEW_H
|
#define MOENCH03T1RECDATANEW_H
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
#include "slsDetectorData.h"
|
#include "slsDetectorData.h"
|
||||||
|
|
||||||
|
//#define VERSION_V2
|
||||||
|
/**
|
||||||
|
@short structure for a Detector Packet or Image Header
|
||||||
|
@li frameNumber is the frame number
|
||||||
|
@li expLength is the subframe number (32 bit eiger) or real time exposure
|
||||||
|
time in 100ns (others)
|
||||||
|
@li packetNumber is the packet number
|
||||||
|
@li bunchId is the bunch id from beamline
|
||||||
|
@li timestamp is the time stamp with 10 MHz clock
|
||||||
|
@li modId is the unique module id (unique even for left, right, top, bottom)
|
||||||
|
@li xCoord is the x coordinate in the complete detector system
|
||||||
|
@li yCoord is the y coordinate in the complete detector system
|
||||||
|
@li zCoord is the z coordinate in the complete detector system
|
||||||
|
@li debug is for debugging purposes
|
||||||
|
@li roundRNumber is the round robin set number
|
||||||
|
@li detType is the detector type see :: detectorType
|
||||||
|
@li version is the version number of this structure format
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint64_t frameNumber; /**< is the frame number */
|
||||||
|
uint32_t expLength; /**< is the subframe number (32 bit eiger) or real time
|
||||||
|
exposure time in 100ns (others) */
|
||||||
|
uint32_t packetNumber; /**< is the packet number */
|
||||||
|
uint64_t bunchId; /**< is the bunch id from beamline */
|
||||||
|
uint64_t timestamp; /**< is the time stamp with 10 MHz clock */
|
||||||
|
uint16_t modId; /**< is the unique module id (unique even for left, right,
|
||||||
|
top, bottom) */
|
||||||
|
uint16_t xCoord; /**< is the x coordinate in the complete detector system */
|
||||||
|
uint16_t yCoord; /**< is the y coordinate in the complete detector system */
|
||||||
|
uint16_t zCoord; /**< is the z coordinate in the complete detector system */
|
||||||
|
uint32_t debug; /**< is for debugging purposes */
|
||||||
|
uint16_t roundRNumber; /**< is the round robin set number */
|
||||||
|
uint8_t detType; /**< is the detector type see :: detectorType */
|
||||||
|
uint8_t version; /**< is the version number of this structure format */
|
||||||
|
#ifndef VERSION_V1
|
||||||
|
uint64_t
|
||||||
|
packetCaught[8]; /**< is the version number of this structure format */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} sls_detector_header;
|
||||||
|
|
||||||
class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -16,9 +56,6 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
|
|
||||||
double ghost[200][25];
|
double ghost[200][25];
|
||||||
|
|
||||||
// Single point of definition if we need to customize
|
|
||||||
using header = sls::defs::sls_receiver_header;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
Implements the slsReceiverData structure for the moench02 prototype read
|
Implements the slsReceiverData structure for the moench02 prototype read
|
||||||
@ -27,7 +64,8 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
moench03T1ReceiverDataNew(int ns = 5000)
|
moench03T1ReceiverDataNew(int ns = 5000)
|
||||||
: slsDetectorData<uint16_t>(400, 400, ns * 2 * 32 + sizeof(header)),
|
: slsDetectorData<uint16_t>(400, 400,
|
||||||
|
ns * 2 * 32 + sizeof(sls_detector_header)),
|
||||||
nSamples(ns) {
|
nSamples(ns) {
|
||||||
|
|
||||||
int nadc = 32;
|
int nadc = 32;
|
||||||
@ -62,15 +100,15 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
} else {
|
} else {
|
||||||
row = 200 + i / sc_width;
|
row = 200 + i / sc_width;
|
||||||
}
|
}
|
||||||
dataMap[row][col] = sizeof(header) +
|
dataMap[row][col] = sizeof(sls_detector_header) +
|
||||||
(nadc * i + iadc) * 2; //+16*(ip+1);
|
(nadc * i + iadc) * 2; //+16*(ip+1);
|
||||||
#ifdef HIGHZ
|
#ifdef HIGHZ
|
||||||
dataMask[row][col] = 0x3fff; // invert data
|
dataMask[row][col] = 0x3fff; // invert data
|
||||||
#endif
|
#endif
|
||||||
if (dataMap[row][col] < 0 ||
|
if (dataMap[row][col] < 0 ||
|
||||||
dataMap[row][col] >= nSamples * 2 * 32)
|
dataMap[row][col] >= nSamples * 2 * 32)
|
||||||
std::cout << "Error: pointer " << dataMap[row][col]
|
cout << "Error: pointer " << dataMap[row][col]
|
||||||
<< " out of range " << std::endl;
|
<< " out of range " << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -82,13 +120,13 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
ghost[iy][ix] = 0.;
|
ghost[iy][ix] = 0.;
|
||||||
|
|
||||||
int ipacket;
|
int ipacket;
|
||||||
uint ibyte;
|
int ibyte;
|
||||||
int ii = 0;
|
int ii = 0;
|
||||||
for (ibyte = 0; ibyte < sizeof(header) / 2; ibyte++) {
|
for (ibyte = 0; ibyte < sizeof(sls_detector_header) / 2; ibyte++) {
|
||||||
xmap[ibyte] = -1;
|
xmap[ibyte] = -1;
|
||||||
ymap[ibyte] = -1;
|
ymap[ibyte] = -1;
|
||||||
}
|
}
|
||||||
int off = sizeof(header) / 2;
|
int off = sizeof(sls_detector_header) / 2;
|
||||||
for (ipacket = 0; ipacket < npackets; ipacket++) {
|
for (ipacket = 0; ipacket < npackets; ipacket++) {
|
||||||
for (ibyte = 0; ibyte < 8192 / 2; ibyte++) {
|
for (ibyte = 0; ibyte < 8192 / 2; ibyte++) {
|
||||||
i = ipacket * 8208 / 2 + ibyte;
|
i = ipacket * 8208 / 2 + ibyte;
|
||||||
@ -123,7 +161,20 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
required as double
|
required as double
|
||||||
|
|
||||||
*/
|
*/
|
||||||
double getValue(char *data, int ix, int iy = 0) override {
|
virtual double getValue(char *data, int ix, int iy = 0) {
|
||||||
|
/* cout << " x "<< ix << " y"<< iy << " val " << getChannel(data, ix,
|
||||||
|
* iy)<< endl;*/
|
||||||
|
/* double val=0, vout=getChannel(data, ix, iy); */
|
||||||
|
/* int x1=ix%25; */
|
||||||
|
/* for (int ix=0; ix<16; ix++) { */
|
||||||
|
/* for (int ii=0; ii<2; ii++) { */
|
||||||
|
/* val+=getChannel(data,x1+25*ix,iy); */
|
||||||
|
/* val+=getChannel(data,x1+25*ix,399-iy); */
|
||||||
|
/* } */
|
||||||
|
/* } */
|
||||||
|
/* vout+=0.0008*val-6224; */
|
||||||
|
/* return vout; //(double)getChannel(data, ix, iy);
|
||||||
|
*/
|
||||||
uint16_t val = getChannel(data, ix, iy) & 0x3fff;
|
uint16_t val = getChannel(data, ix, iy) & 0x3fff;
|
||||||
return val;
|
return val;
|
||||||
};
|
};
|
||||||
@ -174,9 +225,17 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* class jfrau_packet_header_t { */
|
||||||
|
/* public: */
|
||||||
|
/* unsigned char reserved[4]; */
|
||||||
|
/* unsigned char packetNumber[1]; */
|
||||||
|
/* unsigned char frameNumber[3]; */
|
||||||
|
/* unsigned char bunchid[8]; */
|
||||||
|
/* }; */
|
||||||
|
|
||||||
int getFrameNumber(char *buff) {
|
int getFrameNumber(char *buff) {
|
||||||
return ((header *)buff)->detHeader.frameNumber;
|
return ((sls_detector_header *)buff)->frameNumber;
|
||||||
}
|
}; //*((int*)(buff+5))&0xffffff;};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -188,22 +247,68 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
int getPacketNumber(char *buff) {
|
int getPacketNumber(char *buff) {
|
||||||
return ((header *)buff)->detHeader.packetNumber;
|
return ((sls_detector_header *)buff)->packetNumber;
|
||||||
}
|
} //((*(((int*)(buff+4))))&0xff)+1;};
|
||||||
|
|
||||||
char *readNextFrame(std::ifstream &filebin) override {
|
/* /\** */
|
||||||
|
|
||||||
|
/* Loops over a memory slot until a complete frame is found (i.e. all
|
||||||
|
* packets 0 to nPackets, same frame number). purely virtual func */
|
||||||
|
/* \param data pointer to the memory to be analyzed */
|
||||||
|
/* \param ndata reference to the amount of data found for the frame, in
|
||||||
|
* case the frame is incomplete at the end of the memory slot */
|
||||||
|
/* \param dsize size of the memory slot to be analyzed */
|
||||||
|
/* \returns pointer to the beginning of the last good frame (might be
|
||||||
|
* incomplete if ndata smaller than dataSize), or NULL if no frame is found
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* *\/ */
|
||||||
|
/* virtual char *findNextFrame(char *data, int &ndata, int
|
||||||
|
* dsize){ndata=dsize; setDataSize(dsize); return data;}; */
|
||||||
|
|
||||||
|
/* /\** */
|
||||||
|
|
||||||
|
/* Loops over a file stream until a complete frame is found (i.e. all
|
||||||
|
* packets 0 to nPackets, same frame number). Can be overloaded for
|
||||||
|
* different kind of detectors! */
|
||||||
|
/* \param filebin input file stream (binary) */
|
||||||
|
/* \returns pointer to the begin of the last good frame, NULL if no
|
||||||
|
* frame is found or last frame is incomplete */
|
||||||
|
|
||||||
|
/* *\/ */
|
||||||
|
/* virtual char *readNextFrame(ifstream &filebin){ */
|
||||||
|
/* // int afifo_length=0; */
|
||||||
|
/* uint16_t *afifo_cont; */
|
||||||
|
/* int ib=0; */
|
||||||
|
/* if (filebin.is_open()) { */
|
||||||
|
/* afifo_cont=new uint16_t[dataSize/2]; */
|
||||||
|
/* while (filebin.read(((char*)afifo_cont)+ib,2)) { */
|
||||||
|
/* ib+=2; */
|
||||||
|
/* if (ib==dataSize) break; */
|
||||||
|
/* } */
|
||||||
|
/* if (ib>0) { */
|
||||||
|
/* iframe++; */
|
||||||
|
/* // cout << ib << "-" << endl; */
|
||||||
|
/* return (char*)afifo_cont; */
|
||||||
|
/* } else { */
|
||||||
|
/* delete [] afifo_cont; */
|
||||||
|
/* return NULL; */
|
||||||
|
/* } */
|
||||||
|
/* } */
|
||||||
|
/* return NULL; */
|
||||||
|
/* }; */
|
||||||
|
|
||||||
|
virtual char *readNextFrame(ifstream &filebin) {
|
||||||
int ff = -1, np = -1;
|
int ff = -1, np = -1;
|
||||||
return readNextFrame(filebin, ff, np);
|
return readNextFrame(filebin, ff, np);
|
||||||
}
|
};
|
||||||
|
|
||||||
// not present in base class
|
virtual char *readNextFrame(ifstream &filebin, int &ff) {
|
||||||
virtual char *readNextFrame(std::ifstream &filebin, int &ff) {
|
|
||||||
int np = -1;
|
int np = -1;
|
||||||
return readNextFrame(filebin, ff, np);
|
return readNextFrame(filebin, ff, np);
|
||||||
};
|
};
|
||||||
|
|
||||||
// not present in base class
|
virtual char *readNextFrame(ifstream &filebin, int &ff, int &np) {
|
||||||
virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np) {
|
|
||||||
char *data = new char[dataSize];
|
char *data = new char[dataSize];
|
||||||
char *d = readNextFrame(filebin, ff, np, data);
|
char *d = readNextFrame(filebin, ff, np, data);
|
||||||
if (d == NULL) {
|
if (d == NULL) {
|
||||||
@ -213,10 +318,18 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
// not present in base class
|
virtual char *readNextFrame(ifstream &filebin, int &ff, int &np,
|
||||||
virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np,
|
|
||||||
char *data) {
|
char *data) {
|
||||||
|
char *retval = 0;
|
||||||
|
int nd;
|
||||||
|
int fnum = -1;
|
||||||
np = 0;
|
np = 0;
|
||||||
|
int pn;
|
||||||
|
|
||||||
|
// cout << dataSize << endl;
|
||||||
|
if (ff >= 0)
|
||||||
|
fnum = ff;
|
||||||
|
|
||||||
if (filebin.is_open()) {
|
if (filebin.is_open()) {
|
||||||
if (filebin.read(data, dataSize)) {
|
if (filebin.read(data, dataSize)) {
|
||||||
ff = getFrameNumber(data);
|
ff = getFrameNumber(data);
|
||||||
@ -224,8 +337,8 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return NULL;
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -239,7 +352,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData<uint16_t> {
|
|||||||
found
|
found
|
||||||
|
|
||||||
*/
|
*/
|
||||||
char *findNextFrame(char *data, int &ndata, int dsize) override {
|
virtual char *findNextFrame(char *data, int &ndata, int dsize) {
|
||||||
if (dsize < dataSize)
|
if (dsize < dataSize)
|
||||||
ndata = dsize;
|
ndata = dsize;
|
||||||
else
|
else
|
||||||
|
@ -29,7 +29,7 @@ class moench03T1ZmqDataNew : public slsDetectorData<uint16_t> {
|
|||||||
moench03T1ZmqDataNew(int ns = 5000, int oo = 2 * 2)
|
moench03T1ZmqDataNew(int ns = 5000, int oo = 2 * 2)
|
||||||
: slsDetectorData<uint16_t>(400, 400, ns * 32 * 2 + oo), nSamples(ns),
|
: slsDetectorData<uint16_t>(400, 400, ns * 32 * 2 + oo), nSamples(ns),
|
||||||
offset(oo), xtalk(0.00021) {
|
offset(oo), xtalk(0.00021) {
|
||||||
std::cout << "M0.3" << std::endl;
|
cout << "M0.3" << endl;
|
||||||
int nadc = 32;
|
int nadc = 32;
|
||||||
int sc_width = 25;
|
int sc_width = 25;
|
||||||
int sc_height = 200;
|
int sc_height = 200;
|
||||||
@ -70,8 +70,8 @@ class moench03T1ZmqDataNew : public slsDetectorData<uint16_t> {
|
|||||||
dataMap[row][col] =
|
dataMap[row][col] =
|
||||||
(nadc * i + iadc) * 2 + offset; //+16*(ip+1);
|
(nadc * i + iadc) * 2 + offset; //+16*(ip+1);
|
||||||
if (dataMap[row][col] < 0 || dataMap[row][col] >= dataSize)
|
if (dataMap[row][col] < 0 || dataMap[row][col] >= dataSize)
|
||||||
std::cout << "Error: pointer " << dataMap[row][col]
|
cout << "Error: pointer " << dataMap[row][col]
|
||||||
<< " out of range " << std::endl;
|
<< " out of range " << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -260,17 +260,17 @@ class moench03T1ZmqDataNew : public slsDetectorData<uint16_t> {
|
|||||||
/* return NULL; */
|
/* return NULL; */
|
||||||
/* }; */
|
/* }; */
|
||||||
|
|
||||||
virtual char *readNextFrame(std::ifstream &filebin) {
|
virtual char *readNextFrame(ifstream &filebin) {
|
||||||
int ff = -1, np = -1;
|
int ff = -1, np = -1;
|
||||||
return readNextFrame(filebin, ff, np);
|
return readNextFrame(filebin, ff, np);
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual char *readNextFrame(std::ifstream &filebin, int &ff) {
|
virtual char *readNextFrame(ifstream &filebin, int &ff) {
|
||||||
int np = -1;
|
int np = -1;
|
||||||
return readNextFrame(filebin, ff, np);
|
return readNextFrame(filebin, ff, np);
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np) {
|
virtual char *readNextFrame(ifstream &filebin, int &ff, int &np) {
|
||||||
char *data = new char[32 * 2 * nSamples];
|
char *data = new char[32 * 2 * nSamples];
|
||||||
char *d = readNextFrame(filebin, ff, np, data);
|
char *d = readNextFrame(filebin, ff, np, data);
|
||||||
if (d == NULL) {
|
if (d == NULL) {
|
||||||
@ -280,7 +280,7 @@ class moench03T1ZmqDataNew : public slsDetectorData<uint16_t> {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np,
|
virtual char *readNextFrame(ifstream &filebin, int &ff, int &np,
|
||||||
char *data) {
|
char *data) {
|
||||||
// char *retval=0;
|
// char *retval=0;
|
||||||
// int nd;
|
// int nd;
|
||||||
|
@ -3,9 +3,50 @@
|
|||||||
#ifndef MOENCH04ZMQ10GBDATA_H
|
#ifndef MOENCH04ZMQ10GBDATA_H
|
||||||
#define MOENCH04ZMQ10GBDATA_H
|
#define MOENCH04ZMQ10GBDATA_H
|
||||||
#include "slsDetectorData.h"
|
#include "slsDetectorData.h"
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
|
|
||||||
using namespace std;
|
#ifndef SLS_DETECTOR_HEADER
|
||||||
|
#define SLS_DETECTOR_HEADER
|
||||||
|
|
||||||
|
//#define VERSION_V2
|
||||||
|
/**
|
||||||
|
@short structure for a Detector Packet or Image Header
|
||||||
|
@li frameNumber is the frame number
|
||||||
|
@li expLength is the subframe number (32 bit eiger) or real time exposure
|
||||||
|
time in 100ns (others)
|
||||||
|
@li packetNumber is the packet number
|
||||||
|
@li bunchId is the bunch id from beamline
|
||||||
|
@li timestamp is the time stamp with 10 MHz clock
|
||||||
|
@li modId is the unique module id (unique even for left, right, top, bottom)
|
||||||
|
@li xCoord is the x coordinate in the complete detector system
|
||||||
|
@li yCoord is the y coordinate in the complete detector system
|
||||||
|
@li zCoord is the z coordinate in the complete detector system
|
||||||
|
@li debug is for debugging purposes
|
||||||
|
@li roundRNumber is the round robin set number
|
||||||
|
@li detType is the detector type see :: detectorType
|
||||||
|
@li version is the version number of this structure format
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint64_t frameNumber; /**< is the frame number */
|
||||||
|
uint32_t expLength; /**< is the subframe number (32 bit eiger) or real time
|
||||||
|
exposure time in 100ns (others) */
|
||||||
|
uint32_t packetNumber; /**< is the packet number */
|
||||||
|
uint64_t bunchId; /**< is the bunch id from beamline */
|
||||||
|
uint64_t timestamp; /**< is the time stamp with 10 MHz clock */
|
||||||
|
uint16_t modId; /**< is the unique module id (unique even for left, right,
|
||||||
|
top, bottom) */
|
||||||
|
uint16_t xCoord; /**< is the x coordinate in the complete detector system */
|
||||||
|
uint16_t yCoord; /**< is the y coordinate in the complete detector system */
|
||||||
|
uint16_t zCoord; /**< is the z coordinate in the complete detector system */
|
||||||
|
uint32_t debug; /**< is for debugging purposes */
|
||||||
|
uint16_t roundRNumber; /**< is the round robin set number */
|
||||||
|
uint8_t detType; /**< is the detector type see :: detectorType */
|
||||||
|
uint8_t version; /**< is the version number of this structure format */
|
||||||
|
uint64_t
|
||||||
|
packetCaught[8]; /**< is the version number of this structure format */
|
||||||
|
|
||||||
|
} sls_detector_header;
|
||||||
|
#endif
|
||||||
|
|
||||||
class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -27,40 +68,67 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
|||||||
// moench04CtbZmq10GbData(int nas=5000, int nds=0):
|
// moench04CtbZmq10GbData(int nas=5000, int nds=0):
|
||||||
// slsDetectorData<uint16_t>(400, 400, nas*2*32+nds*8), aSamples(nas),
|
// slsDetectorData<uint16_t>(400, 400, nas*2*32+nds*8), aSamples(nas),
|
||||||
// dSamples(nds), nadc(32), sc_width(25), sc_height(200) {
|
// dSamples(nds), nadc(32), sc_width(25), sc_height(200) {
|
||||||
|
#ifndef RAWDATA
|
||||||
|
moench04CtbZmq10GbData(int nas = 5000, int nds = 0)
|
||||||
|
: slsDetectorData<uint16_t>(400, 400,
|
||||||
|
(nas > 0) && (nds > 0)
|
||||||
|
? max(nas, nds) * (32 * 2 + 8)
|
||||||
|
: nas * 32 * 2 + nds * 8),
|
||||||
|
nadc(32), sc_width(25), sc_height(200), aSamples(nas), dSamples(nds) {
|
||||||
|
int off = 0;
|
||||||
|
#endif
|
||||||
|
#ifdef RAWDATA
|
||||||
moench04CtbZmq10GbData(int nas = 5000, int nds = 0)
|
moench04CtbZmq10GbData(int nas = 5000, int nds = 0)
|
||||||
: slsDetectorData<uint16_t>(400, 400,
|
: slsDetectorData<uint16_t>(400, 400,
|
||||||
#ifdef RAWDATA
|
sizeof(sls_detector_header) +
|
||||||
sizeof(slsDetectorDefs::sls_receiver_header) +
|
|
||||||
#endif
|
|
||||||
((nas > 0) && (nds > 0)
|
((nas > 0) && (nds > 0)
|
||||||
? max(nas, nds) * (32 * 2 + 8)
|
? max(nas, nds) * (32 * 2 + 8)
|
||||||
: nas * 32 * 2 + nds * 8)),
|
: nas * 32 * 2 + nds * 8)),
|
||||||
nadc(32), sc_width(25), sc_height(200), aSamples(nas), dSamples(nds) {
|
nadc(32), sc_width(25), sc_height(200), aSamples(nas),
|
||||||
#ifdef RAWDATA
|
dSamples(nds) {
|
||||||
off=sizeof(slsDetectorDefs::sls_receiver_header);
|
int off = sizeof(sls_detector_header);
|
||||||
#endif
|
cout << "hh" << dataSize << endl;
|
||||||
#ifndef RAWDATA
|
cout << sizeof(sls_detector_header) +
|
||||||
#ifndef CTB
|
((nas > 0) && (nds > 0) ? max(nas, nds) * (32 * 2 + 8)
|
||||||
off=sizeof(int);
|
: nas * 32 * 2 + nds * 8)
|
||||||
#endif
|
<< endl;
|
||||||
#ifdef CTB
|
|
||||||
off=0;
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
/* int ds; */
|
||||||
|
/* if (nas && nds) */
|
||||||
|
/* if (nds>nas) */
|
||||||
|
/* ds=nds*(32*2+8); */
|
||||||
|
/* else */
|
||||||
|
/* ds=nas*(32*2+8); */
|
||||||
|
/* else */
|
||||||
|
/* ds=nas*32*2+nds*8; */
|
||||||
|
|
||||||
cout << "off is " << off << endl;
|
/* new slsDetectorData<uint16_t>(400, 400, ds); */
|
||||||
|
|
||||||
if (off>0)
|
|
||||||
cout << "M04 RAW DATA NEW " << endl;
|
|
||||||
else
|
|
||||||
cout << "M04 ZMQ DATA NEW " << endl;
|
|
||||||
|
|
||||||
int adc_nr[32] = {9, 8, 11, 10, 13, 12, 15, 14, 1, 0, 3,
|
int adc_nr[32] = {9, 8, 11, 10, 13, 12, 15, 14, 1, 0, 3,
|
||||||
2, 5, 4, 7, 6, 23, 22, 21, 20, 19, 18,
|
2, 5, 4, 7, 6, 23, 22, 21, 20, 19, 18,
|
||||||
17, 16, 31, 30, 29, 28, 27, 26, 25, 24};
|
17, 16, 31, 30, 29, 28, 27, 26, 25, 24};
|
||||||
|
|
||||||
|
/*
|
||||||
|
iadc=ptr%32
|
||||||
|
isample=ptr/32
|
||||||
|
|
||||||
|
col=(adc_nr[iadc]%16)*25+isample%25
|
||||||
|
if (adc_nr[iadc]<16)
|
||||||
|
row=199-isample/25;
|
||||||
|
else
|
||||||
|
row=200+isample/25
|
||||||
|
|
||||||
|
|
||||||
|
adc0 col(9*25..10*25-1) row(199..0)
|
||||||
|
adc1 col(8*25..9*25-1) row(199..0)
|
||||||
|
adc2 col(11*25..12*25-1) row(199..0)
|
||||||
|
adc3 col(10*25..11*25-1) row(199..0)
|
||||||
|
adc4 col(13*25..14*25-1) row(199..0)
|
||||||
|
adc5 col(12*25..13*25-1) row(199..0)
|
||||||
|
adc6 col(15*25..16*25-1) row(199..0)
|
||||||
|
adc7 col(14*25..15*25-1) row(199..0)
|
||||||
|
adc8 col(1*25..2*25-1) row(199..0)
|
||||||
|
*/
|
||||||
|
|
||||||
int row, col;
|
int row, col;
|
||||||
|
|
||||||
@ -100,11 +168,39 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* for (ibyte=0; ibyte<sizeof(sls_detector_header)/2; ibyte++){ */
|
||||||
|
/* xmap[ibyte]=-1; */
|
||||||
|
/* ymap[ibyte]=-1; */
|
||||||
|
/* } */
|
||||||
|
/* int off=sizeof(sls_detector_header)/2; */
|
||||||
|
|
||||||
|
/* for (ibyte=0; ibyte<dataSize; ibyte++) { */
|
||||||
|
|
||||||
|
/* for (ipacket=0; ipacket<npackets; ipacket++) { */
|
||||||
|
/* for (ibyte=0; ibyte< 8192/2; ibyte++) { */
|
||||||
|
/* i=ipacket*8208/2+ibyte; */
|
||||||
|
/* isample=ii/nadc; */
|
||||||
|
/* if (isample<nSamples) { */
|
||||||
|
/* iadc=ii%nadc; */
|
||||||
|
/* adc4 = (int)iadc/4; */
|
||||||
|
/* ix=isample%sc_width; */
|
||||||
|
/* iy=isample/sc_width; */
|
||||||
|
/* if (adc4%2==0) { */
|
||||||
|
/* xmap[i+off]=adc_nr[iadc]+ix; */
|
||||||
|
/* ymap[i+off]=ny/2-1-iy; */
|
||||||
|
/* } else { */
|
||||||
|
/* xmap[i+off]=adc_nr[iadc]+ix; */
|
||||||
|
/* ymap[i+off]=ny/2+iy; */
|
||||||
|
/* } */
|
||||||
|
/* } */
|
||||||
|
/* ii++; */
|
||||||
|
/* // } */
|
||||||
|
/* } */
|
||||||
|
/* } */
|
||||||
|
|
||||||
iframe = 0;
|
iframe = 0;
|
||||||
// cout << "data struct created" << endl;
|
// cout << "data struct created" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int getGain(char *data, int x, int y) {
|
int getGain(char *data, int x, int y) {
|
||||||
// int aoff=aSamples*2*32;
|
// int aoff=aSamples*2*32;
|
||||||
@ -157,12 +253,10 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
|||||||
/* unsigned char bunchid[8]; */
|
/* unsigned char bunchid[8]; */
|
||||||
/* }; */
|
/* }; */
|
||||||
|
|
||||||
int getFrameNumber(char *buff) {
|
|
||||||
#ifdef RAWDATA
|
#ifdef RAWDATA
|
||||||
return ((slsDetectorDefs::sls_receiver_header *)buff)->detHeader.frameNumber;
|
int getFrameNumber(char *buff) {
|
||||||
#endif
|
return ((sls_detector_header *)buff)->frameNumber;
|
||||||
return (int)(*buff);
|
}; //*((int*)(buff+5))&0xffffff;};
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -174,15 +268,76 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
int getPacketNumber(char *buff) {
|
int getPacketNumber(char *buff) {
|
||||||
#ifdef RAWDATA
|
return ((sls_detector_header *)buff)->packetNumber;
|
||||||
return ((slsDetectorDefs::sls_receiver_header *)buff)->detHeader.packetNumber;
|
} //((*(((int*)(buff+4))))&0xff)+1;};
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
#ifndef RAWDATA
|
||||||
|
|
||||||
}
|
int getFrameNumber(char *buff) {
|
||||||
|
return iframe;
|
||||||
|
}; //((sls_detector_header*)buff)->frameNumber;};//*((int*)(buff+5))&0xffffff;};
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
|
||||||
|
Returns the packet number for the given dataset. purely virtual func
|
||||||
|
\param buff pointer to the dataset
|
||||||
|
\returns packet number number
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
// int getPacketNumber(char *buff){return
|
||||||
|
// ((sls_detector_header*)buff)->packetNumber;}//((*(((int*)(buff+4))))&0xff)+1;};
|
||||||
|
|
||||||
|
/* /\** */
|
||||||
|
|
||||||
|
/* Loops over a memory slot until a complete frame is found (i.e.
|
||||||
|
* all packets 0 to nPackets, same frame number). purely virtual func */
|
||||||
|
/* \param data pointer to the memory to be analyzed */
|
||||||
|
/* \param ndata reference to the amount of data found for the
|
||||||
|
* frame, in case the frame is incomplete at the end of the memory slot
|
||||||
|
*/
|
||||||
|
/* \param dsize size of the memory slot to be analyzed */
|
||||||
|
/* \returns pointer to the beginning of the last good frame (might
|
||||||
|
* be incomplete if ndata smaller than dataSize), or NULL if no frame is
|
||||||
|
* found */
|
||||||
|
|
||||||
|
/* *\/ */
|
||||||
|
/* virtual char *findNextFrame(char *data, int &ndata, int
|
||||||
|
* dsize){ndata=dsize; setDataSize(dsize); return data;}; */
|
||||||
|
|
||||||
|
/* /\** */
|
||||||
|
|
||||||
|
/* Loops over a file stream until a complete frame is found (i.e.
|
||||||
|
* all packets 0 to nPackets, same frame number). Can be overloaded for
|
||||||
|
* different kind of detectors! */
|
||||||
|
/* \param filebin input file stream (binary) */
|
||||||
|
/* \returns pointer to the begin of the last good frame, NULL if no
|
||||||
|
* frame is found or last frame is incomplete */
|
||||||
|
|
||||||
|
/* *\/ */
|
||||||
|
/* virtual char *readNextFrame(ifstream &filebin){ */
|
||||||
|
/* // int afifo_length=0; */
|
||||||
|
/* uint16_t *afifo_cont; */
|
||||||
|
/* int ib=0; */
|
||||||
|
/* if (filebin.is_open()) { */
|
||||||
|
/* afifo_cont=new uint16_t[dataSize/2]; */
|
||||||
|
/* while (filebin.read(((char*)afifo_cont)+ib,2)) { */
|
||||||
|
/* ib+=2; */
|
||||||
|
/* if (ib==dataSize) break; */
|
||||||
|
/* } */
|
||||||
|
/* if (ib>0) { */
|
||||||
|
/* iframe++; */
|
||||||
|
/* // cout << ib << "-" << endl; */
|
||||||
|
/* return (char*)afifo_cont; */
|
||||||
|
/* } else { */
|
||||||
|
/* delete [] afifo_cont; */
|
||||||
|
/* return NULL; */
|
||||||
|
/* } */
|
||||||
|
/* } */
|
||||||
|
/* return NULL; */
|
||||||
|
/* }; */
|
||||||
|
|
||||||
virtual char *readNextFrame(ifstream & filebin) {
|
virtual char *readNextFrame(ifstream & filebin) {
|
||||||
int ff = -1, np = -1;
|
int ff = -1, np = -1;
|
||||||
return readNextFrame(filebin, ff, np);
|
return readNextFrame(filebin, ff, np);
|
||||||
@ -203,12 +358,11 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef RAWDATA
|
||||||
|
|
||||||
virtual char *readNextFrame(ifstream & filebin, int &ff, int &np,
|
virtual char *readNextFrame(ifstream & filebin, int &ff, int &np,
|
||||||
char *data) {
|
char *data) {
|
||||||
// char *retval=0;
|
// char *retval=0;
|
||||||
#ifndef RAWDATA
|
|
||||||
|
|
||||||
// int nd;
|
// int nd;
|
||||||
// int fnum = -1;
|
// int fnum = -1;
|
||||||
np = 0;
|
np = 0;
|
||||||
@ -226,13 +380,19 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef RAWDATA
|
#ifdef RAWDATA
|
||||||
//int nd;
|
|
||||||
|
virtual char *readNextFrame(ifstream & filebin, int &ff, int &np,
|
||||||
|
char *data) {
|
||||||
|
char *retval = 0;
|
||||||
|
int nd;
|
||||||
int fnum = -1;
|
int fnum = -1;
|
||||||
np = 0;
|
np = 0;
|
||||||
//int pn;
|
int pn;
|
||||||
|
|
||||||
// cout << dataSize << endl;
|
// cout << dataSize << endl;
|
||||||
if (ff >= 0)
|
if (ff >= 0)
|
||||||
@ -246,9 +406,9 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -273,4 +433,3 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,216 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#ifndef MOENCHDATA_H
|
|
||||||
#define MOENCHDATA_H
|
|
||||||
#include "slsDetectorData.h"
|
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
class moenchData : public slsDetectorData<uint16_t> {
|
|
||||||
|
|
||||||
private:
|
|
||||||
int iframe;
|
|
||||||
int nadc;
|
|
||||||
int sc_width;
|
|
||||||
int sc_height;
|
|
||||||
const int aSamples;
|
|
||||||
const int dSamples;
|
|
||||||
int off;
|
|
||||||
int *adc_nr;
|
|
||||||
int *ibit;
|
|
||||||
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
Implements the slsReceiverData structure for the moench02 prototype read
|
|
||||||
out by a module i.e. using the slsReceiver (160x160 pixels, 40 packets
|
|
||||||
1286 large etc.) \param c crosstalk parameter for the output buffer
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
moenchData(int off, int nadc_i, int *adc_nr_in, int *ibit_in, int nas = 5000, int nds = 0, int nx_i=400, int ny_i=400)
|
|
||||||
: nadc(nadc_i), slsDetectorData<uint16_t>(nx_i, ny_i,off+((nas > 0) && (nds > 0)
|
|
||||||
? max(nas, nds) * (nadc_i * 2 + 8)
|
|
||||||
: nas * nadc_i * 2 + nds * 8)),
|
|
||||||
sc_width(25), sc_height(200), aSamples(nas), dSamples(nds) {
|
|
||||||
|
|
||||||
|
|
||||||
adc_nr=new int[nadc];
|
|
||||||
if (ibit_in)
|
|
||||||
ibit=new int[nadc];
|
|
||||||
else
|
|
||||||
ibit=NULL;
|
|
||||||
for (iadc=0; iadc<nadc; iadc++) {
|
|
||||||
adc_nr[iadc]=adc_nr_in[iadc];
|
|
||||||
if (ibit)
|
|
||||||
ibit[iadc]=ibit_in[iadc];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int row, col;
|
|
||||||
int iadc;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (int is = 0; is < aSamples; is++) {
|
|
||||||
|
|
||||||
for (iadc = 0; iadc < nadc; iadc++) {
|
|
||||||
i = is;
|
|
||||||
// adc4=(int)iadc/4;
|
|
||||||
if (i < sc_width * sc_height) {
|
|
||||||
// for (int i=0; i<sc_width*sc_height; i++) {
|
|
||||||
col = (adc_nr[iadc] % 16) * sc_width + (i % sc_width);
|
|
||||||
// if (adc4%2==0) {
|
|
||||||
if (iadc < 16) {
|
|
||||||
row = 199 - i / sc_width;
|
|
||||||
} else {
|
|
||||||
row = 200 + i / sc_width;
|
|
||||||
}
|
|
||||||
if (nds > 0)
|
|
||||||
dataMap[row][col] =
|
|
||||||
((nadc + 4) * i + iadc) * 2 + off; //+16*(ip+1);
|
|
||||||
else
|
|
||||||
dataMap[row][col] =
|
|
||||||
(nadc * i + iadc) * 2 + off; //+16*(ip+1);
|
|
||||||
if (dataMap[row][col] < 0 ||
|
|
||||||
dataMap[row][col] >= aSamples * 2 * 32 + off)
|
|
||||||
cout << "Error: pointer " << dataMap[row][col]
|
|
||||||
<< " out of range " << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iframe = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
virtual int getGain(char *data, int x, int y) {
|
|
||||||
// int aoff=aSamples*2*32;
|
|
||||||
|
|
||||||
if (ibit) {
|
|
||||||
int irow;
|
|
||||||
int isc = x / sc_width;
|
|
||||||
int icol = x % sc_width;
|
|
||||||
if (y < 200)
|
|
||||||
irow = sc_height - 1 - y;
|
|
||||||
else {
|
|
||||||
irow = y - sc_height;
|
|
||||||
isc++;
|
|
||||||
}
|
|
||||||
int isample = irow * sc_width + icol;
|
|
||||||
|
|
||||||
uint64_t sample;
|
|
||||||
char *ptr;
|
|
||||||
if (isc < 0 || isc >= 32)
|
|
||||||
return 0;
|
|
||||||
if (ibit[isc] < 0 || ibit[isc] >= 64)
|
|
||||||
return 0;
|
|
||||||
if (dSamples > isample) {
|
|
||||||
ptr = data + 32 * (isample + 1) + 8 * isample;
|
|
||||||
sample = *((uint64_t *)ptr);
|
|
||||||
if (sample & (1 << ibit[isc]))
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
|
|
||||||
Returns the frame number for the given dataset. Purely virtual func.
|
|
||||||
\param buff pointer to the dataset
|
|
||||||
\returns frame number
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int getFrameNumber(char *buff) {
|
|
||||||
return (int* buff)[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
|
|
||||||
Returns the packet number for the given dataset. purely virtual func
|
|
||||||
\param buff pointer to the dataset
|
|
||||||
\returns packet number number
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
int getPacketNumber(char *buff) {
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
virtual char *readNextFrame(ifstream & filebin) {
|
|
||||||
int ff = -1, np = -1;
|
|
||||||
return readNextFrame(filebin, ff, np);
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual char *readNextFrame(ifstream & filebin, int &ff) {
|
|
||||||
int np = -1;
|
|
||||||
return readNextFrame(filebin, ff, np);
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual char *readNextFrame(ifstream & filebin, int &ff, int &np) {
|
|
||||||
char *data = new char[dataSize];
|
|
||||||
char *d = readNextFrame(filebin, ff, np, data);
|
|
||||||
if (d == NULL) {
|
|
||||||
delete[] data;
|
|
||||||
data = NULL;
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
virtual char *readNextFrame(ifstream & filebin, int &ff, int &np,
|
|
||||||
char *data) {
|
|
||||||
|
|
||||||
char *retval = 0;
|
|
||||||
int nd;
|
|
||||||
int fnum = -1;
|
|
||||||
np = 0;
|
|
||||||
int pn;
|
|
||||||
|
|
||||||
// cout << dataSize << endl;
|
|
||||||
//if (ff >= 0)
|
|
||||||
// fnum = ff;
|
|
||||||
|
|
||||||
if (filebin.is_open()) {
|
|
||||||
if (filebin.read(data, dataSize)) {
|
|
||||||
ff = getFrameNumber(data);
|
|
||||||
np = getPacketNumber(data);
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
|
|
||||||
Loops over a memory slot until a complete frame is found (i.e. all
|
|
||||||
packets 0 to nPackets, same frame number). purely virtual func \param
|
|
||||||
data pointer to the memory to be analyzed \param ndata reference to
|
|
||||||
the amount of data found for the frame, in case the frame is
|
|
||||||
incomplete at the end of the memory slot \param dsize size of the
|
|
||||||
memory slot to be analyzed \returns pointer to the beginning of the
|
|
||||||
last good frame (might be incomplete if ndata smaller than dataSize),
|
|
||||||
or NULL if no frame is found
|
|
||||||
|
|
||||||
*/
|
|
||||||
virtual char *findNextFrame(char *data, int &ndata, int dsize) {
|
|
||||||
if (dsize < dataSize)
|
|
||||||
ndata = dsize;
|
|
||||||
else
|
|
||||||
ndata = dataSize;
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -4,8 +4,11 @@
|
|||||||
#define SLSDETECTORDATA_H
|
#define SLSDETECTORDATA_H
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <inttypes.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
template <class dataType> class slsDetectorData {
|
template <class dataType> class slsDetectorData {
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -26,11 +29,13 @@ template <class dataType> class slsDetectorData {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
General slsDetectors data structure. Works for data acquired using the
|
|
||||||
|
|
||||||
|
General slsDetectors data structure. Works for data acquired using the
|
||||||
slsDetectorReceiver. Can be generalized to other detectors (many virtual
|
slsDetectorReceiver. Can be generalized to other detectors (many virtual
|
||||||
funcs).
|
funcs).
|
||||||
|
|
||||||
Constructor (no error checking if datasize and offsets are compatible!)
|
Constructor (no error checking if datasize and offsets are compatible!)
|
||||||
\param npx number of pixels in the x direction
|
\param npx number of pixels in the x direction
|
||||||
\param npy number of pixels in the y direction (1 for strips)
|
\param npy number of pixels in the y direction (1 for strips)
|
||||||
\param dsize size of the data
|
\param dsize size of the data
|
||||||
@ -40,26 +45,309 @@ template <class dataType> class slsDetectorData {
|
|||||||
is inversion is required) \param dROI Array of size nx*ny. The elements are
|
is inversion is required) \param dROI Array of size nx*ny. The elements are
|
||||||
1s if the channel is good or in the ROI, 0 is bad or out of the ROI. NULL
|
1s if the channel is good or in the ROI, 0 is bad or out of the ROI. NULL
|
||||||
(default) means all 1s.
|
(default) means all 1s.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
slsDetectorData(int npx, int npy, int dsize, int **dMap = NULL,
|
slsDetectorData(int npx, int npy, int dsize, int **dMap = NULL,
|
||||||
dataType **dMask = NULL, int **dROI = NULL);
|
dataType **dMask = NULL, int **dROI = NULL)
|
||||||
|
: nx(npx), ny(npy), dataSize(dsize), orderedData(NULL), isOrdered(0) {
|
||||||
|
|
||||||
virtual ~slsDetectorData();
|
int el = dsize / sizeof(dataType);
|
||||||
|
xmap = new int[el];
|
||||||
|
ymap = new int[el];
|
||||||
|
|
||||||
|
orderedData = new dataType *[ny];
|
||||||
|
dataMap = new int *[ny];
|
||||||
|
dataMask = new dataType *[ny];
|
||||||
|
dataROIMask = new int *[ny];
|
||||||
|
for (int i = 0; i < ny; i++) {
|
||||||
|
dataMap[i] = new int[nx];
|
||||||
|
orderedData[i] = new dataType[nx];
|
||||||
|
dataMask[i] = new dataType[nx];
|
||||||
|
dataROIMask[i] = new int[nx];
|
||||||
|
for (int j = 0; j < nx; j++)
|
||||||
|
dataROIMask[i][j] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int ip = 0; ip < el; ip++) {
|
||||||
|
xmap[ip] = -1;
|
||||||
|
ymap[ip] = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
setDataMap(dMap);
|
||||||
|
setDataMask(dMask);
|
||||||
|
setDataROIMask(dROI);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~slsDetectorData() {
|
||||||
|
for (int i = 0; i < ny; i++) {
|
||||||
|
delete[] dataMap[i];
|
||||||
|
delete[] dataMask[i];
|
||||||
|
delete[] dataROIMask[i];
|
||||||
|
delete[] orderedData[i];
|
||||||
|
}
|
||||||
|
delete[] dataMap;
|
||||||
|
delete[] dataMask;
|
||||||
|
delete[] dataROIMask;
|
||||||
|
delete[] orderedData;
|
||||||
|
delete[] xmap;
|
||||||
|
delete[] ymap;
|
||||||
|
};
|
||||||
|
|
||||||
// Virtual functions
|
|
||||||
virtual int getPointer(int ix, int iy) { return dataMap[iy][ix]; };
|
virtual int getPointer(int ix, int iy) { return dataMap[iy][ix]; };
|
||||||
virtual void getPixel(int ip, int &x, int &y);
|
/**
|
||||||
virtual dataType **getData(char *ptr, int dsize = -1);
|
defines the data map (as offset) - no error checking if datasize and
|
||||||
virtual double **getImage(char *ptr, int dsize = -1);
|
offsets are compatible! \param dMap array of size nx*ny storing the
|
||||||
virtual dataType getChannel(char *data, int ix, int iy = 0);
|
pointers to the data in the dataset (as offset). If NULL (default),the
|
||||||
|
data are arranged as if read out row by row
|
||||||
|
(dataMap[iy][ix]=(iy*nx+ix)*sizeof(dataType);)
|
||||||
|
*/
|
||||||
|
void setDataMap(int **dMap = NULL) {
|
||||||
|
|
||||||
|
int ip = 0;
|
||||||
|
int ix, iy;
|
||||||
|
if (dMap == NULL) {
|
||||||
|
for (iy = 0; iy < ny; iy++) {
|
||||||
|
for (ix = 0; ix < nx; ix++) {
|
||||||
|
dataMap[iy][ix] = (iy * nx + ix) * sizeof(dataType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// cout << "set dmap "<< dataMap << " " << dMap << endl;
|
||||||
|
for (iy = 0; iy < ny; iy++) {
|
||||||
|
// cout << iy << endl;
|
||||||
|
for (ix = 0; ix < nx; ix++) {
|
||||||
|
dataMap[iy][ix] = dMap[iy][ix];
|
||||||
|
// cout << ix << " " << iy << endl;
|
||||||
|
/*ip=dataMap[ix][iy]/sizeof(dataType);
|
||||||
|
xmap[ip]=ix;
|
||||||
|
ymap[ip]=iy;Annaa*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (iy = 0; iy < ny; iy++) {
|
||||||
|
for (ix = 0; ix < nx; ix++) {
|
||||||
|
ip = dataMap[iy][ix] / sizeof(dataType);
|
||||||
|
xmap[ip] = ix;
|
||||||
|
ymap[ip] = iy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// cout << "nx:" <<nx << " ny:" << ny << endl;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
defines the data mask i.e. the polarity of the data
|
||||||
|
\param dMask Array of size nx*ny storing the polarity of the data in the
|
||||||
|
dataset (should be 0 if no inversion is required, 0xffffffff is inversion
|
||||||
|
is required)
|
||||||
|
|
||||||
|
*/
|
||||||
|
void setDataMask(dataType **dMask = NULL) {
|
||||||
|
|
||||||
|
if (dMask != NULL) {
|
||||||
|
|
||||||
|
for (int iy = 0; iy < ny; iy++)
|
||||||
|
for (int ix = 0; ix < nx; ix++)
|
||||||
|
dataMask[iy][ix] = dMask[iy][ix];
|
||||||
|
} else {
|
||||||
|
for (int iy = 0; iy < ny; iy++)
|
||||||
|
for (int ix = 0; ix < nx; ix++)
|
||||||
|
dataMask[iy][ix] = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
defines the region of interest and/or the bad channels mask
|
||||||
|
\param dROI Array of size nx*ny. The lements are 1s if the channel is
|
||||||
|
good or in the ROI, 0 is bad or out of the ROI. NULL (default) means all
|
||||||
|
1s.
|
||||||
|
|
||||||
|
*/
|
||||||
|
void setDataROIMask(int **dROI = NULL) {
|
||||||
|
|
||||||
|
if (dROI != NULL) {
|
||||||
|
|
||||||
|
for (int iy = 0; iy < ny; iy++)
|
||||||
|
for (int ix = 0; ix < nx; ix++)
|
||||||
|
dataROIMask[iy][ix] = dROI[iy][ix];
|
||||||
|
} else {
|
||||||
|
|
||||||
|
for (int iy = 0; iy < ny; iy++)
|
||||||
|
for (int ix = 0; ix < nx; ix++)
|
||||||
|
dataROIMask[iy][ix] = 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Define bad channel or roi mask for a single channel
|
||||||
|
\param ix channel x coordinate
|
||||||
|
\param iy channel y coordinate (1 for strips)
|
||||||
|
\param i 1 if pixel is good (or in the roi), 0 if bad
|
||||||
|
\returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range
|
||||||
|
*/
|
||||||
|
int setGood(int ix, int iy, int i = 1) {
|
||||||
|
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny)
|
||||||
|
dataROIMask[iy][ix] = i;
|
||||||
|
return isGood(ix, iy);
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
Define bad channel or roi mask for a single channel
|
||||||
|
\param ix channel x coordinate
|
||||||
|
\param iy channel y coordinate (1 for strips)
|
||||||
|
\returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range
|
||||||
|
*/
|
||||||
|
int isGood(int ix, int iy) {
|
||||||
|
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny)
|
||||||
|
return dataROIMask[iy][ix];
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns detector size in x,y
|
||||||
|
\param npx reference to number of channels in x
|
||||||
|
\param npy reference to number of channels in y (will be 1 for strips)
|
||||||
|
\returns total number of channels
|
||||||
|
*/
|
||||||
|
int getDetectorSize(int &npx, int &npy) {
|
||||||
|
npx = nx;
|
||||||
|
npy = ny;
|
||||||
|
return nx * ny;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Returns the size of the data frame */
|
||||||
|
int getDataSize() { return dataSize; };
|
||||||
|
|
||||||
|
/** changes the size of the data frame */
|
||||||
|
int setDataSize(int d) {
|
||||||
|
dataSize = d;
|
||||||
|
return dataSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual void getPixel(int ip, int &x, int &y) {
|
||||||
|
x = xmap[ip];
|
||||||
|
y = ymap[ip];
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual dataType **getData(char *ptr, int dsize = -1) {
|
||||||
|
int el = dsize / sizeof(dataType);
|
||||||
|
// dataType **data;
|
||||||
|
int ix, iy;
|
||||||
|
// data=new dataType*[ny];
|
||||||
|
// for(int i = 0; i < ny; i++) {
|
||||||
|
// data[i]=new dataType[nx];
|
||||||
|
// }
|
||||||
|
isOrdered = 0;
|
||||||
|
if (dsize <= 0 || dsize > dataSize)
|
||||||
|
dsize = dataSize;
|
||||||
|
|
||||||
|
for (int ip = 0; ip < (el); ip++) {
|
||||||
|
getPixel(ip, ix, iy);
|
||||||
|
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) {
|
||||||
|
// data[iy][ix]=getChannel(ptr,ix,iy);
|
||||||
|
orderedData[iy][ix] = *(ptr + ip); // getChannel(ptr,ix,iy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isOrdered = 1;
|
||||||
|
return orderedData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void newFrame() { isOrdered = 0; };
|
||||||
|
|
||||||
|
virtual double **getImage(char *ptr, int dsize = -1) {
|
||||||
|
|
||||||
|
double **data;
|
||||||
|
int ix, iy;
|
||||||
|
data = new double *[ny];
|
||||||
|
for (int i = 0; i < ny; i++) {
|
||||||
|
data[i] = new double[nx];
|
||||||
|
}
|
||||||
|
int el = dsize / sizeof(dataType);
|
||||||
|
if (dsize <= 0 || dsize > dataSize)
|
||||||
|
dsize = dataSize;
|
||||||
|
for (int ip = 0; ip < el; ip++) {
|
||||||
|
getPixel(ip, ix, iy);
|
||||||
|
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) {
|
||||||
|
data[iy][ix] = getValue(ptr, ix, iy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the value of the selected channel for the given dataset. Virtual
|
||||||
|
function, can be overloaded. \param data pointer to the dataset
|
||||||
|
(including headers etc) \param ix pixel number in the x direction \param
|
||||||
|
iy pixel number in the y direction \returns data for the selected
|
||||||
|
channel, with inversion if required
|
||||||
|
|
||||||
|
*/
|
||||||
|
virtual dataType getChannel(char *data, int ix, int iy = 0) {
|
||||||
|
dataType m = 0, d = 0;
|
||||||
|
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny && dataMap[iy][ix] >= 0 &&
|
||||||
|
dataMap[iy][ix] < dataSize) {
|
||||||
|
// cout << ix << " " << iy << " " ;
|
||||||
|
// cout << dataMap[ix][iy] << " " << (void*)data << " " <<
|
||||||
|
// dataSize<< endl;
|
||||||
|
m = dataMask[iy][ix];
|
||||||
|
if (isOrdered == 0)
|
||||||
|
d = *((dataType *)(data + getPointer(ix, iy)));
|
||||||
|
else
|
||||||
|
d = orderedData[iy][ix];
|
||||||
|
}
|
||||||
|
return d ^ m;
|
||||||
|
};
|
||||||
|
|
||||||
virtual int getGain(char *data, int ix, int iy = 0) { return 0; };
|
virtual int getGain(char *data, int ix, int iy = 0) { return 0; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
Returns the value of the selected channel for the given dataset. Virtual
|
||||||
|
function, can be overloaded. \param data pointer to the dataset
|
||||||
|
(including headers etc) \param ix pixel number in the x direction \param
|
||||||
|
iy pixel number in the y direction \returns data for the selected
|
||||||
|
channel, with inversion if required or -1 if its a missing packet
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
virtual int getChannelwithMissingPackets(char *data, int ix, int iy) {
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the value of the selected channel for the given dataset as
|
||||||
|
double. \param data pointer to the dataset (including headers etc) \param
|
||||||
|
ix pixel number in the x direction \param iy pixel number in the y
|
||||||
|
direction \returns data for the selected channel, with inversion if
|
||||||
|
required as double
|
||||||
|
|
||||||
|
*/
|
||||||
virtual double getValue(char *data, int ix, int iy = 0) {
|
virtual double getValue(char *data, int ix, int iy = 0) {
|
||||||
|
/* cout << " x "<< ix << " y"<< iy << " val " << getChannel(data, ix,
|
||||||
|
* iy)<< endl;*/
|
||||||
return (double)getChannel(data, ix, iy);
|
return (double)getChannel(data, ix, iy);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the frame number for the given dataset. Purely virtual func.
|
||||||
|
\param buff pointer to the dataset
|
||||||
|
\returns frame number
|
||||||
|
|
||||||
|
*/
|
||||||
virtual int getFrameNumber(char *buff) = 0;
|
virtual int getFrameNumber(char *buff) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
|
Returns the packet number for the given dataset. purely virtual func
|
||||||
|
\param buff pointer to the dataset
|
||||||
|
\returns packet number number
|
||||||
|
|
||||||
|
|
||||||
|
virtual int getPacketNumber(char *buff)=0;
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
Loops over a memory slot until a complete frame is found (i.e. all
|
Loops over a memory slot until a complete frame is found (i.e. all
|
||||||
packets 0 to nPackets, same frame number). purely virtual func \param
|
packets 0 to nPackets, same frame number). purely virtual func \param
|
||||||
data pointer to the memory to be analyzed \param ndata reference to the
|
data pointer to the memory to be analyzed \param ndata reference to the
|
||||||
@ -72,276 +360,16 @@ template <class dataType> class slsDetectorData {
|
|||||||
*/
|
*/
|
||||||
virtual char *findNextFrame(char *data, int &ndata, int dsize) = 0;
|
virtual char *findNextFrame(char *data, int &ndata, int dsize) = 0;
|
||||||
|
|
||||||
//Returns a pointer to the next complete frame, if none found nullptr
|
|
||||||
//data needs to be deallocated by caller
|
|
||||||
virtual char *readNextFrame(std::ifstream &filebin) = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//END Virtual functions
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
defines the data map (as offset) - no error checking if datasize and
|
|
||||||
offsets are compatible! \param dMap array of size nx*ny storing the
|
|
||||||
pointers to the data in the dataset (as offset). If NULL (default),the
|
|
||||||
data are arranged as if read out row by row
|
|
||||||
(dataMap[iy][ix]=(iy*nx+ix)*sizeof(dataType);)
|
|
||||||
*/
|
|
||||||
void setDataMap(int **dMap = NULL);
|
|
||||||
|
|
||||||
/**
|
Loops over a file stream until a complete frame is found (i.e. all packets
|
||||||
defines the data mask i.e. the polarity of the data
|
0 to nPackets, same frame number). Can be overloaded for different kind of
|
||||||
\param dMask Array of size nx*ny storing the polarity of the data in the
|
detectors! \param filebin input file stream (binary) \returns pointer to
|
||||||
dataset (should be 0 if no inversion is required, 0xffffffff is inversion
|
the begin of the last good frame, NULL if no frame is found or last frame
|
||||||
is required)
|
is incomplete
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void setDataMask(dataType **dMask = NULL);
|
virtual char *readNextFrame(ifstream &filebin) = 0;
|
||||||
/**
|
|
||||||
defines the region of interest and/or the bad channels mask
|
|
||||||
\param dROI Array of size nx*ny. The ements are 1s if the channel is
|
|
||||||
good or in the ROI, 0 is bad or out of the ROI. NULL (default) means all
|
|
||||||
1s.
|
|
||||||
|
|
||||||
*/
|
|
||||||
void setDataROIMask(int **dROI = NULL);
|
|
||||||
|
|
||||||
/**
|
|
||||||
Define bad channel or roi mask for a single channel
|
|
||||||
\param ix channel x coordinate
|
|
||||||
\param iy channel y coordinate (1 for strips)
|
|
||||||
\param i 1 if pixel is good (or in the roi), 0 if bad
|
|
||||||
\returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range
|
|
||||||
*/
|
|
||||||
int setGood(int ix, int iy, int i = 1);
|
|
||||||
|
|
||||||
// returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range
|
|
||||||
int isGood(int ix, int iy);
|
|
||||||
|
|
||||||
// returns total number of channels, outparam npx and npy x,y dimensions
|
|
||||||
int getDetectorSize(int &npx, int &npy);
|
|
||||||
|
|
||||||
/** Returns the size of the data frame */
|
|
||||||
int getDataSize() { return dataSize; };
|
|
||||||
|
|
||||||
/** changes the size of the data frame */
|
|
||||||
int setDataSize(int d) {
|
|
||||||
dataSize = d;
|
|
||||||
return dataSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
void newFrame() { isOrdered = 0; };
|
|
||||||
|
|
||||||
/**
|
|
||||||
Returns the value of the selected channel for the given dataset. Virtual
|
|
||||||
function, can be overloaded. \param data pointer to the dataset
|
|
||||||
(including headers etc) \param ix pixel number in the x direction \param
|
|
||||||
iy pixel number in the y direction \returns data for the selected
|
|
||||||
channel, with inversion if required
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
slsDetectorData<dataType>::slsDetectorData(int npx, int npy, int dsize,
|
|
||||||
int **dMap, dataType **dMask,
|
|
||||||
int **dROI)
|
|
||||||
: nx(npx), ny(npy), dataSize(dsize), orderedData(NULL), isOrdered(0) {
|
|
||||||
|
|
||||||
int el = dsize / sizeof(dataType);
|
|
||||||
xmap = new int[el];
|
|
||||||
ymap = new int[el];
|
|
||||||
|
|
||||||
orderedData = new dataType *[ny];
|
|
||||||
dataMap = new int *[ny];
|
|
||||||
dataMask = new dataType *[ny];
|
|
||||||
dataROIMask = new int *[ny];
|
|
||||||
for (int i = 0; i < ny; i++) {
|
|
||||||
dataMap[i] = new int[nx];
|
|
||||||
orderedData[i] = new dataType[nx];
|
|
||||||
dataMask[i] = new dataType[nx];
|
|
||||||
dataROIMask[i] = new int[nx];
|
|
||||||
for (int j = 0; j < nx; j++)
|
|
||||||
dataROIMask[i][j] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int ip = 0; ip < el; ip++) {
|
|
||||||
xmap[ip] = -1;
|
|
||||||
ymap[ip] = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
setDataMap(dMap);
|
|
||||||
setDataMask(dMask);
|
|
||||||
setDataROIMask(dROI);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename dataType> slsDetectorData<dataType>::~slsDetectorData() {
|
|
||||||
for (int i = 0; i < ny; i++) {
|
|
||||||
delete[] dataMap[i];
|
|
||||||
delete[] dataMask[i];
|
|
||||||
delete[] dataROIMask[i];
|
|
||||||
delete[] orderedData[i];
|
|
||||||
}
|
|
||||||
delete[] dataMap;
|
|
||||||
delete[] dataMask;
|
|
||||||
delete[] dataROIMask;
|
|
||||||
delete[] orderedData;
|
|
||||||
delete[] xmap;
|
|
||||||
delete[] ymap;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
void slsDetectorData<dataType>::setDataMap(int **dMap) {
|
|
||||||
|
|
||||||
int ip = 0;
|
|
||||||
int ix, iy;
|
|
||||||
if (dMap == NULL) {
|
|
||||||
for (iy = 0; iy < ny; iy++) {
|
|
||||||
for (ix = 0; ix < nx; ix++) {
|
|
||||||
dataMap[iy][ix] = (iy * nx + ix) * sizeof(dataType);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// cout << "set dmap "<< dataMap << " " << dMap << endl;
|
|
||||||
for (iy = 0; iy < ny; iy++) {
|
|
||||||
// cout << iy << endl;
|
|
||||||
for (ix = 0; ix < nx; ix++) {
|
|
||||||
dataMap[iy][ix] = dMap[iy][ix];
|
|
||||||
// cout << ix << " " << iy << endl;
|
|
||||||
/*ip=dataMap[ix][iy]/sizeof(dataType);
|
|
||||||
xmap[ip]=ix;
|
|
||||||
ymap[ip]=iy;Annaa*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (iy = 0; iy < ny; iy++) {
|
|
||||||
for (ix = 0; ix < nx; ix++) {
|
|
||||||
ip = dataMap[iy][ix] / sizeof(dataType);
|
|
||||||
xmap[ip] = ix;
|
|
||||||
ymap[ip] = iy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// cout << "nx:" <<nx << " ny:" << ny << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
void slsDetectorData<dataType>::setDataMask(dataType **dMask) {
|
|
||||||
|
|
||||||
if (dMask != NULL) {
|
|
||||||
|
|
||||||
for (int iy = 0; iy < ny; iy++)
|
|
||||||
for (int ix = 0; ix < nx; ix++)
|
|
||||||
dataMask[iy][ix] = dMask[iy][ix];
|
|
||||||
} else {
|
|
||||||
for (int iy = 0; iy < ny; iy++)
|
|
||||||
for (int ix = 0; ix < nx; ix++)
|
|
||||||
dataMask[iy][ix] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
void slsDetectorData<dataType>::setDataROIMask(int **dROI) {
|
|
||||||
if (dROI != NULL) {
|
|
||||||
|
|
||||||
for (int iy = 0; iy < ny; iy++)
|
|
||||||
for (int ix = 0; ix < nx; ix++)
|
|
||||||
dataROIMask[iy][ix] = dROI[iy][ix];
|
|
||||||
} else {
|
|
||||||
|
|
||||||
for (int iy = 0; iy < ny; iy++)
|
|
||||||
for (int ix = 0; ix < nx; ix++)
|
|
||||||
dataROIMask[iy][ix] = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
int slsDetectorData<dataType>::setGood(int ix, int iy, int i) {
|
|
||||||
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny)
|
|
||||||
dataROIMask[iy][ix] = i;
|
|
||||||
return isGood(ix, iy);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
int slsDetectorData<dataType>::isGood(int ix, int iy) {
|
|
||||||
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny)
|
|
||||||
return dataROIMask[iy][ix];
|
|
||||||
else
|
|
||||||
return -1;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
int slsDetectorData<dataType>::getDetectorSize(int &npx, int &npy) {
|
|
||||||
npx = nx;
|
|
||||||
npy = ny;
|
|
||||||
return nx * ny;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
void slsDetectorData<dataType>::getPixel(int ip, int &x, int &y) {
|
|
||||||
x = xmap[ip];
|
|
||||||
y = ymap[ip];
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
dataType **slsDetectorData<dataType>::getData(char *ptr, int dsize) {
|
|
||||||
int el = dsize / sizeof(dataType);
|
|
||||||
// dataType **data;
|
|
||||||
int ix, iy;
|
|
||||||
// data=new dataType*[ny];
|
|
||||||
// for(int i = 0; i < ny; i++) {
|
|
||||||
// data[i]=new dataType[nx];
|
|
||||||
// }
|
|
||||||
isOrdered = 0;
|
|
||||||
if (dsize <= 0 || dsize > dataSize)
|
|
||||||
dsize = dataSize;
|
|
||||||
|
|
||||||
for (int ip = 0; ip < (el); ip++) {
|
|
||||||
getPixel(ip, ix, iy);
|
|
||||||
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) {
|
|
||||||
// data[iy][ix]=getChannel(ptr,ix,iy);
|
|
||||||
orderedData[iy][ix] = *(ptr + ip); // getChannel(ptr,ix,iy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
isOrdered = 1;
|
|
||||||
return orderedData;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename dataType>
|
|
||||||
double **slsDetectorData<dataType>::getImage(char *ptr, int dsize) {
|
|
||||||
|
|
||||||
double **data;
|
|
||||||
int ix, iy;
|
|
||||||
data = new double *[ny];
|
|
||||||
for (int i = 0; i < ny; i++) {
|
|
||||||
data[i] = new double[nx];
|
|
||||||
}
|
|
||||||
int el = dsize / sizeof(dataType);
|
|
||||||
if (dsize <= 0 || dsize > dataSize)
|
|
||||||
dsize = dataSize;
|
|
||||||
for (int ip = 0; ip < el; ip++) {
|
|
||||||
getPixel(ip, ix, iy);
|
|
||||||
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) {
|
|
||||||
data[iy][ix] = getValue(ptr, ix, iy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
template <typename dataType>
|
|
||||||
dataType slsDetectorData<dataType>::getChannel(char *data, int ix, int iy) {
|
|
||||||
dataType m = 0, d = 0;
|
|
||||||
if (ix >= 0 && ix < nx && iy >= 0 && iy < ny && dataMap[iy][ix] >= 0 &&
|
|
||||||
dataMap[iy][ix] < dataSize) {
|
|
||||||
m = dataMask[iy][ix];
|
|
||||||
if (isOrdered == 0)
|
|
||||||
d = *((dataType *)(data + getPointer(ix, iy)));
|
|
||||||
else
|
|
||||||
d = orderedData[iy][ix];
|
|
||||||
}
|
|
||||||
return d ^ m;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -149,7 +149,7 @@ class interpolatingDetector : public singlePhotonDetector {
|
|||||||
{
|
{
|
||||||
nph = addFrame(data, val, 1);
|
nph = addFrame(data, val, 1);
|
||||||
if (interp)
|
if (interp)
|
||||||
return interp->getFlatFieldDistribution();
|
return interp->getFlatField();
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
@ -238,96 +238,96 @@ class eta2InterpolationBase : public virtual etaInterpolationBase {
|
|||||||
|
|
||||||
// cout <<"******"<< etax << " " << etay << endl;
|
// cout <<"******"<< etax << " " << etay << endl;
|
||||||
|
|
||||||
return addToFlatFieldDistribution(etax, etay);
|
return addToFlatField(etax, etay);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* virtual int addToFlatField(double totquad, int quad, double *cl, */
|
virtual int addToFlatField(double totquad, int quad, double *cl,
|
||||||
/* double &etax, double &etay) { */
|
double &etax, double &etay) {
|
||||||
/* double cc[2][2]; */
|
double cc[2][2];
|
||||||
/* int xoff = 0, yoff = 0; */
|
int xoff = 0, yoff = 0;
|
||||||
|
|
||||||
/* switch (quad) { */
|
switch (quad) {
|
||||||
/* case BOTTOM_LEFT: */
|
case BOTTOM_LEFT:
|
||||||
/* xoff = 0; */
|
xoff = 0;
|
||||||
/* yoff = 0; */
|
yoff = 0;
|
||||||
/* break; */
|
break;
|
||||||
/* case BOTTOM_RIGHT: */
|
case BOTTOM_RIGHT:
|
||||||
/* xoff = 1; */
|
xoff = 1;
|
||||||
/* yoff = 0; */
|
yoff = 0;
|
||||||
/* break; */
|
break;
|
||||||
/* case TOP_LEFT: */
|
case TOP_LEFT:
|
||||||
/* xoff = 0; */
|
xoff = 0;
|
||||||
/* yoff = 1; */
|
yoff = 1;
|
||||||
/* break; */
|
break;
|
||||||
/* case TOP_RIGHT: */
|
case TOP_RIGHT:
|
||||||
/* xoff = 1; */
|
xoff = 1;
|
||||||
/* yoff = 1; */
|
yoff = 1;
|
||||||
/* break; */
|
break;
|
||||||
/* default:; */
|
default:;
|
||||||
/* } */
|
}
|
||||||
/* cc[0][0] = cl[xoff + 3 * yoff]; */
|
cc[0][0] = cl[xoff + 3 * yoff];
|
||||||
/* cc[1][0] = cl[(yoff + 1) * 3 + xoff]; */
|
cc[1][0] = cl[(yoff + 1) * 3 + xoff];
|
||||||
/* cc[0][1] = cl[yoff * 3 + xoff + 1]; */
|
cc[0][1] = cl[yoff * 3 + xoff + 1];
|
||||||
/* cc[1][1] = cl[(yoff + 1) * 3 + xoff + 1]; */
|
cc[1][1] = cl[(yoff + 1) * 3 + xoff + 1];
|
||||||
|
|
||||||
/* /\* cout << cl[0] << " " << cl[1] << " " << cl[2] << endl; *\/ */
|
/* cout << cl[0] << " " << cl[1] << " " << cl[2] << endl; */
|
||||||
/* /\* cout << cl[3] << " " << cl[4] << " " << cl[5] << endl; *\/ */
|
/* cout << cl[3] << " " << cl[4] << " " << cl[5] << endl; */
|
||||||
/* /\* cout << cl[6] << " " << cl[7] << " " << cl[8] << endl; *\/ */
|
/* cout << cl[6] << " " << cl[7] << " " << cl[8] << endl; */
|
||||||
/* /\* cout <<"******"<<totquad << " " << quad << endl; *\/ */
|
/* cout <<"******"<<totquad << " " << quad << endl; */
|
||||||
/* /\* cout << cc[0][0]<< " " << cc[0][1] << endl; *\/ */
|
/* cout << cc[0][0]<< " " << cc[0][1] << endl; */
|
||||||
/* /\* cout << cc[1][0]<< " " << cc[1][1] << endl; *\/ */
|
/* cout << cc[1][0]<< " " << cc[1][1] << endl; */
|
||||||
/* // calcMyEta(totquad,quad,cl,etax, etay); */
|
// calcMyEta(totquad,quad,cl,etax, etay);
|
||||||
/* calcEta(totquad, cc, etax, etay); */
|
calcEta(totquad, cc, etax, etay);
|
||||||
|
|
||||||
/* // cout <<"******"<< etax << " " << etay << endl; */
|
// cout <<"******"<< etax << " " << etay << endl;
|
||||||
|
|
||||||
/* return addToFlatFieldDistribution(etax, etay); */
|
return addToFlatField(etax, etay);
|
||||||
/* } */
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
/* virtual int addToFlatField(double *cluster, double &etax, double &etay) { */
|
virtual int addToFlatField(double *cluster, double &etax, double &etay) {
|
||||||
/* double sDum[2][2]; */
|
double sDum[2][2];
|
||||||
/* double tot, totquad; */
|
double tot, totquad;
|
||||||
/* // int corner; */
|
// int corner;
|
||||||
/* // corner= */
|
// corner=
|
||||||
/* calcQuad(cluster, tot, totquad, sDum); */
|
calcQuad(cluster, tot, totquad, sDum);
|
||||||
|
|
||||||
/* // double xpos_eta,ypos_eta; */
|
// double xpos_eta,ypos_eta;
|
||||||
/* // double dX,dY; */
|
// double dX,dY;
|
||||||
|
|
||||||
/* calcEta(totquad, sDum, etax, etay); */
|
calcEta(totquad, sDum, etax, etay);
|
||||||
|
|
||||||
/* return addToFlatField(etax, etay); */
|
return addToFlatField(etax, etay);
|
||||||
/* }; */
|
};
|
||||||
|
|
||||||
/* virtual int addToFlatField(int *cluster, double &etax, double &etay) { */
|
virtual int addToFlatField(int *cluster, double &etax, double &etay) {
|
||||||
/* double sDum[2][2]; */
|
double sDum[2][2];
|
||||||
/* double tot, totquad; */
|
double tot, totquad;
|
||||||
/* // int corner; */
|
// int corner;
|
||||||
/* // corner= */
|
// corner=
|
||||||
/* calcQuad(cluster, tot, totquad, sDum); */
|
calcQuad(cluster, tot, totquad, sDum);
|
||||||
|
|
||||||
/* // double xpos_eta,ypos_eta; */
|
// double xpos_eta,ypos_eta;
|
||||||
/* // double dX,dY; */
|
// double dX,dY;
|
||||||
|
|
||||||
/* calcEta(totquad, sDum, etax, etay); */
|
calcEta(totquad, sDum, etax, etay);
|
||||||
|
|
||||||
/* return addToFlatField(etax, etay); */
|
return addToFlatField(etax, etay);
|
||||||
/* }; */
|
};
|
||||||
|
|
||||||
/* virtual int addToFlatFieldDistribution(double etax, double etay) { */
|
virtual int addToFlatField(double etax, double etay) {
|
||||||
/* #ifdef MYROOT1 */
|
#ifdef MYROOT1
|
||||||
/* heta->Fill(etax, etay); */
|
heta->Fill(etax, etay);
|
||||||
/* #endif */
|
#endif
|
||||||
/* #ifndef MYROOT1 */
|
#ifndef MYROOT1
|
||||||
/* int ex, ey; */
|
int ex, ey;
|
||||||
/* ex = (etax - etamin) / etastepX; */
|
ex = (etax - etamin) / etastepX;
|
||||||
/* ey = (etay - etamin) / etastepY; */
|
ey = (etay - etamin) / etastepY;
|
||||||
/* if (ey < nbetaY && ex < nbetaX && ex >= 0 && ey >= 0) */
|
if (ey < nbetaY && ex < nbetaX && ex >= 0 && ey >= 0)
|
||||||
/* heta[ey * nbetaX + ex]++; */
|
heta[ey * nbetaX + ex]++;
|
||||||
/* #endif */
|
#endif
|
||||||
/* return 0; */
|
return 0;
|
||||||
/* }; */
|
};
|
||||||
|
|
||||||
virtual int *getInterpolatedImage() {
|
virtual int *getInterpolatedImage() {
|
||||||
int ipx, ipy;
|
int ipx, ipy;
|
||||||
|
@ -205,44 +205,44 @@ class eta3InterpolationBase : public virtual etaInterpolationBase {
|
|||||||
double &etay) {
|
double &etay) {
|
||||||
|
|
||||||
calcEta3(cl, etax, etay, totquad);
|
calcEta3(cl, etax, etay, totquad);
|
||||||
return addToFlatFieldDistribution(etax, etay);
|
return addToFlatField(etax, etay);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* virtual int addToFlatField(double totquad, int quad, double *cl, */
|
virtual int addToFlatField(double totquad, int quad, double *cl,
|
||||||
/* double &etax, double &etay) { */
|
double &etax, double &etay) {
|
||||||
|
|
||||||
/* calcEta3(cl, etax, etay, totquad); */
|
calcEta3(cl, etax, etay, totquad);
|
||||||
/* return addToFlatField(etax, etay); */
|
return addToFlatField(etax, etay);
|
||||||
/* } */
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
/* virtual int addToFlatField(double *cluster, double &etax, double &etay) { */
|
virtual int addToFlatField(double *cluster, double &etax, double &etay) {
|
||||||
/* double totquad; */
|
double totquad;
|
||||||
/* calcEta3(cluster, etax, etay, totquad); */
|
calcEta3(cluster, etax, etay, totquad);
|
||||||
/* return addToFlatField(etax, etay); */
|
return addToFlatField(etax, etay);
|
||||||
/* }; */
|
};
|
||||||
|
|
||||||
/* virtual int addToFlatField(int *cluster, double &etax, double &etay) { */
|
virtual int addToFlatField(int *cluster, double &etax, double &etay) {
|
||||||
|
|
||||||
/* double totquad; */
|
double totquad;
|
||||||
|
|
||||||
/* calcEta3(cluster, etax, etay, totquad); */
|
calcEta3(cluster, etax, etay, totquad);
|
||||||
/* return addToFlatField(etax, etay); */
|
return addToFlatField(etax, etay);
|
||||||
/* }; */
|
};
|
||||||
|
|
||||||
/* virtual int addToFlatField(double etax, double etay) { */
|
virtual int addToFlatField(double etax, double etay) {
|
||||||
/* #ifdef MYROOT1 */
|
#ifdef MYROOT1
|
||||||
/* heta->Fill(etax, etay); */
|
heta->Fill(etax, etay);
|
||||||
/* #endif */
|
#endif
|
||||||
/* #ifndef MYROOT1 */
|
#ifndef MYROOT1
|
||||||
/* int ex, ey; */
|
int ex, ey;
|
||||||
/* ex = (etax - etamin) / etastepX; */
|
ex = (etax - etamin) / etastepX;
|
||||||
/* ey = (etay - etamin) / etastepY; */
|
ey = (etay - etamin) / etastepY;
|
||||||
/* if (ey < nbetaY && ex < nbetaX && ex >= 0 && ey >= 0) */
|
if (ey < nbetaY && ex < nbetaX && ex >= 0 && ey >= 0)
|
||||||
/* heta[ey * nbetaX + ex]++; */
|
heta[ey * nbetaX + ex]++;
|
||||||
/* #endif */
|
#endif
|
||||||
/* return 0; */
|
return 0;
|
||||||
/* }; */
|
};
|
||||||
|
|
||||||
/* protected: */
|
/* protected: */
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#ifndef ETA_INTERPOLATION_ADAPTIVEBINS_H
|
#ifndef ETA_INTERPOLATION_ADAPTIVEBINS_H
|
||||||
#define ETA_INTERPOLATION_ADAPTIVEBINS_H
|
#define ETA_INTERPOLATION_ADAPTIVEBINS_H
|
||||||
|
|
||||||
#include "sls/tiffIO.h"
|
#include "tiffIO.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
//#include "etaInterpolationBase.h"
|
//#include "etaInterpolationBase.h"
|
||||||
#include "etaInterpolationPosXY.h"
|
#include "etaInterpolationPosXY.h"
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include <TTree.h>
|
#include <TTree.h>
|
||||||
#endif
|
#endif
|
||||||
#include "slsInterpolation.h"
|
#include "slsInterpolation.h"
|
||||||
#include "sls/tiffIO.h"
|
#include "tiffIO.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
class etaInterpolationBase : public slsInterpolation {
|
class etaInterpolationBase : public slsInterpolation {
|
||||||
@ -128,7 +128,7 @@ class etaInterpolationBase : public slsInterpolation {
|
|||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
void *readFlatField(const char *imgname, double emin = 1, double emax = 0) {
|
int readFlatField(const char *imgname, double emin = 1, double emax = 0) {
|
||||||
if (emax >= 1)
|
if (emax >= 1)
|
||||||
etamax = emax;
|
etamax = emax;
|
||||||
if (emin <= 0)
|
if (emin <= 0)
|
||||||
@ -169,9 +169,9 @@ class etaInterpolationBase : public slsInterpolation {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete[] gm;
|
delete[] gm;
|
||||||
return heta;
|
return 1;
|
||||||
}
|
}
|
||||||
return NULL;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
float *gethhx() {
|
float *gethhx() {
|
||||||
@ -183,17 +183,12 @@ class etaInterpolationBase : public slsInterpolation {
|
|||||||
// hhy->Scale((double)nSubPixels);
|
// hhy->Scale((double)nSubPixels);
|
||||||
return hhy;
|
return hhy;
|
||||||
};
|
};
|
||||||
virtual int addToFlatFieldDistribution(double etax, double etay) {
|
virtual int addToFlatField(double etax, double etay) {
|
||||||
#ifdef MYROOT1
|
|
||||||
heta->Fill(etax, etay);
|
|
||||||
#endif
|
|
||||||
#ifndef MYROOT1
|
|
||||||
int ex, ey;
|
int ex, ey;
|
||||||
ex = (etax - etamin) / etastepX;
|
ex = (etax - etamin) / etastepX;
|
||||||
ey = (etay - etamin) / etastepY;
|
ey = (etay - etamin) / etastepY;
|
||||||
if (ey < nbetaY && ex < nbetaX && ex >= 0 && ey >= 0)
|
if (ey < nbetaY && ex < nbetaX && ex >= 0 && ey >= 0)
|
||||||
heta[ey * nbetaX + ex]++;
|
heta[ey * nbetaX + ex]++;
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#ifndef ETA_INTERPOLATION_CLEVER_ADAPTIVEBINS_H
|
#ifndef ETA_INTERPOLATION_CLEVER_ADAPTIVEBINS_H
|
||||||
#define ETA_INTERPOLATION_CLEVER_ADAPTIVEBINS_H
|
#define ETA_INTERPOLATION_CLEVER_ADAPTIVEBINS_H
|
||||||
|
|
||||||
#include "sls/tiffIO.h"
|
#include "tiffIO.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
//#include "etaInterpolationBase.h"
|
//#include "etaInterpolationBase.h"
|
||||||
#include "etaInterpolationAdaptiveBins.h"
|
#include "etaInterpolationAdaptiveBins.h"
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#ifndef ETA_INTERPOLATION_POSXY_H
|
#ifndef ETA_INTERPOLATION_POSXY_H
|
||||||
#define ETA_INTERPOLATION_POSXY_H
|
#define ETA_INTERPOLATION_POSXY_H
|
||||||
|
|
||||||
//#include "sls/tiffIO.h"
|
//#include "tiffIO.h"
|
||||||
#include "eta2InterpolationBase.h"
|
#include "eta2InterpolationBase.h"
|
||||||
#include "eta3InterpolationBase.h"
|
#include "eta3InterpolationBase.h"
|
||||||
#include "etaInterpolationBase.h"
|
#include "etaInterpolationBase.h"
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#ifndef ETA_INTERPOLATION_RANDOMBINS_H
|
#ifndef ETA_INTERPOLATION_RANDOMBINS_H
|
||||||
#define ETA_INTERPOLATION_RANDOMBINS_H
|
#define ETA_INTERPOLATION_RANDOMBINS_H
|
||||||
|
|
||||||
#include "sls/tiffIO.h"
|
#include "tiffIO.h"
|
||||||
//#include "etaInterpolationBase.h"
|
//#include "etaInterpolationBase.h"
|
||||||
#include "etaInterpolationPosXY.h"
|
#include "etaInterpolationPosXY.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -78,20 +78,20 @@ class noInterpolation : public slsInterpolation {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
/* virtual int addToFlatField(double *cluster, double &etax, double &etay) { */
|
virtual int addToFlatField(double *cluster, double &etax, double &etay) {
|
||||||
/* return 0; */
|
return 0;
|
||||||
/* }; */
|
};
|
||||||
|
|
||||||
/* virtual int addToFlatField(int *cluster, double &etax, double &etay) { */
|
virtual int addToFlatField(int *cluster, double &etax, double &etay) {
|
||||||
/* return 0; */
|
return 0;
|
||||||
/* }; */
|
};
|
||||||
|
|
||||||
virtual int addToFlatFieldDistribution(double etax, double etay) { return 0; };
|
virtual int addToFlatField(double etax, double etay) { return 0; };
|
||||||
|
|
||||||
/* virtual int addToFlatField(double totquad, int quad, double *cl, */
|
virtual int addToFlatField(double totquad, int quad, double *cl,
|
||||||
/* double &etax, double &etay) { */
|
double &etax, double &etay) {
|
||||||
/* return 0; */
|
return 0;
|
||||||
/* }; */
|
};
|
||||||
|
|
||||||
virtual int addToFlatField(double totquad, int quad, int *cl, double &etax,
|
virtual int addToFlatField(double totquad, int quad, int *cl, double &etax,
|
||||||
double &etay) {
|
double &etay) {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#ifndef MY_TIFF_IO_H
|
#ifndef MY_TIFF_IO_H
|
||||||
#include "sls/tiffIO.h"
|
#include "tiffIO.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DEF_QUAD
|
#ifndef DEF_QUAD
|
||||||
@ -175,31 +175,29 @@ class slsInterpolation {
|
|||||||
return hint;
|
return hint;
|
||||||
};
|
};
|
||||||
|
|
||||||
//virtual int addToFlatField(double *cluster, double &etax, double &etay) = 0;
|
virtual int addToFlatField(double *cluster, double &etax, double &etay) = 0;
|
||||||
//virtual int addToFlatField(int *cluster, double &etax, double &etay) = 0;
|
virtual int addToFlatField(int *cluster, double &etax, double &etay) = 0;
|
||||||
virtual int addToFlatField(double totquad, int quad, int *cl, double &etax,
|
virtual int addToFlatField(double totquad, int quad, int *cl, double &etax,
|
||||||
double &etay) = 0;
|
double &etay) = 0;
|
||||||
//virtual int addToFlatField(double totquad, int quad, double *cluster,
|
virtual int addToFlatField(double totquad, int quad, double *cluster,
|
||||||
// double &etax, double &etay) = 0;
|
double &etax, double &etay) = 0;
|
||||||
virtual int addToFlatFieldDistribution(double etax, double etay) = 0;
|
virtual int addToFlatField(double etax, double etay) = 0;
|
||||||
|
|
||||||
virtual int *getFlatFieldDistribution() { return NULL; };
|
virtual int *getFlatField() { return NULL; };
|
||||||
virtual int *setFlatField(int *h, int nbx = -1, int nby = -1,
|
virtual int *setFlatField(int *h, int nb = -1, double emin = -1,
|
||||||
double emin = -1,
|
|
||||||
double emax = -1) {
|
double emax = -1) {
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
virtual void *writeFlatField(const char *imgname) { return NULL; };
|
virtual void *writeFlatField(const char *imgname) { return NULL; };
|
||||||
virtual void *readFlatField(const char *imgname,
|
virtual void *readFlatField(const char *imgname, int nb = -1,
|
||||||
double emin = 1, double emax = 0) {
|
double emin = 1, double emax = 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
virtual int *getFlatField(int &nbx, int &nby, double &emin, double &emax) {
|
virtual int *getFlatField(int &nb, double &emin, double &emax) {
|
||||||
nbx = 0;
|
nb = 0;
|
||||||
nby=0;
|
|
||||||
emin = 0;
|
emin = 0;
|
||||||
emax = 0;
|
emax = 0;
|
||||||
return getFlatFieldDistribution();
|
return getFlatField();
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual void resetFlatField() = 0;
|
virtual void resetFlatField() = 0;
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "moench03CommonMode.h"
|
#include "moench03CommonMode.h"
|
||||||
#include "moench03GhostSummation.h"
|
#include "moench03GhostSummation.h"
|
||||||
#include "sls/tiffIO.h"
|
#include "tiffIO.h"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -20,7 +20,7 @@ class commonModeSubtractionColumn : public commonModeSubtraction {
|
|||||||
mean2[iroi] += val * val;
|
mean2[iroi] += val * val;
|
||||||
nCm[iroi]++;
|
nCm[iroi]++;
|
||||||
if (nCm[iroi] > rows)
|
if (nCm[iroi] > rows)
|
||||||
std::cout << "Too many pixels added " << nCm[iroi] << std::endl;
|
cout << "Too many pixels added " << nCm[iroi] << endl;
|
||||||
/* if (ix==10 && iy<20) */
|
/* if (ix==10 && iy<20) */
|
||||||
/* cout << " ** "<<val << " " << mean[iroi] << " " <<
|
/* cout << " ** "<<val << " " << mean[iroi] << " " <<
|
||||||
* nCm[iroi] << " " << getCommonMode(ix, iy) << endl; */
|
* nCm[iroi] << " " << getCommonMode(ix, iy) << endl; */
|
||||||
|
@ -1,52 +1,57 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
|
|
||||||
|
find_package(TIFF REQUIRED)
|
||||||
|
|
||||||
set(MOENCH_EXECUTABLES)
|
set(MOENCH_EXECUTABLES)
|
||||||
|
|
||||||
#Moench ZMQ
|
#Moench ZMQ
|
||||||
add_executable(moench03ZmqProcess moenchZmqProcess.cpp)
|
add_executable(moenchZmqProcess moenchZmqProcess.cpp ../tiffIO.cpp)
|
||||||
target_compile_definitions(moench03ZmqProcess PRIVATE NEWZMQ INTERP)
|
target_compile_definitions(moenchZmqProcess PRIVATE NEWZMQ INTERP)
|
||||||
list(APPEND MOENCH_EXECUTABLES moench03ZmqProcess)
|
list(APPEND MOENCH_EXECUTABLES moenchZmqProcess)
|
||||||
|
|
||||||
#Moench HighZ ZMQ
|
|
||||||
add_executable(moenchHighZZmqProcess moenchZmqProcess.cpp)
|
|
||||||
target_compile_definitions(moenchHighZZmqProcess PRIVATE NEWZMQ INTERP HIGHZ)
|
|
||||||
list(APPEND MOENCH_EXECUTABLES moenchHighZZmqProcess)
|
|
||||||
|
|
||||||
#Moench04 ZMQ
|
#Moench04 ZMQ
|
||||||
add_executable(moench04ZmqProcess moenchZmqProcess.cpp)
|
add_executable(moench04ZmqProcess moenchZmqProcess.cpp ../tiffIO.cpp)
|
||||||
target_compile_definitions(moench04ZmqProcess PRIVATE NEWZMQ INTERP MOENCH04)
|
target_compile_definitions(moench04ZmqProcess PRIVATE NEWZMQ INTERP MOENCH04)
|
||||||
list(APPEND MOENCH_EXECUTABLES moench04ZmqProcess)
|
list(APPEND MOENCH_EXECUTABLES moench04ZmqProcess)
|
||||||
|
|
||||||
|
|
||||||
#OFFLINE Processing?
|
#OFFLINE Processing?
|
||||||
add_executable(moench03RawDataProcess moenchRawDataProcess.cpp)
|
add_executable(moenchClusterFinder moench03ClusterFinder.cpp ../tiffIO.cpp)
|
||||||
target_compile_definitions(moench03RawDataProcess PRIVATE)
|
target_compile_definitions(moenchClusterFinder PRIVATE SAVE_ALL NEWRECEIVER)
|
||||||
list(APPEND MOENCH_EXECUTABLES moench03RawDataProcess)
|
list(APPEND MOENCH_EXECUTABLES moenchClusterFinder)
|
||||||
|
|
||||||
add_executable(moenchHighZRawDataProcess moenchRawDataProcess.cpp)
|
add_executable(moenchClusterFinderHighZ moench03ClusterFinder.cpp ../tiffIO.cpp)
|
||||||
target_compile_definitions(moenchHighZRawDataProcess PRIVATE HIGHZ)
|
target_compile_definitions(moenchClusterFinderHighZ PRIVATE SAVE_ALL NEWRECEIVER HIGHZ)
|
||||||
list(APPEND MOENCH_EXECUTABLES moenchHighZRawDataProcess)
|
list(APPEND MOENCH_EXECUTABLES moenchClusterFinderHighZ)
|
||||||
|
|
||||||
add_executable(moench04RawDataProcess moenchRawDataProcess.cpp)
|
add_executable(moenchMakeEta moench03Interpolation.cpp ../tiffIO.cpp)
|
||||||
target_compile_definitions(moench04RawDataProcess PRIVATE MOENCH04)
|
target_compile_definitions(moenchMakeEta PRIVATE FF)
|
||||||
list(APPEND MOENCH_EXECUTABLES moench04RawDataProcess)
|
list(APPEND MOENCH_EXECUTABLES moenchMakeEta)
|
||||||
|
|
||||||
#interpolation stuff
|
add_executable(moenchInterpolation moench03Interpolation.cpp ../tiffIO.cpp)
|
||||||
|
|
||||||
add_executable(moench03MakeEta moench03Interpolation.cpp)
|
|
||||||
target_compile_definitions(moench03MakeEta PRIVATE FF)
|
|
||||||
list(APPEND MOENCH_EXECUTABLES moench03MakeEta)
|
|
||||||
|
|
||||||
add_executable(moench03Interpolation moench03Interpolation.cpp)
|
|
||||||
#no compile defs
|
#no compile defs
|
||||||
list(APPEND MOENCH_EXECUTABLES moench03Interpolation)
|
list(APPEND MOENCH_EXECUTABLES moenchInterpolation)
|
||||||
|
|
||||||
add_executable(moench03NoInterpolation moench03NoInterpolation.cpp)
|
add_executable(moenchNoInterpolation moench03NoInterpolation.cpp ../tiffIO.cpp)
|
||||||
#no compile defs
|
#no compile defs
|
||||||
list(APPEND MOENCH_EXECUTABLES moench03NoInterpolation)
|
list(APPEND MOENCH_EXECUTABLES moenchNoInterpolation)
|
||||||
|
|
||||||
|
add_executable(moenchPhotonCounter moenchPhotonCounter.cpp ../tiffIO.cpp)
|
||||||
|
target_compile_definitions(moenchPhotonCounter PRIVATE NEWRECEIVER)
|
||||||
|
list(APPEND MOENCH_EXECUTABLES moenchPhotonCounter)
|
||||||
|
|
||||||
|
add_executable(moenchAnalog moenchPhotonCounter.cpp ../tiffIO.cpp)
|
||||||
|
target_compile_definitions(moenchAnalog PRIVATE NEWRECEIVER ANALOG)
|
||||||
|
list(APPEND MOENCH_EXECUTABLES moenchAnalog)
|
||||||
|
|
||||||
|
add_executable(moenchPhotonCounterHighZ moenchPhotonCounter.cpp ../tiffIO.cpp)
|
||||||
|
target_compile_definitions(moenchPhotonCounterHighZ PRIVATE NEWRECEIVER HIGHZ)
|
||||||
|
list(APPEND MOENCH_EXECUTABLES moenchPhotonCounterHighZ)
|
||||||
|
|
||||||
|
add_executable(moenchAnalogHighZ moenchPhotonCounter.cpp ../tiffIO.cpp)
|
||||||
|
target_compile_definitions(moenchAnalogHighZ PRIVATE NEWRECEIVER ANALOG HIGHZ)
|
||||||
|
list(APPEND MOENCH_EXECUTABLES moenchAnalogHighZ)
|
||||||
|
|
||||||
|
|
||||||
foreach(exe ${MOENCH_EXECUTABLES})
|
foreach(exe ${MOENCH_EXECUTABLES})
|
||||||
@ -56,7 +61,6 @@ foreach(exe ${MOENCH_EXECUTABLES})
|
|||||||
../dataStructures
|
../dataStructures
|
||||||
../interpolations
|
../interpolations
|
||||||
../../slsReceiverSoftware/include/
|
../../slsReceiverSoftware/include/
|
||||||
../../slsSupportLib/include/
|
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(${exe}
|
target_link_libraries(${exe}
|
||||||
@ -64,11 +68,10 @@ foreach(exe ${MOENCH_EXECUTABLES})
|
|||||||
slsSupportStatic
|
slsSupportStatic
|
||||||
${ZeroMQ_LIBRARIES}
|
${ZeroMQ_LIBRARIES}
|
||||||
pthread
|
pthread
|
||||||
tiffio
|
TIFF::TIFF
|
||||||
|
|
||||||
PRIVATE
|
PRIVATE
|
||||||
slsProjectWarnings
|
slsProjectWarnings
|
||||||
slsProjectOptions
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -80,6 +83,8 @@ foreach(exe ${MOENCH_EXECUTABLES})
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
endforeach(exe ${MOENCH_EXECUTABLES})
|
endforeach(exe ${MOENCH_EXECUTABLES})
|
||||||
|
|
||||||
install(TARGETS ${MOENCH_EXECUTABLES} DESTINATION bin)
|
install(TARGETS ${MOENCH_EXECUTABLES} DESTINATION bin)
|
@ -0,0 +1,219 @@
|
|||||||
|
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
|
//#include "sls/ansi.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
//#include "moench03T1ZmqData.h"
|
||||||
|
#ifdef NEWRECEIVER
|
||||||
|
#ifndef RECT
|
||||||
|
#include "moench03T1ReceiverDataNew.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef RECT
|
||||||
|
#include "moench03T1ReceiverDataNewRect.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CSAXS_FP
|
||||||
|
#include "moench03T1ReceiverData.h"
|
||||||
|
#endif
|
||||||
|
#ifdef OLDDATA
|
||||||
|
#include "moench03Ctb10GbT1Data.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef REORDERED
|
||||||
|
#include "moench03T1ReorderedData.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// #include "interpolatingDetector.h"
|
||||||
|
//#include "etaInterpolationPosXY.h"
|
||||||
|
// #include "linearInterpolation.h"
|
||||||
|
// #include "noInterpolation.h"
|
||||||
|
#include "multiThreadedAnalogDetector.h"
|
||||||
|
#include "singlePhotonDetector.h"
|
||||||
|
//#include "interpolatingDetector.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <map>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <ctime>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
if (argc < 6) {
|
||||||
|
cout << "Usage is " << argv[0] << "indir outdir fname runmin runmax "
|
||||||
|
<< endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
int p = 10000;
|
||||||
|
int fifosize = 1000;
|
||||||
|
int nthreads = 1;
|
||||||
|
int nsubpix = 25;
|
||||||
|
int etabins = nsubpix * 10;
|
||||||
|
double etamin = -1, etamax = 2;
|
||||||
|
int csize = 3;
|
||||||
|
int nx = 400, ny = 400;
|
||||||
|
int save = 1;
|
||||||
|
int nsigma = 5;
|
||||||
|
int nped = 1000;
|
||||||
|
int ndark = 100;
|
||||||
|
int ok;
|
||||||
|
int iprog = 0;
|
||||||
|
|
||||||
|
#ifdef NEWRECEIVER
|
||||||
|
#ifdef RECT
|
||||||
|
cout << "Should be rectangular!" << endl;
|
||||||
|
#endif
|
||||||
|
moench03T1ReceiverDataNew *decoder = new moench03T1ReceiverDataNew();
|
||||||
|
cout << "RECEIVER DATA WITH ONE HEADER!" << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CSAXS_FP
|
||||||
|
moench03T1ReceiverData *decoder = new moench03T1ReceiverData();
|
||||||
|
cout << "RECEIVER DATA WITH ALL HEADERS!" << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef OLDDATA
|
||||||
|
moench03Ctb10GbT1Data *decoder = new moench03Ctb10GbT1Data();
|
||||||
|
cout << "OLD RECEIVER DATA!" << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef REORDERED
|
||||||
|
moench03T1ReorderedData *decoder = new moench03T1ReorderedData();
|
||||||
|
cout << "REORDERED DATA!" << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
decoder->getDetectorSize(nx, ny);
|
||||||
|
cout << "nx " << nx << " ny " << ny << endl;
|
||||||
|
|
||||||
|
// moench03T1ZmqData *decoder=new moench03T1ZmqData();
|
||||||
|
singlePhotonDetector *filter =
|
||||||
|
new singlePhotonDetector(decoder, csize, nsigma, 1, 0, nped, 200);
|
||||||
|
// char tit[10000];
|
||||||
|
cout << "filter " << endl;
|
||||||
|
|
||||||
|
// filter->readPedestals("/scratch/ped_100.tiff");
|
||||||
|
// interp->readFlatField("/scratch/eta_100.tiff",etamin,etamax);
|
||||||
|
// cout << "filter "<< endl;
|
||||||
|
|
||||||
|
int size = 327680; ////atoi(argv[3]);
|
||||||
|
|
||||||
|
int *image;
|
||||||
|
// int* image =new int[327680/sizeof(int)];
|
||||||
|
filter->newDataSet();
|
||||||
|
|
||||||
|
int ff, np;
|
||||||
|
int dsize = decoder->getDataSize();
|
||||||
|
cout << " data size is " << dsize;
|
||||||
|
|
||||||
|
char data[dsize];
|
||||||
|
|
||||||
|
ifstream filebin;
|
||||||
|
char *indir = argv[1];
|
||||||
|
char *outdir = argv[2];
|
||||||
|
char *fformat = argv[3];
|
||||||
|
int runmin = atoi(argv[4]);
|
||||||
|
int runmax = atoi(argv[5]);
|
||||||
|
|
||||||
|
char fname[10000];
|
||||||
|
char outfname[10000];
|
||||||
|
char imgfname[10000];
|
||||||
|
char pedfname[10000];
|
||||||
|
// strcpy(pedfname,argv[6]);
|
||||||
|
char fn[10000];
|
||||||
|
|
||||||
|
std::time_t end_time;
|
||||||
|
|
||||||
|
FILE *of = NULL;
|
||||||
|
cout << "input directory is " << indir << endl;
|
||||||
|
cout << "output directory is " << outdir << endl;
|
||||||
|
cout << "fileformat is " << fformat << endl;
|
||||||
|
|
||||||
|
std::time(&end_time);
|
||||||
|
cout << std::ctime(&end_time) << endl;
|
||||||
|
|
||||||
|
char *buff;
|
||||||
|
multiThreadedAnalogDetector *mt =
|
||||||
|
new multiThreadedAnalogDetector(filter, nthreads, fifosize);
|
||||||
|
|
||||||
|
mt->setDetectorMode(ePhotonCounting);
|
||||||
|
mt->setFrameMode(eFrame);
|
||||||
|
mt->StartThreads();
|
||||||
|
mt->popFree(buff);
|
||||||
|
|
||||||
|
cout << "mt " << endl;
|
||||||
|
|
||||||
|
int ifr = 0;
|
||||||
|
|
||||||
|
for (int irun = runmin; irun < runmax; irun++) {
|
||||||
|
sprintf(fn, fformat, irun);
|
||||||
|
sprintf(fname, "%s/%s.raw", indir, fn);
|
||||||
|
sprintf(outfname, "%s/%s.clust", outdir, fn);
|
||||||
|
sprintf(imgfname, "%s/%s.tiff", outdir, fn);
|
||||||
|
std::time(&end_time);
|
||||||
|
cout << std::ctime(&end_time) << endl;
|
||||||
|
cout << fname << " " << outfname << " " << imgfname << endl;
|
||||||
|
filebin.open((const char *)(fname), ios::in | ios::binary);
|
||||||
|
// //open file
|
||||||
|
if (filebin.is_open()) {
|
||||||
|
of = fopen(outfname, "w");
|
||||||
|
if (of) {
|
||||||
|
mt->setFilePointer(of);
|
||||||
|
// cout << "file pointer set " << endl;
|
||||||
|
} else {
|
||||||
|
cout << "Could not open " << outfname << " for writing "
|
||||||
|
<< endl;
|
||||||
|
mt->setFilePointer(NULL);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
// //while read frame
|
||||||
|
ff = -1;
|
||||||
|
while (decoder->readNextFrame(filebin, ff, np, buff)) {
|
||||||
|
// cout << "*"<<ifr++<<"*"<<ff<< endl;
|
||||||
|
// cout << ff << " " << np << endl;
|
||||||
|
// //push
|
||||||
|
// for (int ix=0; ix<400; ix++)
|
||||||
|
// for (int iy=0; iy<400; iy++) {
|
||||||
|
// if (decoder->getChannel(buff, ix, iy)<3000 ||
|
||||||
|
// decoder->getChannel(buff, ix, iy)>8000) {
|
||||||
|
// cout << ifr << " " << ff << " " << ix << " " << iy <<
|
||||||
|
// " " << decoder->getChannel(buff, ix, iy) << endl ;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
mt->pushData(buff);
|
||||||
|
// // //pop
|
||||||
|
mt->nextThread();
|
||||||
|
// // // cout << " " << (void*)buff;
|
||||||
|
mt->popFree(buff);
|
||||||
|
ifr++;
|
||||||
|
if (ifr % 10000 == 0)
|
||||||
|
cout << ifr << " " << ff << endl;
|
||||||
|
ff = -1;
|
||||||
|
}
|
||||||
|
cout << "--" << endl;
|
||||||
|
filebin.close();
|
||||||
|
// //close file
|
||||||
|
// //join threads
|
||||||
|
while (mt->isBusy()) {
|
||||||
|
;
|
||||||
|
} // wait until all data are processed from the queues
|
||||||
|
if (of)
|
||||||
|
fclose(of);
|
||||||
|
|
||||||
|
mt->writeImage(imgfname);
|
||||||
|
mt->clearImage();
|
||||||
|
|
||||||
|
std::time(&end_time);
|
||||||
|
cout << std::ctime(&end_time) << endl;
|
||||||
|
|
||||||
|
} else
|
||||||
|
cout << "Could not open " << fname << " for reading " << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -47,6 +47,7 @@ int main(int argc, char *argv[]) {
|
|||||||
#endif
|
#endif
|
||||||
int iarg = 4;
|
int iarg = 4;
|
||||||
char infname[10000];
|
char infname[10000];
|
||||||
|
char fname[10000];
|
||||||
char outfname[10000];
|
char outfname[10000];
|
||||||
#ifndef FF
|
#ifndef FF
|
||||||
iarg = 4;
|
iarg = 4;
|
||||||
@ -73,17 +74,18 @@ int main(int argc, char *argv[]) {
|
|||||||
int etabins = 1000; // nsubpix*2*100;
|
int etabins = 1000; // nsubpix*2*100;
|
||||||
double etamin = -1, etamax = 2;
|
double etamin = -1, etamax = 2;
|
||||||
// double etamin=-0.1, etamax=1.1;
|
// double etamin=-0.1, etamax=1.1;
|
||||||
// double eta3min = -2, eta3max = 2;
|
double eta3min = -2, eta3max = 2;
|
||||||
|
int quad;
|
||||||
double sum, totquad;
|
double sum, totquad;
|
||||||
double sDum[2][2];
|
double sDum[2][2];
|
||||||
double etax, etay;
|
double etax, etay, int_x, int_y;
|
||||||
// double eta3x, eta3y, int3_x, int3_y, noint_x, noint_y;
|
double eta3x, eta3y, int3_x, int3_y, noint_x, noint_y;
|
||||||
|
int ok;
|
||||||
|
int f0 = -1;
|
||||||
int ix, iy, isx, isy;
|
int ix, iy, isx, isy;
|
||||||
int nframes = 0, lastframe = -1;
|
int nframes = 0, lastframe = -1;
|
||||||
//double d_x, d_y, res = 5, xx, yy;
|
double d_x, d_y, res = 5, xx, yy;
|
||||||
int nph = 0, totph = 0;
|
int nph = 0, badph = 0, totph = 0;
|
||||||
//badph = 0,
|
|
||||||
FILE *f = NULL;
|
FILE *f = NULL;
|
||||||
|
|
||||||
#ifdef DOUBLE_SPH
|
#ifdef DOUBLE_SPH
|
||||||
@ -94,8 +96,7 @@ int main(int argc, char *argv[]) {
|
|||||||
single_photon_hit cl(3, 3);
|
single_photon_hit cl(3, 3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//int f0 = -1;
|
int nSubPixels = nsubpix;
|
||||||
// int nSubPixels = nsubpix;
|
|
||||||
#ifndef NOINTERPOLATION
|
#ifndef NOINTERPOLATION
|
||||||
eta2InterpolationPosXY *interp =
|
eta2InterpolationPosXY *interp =
|
||||||
new eta2InterpolationPosXY(NC, NR, nsubpix, etabins, etamin, etamax);
|
new eta2InterpolationPosXY(NC, NR, nsubpix, etabins, etamin, etamax);
|
||||||
@ -108,12 +109,7 @@ int main(int argc, char *argv[]) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FF
|
#ifndef FF
|
||||||
int quad;
|
|
||||||
#ifndef NOINTERPOLATION
|
#ifndef NOINTERPOLATION
|
||||||
char fname[10000];
|
|
||||||
int ok;
|
|
||||||
double int_x, int_y;
|
|
||||||
int *img;
|
|
||||||
cout << "read ff " << argv[2] << endl;
|
cout << "read ff " << argv[2] << endl;
|
||||||
sprintf(fname, "%s", argv[2]);
|
sprintf(fname, "%s", argv[2]);
|
||||||
interp->readFlatField(fname);
|
interp->readFlatField(fname);
|
||||||
@ -125,6 +121,7 @@ int main(int argc, char *argv[]) {
|
|||||||
cout << "Will write eta file " << argv[2] << endl;
|
cout << "Will write eta file " << argv[2] << endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int *img;
|
||||||
float *totimg = new float[NC * NR * nsubpix * nsubpix];
|
float *totimg = new float[NC * NR * nsubpix * nsubpix];
|
||||||
for (ix = 0; ix < NC; ix++) {
|
for (ix = 0; ix < NC; ix++) {
|
||||||
for (iy = 0; iy < NR; iy++) {
|
for (iy = 0; iy < NR; iy++) {
|
||||||
@ -152,7 +149,7 @@ int main(int argc, char *argv[]) {
|
|||||||
if (f) {
|
if (f) {
|
||||||
cout << infname << endl;
|
cout << infname << endl;
|
||||||
nframes = 0;
|
nframes = 0;
|
||||||
//f0 = -1;
|
f0 = -1;
|
||||||
|
|
||||||
while (cl.read(f)) {
|
while (cl.read(f)) {
|
||||||
totph++;
|
totph++;
|
||||||
@ -160,21 +157,14 @@ int main(int argc, char *argv[]) {
|
|||||||
lastframe = cl.iframe;
|
lastframe = cl.iframe;
|
||||||
// cout << cl.iframe << endl;
|
// cout << cl.iframe << endl;
|
||||||
// f0=cl.iframe;
|
// f0=cl.iframe;
|
||||||
// if (nframes == 0)
|
if (nframes == 0)
|
||||||
// f0 = lastframe;
|
f0 = lastframe;
|
||||||
nframes++;
|
nframes++;
|
||||||
}
|
}
|
||||||
// quad=interp->calcQuad(cl.get_cluster(), sum, totquad, sDum);
|
// quad=interp->calcQuad(cl.get_cluster(), sum, totquad, sDum);
|
||||||
#ifndef FF
|
|
||||||
quad = interp->calcEta(cl.get_cluster(), etax, etay, sum,
|
quad = interp->calcEta(cl.get_cluster(), etax, etay, sum,
|
||||||
totquad, sDum);
|
totquad, sDum);
|
||||||
#endif
|
if (sum > cmin && totquad / sum > 0.8 && totquad / sum < 1.2 &&
|
||||||
#ifdef FF
|
|
||||||
interp->calcEta(cl.get_cluster(), etax, etay, sum,
|
|
||||||
totquad, sDum);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (sum > cmin && totquad / sum > 0.8 && totquad / sum < 1.2 &&
|
|
||||||
sum < cmax) {
|
sum < cmax) {
|
||||||
nph++;
|
nph++;
|
||||||
// if (sum>200 && sum<580) {
|
// if (sum>200 && sum<580) {
|
||||||
@ -209,7 +199,7 @@ int main(int argc, char *argv[]) {
|
|||||||
// if (cl.x>50)
|
// if (cl.x>50)
|
||||||
// #endif
|
// #endif
|
||||||
// if (etax!=0 && etay!=0 && etax!=1 && etay!=1)
|
// if (etax!=0 && etay!=0 && etax!=1 && etay!=1)
|
||||||
interp->addToFlatFieldDistribution(etax, etay);
|
interp->addToFlatField(etax, etay);
|
||||||
// if (etax==0 || etay==0) cout << cl.x << " " << cl.y <<
|
// if (etax==0 || etay==0) cout << cl.x << " " << cl.y <<
|
||||||
// endl;
|
// endl;
|
||||||
|
|
||||||
@ -252,9 +242,9 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// cout << "Read " << nframes << " frames (first frame: " << f0
|
cout << "Read " << nframes << " frames (first frame: " << f0
|
||||||
// << " last frame: " << lastframe << " delta:" << lastframe - f0
|
<< " last frame: " << lastframe << " delta:" << lastframe - f0
|
||||||
// << ") nph=" << nph << endl;
|
<< ") nph=" << nph << endl;
|
||||||
interp->clearInterpolatedImage();
|
interp->clearInterpolatedImage();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2,33 +2,43 @@
|
|||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
//#include "sls/ansi.h"
|
//#include "sls/ansi.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#undef CORR
|
#define CORR
|
||||||
|
|
||||||
#define C_GHOST 0.0004
|
#define C_GHOST 0.0004
|
||||||
|
|
||||||
#define CM_ROWS 50
|
#define CM_ROWS 50
|
||||||
|
|
||||||
#define RAWDATA
|
//#define VERSION_V1
|
||||||
|
|
||||||
#ifndef MOENCH04
|
//#include "moench03T1ZmqData.h"
|
||||||
|
#ifdef NEWRECEIVER
|
||||||
#ifndef RECT
|
#ifndef RECT
|
||||||
#include "moench03T1ReceiverDataNew.h"
|
#include "moench03T1ReceiverDataNew.h"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef RECT
|
#ifdef RECT
|
||||||
#include "moench03T1ReceiverDataNewRect.h"
|
#include "moench03T1ReceiverDataNewRect.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef MOENCH04
|
|
||||||
#include "moench04CtbZmq10GbData.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CSAXS_FP
|
||||||
|
#include "moench03T1ReceiverData.h"
|
||||||
|
#endif
|
||||||
|
#ifdef OLDDATA
|
||||||
|
#include "moench03Ctb10GbT1Data.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// #include "interpolatingDetector.h"
|
||||||
|
//#include "etaInterpolationPosXY.h"
|
||||||
|
// #include "linearInterpolation.h"
|
||||||
|
// #include "noInterpolation.h"
|
||||||
#include "multiThreadedCountingDetector.h"
|
#include "multiThreadedCountingDetector.h"
|
||||||
|
//#include "multiThreadedAnalogDetector.h"
|
||||||
#include "moench03CommonMode.h"
|
#include "moench03CommonMode.h"
|
||||||
#include "moench03GhostSummation.h"
|
#include "moench03GhostSummation.h"
|
||||||
#include "singlePhotonDetector.h"
|
#include "singlePhotonDetector.h"
|
||||||
|
//#include "interpolatingDetector.h"
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <map>
|
#include <map>
|
||||||
@ -42,7 +52,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
if (argc < 4) {
|
if (argc < 4) {
|
||||||
cout << "Usage is " << argv[0]
|
cout << "Usage is " << argv[0]
|
||||||
<< "indir outdir fname(no extension) [runmin] [runmax] [pedfile (raw or tiff)] [threshold] "
|
<< "indir outdir fname [runmin] [runmax] [pedfile] [threshold] "
|
||||||
"[nframes] [xmin xmax ymin ymax] [gainmap]"
|
"[nframes] [xmin xmax ymin ymax] [gainmap]"
|
||||||
<< endl;
|
<< endl;
|
||||||
cout << "threshold <0 means analog; threshold=0 means cluster finder; "
|
cout << "threshold <0 means analog; threshold=0 means cluster finder; "
|
||||||
@ -54,39 +64,55 @@ int main(int argc, char *argv[]) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int p = 10000;
|
||||||
int fifosize = 1000;
|
int fifosize = 1000;
|
||||||
int nthreads = 10;
|
int nthreads = 10;
|
||||||
|
int nsubpix = 25;
|
||||||
|
int etabins = nsubpix * 10;
|
||||||
|
double etamin = -1, etamax = 2;
|
||||||
int csize = 3;
|
int csize = 3;
|
||||||
|
int save = 1;
|
||||||
int nsigma = 5;
|
int nsigma = 5;
|
||||||
int nped = 10000;
|
int nped = 10000;
|
||||||
|
int ndark = 100;
|
||||||
|
int ok;
|
||||||
|
int iprog = 0;
|
||||||
|
|
||||||
int cf = 0;
|
int cf = 0;
|
||||||
|
|
||||||
|
#ifdef NEWRECEIVER
|
||||||
#ifdef RECT
|
#ifdef RECT
|
||||||
cout << "Should be rectangular but now it will crash! No data structure defined!" << endl;
|
cout << "Should be rectangular!" << endl;
|
||||||
#endif
|
#endif
|
||||||
#ifndef MOENCH04
|
|
||||||
moench03T1ReceiverDataNew *decoder = new moench03T1ReceiverDataNew();
|
moench03T1ReceiverDataNew *decoder = new moench03T1ReceiverDataNew();
|
||||||
cout << "MOENCH03!" << endl;
|
cout << "RECEIVER DATA WITH ONE HEADER!" << endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOENCH04
|
#ifdef CSAXS_FP
|
||||||
moench04CtbZmq10GbData *decoder = new moench04CtbZmq10GbData();
|
moench03T1ReceiverData *decoder = new moench03T1ReceiverData();
|
||||||
cout << "MOENCH04!" << endl;
|
cout << "RECEIVER DATA WITH ALL HEADERS!" << endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef OLDDATA
|
||||||
|
moench03Ctb10GbT1Data *decoder = new moench03Ctb10GbT1Data();
|
||||||
|
cout << "OLD RECEIVER DATA!" << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
int nx = 400, ny = 400;
|
int nx = 400, ny = 400;
|
||||||
|
|
||||||
decoder->getDetectorSize(nx, ny);
|
decoder->getDetectorSize(nx, ny);
|
||||||
#ifdef CORR
|
|
||||||
int ncol_cm = CM_ROWS;
|
int ncol_cm = CM_ROWS;
|
||||||
double xt_ghost = C_GHOST;
|
double xt_ghost = C_GHOST;
|
||||||
#endif
|
|
||||||
moench03CommonMode *cm = NULL;
|
moench03CommonMode *cm = NULL;
|
||||||
moench03GhostSummation *gs;
|
moench03GhostSummation *gs;
|
||||||
double *gainmap = NULL;
|
double *gainmap = NULL;
|
||||||
//float *gm;
|
float *gm;
|
||||||
|
|
||||||
|
int size = 327680; ////atoi(argv[3]);
|
||||||
|
|
||||||
|
int *image;
|
||||||
|
// int* image =new int[327680/sizeof(int)];
|
||||||
|
|
||||||
int ff, np;
|
int ff, np;
|
||||||
// cout << " data size is " << dsize;
|
// cout << " data size is " << dsize;
|
||||||
@ -143,6 +169,7 @@ int main(int argc, char *argv[]) {
|
|||||||
char fname[10000];
|
char fname[10000];
|
||||||
char imgfname[10000];
|
char imgfname[10000];
|
||||||
char cfname[10000];
|
char cfname[10000];
|
||||||
|
char fn[10000];
|
||||||
|
|
||||||
std::time_t end_time;
|
std::time_t end_time;
|
||||||
|
|
||||||
@ -159,6 +186,19 @@ int main(int argc, char *argv[]) {
|
|||||||
cout << "Nframes is " << nframes << endl;
|
cout << "Nframes is " << nframes << endl;
|
||||||
|
|
||||||
uint32_t nnx, nny;
|
uint32_t nnx, nny;
|
||||||
|
double *gmap;
|
||||||
|
|
||||||
|
// if (gainfname) {
|
||||||
|
// gm=ReadFromTiff(gainfname, nny, nnx);
|
||||||
|
// if (gm && nnx==nx && nny==ny) {
|
||||||
|
// gmap=new double[nx*ny];
|
||||||
|
// for (int i=0; i<nx*ny; i++) {
|
||||||
|
// gmap[i]=gm[i];
|
||||||
|
// }
|
||||||
|
// delete gm;
|
||||||
|
// } else
|
||||||
|
// cout << "Could not open gain map " << gainfname << endl;
|
||||||
|
// }
|
||||||
|
|
||||||
#ifdef CORR
|
#ifdef CORR
|
||||||
cout << "Applying common mode " << ncol_cm << endl;
|
cout << "Applying common mode " << ncol_cm << endl;
|
||||||
@ -180,15 +220,21 @@ int main(int argc, char *argv[]) {
|
|||||||
} else
|
} else
|
||||||
thr = 0.15 * thr;
|
thr = 0.15 * thr;
|
||||||
filter->newDataSet();
|
filter->newDataSet();
|
||||||
//int dsize = decoder->getDataSize();
|
int dsize = decoder->getDataSize();
|
||||||
|
|
||||||
|
char data[dsize];
|
||||||
|
|
||||||
|
//#ifndef ANALOG
|
||||||
if (thr > 0) {
|
if (thr > 0) {
|
||||||
cout << "threshold is " << thr << endl;
|
cout << "threshold is " << thr << endl;
|
||||||
|
//#ifndef ANALOG
|
||||||
filter->setThreshold(thr);
|
filter->setThreshold(thr);
|
||||||
|
//#endif
|
||||||
cf = 0;
|
cf = 0;
|
||||||
|
|
||||||
} else
|
} else
|
||||||
cf = 1;
|
cf = 1;
|
||||||
|
//#endif
|
||||||
|
|
||||||
filter->setROI(xmin, xmax, ymin, ymax);
|
filter->setROI(xmin, xmax, ymin, ymax);
|
||||||
std::time(&end_time);
|
std::time(&end_time);
|
||||||
@ -223,7 +269,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
int ifr = 0;
|
int ifr = 0;
|
||||||
|
|
||||||
double *ped=new double[nx * ny];//, *ped1;
|
double ped[nx * ny], *ped1;
|
||||||
|
|
||||||
if (pedfile) {
|
if (pedfile) {
|
||||||
|
|
||||||
@ -231,10 +277,10 @@ int main(int argc, char *argv[]) {
|
|||||||
sprintf(imgfname, "%s/pedestals.tiff", outdir);
|
sprintf(imgfname, "%s/pedestals.tiff", outdir);
|
||||||
|
|
||||||
if (string(pedfile).find(".tif") == std::string::npos) {
|
if (string(pedfile).find(".tif") == std::string::npos) {
|
||||||
sprintf(fname, "%s", pedfile);
|
sprintf(fname, "%s.raw", pedfile);
|
||||||
cout << fname << endl;
|
cout << fname << endl;
|
||||||
std::time(&end_time);
|
std::time(&end_time);
|
||||||
//cout << "aaa" << std::ctime(&end_time) << endl;
|
cout << "aaa" << std::ctime(&end_time) << endl;
|
||||||
|
|
||||||
mt->setFrameMode(ePedestal);
|
mt->setFrameMode(ePedestal);
|
||||||
// sprintf(fn,fformat,irun);
|
// sprintf(fn,fformat,irun);
|
||||||
@ -264,12 +310,18 @@ int main(int argc, char *argv[]) {
|
|||||||
<< " for reading " << endl;
|
<< " for reading " << endl;
|
||||||
} else {
|
} else {
|
||||||
float *pp = ReadFromTiff(pedfile, nny, nnx);
|
float *pp = ReadFromTiff(pedfile, nny, nnx);
|
||||||
if (pp && (int)nnx == nx && (int)nny == ny) {
|
if (pp && nnx == nx && nny == ny) {
|
||||||
for (int i = 0; i < nx * ny; i++) {
|
for (int i = 0; i < nx * ny; i++) {
|
||||||
ped[i] = pp[i];
|
ped[i] = pp[i];
|
||||||
}
|
}
|
||||||
delete[] pp;
|
delete[] pp;
|
||||||
mt->setPedestal(ped);
|
mt->setPedestal(ped);
|
||||||
|
// ped1=mt->getPedestal();
|
||||||
|
|
||||||
|
// for (int i=0; i<nx*ny; i++) {
|
||||||
|
|
||||||
|
// cout << ped[i]<<"/"<<ped1[i] << " " ;
|
||||||
|
// }
|
||||||
cout << "Pedestal set from tiff file " << pedfile << endl;
|
cout << "Pedestal set from tiff file " << pedfile << endl;
|
||||||
} else {
|
} else {
|
||||||
cout << "Could not open pedestal tiff file " << pedfile
|
cout << "Could not open pedestal tiff file " << pedfile
|
||||||
@ -290,11 +342,11 @@ int main(int argc, char *argv[]) {
|
|||||||
cout << "DATA ";
|
cout << "DATA ";
|
||||||
// sprintf(fn,fformat,irun);
|
// sprintf(fn,fformat,irun);
|
||||||
sprintf(ffname, "%s/%s.raw", indir, fformat);
|
sprintf(ffname, "%s/%s.raw", indir, fformat);
|
||||||
sprintf(fname, (const char*)ffname, irun);
|
sprintf(fname, ffname, irun);
|
||||||
sprintf(ffname, "%s/%s.tiff", outdir, fformat);
|
sprintf(ffname, "%s/%s.tiff", outdir, fformat);
|
||||||
sprintf(imgfname, (const char*)ffname, irun);
|
sprintf(imgfname, ffname, irun);
|
||||||
sprintf(ffname, "%s/%s.clust", outdir, fformat);
|
sprintf(ffname, "%s/%s.clust", outdir, fformat);
|
||||||
sprintf(cfname, (const char*)ffname, irun);
|
sprintf(cfname, ffname, irun);
|
||||||
cout << fname << " ";
|
cout << fname << " ";
|
||||||
cout << imgfname << endl;
|
cout << imgfname << endl;
|
||||||
std::time(&end_time);
|
std::time(&end_time);
|
||||||
@ -323,10 +375,13 @@ int main(int argc, char *argv[]) {
|
|||||||
ifr = 0;
|
ifr = 0;
|
||||||
while (decoder->readNextFrame(filebin, ff, np, buff)) {
|
while (decoder->readNextFrame(filebin, ff, np, buff)) {
|
||||||
if (np == 40) {
|
if (np == 40) {
|
||||||
|
// cout << "*"<<ifr++<<"*"<<ff<< endl;
|
||||||
|
// cout << ff << " " << np << endl;
|
||||||
// //push
|
// //push
|
||||||
mt->pushData(buff);
|
mt->pushData(buff);
|
||||||
// // //pop
|
// // //pop
|
||||||
mt->nextThread();
|
mt->nextThread();
|
||||||
|
// // // cout << " " << (void*)buff;
|
||||||
mt->popFree(buff);
|
mt->popFree(buff);
|
||||||
|
|
||||||
ifr++;
|
ifr++;
|
||||||
@ -334,9 +389,15 @@ int main(int argc, char *argv[]) {
|
|||||||
cout << ifr << " " << ff << endl;
|
cout << ifr << " " << ff << endl;
|
||||||
if (nframes > 0) {
|
if (nframes > 0) {
|
||||||
if (ifr % nframes == 0) {
|
if (ifr % nframes == 0) {
|
||||||
|
// The name has an additional "_fXXXXX" at the end,
|
||||||
|
// where "XXXXX" is the initial frame number of the
|
||||||
|
// image (0,1000,2000...)
|
||||||
|
|
||||||
sprintf(ffname, "%s/%s_f%05d.tiff", outdir, fformat,
|
sprintf(ffname, "%s/%s_f%05d.tiff", outdir, fformat,
|
||||||
ifile);
|
ifile);
|
||||||
sprintf(imgfname, (const char*)ffname, irun);
|
sprintf(imgfname, ffname, irun);
|
||||||
|
// cout << "Writing tiff to " << imgfname << " " <<
|
||||||
|
// thr1 << endl;
|
||||||
mt->writeImage(imgfname, thr1);
|
mt->writeImage(imgfname, thr1);
|
||||||
mt->clearImage();
|
mt->clearImage();
|
||||||
ifile++;
|
ifile++;
|
||||||
@ -348,16 +409,18 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
cout << "--" << endl;
|
cout << "--" << endl;
|
||||||
filebin.close();
|
filebin.close();
|
||||||
|
// //close file
|
||||||
|
// //join threads
|
||||||
while (mt->isBusy()) {
|
while (mt->isBusy()) {
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
if (nframes >= 0) {
|
if (nframes >= 0) {
|
||||||
if (nframes > 0) {
|
if (nframes > 0) {
|
||||||
sprintf(ffname, "%s/%s_f%05d.tiff", outdir, fformat, ifile);
|
sprintf(ffname, "%s/%s_f%05d.tiff", outdir, fformat, ifile);
|
||||||
sprintf(imgfname, (const char*)ffname, irun);
|
sprintf(imgfname, ffname, irun);
|
||||||
} else {
|
} else {
|
||||||
sprintf(ffname, "%s/%s.tiff", outdir, fformat);
|
sprintf(ffname, "%s/%s.tiff", outdir, fformat);
|
||||||
sprintf(imgfname, (const char*)ffname, irun);
|
sprintf(imgfname, ffname, irun);
|
||||||
}
|
}
|
||||||
cout << "Writing tiff to " << imgfname << " " << thr1 << endl;
|
cout << "Writing tiff to " << imgfname << " " << thr1 << endl;
|
||||||
mt->writeImage(imgfname, thr1);
|
mt->writeImage(imgfname, thr1);
|
@ -1,9 +1,9 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
//#define WRITE_QUAD
|
//#define WRITE_QUAD
|
||||||
//#define DEVELOPER
|
#define DEVELOPER
|
||||||
#undef CORR
|
#undef CORR
|
||||||
//#undef MOENCH04
|
#undef MOENCH04
|
||||||
|
|
||||||
#define C_GHOST 0.0004
|
#define C_GHOST 0.0004
|
||||||
|
|
||||||
@ -11,21 +11,21 @@
|
|||||||
|
|
||||||
#include "sls/ZmqSocket.h"
|
#include "sls/ZmqSocket.h"
|
||||||
#include "sls/sls_detector_defs.h"
|
#include "sls/sls_detector_defs.h"
|
||||||
|
#ifndef RECT
|
||||||
#ifndef MOENCH04
|
#ifndef MOENCH04
|
||||||
//#ifndef RECT
|
|
||||||
#include "moench03T1ZmqDataNew.h"
|
#include "moench03T1ZmqDataNew.h"
|
||||||
//#endif
|
|
||||||
//#ifdef RECT
|
|
||||||
//#include "moench03T1ZmqDataNewRect.h"
|
|
||||||
//#endif
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef MOENCH04
|
#ifdef MOENCH04
|
||||||
#include "moench04CtbZmq10GbData.h"
|
#include "moench04CtbZmq10GbData.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#ifdef RECT
|
||||||
|
#include "moench03T1ZmqDataNewRect.h"
|
||||||
|
#endif
|
||||||
#include "moench03CommonMode.h"
|
#include "moench03CommonMode.h"
|
||||||
#include "moench03GhostSummation.h"
|
#include "moench03GhostSummation.h"
|
||||||
#include "sls/tiffIO.h"
|
#include "tiffIO.h"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -156,7 +156,7 @@ int main(int argc, char *argv[]) {
|
|||||||
int send_something = 0;
|
int send_something = 0;
|
||||||
|
|
||||||
int maxSize = npx * npy * 2; // 32*2*8192;//5000;//atoi(argv[3]);
|
int maxSize = npx * npy * 2; // 32*2*8192;//5000;//atoi(argv[3]);
|
||||||
int size = maxSize+sizeof(int); // 32*2*5000;
|
int size = maxSize; // 32*2*5000;
|
||||||
// int multisize=size;
|
// int multisize=size;
|
||||||
// int dataSize=size;
|
// int dataSize=size;
|
||||||
|
|
||||||
@ -305,10 +305,10 @@ int main(int argc, char *argv[]) {
|
|||||||
// header variables
|
// header variables
|
||||||
uint64_t acqIndex = -1;
|
uint64_t acqIndex = -1;
|
||||||
uint64_t frameIndex = -1;
|
uint64_t frameIndex = -1;
|
||||||
// #ifdef MOENCH_BRANCH
|
#ifdef MOENCH_BRANCH
|
||||||
// uint32_t subFrameIndex = -1;
|
uint32_t subFrameIndex = -1;
|
||||||
// int *flippedData = 0;
|
int *flippedData = 0;
|
||||||
// #endif
|
#endif
|
||||||
|
|
||||||
uint64_t subframes = 0;
|
uint64_t subframes = 0;
|
||||||
// uint64_t isubframe=0;
|
// uint64_t isubframe=0;
|
||||||
@ -502,13 +502,13 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
#ifdef INTERP
|
#ifdef INTERP
|
||||||
else if (fMode == eFlat) {
|
else if (fMode == eFlat) {
|
||||||
int nbx, nby;
|
int nb;
|
||||||
double emi = 0, ema = 1;
|
double emi = 0, ema = 1;
|
||||||
int *ff = mt->getFlatField(nbx, nby, emi, ema);
|
int *ff = mt->getFlatField(nb, emi, ema);
|
||||||
nnx = nbx;
|
nnx = nb;
|
||||||
nny = nby;
|
nny = nb;
|
||||||
dout = new int32_t[nbx * nby];
|
dout = new int32_t[nb * nb];
|
||||||
for (int ix = 0; ix < nbx * nby; ix++) {
|
for (int ix = 0; ix < nb * nb; ix++) {
|
||||||
dout[ix] = ff[ix];
|
dout[ix] = ff[ix];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,10 +182,10 @@ class threadedAnalogDetector {
|
|||||||
interp->prepareInterpolation(ok);
|
interp->prepareInterpolation(ok);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int *getFlatFieldDistribution() {
|
virtual int *getFlatField() {
|
||||||
slsInterpolation *interp = (det)->getInterpolation();
|
slsInterpolation *interp = (det)->getInterpolation();
|
||||||
if (interp)
|
if (interp)
|
||||||
return interp->getFlatFieldDistribution();
|
return interp->getFlatField();
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -208,19 +208,19 @@ class threadedAnalogDetector {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *readFlatField(const char *imgname, double emin = 1,
|
void *readFlatField(const char *imgname, int nb = -1, double emin = 1,
|
||||||
double emax = 0) {
|
double emax = 0) {
|
||||||
slsInterpolation *interp = (det)->getInterpolation();
|
slsInterpolation *interp = (det)->getInterpolation();
|
||||||
if (interp)
|
if (interp)
|
||||||
return interp->readFlatField(imgname, emin, emax);
|
return interp->readFlatField(imgname, nb, emin, emax);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int *getFlatField(int &nbx, int &nby, double &emi, double &ema) {
|
virtual int *getFlatField(int &nb, double emi, double ema) {
|
||||||
slsInterpolation *interp = (det)->getInterpolation();
|
slsInterpolation *interp = (det)->getInterpolation();
|
||||||
int *ff = NULL;
|
int *ff = NULL;
|
||||||
if (interp) {
|
if (interp) {
|
||||||
ff = interp->getFlatField(nbx, nby, emi, ema);
|
ff = interp->getFlatField(nb, emi, ema);
|
||||||
}
|
}
|
||||||
return ff;
|
return ff;
|
||||||
}
|
}
|
||||||
|
@ -25,10 +25,10 @@ class multiThreadedInterpolatingDetector
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int *getFlatFieldDistribution() { return (dets[0])->getFlatFieldDistribution(); }
|
virtual int *getFlatField() { return (dets[0])->getFlatField(); }
|
||||||
|
|
||||||
virtual int *getFlatField(int &nbx, int &nby, double &emi, double &ema) {
|
virtual int *getFlatField(int &nb, double emi, double ema) {
|
||||||
return (dets[0])->getFlatField(nbx, nby, emi, ema);
|
return (dets[0])->getFlatField(nb, emi, ema);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int *setFlatField(int *h = NULL, int nb = -1, double emin = 1,
|
virtual int *setFlatField(int *h = NULL, int nb = -1, double emin = 1,
|
||||||
@ -40,9 +40,9 @@ class multiThreadedInterpolatingDetector
|
|||||||
return dets[0]->writeFlatField(imgname);
|
return dets[0]->writeFlatField(imgname);
|
||||||
};
|
};
|
||||||
|
|
||||||
void *readFlatField(const char *imgname, double emin = 1,
|
void *readFlatField(const char *imgname, int nb = -1, double emin = 1,
|
||||||
double emax = 0) {
|
double emax = 0) {
|
||||||
return (dets[0])->readFlatField(imgname, emin, emax);
|
return (dets[0])->readFlatField(imgname, nb, emin, emax);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* virtual int setNSubPixels(int ns) { return
|
/* virtual int setNSubPixels(int ns) { return
|
||||||
|
@ -429,28 +429,23 @@ class singlePhotonDetector : public analogDetector<uint16_t> {
|
|||||||
for (ic = -(clusterSize / 2); ic < (clusterSize / 2) + 1;
|
for (ic = -(clusterSize / 2); ic < (clusterSize / 2) + 1;
|
||||||
ic++) {
|
ic++) {
|
||||||
|
|
||||||
if ((iy + ir) >= 0 && (iy + ir) < ny &&
|
if ((iy + ir) >= iy && (iy + ir) < ny &&
|
||||||
(ix + ic) >= 0 && (ix + ic) < nx) {
|
(ix + ic) >= ix && (ix + ic) < nx) {
|
||||||
|
|
||||||
|
|
||||||
if ((iy + ir) >= iy && (ix + ic) >= ix ) {
|
|
||||||
val[(iy + ir) * nx + ix + ic] =
|
val[(iy + ir) * nx + ix + ic] =
|
||||||
subtractPedestal(data, ix + ic, iy + ir, cm);
|
subtractPedestal(data, ix + ic, iy + ir, cm);
|
||||||
|
v = &(val[(iy + ir) * nx + ix + ic]);
|
||||||
}
|
tot += *v;
|
||||||
v = &(val[(iy + ir) * nx + ix + ic]);
|
if (ir <= 0 && ic <= 0)
|
||||||
tot += *v;
|
bl += *v;
|
||||||
if (ir <= 0 && ic <= 0)
|
if (ir <= 0 && ic >= 0)
|
||||||
bl += *v;
|
br += *v;
|
||||||
if (ir <= 0 && ic >= 0)
|
if (ir >= 0 && ic <= 0)
|
||||||
br += *v;
|
tl += *v;
|
||||||
if (ir >= 0 && ic <= 0)
|
if (ir >= 0 && ic >= 0)
|
||||||
tl += *v;
|
tr += *v;
|
||||||
if (ir >= 0 && ic >= 0)
|
if (*v > max) {
|
||||||
tr += *v;
|
max = *v;
|
||||||
if (*v > max) //{
|
}
|
||||||
max = *v;
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -518,19 +513,12 @@ class singlePhotonDetector : public analogDetector<uint16_t> {
|
|||||||
for (ic = -(clusterSize / 2);
|
for (ic = -(clusterSize / 2);
|
||||||
ic < (clusterSize / 2) + 1; ic++) {
|
ic < (clusterSize / 2) + 1; ic++) {
|
||||||
if ((iy + ir) >= 0 && (iy + ir) < ny &&
|
if ((iy + ir) >= 0 && (iy + ir) < ny &&
|
||||||
(ix + ic) >= 0 && (ix + ic) < nx) {
|
(ix + ic) >= 0 && (ix + ic) < nx)
|
||||||
(clusters + nph)
|
(clusters + nph)
|
||||||
->set_data(val[(iy + ir) * nx + ix + ic],
|
->set_data(val[(iy + ir) * nx + ix + ic],
|
||||||
ic, ir);
|
ic, ir);
|
||||||
if (val[(iy + ir) * nx + ix + ic]>max)
|
|
||||||
good=0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (good==0) {
|
|
||||||
(clusters + nph)->print();
|
|
||||||
cout << max << " " << val[iy * nx + ix] << endl;
|
|
||||||
}
|
|
||||||
good = 1;
|
good = 1;
|
||||||
if (eMin > 0 && tot < eMin)
|
if (eMin > 0 && tot < eMin)
|
||||||
good = 0;
|
good = 0;
|
||||||
|
@ -216,18 +216,14 @@ class single_photon_hit {
|
|||||||
|
|
||||||
// int ix, iy;
|
// int ix, iy;
|
||||||
|
|
||||||
printf("***************\n");
|
|
||||||
printf("** %d %d **\n",x,y);
|
|
||||||
for (int iy = 0; iy < dy; iy++) {
|
for (int iy = 0; iy < dy; iy++) {
|
||||||
for (int ix = 0; ix < dx; ix++) {
|
for (int ix = 0; ix < dx; ix++) {
|
||||||
printf("%d \t", data[ix + iy * dx]);
|
printf("%d \t", data[ix + iy * dx]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
printf("***************\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
assign the value to the element of the cluster matrix, with relative
|
assign the value to the element of the cluster matrix, with relative
|
||||||
coordinates where the center of the cluster is (0,0) \param v value to be
|
coordinates where the center of the cluster is (0,0) \param v value to be
|
||||||
|
@ -1,12 +1,26 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
|
#ifndef MY_TIFF_IO_H
|
||||||
#include "sls/tiffIO.h"
|
#include "tiffIO.h"
|
||||||
|
#endif
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <tiffio.h>
|
using namespace std;
|
||||||
|
// #undef cbf_failnez
|
||||||
|
// #define cbf_failnez(x)
|
||||||
|
// {
|
||||||
|
// int err;
|
||||||
|
// err = (x);
|
||||||
|
// if (err) {
|
||||||
|
// fprintf(stderr,"\nCBFlib fatal error %x \n",err);
|
||||||
|
// exit(-1);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
void *WriteToTiff(float *imgData, const char *imgname, int nrow, int ncol) {
|
void *WriteToTiff(float *imgData, const char *imgname, int nrow, int ncol) {
|
||||||
constexpr uint32_t sampleperpixel = 1;
|
int sampleperpixel = 1;
|
||||||
|
// unsigned char * buff=NULL;
|
||||||
|
// tsize_t linebytes;
|
||||||
|
// cout << "--" <<endl;
|
||||||
TIFF *tif = TIFFOpen(imgname, "w");
|
TIFF *tif = TIFFOpen(imgname, "w");
|
||||||
if (tif) {
|
if (tif) {
|
||||||
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, ncol);
|
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, ncol);
|
||||||
@ -17,32 +31,50 @@ void *WriteToTiff(float *imgData, const char *imgname, int nrow, int ncol) {
|
|||||||
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
||||||
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
|
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
|
||||||
TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
|
TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
|
||||||
|
|
||||||
|
// linebytes = sampleperpixel*ncol;
|
||||||
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP,
|
TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP,
|
||||||
TIFFDefaultStripSize(tif, ncol * sampleperpixel));
|
TIFFDefaultStripSize(tif, ncol * sampleperpixel));
|
||||||
|
|
||||||
for (int irow = 0; irow < nrow; irow++) {
|
for (int irow = 0; irow < nrow; irow++) {
|
||||||
TIFFWriteScanline(tif, &imgData[irow * ncol], irow, 0);
|
TIFFWriteScanline(tif, &imgData[irow * ncol], irow, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
} else {
|
} else
|
||||||
std::cout << "could not open file " << imgname << " for writing\n";
|
cout << "could not open file " << imgname << " for writing " << endl;
|
||||||
}
|
|
||||||
return nullptr;
|
return NULL;
|
||||||
}
|
};
|
||||||
|
|
||||||
float *ReadFromTiff(const char *imgname, uint32_t &nrow, uint32_t &ncol) {
|
float *ReadFromTiff(const char *imgname, uint32_t &nrow, uint32_t &ncol) {
|
||||||
|
// unsigned char * buff=NULL;
|
||||||
|
|
||||||
TIFF *tif = TIFFOpen(imgname, "r");
|
TIFF *tif = TIFFOpen(imgname, "r");
|
||||||
if (tif) {
|
if (tif) {
|
||||||
|
uint32_t bps;
|
||||||
|
uint32_t sampleperpixel = 1;
|
||||||
|
// tsize_t linebytes;
|
||||||
|
|
||||||
|
uint32_t imagelength;
|
||||||
|
|
||||||
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &ncol);
|
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &ncol);
|
||||||
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &nrow);
|
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &nrow);
|
||||||
|
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, sampleperpixel);
|
||||||
|
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, &bps);
|
||||||
|
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
|
||||||
|
|
||||||
float *imgData = new float[ncol * nrow];
|
float *imgData = new float[ncol * nrow];
|
||||||
for (uint32_t irow = 0; irow < nrow; ++irow) {
|
// linebytes = sampleperpixel*ncol;
|
||||||
|
// TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif,
|
||||||
|
// ncol*sampleperpixel));
|
||||||
|
for (uint32_t irow = 0; irow < nrow; irow++) {
|
||||||
|
// tiffreadscanline(tif, buf, row);
|
||||||
TIFFReadScanline(tif, &imgData[irow * ncol], irow);
|
TIFFReadScanline(tif, &imgData[irow * ncol], irow);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIFFClose(tif);
|
TIFFClose(tif);
|
||||||
return imgData;
|
return imgData;
|
||||||
} else {
|
} else
|
||||||
std::cout << "could not open file " << imgname << " for reading\n";
|
cout << "could not open file " << imgname << " for reading " << endl;
|
||||||
return nullptr;
|
return NULL;
|
||||||
}
|
};
|
||||||
}
|
|
35
slsDetectorCalibration/tiffIO.h
Normal file
35
slsDetectorCalibration/tiffIO.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
|
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
|
#ifndef MY_TIFF_IO_H
|
||||||
|
#define MY_TIFF_IO_H
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <sstream>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
//
|
||||||
|
// CBFlib must be installed to use this program
|
||||||
|
//
|
||||||
|
/*****************************************************************************/
|
||||||
|
#include <tiffio.h>
|
||||||
|
|
||||||
|
#undef cbf_failnez
|
||||||
|
#define cbf_failnez(x) \
|
||||||
|
{ \
|
||||||
|
int err; \
|
||||||
|
err = (x); \
|
||||||
|
if (err) { \
|
||||||
|
fprintf(stderr, "\nCBFlib fatal error %x \n", err); \
|
||||||
|
exit(-1); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
void *WriteToTiff(float *imgData, const char *imgname, int nrow, int ncol);
|
||||||
|
|
||||||
|
float *ReadFromTiff(const char *imgname, uint32_t &nrow, uint32_t &ncol);
|
||||||
|
|
||||||
|
#endif
|
@ -1,14 +0,0 @@
|
|||||||
find_package(TIFF REQUIRED)
|
|
||||||
add_library(tiffio STATIC src/tiffIO.cpp)
|
|
||||||
target_include_directories(tiffio PUBLIC include/)
|
|
||||||
target_link_libraries(tiffio
|
|
||||||
PUBLIC
|
|
||||||
TIFF::TIFF
|
|
||||||
PRIVATE
|
|
||||||
slsProjectWarnings
|
|
||||||
slsProjectOptions
|
|
||||||
)
|
|
||||||
|
|
||||||
if(SLS_USE_TESTS)
|
|
||||||
add_subdirectory(tests)
|
|
||||||
endif()
|
|
@ -1,16 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#pragma once
|
|
||||||
#include <cstdint>
|
|
||||||
|
|
||||||
//Write 32bit float data to tiff file
|
|
||||||
//Always returns nullptr, prints message on failure
|
|
||||||
void *WriteToTiff(float *imgData, const char *imgname, int nrow, int ncol);
|
|
||||||
|
|
||||||
//Read 32bit float data from tiff file, returns pointer to data and sets
|
|
||||||
//image dimensions in the out parameters nrow, ncol.
|
|
||||||
//Returns nullptr on failure
|
|
||||||
//The caller is responsible to deallocate the memory that the returned
|
|
||||||
//pointer points to.
|
|
||||||
float *ReadFromTiff(const char *imgname, uint32_t &nrow, uint32_t &ncol);
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
target_sources(tests PRIVATE
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/test-tiffio.cpp
|
|
||||||
)
|
|
@ -1,54 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "catch.hpp"
|
|
||||||
#include "sls/tiffIO.h"
|
|
||||||
#include <cstdio>
|
|
||||||
#include <ftw.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
/* Call-back to the 'remove()' function called by nftw() */
|
|
||||||
static int remove_callback(const char *pathname,
|
|
||||||
__attribute__((unused)) const struct stat *sbuf,
|
|
||||||
__attribute__((unused)) int type,
|
|
||||||
__attribute__((unused)) struct FTW *ftwb) {
|
|
||||||
return remove(pathname);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST_CASE("Write and read back data from tiff file") {
|
|
||||||
|
|
||||||
std::vector<float> data{1, 2, 3, 4, 5, 6, 7, 8, 9};
|
|
||||||
|
|
||||||
/* Create the temporary directory */
|
|
||||||
char tmp[] = "/tmp/tmpdir.XXXXXX";
|
|
||||||
char *tmp_dirname = mkdtemp(tmp);
|
|
||||||
|
|
||||||
if (tmp_dirname == NULL) {
|
|
||||||
perror("tempdir: error: Could not create tmp directory");
|
|
||||||
CHECK(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string fname = std::string(tmp_dirname) + std::string("/test.tif");
|
|
||||||
std::cout << "Writing to: " << fname<< '\n';
|
|
||||||
|
|
||||||
WriteToTiff(data.data(), fname.c_str(), 3, 3);
|
|
||||||
|
|
||||||
//Readback
|
|
||||||
uint32_t nrow, ncol;
|
|
||||||
float* ptr = ReadFromTiff(fname.c_str(), nrow, ncol);
|
|
||||||
CHECK(nrow == 3);
|
|
||||||
CHECK(ncol == 3);
|
|
||||||
uint32_t size = nrow*ncol;
|
|
||||||
for (uint32_t i = 0; i!=size; ++i){
|
|
||||||
CHECK(data[i] == ptr[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete[] ptr;
|
|
||||||
|
|
||||||
/* Delete the temporary directory */
|
|
||||||
if (nftw(tmp_dirname, remove_callback, FOPEN_MAX,
|
|
||||||
FTW_DEPTH | FTW_MOUNT | FTW_PHYS) == -1) {
|
|
||||||
perror("tempdir: error: ");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
@ -97,11 +97,6 @@
|
|||||||
<string>65535</string>
|
<string>65535</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>4095</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>255</string>
|
<string>255</string>
|
||||||
|
@ -91,10 +91,8 @@ class qDrawPlot : public QWidget, private Ui::PlotObject {
|
|||||||
void Update2dPlot();
|
void Update2dPlot();
|
||||||
void Update1dXYRange();
|
void Update1dXYRange();
|
||||||
void Update2dXYRange();
|
void Update2dXYRange();
|
||||||
void rearrangeGotthard25data(double *data);
|
|
||||||
|
|
||||||
static const int NUM_PEDESTAL_FRAMES = 20;
|
static const int NUM_PEDESTAL_FRAMES = 20;
|
||||||
static const int NUM_GOTTHARD25_CHANS = 1280;
|
|
||||||
sls::Detector *det;
|
sls::Detector *det;
|
||||||
slsDetectorDefs::detectorType detType;
|
slsDetectorDefs::detectorType detType;
|
||||||
|
|
||||||
@ -166,5 +164,4 @@ class qDrawPlot : public QWidget, private Ui::PlotObject {
|
|||||||
uint32_t pixelMask{0};
|
uint32_t pixelMask{0};
|
||||||
uint32_t gainMask{0};
|
uint32_t gainMask{0};
|
||||||
int gainOffset{0};
|
int gainOffset{0};
|
||||||
bool gotthard25;
|
|
||||||
};
|
};
|
||||||
|
@ -69,11 +69,5 @@ class qTabSettings : public QWidget, private Ui::TabSettingsObject {
|
|||||||
enum { DYNAMIC, FORCE_SWITCH_G1, FORCE_SWITCH_G2, FIX_G1, FIX_G2, FIX_G0 };
|
enum { DYNAMIC, FORCE_SWITCH_G1, FORCE_SWITCH_G2, FIX_G1, FIX_G2, FIX_G0 };
|
||||||
bool isVisibleFixG0{false};
|
bool isVisibleFixG0{false};
|
||||||
|
|
||||||
enum {
|
enum { DYNAMICRANGE_32, DYNAMICRANGE_16, DYNAMICRANGE_8, DYNAMICRANGE_4 };
|
||||||
DYNAMICRANGE_32,
|
|
||||||
DYNAMICRANGE_16,
|
|
||||||
DYNAMICRANGE_12,
|
|
||||||
DYNAMICRANGE_8,
|
|
||||||
DYNAMICRANGE_4
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
@ -80,10 +80,6 @@ void qDrawPlot::SetupWidgetWindow() {
|
|||||||
fileSaveName = "Image";
|
fileSaveName = "Image";
|
||||||
}
|
}
|
||||||
|
|
||||||
gotthard25 = ((detType == slsDetectorDefs::GOTTHARD2 ||
|
|
||||||
detType == slsDetectorDefs::GOTTHARD) &&
|
|
||||||
det->size() == 2);
|
|
||||||
|
|
||||||
SetupPlots();
|
SetupPlots();
|
||||||
SetDataCallBack(true);
|
SetDataCallBack(true);
|
||||||
det->registerAcquisitionFinishedCallback(&(GetAcquisitionFinishedCallBack),
|
det->registerAcquisitionFinishedCallback(&(GetAcquisitionFinishedCallBack),
|
||||||
@ -811,11 +807,6 @@ void qDrawPlot::GetData(detectorData *data, uint64_t frameIndex,
|
|||||||
isGainDataExtracted = false;
|
isGainDataExtracted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// gotthard25um rearranging
|
|
||||||
if (gotthard25) {
|
|
||||||
rearrangeGotthard25data(rawData);
|
|
||||||
}
|
|
||||||
|
|
||||||
// title and frame index titles
|
// title and frame index titles
|
||||||
plotTitle =
|
plotTitle =
|
||||||
plotTitlePrefix + QString(data->fileName.c_str()).section('/', -1);
|
plotTitlePrefix + QString(data->fileName.c_str()).section('/', -1);
|
||||||
@ -1073,8 +1064,6 @@ void qDrawPlot::toDoublePixelData(double *dest, char *source, int size,
|
|||||||
// mythen3 / gotthard2 debugging
|
// mythen3 / gotthard2 debugging
|
||||||
int discardBits = numDiscardBits;
|
int discardBits = numDiscardBits;
|
||||||
|
|
||||||
uint16_t temp = 0;
|
|
||||||
uint8_t *src = (uint8_t *)source;
|
|
||||||
switch (dr) {
|
switch (dr) {
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
@ -1094,19 +1083,6 @@ void qDrawPlot::toDoublePixelData(double *dest, char *source, int size,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 12:
|
|
||||||
for (ichan = 0; ichan < size; ++ichan) {
|
|
||||||
temp = (*src++ & 0xFF);
|
|
||||||
temp |= ((*src & 0xF) << 8u);
|
|
||||||
dest[ichan] = (double)temp;
|
|
||||||
++ichan;
|
|
||||||
|
|
||||||
temp = ((*src++ & 0xF0) >> 4u);
|
|
||||||
temp |= ((*src++ & 0xFF) << 4u);
|
|
||||||
dest[ichan] = (double)temp;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 16:
|
case 16:
|
||||||
if (detType == slsDetectorDefs::JUNGFRAU ||
|
if (detType == slsDetectorDefs::JUNGFRAU ||
|
||||||
detType == slsDetectorDefs::GOTTHARD2) {
|
detType == slsDetectorDefs::GOTTHARD2) {
|
||||||
@ -1154,18 +1130,6 @@ void qDrawPlot::toDoublePixelData(double *dest, char *source, int size,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void qDrawPlot::rearrangeGotthard25data(double *data) {
|
|
||||||
const int nChans = NUM_GOTTHARD25_CHANS;
|
|
||||||
double temp[nChans * 2] = {0.0};
|
|
||||||
for (int i = 0; i != nChans; ++i) {
|
|
||||||
// master module
|
|
||||||
temp[i * 2] = data[i];
|
|
||||||
// slave module
|
|
||||||
temp[i * 2 + 1] = data[nChans + i];
|
|
||||||
}
|
|
||||||
memcpy(data, temp, nChans * 2 * sizeof(double));
|
|
||||||
}
|
|
||||||
|
|
||||||
void qDrawPlot::UpdatePlot() {
|
void qDrawPlot::UpdatePlot() {
|
||||||
std::lock_guard<std::mutex> lock(mPlots);
|
std::lock_guard<std::mutex> lock(mPlots);
|
||||||
LOG(logDEBUG) << "Update Plot";
|
LOG(logDEBUG) << "Update Plot";
|
||||||
|
@ -60,19 +60,13 @@ void qTabSettings::SetupWidgetWindow() {
|
|||||||
QStandardItemModel *model =
|
QStandardItemModel *model =
|
||||||
qobject_cast<QStandardItemModel *>(comboDynamicRange->model());
|
qobject_cast<QStandardItemModel *>(comboDynamicRange->model());
|
||||||
if (model) {
|
if (model) {
|
||||||
|
QModelIndex index;
|
||||||
QStandardItem *item;
|
QStandardItem *item;
|
||||||
int dr = DYNAMICRANGE_4;
|
index =
|
||||||
for (int i = 0; i != 2; ++i) {
|
model->index(DYNAMICRANGE_4, comboDynamicRange->modelColumn(),
|
||||||
// disable dr 4
|
comboDynamicRange->rootModelIndex());
|
||||||
QModelIndex index =
|
item = model->itemFromIndex(index);
|
||||||
model->index(dr, comboDynamicRange->modelColumn(),
|
item->setEnabled(false);
|
||||||
comboDynamicRange->rootModelIndex());
|
|
||||||
item = model->itemFromIndex(index);
|
|
||||||
item->setEnabled(false);
|
|
||||||
|
|
||||||
// disable dr 12
|
|
||||||
dr = DYNAMICRANGE_12;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (detType == slsDetectorDefs::EIGER) {
|
} else if (detType == slsDetectorDefs::EIGER) {
|
||||||
lblDynamicRange->setEnabled(true);
|
lblDynamicRange->setEnabled(true);
|
||||||
@ -311,9 +305,6 @@ void qTabSettings::GetDynamicRange() {
|
|||||||
case 16:
|
case 16:
|
||||||
comboDynamicRange->setCurrentIndex(DYNAMICRANGE_16);
|
comboDynamicRange->setCurrentIndex(DYNAMICRANGE_16);
|
||||||
break;
|
break;
|
||||||
case 12:
|
|
||||||
comboDynamicRange->setCurrentIndex(DYNAMICRANGE_12);
|
|
||||||
break;
|
|
||||||
case 8:
|
case 8:
|
||||||
comboDynamicRange->setCurrentIndex(DYNAMICRANGE_8);
|
comboDynamicRange->setCurrentIndex(DYNAMICRANGE_8);
|
||||||
break;
|
break;
|
||||||
@ -342,9 +333,6 @@ void qTabSettings::SetDynamicRange(int index) {
|
|||||||
case DYNAMICRANGE_16:
|
case DYNAMICRANGE_16:
|
||||||
det->setDynamicRange(16);
|
det->setDynamicRange(16);
|
||||||
break;
|
break;
|
||||||
case DYNAMICRANGE_12:
|
|
||||||
det->setDynamicRange(12);
|
|
||||||
break;
|
|
||||||
case DYNAMICRANGE_8:
|
case DYNAMICRANGE_8:
|
||||||
det->setDynamicRange(8);
|
det->setDynamicRange(8);
|
||||||
break;
|
break;
|
||||||
|
@ -165,9 +165,11 @@
|
|||||||
#define PATTERN_OUT_LSB_REG (0x20 << MEM_MAP_SHIFT)
|
#define PATTERN_OUT_LSB_REG (0x20 << MEM_MAP_SHIFT)
|
||||||
#define PATTERN_OUT_MSB_REG (0x21 << MEM_MAP_SHIFT)
|
#define PATTERN_OUT_MSB_REG (0x21 << MEM_MAP_SHIFT)
|
||||||
|
|
||||||
/* Frame number of next acquisition register (64 bit register) */
|
/* Frames From Start 64 bit RO register TODO */
|
||||||
#define NEXT_FRAME_NUMB_LOCAL_LSB_REG (0x22 << MEM_MAP_SHIFT)
|
//#define FRAMES_FROM_START_LSB_REG (0x22 << MEM_MAP_SHIFT) // Not
|
||||||
#define NEXT_FRAME_NUMB_LOCAL_MSB_REG (0x23 << MEM_MAP_SHIFT)
|
// used in FW #define FRAMES_FROM_START_MSB_REG (0x23 <<
|
||||||
|
// MEM_MAP_SHIFT)
|
||||||
|
//// Not used in FW
|
||||||
|
|
||||||
/* Frames From Start PG 64 bit RO register. Reset using CONTROL_CRST. TODO */
|
/* Frames From Start PG 64 bit RO register. Reset using CONTROL_CRST. TODO */
|
||||||
#define FRAMES_FROM_START_PG_LSB_REG (0x24 << MEM_MAP_SHIFT)
|
#define FRAMES_FROM_START_PG_LSB_REG (0x24 << MEM_MAP_SHIFT)
|
||||||
|
Binary file not shown.
@ -45,6 +45,7 @@ char initErrorMessage[MAX_STR_LENGTH];
|
|||||||
|
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
pthread_t pthread_virtual_tid;
|
pthread_t pthread_virtual_tid;
|
||||||
|
int64_t virtual_currentFrameNumber = 2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 1g readout
|
// 1g readout
|
||||||
@ -433,21 +434,16 @@ void initControlServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initStopServer() {
|
void initStopServer() {
|
||||||
if (!updateFlag && initError == OK) {
|
|
||||||
usleep(CTRL_SRVR_INIT_TIME_US);
|
usleep(CTRL_SRVR_INIT_TIME_US);
|
||||||
if (mapCSP0() == FAIL) {
|
if (mapCSP0() == FAIL) {
|
||||||
initError = FAIL;
|
LOG(logERROR,
|
||||||
strcpy(initErrorMessage,
|
("Stop Server: Map Fail. Dangerous to continue. Goodbye!\n"));
|
||||||
"Stop Server: Map Fail. Dangerous to continue. Goodbye!\n");
|
exit(EXIT_FAILURE);
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
sharedMemory_setStop(0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
initCheckDone = 1;
|
#ifdef VIRTUAL
|
||||||
|
sharedMemory_setStop(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set up detector */
|
/* set up detector */
|
||||||
@ -585,7 +581,6 @@ void setupDetector() {
|
|||||||
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
||||||
initError = FAIL;
|
initError = FAIL;
|
||||||
}
|
}
|
||||||
setNextFrameNumber(DEFAULT_STARTING_FRAME_NUMBER);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int updateDatabytesandAllocateRAM() {
|
int updateDatabytesandAllocateRAM() {
|
||||||
@ -707,16 +702,8 @@ void resetPeripheral() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* set parameters - dr, adcenablemask */
|
/* set parameters - dr, adcenablemask */
|
||||||
int setDynamicRange(int dr) {
|
|
||||||
if (dr == 16)
|
|
||||||
return OK;
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getDynamicRange(int *retval) {
|
int setDynamicRange(int dr) { return DYNAMIC_RANGE; }
|
||||||
*retval = DYNAMIC_RANGE;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int setADCEnableMask(uint32_t mask) {
|
int setADCEnableMask(uint32_t mask) {
|
||||||
if (mask == 0u) {
|
if (mask == 0u) {
|
||||||
@ -911,24 +898,6 @@ int getReadoutMode() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* parameters - timer */
|
/* parameters - timer */
|
||||||
int setNextFrameNumber(uint64_t value) {
|
|
||||||
LOG(logINFO,
|
|
||||||
("Setting next frame number: %llu\n", (long long unsigned int)value));
|
|
||||||
setU64BitReg(value, NEXT_FRAME_NUMB_LOCAL_LSB_REG,
|
|
||||||
NEXT_FRAME_NUMB_LOCAL_MSB_REG);
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
// for 1g udp interface
|
|
||||||
setUDPFrameNumber(value);
|
|
||||||
#endif
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getNextFrameNumber(uint64_t *retval) {
|
|
||||||
*retval = getU64BitReg(NEXT_FRAME_NUMB_LOCAL_LSB_REG,
|
|
||||||
NEXT_FRAME_NUMB_LOCAL_MSB_REG);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setNumFrames(int64_t val) {
|
void setNumFrames(int64_t val) {
|
||||||
if (val > 0) {
|
if (val > 0) {
|
||||||
LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val));
|
LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val));
|
||||||
@ -1523,8 +1492,6 @@ enum timingMode getTiming() {
|
|||||||
|
|
||||||
/* configure mac */
|
/* configure mac */
|
||||||
|
|
||||||
int getNumberofUDPInterfaces() { return 1; }
|
|
||||||
|
|
||||||
void calcChecksum(udp_header *udp) {
|
void calcChecksum(udp_header *udp) {
|
||||||
int count = IP_HEADER_SIZE;
|
int count = IP_HEADER_SIZE;
|
||||||
long int sum = 0;
|
long int sum = 0;
|
||||||
@ -2031,14 +1998,11 @@ void *start_timer(void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send data
|
// Send data
|
||||||
uint64_t frameNr = 0;
|
|
||||||
getNextFrameNumber(&frameNr);
|
|
||||||
// loop over number of frames
|
// loop over number of frames
|
||||||
for (int iframes = 0; iframes != numFrames; ++iframes) {
|
for (int frameNr = 0; frameNr != numFrames; ++frameNr) {
|
||||||
|
|
||||||
// check if manual stop
|
// check if manual stop
|
||||||
if (sharedMemory_getStop() == 1) {
|
if (sharedMemory_getStop() == 1) {
|
||||||
setNextFrameNumber(frameNr + iframes + 1);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2057,7 +2021,7 @@ void *start_timer(void *arg) {
|
|||||||
sls_detector_header *header = (sls_detector_header *)(packetData);
|
sls_detector_header *header = (sls_detector_header *)(packetData);
|
||||||
header->detType = (uint16_t)myDetectorType;
|
header->detType = (uint16_t)myDetectorType;
|
||||||
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
||||||
header->frameNumber = frameNr + iframes;
|
header->frameNumber = virtual_currentFrameNumber;
|
||||||
header->packetNumber = i;
|
header->packetNumber = i;
|
||||||
header->modId = 0;
|
header->modId = 0;
|
||||||
header->row = detPos[X];
|
header->row = detPos[X];
|
||||||
@ -2070,18 +2034,19 @@ void *start_timer(void *arg) {
|
|||||||
|
|
||||||
sendUDPPacket(0, 0, packetData, packetSize);
|
sendUDPPacket(0, 0, packetData, packetSize);
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("Sent frame: %d [%lld]\n", iframes, frameNr + iframes));
|
LOG(logINFO, ("Sent frame: %d [%lld]\n", frameNr,
|
||||||
|
(long long unsigned int)virtual_currentFrameNumber));
|
||||||
clock_gettime(CLOCK_REALTIME, &end);
|
clock_gettime(CLOCK_REALTIME, &end);
|
||||||
int64_t timeNs =
|
int64_t timeNs =
|
||||||
((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec));
|
((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec));
|
||||||
|
|
||||||
// sleep for (period - exptime)
|
// sleep for (period - exptime)
|
||||||
if (iframes < numFrames) { // if there is a next frame
|
if (frameNr < numFrames) { // if there is a next frame
|
||||||
if (periodNs > timeNs) {
|
if (periodNs > timeNs) {
|
||||||
usleep((periodNs - timeNs) / 1000);
|
usleep((periodNs - timeNs) / 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setNextFrameNumber(frameNr + numFrames);
|
++virtual_currentFrameNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
closeUDPSocket(0);
|
closeUDPSocket(0);
|
||||||
|
@ -108,24 +108,21 @@ enum CLKINDEX { RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS };
|
|||||||
#define I2C_SHUNT_RESISTER_OHMS (0.005)
|
#define I2C_SHUNT_RESISTER_OHMS (0.005)
|
||||||
|
|
||||||
/** Default Parameters */
|
/** Default Parameters */
|
||||||
#define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL)
|
#define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL)
|
||||||
#define DEFAULT_STARTING_FRAME_NUMBER (1)
|
#define DEFAULT_NUM_SAMPLES (1)
|
||||||
#define DEFAULT_NUM_SAMPLES (1)
|
#define DEFAULT_NUM_FRAMES (1)
|
||||||
#define DEFAULT_NUM_FRAMES (1)
|
#define DEFAULT_EXPTIME (0)
|
||||||
#define DEFAULT_EXPTIME (0)
|
#define DEFAULT_NUM_CYCLES (1)
|
||||||
#define DEFAULT_NUM_CYCLES (1)
|
#define DEFAULT_PERIOD (1 * 1000 * 1000) // ns
|
||||||
#define DEFAULT_PERIOD (1 * 1000 * 1000) // ns
|
#define DEFAULT_DELAY (0)
|
||||||
#define DEFAULT_DELAY (0)
|
#define DEFAULT_HIGH_VOLTAGE (0)
|
||||||
#define DEFAULT_HIGH_VOLTAGE (0)
|
#define DEFAULT_VLIMIT (-100)
|
||||||
#define DEFAULT_VLIMIT (-100)
|
#define DEFAULT_TIMING_MODE (AUTO_TIMING)
|
||||||
#define DEFAULT_TIMING_MODE (AUTO_TIMING)
|
#define DEFAULT_TX_UDP_PORT (0x7e9a)
|
||||||
#define DEFAULT_TX_UDP_PORT (0x7e9a)
|
#define DEFAULT_RUN_CLK (200) // 40
|
||||||
#define DEFAULT_RUN_CLK (200) // 40
|
#define DEFAULT_ADC_CLK (40) // 20
|
||||||
#define DEFAULT_ADC_CLK (40) // 20
|
#define DEFAULT_SYNC_CLK (40) // 20
|
||||||
#define DEFAULT_SYNC_CLK (40) // 20
|
#define DEFAULT_DBIT_CLK (200)
|
||||||
#define DEFAULT_DBIT_CLK (200)
|
|
||||||
|
|
||||||
#define UDP_HEADER_MAX_FRAME_VALUE (0xFFFFFFFFFFFF)
|
|
||||||
|
|
||||||
#define HIGHVOLTAGE_MIN (60)
|
#define HIGHVOLTAGE_MIN (60)
|
||||||
#define HIGHVOLTAGE_MAX (200) // min dac val
|
#define HIGHVOLTAGE_MAX (200) // min dac val
|
||||||
|
@ -177,7 +177,7 @@ void Beb_AdjustIPChecksum(struct udp_header_type *ip) {
|
|||||||
ip->ip_header_checksum[1] = ip_checksum & 0xff;
|
ip->ip_header_checksum[1] = ip_checksum & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Beb_GetModuleConfiguration(int *master, int *top, int *normal) {
|
void Beb_GetModuleConfiguration(int *master, int *top, int *normal) {
|
||||||
*top = 0;
|
*top = 0;
|
||||||
*master = 0;
|
*master = 0;
|
||||||
// mapping new memory to read master top module configuration
|
// mapping new memory to read master top module configuration
|
||||||
@ -187,7 +187,6 @@ int Beb_GetModuleConfiguration(int *master, int *top, int *normal) {
|
|||||||
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
LOG(logERROR, ("Module Configuration FAIL\n"));
|
LOG(logERROR, ("Module Configuration FAIL\n"));
|
||||||
return FAIL;
|
|
||||||
} else {
|
} else {
|
||||||
// read data
|
// read data
|
||||||
ret = Beb_Read32(csp0base, BEB_CONFIG_RD_OFST);
|
ret = Beb_Read32(csp0base, BEB_CONFIG_RD_OFST);
|
||||||
@ -203,7 +202,6 @@ int Beb_GetModuleConfiguration(int *master, int *top, int *normal) {
|
|||||||
// close file pointer
|
// close file pointer
|
||||||
Beb_close(fd, csp0base);
|
Beb_close(fd, csp0base);
|
||||||
}
|
}
|
||||||
return OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Beb_IsTransmitting(int *retval, int tengiga, int waitForDelay) {
|
int Beb_IsTransmitting(int *retval, int tengiga, int waitForDelay) {
|
||||||
@ -494,11 +492,6 @@ int Beb_SetDataStream(enum portPosition port, int enable) {
|
|||||||
u_int32_t reg = XPAR_GPIO_P15_STREAMING_REG;
|
u_int32_t reg = XPAR_GPIO_P15_STREAMING_REG;
|
||||||
u_int32_t mask = (port == LEFT ? XPAR_GPIO_LFT_STRM_DSBL_MSK
|
u_int32_t mask = (port == LEFT ? XPAR_GPIO_LFT_STRM_DSBL_MSK
|
||||||
: XPAR_GPIO_RGHT_STRM_DSBL_MSK);
|
: XPAR_GPIO_RGHT_STRM_DSBL_MSK);
|
||||||
// invert left/right if bottom
|
|
||||||
if (!Beb_top) {
|
|
||||||
mask = (port == LEFT ? XPAR_GPIO_RGHT_STRM_DSBL_MSK
|
|
||||||
: XPAR_GPIO_LFT_STRM_DSBL_MSK);
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int32_t value = Beb_Read32(csp0base, reg);
|
u_int32_t value = Beb_Read32(csp0base, reg);
|
||||||
// disabling in firmware
|
// disabling in firmware
|
||||||
@ -536,11 +529,6 @@ int Beb_GetDataStream(enum portPosition port, int *retval) {
|
|||||||
u_int32_t reg = XPAR_GPIO_P15_STREAMING_REG;
|
u_int32_t reg = XPAR_GPIO_P15_STREAMING_REG;
|
||||||
u_int32_t mask = (port == LEFT ? XPAR_GPIO_LFT_STRM_DSBL_MSK
|
u_int32_t mask = (port == LEFT ? XPAR_GPIO_LFT_STRM_DSBL_MSK
|
||||||
: XPAR_GPIO_RGHT_STRM_DSBL_MSK);
|
: XPAR_GPIO_RGHT_STRM_DSBL_MSK);
|
||||||
// invert left/right if bottom
|
|
||||||
if (!Beb_top) {
|
|
||||||
mask = (port == LEFT ? XPAR_GPIO_RGHT_STRM_DSBL_MSK
|
|
||||||
: XPAR_GPIO_LFT_STRM_DSBL_MSK);
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int32_t value = Beb_Read32(csp0base, reg);
|
u_int32_t value = Beb_Read32(csp0base, reg);
|
||||||
// disabling in firmware
|
// disabling in firmware
|
||||||
@ -694,10 +682,6 @@ int Beb_GetTransmissionDelayLeft() {
|
|||||||
return Beb_deactivated_transmission_delay_left;
|
return Beb_deactivated_transmission_delay_left;
|
||||||
}
|
}
|
||||||
u_int32_t offset = TXM_DELAY_LEFT_OFFSET;
|
u_int32_t offset = TXM_DELAY_LEFT_OFFSET;
|
||||||
// invert left/right if bottom
|
|
||||||
if (!Beb_top) {
|
|
||||||
offset = TXM_DELAY_RIGHT_OFFSET;
|
|
||||||
}
|
|
||||||
u_int32_t *csp0base = 0;
|
u_int32_t *csp0base = 0;
|
||||||
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
||||||
if (fd <= 0) {
|
if (fd <= 0) {
|
||||||
@ -722,10 +706,6 @@ int Beb_SetTransmissionDelayLeft(int value) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
u_int32_t offset = TXM_DELAY_LEFT_OFFSET;
|
u_int32_t offset = TXM_DELAY_LEFT_OFFSET;
|
||||||
// invert left/right if bottom
|
|
||||||
if (!Beb_top) {
|
|
||||||
offset = TXM_DELAY_RIGHT_OFFSET;
|
|
||||||
}
|
|
||||||
u_int32_t *csp0base = 0;
|
u_int32_t *csp0base = 0;
|
||||||
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
||||||
if (fd <= 0) {
|
if (fd <= 0) {
|
||||||
@ -746,10 +726,6 @@ int Beb_GetTransmissionDelayRight() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
u_int32_t offset = TXM_DELAY_RIGHT_OFFSET;
|
u_int32_t offset = TXM_DELAY_RIGHT_OFFSET;
|
||||||
// invert left/right if bottom
|
|
||||||
if (!Beb_top) {
|
|
||||||
offset = TXM_DELAY_LEFT_OFFSET;
|
|
||||||
}
|
|
||||||
u_int32_t *csp0base = 0;
|
u_int32_t *csp0base = 0;
|
||||||
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
||||||
if (fd <= 0) {
|
if (fd <= 0) {
|
||||||
@ -774,10 +750,6 @@ int Beb_SetTransmissionDelayRight(int value) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
u_int32_t offset = TXM_DELAY_RIGHT_OFFSET;
|
u_int32_t offset = TXM_DELAY_RIGHT_OFFSET;
|
||||||
// invert left/right if bottom
|
|
||||||
if (!Beb_top) {
|
|
||||||
offset = TXM_DELAY_LEFT_OFFSET;
|
|
||||||
}
|
|
||||||
u_int32_t *csp0base = 0;
|
u_int32_t *csp0base = 0;
|
||||||
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_SYS_BASEADDR);
|
||||||
if (fd <= 0) {
|
if (fd <= 0) {
|
||||||
@ -864,17 +836,11 @@ void Beb_ResetFrameNumber() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int Beb_SetUpTransferParameters(short the_bit_mode) {
|
int Beb_SetUpTransferParameters(short the_bit_mode) {
|
||||||
switch (the_bit_mode) {
|
if (the_bit_mode != 4 && the_bit_mode != 8 && the_bit_mode != 16 &&
|
||||||
case 4:
|
the_bit_mode != 32)
|
||||||
case 8:
|
|
||||||
case 12:
|
|
||||||
case 16:
|
|
||||||
case 32:
|
|
||||||
Beb_bit_mode = the_bit_mode;
|
|
||||||
return 1;
|
|
||||||
default:
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
Beb_bit_mode = the_bit_mode;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Beb_StopAcquisition() {
|
int Beb_StopAcquisition() {
|
||||||
@ -1259,20 +1225,20 @@ int Beb_GetNextFrameNumber(uint64_t *retval, int tengigaEnable) {
|
|||||||
|
|
||||||
else {
|
else {
|
||||||
uint64_t left10g =
|
uint64_t left10g =
|
||||||
Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_10G_LEFT_MSB_OFST);
|
Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_MSB_OFST);
|
||||||
temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_10G_LEFT_LSB_OFST);
|
temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_LSB_OFST);
|
||||||
left10g = ((left10g << 32) | temp) >> 16;
|
left10g = ((left10g << 32) | temp) >> 16;
|
||||||
++left10g; // increment for firmware
|
++left10g; // increment for firmware
|
||||||
|
|
||||||
uint64_t right10g =
|
uint64_t right10g =
|
||||||
Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_10G_LEFT_MSB_OFST);
|
Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_MSB_OFST);
|
||||||
temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_10G_LEFT_LSB_OFST);
|
temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_LSB_OFST);
|
||||||
right10g = ((right10g << 32) | temp) >> 16;
|
right10g = ((right10g << 32) | temp) >> 16;
|
||||||
Beb_close(fd, csp0base);
|
Beb_close(fd, csp0base);
|
||||||
++right10g; // increment for firmware
|
++right10g; // increment for firmware
|
||||||
|
|
||||||
if (left10g != right10g) {
|
if (left10g != right10g) {
|
||||||
LOG(logERROR, ("Retrieved inconsistent frame numbers from 10g left "
|
LOG(logERROR, ("Retrieved inconsistent frame numbers from `0g left "
|
||||||
"%llu and right %llu\n",
|
"%llu and right %llu\n",
|
||||||
(long long int)left10g, (long long int)right10g));
|
(long long int)left10g, (long long int)right10g));
|
||||||
*retval = (left10g > right10g)
|
*retval = (left10g > right10g)
|
||||||
|
@ -15,7 +15,7 @@ int Beb_SetHeaderData(uint64_t src_mac, uint32_t src_ip, uint16_t src_port,
|
|||||||
uint64_t dst_mac, uint32_t dst_ip, uint16_t dst_port);
|
uint64_t dst_mac, uint32_t dst_ip, uint16_t dst_port);
|
||||||
void Beb_AdjustIPChecksum(struct udp_header_type *ip);
|
void Beb_AdjustIPChecksum(struct udp_header_type *ip);
|
||||||
|
|
||||||
int Beb_GetModuleConfiguration(int *master, int *top, int *normal);
|
void Beb_GetModuleConfiguration(int *master, int *top, int *normal);
|
||||||
int Beb_IsTransmitting(int *retval, int tengiga, int waitForDelay);
|
int Beb_IsTransmitting(int *retval, int tengiga, int waitForDelay);
|
||||||
|
|
||||||
void Beb_SetTopVariable(int val);
|
void Beb_SetTopVariable(int val);
|
||||||
|
@ -16,31 +16,91 @@ include_directories(
|
|||||||
../../slsSupportLib/include
|
../../slsSupportLib/include
|
||||||
)
|
)
|
||||||
|
|
||||||
add_executable(eigerDetectorServer_virtual
|
add_executable(eigerDetectorServerMaster_virtual
|
||||||
${src}
|
${src}
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(eigerDetectorServer_virtual
|
target_include_directories(eigerDetectorServerMaster_virtual
|
||||||
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
target_compile_definitions(eigerDetectorServer_virtual
|
target_compile_definitions(eigerDetectorServerMaster_virtual
|
||||||
PUBLIC EIGERD PCCOMPILE STOP_SERVER
|
PUBLIC EIGERD PCCOMPILE STOP_SERVER
|
||||||
PUBLIC VIRTUAL #VIRTUAL_9M
|
PUBLIC VIRTUAL #VIRTUAL_9M
|
||||||
|
PUBLIC VIRTUAL_MASTER
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(eigerDetectorServer_virtual
|
target_link_libraries(eigerDetectorServerMaster_virtual
|
||||||
PUBLIC pthread rt slsProjectCSettings
|
PUBLIC pthread rt slsProjectCSettings
|
||||||
)
|
)
|
||||||
|
|
||||||
set_target_properties(eigerDetectorServer_virtual PROPERTIES
|
set_target_properties(eigerDetectorServerMaster_virtual PROPERTIES
|
||||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||||
)
|
)
|
||||||
|
|
||||||
install(TARGETS eigerDetectorServer_virtual
|
install(TARGETS eigerDetectorServerMaster_virtual
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add_executable(eigerDetectorServerSlaveTop_virtual
|
||||||
|
${src}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(eigerDetectorServerSlaveTop_virtual
|
||||||
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(eigerDetectorServerSlaveTop_virtual
|
||||||
|
PUBLIC EIGERD PCCOMPILE STOP_SERVER
|
||||||
|
PUBLIC VIRTUAL #VIRTUAL_9M
|
||||||
|
PUBLIC VIRTUAL_TOP
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(eigerDetectorServerSlaveTop_virtual
|
||||||
|
PUBLIC pthread rt slsProjectCSettings
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(eigerDetectorServerSlaveTop_virtual PROPERTIES
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS eigerDetectorServerSlaveTop_virtual
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
add_executable(eigerDetectorServerSlaveBottom_virtual
|
||||||
|
${src}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(eigerDetectorServerSlaveBottom_virtual
|
||||||
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(eigerDetectorServerSlaveBottom_virtual
|
||||||
|
PUBLIC EIGERD PCCOMPILE STOP_SERVER
|
||||||
|
PUBLIC VIRTUAL #VIRTUAL_9M
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(eigerDetectorServerSlaveBottom_virtual
|
||||||
|
PUBLIC pthread rt slsProjectCSettings
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(eigerDetectorServerSlaveBottom_virtual PROPERTIES
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS eigerDetectorServerSlaveBottom_virtual
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
configure_file(config_eiger.txt ${CMAKE_BINARY_DIR}/bin/config_eiger.txt COPYONLY)
|
configure_file(config_eiger.txt ${CMAKE_BINARY_DIR}/bin/config_eiger.txt COPYONLY)
|
||||||
configure_file(detid_eiger.txt ${CMAKE_BINARY_DIR}/bin/detid_eiger.txt COPYONLY)
|
configure_file(detid_eiger.txt ${CMAKE_BINARY_DIR}/bin/detid_eiger.txt COPYONLY)
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
const unsigned int Feb_Control_leftAddress = 0x100;
|
const unsigned int Feb_Control_leftAddress = 0x100;
|
||||||
const unsigned int Feb_Control_rightAddress = 0x200;
|
const unsigned int Feb_Control_rightAddress = 0x200;
|
||||||
|
|
||||||
int Feb_Control_master = -1;
|
int Feb_Control_master = 0;
|
||||||
int Feb_Control_normal = 0;
|
int Feb_Control_normal = 0;
|
||||||
int Feb_Control_activated = 1;
|
int Feb_Control_activated = 1;
|
||||||
|
|
||||||
@ -50,16 +50,17 @@ double ratemax = -1;
|
|||||||
// setup
|
// setup
|
||||||
void Feb_Control_activate(int activate) { Feb_Control_activated = activate; }
|
void Feb_Control_activate(int activate) { Feb_Control_activated = activate; }
|
||||||
|
|
||||||
int Feb_Control_FebControl(int normal) {
|
void Feb_Control_FebControl() {
|
||||||
Feb_Control_staticBits = 0;
|
Feb_Control_staticBits = Feb_Control_acquireNReadoutMode =
|
||||||
Feb_Control_acquireNReadoutMode = 0;
|
Feb_Control_triggerMode = Feb_Control_externalEnableMode =
|
||||||
Feb_Control_triggerMode = 0;
|
Feb_Control_subFrameMode = 0;
|
||||||
Feb_Control_externalEnableMode = 0;
|
|
||||||
Feb_Control_subFrameMode = 0;
|
|
||||||
Feb_Control_trimbit_size = 263680;
|
Feb_Control_trimbit_size = 263680;
|
||||||
Feb_Control_last_downloaded_trimbits =
|
Feb_Control_last_downloaded_trimbits =
|
||||||
malloc(Feb_Control_trimbit_size * sizeof(int));
|
malloc(Feb_Control_trimbit_size * sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
|
int Feb_Control_Init(int master, int normal) {
|
||||||
|
Feb_Control_master = master;
|
||||||
Feb_Control_normal = normal;
|
Feb_Control_normal = normal;
|
||||||
Feb_Interface_SetAddress(Feb_Control_rightAddress, Feb_Control_leftAddress);
|
Feb_Interface_SetAddress(Feb_Control_rightAddress, Feb_Control_leftAddress);
|
||||||
if (Feb_Control_activated) {
|
if (Feb_Control_activated) {
|
||||||
@ -930,10 +931,7 @@ unsigned int Feb_Control_ConvertTimeToRegister(float time_in_sec) {
|
|||||||
|
|
||||||
int Feb_Control_PrepareForAcquisition() {
|
int Feb_Control_PrepareForAcquisition() {
|
||||||
LOG(logINFOBLUE, ("Preparing for Acquisition\n"));
|
LOG(logINFOBLUE, ("Preparing for Acquisition\n"));
|
||||||
if (!Feb_Control_PrintAcquisitionSetup()) {
|
Feb_Control_PrintAcquisitionSetup();
|
||||||
LOG(logERROR, ("Could not prepare acquisition\n"));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Feb_Control_Reset() == STATUS_ERROR) {
|
if (Feb_Control_Reset() == STATUS_ERROR) {
|
||||||
LOG(logERROR, ("Trouble reseting daq or data stream\n"));
|
LOG(logERROR, ("Trouble reseting daq or data stream\n"));
|
||||||
@ -990,26 +988,20 @@ int Feb_Control_PrepareForAcquisition() {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Feb_Control_PrintAcquisitionSetup() {
|
void Feb_Control_PrintAcquisitionSetup() {
|
||||||
time_t rawtime;
|
time_t rawtime;
|
||||||
time(&rawtime);
|
time(&rawtime);
|
||||||
struct tm *timeinfo = localtime(&rawtime);
|
struct tm *timeinfo = localtime(&rawtime);
|
||||||
int dr = 0;
|
LOG(logINFO,
|
||||||
if (!Feb_Control_GetDynamicRange(&dr)) {
|
("Starting an exposure: (%s)"
|
||||||
LOG(logERROR, ("Could not print acquisition set up\n"));
|
"\t Dynamic range nbits: %d\n"
|
||||||
return 0;
|
"\t Trigger mode: 0x%x\n"
|
||||||
}
|
"\t Number of exposures: %d\n"
|
||||||
LOG(logINFO, ("Starting an exposure: (%s)"
|
"\t Exsposure time (if used): %f seconds.\n"
|
||||||
"\t Dynamic range nbits: %d\n"
|
"\t Exsposure period (if used): %f seconds.\n\n",
|
||||||
"\t Trigger mode: 0x%x\n"
|
asctime(timeinfo), Feb_Control_GetDynamicRange(),
|
||||||
"\t Number of exposures: %d\n"
|
Feb_Control_triggerMode, Feb_Control_GetNExposures(),
|
||||||
"\t Exsposure time (if used): %f seconds.\n"
|
Feb_Control_exposure_time_in_sec, Feb_Control_exposure_period_in_sec));
|
||||||
"\t Exsposure period (if used): %f seconds.\n\n",
|
|
||||||
asctime(timeinfo), dr, Feb_Control_triggerMode,
|
|
||||||
Feb_Control_GetNExposures(), Feb_Control_exposure_time_in_sec,
|
|
||||||
Feb_Control_exposure_period_in_sec));
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Feb_Control_StartAcquisition() {
|
int Feb_Control_StartAcquisition() {
|
||||||
@ -1177,106 +1169,49 @@ int Feb_Control_SoftwareTrigger(int block) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// parameters
|
// parameters
|
||||||
int Feb_Control_SetDynamicRange(int dr) {
|
int Feb_Control_SetDynamicRange(unsigned int four_eight_sixteen_or_thirtytwo) {
|
||||||
static unsigned int everything_but_bit_mode = DAQ_STATIC_BIT_PROGRAM |
|
static unsigned int everything_but_bit_mode = DAQ_STATIC_BIT_PROGRAM |
|
||||||
DAQ_STATIC_BIT_CHIP_TEST |
|
DAQ_STATIC_BIT_CHIP_TEST |
|
||||||
DAQ_STATIC_BIT_ROTEST;
|
DAQ_STATIC_BIT_ROTEST;
|
||||||
switch (dr) {
|
if (four_eight_sixteen_or_thirtytwo == 4) {
|
||||||
case 4:
|
|
||||||
Feb_Control_staticBits =
|
Feb_Control_staticBits =
|
||||||
DAQ_STATIC_BIT_M4 |
|
DAQ_STATIC_BIT_M4 |
|
||||||
(Feb_Control_staticBits &
|
(Feb_Control_staticBits &
|
||||||
everything_but_bit_mode); // leave test bits in currernt state
|
everything_but_bit_mode); // leave test bits in currernt state
|
||||||
Feb_Control_subFrameMode &= ~DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING;
|
Feb_Control_subFrameMode &= ~DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING;
|
||||||
break;
|
} else if (four_eight_sixteen_or_thirtytwo == 8) {
|
||||||
case 8:
|
|
||||||
Feb_Control_staticBits = DAQ_STATIC_BIT_M8 | (Feb_Control_staticBits &
|
Feb_Control_staticBits = DAQ_STATIC_BIT_M8 | (Feb_Control_staticBits &
|
||||||
everything_but_bit_mode);
|
everything_but_bit_mode);
|
||||||
Feb_Control_subFrameMode &= ~DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING;
|
Feb_Control_subFrameMode &= ~DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING;
|
||||||
break;
|
} else if (four_eight_sixteen_or_thirtytwo == 16) {
|
||||||
case 12:
|
|
||||||
case 16:
|
|
||||||
Feb_Control_staticBits = DAQ_STATIC_BIT_M12 | (Feb_Control_staticBits &
|
Feb_Control_staticBits = DAQ_STATIC_BIT_M12 | (Feb_Control_staticBits &
|
||||||
everything_but_bit_mode);
|
everything_but_bit_mode);
|
||||||
Feb_Control_subFrameMode &= ~DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING;
|
Feb_Control_subFrameMode &= ~DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING;
|
||||||
|
} else if (four_eight_sixteen_or_thirtytwo == 32) {
|
||||||
// disable 16 bit conversion if 12 bit mode (enable if 16 bit)
|
|
||||||
if (!Feb_Control_Disable16bitConversion(dr == 12))
|
|
||||||
return 0;
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
Feb_Control_staticBits = DAQ_STATIC_BIT_M12 | (Feb_Control_staticBits &
|
Feb_Control_staticBits = DAQ_STATIC_BIT_M12 | (Feb_Control_staticBits &
|
||||||
everything_but_bit_mode);
|
everything_but_bit_mode);
|
||||||
Feb_Control_subFrameMode |= DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING;
|
Feb_Control_subFrameMode |= DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING;
|
||||||
break;
|
} else {
|
||||||
default:
|
LOG(logERROR, ("dynamic range (%d) not valid, not setting bit mode.\n",
|
||||||
LOG(logERROR,
|
four_eight_sixteen_or_thirtytwo));
|
||||||
("dynamic range (%d) not valid, not setting bit mode.\n", dr));
|
|
||||||
LOG(logINFO, ("Set dynamic range int must equal 4,8 16, or 32.\n"));
|
LOG(logINFO, ("Set dynamic range int must equal 4,8 16, or 32.\n"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG(logINFO, ("Dynamic range set to %d\n", dr));
|
LOG(logINFO,
|
||||||
|
("Dynamic range set to %d\n", four_eight_sixteen_or_thirtytwo));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Feb_Control_GetDynamicRange(int *retval) {
|
unsigned int Feb_Control_GetDynamicRange() {
|
||||||
if (Feb_Control_subFrameMode & DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING) {
|
if (Feb_Control_subFrameMode & DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING)
|
||||||
*retval = 32;
|
return 32;
|
||||||
} else if (DAQ_STATIC_BIT_M4 & Feb_Control_staticBits) {
|
else if (DAQ_STATIC_BIT_M4 & Feb_Control_staticBits)
|
||||||
*retval = 4;
|
return 4;
|
||||||
} else if (DAQ_STATIC_BIT_M8 & Feb_Control_staticBits) {
|
else if (DAQ_STATIC_BIT_M8 & Feb_Control_staticBits)
|
||||||
*retval = 8;
|
return 8;
|
||||||
} else {
|
|
||||||
int disable16 = 0;
|
|
||||||
if (!Feb_Control_Get16bitConversionDisabled(&disable16)) {
|
|
||||||
LOG(logERROR, ("Could not get dynamic range (12 or 16 bit)\n"));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (disable16) {
|
|
||||||
*retval = 12;
|
|
||||||
} else {
|
|
||||||
*retval = 16;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
return 16;
|
||||||
}
|
|
||||||
|
|
||||||
int Feb_Control_Disable16bitConversion(int disable) {
|
|
||||||
LOG(logINFO, ("%s 16 bit expansion\n", disable ? "Disabling" : "Enabling"));
|
|
||||||
unsigned int regval = 0;
|
|
||||||
if (!Feb_Control_ReadRegister(DAQ_REG_HRDWRE, ®val)) {
|
|
||||||
LOG(logERROR, ("Could not %s 16 bit expansion (bit mode)\n",
|
|
||||||
(disable ? "disable" : "enable")));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (disable) {
|
|
||||||
regval |= DAQ_REG_HRDWRE_DSBL_16BIT_MSK;
|
|
||||||
} else {
|
|
||||||
regval &= ~DAQ_REG_HRDWRE_DSBL_16BIT_MSK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Feb_Control_WriteRegister(DAQ_REG_HRDWRE, regval)) {
|
|
||||||
LOG(logERROR, ("Could not %s 16 bit expansion (bit mode)\n",
|
|
||||||
(disable ? "disable" : "enable")));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Feb_Control_Get16bitConversionDisabled(int *ret) {
|
|
||||||
unsigned int regval = 0;
|
|
||||||
if (!Feb_Control_ReadRegister(DAQ_REG_HRDWRE, ®val)) {
|
|
||||||
LOG(logERROR, ("Could not get 16 bit expansion (bit mode)\n"));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (regval & DAQ_REG_HRDWRE_DSBL_16BIT_MSK) {
|
|
||||||
*ret = 1;
|
|
||||||
} else {
|
|
||||||
*ret = 0;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Feb_Control_SetReadoutSpeed(unsigned int readout_speed) {
|
int Feb_Control_SetReadoutSpeed(unsigned int readout_speed) {
|
||||||
@ -1555,8 +1490,9 @@ int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Feb_Control_SetMaster(enum MASTERINDEX ind) {
|
void Feb_Control_SetMasterVariable(int val) { Feb_Control_master = val; }
|
||||||
|
|
||||||
|
int Feb_Control_SetMaster(enum MASTERINDEX ind) {
|
||||||
uint32_t offset = DAQ_REG_HRDWRE;
|
uint32_t offset = DAQ_REG_HRDWRE;
|
||||||
unsigned int addr[2] = {Feb_Control_leftAddress, Feb_Control_rightAddress};
|
unsigned int addr[2] = {Feb_Control_leftAddress, Feb_Control_rightAddress};
|
||||||
char *master_names[] = {MASTER_NAMES};
|
char *master_names[] = {MASTER_NAMES};
|
||||||
@ -1593,31 +1529,9 @@ int Feb_Control_SetMaster(enum MASTERINDEX ind) {
|
|||||||
LOG(logINFOBLUE, ("%s Master flag to %s Feb\n",
|
LOG(logINFOBLUE, ("%s Master flag to %s Feb\n",
|
||||||
(ind == MASTER_HARDWARE ? "Resetting" : "Overwriting"),
|
(ind == MASTER_HARDWARE ? "Resetting" : "Overwriting"),
|
||||||
master_names[ind]));
|
master_names[ind]));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Feb_Control_SetMasterEffects(int master, int controlServer) {
|
|
||||||
int prevMaster = Feb_Control_master;
|
|
||||||
|
|
||||||
Feb_Control_master = master;
|
|
||||||
// change in master for 9m
|
|
||||||
if (controlServer && prevMaster != Feb_Control_master &&
|
|
||||||
!Feb_Control_normal) {
|
|
||||||
if (prevMaster) {
|
|
||||||
Feb_Control_CloseSerialCommunication();
|
|
||||||
}
|
|
||||||
if (Feb_Control_master) {
|
|
||||||
if (!Feb_Control_OpenSerialCommunication()) {
|
|
||||||
LOG(logERROR, ("Could not intitalize feb control serial "
|
|
||||||
"communication\n"));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int Feb_Control_SetQuad(int val) {
|
int Feb_Control_SetQuad(int val) {
|
||||||
LOG(logINFO, ("Setting Quad to %d in Feb\n", val));
|
LOG(logINFO, ("Setting Quad to %d in Feb\n", val));
|
||||||
Feb_Control_quadMode = val;
|
Feb_Control_quadMode = val;
|
||||||
@ -1640,10 +1554,7 @@ int Feb_Control_SetChipSignalsToTrimQuad(int enable) {
|
|||||||
regval &= ~(DAQ_REG_HRDWRE_PROGRAM_MSK | DAQ_REG_HRDWRE_M8_MSK);
|
regval &= ~(DAQ_REG_HRDWRE_PROGRAM_MSK | DAQ_REG_HRDWRE_M8_MSK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Feb_Control_WriteRegister(DAQ_REG_HRDWRE, regval)) {
|
return Feb_Control_WriteRegister(DAQ_REG_HRDWRE, regval);
|
||||||
LOG(logERROR, ("Could not set chip signals to trim quad\n"));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -1693,7 +1604,7 @@ int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) {
|
|||||||
|
|
||||||
for (int iloop = 0; iloop < 2; ++iloop) {
|
for (int iloop = 0; iloop < 2; ++iloop) {
|
||||||
if (run[iloop]) {
|
if (run[iloop]) {
|
||||||
LOG(logDEBUG1,
|
LOG(logINFO,
|
||||||
("Writing 0x%x to %s 0x%x\n", data, side[iloop], actualOffset));
|
("Writing 0x%x to %s 0x%x\n", data, side[iloop], actualOffset));
|
||||||
if (!Feb_Interface_WriteRegister(addr[iloop], actualOffset, data, 0,
|
if (!Feb_Interface_WriteRegister(addr[iloop], actualOffset, data, 0,
|
||||||
0)) {
|
0)) {
|
||||||
@ -1701,18 +1612,6 @@ int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) {
|
|||||||
side[iloop], actualOffset));
|
side[iloop], actualOffset));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
uint32_t regVal = 0;
|
|
||||||
if (!Feb_Interface_ReadRegister(addr[iloop], actualOffset,
|
|
||||||
®Val)) {
|
|
||||||
LOG(logERROR, ("Could not read %s register\n", addr[iloop]));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (regVal != data) {
|
|
||||||
LOG(logERROR,
|
|
||||||
("Could not write %s register. Write 0x%x, read 0x%x\n",
|
|
||||||
addr[iloop], data, regVal));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1749,8 +1648,8 @@ int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) {
|
|||||||
side[iloop], actualOffset));
|
side[iloop], actualOffset));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
LOG(logDEBUG1, ("Read 0x%x from %s 0x%x\n", value[iloop],
|
LOG(logINFO, ("Read 0x%x from %s 0x%x\n", value[iloop], side[iloop],
|
||||||
side[iloop], actualOffset));
|
actualOffset));
|
||||||
*retval = value[iloop];
|
*retval = value[iloop];
|
||||||
// if not the other (left, not right OR right, not left), return the
|
// if not the other (left, not right OR right, not left), return the
|
||||||
// value
|
// value
|
||||||
@ -1925,11 +1824,7 @@ int64_t Feb_Control_Get_RateTable_Period_in_nsec() {
|
|||||||
|
|
||||||
int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) {
|
int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) {
|
||||||
// period = exptime if 16bit, period = subexptime if 32 bit
|
// period = exptime if 16bit, period = subexptime if 32 bit
|
||||||
int dr = 0;
|
int dr = Feb_Control_GetDynamicRange();
|
||||||
if (!Feb_Control_GetDynamicRange(&dr)) {
|
|
||||||
LOG(logERROR, ("Could not set rate correction tau\n"));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
double period_in_sec =
|
double period_in_sec =
|
||||||
(double)(Feb_Control_GetSubFrameExposureTime()) / (double)1e9;
|
(double)(Feb_Control_GetSubFrameExposureTime()) / (double)1e9;
|
||||||
if (dr == 16)
|
if (dr == 16)
|
||||||
|
@ -7,7 +7,8 @@
|
|||||||
|
|
||||||
// setup
|
// setup
|
||||||
void Feb_Control_activate(int activate);
|
void Feb_Control_activate(int activate);
|
||||||
int Feb_Control_FebControl(int normal);
|
void Feb_Control_FebControl();
|
||||||
|
int Feb_Control_Init(int master, int normal);
|
||||||
int Feb_Control_OpenSerialCommunication();
|
int Feb_Control_OpenSerialCommunication();
|
||||||
void Feb_Control_CloseSerialCommunication();
|
void Feb_Control_CloseSerialCommunication();
|
||||||
int Feb_Control_CheckSetup();
|
int Feb_Control_CheckSetup();
|
||||||
@ -54,7 +55,7 @@ int Feb_Control_ResetChipPartially();
|
|||||||
int Feb_Control_SendBitModeToBebServer();
|
int Feb_Control_SendBitModeToBebServer();
|
||||||
unsigned int Feb_Control_ConvertTimeToRegister(float time_in_sec);
|
unsigned int Feb_Control_ConvertTimeToRegister(float time_in_sec);
|
||||||
int Feb_Control_PrepareForAcquisition();
|
int Feb_Control_PrepareForAcquisition();
|
||||||
int Feb_Control_PrintAcquisitionSetup();
|
void Feb_Control_PrintAcquisitionSetup();
|
||||||
int Feb_Control_StartAcquisition();
|
int Feb_Control_StartAcquisition();
|
||||||
int Feb_Control_StopAcquisition();
|
int Feb_Control_StopAcquisition();
|
||||||
int Feb_Control_IsReadyForTrigger(int *readyForTrigger);
|
int Feb_Control_IsReadyForTrigger(int *readyForTrigger);
|
||||||
@ -62,10 +63,8 @@ int Feb_Control_SendSoftwareTrigger();
|
|||||||
int Feb_Control_SoftwareTrigger(int block);
|
int Feb_Control_SoftwareTrigger(int block);
|
||||||
|
|
||||||
// parameters
|
// parameters
|
||||||
int Feb_Control_SetDynamicRange(int dr);
|
int Feb_Control_SetDynamicRange(unsigned int four_eight_sixteen_or_thirtytwo);
|
||||||
int Feb_Control_GetDynamicRange(int *retval);
|
unsigned int Feb_Control_GetDynamicRange();
|
||||||
int Feb_Control_Disable16bitConversion(int disable);
|
|
||||||
int Feb_Control_Get16bitConversionDisabled();
|
|
||||||
int Feb_Control_SetReadoutSpeed(unsigned int readout_speed);
|
int Feb_Control_SetReadoutSpeed(unsigned int readout_speed);
|
||||||
int Feb_Control_SetReadoutMode(unsigned int readout_mode);
|
int Feb_Control_SetReadoutMode(unsigned int readout_mode);
|
||||||
int Feb_Control_SetTriggerMode(unsigned int trigger_mode);
|
int Feb_Control_SetTriggerMode(unsigned int trigger_mode);
|
||||||
@ -87,8 +86,8 @@ int Feb_Control_Get_Counter_Bit();
|
|||||||
int Feb_Control_SetInterruptSubframe(int val);
|
int Feb_Control_SetInterruptSubframe(int val);
|
||||||
int Feb_Control_GetInterruptSubframe();
|
int Feb_Control_GetInterruptSubframe();
|
||||||
int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right);
|
int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right);
|
||||||
|
void Feb_Control_SetMasterVariable(int val);
|
||||||
int Feb_Control_SetMaster(enum MASTERINDEX ind);
|
int Feb_Control_SetMaster(enum MASTERINDEX ind);
|
||||||
int Feb_Control_SetMasterEffects(int master, int controlServer);
|
|
||||||
int Feb_Control_SetQuad(int val);
|
int Feb_Control_SetQuad(int val);
|
||||||
int Feb_Control_SetChipSignalsToTrimQuad(int enable);
|
int Feb_Control_SetChipSignalsToTrimQuad(int enable);
|
||||||
int Feb_Control_SetReadNRows(int value);
|
int Feb_Control_SetReadNRows(int value);
|
||||||
|
@ -29,8 +29,6 @@
|
|||||||
#define DAQ_REG_HRDWRE_OW_MASTER_MSK (0x00000001 << DAQ_REG_HRDWRE_OW_MASTER_OFST)
|
#define DAQ_REG_HRDWRE_OW_MASTER_MSK (0x00000001 << DAQ_REG_HRDWRE_OW_MASTER_OFST)
|
||||||
#define DAQ_REG_HRDWRE_MASTER_OFST (4)
|
#define DAQ_REG_HRDWRE_MASTER_OFST (4)
|
||||||
#define DAQ_REG_HRDWRE_MASTER_MSK (0x00000001 << DAQ_REG_HRDWRE_MASTER_OFST)
|
#define DAQ_REG_HRDWRE_MASTER_MSK (0x00000001 << DAQ_REG_HRDWRE_MASTER_OFST)
|
||||||
#define DAQ_REG_HRDWRE_DSBL_16BIT_OFST (5)
|
|
||||||
#define DAQ_REG_HRDWRE_DSBL_16BIT_MSK (0x00000001 << DAQ_REG_HRDWRE_DSBL_16BIT_OFST)
|
|
||||||
#define DAQ_REG_HRDWRE_PROGRAM_OFST (30)
|
#define DAQ_REG_HRDWRE_PROGRAM_OFST (30)
|
||||||
#define DAQ_REG_HRDWRE_PROGRAM_MSK (0x00000001 << DAQ_REG_HRDWRE_PROGRAM_OFST)
|
#define DAQ_REG_HRDWRE_PROGRAM_MSK (0x00000001 << DAQ_REG_HRDWRE_PROGRAM_OFST)
|
||||||
#define DAQ_REG_HRDWRE_M8_OFST (31)
|
#define DAQ_REG_HRDWRE_M8_OFST (31)
|
||||||
|
Binary file not shown.
@ -26,17 +26,12 @@ extern int updateFlag;
|
|||||||
extern udpStruct udpDetails[MAX_UDP_DESTINATION];
|
extern udpStruct udpDetails[MAX_UDP_DESTINATION];
|
||||||
extern int numUdpDestinations;
|
extern int numUdpDestinations;
|
||||||
extern const enum detectorType myDetectorType;
|
extern const enum detectorType myDetectorType;
|
||||||
extern int ignoreConfigFileFlag;
|
|
||||||
|
|
||||||
// Global variable from communication_funcs.c
|
// Global variable from communication_funcs.c
|
||||||
extern int isControlServer;
|
extern int isControlServer;
|
||||||
extern void getMacAddressinString(char *cmac, int size, uint64_t mac);
|
extern void getMacAddressinString(char *cmac, int size, uint64_t mac);
|
||||||
extern void getIpAddressinString(char *cip, uint32_t ip);
|
extern void getIpAddressinString(char *cip, uint32_t ip);
|
||||||
|
|
||||||
// Variables that will be exported
|
|
||||||
int masterCommandLine = -1;
|
|
||||||
int topCommandLine = -1;
|
|
||||||
|
|
||||||
int initError = OK;
|
int initError = OK;
|
||||||
int initCheckDone = 0;
|
int initCheckDone = 0;
|
||||||
char initErrorMessage[MAX_STR_LENGTH];
|
char initErrorMessage[MAX_STR_LENGTH];
|
||||||
@ -93,7 +88,6 @@ int eiger_virtual_read_n_rows = 256;
|
|||||||
int eiger_virtual_interrupt_subframe = 0;
|
int eiger_virtual_interrupt_subframe = 0;
|
||||||
int eiger_virtual_left_datastream = 1;
|
int eiger_virtual_left_datastream = 1;
|
||||||
int eiger_virtual_right_datastream = 1;
|
int eiger_virtual_right_datastream = 1;
|
||||||
int eiger_virtual_module_id = 0;
|
|
||||||
#endif
|
#endif
|
||||||
int defaultDacValues[NDAC] = DEFAULT_DAC_VALS;
|
int defaultDacValues[NDAC] = DEFAULT_DAC_VALS;
|
||||||
|
|
||||||
@ -231,23 +225,6 @@ int getModuleId(int *ret, char *mess) {
|
|||||||
return getModuleIdInFile(ret, mess, ID_FILE);
|
return getModuleIdInFile(ret, mess, ID_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int updateModuleId() {
|
|
||||||
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
|
||||||
if (initError == FAIL) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
eiger_virtual_module_id = modid;
|
|
||||||
#else
|
|
||||||
if (Beb_SetModuleId(modid) == FAIL) {
|
|
||||||
initError = FAIL;
|
|
||||||
strcpy(initErrorMessage, ("Could not get module id from the file"));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int64_t getDetectorMAC() {
|
u_int64_t getDetectorMAC() {
|
||||||
char mac[255] = "";
|
char mac[255] = "";
|
||||||
u_int64_t res = 0;
|
u_int64_t res = 0;
|
||||||
@ -327,36 +304,47 @@ u_int32_t getDetectorIP() {
|
|||||||
void initControlServer() {
|
void initControlServer() {
|
||||||
LOG(logINFOBLUE, ("Configuring Control server\n"));
|
LOG(logINFOBLUE, ("Configuring Control server\n"));
|
||||||
if (!updateFlag && initError == OK) {
|
if (!updateFlag && initError == OK) {
|
||||||
if (updateModuleConfiguration() == FAIL) {
|
#ifndef VIRTUAL
|
||||||
initCheckDone = 1;
|
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
||||||
|
#else
|
||||||
|
getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
||||||
|
#endif
|
||||||
|
if (initError == FAIL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
getModuleConfiguration();
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
sharedMemory_lockLocalLink();
|
sharedMemory_lockLocalLink();
|
||||||
|
Feb_Control_SetMasterVariable(master);
|
||||||
Feb_Interface_FebInterface();
|
Feb_Interface_FebInterface();
|
||||||
if (!Feb_Control_FebControl(normal)) {
|
Feb_Control_FebControl();
|
||||||
|
// same addresses for top and bottom
|
||||||
|
if (!Feb_Control_Init(master, normal)) {
|
||||||
initError = FAIL;
|
initError = FAIL;
|
||||||
sprintf(initErrorMessage,
|
sprintf(initErrorMessage, "Could not intitalize feb control\n");
|
||||||
"Could not intitalize eiger detector sever: feb control\n");
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
LOG(logERROR, (initErrorMessage));
|
||||||
initCheckDone = 1;
|
initCheckDone = 1;
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (Feb_Control_SetMasterEffects(master, isControlServer) == FAIL) {
|
// master of 9M, check high voltage serial communication to blackfin
|
||||||
initError = FAIL;
|
if (master && !normal) {
|
||||||
sprintf(initErrorMessage, "Could not intitalize HV for eiger "
|
if (!Feb_Control_OpenSerialCommunication()) {
|
||||||
"detector server: feb control serial "
|
initError = FAIL;
|
||||||
"communication\n");
|
sprintf(
|
||||||
LOG(logERROR, (initErrorMessage));
|
initErrorMessage,
|
||||||
initCheckDone = 1;
|
"Could not intitalize feb control serial communication\n");
|
||||||
sharedMemory_unlockLocalLink();
|
LOG(logERROR, (initErrorMessage));
|
||||||
return;
|
initCheckDone = 1;
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
LOG(logDEBUG1, ("Control server: FEB Initialization done\n"));
|
LOG(logDEBUG1, ("Control server: FEB Initialization done\n"));
|
||||||
Beb_SetTopVariable(top);
|
Beb_SetTopVariable(top);
|
||||||
Beb_Beb();
|
Beb_Beb();
|
||||||
|
Beb_SetModuleId(modid);
|
||||||
LOG(logDEBUG1, ("Control server: BEB Initialization done\n"));
|
LOG(logDEBUG1, ("Control server: BEB Initialization done\n"));
|
||||||
#endif
|
#endif
|
||||||
// also reads config file and deactivates
|
// also reads config file and deactivates
|
||||||
@ -366,126 +354,73 @@ void initControlServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initStopServer() {
|
void initStopServer() {
|
||||||
if (!updateFlag && initError == OK) {
|
|
||||||
// wait a few s (control server is setting top/master from config file/
|
|
||||||
// command line)
|
|
||||||
usleep(WAIT_STOP_SERVER_START);
|
|
||||||
LOG(logINFOBLUE, ("Configuring Stop server\n"));
|
|
||||||
if (updateModuleConfiguration() == FAIL) {
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
sharedMemory_setStop(0);
|
LOG(logINFOBLUE, ("Configuring Stop server\n"));
|
||||||
// force top or master if in config file
|
getModuleConfiguration();
|
||||||
if (readConfigFile() == FAIL) {
|
sharedMemory_setStop(0);
|
||||||
initCheckDone = 1;
|
// get top/master in virtual
|
||||||
return;
|
readConfigFile();
|
||||||
}
|
|
||||||
// force top or master if in command line
|
|
||||||
if (checkCommandLineConfiguration() == FAIL) {
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
// control server read config file and already set up master/top
|
// wait a few s (control server is setting top/master from config file)
|
||||||
sharedMemory_lockLocalLink();
|
usleep(WAIT_STOP_SERVER_START);
|
||||||
Feb_Interface_FebInterface();
|
LOG(logINFOBLUE, ("Configuring Stop server\n"));
|
||||||
if (!Feb_Control_FebControl(normal)) {
|
// exit(-1);
|
||||||
initError = FAIL;
|
getModuleConfiguration();
|
||||||
sprintf(initErrorMessage, "Could not intitalize feb control\n");
|
sharedMemory_lockLocalLink();
|
||||||
LOG(logERROR, (initErrorMessage));
|
Feb_Control_SetMasterVariable(master);
|
||||||
initCheckDone = 1;
|
Feb_Interface_FebInterface();
|
||||||
sharedMemory_unlockLocalLink();
|
Feb_Control_FebControl();
|
||||||
return;
|
// same addresses for top and bottom
|
||||||
}
|
Feb_Control_Init(master, normal);
|
||||||
if (Feb_Control_SetMasterEffects(master, isControlServer) == FAIL) {
|
sharedMemory_unlockLocalLink();
|
||||||
initError = FAIL;
|
LOG(logDEBUG1, ("Stop server: FEB Initialization done\n"));
|
||||||
sprintf(initErrorMessage, "Could not intitalize HV for eiger "
|
|
||||||
"detector server: feb control serial "
|
|
||||||
"communication\n");
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
initCheckDone = 1;
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
LOG(logDEBUG1, ("Stop server: FEB Initialization done\n"));
|
|
||||||
Beb_SetTopVariable(top);
|
|
||||||
Beb_Beb();
|
|
||||||
LOG(logDEBUG1, ("Control server: BEB Initialization done\n"));
|
|
||||||
#endif
|
#endif
|
||||||
// client first connect (from shm) will activate
|
// client first connect (from shm) will activate
|
||||||
if (setActivate(0) == FAIL) {
|
if (setActivate(0) == FAIL) {
|
||||||
initError = FAIL;
|
LOG(logERROR, ("Could not deactivate in stop server\n"));
|
||||||
strcpy(initErrorMessage, "Could not deactivate\n");
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
initCheckDone = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkVirtual9MFlag() {
|
void getModuleConfiguration() {
|
||||||
|
if (initError == FAIL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
|
#ifdef VIRTUAL_MASTER
|
||||||
|
master = 1;
|
||||||
|
top = 1;
|
||||||
|
#else
|
||||||
|
master = 0;
|
||||||
|
#ifdef VIRTUAL_TOP
|
||||||
|
top = 1;
|
||||||
|
#else
|
||||||
|
top = 0;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef VIRTUAL_9M
|
#ifdef VIRTUAL_9M
|
||||||
normal = 0;
|
normal = 0;
|
||||||
#else
|
#else
|
||||||
normal = 1;
|
normal = 1;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int updateModuleConfiguration() {
|
#else
|
||||||
if (getModuleConfiguration(&master, &top, &normal) == FAIL) {
|
Beb_GetModuleConfiguration(&master, &top, &normal);
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
checkVirtual9MFlag();
|
|
||||||
#endif
|
#endif
|
||||||
if (isControlServer) {
|
if (isControlServer) {
|
||||||
LOG(logINFOBLUE,
|
LOG(logINFOBLUE,
|
||||||
("Module: %s %s %s\n", (top ? "TOP" : "BOTTOM"),
|
("Module: %s %s %s\n", (top ? "TOP" : "BOTTOM"),
|
||||||
(master ? "MASTER" : "SLAVE"), (normal ? "NORMAL" : "SPECIAL")));
|
(master ? "MASTER" : "SLAVE"), (normal ? "NORMAL" : "SPECIAL")));
|
||||||
}
|
}
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getModuleConfiguration(int *m, int *t, int *n) {
|
|
||||||
if (initError == FAIL) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
*m = master;
|
|
||||||
*t = top;
|
|
||||||
*n = normal;
|
|
||||||
#else
|
|
||||||
if (Beb_GetModuleConfiguration(m, t, n) == FAIL) {
|
|
||||||
initError = FAIL;
|
|
||||||
strcpy(initErrorMessage, ("Could not get module configuration\n"));
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
LOG(logDEBUG,
|
|
||||||
("module config read: master:%d top:%d normal:%d\n", *m, *t, *n));
|
|
||||||
return OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int readConfigFile() {
|
int readConfigFile() {
|
||||||
|
|
||||||
if (initError == FAIL) {
|
if (initError == FAIL) {
|
||||||
return initError;
|
return initError;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ignoreConfigFileFlag) {
|
|
||||||
LOG(logWARNING, ("Ignoring Config file\n"));
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
// if not found in config file, they will be reset to hardware settings
|
|
||||||
top = -1;
|
|
||||||
master = -1;
|
master = -1;
|
||||||
#endif
|
top = -1;
|
||||||
|
|
||||||
const int fileNameSize = 128;
|
const int fileNameSize = 128;
|
||||||
char fname[fileNameSize];
|
char fname[fileNameSize];
|
||||||
@ -536,54 +471,91 @@ int readConfigFile() {
|
|||||||
|
|
||||||
// top command
|
// top command
|
||||||
if (!strncmp(line, "top", strlen("top"))) {
|
if (!strncmp(line, "top", strlen("top"))) {
|
||||||
int t = -1;
|
|
||||||
// cannot scan values
|
// cannot scan values
|
||||||
if (sscanf(line, "%s %d", command, &t) != 2) {
|
if (sscanf(line, "%s %d", command, &top) != 2) {
|
||||||
sprintf(initErrorMessage,
|
sprintf(initErrorMessage,
|
||||||
"Could not scan top commands from on-board server "
|
"Could not scan top commands from on-board server "
|
||||||
"config file. Line:[%s].\n",
|
"config file. Line:[%s].\n",
|
||||||
line);
|
line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (t != 0 && t != 1) {
|
#ifndef VIRTUAL
|
||||||
sprintf(initErrorMessage,
|
enum TOPINDEX ind = (top == 1 ? OW_TOP : OW_BOTTOM);
|
||||||
"Invalid top argument from on-board server "
|
if (!Beb_SetTop(ind)) {
|
||||||
"config file. Line:[%s].\n",
|
sprintf(
|
||||||
line);
|
initErrorMessage,
|
||||||
|
"Could not overwrite top to %d in Beb from on-board server "
|
||||||
|
"config file. Line:[%s].\n",
|
||||||
|
top, line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (setTop(t == 1 ? OW_TOP : OW_BOTTOM) == FAIL) {
|
sharedMemory_lockLocalLink();
|
||||||
sprintf(initErrorMessage,
|
if (!Feb_Control_SetTop(ind, 1, 1)) {
|
||||||
"Could not set top from config file. Line:[%s].\n",
|
sprintf(
|
||||||
line);
|
initErrorMessage,
|
||||||
|
"Could not overwrite top to %d in Feb from on-board server "
|
||||||
|
"config file. Line:[%s].\n",
|
||||||
|
top, line);
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
|
// validate change
|
||||||
|
int actual_top = -1, temp = -1, temp2 = -1;
|
||||||
|
Beb_GetModuleConfiguration(&temp, &actual_top, &temp2);
|
||||||
|
if (actual_top != top) {
|
||||||
|
sprintf(initErrorMessage, "Could not set top to %d. Read %d\n",
|
||||||
|
top, actual_top);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Beb_SetTopVariable(top);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// master command
|
// master command
|
||||||
else if (!strncmp(line, "master", strlen("master"))) {
|
else if (!strncmp(line, "master", strlen("master"))) {
|
||||||
int m = -1;
|
|
||||||
// cannot scan values
|
// cannot scan values
|
||||||
if (sscanf(line, "%s %d", command, &m) != 2) {
|
if (sscanf(line, "%s %d", command, &master) != 2) {
|
||||||
sprintf(initErrorMessage,
|
sprintf(initErrorMessage,
|
||||||
"Could not scan master commands from on-board server "
|
"Could not scan master commands from on-board server "
|
||||||
"config file. Line:[%s].\n",
|
"config file. Line:[%s].\n",
|
||||||
line);
|
line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (m != 0 && m != 1) {
|
#ifndef VIRTUAL
|
||||||
|
enum MASTERINDEX ind = (master == 1 ? OW_MASTER : OW_SLAVE);
|
||||||
|
if (!Beb_SetMaster(ind)) {
|
||||||
sprintf(initErrorMessage,
|
sprintf(initErrorMessage,
|
||||||
"Invalid master argument from on-board server "
|
"Could not overwrite master to %d in Beb from on-board "
|
||||||
|
"server "
|
||||||
"config file. Line:[%s].\n",
|
"config file. Line:[%s].\n",
|
||||||
line);
|
master, line);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (setMaster(m == 1 ? OW_MASTER : OW_SLAVE) == FAIL) {
|
sharedMemory_lockLocalLink();
|
||||||
|
if (!Feb_Control_SetMaster(ind)) {
|
||||||
sprintf(initErrorMessage,
|
sprintf(initErrorMessage,
|
||||||
"Could not set master from config file. Line:[%s].\n",
|
"Could not overwrite master to %d in Feb from on-board "
|
||||||
line);
|
"server "
|
||||||
|
"config file. Line:[%s].\n",
|
||||||
|
master, line);
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
|
// validate change
|
||||||
|
int actual_master = -1, temp = -1, temp2 = -1;
|
||||||
|
Beb_GetModuleConfiguration(&actual_master, &temp, &temp2);
|
||||||
|
if (actual_master != master) {
|
||||||
|
sprintf(initErrorMessage,
|
||||||
|
"Could not set master to %d. Read %d\n", master,
|
||||||
|
actual_master);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sharedMemory_lockLocalLink();
|
||||||
|
Feb_Control_SetMasterVariable(master);
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// other commands
|
// other commands
|
||||||
@ -604,10 +576,8 @@ int readConfigFile() {
|
|||||||
LOG(logINFO, ("Successfully read config file\n"));
|
LOG(logINFO, ("Successfully read config file\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
// reset to hardware settings if not in config file (if overwritten)
|
// reset to hardware settings if not in config file (if overwritten)
|
||||||
resetToHardwareSettings();
|
resetToHardwareSettings();
|
||||||
#endif
|
|
||||||
|
|
||||||
return initError;
|
return initError;
|
||||||
}
|
}
|
||||||
@ -619,56 +589,55 @@ void resetToHardwareSettings() {
|
|||||||
}
|
}
|
||||||
// top not set in config file
|
// top not set in config file
|
||||||
if (top == -1) {
|
if (top == -1) {
|
||||||
LOG(logINFO, ("Resetting Top to hardware settings\n"));
|
if (!Beb_SetTop(TOP_HARDWARE)) {
|
||||||
if (setTop(TOP_HARDWARE) == FAIL) {
|
|
||||||
initError = FAIL;
|
initError = FAIL;
|
||||||
strcpy(initErrorMessage,
|
strcpy(initErrorMessage,
|
||||||
"Could not reset Top flag to hardware settings.\n");
|
"Could not reset Top flag to Beb hardware settings.\n");
|
||||||
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
sharedMemory_lockLocalLink();
|
||||||
|
if (!Feb_Control_SetTop(TOP_HARDWARE, 1, 1)) {
|
||||||
|
initError = FAIL;
|
||||||
|
strcpy(initErrorMessage,
|
||||||
|
"Could not reset Top flag to Feb hardware settings.\n");
|
||||||
|
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
|
int temp = -1, temp2 = -1;
|
||||||
|
Beb_GetModuleConfiguration(&temp, &top, &temp2);
|
||||||
|
Beb_SetTopVariable(top);
|
||||||
}
|
}
|
||||||
// master not set in config file
|
// master not set in config file
|
||||||
if (master == -1) {
|
if (master == -1) {
|
||||||
LOG(logINFO, ("Resetting Master to hardware settings\n"));
|
if (!Beb_SetMaster(TOP_HARDWARE)) {
|
||||||
if (setMaster(MASTER_HARDWARE) == FAIL) {
|
|
||||||
initError = FAIL;
|
initError = FAIL;
|
||||||
strcpy(initErrorMessage,
|
strcpy(initErrorMessage,
|
||||||
"Could not reset Master flag to hardware settings.\n");
|
"Could not reset Master flag to Beb hardware settings.\n");
|
||||||
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
sharedMemory_lockLocalLink();
|
||||||
|
if (!Feb_Control_SetMaster(TOP_HARDWARE)) {
|
||||||
|
initError = FAIL;
|
||||||
|
strcpy(initErrorMessage,
|
||||||
|
"Could not reset Master flag to Feb hardware settings.\n");
|
||||||
|
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
|
int temp = -1, temp2 = -1;
|
||||||
|
Beb_GetModuleConfiguration(&master, &temp, &temp2);
|
||||||
|
sharedMemory_lockLocalLink();
|
||||||
|
Feb_Control_SetMasterVariable(master);
|
||||||
|
sharedMemory_unlockLocalLink();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int checkCommandLineConfiguration() {
|
|
||||||
if (masterCommandLine != -1) {
|
|
||||||
LOG(logINFO, ("Setting %s from Command Line\n",
|
|
||||||
(masterCommandLine == 1 ? "Master" : "Slave")));
|
|
||||||
if (setMaster(masterCommandLine == 1 ? OW_MASTER : OW_SLAVE) == FAIL) {
|
|
||||||
initError = FAIL;
|
|
||||||
sprintf(initErrorMessage, "Could not set %s from command line.\n",
|
|
||||||
(masterCommandLine == 1 ? "Master" : "Slave"));
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (topCommandLine != -1) {
|
|
||||||
LOG(logINFO, ("Setting %s from Command Line\n",
|
|
||||||
(topCommandLine == 1 ? "Top" : "Bottom")));
|
|
||||||
if (setTop(topCommandLine == 1 ? OW_TOP : OW_BOTTOM) == FAIL) {
|
|
||||||
initError = FAIL;
|
|
||||||
sprintf(initErrorMessage, "Could not set %s from command line.\n",
|
|
||||||
(topCommandLine == 1 ? "Top" : "Bottom"));
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set up detector */
|
/* set up detector */
|
||||||
|
|
||||||
void allocateDetectorStructureMemory() {
|
void allocateDetectorStructureMemory() {
|
||||||
@ -702,29 +671,15 @@ void allocateDetectorStructureMemory() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setupDetector() {
|
void setupDetector() {
|
||||||
|
|
||||||
allocateDetectorStructureMemory();
|
allocateDetectorStructureMemory();
|
||||||
|
|
||||||
// force top or master if in config file
|
|
||||||
if (readConfigFile() == FAIL)
|
|
||||||
return;
|
|
||||||
// force top or master if in command line
|
|
||||||
if (checkCommandLineConfiguration() == FAIL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
LOG(logINFOBLUE,
|
|
||||||
("Module: %s %s %s\n", (top ? "TOP" : "BOTTOM"),
|
|
||||||
(master ? "MASTER" : "SLAVE"), (normal ? "NORMAL" : "SPECIAL")));
|
|
||||||
|
|
||||||
if (updateModuleId() == FAIL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
LOG(logINFOBLUE, ("Setting Default Parameters\n"));
|
|
||||||
resetToDefaultDacs(0);
|
resetToDefaultDacs(0);
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
sharedMemory_setStatus(IDLE);
|
sharedMemory_setStatus(IDLE);
|
||||||
setupUDPCommParameters();
|
setupUDPCommParameters();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
LOG(logINFOBLUE, ("Setting Default Parameters\n"));
|
||||||
// setting default measurement parameters
|
// setting default measurement parameters
|
||||||
setNumFrames(DEFAULT_NUM_FRAMES);
|
setNumFrames(DEFAULT_NUM_FRAMES);
|
||||||
setExpTime(DEFAULT_EXPTIME);
|
setExpTime(DEFAULT_EXPTIME);
|
||||||
@ -764,6 +719,14 @@ void setupDetector() {
|
|||||||
}
|
}
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
#endif
|
#endif
|
||||||
|
// force top or master if in config file
|
||||||
|
if (readConfigFile() == FAIL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LOG(logINFOBLUE,
|
||||||
|
("Module: %s %s %s\n", (top ? "TOP" : "BOTTOM"),
|
||||||
|
(master ? "MASTER" : "SLAVE"), (normal ? "NORMAL" : "SPECIAL")));
|
||||||
|
|
||||||
if (setNumberofDestinations(numUdpDestinations) == FAIL) {
|
if (setNumberofDestinations(numUdpDestinations) == FAIL) {
|
||||||
initError = FAIL;
|
initError = FAIL;
|
||||||
strcpy(initErrorMessage, "Could not set number of udp destinations\n");
|
strcpy(initErrorMessage, "Could not set number of udp destinations\n");
|
||||||
@ -858,38 +821,29 @@ int readRegister(uint32_t offset, uint32_t *retval) {
|
|||||||
/* set parameters - dr, roi */
|
/* set parameters - dr, roi */
|
||||||
|
|
||||||
int setDynamicRange(int dr) {
|
int setDynamicRange(int dr) {
|
||||||
if (dr <= 0) {
|
// setting dr
|
||||||
return FAIL;
|
if (dr > 0) {
|
||||||
}
|
LOG(logDEBUG1, ("Setting dynamic range: %d\n", dr));
|
||||||
#ifdef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
LOG(logINFO, ("Setting dynamic range: %d\n", dr));
|
sharedMemory_lockLocalLink();
|
||||||
#else
|
if (Feb_Control_SetDynamicRange(dr)) {
|
||||||
sharedMemory_lockLocalLink();
|
if (!Beb_SetUpTransferParameters(dr)) {
|
||||||
if (Feb_Control_SetDynamicRange(dr)) {
|
LOG(logERROR, ("Could not set bit mode in the back end\n"));
|
||||||
if (!Beb_SetUpTransferParameters(dr)) {
|
sharedMemory_unlockLocalLink();
|
||||||
LOG(logERROR, ("Could not set bit mode in the back end\n"));
|
return eiger_dynamicrange;
|
||||||
sharedMemory_unlockLocalLink();
|
}
|
||||||
return eiger_dynamicrange;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
#endif
|
|
||||||
eiger_dynamicrange = dr;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getDynamicRange(int *retval) {
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
*retval = eiger_dynamicrange;
|
|
||||||
#else
|
|
||||||
sharedMemory_lockLocalLink();
|
|
||||||
if (!Feb_Control_GetDynamicRange(retval)) {
|
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
return FAIL;
|
#endif
|
||||||
|
eiger_dynamicrange = dr;
|
||||||
}
|
}
|
||||||
|
// getting dr
|
||||||
|
#ifndef VIRTUAL
|
||||||
|
sharedMemory_lockLocalLink();
|
||||||
|
eiger_dynamicrange = Feb_Control_GetDynamicRange();
|
||||||
sharedMemory_unlockLocalLink();
|
sharedMemory_unlockLocalLink();
|
||||||
#endif
|
#endif
|
||||||
return OK;
|
return eiger_dynamicrange;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parameters - readout */
|
/* parameters - readout */
|
||||||
@ -1204,7 +1158,6 @@ int setModule(sls_detector_module myMod, char *mess) {
|
|||||||
|
|
||||||
// if quad, set M8 and PROGRAM manually
|
// if quad, set M8 and PROGRAM manually
|
||||||
if (!Feb_Control_SetChipSignalsToTrimQuad(1)) {
|
if (!Feb_Control_SetChipSignalsToTrimQuad(1)) {
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1217,7 +1170,6 @@ int setModule(sls_detector_module myMod, char *mess) {
|
|||||||
|
|
||||||
// if quad, reset M8 and PROGRAM manually
|
// if quad, reset M8 and PROGRAM manually
|
||||||
if (!Feb_Control_SetChipSignalsToTrimQuad(0)) {
|
if (!Feb_Control_SetChipSignalsToTrimQuad(0)) {
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1227,7 +1179,6 @@ int setModule(sls_detector_module myMod, char *mess) {
|
|||||||
|
|
||||||
// if quad, reset M8 and PROGRAM manually
|
// if quad, reset M8 and PROGRAM manually
|
||||||
if (!Feb_Control_SetChipSignalsToTrimQuad(0)) {
|
if (!Feb_Control_SetChipSignalsToTrimQuad(0)) {
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1499,120 +1450,7 @@ int setHighVoltage(int val) {
|
|||||||
|
|
||||||
/* parameters - timing, extsig */
|
/* parameters - timing, extsig */
|
||||||
|
|
||||||
int setMaster(enum MASTERINDEX m) {
|
int isMaster() { return master; }
|
||||||
char *master_names[] = {MASTER_NAMES};
|
|
||||||
LOG(logINFOBLUE, ("Setting up Master flag as %s\n", master_names[m]));
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
switch (m) {
|
|
||||||
case OW_MASTER:
|
|
||||||
master = 1;
|
|
||||||
break;
|
|
||||||
case OW_SLAVE:
|
|
||||||
master = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// hardware settings (do nothing)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// need to set it only once via the control server
|
|
||||||
if (isControlServer) {
|
|
||||||
if (!Beb_SetMaster(m)) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sharedMemory_lockLocalLink();
|
|
||||||
if (!Feb_Control_SetMaster(m)) {
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
}
|
|
||||||
|
|
||||||
// get and update master variable (cannot get from m, could be hardware)
|
|
||||||
if (isMaster(&master) == FAIL) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
// verify for master and slave (not hardware)
|
|
||||||
if ((m == OW_MASTER && master == 0) || (m == OW_SLAVE && master == 1)) {
|
|
||||||
LOG(logERROR,
|
|
||||||
("could not set master/slave. Master value retrieved %d\n",
|
|
||||||
master));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// feb variable and hv comms (9m)
|
|
||||||
sharedMemory_lockLocalLink();
|
|
||||||
if (Feb_Control_SetMasterEffects(master, isControlServer) == FAIL) {
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
#endif
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int isMaster(int *retval) {
|
|
||||||
int m = -1, t = -1, n = -1;
|
|
||||||
if (getModuleConfiguration(&m, &t, &n) == FAIL) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
*retval = m;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int setTop(enum TOPINDEX t) {
|
|
||||||
char *top_names[] = {TOP_NAMES};
|
|
||||||
LOG(logINFOBLUE, ("Setting up Top flag as %s\n", top_names[t]));
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
switch (t) {
|
|
||||||
case OW_TOP:
|
|
||||||
top = 1;
|
|
||||||
break;
|
|
||||||
case OW_BOTTOM:
|
|
||||||
top = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// hardware settings (do nothing)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (!Beb_SetTop(t)) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
sharedMemory_lockLocalLink();
|
|
||||||
if (!Feb_Control_SetTop(t, 1, 1)) {
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
sharedMemory_unlockLocalLink();
|
|
||||||
|
|
||||||
// get and update top variable(cannot get from t, could be hardware)
|
|
||||||
if (isTop(&top) == FAIL) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
// verify for master and slave (not hardware)
|
|
||||||
if ((t == OW_TOP && top == 0) || (t == OW_BOTTOM && top == 1)) {
|
|
||||||
LOG(logERROR,
|
|
||||||
("could not set top/bottom. Top value retrieved %d\n", top));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
Beb_SetTopVariable(top);
|
|
||||||
#endif
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int isTop(int *retval) {
|
|
||||||
int m = -1, t = -1, n = -1;
|
|
||||||
if (getModuleConfiguration(&m, &t, &n) == FAIL) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
*retval = t;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setTiming(enum timingMode arg) {
|
void setTiming(enum timingMode arg) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
@ -1662,7 +1500,6 @@ enum timingMode getTiming() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* configure mac */
|
/* configure mac */
|
||||||
int getNumberofUDPInterfaces() { return 2; }
|
|
||||||
|
|
||||||
int getNumberofDestinations(int *retval) {
|
int getNumberofDestinations(int *retval) {
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
@ -2085,8 +1922,7 @@ int setRateCorrection(
|
|||||||
else if (custom_tau_in_nsec == -1)
|
else if (custom_tau_in_nsec == -1)
|
||||||
custom_tau_in_nsec = Feb_Control_Get_RateTable_Tau_in_nsec();
|
custom_tau_in_nsec = Feb_Control_Get_RateTable_Tau_in_nsec();
|
||||||
|
|
||||||
int dr = eiger_dynamicrange;
|
int dr = Feb_Control_GetDynamicRange();
|
||||||
|
|
||||||
// get period = subexptime if 32bit , else period = exptime if 16 bit
|
// get period = subexptime if 32bit , else period = exptime if 16 bit
|
||||||
int64_t actual_period =
|
int64_t actual_period =
|
||||||
Feb_Control_GetSubFrameExposureTime(); // already in nsec
|
Feb_Control_GetSubFrameExposureTime(); // already in nsec
|
||||||
@ -2268,9 +2104,6 @@ int setDataStream(enum portPosition port, int enable) {
|
|||||||
LOG(logERROR, ("Invalid setDataStream enable argument: %d\n", enable));
|
LOG(logERROR, ("Invalid setDataStream enable argument: %d\n", enable));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logINFO,
|
|
||||||
("%s 10GbE %s datastream\n", (enable ? "Enabling" : "Disabling"),
|
|
||||||
(port == LEFT ? "left" : "right")));
|
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
if (port == LEFT) {
|
if (port == LEFT) {
|
||||||
eiger_virtual_left_datastream = enable;
|
eiger_virtual_left_datastream = enable;
|
||||||
@ -2448,17 +2281,15 @@ void *start_timer(void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int skipData = 0;
|
int skipData = 0;
|
||||||
int tgEnable = send_to_ten_gig;
|
|
||||||
if (!eiger_virtual_activate ||
|
if (!eiger_virtual_activate ||
|
||||||
(tgEnable &&
|
(!eiger_virtual_left_datastream && !eiger_virtual_right_datastream)) {
|
||||||
(!eiger_virtual_left_datastream && !eiger_virtual_right_datastream))) {
|
|
||||||
skipData = 1;
|
skipData = 1;
|
||||||
LOG(logWARNING, ("Not sending Left and Right datastream\n"));
|
LOG(logWARNING, ("Not sending Left and Right datastream\n"));
|
||||||
}
|
}
|
||||||
if (tgEnable && !eiger_virtual_left_datastream) {
|
if (!eiger_virtual_left_datastream) {
|
||||||
LOG(logWARNING, ("Not sending Left datastream\n"));
|
LOG(logWARNING, ("Not sending Left datastream\n"));
|
||||||
}
|
}
|
||||||
if (tgEnable && !eiger_virtual_right_datastream) {
|
if (!eiger_virtual_right_datastream) {
|
||||||
LOG(logWARNING, ("Not sending Right datastream\n"));
|
LOG(logWARNING, ("Not sending Right datastream\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2468,6 +2299,7 @@ void *start_timer(void *arg) {
|
|||||||
|
|
||||||
int dr = eiger_dynamicrange;
|
int dr = eiger_dynamicrange;
|
||||||
double bytesPerPixel = (double)dr / 8.00;
|
double bytesPerPixel = (double)dr / 8.00;
|
||||||
|
int tgEnable = send_to_ten_gig;
|
||||||
int datasize = (tgEnable ? 4096 : 1024);
|
int datasize = (tgEnable ? 4096 : 1024);
|
||||||
int packetsize = datasize + sizeof(sls_detector_header);
|
int packetsize = datasize + sizeof(sls_detector_header);
|
||||||
int maxPacketsPerFrame = (tgEnable ? 4 : 16) * dr;
|
int maxPacketsPerFrame = (tgEnable ? 4 : 16) * dr;
|
||||||
@ -2485,7 +2317,7 @@ void *start_timer(void *arg) {
|
|||||||
const int maxRows = MAX_ROWS_PER_READOUT;
|
const int maxRows = MAX_ROWS_PER_READOUT;
|
||||||
const int packetsPerFrame = (maxPacketsPerFrame * readNRows) / maxRows;
|
const int packetsPerFrame = (maxPacketsPerFrame * readNRows) / maxRows;
|
||||||
|
|
||||||
LOG(logDEBUG,
|
LOG(logDEBUG1,
|
||||||
(" dr:%d\n bytesperpixel:%f\n tgenable:%d\n datasize:%d\n "
|
(" dr:%d\n bytesperpixel:%f\n tgenable:%d\n datasize:%d\n "
|
||||||
"packetsize:%d\n maxnumpackes:%d\n npixelsx:%d\n databytes:%d\n",
|
"packetsize:%d\n maxnumpackes:%d\n npixelsx:%d\n databytes:%d\n",
|
||||||
dr, bytesPerPixel, tgEnable, datasize, packetsize, maxPacketsPerFrame,
|
dr, bytesPerPixel, tgEnable, datasize, packetsize, maxPacketsPerFrame,
|
||||||
@ -2502,13 +2334,11 @@ void *start_timer(void *arg) {
|
|||||||
npixels /= 2;
|
npixels /= 2;
|
||||||
}
|
}
|
||||||
LOG(logDEBUG1,
|
LOG(logDEBUG1,
|
||||||
("npixels:%d pixelsperpacket:%d\n", npixels, pixelsPerPacket));
|
("pixels:%d pixelsperpacket:%d\n", npixels, pixelsPerPacket));
|
||||||
uint8_t *src = (uint8_t *)imageData;
|
|
||||||
for (int i = 0; i < npixels; ++i) {
|
for (int i = 0; i < npixels; ++i) {
|
||||||
if (i > 0 && i % pixelsPerPacket == 0) {
|
if (i > 0 && i % pixelsPerPacket == 0) {
|
||||||
++pixelVal;
|
++pixelVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (dr) {
|
switch (dr) {
|
||||||
case 4:
|
case 4:
|
||||||
*((uint8_t *)(imageData + i)) =
|
*((uint8_t *)(imageData + i)) =
|
||||||
@ -2523,30 +2353,6 @@ void *start_timer(void *arg) {
|
|||||||
*((uint8_t *)(imageData + i)) =
|
*((uint8_t *)(imageData + i)) =
|
||||||
eiger_virtual_test_mode ? 0xFE : (uint8_t)pixelVal;
|
eiger_virtual_test_mode ? 0xFE : (uint8_t)pixelVal;
|
||||||
break;
|
break;
|
||||||
case 12:
|
|
||||||
if (eiger_virtual_test_mode) {
|
|
||||||
// first 12 bit pixel
|
|
||||||
// first 8 byte
|
|
||||||
*src++ = 0xFE;
|
|
||||||
// second 12bit pixel
|
|
||||||
++i;
|
|
||||||
// second 8 byte
|
|
||||||
*src++ = 0xEF;
|
|
||||||
// third byte
|
|
||||||
*src++ = 0xFF;
|
|
||||||
} else {
|
|
||||||
// first 12 bit pixel
|
|
||||||
// first 8 byte
|
|
||||||
*src++ = (uint8_t)(i & 0xFF);
|
|
||||||
// second 8 byte (first nibble)
|
|
||||||
*src = (uint8_t)((i++ >> 8u) & 0xF);
|
|
||||||
// second 12bit pixel
|
|
||||||
// second 8 byte (second nibble)
|
|
||||||
*src++ |= ((uint8_t)(i & 0xF) << 4u);
|
|
||||||
// third byte
|
|
||||||
*src++ = (uint8_t)((i >> 4u) & 0xFF);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 16:
|
case 16:
|
||||||
*((uint16_t *)(imageData + i * sizeof(uint16_t))) =
|
*((uint16_t *)(imageData + i * sizeof(uint16_t))) =
|
||||||
eiger_virtual_test_mode ? 0xFFE : (uint16_t)pixelVal;
|
eiger_virtual_test_mode ? 0xFFE : (uint16_t)pixelVal;
|
||||||
@ -2601,7 +2407,6 @@ void *start_timer(void *arg) {
|
|||||||
header->version = SLS_DETECTOR_HEADER_VERSION;
|
header->version = SLS_DETECTOR_HEADER_VERSION;
|
||||||
header->frameNumber = frameNr + iframes;
|
header->frameNumber = frameNr + iframes;
|
||||||
header->packetNumber = i;
|
header->packetNumber = i;
|
||||||
header->modId = eiger_virtual_module_id;
|
|
||||||
header->row = row;
|
header->row = row;
|
||||||
header->column = colLeft;
|
header->column = colLeft;
|
||||||
|
|
||||||
@ -2612,7 +2417,6 @@ void *start_timer(void *arg) {
|
|||||||
header->version = SLS_DETECTOR_HEADER_VERSION;
|
header->version = SLS_DETECTOR_HEADER_VERSION;
|
||||||
header->frameNumber = frameNr + iframes;
|
header->frameNumber = frameNr + iframes;
|
||||||
header->packetNumber = i;
|
header->packetNumber = i;
|
||||||
header->modId = eiger_virtual_module_id;
|
|
||||||
header->row = row;
|
header->row = row;
|
||||||
header->column = colRight;
|
header->column = colRight;
|
||||||
if (eiger_virtual_quad_mode) {
|
if (eiger_virtual_quad_mode) {
|
||||||
@ -2623,27 +2427,9 @@ void *start_timer(void *arg) {
|
|||||||
// fill data
|
// fill data
|
||||||
int dstOffset = sizeof(sls_detector_header);
|
int dstOffset = sizeof(sls_detector_header);
|
||||||
int dstOffset2 = sizeof(sls_detector_header);
|
int dstOffset2 = sizeof(sls_detector_header);
|
||||||
if (dr == 12) {
|
{
|
||||||
// multiple of 768,1024,4096
|
|
||||||
int copysize = 256;
|
|
||||||
for (int psize = 0; psize < datasize; psize += copysize) {
|
|
||||||
memcpy(packetData + dstOffset, imageData + srcOffset,
|
|
||||||
copysize);
|
|
||||||
memcpy(packetData2 + dstOffset2, imageData + srcOffset2,
|
|
||||||
copysize);
|
|
||||||
srcOffset += copysize;
|
|
||||||
srcOffset2 += copysize;
|
|
||||||
dstOffset += copysize;
|
|
||||||
dstOffset2 += copysize;
|
|
||||||
|
|
||||||
// reached 1 row (quarter module)
|
|
||||||
if ((srcOffset % npixelsx) == 0) {
|
|
||||||
srcOffset += npixelsx;
|
|
||||||
srcOffset2 += npixelsx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int psize = 0; psize < datasize; psize += npixelsx) {
|
for (int psize = 0; psize < datasize; psize += npixelsx) {
|
||||||
|
|
||||||
if (dr == 32 && tgEnable == 0) {
|
if (dr == 32 && tgEnable == 0) {
|
||||||
memcpy(packetData + dstOffset,
|
memcpy(packetData + dstOffset,
|
||||||
imageData + srcOffset, npixelsx / 2);
|
imageData + srcOffset, npixelsx / 2);
|
||||||
@ -2673,16 +2459,14 @@ void *start_timer(void *arg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((!tgEnable ||
|
if (eiger_virtual_left_datastream && i >= startval &&
|
||||||
(tgEnable && eiger_virtual_left_datastream)) &&
|
i <= endval) {
|
||||||
i >= startval && i <= endval) {
|
|
||||||
usleep(eiger_virtual_transmission_delay_left);
|
usleep(eiger_virtual_transmission_delay_left);
|
||||||
sendUDPPacket(iRxEntry, 0, packetData, packetsize);
|
sendUDPPacket(iRxEntry, 0, packetData, packetsize);
|
||||||
LOG(logDEBUG1, ("Sent left packet: %d\n", i));
|
LOG(logDEBUG1, ("Sent left packet: %d\n", i));
|
||||||
}
|
}
|
||||||
if ((!tgEnable ||
|
if (eiger_virtual_right_datastream && i >= startval &&
|
||||||
(tgEnable && eiger_virtual_right_datastream)) &&
|
i <= endval) {
|
||||||
i >= startval && i <= endval) {
|
|
||||||
usleep(eiger_virtual_transmission_delay_right);
|
usleep(eiger_virtual_transmission_delay_right);
|
||||||
sendUDPPacket(iRxEntry, 1, packetData2, packetsize);
|
sendUDPPacket(iRxEntry, 1, packetData2, packetsize);
|
||||||
LOG(logDEBUG1, ("Sent right packet: %d\n", i));
|
LOG(logDEBUG1, ("Sent right packet: %d\n", i));
|
||||||
@ -2943,9 +2727,9 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) {
|
|||||||
|
|
||||||
int calculateDataBytes() {
|
int calculateDataBytes() {
|
||||||
if (send_to_ten_gig)
|
if (send_to_ten_gig)
|
||||||
return eiger_dynamicrange * ONE_GIGA_CONSTANT * TEN_GIGA_BUFFER_SIZE;
|
return setDynamicRange(-1) * ONE_GIGA_CONSTANT * TEN_GIGA_BUFFER_SIZE;
|
||||||
else
|
else
|
||||||
return eiger_dynamicrange * TEN_GIGA_CONSTANT * ONE_GIGA_BUFFER_SIZE;
|
return setDynamicRange(-1) * TEN_GIGA_CONSTANT * ONE_GIGA_BUFFER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getTotalNumberOfChannels() {
|
int getTotalNumberOfChannels() {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#define LINKED_SERVER_NAME "eigerDetectorServer"
|
#define LINKED_SERVER_NAME "eigerDetectorServer"
|
||||||
|
|
||||||
#define REQUIRED_FIRMWARE_VERSION (30)
|
#define REQUIRED_FIRMWARE_VERSION (29)
|
||||||
// virtual ones renamed for consistency
|
// virtual ones renamed for consistency
|
||||||
// real ones keep previous name for compatibility (already in production)
|
// real ones keep previous name for compatibility (already in production)
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
@ -43,7 +43,7 @@ enum DACINDEX {
|
|||||||
#define DAC_NAMES \
|
#define DAC_NAMES \
|
||||||
"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "VSvN", "Vtgstv", "Vcmp_ll", \
|
"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "VSvN", "Vtgstv", "Vcmp_ll", \
|
||||||
"Vcmp_lr", "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", "Vcmp_rr", "Vcp", \
|
"Vcmp_lr", "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", "Vcmp_rr", "Vcp", \
|
||||||
"Vcn", "Vishaper", "Vthreshold"
|
"Vcn", "Vishaper"
|
||||||
#define DEFAULT_DAC_VALS \
|
#define DEFAULT_DAC_VALS \
|
||||||
{ \
|
{ \
|
||||||
0, /* VSvP */ \
|
0, /* VSvP */ \
|
||||||
|
Binary file not shown.
@ -28,16 +28,12 @@ extern int updateFlag;
|
|||||||
extern int checkModuleFlag;
|
extern int checkModuleFlag;
|
||||||
extern udpStruct udpDetails[MAX_UDP_DESTINATION];
|
extern udpStruct udpDetails[MAX_UDP_DESTINATION];
|
||||||
extern const enum detectorType myDetectorType;
|
extern const enum detectorType myDetectorType;
|
||||||
extern int ignoreConfigFileFlag;
|
|
||||||
|
|
||||||
// Global variable from communication_funcs.c
|
// Global variable from communication_funcs.c
|
||||||
extern int isControlServer;
|
extern int isControlServer;
|
||||||
extern void getMacAddressinString(char *cmac, int size, uint64_t mac);
|
extern void getMacAddressinString(char *cmac, int size, uint64_t mac);
|
||||||
extern void getIpAddressinString(char *cip, uint32_t ip);
|
extern void getIpAddressinString(char *cip, uint32_t ip);
|
||||||
|
|
||||||
// Variables that will be exported
|
|
||||||
int masterCommandLine = -1;
|
|
||||||
|
|
||||||
int initError = OK;
|
int initError = OK;
|
||||||
int initCheckDone = 0;
|
int initCheckDone = 0;
|
||||||
char initErrorMessage[MAX_STR_LENGTH];
|
char initErrorMessage[MAX_STR_LENGTH];
|
||||||
@ -45,7 +41,6 @@ char initErrorMessage[MAX_STR_LENGTH];
|
|||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
pthread_t pthread_virtual_tid;
|
pthread_t pthread_virtual_tid;
|
||||||
int64_t virtual_currentFrameNumber = 2;
|
int64_t virtual_currentFrameNumber = 2;
|
||||||
int virtual_moduleid = 0;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum detectorSettings thisSettings = UNINITIALIZED;
|
enum detectorSettings thisSettings = UNINITIALIZED;
|
||||||
@ -73,7 +68,6 @@ int64_t burstPeriodReg = 0;
|
|||||||
int filterResistor = 0;
|
int filterResistor = 0;
|
||||||
int cdsGain = 0;
|
int cdsGain = 0;
|
||||||
int detPos[2] = {};
|
int detPos[2] = {};
|
||||||
int master = 1;
|
|
||||||
|
|
||||||
int isInitCheckDone() { return initCheckDone; }
|
int isInitCheckDone() { return initCheckDone; }
|
||||||
|
|
||||||
@ -107,9 +101,8 @@ void basictests() {
|
|||||||
}
|
}
|
||||||
// does check only if flag is 0 (by default), set by command line
|
// does check only if flag is 0 (by default), set by command line
|
||||||
if ((!debugflag) && (!updateFlag) &&
|
if ((!debugflag) && (!updateFlag) &&
|
||||||
((validateKernelVersion(KERNEL_DATE_VRSN) == FAIL) ||
|
((validateKernelVersion(KERNEL_DATE_VRSN) == FAIL) || (checkType() == FAIL) ||
|
||||||
(checkType() == FAIL) || (testFpga() == FAIL) ||
|
(testFpga() == FAIL) || (testBus() == FAIL))) {
|
||||||
(testBus() == FAIL))) {
|
|
||||||
sprintf(initErrorMessage,
|
sprintf(initErrorMessage,
|
||||||
"Could not pass basic tests of FPGA and bus. Dangerous to "
|
"Could not pass basic tests of FPGA and bus. Dangerous to "
|
||||||
"continue. (Firmware version:0x%llx) \n",
|
"continue. (Firmware version:0x%llx) \n",
|
||||||
@ -300,18 +293,6 @@ void setModuleId(int modid) {
|
|||||||
bus_r(MOD_ID_REG) | ((modid << MOD_ID_OFST) & MOD_ID_MSK));
|
bus_r(MOD_ID_REG) | ((modid << MOD_ID_OFST) & MOD_ID_MSK));
|
||||||
}
|
}
|
||||||
|
|
||||||
int updateModuleId() {
|
|
||||||
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
|
||||||
if (initError == FAIL) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
virtual_moduleid = modid;
|
|
||||||
#endif
|
|
||||||
setModuleId(modid);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int64_t getDetectorMAC() {
|
u_int64_t getDetectorMAC() {
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
return 0;
|
return 0;
|
||||||
@ -375,27 +356,16 @@ void initControlServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initStopServer() {
|
void initStopServer() {
|
||||||
if (!updateFlag && initError == OK) {
|
|
||||||
usleep(CTRL_SRVR_INIT_TIME_US);
|
usleep(CTRL_SRVR_INIT_TIME_US);
|
||||||
LOG(logINFOBLUE, ("Configuring Stop server\n"));
|
if (mapCSP0() == FAIL) {
|
||||||
if (mapCSP0() == FAIL) {
|
LOG(logERROR,
|
||||||
initError = FAIL;
|
("Stop Server: Map Fail. Dangerous to continue. Goodbye!\n"));
|
||||||
strcpy(initErrorMessage,
|
exit(EXIT_FAILURE);
|
||||||
"Stop Server: Map Fail. Dangerous to continue. Goodbye!\n");
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
sharedMemory_setStop(0);
|
|
||||||
// not reading config file (nothing of interest to stop server)
|
|
||||||
if (checkCommandLineConfiguration() == FAIL) {
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
initCheckDone = 1;
|
#ifdef VIRTUAL
|
||||||
|
sharedMemory_setStop(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set up detector */
|
/* set up detector */
|
||||||
@ -508,13 +478,12 @@ void setupDetector() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// master for virtual
|
// set module id in register
|
||||||
if (checkCommandLineConfiguration() == FAIL)
|
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
||||||
return;
|
if (initError == FAIL) {
|
||||||
|
|
||||||
if (updateModuleId() == FAIL) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
setModuleId(modid);
|
||||||
|
|
||||||
setBurstMode(DEFAULT_BURST_MODE);
|
setBurstMode(DEFAULT_BURST_MODE);
|
||||||
setFilterResistor(DEFAULT_FILTER_RESISTOR);
|
setFilterResistor(DEFAULT_FILTER_RESISTOR);
|
||||||
@ -626,11 +595,6 @@ int readConfigFile() {
|
|||||||
return initError;
|
return initError;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ignoreConfigFileFlag) {
|
|
||||||
LOG(logWARNING, ("Ignoring Config file\n"));
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// require a sleep before and after the rst dac signal
|
// require a sleep before and after the rst dac signal
|
||||||
usleep(INITIAL_STARTUP_WAIT);
|
usleep(INITIAL_STARTUP_WAIT);
|
||||||
|
|
||||||
@ -955,21 +919,6 @@ int readConfigFile() {
|
|||||||
return initError;
|
return initError;
|
||||||
}
|
}
|
||||||
|
|
||||||
int checkCommandLineConfiguration() {
|
|
||||||
if (masterCommandLine != -1) {
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
master = masterCommandLine;
|
|
||||||
#else
|
|
||||||
initError = FAIL;
|
|
||||||
strcpy(initErrorMessage,
|
|
||||||
"Cannot set Master from command line for this detector. "
|
|
||||||
"Should have been caught before!\n");
|
|
||||||
return FAIL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* firmware functions (resets) */
|
/* firmware functions (resets) */
|
||||||
|
|
||||||
void cleanFifos() {
|
void cleanFifos() {
|
||||||
@ -998,16 +947,7 @@ void resetPeripheral() {
|
|||||||
|
|
||||||
/* set parameters - dr, roi */
|
/* set parameters - dr, roi */
|
||||||
|
|
||||||
int setDynamicRange(int dr) {
|
int setDynamicRange(int dr) { return DYNAMIC_RANGE; }
|
||||||
if (dr == 16)
|
|
||||||
return OK;
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getDynamicRange(int *retval) {
|
|
||||||
*retval = DYNAMIC_RANGE;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parameters - timer */
|
/* parameters - timer */
|
||||||
void setNumFrames(int64_t val) {
|
void setNumFrames(int64_t val) {
|
||||||
@ -1497,11 +1437,6 @@ int setHighVoltage(int val) {
|
|||||||
|
|
||||||
/* parameters - timing */
|
/* parameters - timing */
|
||||||
|
|
||||||
int isMaster(int *retval) {
|
|
||||||
*retval = master;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void updatingRegisters() {
|
void updatingRegisters() {
|
||||||
LOG(logINFO, ("\tUpdating registers\n"));
|
LOG(logINFO, ("\tUpdating registers\n"));
|
||||||
// burst
|
// burst
|
||||||
@ -1981,17 +1916,9 @@ int checkDetectorType() {
|
|||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (abs(type - TYPE_GOTTHARD2_25UM_MASTER_MODULE_VAL) <= TYPE_TOLERANCE) {
|
if ((abs(type - TYPE_GOTTHARD2_MODULE_VAL) > TYPE_TOLERANCE) &&
|
||||||
LOG(logINFOBLUE, ("MASTER 25um Module\n"));
|
(abs(type - TYPE_GOTTHARD2_25UM_MASTER_MODULE_VAL) > TYPE_TOLERANCE) &&
|
||||||
master = 1;
|
(abs(type - TYPE_GOTTHARD2_25UM_SLAVE_MODULE_VAL) > TYPE_TOLERANCE)) {
|
||||||
} else if (abs(type - TYPE_GOTTHARD2_25UM_SLAVE_MODULE_VAL) <=
|
|
||||||
TYPE_TOLERANCE) {
|
|
||||||
master = 0;
|
|
||||||
LOG(logINFOBLUE, ("SLAVE 25um Module\n"));
|
|
||||||
} else if (abs(type - TYPE_GOTTHARD2_MODULE_VAL) <= TYPE_TOLERANCE) {
|
|
||||||
master = -1;
|
|
||||||
LOG(logINFOBLUE, ("50um Module\n"));
|
|
||||||
} else {
|
|
||||||
LOG(logERROR,
|
LOG(logERROR,
|
||||||
("Wrong Module attached! Expected %d, %d or %d for Gotthard2, got "
|
("Wrong Module attached! Expected %d, %d or %d for Gotthard2, got "
|
||||||
"%d\n",
|
"%d\n",
|
||||||
@ -2156,56 +2083,40 @@ int setReadoutSpeed(int val) {
|
|||||||
case G2_108MHZ:
|
case G2_108MHZ:
|
||||||
LOG(logINFOBLUE, ("Setting readout speed to 108 MHz\n"));
|
LOG(logINFOBLUE, ("Setting readout speed to 108 MHz\n"));
|
||||||
if (setClockDivider(READOUT_C0, SPEED_108_CLKDIV_0) == FAIL) {
|
if (setClockDivider(READOUT_C0, SPEED_108_CLKDIV_0) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to "
|
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to set readout clk 0 to %d\n", SPEED_108_CLKDIV_0));
|
||||||
"set readout clk 0 to %d\n",
|
|
||||||
SPEED_108_CLKDIV_0));
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (setClockDivider(READOUT_C1, SPEED_108_CLKDIV_1) == FAIL) {
|
if (setClockDivider(READOUT_C1, SPEED_108_CLKDIV_1) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to "
|
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to set readout clk 1 to %d\n", SPEED_108_CLKDIV_1));
|
||||||
"set readout clk 1 to %d\n",
|
|
||||||
SPEED_108_CLKDIV_1));
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (setPhase(READOUT_C1, SPEED_108_CLKPHASE_DEG_1, 1) == FAIL) {
|
if (setPhase(READOUT_C1, SPEED_108_CLKPHASE_DEG_1, 1) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to "
|
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to set clk phase 1 %d deg\n", SPEED_108_CLKPHASE_DEG_1));
|
||||||
"set clk phase 1 %d deg\n",
|
|
||||||
SPEED_108_CLKPHASE_DEG_1));
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
setDBITPipeline(SPEED_144_DBIT_PIPELINE);
|
setDBITPipeline(SPEED_144_DBIT_PIPELINE);
|
||||||
if (getDBITPipeline() != SPEED_144_DBIT_PIPELINE) {
|
if (getDBITPipeline() != SPEED_144_DBIT_PIPELINE) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to "
|
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to set dbitpipeline to %d \n", SPEED_144_DBIT_PIPELINE));
|
||||||
"set dbitpipeline to %d \n",
|
|
||||||
SPEED_144_DBIT_PIPELINE));
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case G2_144MHZ:
|
case G2_144MHZ:
|
||||||
LOG(logINFOBLUE, ("Setting readout speed to 144 MHz\n"));
|
LOG(logINFOBLUE, ("Setting readout speed to 144 MHz\n"));
|
||||||
if (setClockDivider(READOUT_C0, SPEED_144_CLKDIV_0) == FAIL) {
|
if (setClockDivider(READOUT_C0, SPEED_144_CLKDIV_0) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to "
|
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to set readout clk 0 to %d\n", SPEED_144_CLKDIV_0));
|
||||||
"set readout clk 0 to %d\n",
|
|
||||||
SPEED_144_CLKDIV_0));
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (setClockDivider(READOUT_C1, SPEED_144_CLKDIV_1) == FAIL) {
|
if (setClockDivider(READOUT_C1, SPEED_144_CLKDIV_1) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to "
|
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to set readout clk 1 to %d\n", SPEED_144_CLKDIV_1));
|
||||||
"set readout clk 1 to %d\n",
|
|
||||||
SPEED_144_CLKDIV_1));
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (setPhase(READOUT_C1, SPEED_144_CLKPHASE_DEG_1, 1) == FAIL) {
|
if (setPhase(READOUT_C1, SPEED_144_CLKPHASE_DEG_1, 1) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to "
|
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to set clk phase 1 %d deg\n", SPEED_144_CLKPHASE_DEG_1));
|
||||||
"set clk phase 1 %d deg\n",
|
|
||||||
SPEED_144_CLKPHASE_DEG_1));
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
setDBITPipeline(SPEED_144_DBIT_PIPELINE);
|
setDBITPipeline(SPEED_144_DBIT_PIPELINE);
|
||||||
if (getDBITPipeline() != SPEED_144_DBIT_PIPELINE) {
|
if (getDBITPipeline() != SPEED_144_DBIT_PIPELINE) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to "
|
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to set dbitpipeline to %d \n", SPEED_144_DBIT_PIPELINE));
|
||||||
"set dbitpipeline to %d \n",
|
|
||||||
SPEED_144_DBIT_PIPELINE));
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -3094,7 +3005,7 @@ void *start_timer(void *arg) {
|
|||||||
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
||||||
header->frameNumber = virtual_currentFrameNumber;
|
header->frameNumber = virtual_currentFrameNumber;
|
||||||
header->packetNumber = 0;
|
header->packetNumber = 0;
|
||||||
header->modId = virtual_moduleid;
|
header->modId = 0;
|
||||||
header->row = detPos[X];
|
header->row = detPos[X];
|
||||||
header->column = detPos[Y];
|
header->column = detPos[Y];
|
||||||
// fill data
|
// fill data
|
||||||
|
Binary file not shown.
@ -25,11 +25,9 @@ extern int debugflag;
|
|||||||
extern int updateFlag;
|
extern int updateFlag;
|
||||||
extern udpStruct udpDetails[MAX_UDP_DESTINATION];
|
extern udpStruct udpDetails[MAX_UDP_DESTINATION];
|
||||||
extern const enum detectorType myDetectorType;
|
extern const enum detectorType myDetectorType;
|
||||||
extern int ignoreConfigFileFlag;
|
|
||||||
|
|
||||||
// Variables that will be exported
|
// Variables that will be exported
|
||||||
int phaseShift = DEFAULT_PHASE_SHIFT;
|
int phaseShift = DEFAULT_PHASE_SHIFT;
|
||||||
int masterCommandLine = -1;
|
|
||||||
|
|
||||||
// Global variable from communication_funcs.c
|
// Global variable from communication_funcs.c
|
||||||
extern int isControlServer;
|
extern int isControlServer;
|
||||||
@ -361,28 +359,16 @@ void initControlServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initStopServer() {
|
void initStopServer() {
|
||||||
if (!updateFlag && initError == OK) {
|
if (mapCSP0() == FAIL) {
|
||||||
usleep(CTRL_SRVR_INIT_TIME_US);
|
LOG(logERROR,
|
||||||
LOG(logINFOBLUE, ("Configuring Stop server\n"));
|
("Stop Server: Map Fail. Dangerous to continue. Goodbye!\n"));
|
||||||
if (mapCSP0() == FAIL) {
|
exit(EXIT_FAILURE);
|
||||||
initError = FAIL;
|
|
||||||
strcpy(initErrorMessage,
|
|
||||||
"Stop Server: Map Fail. Dangerous to continue. Goodbye!\n");
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
sharedMemory_setStop(0);
|
|
||||||
#endif
|
|
||||||
// to get master from file
|
|
||||||
if (readConfigFile() == FAIL ||
|
|
||||||
checkCommandLineConfiguration() == FAIL) {
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
initCheckDone = 1;
|
#ifdef VIRTUAL
|
||||||
|
sharedMemory_setStop(0);
|
||||||
|
#endif
|
||||||
|
// to get master from file
|
||||||
|
readConfigFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set up detector */
|
/* set up detector */
|
||||||
@ -435,13 +421,6 @@ void setupDetector() {
|
|||||||
setROI(rois); // set adcsyncreg, daqreg, chipofinterestreg, cleanfifos,
|
setROI(rois); // set adcsyncreg, daqreg, chipofinterestreg, cleanfifos,
|
||||||
setGbitReadout();
|
setGbitReadout();
|
||||||
|
|
||||||
// no config file or not first time server
|
|
||||||
if (readConfigFile() == FAIL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (checkCommandLineConfiguration() == FAIL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// master, slave (25um)
|
// master, slave (25um)
|
||||||
setMasterSlaveConfiguration();
|
setMasterSlaveConfiguration();
|
||||||
|
|
||||||
@ -645,16 +624,6 @@ void setGbitReadout() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int readConfigFile() {
|
int readConfigFile() {
|
||||||
|
|
||||||
if (initError == FAIL) {
|
|
||||||
return initError;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ignoreConfigFileFlag) {
|
|
||||||
LOG(logWARNING, ("Ignoring Config file\n"));
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int fileNameSize = 128;
|
const int fileNameSize = 128;
|
||||||
char fname[fileNameSize];
|
char fname[fileNameSize];
|
||||||
if (getAbsPath(fname, fileNameSize, CONFIG_FILE) == FAIL) {
|
if (getAbsPath(fname, fileNameSize, CONFIG_FILE) == FAIL) {
|
||||||
@ -678,6 +647,7 @@ int readConfigFile() {
|
|||||||
memset(key, 0, keySize);
|
memset(key, 0, keySize);
|
||||||
char value[keySize];
|
char value[keySize];
|
||||||
memset(value, 0, keySize);
|
memset(value, 0, keySize);
|
||||||
|
int scan = OK;
|
||||||
|
|
||||||
// keep reading a line
|
// keep reading a line
|
||||||
while (fgets(line, lineSize, fd)) {
|
while (fgets(line, lineSize, fd)) {
|
||||||
@ -697,22 +667,19 @@ int readConfigFile() {
|
|||||||
master = 0;
|
master = 0;
|
||||||
LOG(logINFOBLUE, ("\tSlave or No Master\n"));
|
LOG(logINFOBLUE, ("\tSlave or No Master\n"));
|
||||||
} else {
|
} else {
|
||||||
initError = FAIL;
|
LOG(logERROR,
|
||||||
sprintf(
|
("\tCould not scan masterflags %s value from config file\n",
|
||||||
initErrorMessage,
|
value));
|
||||||
"Could not scan masterflags %s value from config file\n",
|
scan = FAIL;
|
||||||
value);
|
break;
|
||||||
LOG(logERROR, (initErrorMessage))
|
|
||||||
fclose(fd);
|
|
||||||
return FAIL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// not first server since detector power on
|
// not first server since detector power on
|
||||||
if (!detectorFirstServer) {
|
if (!detectorFirstServer) {
|
||||||
LOG(logWARNING, ("\tServer has been started up before. "
|
LOG(logINFOBLUE, ("\tServer has been started up before. "
|
||||||
"Ignoring rest of config file\n"));
|
"Ignoring rest of config file\n"));
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
return OK;
|
return FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -721,14 +688,11 @@ int readConfigFile() {
|
|||||||
// convert value to int
|
// convert value to int
|
||||||
int ival = 0;
|
int ival = 0;
|
||||||
if (sscanf(value, "%d", &ival) <= 0) {
|
if (sscanf(value, "%d", &ival) <= 0) {
|
||||||
initError = FAIL;
|
LOG(logERROR, ("\tCould not scan parameter %s value %s from "
|
||||||
sprintf(initErrorMessage,
|
"config file\n",
|
||||||
"Could not scan parameter %s value %s from "
|
key, value));
|
||||||
"config file\n",
|
scan = FAIL;
|
||||||
key, value);
|
break;
|
||||||
LOG(logERROR, (initErrorMessage))
|
|
||||||
fclose(fd);
|
|
||||||
return FAIL;
|
|
||||||
}
|
}
|
||||||
// set value
|
// set value
|
||||||
if (!strcasecmp(key, "masterdefaultdelay"))
|
if (!strcasecmp(key, "masterdefaultdelay"))
|
||||||
@ -746,16 +710,16 @@ int readConfigFile() {
|
|||||||
else if (!strcasecmp(key, "startacqdelay"))
|
else if (!strcasecmp(key, "startacqdelay"))
|
||||||
startacqdelay = ival;
|
startacqdelay = ival;
|
||||||
else {
|
else {
|
||||||
initError = FAIL;
|
LOG(logERROR,
|
||||||
sprintf(initErrorMessage,
|
("\tCould not scan parameter %s from config file\n", key));
|
||||||
"Could not scan parameter %s from config file\n", key);
|
scan = FAIL;
|
||||||
LOG(logERROR, (initErrorMessage))
|
break;
|
||||||
fclose(fd);
|
|
||||||
return FAIL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
|
if (scan == FAIL)
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
LOG(logINFOBLUE,
|
LOG(logINFOBLUE,
|
||||||
("\tmasterdefaultdelay:%d\n"
|
("\tmasterdefaultdelay:%d\n"
|
||||||
@ -770,28 +734,13 @@ int readConfigFile() {
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int checkCommandLineConfiguration() {
|
|
||||||
if (masterCommandLine != -1) {
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
master = masterCommandLine;
|
|
||||||
#else
|
|
||||||
initError = FAIL;
|
|
||||||
strcpy(initErrorMessage,
|
|
||||||
"Cannot set Master from command line for this detector. "
|
|
||||||
"Should have been caught before!\n");
|
|
||||||
return FAIL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setMasterSlaveConfiguration() {
|
void setMasterSlaveConfiguration() {
|
||||||
// not the first time its being read
|
|
||||||
if (!detectorFirstServer) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG(logINFO, ("Reading Master Slave Configuration\n"));
|
LOG(logINFO, ("Reading Master Slave Configuration\n"));
|
||||||
|
|
||||||
|
// no config file or not first time server
|
||||||
|
if (readConfigFile() == FAIL)
|
||||||
|
return;
|
||||||
|
|
||||||
// master configuration
|
// master configuration
|
||||||
if (master) {
|
if (master) {
|
||||||
// master default delay set, so reset delay
|
// master default delay set, so reset delay
|
||||||
@ -839,16 +788,7 @@ void setMasterSlaveConfiguration() {
|
|||||||
|
|
||||||
/* set parameters - dr, roi */
|
/* set parameters - dr, roi */
|
||||||
|
|
||||||
int setDynamicRange(int dr) {
|
int setDynamicRange(int dr) { return DYNAMIC_RANGE; }
|
||||||
if (dr == 16)
|
|
||||||
return OK;
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getDynamicRange(int *retval) {
|
|
||||||
*retval = DYNAMIC_RANGE;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int setROI(ROI arg) {
|
int setROI(ROI arg) {
|
||||||
|
|
||||||
@ -1298,10 +1238,7 @@ int setHighVoltage(int val) {
|
|||||||
|
|
||||||
/* parameters - timing, extsig */
|
/* parameters - timing, extsig */
|
||||||
|
|
||||||
int isMaster(int *retval) {
|
int isMaster() { return master; }
|
||||||
*retval = master;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setTiming(enum timingMode arg) {
|
void setTiming(enum timingMode arg) {
|
||||||
u_int32_t addr = EXT_SIGNAL_REG;
|
u_int32_t addr = EXT_SIGNAL_REG;
|
||||||
@ -1362,8 +1299,6 @@ int getExtSignal(int signalIndex) {
|
|||||||
|
|
||||||
/* configure mac */
|
/* configure mac */
|
||||||
|
|
||||||
int getNumberofUDPInterfaces() { return 1; }
|
|
||||||
|
|
||||||
void calcChecksum(mac_conf *mac, int sourceip, int destip) {
|
void calcChecksum(mac_conf *mac, int sourceip, int destip) {
|
||||||
mac->ip.ip_ver = 0x4;
|
mac->ip.ip_ver = 0x4;
|
||||||
mac->ip.ip_ihl = 0x5;
|
mac->ip.ip_ihl = 0x5;
|
||||||
|
Binary file not shown.
@ -28,7 +28,6 @@ extern int updateFlag;
|
|||||||
extern udpStruct udpDetails[MAX_UDP_DESTINATION];
|
extern udpStruct udpDetails[MAX_UDP_DESTINATION];
|
||||||
extern int numUdpDestinations;
|
extern int numUdpDestinations;
|
||||||
extern const enum detectorType myDetectorType;
|
extern const enum detectorType myDetectorType;
|
||||||
extern int ignoreConfigFileFlag;
|
|
||||||
|
|
||||||
// Global variable from communication_funcs.c
|
// Global variable from communication_funcs.c
|
||||||
extern int isControlServer;
|
extern int isControlServer;
|
||||||
@ -393,29 +392,19 @@ void initControlServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initStopServer() {
|
void initStopServer() {
|
||||||
if (!updateFlag && initError == OK) {
|
|
||||||
usleep(CTRL_SRVR_INIT_TIME_US);
|
usleep(CTRL_SRVR_INIT_TIME_US);
|
||||||
LOG(logINFOBLUE, ("Configuring Stop server\n"));
|
if (mapCSP0() == FAIL) {
|
||||||
if (mapCSP0() == FAIL) {
|
LOG(logERROR,
|
||||||
initError = FAIL;
|
("Stop Server: Map Fail. Dangerous to continue. Goodbye!\n"));
|
||||||
strcpy(initErrorMessage,
|
exit(EXIT_FAILURE);
|
||||||
"Stop Server: Map Fail. Dangerous to continue. Goodbye!\n");
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (readConfigFile() == FAIL) {
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
sharedMemory_setStop(0);
|
|
||||||
// temp threshold and reset event (read by stop server)
|
|
||||||
setThresholdTemperature(DEFAULT_TMP_THRSHLD);
|
|
||||||
setTemperatureEvent(0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
initCheckDone = 1;
|
#ifdef VIRTUAL
|
||||||
|
sharedMemory_setStop(0);
|
||||||
|
// temp threshold and reset event (read by stop server)
|
||||||
|
setThresholdTemperature(DEFAULT_TMP_THRSHLD);
|
||||||
|
setTemperatureEvent(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set up detector */
|
/* set up detector */
|
||||||
@ -654,11 +643,6 @@ int readConfigFile() {
|
|||||||
return initError;
|
return initError;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ignoreConfigFileFlag) {
|
|
||||||
LOG(logWARNING, ("Ignoring Config file\n"));
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int fileNameSize = 128;
|
const int fileNameSize = 128;
|
||||||
char fname[fileNameSize];
|
char fname[fileNameSize];
|
||||||
if (getAbsPath(fname, fileNameSize, CONFIG_FILE) == FAIL) {
|
if (getAbsPath(fname, fileNameSize, CONFIG_FILE) == FAIL) {
|
||||||
@ -812,16 +796,7 @@ void resetPeripheral() {
|
|||||||
|
|
||||||
/* set parameters - dr, roi */
|
/* set parameters - dr, roi */
|
||||||
|
|
||||||
int setDynamicRange(int dr) {
|
int setDynamicRange(int dr) { return DYNAMIC_RANGE; }
|
||||||
if (dr == 16)
|
|
||||||
return OK;
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getDynamicRange(int *retval) {
|
|
||||||
*retval = DYNAMIC_RANGE;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setADCInvertRegister(uint32_t val) {
|
void setADCInvertRegister(uint32_t val) {
|
||||||
LOG(logINFO, ("Setting ADC Port Invert Reg to 0x%x\n", val));
|
LOG(logINFO, ("Setting ADC Port Invert Reg to 0x%x\n", val));
|
||||||
@ -1700,7 +1675,7 @@ int setReadNRows(int value) {
|
|||||||
}
|
}
|
||||||
if (isHardwareVersion2()) {
|
if (isHardwareVersion2()) {
|
||||||
LOG(logERROR, ("Could not set number of rows. Only available for "
|
LOG(logERROR, ("Could not set number of rows. Only available for "
|
||||||
"Hardware Board version 2.0.\n"));
|
"Hardware Board version 2.0.\n"));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2200,7 +2175,7 @@ int getFlipRows() {
|
|||||||
void setFlipRows(int arg) {
|
void setFlipRows(int arg) {
|
||||||
if (isHardwareVersion2()) {
|
if (isHardwareVersion2()) {
|
||||||
LOG(logERROR, ("Could not set flip rows. Only available for "
|
LOG(logERROR, ("Could not set flip rows. Only available for "
|
||||||
"Hardware Board version 2.0.\n"));
|
"Hardware Board version 2.0.\n"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (arg >= 0) {
|
if (arg >= 0) {
|
||||||
|
@ -165,9 +165,11 @@
|
|||||||
#define PATTERN_OUT_LSB_REG (0x20 << MEM_MAP_SHIFT)
|
#define PATTERN_OUT_LSB_REG (0x20 << MEM_MAP_SHIFT)
|
||||||
#define PATTERN_OUT_MSB_REG (0x21 << MEM_MAP_SHIFT)
|
#define PATTERN_OUT_MSB_REG (0x21 << MEM_MAP_SHIFT)
|
||||||
|
|
||||||
/* Frame number of next acquisition register (64 bit register) */
|
/* Frames From Start 64 bit RO register TODO */
|
||||||
#define NEXT_FRAME_NUMB_LOCAL_LSB_REG (0x22 << MEM_MAP_SHIFT)
|
//#define FRAMES_FROM_START_LSB_REG (0x22 << MEM_MAP_SHIFT) // Not
|
||||||
#define NEXT_FRAME_NUMB_LOCAL_MSB_REG (0x23 << MEM_MAP_SHIFT)
|
// used in FW #define FRAMES_FROM_START_MSB_REG (0x23 <<
|
||||||
|
// MEM_MAP_SHIFT)
|
||||||
|
//// Not used in FW
|
||||||
|
|
||||||
/* Frames From Start PG 64 bit RO register. Reset using CONTROL_CRST. TODO */
|
/* Frames From Start PG 64 bit RO register. Reset using CONTROL_CRST. TODO */
|
||||||
#define FRAMES_FROM_START_PG_LSB_REG (0x24 << MEM_MAP_SHIFT)
|
#define FRAMES_FROM_START_PG_LSB_REG (0x24 << MEM_MAP_SHIFT)
|
||||||
|
Binary file not shown.
@ -43,6 +43,7 @@ char initErrorMessage[MAX_STR_LENGTH];
|
|||||||
|
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
pthread_t pthread_virtual_tid;
|
pthread_t pthread_virtual_tid;
|
||||||
|
int64_t virtual_currentFrameNumber = 2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 1g readout
|
// 1g readout
|
||||||
@ -67,13 +68,7 @@ int defaultDacValues[NDAC] = DEFAULT_DAC_VALS;
|
|||||||
int vLimit = 0;
|
int vLimit = 0;
|
||||||
enum detectorSettings thisSettings = UNINITIALIZED;
|
enum detectorSettings thisSettings = UNINITIALIZED;
|
||||||
int highvoltage = 0;
|
int highvoltage = 0;
|
||||||
|
|
||||||
// getNumberofchannels return 0 for y in --update mode (virtual servers)
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
int nSamples = DEFAULT_NUM_SAMPLES;
|
|
||||||
#else
|
|
||||||
int nSamples = 1;
|
int nSamples = 1;
|
||||||
#endif
|
|
||||||
int detPos[2] = {0, 0};
|
int detPos[2] = {0, 0};
|
||||||
|
|
||||||
int isInitCheckDone() { return initCheckDone; }
|
int isInitCheckDone() { return initCheckDone; }
|
||||||
@ -436,22 +431,16 @@ void initControlServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initStopServer() {
|
void initStopServer() {
|
||||||
if (!updateFlag && initError == OK) {
|
|
||||||
usleep(CTRL_SRVR_INIT_TIME_US);
|
usleep(CTRL_SRVR_INIT_TIME_US);
|
||||||
LOG(logINFOBLUE, ("Configuring Stop server\n"));
|
if (mapCSP0() == FAIL) {
|
||||||
if (mapCSP0() == FAIL) {
|
LOG(logERROR,
|
||||||
initError = FAIL;
|
("Stop Server: Map Fail. Dangerous to continue. Goodbye!\n"));
|
||||||
strcpy(initErrorMessage,
|
exit(EXIT_FAILURE);
|
||||||
"Stop Server: Map Fail. Dangerous to continue. Goodbye!\n");
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
sharedMemory_setStop(0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
initCheckDone = 1;
|
#ifdef VIRTUAL
|
||||||
|
sharedMemory_setStop(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set up detector */
|
/* set up detector */
|
||||||
@ -580,7 +569,6 @@ void setupDetector() {
|
|||||||
setFrequency(ADC_CLK, DEFAULT_ADC_CLK);
|
setFrequency(ADC_CLK, DEFAULT_ADC_CLK);
|
||||||
setFrequency(DBIT_CLK, DEFAULT_DBIT_CLK);
|
setFrequency(DBIT_CLK, DEFAULT_DBIT_CLK);
|
||||||
setPhase(ADC_CLK, DEFAULT_ADC_PHASE_DEG, 1);
|
setPhase(ADC_CLK, DEFAULT_ADC_PHASE_DEG, 1);
|
||||||
setNextFrameNumber(DEFAULT_STARTING_FRAME_NUMBER);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int updateDatabytesandAllocateRAM() {
|
int updateDatabytesandAllocateRAM() {
|
||||||
@ -712,16 +700,7 @@ void resetPeripheral() {
|
|||||||
|
|
||||||
/* set parameters - dr, adcenablemask */
|
/* set parameters - dr, adcenablemask */
|
||||||
|
|
||||||
int setDynamicRange(int dr) {
|
int setDynamicRange(int dr) { return DYNAMIC_RANGE; }
|
||||||
if (dr == 16)
|
|
||||||
return OK;
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getDynamicRange(int *retval) {
|
|
||||||
*retval = DYNAMIC_RANGE;
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int setADCEnableMask(uint32_t mask) {
|
int setADCEnableMask(uint32_t mask) {
|
||||||
if (mask == 0u) {
|
if (mask == 0u) {
|
||||||
@ -821,24 +800,6 @@ uint32_t getADCInvertRegister() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* parameters - timer */
|
/* parameters - timer */
|
||||||
int setNextFrameNumber(uint64_t value) {
|
|
||||||
LOG(logINFO,
|
|
||||||
("Setting next frame number: %llu\n", (long long unsigned int)value));
|
|
||||||
setU64BitReg(value, NEXT_FRAME_NUMB_LOCAL_LSB_REG,
|
|
||||||
NEXT_FRAME_NUMB_LOCAL_MSB_REG);
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
// for 1g udp interface
|
|
||||||
setUDPFrameNumber(value);
|
|
||||||
#endif
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getNextFrameNumber(uint64_t *retval) {
|
|
||||||
*retval = getU64BitReg(NEXT_FRAME_NUMB_LOCAL_LSB_REG,
|
|
||||||
NEXT_FRAME_NUMB_LOCAL_MSB_REG);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setNumFrames(int64_t val) {
|
void setNumFrames(int64_t val) {
|
||||||
if (val > 0) {
|
if (val > 0) {
|
||||||
LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val));
|
LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val));
|
||||||
@ -1196,8 +1157,6 @@ enum timingMode getTiming() {
|
|||||||
|
|
||||||
/* configure mac */
|
/* configure mac */
|
||||||
|
|
||||||
int getNumberofUDPInterfaces() { return 1; }
|
|
||||||
|
|
||||||
void calcChecksum(udp_header *udp) {
|
void calcChecksum(udp_header *udp) {
|
||||||
int count = IP_HEADER_SIZE;
|
int count = IP_HEADER_SIZE;
|
||||||
long int sum = 0;
|
long int sum = 0;
|
||||||
@ -1703,14 +1662,11 @@ void *start_timer(void *arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Send data
|
// Send data
|
||||||
uint64_t frameNr = 0;
|
|
||||||
getNextFrameNumber(&frameNr);
|
|
||||||
// loop over number of frames
|
// loop over number of frames
|
||||||
for (int iframes = 0; iframes != numFrames; ++iframes) {
|
for (int frameNr = 0; frameNr != numFrames; ++frameNr) {
|
||||||
|
|
||||||
// check if manual stop
|
// check if manual stop
|
||||||
if (sharedMemory_getStop() == 1) {
|
if (sharedMemory_getStop() == 1) {
|
||||||
setNextFrameNumber(frameNr + iframes + 1);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1728,7 +1684,7 @@ void *start_timer(void *arg) {
|
|||||||
sls_detector_header *header = (sls_detector_header *)(packetData);
|
sls_detector_header *header = (sls_detector_header *)(packetData);
|
||||||
header->detType = (uint16_t)myDetectorType;
|
header->detType = (uint16_t)myDetectorType;
|
||||||
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
||||||
header->frameNumber = frameNr + iframes;
|
header->frameNumber = virtual_currentFrameNumber;
|
||||||
header->packetNumber = i;
|
header->packetNumber = i;
|
||||||
header->modId = 0;
|
header->modId = 0;
|
||||||
header->row = detPos[X];
|
header->row = detPos[X];
|
||||||
@ -1741,18 +1697,19 @@ void *start_timer(void *arg) {
|
|||||||
|
|
||||||
sendUDPPacket(0, 0, packetData, packetSize);
|
sendUDPPacket(0, 0, packetData, packetSize);
|
||||||
}
|
}
|
||||||
LOG(logINFO, ("Sent frame: %d [%lld]\n", iframes, frameNr + iframes));
|
LOG(logINFO, ("Sent frame: %d [%lld]\n", frameNr,
|
||||||
|
(long long unsigned int)virtual_currentFrameNumber));
|
||||||
clock_gettime(CLOCK_REALTIME, &end);
|
clock_gettime(CLOCK_REALTIME, &end);
|
||||||
int64_t timeNs =
|
int64_t timeNs =
|
||||||
((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec));
|
((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec));
|
||||||
|
|
||||||
// sleep for (period - exptime)
|
// sleep for (period - exptime)
|
||||||
if (iframes < numFrames) { // if there is a next frame
|
if (frameNr < numFrames) { // if there is a next frame
|
||||||
if (periodNs > timeNs) {
|
if (periodNs > timeNs) {
|
||||||
usleep((periodNs - timeNs) / 1000);
|
usleep((periodNs - timeNs) / 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setNextFrameNumber(frameNr + numFrames);
|
++virtual_currentFrameNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
closeUDPSocket(0);
|
closeUDPSocket(0);
|
||||||
|
@ -78,19 +78,18 @@ enum CLKINDEX { RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS };
|
|||||||
#define NCHANS_PER_ADC (25)
|
#define NCHANS_PER_ADC (25)
|
||||||
|
|
||||||
/** Default Parameters */
|
/** Default Parameters */
|
||||||
#define DEFAULT_PATTERN_FILE ("DefaultPattern_moench.txt")
|
#define DEFAULT_PATTERN_FILE ("DefaultPattern_moench.txt")
|
||||||
#define DEFAULT_STARTING_FRAME_NUMBER (1)
|
#define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL)
|
||||||
#define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL)
|
#define DEFAULT_NUM_SAMPLES (5000)
|
||||||
#define DEFAULT_NUM_SAMPLES (5000)
|
#define DEFAULT_EXPTIME (0)
|
||||||
#define DEFAULT_EXPTIME (0)
|
#define DEFAULT_NUM_FRAMES (1)
|
||||||
#define DEFAULT_NUM_FRAMES (1)
|
#define DEFAULT_NUM_CYCLES (1)
|
||||||
#define DEFAULT_NUM_CYCLES (1)
|
#define DEFAULT_PERIOD (1 * 1000 * 1000) // ns
|
||||||
#define DEFAULT_PERIOD (1 * 1000 * 1000) // ns
|
#define DEFAULT_DELAY (0)
|
||||||
#define DEFAULT_DELAY (0)
|
#define DEFAULT_HIGH_VOLTAGE (0)
|
||||||
#define DEFAULT_HIGH_VOLTAGE (0)
|
#define DEFAULT_VLIMIT (-100)
|
||||||
#define DEFAULT_VLIMIT (-100)
|
#define DEFAULT_TIMING_MODE (AUTO_TIMING)
|
||||||
#define DEFAULT_TIMING_MODE (AUTO_TIMING)
|
#define DEFAULT_TX_UDP_PORT (0x7e9a)
|
||||||
#define DEFAULT_TX_UDP_PORT (0x7e9a)
|
|
||||||
|
|
||||||
#define DEFAULT_RUN_CLK_AT_STARTUP (200) // 40
|
#define DEFAULT_RUN_CLK_AT_STARTUP (200) // 40
|
||||||
#define DEFAULT_ADC_CLK_AT_STARTUP (40) // 20
|
#define DEFAULT_ADC_CLK_AT_STARTUP (40) // 20
|
||||||
@ -105,8 +104,6 @@ enum CLKINDEX { RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS };
|
|||||||
#define DEFAULT_PIPELINE (15)
|
#define DEFAULT_PIPELINE (15)
|
||||||
#define DEFAULT_SETTINGS (G4_HIGHGAIN)
|
#define DEFAULT_SETTINGS (G4_HIGHGAIN)
|
||||||
|
|
||||||
#define UDP_HEADER_MAX_FRAME_VALUE (0xFFFFFFFFFFFF)
|
|
||||||
|
|
||||||
// settings
|
// settings
|
||||||
#define DEFAULT_PATMASK (0x00000C800000800AULL)
|
#define DEFAULT_PATMASK (0x00000C800000800AULL)
|
||||||
#define G1_HIGHGAIN_PATSETBIT (0x00000C0000008008ULL)
|
#define G1_HIGHGAIN_PATSETBIT (0x00000C0000008008ULL)
|
||||||
|
Binary file not shown.
@ -35,9 +35,6 @@ extern int isControlServer;
|
|||||||
extern void getMacAddressinString(char *cmac, int size, uint64_t mac);
|
extern void getMacAddressinString(char *cmac, int size, uint64_t mac);
|
||||||
extern void getIpAddressinString(char *cip, uint32_t ip);
|
extern void getIpAddressinString(char *cip, uint32_t ip);
|
||||||
|
|
||||||
// Variables that will be exported
|
|
||||||
int masterCommandLine = -1;
|
|
||||||
|
|
||||||
int initError = OK;
|
int initError = OK;
|
||||||
int initCheckDone = 0;
|
int initCheckDone = 0;
|
||||||
char initErrorMessage[MAX_STR_LENGTH];
|
char initErrorMessage[MAX_STR_LENGTH];
|
||||||
@ -45,7 +42,6 @@ char initErrorMessage[MAX_STR_LENGTH];
|
|||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
pthread_t pthread_virtual_tid;
|
pthread_t pthread_virtual_tid;
|
||||||
int64_t virtual_currentFrameNumber = 2;
|
int64_t virtual_currentFrameNumber = 2;
|
||||||
int virtual_moduleid = 0;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum detectorSettings thisSettings = UNINITIALIZED;
|
enum detectorSettings thisSettings = UNINITIALIZED;
|
||||||
@ -292,18 +288,6 @@ void setModuleId(int modid) {
|
|||||||
bus_r(MOD_ID_REG) | ((modid << MOD_ID_OFST) & MOD_ID_MSK));
|
bus_r(MOD_ID_REG) | ((modid << MOD_ID_OFST) & MOD_ID_MSK));
|
||||||
}
|
}
|
||||||
|
|
||||||
int updateModuleId() {
|
|
||||||
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
|
||||||
if (initError == FAIL) {
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
virtual_moduleid = modid;
|
|
||||||
#endif
|
|
||||||
setModuleId(modid);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int64_t getDetectorMAC() {
|
u_int64_t getDetectorMAC() {
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
return 0;
|
return 0;
|
||||||
@ -367,26 +351,16 @@ void initControlServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initStopServer() {
|
void initStopServer() {
|
||||||
if (!updateFlag && initError == OK) {
|
|
||||||
usleep(CTRL_SRVR_INIT_TIME_US);
|
usleep(CTRL_SRVR_INIT_TIME_US);
|
||||||
LOG(logINFOBLUE, ("Configuring Stop server\n"));
|
if (mapCSP0() == FAIL) {
|
||||||
if (mapCSP0() == FAIL) {
|
LOG(logERROR,
|
||||||
initError = FAIL;
|
("Stop Server: Map Fail. Dangerous to continue. Goodbye!\n"));
|
||||||
strcpy(initErrorMessage,
|
exit(EXIT_FAILURE);
|
||||||
"Stop Server: Map Fail. Dangerous to continue. Goodbye!\n");
|
|
||||||
LOG(logERROR, (initErrorMessage));
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
sharedMemory_setStop(0);
|
|
||||||
if (checkCommandLineConfiguration() == FAIL) {
|
|
||||||
initCheckDone = 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
initCheckDone = 1;
|
#ifdef VIRTUAL
|
||||||
|
sharedMemory_setStop(0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set up detector */
|
/* set up detector */
|
||||||
@ -432,12 +406,6 @@ void setupDetector() {
|
|||||||
|
|
||||||
allocateDetectorStructureMemory();
|
allocateDetectorStructureMemory();
|
||||||
|
|
||||||
if (checkCommandLineConfiguration() == FAIL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (updateModuleId() == FAIL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
clkDivider[READOUT_C0] = DEFAULT_READOUT_C0;
|
clkDivider[READOUT_C0] = DEFAULT_READOUT_C0;
|
||||||
clkDivider[READOUT_C1] = DEFAULT_READOUT_C1;
|
clkDivider[READOUT_C1] = DEFAULT_READOUT_C1;
|
||||||
clkDivider[SYSTEM_C0] = DEFAULT_SYSTEM_C0;
|
clkDivider[SYSTEM_C0] = DEFAULT_SYSTEM_C0;
|
||||||
@ -478,6 +446,13 @@ void setupDetector() {
|
|||||||
setASICDefaults();
|
setASICDefaults();
|
||||||
setADIFDefaults();
|
setADIFDefaults();
|
||||||
|
|
||||||
|
// set module id in register
|
||||||
|
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
||||||
|
if (initError == FAIL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setModuleId(modid);
|
||||||
|
|
||||||
// set trigger flow for m3 (for all timing modes)
|
// set trigger flow for m3 (for all timing modes)
|
||||||
bus_w(FLOW_TRIGGER_REG, bus_r(FLOW_TRIGGER_REG) | FLOW_TRIGGER_MSK);
|
bus_w(FLOW_TRIGGER_REG, bus_r(FLOW_TRIGGER_REG) | FLOW_TRIGGER_MSK);
|
||||||
|
|
||||||
@ -501,6 +476,13 @@ void setupDetector() {
|
|||||||
setInitialExtSignals();
|
setInitialExtSignals();
|
||||||
// 10G UDP
|
// 10G UDP
|
||||||
enableTenGigabitEthernet(1);
|
enableTenGigabitEthernet(1);
|
||||||
|
#ifdef VIRTUAL
|
||||||
|
enableTenGigabitEthernet(0);
|
||||||
|
#endif
|
||||||
|
getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
||||||
|
if (initError == FAIL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
setSettings(DEFAULT_SETTINGS);
|
setSettings(DEFAULT_SETTINGS);
|
||||||
|
|
||||||
// check module type attached if not in debug mode
|
// check module type attached if not in debug mode
|
||||||
@ -717,27 +699,6 @@ void setADIFDefaults() {
|
|||||||
ADIF_ADDTNL_OFST_MSK)));
|
ADIF_ADDTNL_OFST_MSK)));
|
||||||
}
|
}
|
||||||
|
|
||||||
int checkCommandLineConfiguration() {
|
|
||||||
if (masterCommandLine != -1) {
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
if (masterCommandLine == 1) {
|
|
||||||
bus_w(SYSTEM_STATUS_REG,
|
|
||||||
bus_r(SYSTEM_STATUS_REG) & ~SYSTEM_STATUS_SLV_BRD_DTCT_MSK);
|
|
||||||
} else {
|
|
||||||
bus_w(SYSTEM_STATUS_REG,
|
|
||||||
bus_r(SYSTEM_STATUS_REG) | SYSTEM_STATUS_SLV_BRD_DTCT_MSK);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
initError = FAIL;
|
|
||||||
strcpy(initErrorMessage,
|
|
||||||
"Cannot set Master from command line for this detector. "
|
|
||||||
"Should have been caught before!\n");
|
|
||||||
return FAIL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* firmware functions (resets) */
|
/* firmware functions (resets) */
|
||||||
|
|
||||||
void cleanFifos() {
|
void cleanFifos() {
|
||||||
@ -767,54 +728,46 @@ void resetPeripheral() {
|
|||||||
/* set parameters - dr, roi */
|
/* set parameters - dr, roi */
|
||||||
|
|
||||||
int setDynamicRange(int dr) {
|
int setDynamicRange(int dr) {
|
||||||
if (dr <= 0) {
|
if (dr > 0) {
|
||||||
return FAIL;
|
uint32_t regval = 0;
|
||||||
|
switch (dr) {
|
||||||
|
/*case 1: TODO:Not implemented in firmware yet
|
||||||
|
regval = CONFIG_DYNAMIC_RANGE_1_VAL;
|
||||||
|
break;*/
|
||||||
|
case 8:
|
||||||
|
regval = CONFIG_DYNAMIC_RANGE_8_VAL;
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
regval = CONFIG_DYNAMIC_RANGE_16_VAL;
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
regval = CONFIG_DYNAMIC_RANGE_24_VAL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG(logERROR, ("Invalid dynamic range %d\n", dr));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// set it
|
||||||
|
bus_w(CONFIG_REG, bus_r(CONFIG_REG) & ~CONFIG_DYNAMIC_RANGE_MSK);
|
||||||
|
bus_w(CONFIG_REG, bus_r(CONFIG_REG) | regval);
|
||||||
|
updatePacketizing();
|
||||||
}
|
}
|
||||||
uint32_t regval = 0;
|
|
||||||
switch (dr) {
|
|
||||||
/*case 1: TODO:Not implemented in firmware yet
|
|
||||||
regval = CONFIG_DYNAMIC_RANGE_1_VAL;
|
|
||||||
break;*/
|
|
||||||
case 8:
|
|
||||||
regval = CONFIG_DYNAMIC_RANGE_8_VAL;
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
regval = CONFIG_DYNAMIC_RANGE_16_VAL;
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
regval = CONFIG_DYNAMIC_RANGE_24_VAL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOG(logERROR, ("Invalid dynamic range %d\n", dr));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
// set it
|
|
||||||
bus_w(CONFIG_REG, bus_r(CONFIG_REG) & ~CONFIG_DYNAMIC_RANGE_MSK);
|
|
||||||
bus_w(CONFIG_REG, bus_r(CONFIG_REG) | regval);
|
|
||||||
updatePacketizing();
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getDynamicRange(int *retval) {
|
|
||||||
uint32_t regval = bus_r(CONFIG_REG) & CONFIG_DYNAMIC_RANGE_MSK;
|
uint32_t regval = bus_r(CONFIG_REG) & CONFIG_DYNAMIC_RANGE_MSK;
|
||||||
switch (regval) {
|
switch (regval) {
|
||||||
/*case CONFIG_DYNAMIC_RANGE_1_VAL: TODO:Not implemented in firmware yet
|
/*case CONFIG_DYNAMIC_RANGE_1_VAL: TODO:Not implemented in firmware yet
|
||||||
return 1;*/
|
return 1;*/
|
||||||
case CONFIG_DYNAMIC_RANGE_8_VAL:
|
case CONFIG_DYNAMIC_RANGE_8_VAL:
|
||||||
*retval = 8;
|
return 8;
|
||||||
break;
|
|
||||||
case CONFIG_DYNAMIC_RANGE_16_VAL:
|
case CONFIG_DYNAMIC_RANGE_16_VAL:
|
||||||
*retval = 16;
|
return 16;
|
||||||
break;
|
|
||||||
case CONFIG_DYNAMIC_RANGE_24_VAL:
|
case CONFIG_DYNAMIC_RANGE_24_VAL:
|
||||||
*retval = 32;
|
return 32;
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
LOG(logERROR, ("Invalid dynamic range %d read back\n",
|
LOG(logERROR, ("Invalid dynamic range %d read back\n",
|
||||||
regval >> CONFIG_DYNAMIC_RANGE_OFST));
|
regval >> CONFIG_DYNAMIC_RANGE_OFST));
|
||||||
return FAIL;
|
return -1;
|
||||||
}
|
}
|
||||||
return OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set parameters - readout */
|
/* set parameters - readout */
|
||||||
@ -1137,8 +1090,7 @@ void updatePacketizing() {
|
|||||||
|
|
||||||
// 10g
|
// 10g
|
||||||
if (tgEnable) {
|
if (tgEnable) {
|
||||||
int dr = 0;
|
const int dr = setDynamicRange(-1);
|
||||||
getDynamicRange(&dr);
|
|
||||||
packetsPerFrame = 1;
|
packetsPerFrame = 1;
|
||||||
if (dr == 32 && ncounters > 1) {
|
if (dr == 32 && ncounters > 1) {
|
||||||
packetsPerFrame = 2;
|
packetsPerFrame = 2;
|
||||||
@ -1592,18 +1544,14 @@ int setHighVoltage(int val) {
|
|||||||
|
|
||||||
/* parameters - timing */
|
/* parameters - timing */
|
||||||
|
|
||||||
int isMaster(int *retval) {
|
int isMaster() {
|
||||||
int slave = ((bus_r(SYSTEM_STATUS_REG) & SYSTEM_STATUS_SLV_BRD_DTCT_MSK) >>
|
return !((bus_r(SYSTEM_STATUS_REG) & SYSTEM_STATUS_SLV_BRD_DTCT_MSK) >>
|
||||||
SYSTEM_STATUS_SLV_BRD_DTCT_OFST);
|
SYSTEM_STATUS_SLV_BRD_DTCT_OFST);
|
||||||
*retval = (slave == 0 ? 1 : 0);
|
|
||||||
return OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTiming(enum timingMode arg) {
|
void setTiming(enum timingMode arg) {
|
||||||
|
|
||||||
int master = 0;
|
if (!isMaster() && arg == AUTO_TIMING)
|
||||||
isMaster(&master);
|
|
||||||
if (master && arg == AUTO_TIMING)
|
|
||||||
arg = TRIGGER_EXPOSURE;
|
arg = TRIGGER_EXPOSURE;
|
||||||
|
|
||||||
uint32_t addr = CONFIG_REG;
|
uint32_t addr = CONFIG_REG;
|
||||||
@ -1771,8 +1719,6 @@ int getExtSignal(int signalIndex) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int getNumberofUDPInterfaces() { return 1; }
|
|
||||||
|
|
||||||
int configureMAC() {
|
int configureMAC() {
|
||||||
|
|
||||||
uint32_t srcip = udpDetails[0].srcip;
|
uint32_t srcip = udpDetails[0].srcip;
|
||||||
@ -2253,8 +2199,7 @@ void *start_timer(void *arg) {
|
|||||||
|
|
||||||
const int imageSize = calculateDataBytes();
|
const int imageSize = calculateDataBytes();
|
||||||
const int tgEnable = enableTenGigabitEthernet(-1);
|
const int tgEnable = enableTenGigabitEthernet(-1);
|
||||||
int dr = 0;
|
const int dr = setDynamicRange(-1);
|
||||||
getDynamicRange(&dr);
|
|
||||||
int ncounters = __builtin_popcount(getCounterMask());
|
int ncounters = __builtin_popcount(getCounterMask());
|
||||||
int dataSize = 0;
|
int dataSize = 0;
|
||||||
int packetsPerFrame = 0;
|
int packetsPerFrame = 0;
|
||||||
@ -2335,7 +2280,7 @@ void *start_timer(void *arg) {
|
|||||||
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
||||||
header->frameNumber = virtual_currentFrameNumber;
|
header->frameNumber = virtual_currentFrameNumber;
|
||||||
header->packetNumber = i;
|
header->packetNumber = i;
|
||||||
header->modId = virtual_moduleid;
|
header->modId = 0;
|
||||||
header->row = detPos[X];
|
header->row = detPos[X];
|
||||||
header->column = detPos[Y];
|
header->column = detPos[Y];
|
||||||
|
|
||||||
@ -2575,8 +2520,7 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) {
|
|||||||
|
|
||||||
int calculateDataBytes() {
|
int calculateDataBytes() {
|
||||||
int numCounters = __builtin_popcount(getCounterMask());
|
int numCounters = __builtin_popcount(getCounterMask());
|
||||||
int dr = 0;
|
int dr = setDynamicRange(-1);
|
||||||
getDynamicRange(&dr);
|
|
||||||
return (NCHAN_1_COUNTER * NCHIP * numCounters * ((double)dr / 8.00));
|
return (NCHAN_1_COUNTER * NCHIP * numCounters * ((double)dr / 8.00));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ enum DACINDEX {
|
|||||||
#define DAC_NAMES \
|
#define DAC_NAMES \
|
||||||
"vcassh", "vth2", "vrshaper", "vrshaper_n", "vipre_out", "vth3", "vth1", \
|
"vcassh", "vth2", "vrshaper", "vrshaper_n", "vipre_out", "vth3", "vth1", \
|
||||||
"vicin", "vcas", "vrpreamp", "vcal_n", "vipre", "vishaper", "vcal_p", \
|
"vicin", "vcas", "vrpreamp", "vcal_n", "vipre", "vishaper", "vcal_p", \
|
||||||
"vtrim", "vdcsh", "vthreshold"
|
"vtrim", "vdcsh"
|
||||||
#define DEFAULT_DAC_VALS \
|
#define DEFAULT_DAC_VALS \
|
||||||
{ \
|
{ \
|
||||||
1200, /* casSh */ \
|
1200, /* casSh */ \
|
||||||
|
@ -4,11 +4,25 @@
|
|||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
uint32_t getUDPPacketNumber();
|
|
||||||
uint64_t getUDPFrameNumber();
|
|
||||||
void setUDPFrameNumber(uint64_t fnum);
|
|
||||||
/**
|
/**
|
||||||
|
* Get current udp packet number
|
||||||
|
*/
|
||||||
|
uint32_t getUDPPacketNumber();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get current udp frame number
|
||||||
|
*/
|
||||||
|
uint64_t getUDPFrameNumber();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called for each UDP packet header creation
|
||||||
|
* @param buffer pointer to header
|
||||||
* @param id module id
|
* @param id module id
|
||||||
*/
|
*/
|
||||||
void createUDPPacketHeader(char *buffer, uint16_t id);
|
void createUDPPacketHeader(char *buffer, uint16_t id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fill up the udp packet with data till its full
|
||||||
|
* @param buffer pointer to memory
|
||||||
|
*/
|
||||||
int fillUDPPacket(char *buffer);
|
int fillUDPPacket(char *buffer);
|
||||||
|
@ -26,12 +26,10 @@ int preparetoCopyProgram(char *mess, char *functionType, FILE **fd,
|
|||||||
uint64_t fsize);
|
uint64_t fsize);
|
||||||
int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index,
|
int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index,
|
||||||
char *functionType, char *clientChecksum,
|
char *functionType, char *clientChecksum,
|
||||||
ssize_t fsize, int forceDeleteNormalFile);
|
ssize_t fsize);
|
||||||
int getDrive(char *mess, enum PROGRAM_INDEX index);
|
int getDrive(char *mess, enum PROGRAM_INDEX index);
|
||||||
/** Notify fpga not to touch flash, open src and flash drive to write */
|
/** Notify fpga not to touch flash, open src and flash drive to write */
|
||||||
int openFileForFlash(char *mess, enum PROGRAM_INDEX index, FILE **flashfd, FILE **srcfd,
|
int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd);
|
||||||
int forceDeleteNormalFile);
|
|
||||||
int checkNormalFile(char *mess, enum PROGRAM_INDEX index, int forceDeleteNormalFile);
|
|
||||||
int eraseFlash(char *mess);
|
int eraseFlash(char *mess);
|
||||||
/* write from tmp file to flash */
|
/* write from tmp file to flash */
|
||||||
int writeToFlash(char *mess, ssize_t fsize, FILE *flashfd, FILE *srcfd);
|
int writeToFlash(char *mess, ssize_t fsize, FILE *flashfd, FILE *srcfd);
|
||||||
|
@ -97,9 +97,6 @@ u_int32_t getDetectorNumber();
|
|||||||
#if defined(GOTTHARD2D) || defined(EIGERD) || defined(MYTHEN3D)
|
#if defined(GOTTHARD2D) || defined(EIGERD) || defined(MYTHEN3D)
|
||||||
int getModuleId(int *ret, char *mess);
|
int getModuleId(int *ret, char *mess);
|
||||||
#endif
|
#endif
|
||||||
#if defined(EIGERD) || defined(MYTHEN3D) || defined(GOTTHARD2D)
|
|
||||||
int updateModuleId();
|
|
||||||
#endif
|
|
||||||
#if defined(GOTTHARD2D) || defined(MYTHEN3D)
|
#if defined(GOTTHARD2D) || defined(MYTHEN3D)
|
||||||
void setModuleId(int modid);
|
void setModuleId(int modid);
|
||||||
#endif
|
#endif
|
||||||
@ -113,11 +110,7 @@ u_int32_t getBoardRevision();
|
|||||||
void initControlServer();
|
void initControlServer();
|
||||||
void initStopServer();
|
void initStopServer();
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
int updateModuleConfiguration();
|
void getModuleConfiguration();
|
||||||
int getModuleConfiguration(int *m, int *t, int *n);
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
void checkVirtual9MFlag();
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// set up detector
|
// set up detector
|
||||||
@ -144,10 +137,6 @@ void setADIFDefaults();
|
|||||||
#if defined(GOTTHARD2D) || defined(EIGERD) || defined(JUNGFRAUD)
|
#if defined(GOTTHARD2D) || defined(EIGERD) || defined(JUNGFRAUD)
|
||||||
int readConfigFile();
|
int readConfigFile();
|
||||||
#endif
|
#endif
|
||||||
#if defined(GOTTHARDD) || defined(GOTTHARD2D) || defined(EIGERD) || \
|
|
||||||
defined(MYTHEN3D)
|
|
||||||
int checkCommandLineConfiguration();
|
|
||||||
#endif
|
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
void resetToHardwareSettings();
|
void resetToHardwareSettings();
|
||||||
#endif
|
#endif
|
||||||
@ -184,7 +173,6 @@ void setMasterSlaveConfiguration();
|
|||||||
|
|
||||||
// parameters - dr, roi
|
// parameters - dr, roi
|
||||||
int setDynamicRange(int dr);
|
int setDynamicRange(int dr);
|
||||||
int getDynamicRange(int *retval);
|
|
||||||
#ifdef GOTTHARDD
|
#ifdef GOTTHARDD
|
||||||
int setROI(ROI arg);
|
int setROI(ROI arg);
|
||||||
ROI getROI();
|
ROI getROI();
|
||||||
@ -225,8 +213,7 @@ int getReadoutMode();
|
|||||||
int selectStoragecellStart(int pos);
|
int selectStoragecellStart(int pos);
|
||||||
int getMaxStoragecellStart();
|
int getMaxStoragecellStart();
|
||||||
#endif
|
#endif
|
||||||
#if defined(JUNGFRAUD) || defined(EIGERD) || defined(MOENCHD) || \
|
#if defined(JUNGFRAUD) || defined(EIGERD)
|
||||||
defined(CHIPTESTBOARDD)
|
|
||||||
int setNextFrameNumber(uint64_t value);
|
int setNextFrameNumber(uint64_t value);
|
||||||
int getNextFrameNumber(uint64_t *value);
|
int getNextFrameNumber(uint64_t *value);
|
||||||
#endif
|
#endif
|
||||||
@ -374,16 +361,9 @@ int getADC(enum ADCINDEX ind);
|
|||||||
int setHighVoltage(int val);
|
int setHighVoltage(int val);
|
||||||
|
|
||||||
// parameters - timing, extsig
|
// parameters - timing, extsig
|
||||||
#ifdef EIGERD
|
#if defined(MYTHEN3D) || defined(EIGERD) || defined(GOTTHARDD)
|
||||||
int setMaster(enum MASTERINDEX m);
|
int isMaster();
|
||||||
int setTop(enum TOPINDEX t);
|
|
||||||
int isTop(int *retval);
|
|
||||||
#endif
|
#endif
|
||||||
#if defined(MYTHEN3D) || defined(EIGERD) || defined(GOTTHARDD) || \
|
|
||||||
defined(GOTTHARD2D)
|
|
||||||
int isMaster(int *retval);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GOTTHARD2D
|
#ifdef GOTTHARD2D
|
||||||
void updatingRegisters();
|
void updatingRegisters();
|
||||||
#endif
|
#endif
|
||||||
@ -407,8 +387,8 @@ void calcChecksum(mac_conf *mac, int sourceip, int destip);
|
|||||||
#endif
|
#endif
|
||||||
#if defined(JUNGFRAUD) || defined(GOTTHARD2D)
|
#if defined(JUNGFRAUD) || defined(GOTTHARD2D)
|
||||||
void setNumberofUDPInterfaces(int val);
|
void setNumberofUDPInterfaces(int val);
|
||||||
#endif
|
|
||||||
int getNumberofUDPInterfaces();
|
int getNumberofUDPInterfaces();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(JUNGFRAUD) || defined(EIGERD)
|
#if defined(JUNGFRAUD) || defined(EIGERD)
|
||||||
int getNumberofDestinations(int *retval);
|
int getNumberofDestinations(int *retval);
|
||||||
|
@ -245,7 +245,6 @@ int get_pattern(int);
|
|||||||
int load_default_pattern(int);
|
int load_default_pattern(int);
|
||||||
int get_all_threshold_energy(int);
|
int get_all_threshold_energy(int);
|
||||||
int get_master(int);
|
int get_master(int);
|
||||||
int set_master(int);
|
|
||||||
int get_csr();
|
int get_csr();
|
||||||
int set_gain_caps(int);
|
int set_gain_caps(int);
|
||||||
int get_gain_caps(int);
|
int get_gain_caps(int);
|
||||||
@ -285,12 +284,9 @@ int update_detector_server(int);
|
|||||||
int receive_program(int file_des, enum PROGRAM_INDEX index);
|
int receive_program(int file_des, enum PROGRAM_INDEX index);
|
||||||
void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index,
|
void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index,
|
||||||
char *functionType, uint64_t filesize,
|
char *functionType, uint64_t filesize,
|
||||||
char *checksum, char *serverName,
|
char *checksum, char *serverName);
|
||||||
int forceDeleteNormalFile);
|
|
||||||
void receive_program_default(int file_des, enum PROGRAM_INDEX index,
|
void receive_program_default(int file_des, enum PROGRAM_INDEX index,
|
||||||
char *functionType, uint64_t filesize,
|
char *functionType, uint64_t filesize,
|
||||||
char *checksum, char *serverName);
|
char *checksum, char *serverName);
|
||||||
int get_update_mode(int);
|
int get_update_mode(int);
|
||||||
int set_update_mode(int);
|
int set_update_mode(int);
|
||||||
int get_top(int);
|
|
||||||
int set_top(int);
|
|
@ -32,11 +32,6 @@ uint64_t udpFrameNumber = 0;
|
|||||||
uint32_t getUDPPacketNumber() { return udpPacketNumber; }
|
uint32_t getUDPPacketNumber() { return udpPacketNumber; }
|
||||||
|
|
||||||
uint64_t getUDPFrameNumber() { return udpFrameNumber; }
|
uint64_t getUDPFrameNumber() { return udpFrameNumber; }
|
||||||
void setUDPFrameNumber(uint64_t fnum) {
|
|
||||||
LOG(logINFO, ("Setting next frame number also for 1g to %lld\n", fnum));
|
|
||||||
// this gets incremented before setting it
|
|
||||||
udpFrameNumber = fnum - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void createUDPPacketHeader(char *buffer, uint16_t id) {
|
void createUDPPacketHeader(char *buffer, uint16_t id) {
|
||||||
memset(buffer, 0, sizeof(sls_detector_header));
|
memset(buffer, 0, sizeof(sls_detector_header));
|
||||||
|
@ -74,14 +74,8 @@ int getTimeFromString(char *buf, time_t *result) {
|
|||||||
// remove timezone as strptime cannot validate timezone despite
|
// remove timezone as strptime cannot validate timezone despite
|
||||||
// documentation (for blackfin)
|
// documentation (for blackfin)
|
||||||
LOG(logDEBUG, ("kernel v %s\n", buffer));
|
LOG(logDEBUG, ("kernel v %s\n", buffer));
|
||||||
char timezone[8] = {0};
|
const char *timezone = {"CEST"};
|
||||||
strcpy(timezone, "CEST");
|
|
||||||
char *res = strstr(buffer, timezone);
|
char *res = strstr(buffer, timezone);
|
||||||
// remove CET as well
|
|
||||||
if (res == NULL) {
|
|
||||||
strcpy(timezone, "CET");
|
|
||||||
res = strstr(buffer, timezone);
|
|
||||||
}
|
|
||||||
if (res != NULL) {
|
if (res != NULL) {
|
||||||
size_t cestPos = res - buffer;
|
size_t cestPos = res - buffer;
|
||||||
size_t pos = cestPos + strlen(timezone) + 1;
|
size_t pos = cestPos + strlen(timezone) + 1;
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
#include "slsDetectorServer_defs.h"
|
#include "slsDetectorServer_defs.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/sysinfo.h>
|
#include <sys/sysinfo.h>
|
||||||
#include <unistd.h> // usleep
|
#include <unistd.h> // usleep
|
||||||
|
|
||||||
@ -39,9 +38,6 @@
|
|||||||
|
|
||||||
#define CMD_GET_AMD_FLASH "dmesg | grep Amd"
|
#define CMD_GET_AMD_FLASH "dmesg | grep Amd"
|
||||||
|
|
||||||
#define CMD_CREATE_DEVICE_FILE_PART1 "mknod"
|
|
||||||
#define CMD_CREATE_DEVICE_FILE_PART2 "c 90 6"
|
|
||||||
|
|
||||||
#define FLASH_BUFFER_MEMORY_SIZE (128 * 1024) // 500 KB
|
#define FLASH_BUFFER_MEMORY_SIZE (128 * 1024) // 500 KB
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
@ -278,8 +274,7 @@ int allowUpdate(char *mess, char *functionType) {
|
|||||||
getKernelVersion(retvals);
|
getKernelVersion(retvals);
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
snprintf(mess, MAX_STR_LENGTH,
|
||||||
"Could not update %s. Kernel version %s is too old to "
|
"Could not update %s. Kernel version %s is too old to "
|
||||||
"update the Amd flash/ root directory. Most likely, blackfin "
|
"update the Amd flash/ root directory. Most likely, blackfin needs rescue or replacement. Please contact us.\n",
|
||||||
"needs rescue or replacement. Please contact us.\n",
|
|
||||||
functionType, retvals);
|
functionType, retvals);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@ -324,7 +319,7 @@ int preparetoCopyProgram(char *mess, char *functionType, FILE **fd,
|
|||||||
|
|
||||||
int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index,
|
int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index,
|
||||||
char *functionType, char *clientChecksum,
|
char *functionType, char *clientChecksum,
|
||||||
ssize_t fsize, int forceDeleteNormalFile) {
|
ssize_t fsize) {
|
||||||
|
|
||||||
memset(messageType, 0, sizeof(messageType));
|
memset(messageType, 0, sizeof(messageType));
|
||||||
strcpy(messageType, functionType);
|
strcpy(messageType, functionType);
|
||||||
@ -335,8 +330,7 @@ int eraseAndWriteToFlash(char *mess, enum PROGRAM_INDEX index,
|
|||||||
|
|
||||||
FILE *flashfd = NULL;
|
FILE *flashfd = NULL;
|
||||||
FILE *srcfd = NULL;
|
FILE *srcfd = NULL;
|
||||||
if (openFileForFlash(mess, index, &flashfd, &srcfd, forceDeleteNormalFile) ==
|
if (openFileForFlash(mess, &flashfd, &srcfd) == FAIL) {
|
||||||
FAIL) {
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,8 +434,7 @@ int getDrive(char *mess, enum PROGRAM_INDEX index) {
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int openFileForFlash(char *mess, enum PROGRAM_INDEX index, FILE **flashfd, FILE **srcfd,
|
int openFileForFlash(char *mess, FILE **flashfd, FILE **srcfd) {
|
||||||
int forceDeleteNormalFile) {
|
|
||||||
// open src file
|
// open src file
|
||||||
*srcfd = fopen(TEMP_PROG_FILE_NAME, "r");
|
*srcfd = fopen(TEMP_PROG_FILE_NAME, "r");
|
||||||
if (*srcfd == NULL) {
|
if (*srcfd == NULL) {
|
||||||
@ -454,11 +447,6 @@ int openFileForFlash(char *mess, enum PROGRAM_INDEX index, FILE **flashfd, FILE
|
|||||||
}
|
}
|
||||||
LOG(logDEBUG1, ("Temp file ready for reading\n"));
|
LOG(logDEBUG1, ("Temp file ready for reading\n"));
|
||||||
|
|
||||||
if (checkNormalFile(mess, index, forceDeleteNormalFile) == FAIL) {
|
|
||||||
fclose(*srcfd);
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// open flash drive for writing
|
// open flash drive for writing
|
||||||
*flashfd = fopen(flashDriveName, "w");
|
*flashfd = fopen(flashDriveName, "w");
|
||||||
if (*flashfd == NULL) {
|
if (*flashfd == NULL) {
|
||||||
@ -474,95 +462,6 @@ int openFileForFlash(char *mess, enum PROGRAM_INDEX index, FILE **flashfd, FILE
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int checkNormalFile(char *mess, enum PROGRAM_INDEX index, int forceDeleteNormalFile) {
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
// check if its a normal file or special file
|
|
||||||
struct stat buf;
|
|
||||||
if (stat(flashDriveName, &buf) == -1) {
|
|
||||||
sprintf(mess,
|
|
||||||
"Could not %s. Unable to find the flash drive %s\n",
|
|
||||||
messageType, flashDriveName);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
// zero = normal file (not char special drive file)
|
|
||||||
if (!S_ISCHR(buf.st_mode)) {
|
|
||||||
// kernel memory is not permanent
|
|
||||||
if (index != PROGRAM_FPGA) {
|
|
||||||
sprintf(mess,
|
|
||||||
"Could not %s. The flash drive found is a normal file. "
|
|
||||||
"Reboot board using 'rebootcontroller' command to load "
|
|
||||||
"proper device tree\n",
|
|
||||||
messageType);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// user does not allow to fix it (default)
|
|
||||||
if (forceDeleteNormalFile == 0) {
|
|
||||||
sprintf(mess,
|
|
||||||
"Could not %s. The flash drive %s found for fpga programming is a normal file. To "
|
|
||||||
"fix this (by deleting this file, creating the flash drive and proceeding with "
|
|
||||||
"programming), re-run the programming command 'programfpga' with parameter "
|
|
||||||
"'--force-delete-normal-file'\n",
|
|
||||||
messageType, flashDriveName);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// fpga memory stays after a reboot, user allowed to fix it
|
|
||||||
LOG(logWARNING, ("Flash drive invalidated (normal file). Fixing it...\n"));
|
|
||||||
|
|
||||||
// user allows to fix it, so force delete normal file
|
|
||||||
char cmd[MAX_STR_LENGTH] = {0};
|
|
||||||
char retvals[MAX_STR_LENGTH] = {0};
|
|
||||||
|
|
||||||
if (snprintf(cmd, MAX_STR_LENGTH, "rm %s", flashDriveName) >=
|
|
||||||
MAX_STR_LENGTH) {
|
|
||||||
sprintf(mess,
|
|
||||||
"Could not update %s. Command to delete normal file %s is "
|
|
||||||
"too long\n",
|
|
||||||
messageType, flashDriveName);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
|
||||||
snprintf(
|
|
||||||
mess, MAX_STR_LENGTH,
|
|
||||||
"Could not update %s. (could not delete normal file %s: %s)\n",
|
|
||||||
messageType, flashDriveName, retvals);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logINFO, ("\tDeleted Normal File (%s)\n", flashDriveName));
|
|
||||||
|
|
||||||
// create special drive
|
|
||||||
if (snprintf(cmd, MAX_STR_LENGTH, "%s %s %s",
|
|
||||||
CMD_CREATE_DEVICE_FILE_PART1, flashDriveName,
|
|
||||||
CMD_CREATE_DEVICE_FILE_PART2) >= MAX_STR_LENGTH) {
|
|
||||||
sprintf(mess,
|
|
||||||
"Could not update %s. Command to create special file %s is "
|
|
||||||
"too long\n",
|
|
||||||
messageType, flashDriveName);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
|
||||||
snprintf(
|
|
||||||
mess, MAX_STR_LENGTH,
|
|
||||||
"Could not update %s. (could not create special file %s: %s)\n",
|
|
||||||
messageType, flashDriveName, retvals);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logINFO, ("\tSpecial File created (%s)\n", flashDriveName));
|
|
||||||
} else {
|
|
||||||
LOG(logINFO, ("\tValidated flash drive (not a normal file)\n"));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int eraseFlash(char *mess) {
|
int eraseFlash(char *mess) {
|
||||||
LOG(logINFO, ("\tErasing Flash...\n"));
|
LOG(logINFO, ("\tErasing Flash...\n"));
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h> // usleep
|
#include <unistd.h> // usleep
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
/* global variables */
|
/* global variables */
|
||||||
|
|
||||||
@ -147,30 +146,6 @@ int getDrive(char *mess, enum PROGRAM_INDEX index) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int openFileForFlash(char *mess, FILE **flashfd) {
|
int openFileForFlash(char *mess, FILE **flashfd) {
|
||||||
#ifndef VIRTUAL
|
|
||||||
// check if its a normal file or special file
|
|
||||||
struct stat buf;
|
|
||||||
if (stat(flashDriveName, &buf) == -1) {
|
|
||||||
sprintf(mess,
|
|
||||||
"Could not %s. Unable to find the flash drive %s\n",
|
|
||||||
messageType, flashDriveName);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
// zero = normal file (not char drive special file)
|
|
||||||
if (!S_ISCHR(buf.st_mode)) {
|
|
||||||
// memory is not permanent
|
|
||||||
sprintf(mess,
|
|
||||||
"Could not %s. The flash drive found is a normal file. "
|
|
||||||
"Reboot board using 'rebootcontroller' command to load "
|
|
||||||
"proper device tree\n",
|
|
||||||
messageType);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logINFO, ("\tValidated flash drive (not a normal file)\n"));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
*flashfd = fopen(flashDriveName, "w");
|
*flashfd = fopen(flashDriveName, "w");
|
||||||
if (*flashfd == NULL) {
|
if (*flashfd == NULL) {
|
||||||
sprintf(mess,
|
sprintf(mess,
|
||||||
|
@ -26,19 +26,11 @@ extern int sockfd;
|
|||||||
extern int debugflag;
|
extern int debugflag;
|
||||||
extern int updateFlag;
|
extern int updateFlag;
|
||||||
extern int checkModuleFlag;
|
extern int checkModuleFlag;
|
||||||
extern int ignoreConfigFileFlag;
|
|
||||||
|
|
||||||
// Global variables from slsDetectorFunctionList
|
// Global variables from slsDetectorFunctionList
|
||||||
#ifdef GOTTHARDD
|
#ifdef GOTTHARDD
|
||||||
extern int phaseShift;
|
extern int phaseShift;
|
||||||
#endif
|
#endif
|
||||||
#if defined(GOTTHARDD) || defined(GOTTHARD2D) || defined(EIGERD) || \
|
|
||||||
defined(MYTHEN3D)
|
|
||||||
extern int masterCommandLine;
|
|
||||||
#endif
|
|
||||||
#ifdef EIGERD
|
|
||||||
extern int topCommandLine;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void error(char *msg) { perror(msg); }
|
void error(char *msg) { perror(msg); }
|
||||||
|
|
||||||
@ -56,57 +48,26 @@ int main(int argc, char *argv[]) {
|
|||||||
updateFlag = 0;
|
updateFlag = 0;
|
||||||
checkModuleFlag = 1;
|
checkModuleFlag = 1;
|
||||||
int version = 0;
|
int version = 0;
|
||||||
ignoreConfigFileFlag = 0;
|
|
||||||
#if defined(GOTTHARDD) || defined(GOTTHARD2D) || defined(EIGERD) || \
|
|
||||||
defined(MYTHEN3D)
|
|
||||||
masterCommandLine = -1;
|
|
||||||
#endif
|
|
||||||
#ifdef EIGERD
|
|
||||||
topCommandLine = -1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// help message
|
// help message
|
||||||
const size_t helpMessageSize = 1200;
|
char helpMessage[MAX_STR_LENGTH];
|
||||||
char helpMessage[helpMessageSize];
|
memset(helpMessage, 0, MAX_STR_LENGTH);
|
||||||
{
|
sprintf(
|
||||||
memset(helpMessage, 0, helpMessageSize);
|
helpMessage,
|
||||||
int len = snprintf(
|
"Usage: %s [arguments]\n"
|
||||||
helpMessage, helpMessageSize,
|
"Possible arguments are:\n"
|
||||||
"Usage: %s [arguments]\n"
|
"\t-v, --version : Software version\n"
|
||||||
"Possible arguments are:\n"
|
"\t-p, --port <port> : TCP communication port with client. \n"
|
||||||
"\t-v, --version : Software version\n"
|
"\t-g, --nomodule : [Mythen3][Gotthard2] Generic or No "
|
||||||
"\t-p, --port <port> : TCP communication port with client. "
|
"Module mode. Skips detector type checks. \n"
|
||||||
"\n"
|
"\t-f, --phaseshift <value> : [Gotthard] only. Sets phase shift. \n"
|
||||||
"\t-g, --nomodule : [Mythen3][Gotthard2] \n"
|
"\t-d, --devel : Developer mode. Skips firmware checks. \n"
|
||||||
"\t Generic or No Module mode. Skips "
|
"\t-u, --update : Update mode. Skips firmware checks and "
|
||||||
"detector type checks. \n"
|
"initial detector setup. \n"
|
||||||
"\t-f, --phaseshift <value> : [Gotthard] only. Sets phase shift. \n"
|
"\t-s, --stopserver : Stop server. Do not use as it is created "
|
||||||
"\t-d, --devel : Developer mode. Skips firmware "
|
"by "
|
||||||
"checks. \n"
|
"control server \n\n",
|
||||||
"\t-u, --update : Update mode. Skips firmware checks "
|
argv[0]);
|
||||||
"and "
|
|
||||||
"initial detector setup. \n"
|
|
||||||
"\t-i, --ignore-config : "
|
|
||||||
"[Eiger][Jungfrau][Gotthard][Gotthard2] \n"
|
|
||||||
"\t Ignore config file. \n"
|
|
||||||
"\t-m, --master <master> : "
|
|
||||||
"[Eiger][Mythen3][Gotthard][Gotthard2] \n"
|
|
||||||
"\t Set Master to 0 or 1. Precedence "
|
|
||||||
"over "
|
|
||||||
"config file. Only for virtual servers except Eiger. \n"
|
|
||||||
"\t-t, --top <top> : [Eiger] Set Top to 0 or 1. "
|
|
||||||
"Precedence "
|
|
||||||
"over config file. \n"
|
|
||||||
"\t-s, --stopserver : Stop server. Do not use as it is "
|
|
||||||
"created "
|
|
||||||
"by control server \n\n",
|
|
||||||
argv[0]);
|
|
||||||
if (len >= (int)helpMessageSize) {
|
|
||||||
LOG(logERROR, ("Help for Server command line arguments size %d "
|
|
||||||
"exceed capacity of %d characters\n",
|
|
||||||
len, helpMessageSize));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse command line for config
|
// parse command line for config
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
@ -119,9 +80,6 @@ int main(int argc, char *argv[]) {
|
|||||||
{"nomodule", no_argument, NULL, 'g'}, // generic
|
{"nomodule", no_argument, NULL, 'g'}, // generic
|
||||||
{"devel", no_argument, NULL, 'd'},
|
{"devel", no_argument, NULL, 'd'},
|
||||||
{"update", no_argument, NULL, 'u'},
|
{"update", no_argument, NULL, 'u'},
|
||||||
{"ignore-config", no_argument, NULL, 'i'},
|
|
||||||
{"master", required_argument, NULL, 'm'},
|
|
||||||
{"top", required_argument, NULL, 't'},
|
|
||||||
{"stopserver", no_argument, NULL, 's'},
|
{"stopserver", no_argument, NULL, 's'},
|
||||||
{NULL, 0, NULL, 0}};
|
{NULL, 0, NULL, 0}};
|
||||||
|
|
||||||
@ -131,8 +89,7 @@ int main(int argc, char *argv[]) {
|
|||||||
int c = 0;
|
int c = 0;
|
||||||
|
|
||||||
while (c != -1) {
|
while (c != -1) {
|
||||||
c = getopt_long(argc, argv, "hvp:f:gduim:t:s", long_options,
|
c = getopt_long(argc, argv, "hvp:f:gdus", long_options, &option_index);
|
||||||
&option_index);
|
|
||||||
|
|
||||||
// Detect the end of the options
|
// Detect the end of the options
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
@ -203,57 +160,6 @@ int main(int argc, char *argv[]) {
|
|||||||
isControlServer = 0;
|
isControlServer = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'i':
|
|
||||||
#if defined(EIGERD) || defined(GOTTHARDD) || defined(GOTTHARD2D) || \
|
|
||||||
defined(JUNGFRAUD)
|
|
||||||
LOG(logINFO, ("Ignoring config file\n"));
|
|
||||||
ignoreConfigFileFlag = 1;
|
|
||||||
#else
|
|
||||||
LOG(logERROR, ("No server config files for this detector\n"));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'm':
|
|
||||||
#if (defined(MYTHEN3D) || defined(GOTTHARDD) || defined(GOTTHARD2D)) && \
|
|
||||||
!defined(VIRTUAL)
|
|
||||||
LOG(logERROR, ("Cannot set master via the detector server for this "
|
|
||||||
"detector\n"));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#elif defined(GOTTHARDD) || defined(GOTTHARD2D) || defined(EIGERD) || \
|
|
||||||
defined(MYTHEN3D)
|
|
||||||
if (sscanf(optarg, "%d", &masterCommandLine) != 1) {
|
|
||||||
LOG(logERROR, ("Cannot scan master argument\n%s", helpMessage));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
if (masterCommandLine == 1) {
|
|
||||||
LOG(logINFO, ("Detector Master mode\n"));
|
|
||||||
} else {
|
|
||||||
LOG(logINFO, ("Detector Slave mode\n"));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
LOG(logERROR, ("No master implemented for this detector server\n"));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 't':
|
|
||||||
#ifdef EIGERD
|
|
||||||
if (sscanf(optarg, "%d", &topCommandLine) != 1) {
|
|
||||||
LOG(logERROR, ("Cannot scan top argument\n%s", helpMessage));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
if (topCommandLine == 1) {
|
|
||||||
LOG(logINFO, ("Detector Top mode\n"));
|
|
||||||
} else {
|
|
||||||
LOG(logINFO, ("Detector Bottom mode\n"));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
LOG(logERROR, ("No top implemented for this detector server\n"));
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'h':
|
case 'h':
|
||||||
printf("%s", helpMessage);
|
printf("%s", helpMessage);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
@ -37,8 +37,6 @@ const enum detectorType myDetectorType = GOTTHARD2;
|
|||||||
const enum detectorType myDetectorType = GENERIC;
|
const enum detectorType myDetectorType = GENERIC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LOCALHOSTIP_INT 2130706433
|
|
||||||
|
|
||||||
// Global variables from communication_funcs
|
// Global variables from communication_funcs
|
||||||
extern int lockStatus;
|
extern int lockStatus;
|
||||||
extern uint32_t lastClientIP;
|
extern uint32_t lastClientIP;
|
||||||
@ -54,7 +52,6 @@ int sockfd = 0;
|
|||||||
int debugflag = 0;
|
int debugflag = 0;
|
||||||
int updateFlag = 0;
|
int updateFlag = 0;
|
||||||
int checkModuleFlag = 1;
|
int checkModuleFlag = 1;
|
||||||
int ignoreConfigFileFlag = 0;
|
|
||||||
|
|
||||||
udpStruct udpDetails[MAX_UDP_DESTINATION];
|
udpStruct udpDetails[MAX_UDP_DESTINATION];
|
||||||
int numUdpDestinations = 1;
|
int numUdpDestinations = 1;
|
||||||
@ -81,32 +78,28 @@ char scanErrMessage[MAX_STR_LENGTH] = "";
|
|||||||
/* initialization functions */
|
/* initialization functions */
|
||||||
|
|
||||||
int updateModeAllowedFunction(int file_des) {
|
int updateModeAllowedFunction(int file_des) {
|
||||||
enum detFuncs allowedFuncs[] = {F_EXEC_COMMAND,
|
unsigned int listsize = 19;
|
||||||
F_GET_DETECTOR_TYPE,
|
enum detFuncs list[] = {F_EXEC_COMMAND,
|
||||||
F_GET_FIRMWARE_VERSION,
|
F_GET_DETECTOR_TYPE,
|
||||||
F_GET_SERVER_VERSION,
|
F_GET_FIRMWARE_VERSION,
|
||||||
F_GET_SERIAL_NUMBER,
|
F_GET_SERVER_VERSION,
|
||||||
F_WRITE_REGISTER,
|
F_GET_SERIAL_NUMBER,
|
||||||
F_READ_REGISTER,
|
F_WRITE_REGISTER,
|
||||||
F_LOCK_SERVER,
|
F_READ_REGISTER,
|
||||||
F_GET_LAST_CLIENT_IP,
|
F_LOCK_SERVER,
|
||||||
F_PROGRAM_FPGA,
|
F_GET_LAST_CLIENT_IP,
|
||||||
F_RESET_FPGA,
|
F_PROGRAM_FPGA,
|
||||||
F_CHECK_VERSION,
|
F_RESET_FPGA,
|
||||||
F_COPY_DET_SERVER,
|
F_CHECK_VERSION,
|
||||||
F_REBOOT_CONTROLLER,
|
F_COPY_DET_SERVER,
|
||||||
F_GET_KERNEL_VERSION,
|
F_REBOOT_CONTROLLER,
|
||||||
F_UPDATE_KERNEL,
|
F_GET_KERNEL_VERSION,
|
||||||
F_UPDATE_DETECTOR_SERVER,
|
F_UPDATE_KERNEL,
|
||||||
F_GET_UPDATE_MODE,
|
F_UPDATE_DETECTOR_SERVER,
|
||||||
F_SET_UPDATE_MODE,
|
F_GET_UPDATE_MODE,
|
||||||
F_GET_NUM_CHANNELS,
|
F_SET_UPDATE_MODE};
|
||||||
F_GET_NUM_INTERFACES,
|
for (unsigned int i = 0; i < listsize; ++i) {
|
||||||
F_ACTIVATE};
|
if ((unsigned int)fnum == list[i]) {
|
||||||
size_t allowedFuncsSize = sizeof(allowedFuncs) / sizeof(enum detFuncs);
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < allowedFuncsSize; ++i) {
|
|
||||||
if ((unsigned int)fnum == allowedFuncs[i]) {
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -126,11 +119,10 @@ int printSocketReadError() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void init_detector() {
|
void init_detector() {
|
||||||
memset(udpDetails, 0, sizeof(udpDetails));
|
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
LOG(logINFO, ("This is a VIRTUAL detector\n"));
|
LOG(logINFO, ("This is a VIRTUAL detector\n"));
|
||||||
udpDetails[0].srcip = LOCALHOSTIP_INT;
|
|
||||||
#endif
|
#endif
|
||||||
|
memset(udpDetails, 0, sizeof(udpDetails));
|
||||||
udpDetails[0].srcport = DEFAULT_UDP_SRC_PORTNO;
|
udpDetails[0].srcport = DEFAULT_UDP_SRC_PORTNO;
|
||||||
udpDetails[0].dstport = DEFAULT_UDP_DST_PORTNO;
|
udpDetails[0].dstport = DEFAULT_UDP_DST_PORTNO;
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
@ -469,9 +461,6 @@ void function_table() {
|
|||||||
flist[F_UPDATE_DETECTOR_SERVER] = &update_detector_server;
|
flist[F_UPDATE_DETECTOR_SERVER] = &update_detector_server;
|
||||||
flist[F_GET_UPDATE_MODE] = &get_update_mode;
|
flist[F_GET_UPDATE_MODE] = &get_update_mode;
|
||||||
flist[F_SET_UPDATE_MODE] = &set_update_mode;
|
flist[F_SET_UPDATE_MODE] = &set_update_mode;
|
||||||
flist[F_SET_MASTER] = &set_master;
|
|
||||||
flist[F_GET_TOP] = &get_top;
|
|
||||||
flist[F_SET_TOP] = &set_top;
|
|
||||||
|
|
||||||
// check
|
// check
|
||||||
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
|
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
|
||||||
@ -2819,9 +2808,6 @@ int set_dynamic_range(int file_des) {
|
|||||||
#endif
|
#endif
|
||||||
#if defined(EIGERD) || defined(MYTHEN3D)
|
#if defined(EIGERD) || defined(MYTHEN3D)
|
||||||
case 8:
|
case 8:
|
||||||
#ifdef EIGERD
|
|
||||||
case 12:
|
|
||||||
#endif
|
|
||||||
case 16:
|
case 16:
|
||||||
case 32:
|
case 32:
|
||||||
#endif
|
#endif
|
||||||
@ -2829,25 +2815,14 @@ int set_dynamic_range(int file_des) {
|
|||||||
defined(MOENCHD) || defined(GOTTHARD2D)
|
defined(MOENCHD) || defined(GOTTHARD2D)
|
||||||
case 16:
|
case 16:
|
||||||
#endif
|
#endif
|
||||||
if (dr >= 0) {
|
retval = setDynamicRange(dr);
|
||||||
ret = setDynamicRange(dr);
|
LOG(logDEBUG1, ("Dynamic range: %d\n", retval));
|
||||||
if (ret == FAIL) {
|
if (retval == -1) {
|
||||||
sprintf(mess, "Could not set dynamic range to %d\n", dr);
|
ret = FAIL;
|
||||||
LOG(logERROR, (mess));
|
sprintf(mess, "Could not get dynamic range.\n");
|
||||||
}
|
LOG(logERROR, (mess));
|
||||||
}
|
|
||||||
|
|
||||||
// get
|
|
||||||
if (ret == OK) {
|
|
||||||
ret = getDynamicRange(&retval);
|
|
||||||
if (ret == FAIL) {
|
|
||||||
strcpy(mess, "Could not get dynamic range\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
LOG(logDEBUG1, ("Dynamic range: %d\n", retval));
|
|
||||||
validate(&ret, mess, dr, retval, "set dynamic range", DEC);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
validate(&ret, mess, dr, retval, "set dynamic range", DEC);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
modeNotImplemented("Dynamic range", dr);
|
modeNotImplemented("Dynamic range", dr);
|
||||||
@ -2957,7 +2932,7 @@ int enable_ten_giga(int file_des) {
|
|||||||
|
|
||||||
if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0)
|
if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG, ("Setting 10GbE: %d\n", arg));
|
LOG(logINFOBLUE, ("Setting 10GbE: %d\n", arg));
|
||||||
|
|
||||||
#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(GOTTHARD2D)
|
#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(GOTTHARD2D)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
@ -3995,27 +3970,29 @@ int check_version(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
|
||||||
// check software- firmware compatibility and basic tests
|
// check software- firmware compatibility and basic tests
|
||||||
LOG(logDEBUG1, ("Checking software-firmware compatibility and basic "
|
if (isControlServer) {
|
||||||
"test result\n"));
|
LOG(logDEBUG1, ("Checking software-firmware compatibility and basic "
|
||||||
|
"test result\n"));
|
||||||
|
|
||||||
// check if firmware check is done
|
// check if firmware check is done
|
||||||
if (!isInitCheckDone()) {
|
|
||||||
usleep(3 * 1000 * 1000);
|
|
||||||
if (!isInitCheckDone()) {
|
if (!isInitCheckDone()) {
|
||||||
ret = FAIL;
|
usleep(3 * 1000 * 1000);
|
||||||
strcpy(mess, "Server Initialization still not done done in server. "
|
if (!isInitCheckDone()) {
|
||||||
"Unexpected.\n");
|
ret = FAIL;
|
||||||
LOG(logERROR, (mess));
|
strcpy(mess, "Firmware Software Compatibility Check (Server "
|
||||||
|
"Initialization) "
|
||||||
|
"still not done done in server. Unexpected.\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
// check firmware check result
|
||||||
|
if (ret == OK) {
|
||||||
// check firmware check result
|
char *firmware_message = NULL;
|
||||||
if (ret == OK) {
|
if (getInitResult(&firmware_message) == FAIL) {
|
||||||
char *firmware_message = NULL;
|
ret = FAIL;
|
||||||
if (getInitResult(&firmware_message) == FAIL) {
|
strcpy(mess, firmware_message);
|
||||||
ret = FAIL;
|
LOG(logERROR, (mess));
|
||||||
strcpy(mess, firmware_message);
|
}
|
||||||
LOG(logERROR, (mess));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4434,10 +4411,9 @@ int set_next_frame_number(int file_des) {
|
|||||||
|
|
||||||
if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0)
|
if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Setting next frame number to %llu\n", arg));
|
LOG(logINFO, ("Setting next frame number to %llu\n", arg));
|
||||||
|
|
||||||
#if (!defined(EIGERD)) && (!defined(JUNGFRAUD)) && (!defined(MOENCHD)) && \
|
#if (!defined(EIGERD)) && (!defined(JUNGFRAUD))
|
||||||
(!defined(CHIPTESTBOARDD))
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -4447,7 +4423,7 @@ int set_next_frame_number(int file_des) {
|
|||||||
sprintf(mess, "Could not set next frame number. Cannot be 0.\n");
|
sprintf(mess, "Could not set next frame number. Cannot be 0.\n");
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
}
|
}
|
||||||
#if (defined(EIGERD)) || (defined(MOENCHD)) || (defined(CHIPTESTBOARDD))
|
#ifdef EIGERD
|
||||||
else if (arg > UDP_HEADER_MAX_FRAME_VALUE) {
|
else if (arg > UDP_HEADER_MAX_FRAME_VALUE) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
@ -4467,18 +4443,16 @@ int set_next_frame_number(int file_des) {
|
|||||||
else {
|
else {
|
||||||
ret = setNextFrameNumber(arg);
|
ret = setNextFrameNumber(arg);
|
||||||
if (ret == FAIL) {
|
if (ret == FAIL) {
|
||||||
sprintf(
|
sprintf(mess, "Could not set next frame number. Failed to "
|
||||||
mess, "Could not set next frame number. %s\n",
|
"map address.\n");
|
||||||
(myDetectorType == EIGER ? "Failed to map address" : ""));
|
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
}
|
}
|
||||||
if (ret == OK) {
|
if (ret == OK) {
|
||||||
uint64_t retval = 0;
|
uint64_t retval = 0;
|
||||||
ret = getNextFrameNumber(&retval);
|
ret = getNextFrameNumber(&retval);
|
||||||
if (ret == FAIL) {
|
if (ret == FAIL) {
|
||||||
sprintf(mess, "Could not set next frame number. %s\n",
|
sprintf(mess, "Could not get next frame number. Failed "
|
||||||
(myDetectorType == EIGER ? "Failed to map address"
|
"to map address.\n");
|
||||||
: ""));
|
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else if (ret == -2) {
|
} else if (ret == -2) {
|
||||||
sprintf(mess, "Inconsistent next frame number from "
|
sprintf(mess, "Inconsistent next frame number from "
|
||||||
@ -4515,15 +4489,14 @@ int get_next_frame_number(int file_des) {
|
|||||||
|
|
||||||
LOG(logDEBUG1, ("Getting next frame number \n"));
|
LOG(logDEBUG1, ("Getting next frame number \n"));
|
||||||
|
|
||||||
#if (!defined(EIGERD)) && (!defined(JUNGFRAUD)) && (!defined(MOENCHD)) && \
|
#if (!defined(EIGERD)) && (!defined(JUNGFRAUD))
|
||||||
(!defined(CHIPTESTBOARDD))
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get
|
// get
|
||||||
ret = getNextFrameNumber(&retval);
|
ret = getNextFrameNumber(&retval);
|
||||||
if (ret == FAIL) {
|
if (ret == FAIL) {
|
||||||
sprintf(mess, "Could not set next frame number. %s\n",
|
sprintf(mess, "Could not get next frame number. Failed to map "
|
||||||
(myDetectorType == EIGER ? "Failed to map address" : ""));
|
"address.\n");
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else if (ret == -2) {
|
} else if (ret == -2) {
|
||||||
sprintf(mess, "Inconsistent next frame number from left and right "
|
sprintf(mess, "Inconsistent next frame number from left and right "
|
||||||
@ -4666,17 +4639,11 @@ int set_read_n_rows(int file_des) {
|
|||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else {
|
} else {
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
int dr = 0;
|
int dr = setDynamicRange(GET_FLAG);
|
||||||
ret = getDynamicRange(&dr);
|
|
||||||
int isTenGiga = enableTenGigabitEthernet(GET_FLAG);
|
int isTenGiga = enableTenGigabitEthernet(GET_FLAG);
|
||||||
unsigned int maxnl = MAX_ROWS_PER_READOUT;
|
unsigned int maxnl = MAX_ROWS_PER_READOUT;
|
||||||
unsigned int maxnp = (isTenGiga ? 4 : 16) * dr;
|
unsigned int maxnp = (isTenGiga ? 4 : 16) * dr;
|
||||||
// get dr fail
|
if ((arg * maxnp) % maxnl) {
|
||||||
if (ret == FAIL) {
|
|
||||||
strcpy(mess,
|
|
||||||
"Could not read n rows (failed to get dynamic range)\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else if ((arg * maxnp) % maxnl) {
|
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
sprintf(mess,
|
sprintf(mess,
|
||||||
"Could not set number of rows to %d. For %d bit "
|
"Could not set number of rows to %d. For %d bit "
|
||||||
@ -4758,22 +4725,19 @@ void calculate_and_set_position() {
|
|||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int maxy = maxydet;
|
||||||
// calculating new position
|
// position does not change for gotthard2 (2 interfaces)
|
||||||
int modulePorts[2] = {1, 1};
|
#ifdef JUNGFRAUD
|
||||||
// position does change for eiger and jungfrau (2 interfaces)
|
maxy *= getNumberofUDPInterfaces();
|
||||||
#if defined(EIGERD)
|
|
||||||
modulePorts[1] = getNumberofUDPInterfaces(); // horz
|
|
||||||
#elif defined(JUNGFRAUD)
|
|
||||||
modulePorts[0] = getNumberofUDPInterfaces(); // vert
|
|
||||||
#endif
|
#endif
|
||||||
int maxy = maxydet * modulePorts[0];
|
|
||||||
int pos[2] = {0, 0};
|
int pos[2] = {0, 0};
|
||||||
// row
|
// row
|
||||||
pos[0] = (detectorId % maxy);
|
pos[0] = (detectorId % maxy);
|
||||||
// col for horiz. udp ports
|
// col for horiz. udp ports
|
||||||
pos[1] = (detectorId / maxy) * modulePorts[1];
|
pos[1] = (detectorId / maxy);
|
||||||
|
#ifdef EIGERD
|
||||||
|
pos[1] *= 2;
|
||||||
|
#endif
|
||||||
LOG(logDEBUG, ("Setting Positions (%d,%d)\n", pos[0], pos[1]));
|
LOG(logDEBUG, ("Setting Positions (%d,%d)\n", pos[0], pos[1]));
|
||||||
if (setDetectorPosition(pos) == FAIL) {
|
if (setDetectorPosition(pos) == FAIL) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
@ -4884,15 +4848,12 @@ int is_udp_configured() {
|
|||||||
LOG(logWARNING, ("%s", configureMessage));
|
LOG(logWARNING, ("%s", configureMessage));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
// virtual: no check (can be eth name: lo, ip: 127.0.0.1)
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
if (udpDetails[i].dstmac == 0) {
|
if (udpDetails[i].dstmac == 0) {
|
||||||
sprintf(configureMessage,
|
sprintf(configureMessage,
|
||||||
"udp destination mac not configured [entry:%d]\n", i);
|
"udp destination mac not configured [entry:%d]\n", i);
|
||||||
LOG(logWARNING, ("%s", configureMessage));
|
LOG(logWARNING, ("%s", configureMessage));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#if defined(JUNGFRAUD) || defined(GOTTHARD2D)
|
#if defined(JUNGFRAUD) || defined(GOTTHARD2D)
|
||||||
if (getNumberofUDPInterfaces() == 2) {
|
if (getNumberofUDPInterfaces() == 2) {
|
||||||
if (udpDetails[i].srcip2 == 0) {
|
if (udpDetails[i].srcip2 == 0) {
|
||||||
@ -4913,14 +4874,12 @@ int is_udp_configured() {
|
|||||||
LOG(logWARNING, ("%s", configureMessage));
|
LOG(logWARNING, ("%s", configureMessage));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
#ifndef VIRTUAL
|
|
||||||
if (udpDetails[i].dstmac2 == 0) {
|
if (udpDetails[i].dstmac2 == 0) {
|
||||||
sprintf(configureMessage,
|
sprintf(configureMessage,
|
||||||
"udp destination mac2 not configured [entry:%d]\n", i);
|
"udp destination mac2 not configured [entry:%d]\n", i);
|
||||||
LOG(logWARNING, ("%s", configureMessage));
|
LOG(logWARNING, ("%s", configureMessage));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -5361,16 +5320,7 @@ int set_num_interfaces(int file_des) {
|
|||||||
LOG(logINFO, ("Setting number of interfaces: %d\n", arg));
|
LOG(logINFO, ("Setting number of interfaces: %d\n", arg));
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
|
#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
|
||||||
// fixed number of udp interfaces
|
functionNotImplemented();
|
||||||
int num_interfaces = getNumberofUDPInterfaces();
|
|
||||||
if (arg != num_interfaces) {
|
|
||||||
ret = FAIL;
|
|
||||||
sprintf(mess,
|
|
||||||
"Could not set number of interfaces. Invalid value: %d. Must "
|
|
||||||
"be %d\n",
|
|
||||||
arg, num_interfaces);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
@ -5430,9 +5380,12 @@ int get_num_interfaces(int file_des) {
|
|||||||
int retval = -1;
|
int retval = -1;
|
||||||
LOG(logDEBUG1, ("Getting number of udp interfaces\n"));
|
LOG(logDEBUG1, ("Getting number of udp interfaces\n"));
|
||||||
|
|
||||||
|
#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
|
||||||
|
retval = 1;
|
||||||
|
#else
|
||||||
// get only
|
// get only
|
||||||
retval = getNumberofUDPInterfaces();
|
retval = getNumberofUDPInterfaces();
|
||||||
|
#endif
|
||||||
LOG(logDEBUG1, ("Number of udp interfaces retval: %u\n", retval));
|
LOG(logDEBUG1, ("Number of udp interfaces retval: %u\n", retval));
|
||||||
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
||||||
}
|
}
|
||||||
@ -6930,7 +6883,11 @@ int get_receiver_parameters(int file_des) {
|
|||||||
|
|
||||||
// sending real detector parameters
|
// sending real detector parameters
|
||||||
// udp interfaces
|
// udp interfaces
|
||||||
|
#if defined(JUNGFRAUD) || defined(GOTTHARD2D)
|
||||||
i32 = getNumberofUDPInterfaces();
|
i32 = getNumberofUDPInterfaces();
|
||||||
|
#else
|
||||||
|
i32 = 1;
|
||||||
|
#endif
|
||||||
n += sendData(file_des, &i32, sizeof(i32), INT32);
|
n += sendData(file_des, &i32, sizeof(i32), INT32);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
@ -7134,10 +7091,7 @@ int get_receiver_parameters(int file_des) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// dynamic range
|
// dynamic range
|
||||||
ret = getDynamicRange(&i32);
|
i32 = setDynamicRange(GET_FLAG);
|
||||||
if (ret == FAIL) {
|
|
||||||
i32 = 0;
|
|
||||||
}
|
|
||||||
n += sendData(file_des, &i32, sizeof(i32), INT32);
|
n += sendData(file_des, &i32, sizeof(i32), INT32);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
@ -8219,60 +8173,14 @@ int get_master(int file_des) {
|
|||||||
|
|
||||||
LOG(logDEBUG1, ("Getting master\n"));
|
LOG(logDEBUG1, ("Getting master\n"));
|
||||||
|
|
||||||
#if !defined(MYTHEN3D) && !defined(EIGERD) && !defined(GOTTHARDD) && \
|
#if !defined(MYTHEN3D) && !defined(EIGERD) && !defined(GOTTHARDD)
|
||||||
!defined(GOTTHARD2D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
ret = isMaster(&retval);
|
retval = isMaster();
|
||||||
if (ret == FAIL) {
|
|
||||||
strcpy(mess, "Could not get master\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
||||||
}
|
}
|
||||||
|
|
||||||
int set_master(int file_des) {
|
|
||||||
ret = OK;
|
|
||||||
memset(mess, 0, sizeof(mess));
|
|
||||||
int arg = -1;
|
|
||||||
|
|
||||||
if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0)
|
|
||||||
return printSocketReadError();
|
|
||||||
LOG(logDEBUG1, ("Setting master: %u\n", (int)arg));
|
|
||||||
|
|
||||||
#ifndef EIGERD
|
|
||||||
functionNotImplemented();
|
|
||||||
#else
|
|
||||||
// only set
|
|
||||||
if (Server_VerifyLock() == OK) {
|
|
||||||
if ((check_detector_idle("set master") == OK) &&
|
|
||||||
(arg != 0 && arg != 1)) {
|
|
||||||
ret = FAIL;
|
|
||||||
sprintf(mess, "Could not set master. Invalid argument %d.\n", arg);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
ret = setMaster(arg == 1 ? OW_MASTER : OW_SLAVE);
|
|
||||||
if (ret == FAIL) {
|
|
||||||
strcpy(mess, "Could not set master\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
int retval = 0;
|
|
||||||
ret = isMaster(&retval);
|
|
||||||
if (ret == FAIL) {
|
|
||||||
strcpy(mess, "Could not get master\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
LOG(logDEBUG1, ("master retval: %u\n", retval));
|
|
||||||
validate(&ret, mess, arg, retval, "set master", DEC);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_csr(int file_des) {
|
int get_csr(int file_des) {
|
||||||
ret = OK;
|
ret = OK;
|
||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
@ -9444,15 +9352,6 @@ int receive_program(int file_des, enum PROGRAM_INDEX index) {
|
|||||||
LOG(logINFO, ("\tServer Name: %s\n", serverName));
|
LOG(logINFO, ("\tServer Name: %s\n", serverName));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD)
|
|
||||||
int forceDeleteNormalFile = 0;
|
|
||||||
if (receiveData(file_des, &forceDeleteNormalFile,
|
|
||||||
sizeof(forceDeleteNormalFile), INT32) < 0)
|
|
||||||
return printSocketReadError();
|
|
||||||
LOG(logINFO,
|
|
||||||
("\tForce Delete Normal File flag? %s\n", (forceDeleteNormalFile ? "Y" : "N")));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// in same folder as current process (will also work for virtual then
|
// in same folder as current process (will also work for virtual then
|
||||||
// with write permissions)
|
// with write permissions)
|
||||||
{
|
{
|
||||||
@ -9477,7 +9376,7 @@ int receive_program(int file_des, enum PROGRAM_INDEX index) {
|
|||||||
checksum, serverName);
|
checksum, serverName);
|
||||||
#else
|
#else
|
||||||
receive_program_via_blackfin(file_des, index, functionType,
|
receive_program_via_blackfin(file_des, index, functionType,
|
||||||
filesize, checksum, serverName, forceDeleteNormalFile);
|
filesize, checksum, serverName);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9493,7 +9392,7 @@ int receive_program(int file_des, enum PROGRAM_INDEX index) {
|
|||||||
|
|
||||||
void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index,
|
void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index,
|
||||||
char *functionType, uint64_t filesize,
|
char *functionType, uint64_t filesize,
|
||||||
char *checksum, char *serverName, int forceDeleteNormalFile) {
|
char *checksum, char *serverName) {
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && \
|
#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && \
|
||||||
!defined(GOTTHARDD)
|
!defined(GOTTHARDD)
|
||||||
@ -9592,7 +9491,7 @@ void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index,
|
|||||||
case PROGRAM_FPGA:
|
case PROGRAM_FPGA:
|
||||||
case PROGRAM_KERNEL:
|
case PROGRAM_KERNEL:
|
||||||
ret = eraseAndWriteToFlash(mess, index, functionType, checksum,
|
ret = eraseAndWriteToFlash(mess, index, functionType, checksum,
|
||||||
totalsize, forceDeleteNormalFile);
|
totalsize);
|
||||||
break;
|
break;
|
||||||
case PROGRAM_SERVER:
|
case PROGRAM_SERVER:
|
||||||
ret = moveBinaryFile(mess, serverName, TEMP_PROG_FILE_NAME,
|
ret = moveBinaryFile(mess, serverName, TEMP_PROG_FILE_NAME,
|
||||||
@ -9756,69 +9655,3 @@ int set_update_mode(int file_des) {
|
|||||||
|
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
return Server_SendResult(file_des, INT32, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_top(int file_des) {
|
|
||||||
ret = OK;
|
|
||||||
memset(mess, 0, sizeof(mess));
|
|
||||||
int retval = -1;
|
|
||||||
LOG(logDEBUG1, ("Getting top\n"));
|
|
||||||
|
|
||||||
#ifndef EIGERD
|
|
||||||
functionNotImplemented();
|
|
||||||
#else
|
|
||||||
// get only
|
|
||||||
ret = isTop(&retval);
|
|
||||||
if (ret == FAIL) {
|
|
||||||
strcpy(mess, "Could not get Top\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
LOG(logDEBUG1, ("retval top: %d\n", retval));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
|
||||||
}
|
|
||||||
|
|
||||||
int set_top(int file_des) {
|
|
||||||
ret = OK;
|
|
||||||
memset(mess, 0, sizeof(mess));
|
|
||||||
int arg = -1;
|
|
||||||
|
|
||||||
if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0)
|
|
||||||
return printSocketReadError();
|
|
||||||
LOG(logDEBUG1, ("Setting top : %u\n", arg));
|
|
||||||
|
|
||||||
#ifndef EIGERD
|
|
||||||
functionNotImplemented();
|
|
||||||
#else
|
|
||||||
|
|
||||||
// only set
|
|
||||||
if (Server_VerifyLock() == OK) {
|
|
||||||
if (arg != 0 && arg != 1) {
|
|
||||||
ret = FAIL;
|
|
||||||
sprintf(
|
|
||||||
mess,
|
|
||||||
"Could not set top mode. Invalid value: %d. Must be 0 or 1\n",
|
|
||||||
arg);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
ret = setTop(arg == 1 ? OW_TOP : OW_BOTTOM);
|
|
||||||
if (ret == FAIL) {
|
|
||||||
sprintf(mess, "Could not set %s\n",
|
|
||||||
(arg == 1 ? "Top" : "Bottom"));
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
int retval = -1;
|
|
||||||
ret = isTop(&retval);
|
|
||||||
if (ret == FAIL) {
|
|
||||||
strcpy(mess, "Could not get Top mode\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
LOG(logDEBUG1, ("retval top: %d\n", retval));
|
|
||||||
validate(&ret, mess, arg, retval, "set top mode", DEC);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
|
||||||
}
|
|
@ -7,7 +7,6 @@ set(SOURCES
|
|||||||
src/CmdProxy.cpp
|
src/CmdProxy.cpp
|
||||||
src/CmdParser.cpp
|
src/CmdParser.cpp
|
||||||
src/Pattern.cpp
|
src/Pattern.cpp
|
||||||
src/CtbConfig.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(slsDetectorObject OBJECT
|
add_library(slsDetectorObject OBJECT
|
||||||
|
@ -193,12 +193,6 @@ class Detector {
|
|||||||
*/
|
*/
|
||||||
void setFlipRows(bool value, Positions pos = {});
|
void setFlipRows(bool value, Positions pos = {});
|
||||||
|
|
||||||
/** [Eiger][Mythen3][Gotthard1] via stop server **/
|
|
||||||
Result<bool> getMaster(Positions pos = {}) const;
|
|
||||||
|
|
||||||
/** [Eiger] Set half module to master and the others to slaves */
|
|
||||||
void setMaster(bool value, int pos);
|
|
||||||
|
|
||||||
Result<bool> isVirtualDetectorServer(Positions pos = {}) const;
|
Result<bool> isVirtualDetectorServer(Positions pos = {}) const;
|
||||||
///@}
|
///@}
|
||||||
|
|
||||||
@ -290,7 +284,7 @@ class Detector {
|
|||||||
Result<int> getDynamicRange(Positions pos = {}) const;
|
Result<int> getDynamicRange(Positions pos = {}) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [Eiger] Options: 4, 8, 12, 16, 32. If i is 32, also sets clkdivider to 2,
|
* [Eiger] Options: 4, 8, 16, 32. If i is 32, also sets clkdivider to 2,
|
||||||
* else sets clkdivider to 1 \n [Mythen3] Options: 8, 16, 32 \n
|
* else sets clkdivider to 1 \n [Mythen3] Options: 8, 16, 32 \n
|
||||||
* [Jungfrau][Gotthard][Ctb][Moench][Mythen3][Gotthard2] 16
|
* [Jungfrau][Gotthard][Ctb][Moench][Mythen3][Gotthard2] 16
|
||||||
*/
|
*/
|
||||||
@ -573,7 +567,7 @@ class Detector {
|
|||||||
/** Non blocking: start detector acquisition. Status changes to RUNNING or
|
/** Non blocking: start detector acquisition. Status changes to RUNNING or
|
||||||
* WAITING and automatically returns to idle at the end of acquisition.
|
* WAITING and automatically returns to idle at the end of acquisition.
|
||||||
[Mythen3] Master starts acquisition first */
|
[Mythen3] Master starts acquisition first */
|
||||||
void startDetector(Positions pos = {});
|
void startDetector();
|
||||||
|
|
||||||
/** [Mythen3] Non blocking: start detector readout of counters in chip.
|
/** [Mythen3] Non blocking: start detector readout of counters in chip.
|
||||||
* Status changes to TRANSMITTING and automatically returns to idle at the
|
* Status changes to TRANSMITTING and automatically returns to idle at the
|
||||||
@ -592,22 +586,19 @@ class Detector {
|
|||||||
/** Options: IDLE, TRANSMITTING, RUNNING */
|
/** Options: IDLE, TRANSMITTING, RUNNING */
|
||||||
Result<defs::runStatus> getReceiverStatus(Positions pos = {}) const;
|
Result<defs::runStatus> getReceiverStatus(Positions pos = {}) const;
|
||||||
|
|
||||||
/** Gets the number of frames caught for each port in receiver. */
|
Result<int64_t> getFramesCaught(Positions pos = {}) const;
|
||||||
Result<std::vector<int64_t>> getFramesCaught(Positions pos = {}) const;
|
|
||||||
|
|
||||||
/** Gets the number of missing packets for each port in receiver. Negative
|
/** Gets the number of missing packets for each port in receiver.
|
||||||
* number denotes extra packets. */
|
* Troubleshoot: If they are large numbers, convert it to signed to get
|
||||||
Result<std::vector<int64_t>> getNumMissingPackets(Positions pos = {}) const;
|
* number of access packets received */
|
||||||
|
Result<std::vector<uint64_t>>
|
||||||
|
getNumMissingPackets(Positions pos = {}) const;
|
||||||
|
|
||||||
/** Gets frame index for each port in receiver. */
|
/** [Eiger][Jungfrau] */
|
||||||
Result<std::vector<int64_t>>
|
|
||||||
getRxCurrentFrameIndex(Positions pos = {}) const;
|
|
||||||
|
|
||||||
/** [Eiger][Jungfrau][Moench][CTB] */
|
|
||||||
Result<uint64_t> getNextFrameNumber(Positions pos = {}) const;
|
Result<uint64_t> getNextFrameNumber(Positions pos = {}) const;
|
||||||
|
|
||||||
/** [Eiger][Jungfrau][Moench][CTB] Stopping acquisition might result in
|
/** [Eiger][Jungfrau] Stopping acquisition might result in different frame
|
||||||
* different frame numbers for different modules.*/
|
* numbers for different modules.*/
|
||||||
void setNextFrameNumber(uint64_t value, Positions pos = {});
|
void setNextFrameNumber(uint64_t value, Positions pos = {});
|
||||||
|
|
||||||
/** [Eiger][Mythen3] Sends an internal software trigger to the detector
|
/** [Eiger][Mythen3] Sends an internal software trigger to the detector
|
||||||
@ -887,18 +878,10 @@ class Detector {
|
|||||||
Result<sls::IpAddr> getRxLastClientIP(Positions pos = {}) const;
|
Result<sls::IpAddr> getRxLastClientIP(Positions pos = {}) const;
|
||||||
|
|
||||||
/** Get thread ids from the receiver in order of [parent, tcp, listener 0,
|
/** Get thread ids from the receiver in order of [parent, tcp, listener 0,
|
||||||
* processor 0, streamer 0, listener 1, processor 1, streamer 1, arping]. If
|
* processor 0, streamer 0, listener 1, processor 1, streamer 1]. If no
|
||||||
* no streamer yet or there is no second interface, it gives 0 in its place.
|
* streamer yet or there is no second interface, it gives 0 in its place. */
|
||||||
*/
|
|
||||||
Result<std::array<pid_t, NUM_RX_THREAD_IDS>>
|
Result<std::array<pid_t, NUM_RX_THREAD_IDS>>
|
||||||
getRxThreadIds(Positions pos = {}) const;
|
getRxThreadIds(Positions pos = {}) const;
|
||||||
|
|
||||||
Result<bool> getRxArping(Positions pos = {}) const;
|
|
||||||
|
|
||||||
/** Starts a thread in slsReceiver to arping the interface it is listening
|
|
||||||
* every minute. Useful in 10G mode. */
|
|
||||||
void setRxArping(bool value, Positions pos = {});
|
|
||||||
|
|
||||||
///@}
|
///@}
|
||||||
|
|
||||||
/** @name File */
|
/** @name File */
|
||||||
@ -1156,18 +1139,12 @@ class Detector {
|
|||||||
Result<bool> getDataStream(const defs::portPosition port,
|
Result<bool> getDataStream(const defs::portPosition port,
|
||||||
Positions pos = {}) const;
|
Positions pos = {}) const;
|
||||||
|
|
||||||
/** [Eiger] enable or disable data streaming from left or right of detector
|
/** [Eiger] enable or disable data streaming from left or right of detector.
|
||||||
* for 10GbE. Default: enabled
|
* Default: enabled
|
||||||
*/
|
*/
|
||||||
void setDataStream(const defs::portPosition port, const bool enable,
|
void setDataStream(const defs::portPosition port, const bool enable,
|
||||||
Positions pos = {});
|
Positions pos = {});
|
||||||
|
|
||||||
/** [Eiger] Advanced */
|
|
||||||
Result<bool> getTop(Positions pos = {}) const;
|
|
||||||
|
|
||||||
/** [Eiger] Advanced. Default is hardware default */
|
|
||||||
void setTop(bool value, Positions pos = {});
|
|
||||||
|
|
||||||
///@}
|
///@}
|
||||||
|
|
||||||
/** @name Jungfrau Specific */
|
/** @name Jungfrau Specific */
|
||||||
@ -1465,6 +1442,9 @@ class Detector {
|
|||||||
* (internal gating). Gate index: 0-2, -1 for all */
|
* (internal gating). Gate index: 0-2, -1 for all */
|
||||||
Result<std::array<ns, 3>> getGateDelayForAllGates(Positions pos = {}) const;
|
Result<std::array<ns, 3>> getGateDelayForAllGates(Positions pos = {}) const;
|
||||||
|
|
||||||
|
/** [Eiger][Mythen3][Gotthard1] via stop server **/
|
||||||
|
Result<bool> getMaster(Positions pos = {}) const;
|
||||||
|
|
||||||
// TODO! check if we really want to expose this !!!!!
|
// TODO! check if we really want to expose this !!!!!
|
||||||
Result<int> getChipStatusRegister(Positions pos = {}) const;
|
Result<int> getChipStatusRegister(Positions pos = {}) const;
|
||||||
|
|
||||||
@ -1613,14 +1593,6 @@ class Detector {
|
|||||||
|
|
||||||
/** [CTB] Default is enabled. */
|
/** [CTB] Default is enabled. */
|
||||||
void setLEDEnable(bool enable, Positions pos = {});
|
void setLEDEnable(bool enable, Positions pos = {});
|
||||||
|
|
||||||
|
|
||||||
void setDacNames(const std::vector<std::string> names);
|
|
||||||
|
|
||||||
std::vector<std::string> getDacNames() const;
|
|
||||||
|
|
||||||
defs::dacIndex getDacIndex(const std::string& name);
|
|
||||||
std::string getDacName(defs::dacIndex i);
|
|
||||||
///@}
|
///@}
|
||||||
|
|
||||||
/** @name Pattern */
|
/** @name Pattern */
|
||||||
@ -1755,13 +1727,10 @@ class Detector {
|
|||||||
/** [Jungfrau][Gotthard][CTB][Moench][Mythen3][Gotthard2]
|
/** [Jungfrau][Gotthard][CTB][Moench][Mythen3][Gotthard2]
|
||||||
* Advanced user Function!
|
* Advanced user Function!
|
||||||
* Program firmware from command line, after which detector controller is
|
* Program firmware from command line, after which detector controller is
|
||||||
* rebooted. forceDeleteNormalFile is true, if normal file found
|
* rebooted. [Jungfrau][CTB][Moench] fname is a pof file (full path) \n
|
||||||
* in device tree, it must be deleted, a new device drive created and
|
* [Mythen3][Gotthard2] fname is an rbf file (full path)
|
||||||
* programming continued.[Jungfrau][CTB][Moench] fname is a pof file (full
|
|
||||||
* path) \n [Mythen3][Gotthard2] fname is an rbf file (full path)
|
|
||||||
*/
|
*/
|
||||||
void programFPGA(const std::string &fname, const bool forceDeleteNormalFile,
|
void programFPGA(const std::string &fname, Positions pos = {});
|
||||||
Positions pos = {});
|
|
||||||
|
|
||||||
/** [Jungfrau][CTB][Moench] Advanced user Function! */
|
/** [Jungfrau][CTB][Moench] Advanced user Function! */
|
||||||
void resetFPGA(Positions pos = {});
|
void resetFPGA(Positions pos = {});
|
||||||
@ -1927,6 +1896,7 @@ class Detector {
|
|||||||
*/
|
*/
|
||||||
std::string getUserDetails() const;
|
std::string getUserDetails() const;
|
||||||
|
|
||||||
|
Result<uint64_t> getRxCurrentFrameIndex(Positions pos = {}) const;
|
||||||
///@}
|
///@}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1056,10 +1056,11 @@ std::string CmdProxy::TemperatureValues(int action) {
|
|||||||
std::string CmdProxy::Dac(int action) {
|
std::string CmdProxy::Dac(int action) {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << cmd << ' ';
|
os << cmd << ' ';
|
||||||
auto type = det->getDetectorType().squash();
|
|
||||||
// dac indices only for ctb
|
// dac indices only for ctb
|
||||||
if (args.size() > 0 && action != defs::HELP_ACTION) {
|
if (args.size() > 0 && action != defs::HELP_ACTION) {
|
||||||
if (is_int(args[0]) && type != defs::CHIPTESTBOARD) {
|
if (is_int(args[0]) &&
|
||||||
|
det->getDetectorType().squash() != defs::CHIPTESTBOARD) {
|
||||||
throw sls::RuntimeError(
|
throw sls::RuntimeError(
|
||||||
"Dac indices can only be used for chip test board. Use daclist "
|
"Dac indices can only be used for chip test board. Use daclist "
|
||||||
"to get list of dac names for current detector.");
|
"to get list of dac names for current detector.");
|
||||||
@ -1076,14 +1077,7 @@ std::string CmdProxy::Dac(int action) {
|
|||||||
if (args.empty())
|
if (args.empty())
|
||||||
WrongNumberOfParameters(1); // This prints slightly wrong
|
WrongNumberOfParameters(1); // This prints slightly wrong
|
||||||
|
|
||||||
defs::dacIndex dacIndex{};
|
defs::dacIndex dacIndex = StringTo<defs::dacIndex>(args[0]);
|
||||||
//TODO! Remove if
|
|
||||||
if (type == defs::CHIPTESTBOARD && !is_int(args[0])) {
|
|
||||||
dacIndex = det->getDacIndex(args[0]);
|
|
||||||
} else {
|
|
||||||
dacIndex = StringTo<defs::dacIndex>(args[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool mV = false;
|
bool mV = false;
|
||||||
|
|
||||||
if (args.size() == 2) {
|
if (args.size() == 2) {
|
||||||
@ -1101,11 +1095,7 @@ std::string CmdProxy::Dac(int action) {
|
|||||||
if (args.empty())
|
if (args.empty())
|
||||||
WrongNumberOfParameters(1); // This prints slightly wrong
|
WrongNumberOfParameters(1); // This prints slightly wrong
|
||||||
|
|
||||||
defs::dacIndex dacIndex{};
|
defs::dacIndex dacIndex = StringTo<defs::dacIndex>(args[0]);
|
||||||
if (type == defs::CHIPTESTBOARD && !is_int(args[0]))
|
|
||||||
dacIndex = det->getDacIndex(args[0]);
|
|
||||||
else
|
|
||||||
dacIndex = StringTo<defs::dacIndex>(args[0]);
|
|
||||||
bool mV = false;
|
bool mV = false;
|
||||||
if (args.size() == 3) {
|
if (args.size() == 3) {
|
||||||
if ((args[2] != "mv") && (args[2] != "mV")) {
|
if ((args[2] != "mv") && (args[2] != "mV")) {
|
||||||
@ -1125,41 +1115,6 @@ std::string CmdProxy::Dac(int action) {
|
|||||||
return os.str();
|
return os.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CmdProxy::DacList(const int action) {
|
|
||||||
std::ostringstream os;
|
|
||||||
os << cmd << ' ';
|
|
||||||
if (action == slsDetectorDefs::HELP_ACTION) {
|
|
||||||
os << "\n\t[dacname1 dacname2 .. dacname18] \n\t\t[ChipTestBoard] Set "
|
|
||||||
"the list of dac names for this detector.\n\t\t[All] Gets the "
|
|
||||||
"list "
|
|
||||||
"of "
|
|
||||||
"dac names for every dac for this detector."
|
|
||||||
<< '\n';
|
|
||||||
} else if (action == slsDetectorDefs::GET_ACTION) {
|
|
||||||
if (!args.empty()) {
|
|
||||||
WrongNumberOfParameters(0);
|
|
||||||
}
|
|
||||||
auto t = det->getDacNames();
|
|
||||||
os << sls::ToString(t) << '\n';
|
|
||||||
} else if (action == slsDetectorDefs::PUT_ACTION) {
|
|
||||||
if (det->getDetectorType().squash() != defs::CHIPTESTBOARD) {
|
|
||||||
throw sls::RuntimeError("This detector already has fixed dac "
|
|
||||||
"names. Cannot change them.");
|
|
||||||
}
|
|
||||||
if (det_id != -1) {
|
|
||||||
throw sls::RuntimeError("Cannot configure dacnames at module level");
|
|
||||||
}
|
|
||||||
if (args.size() != 18) {
|
|
||||||
WrongNumberOfParameters(18);
|
|
||||||
}
|
|
||||||
det->setDacNames(args);
|
|
||||||
os << ToString(args) << '\n';
|
|
||||||
} else {
|
|
||||||
throw sls::RuntimeError("Unknown action");
|
|
||||||
}
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CmdProxy::DacValues(int action) {
|
std::string CmdProxy::DacValues(int action) {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << cmd << ' ';
|
os << cmd << ' ';
|
||||||
@ -1179,15 +1134,13 @@ std::string CmdProxy::DacValues(int action) {
|
|||||||
WrongNumberOfParameters(1);
|
WrongNumberOfParameters(1);
|
||||||
}
|
}
|
||||||
auto t = det->getDacList();
|
auto t = det->getDacList();
|
||||||
auto names = det->getDacNames();
|
|
||||||
auto name_it = names.begin();
|
|
||||||
os << '[';
|
os << '[';
|
||||||
auto it = t.cbegin();
|
auto it = t.cbegin();
|
||||||
os << ToString(*name_it++) << ' ';
|
os << ToString(*it) << ' ';
|
||||||
os << OutString(det->getDAC(*it++, mv, std::vector<int>{det_id}))
|
os << OutString(det->getDAC(*it++, mv, std::vector<int>{det_id}))
|
||||||
<< (!args.empty() ? " mV" : "");
|
<< (!args.empty() ? " mV" : "");
|
||||||
while (it != t.cend()) {
|
while (it != t.cend()) {
|
||||||
os << ", " << ToString(*name_it++) << ' ';
|
os << ", " << ToString(*it) << ' ';
|
||||||
os << OutString(det->getDAC(*it++, mv, std::vector<int>{det_id}))
|
os << OutString(det->getDAC(*it++, mv, std::vector<int>{det_id}))
|
||||||
<< (!args.empty() ? " mV" : "");
|
<< (!args.empty() ? " mV" : "");
|
||||||
}
|
}
|
||||||
@ -1321,6 +1274,40 @@ std::string CmdProxy::DetectorStatus(int action) {
|
|||||||
return os.str();
|
return os.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CmdProxy::RxMissingPackets(int action) {
|
||||||
|
std::ostringstream os;
|
||||||
|
os << cmd << ' ';
|
||||||
|
if (action == defs::HELP_ACTION) {
|
||||||
|
os << "Number of missing packets for each port in receiver. If "
|
||||||
|
"negative, they are packets in excess. "
|
||||||
|
<< '\n';
|
||||||
|
} else if (action == defs::GET_ACTION) {
|
||||||
|
if (!args.empty()) {
|
||||||
|
WrongNumberOfParameters(0);
|
||||||
|
}
|
||||||
|
auto mp = det->getNumMissingPackets(std::vector<int>{det_id});
|
||||||
|
/*
|
||||||
|
auto tmp = det->getNumMissingPackets(std::vector<int>{det_id});
|
||||||
|
// convert to signed missing packets (to get excess)
|
||||||
|
Result<std::vector<int64_t>> mp(tmp.size());
|
||||||
|
for (unsigned int i = 0; i < mp.size(); ++i) {
|
||||||
|
mp[i] = static_cast<int64_t>(tmp[i]);
|
||||||
|
}
|
||||||
|
OR
|
||||||
|
Result<std::vector<int64_t>> tmp;
|
||||||
|
for (auto val : tmp) {
|
||||||
|
mp.push_back(static_cast<int64_t>(val));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
os << OutString(mp) << '\n';
|
||||||
|
} else if (action == defs::PUT_ACTION) {
|
||||||
|
throw sls::RuntimeError("Cannot put");
|
||||||
|
} else {
|
||||||
|
throw sls::RuntimeError("Unknown action");
|
||||||
|
}
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
std::string CmdProxy::Scan(int action) {
|
std::string CmdProxy::Scan(int action) {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << cmd << ' ';
|
os << cmd << ' ';
|
||||||
@ -1817,9 +1804,7 @@ std::string CmdProxy::DataStream(int action) {
|
|||||||
os << cmd << ' ';
|
os << cmd << ' ';
|
||||||
if (action == defs::HELP_ACTION) {
|
if (action == defs::HELP_ACTION) {
|
||||||
os << "[left|right] [0, 1]\n\t[Eiger] Enables or disables data "
|
os << "[left|right] [0, 1]\n\t[Eiger] Enables or disables data "
|
||||||
"streaming from left or/and right side of detector for 10 GbE "
|
"streaming from left or/and right side of detector. 1 (enabled) "
|
||||||
"mode. "
|
|
||||||
"1 (enabled) "
|
|
||||||
"by default."
|
"by default."
|
||||||
<< '\n';
|
<< '\n';
|
||||||
} else if (action == defs::GET_ACTION) {
|
} else if (action == defs::GET_ACTION) {
|
||||||
@ -2879,31 +2864,19 @@ std::string CmdProxy::ProgramFpga(int action) {
|
|||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << cmd << ' ';
|
os << cmd << ' ';
|
||||||
if (action == defs::HELP_ACTION) {
|
if (action == defs::HELP_ACTION) {
|
||||||
os << "[fname.pof | fname.rbf (full "
|
os << "[fname.pof | fname.rbf (full path)]\n\t[Jungfrau][Ctb][Moench] "
|
||||||
"path)][(opitonal)--force-delete-normal-file]\n\t[Jungfrau][Ctb]["
|
"Programs FPGA from pof file (full path). Then, detector "
|
||||||
"Moench] Programs FPGA from pof file (full path). Then, detector "
|
"controller is rebooted \n\t[Mythen3][Gotthard2] Programs FPGA "
|
||||||
"controller is rebooted. \n\t\tUse --force-delete-normal-file "
|
"from rbf file (full path). Then, detector controller is "
|
||||||
"argument, if normal file found in device tree, it must be "
|
"rebooted."
|
||||||
"deleted, a new device drive created and programming "
|
|
||||||
"continued.\n\t[Mythen3][Gotthard2] Programs FPGA from rbf file "
|
|
||||||
"(full path). Then, detector controller is rebooted."
|
|
||||||
<< '\n';
|
<< '\n';
|
||||||
} else if (action == defs::GET_ACTION) {
|
} else if (action == defs::GET_ACTION) {
|
||||||
throw sls::RuntimeError("Cannot get");
|
throw sls::RuntimeError("Cannot get");
|
||||||
} else if (action == defs::PUT_ACTION) {
|
} else if (action == defs::PUT_ACTION) {
|
||||||
bool forceDeteleNormalFile = false;
|
if (args.size() != 1) {
|
||||||
if (args.size() == 2) {
|
|
||||||
if (args[1] != "--force-delete-normal-file") {
|
|
||||||
throw sls::RuntimeError(
|
|
||||||
"Could not scan second argument. Did you "
|
|
||||||
"mean --force-delete-normal-file?");
|
|
||||||
}
|
|
||||||
forceDeteleNormalFile = true;
|
|
||||||
} else if (args.size() != 1) {
|
|
||||||
WrongNumberOfParameters(1);
|
WrongNumberOfParameters(1);
|
||||||
}
|
}
|
||||||
det->programFPGA(args[0], forceDeteleNormalFile,
|
det->programFPGA(args[0], std::vector<int>{det_id});
|
||||||
std::vector<int>{det_id});
|
|
||||||
os << "successful\n";
|
os << "successful\n";
|
||||||
} else {
|
} else {
|
||||||
throw sls::RuntimeError("Unknown action");
|
throw sls::RuntimeError("Unknown action");
|
||||||
|
@ -784,7 +784,6 @@ class CmdProxy {
|
|||||||
{"trimen", &CmdProxy::TrimEnergies},
|
{"trimen", &CmdProxy::TrimEnergies},
|
||||||
{"gappixels", &CmdProxy::GapPixels},
|
{"gappixels", &CmdProxy::GapPixels},
|
||||||
{"fliprows", &CmdProxy::fliprows},
|
{"fliprows", &CmdProxy::fliprows},
|
||||||
{"master", &CmdProxy::master},
|
|
||||||
|
|
||||||
/* acquisition parameters */
|
/* acquisition parameters */
|
||||||
{"acquire", &CmdProxy::Acquire},
|
{"acquire", &CmdProxy::Acquire},
|
||||||
@ -837,7 +836,7 @@ class CmdProxy {
|
|||||||
|
|
||||||
/* dacs */
|
/* dacs */
|
||||||
{"dac", &CmdProxy::Dac},
|
{"dac", &CmdProxy::Dac},
|
||||||
{"daclist", &CmdProxy::DacList},
|
{"daclist", &CmdProxy::daclist},
|
||||||
{"dacvalues", &CmdProxy::DacValues},
|
{"dacvalues", &CmdProxy::DacValues},
|
||||||
{"resetdacs", &CmdProxy::ResetDacs},
|
{"resetdacs", &CmdProxy::ResetDacs},
|
||||||
{"defaultdac", &CmdProxy::DefaultDac},
|
{"defaultdac", &CmdProxy::DefaultDac},
|
||||||
@ -860,8 +859,7 @@ class CmdProxy {
|
|||||||
{"rx_status", &CmdProxy::ReceiverStatus},
|
{"rx_status", &CmdProxy::ReceiverStatus},
|
||||||
{"status", &CmdProxy::DetectorStatus},
|
{"status", &CmdProxy::DetectorStatus},
|
||||||
{"rx_framescaught", &CmdProxy::rx_framescaught},
|
{"rx_framescaught", &CmdProxy::rx_framescaught},
|
||||||
{"rx_missingpackets", &CmdProxy::rx_missingpackets},
|
{"rx_missingpackets", &CmdProxy::RxMissingPackets},
|
||||||
{"rx_frameindex", &CmdProxy::rx_frameindex},
|
|
||||||
{"nextframenumber", &CmdProxy::nextframenumber},
|
{"nextframenumber", &CmdProxy::nextframenumber},
|
||||||
{"trigger", &CmdProxy::Trigger},
|
{"trigger", &CmdProxy::Trigger},
|
||||||
{"scan", &CmdProxy::Scan},
|
{"scan", &CmdProxy::Scan},
|
||||||
@ -905,7 +903,6 @@ class CmdProxy {
|
|||||||
{"rx_lock", &CmdProxy::rx_lock},
|
{"rx_lock", &CmdProxy::rx_lock},
|
||||||
{"rx_lastclient", &CmdProxy::rx_lastclient},
|
{"rx_lastclient", &CmdProxy::rx_lastclient},
|
||||||
{"rx_threads", &CmdProxy::rx_threads},
|
{"rx_threads", &CmdProxy::rx_threads},
|
||||||
{"rx_arping", &CmdProxy::rx_arping},
|
|
||||||
|
|
||||||
/* File */
|
/* File */
|
||||||
{"fformat", &CmdProxy::fformat},
|
{"fformat", &CmdProxy::fformat},
|
||||||
@ -944,7 +941,6 @@ class CmdProxy {
|
|||||||
{"pulsechip", &CmdProxy::PulseChip},
|
{"pulsechip", &CmdProxy::PulseChip},
|
||||||
{"quad", &CmdProxy::Quad},
|
{"quad", &CmdProxy::Quad},
|
||||||
{"datastream", &CmdProxy::DataStream},
|
{"datastream", &CmdProxy::DataStream},
|
||||||
{"top", &CmdProxy::top},
|
|
||||||
|
|
||||||
/* Jungfrau Specific */
|
/* Jungfrau Specific */
|
||||||
{"chipversion", &CmdProxy::chipversion},
|
{"chipversion", &CmdProxy::chipversion},
|
||||||
@ -1087,7 +1083,8 @@ class CmdProxy {
|
|||||||
{"framecounter", &CmdProxy::framecounter},
|
{"framecounter", &CmdProxy::framecounter},
|
||||||
{"runtime", &CmdProxy::runtime},
|
{"runtime", &CmdProxy::runtime},
|
||||||
{"frametime", &CmdProxy::frametime},
|
{"frametime", &CmdProxy::frametime},
|
||||||
{"user", &CmdProxy::UserDetails}
|
{"user", &CmdProxy::UserDetails},
|
||||||
|
{"rx_frameindex", &CmdProxy::rx_frameindex}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1111,6 +1108,7 @@ class CmdProxy {
|
|||||||
/* acquisition parameters */
|
/* acquisition parameters */
|
||||||
std::string Acquire(int action);
|
std::string Acquire(int action);
|
||||||
std::string Exptime(int action);
|
std::string Exptime(int action);
|
||||||
|
std::string DynamicRange(int action);
|
||||||
std::string ReadoutSpeed(int action);
|
std::string ReadoutSpeed(int action);
|
||||||
std::string Adcphase(int action);
|
std::string Adcphase(int action);
|
||||||
std::string Dbitphase(int action);
|
std::string Dbitphase(int action);
|
||||||
@ -1124,7 +1122,6 @@ class CmdProxy {
|
|||||||
std::string TemperatureValues(int action);
|
std::string TemperatureValues(int action);
|
||||||
/* dacs */
|
/* dacs */
|
||||||
std::string Dac(int action);
|
std::string Dac(int action);
|
||||||
std::string DacList(int action);
|
|
||||||
std::string DacValues(int action);
|
std::string DacValues(int action);
|
||||||
std::string ResetDacs(int action);
|
std::string ResetDacs(int action);
|
||||||
std::string DefaultDac(int action);
|
std::string DefaultDac(int action);
|
||||||
@ -1283,12 +1280,6 @@ class CmdProxy {
|
|||||||
"interfaces must be set to 2. slsReceiver and slsDetectorGui "
|
"interfaces must be set to 2. slsReceiver and slsDetectorGui "
|
||||||
"does not handle.");
|
"does not handle.");
|
||||||
|
|
||||||
INTEGER_COMMAND_VEC_ID_GET(
|
|
||||||
master, getMaster, setMaster, StringTo<int>,
|
|
||||||
"[0, 1]\n\t[Eiger] Sets half module to master and "
|
|
||||||
"others to slaves.\n\t[Gotthard][Gotthard2][Mythen3][Eiger] "
|
|
||||||
"Gets if the current module/ half module is master.");
|
|
||||||
|
|
||||||
/* acquisition parameters */
|
/* acquisition parameters */
|
||||||
|
|
||||||
INTEGER_COMMAND_SET_NOID_GET_ID(
|
INTEGER_COMMAND_SET_NOID_GET_ID(
|
||||||
@ -1336,7 +1327,7 @@ class CmdProxy {
|
|||||||
dr, getDynamicRange, setDynamicRange, StringTo<int>,
|
dr, getDynamicRange, setDynamicRange, StringTo<int>,
|
||||||
"[value]\n\tDynamic Range or number of bits per "
|
"[value]\n\tDynamic Range or number of bits per "
|
||||||
"pixel in detector.\n\t"
|
"pixel in detector.\n\t"
|
||||||
"[Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets "
|
"[Eiger] Options: 4, 8, 16, 32. If set to 32, also sets "
|
||||||
"clkdivider to 2, else to 0.\n\t"
|
"clkdivider to 2, else to 0.\n\t"
|
||||||
"[Mythen3] Options: 8, 16, 32\n\t"
|
"[Mythen3] Options: 8, 16, 32\n\t"
|
||||||
"[Jungfrau][Gotthard][Ctb][Moench][Mythen3][Gotthard2] 16");
|
"[Jungfrau][Gotthard][Ctb][Moench][Mythen3][Gotthard2] 16");
|
||||||
@ -1466,6 +1457,10 @@ class CmdProxy {
|
|||||||
|
|
||||||
/* dacs */
|
/* dacs */
|
||||||
|
|
||||||
|
GET_COMMAND_NOID(
|
||||||
|
daclist, getDacList,
|
||||||
|
"\n\tGets the list of commands for every dac for this detector.");
|
||||||
|
|
||||||
/* on chip dacs */
|
/* on chip dacs */
|
||||||
INTEGER_USER_IND_COMMAND(
|
INTEGER_USER_IND_COMMAND(
|
||||||
vchip_comp_fe, getOnChipDAC, setOnChipDAC, StringTo<int>,
|
vchip_comp_fe, getOnChipDAC, setOnChipDAC, StringTo<int>,
|
||||||
@ -1520,7 +1515,7 @@ class CmdProxy {
|
|||||||
"\n\tStops receiver listener for detector data packets and closes "
|
"\n\tStops receiver listener for detector data packets and closes "
|
||||||
"current data file (if file write enabled).");
|
"current data file (if file write enabled).");
|
||||||
|
|
||||||
EXECUTE_SET_COMMAND(
|
EXECUTE_SET_COMMAND_NOID(
|
||||||
start, startDetector,
|
start, startDetector,
|
||||||
"\n\tStarts detector acquisition. Status changes to RUNNING or WAITING "
|
"\n\tStarts detector acquisition. Status changes to RUNNING or WAITING "
|
||||||
"and automatically returns to idle at the end of acquisition. If the "
|
"and automatically returns to idle at the end of acquisition. If the "
|
||||||
@ -1537,22 +1532,16 @@ class CmdProxy {
|
|||||||
"to IDLE or STOPPED. Goes to stop server.");
|
"to IDLE or STOPPED. Goes to stop server.");
|
||||||
|
|
||||||
GET_COMMAND(rx_framescaught, getFramesCaught,
|
GET_COMMAND(rx_framescaught, getFramesCaught,
|
||||||
"\n\tNumber of frames caught by each port in receiver.");
|
"\n\tNumber of frames caught by receiver.");
|
||||||
|
|
||||||
GET_COMMAND(rx_missingpackets, getNumMissingPackets,
|
GET_COMMAND(rx_missingpackets, getNumMissingPackets,
|
||||||
"\n\tNumber of missing packets for each port in receiver. If "
|
"\n\tNumber of missing packets for each port in receiver.");
|
||||||
"negative, they are packets in excess. ");
|
|
||||||
|
|
||||||
GET_COMMAND(rx_frameindex, getRxCurrentFrameIndex,
|
INTEGER_COMMAND_VEC_ID(nextframenumber, getNextFrameNumber,
|
||||||
"\n\tCurrent frame index received for each port in receiver "
|
setNextFrameNumber, StringTo<uint64_t>,
|
||||||
"during acquisition.");
|
"[n_value]\n\t[Eiger][Jungfrau] Next frame number. "
|
||||||
|
"Stopping acquisition might result in "
|
||||||
INTEGER_COMMAND_VEC_ID(
|
"different frame numbers for different modules.");
|
||||||
nextframenumber, getNextFrameNumber, setNextFrameNumber,
|
|
||||||
StringTo<uint64_t>,
|
|
||||||
"[n_value]\n\t[Eiger][Jungfrau][Moench][CTB] Next frame number. "
|
|
||||||
"Stopping acquisition might result in different frame numbers for "
|
|
||||||
"different modules.");
|
|
||||||
|
|
||||||
GET_COMMAND(scanerrmsg, getScanErrorMessage,
|
GET_COMMAND(scanerrmsg, getScanErrorMessage,
|
||||||
"\n\tGets Scan error message if scan ended in error for non "
|
"\n\tGets Scan error message if scan ended in error for non "
|
||||||
@ -1748,16 +1737,13 @@ class CmdProxy {
|
|||||||
rx_lastclient, getRxLastClientIP,
|
rx_lastclient, getRxLastClientIP,
|
||||||
"\n\tClient IP Address that last communicated with the receiver.");
|
"\n\tClient IP Address that last communicated with the receiver.");
|
||||||
|
|
||||||
GET_COMMAND(rx_threads, getRxThreadIds,
|
GET_COMMAND(
|
||||||
"\n\tGet thread ids from the receiver in order of [parent, "
|
rx_threads, getRxThreadIds,
|
||||||
"tcp, listener 0, processor 0, streamer 0, listener 1, "
|
"\n\tGet thread ids from the receiver in order of [parent, tcp, "
|
||||||
"processor 1, streamer 1, arping]. If no streamer yet or there "
|
"listener 0, "
|
||||||
"is no second interface, it gives 0 in its place.");
|
"processor 0, streamer 0, listener 1, processor 1, streamer 1]. If no "
|
||||||
|
"streamer yet or there is no second interface, it gives 0 in its "
|
||||||
INTEGER_COMMAND_VEC_ID(rx_arping, getRxArping, setRxArping, StringTo<int>,
|
"place.");
|
||||||
"[0, 1]\n\tStarts a thread in slsReceiver to arping "
|
|
||||||
"the interface it is "
|
|
||||||
"listening to every minute. Useful in 10G mode.");
|
|
||||||
|
|
||||||
/* File */
|
/* File */
|
||||||
|
|
||||||
@ -1909,10 +1895,6 @@ class CmdProxy {
|
|||||||
"start of acquisition. 0 complete reset, 1 partial reset. Default is "
|
"start of acquisition. 0 complete reset, 1 partial reset. Default is "
|
||||||
"complete reset. Advanced function!");
|
"complete reset. Advanced function!");
|
||||||
|
|
||||||
INTEGER_COMMAND_VEC_ID(
|
|
||||||
top, getTop, setTop, StringTo<int>,
|
|
||||||
"[0, 1]\n\t[Eiger] Sets half module to top (1), else bottom.");
|
|
||||||
|
|
||||||
/* Jungfrau Specific */
|
/* Jungfrau Specific */
|
||||||
|
|
||||||
GET_COMMAND(chipversion, getChipVersion,
|
GET_COMMAND(chipversion, getChipVersion,
|
||||||
@ -2263,6 +2245,10 @@ class CmdProxy {
|
|||||||
"ns|us|ms|s]\n\t[Jungfrau][Mythen3][Gotthard2][Moench]["
|
"ns|us|ms|s]\n\t[Jungfrau][Mythen3][Gotthard2][Moench]["
|
||||||
"CTB] Timestamp at a frame start."
|
"CTB] Timestamp at a frame start."
|
||||||
"\n\t[Gotthard2] not in burst and auto mode.");
|
"\n\t[Gotthard2] not in burst and auto mode.");
|
||||||
|
|
||||||
|
GET_COMMAND(
|
||||||
|
rx_frameindex, getRxCurrentFrameIndex,
|
||||||
|
"\n\tCurrent frame index received in receiver during acquisition.");
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace sls
|
} // namespace sls
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
|
|
||||||
#include "CtbConfig.h"
|
|
||||||
#include "SharedMemory.h"
|
|
||||||
#include "sls/ToString.h"
|
|
||||||
#include "sls/string_utils.h"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <fstream>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
namespace sls {
|
|
||||||
|
|
||||||
CtbConfig::CtbConfig(){
|
|
||||||
for (size_t i=0; i!=num_dacs; ++i){
|
|
||||||
setDacName(i, "dac"+ToString(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CtbConfig::check_index(size_t i) const {
|
|
||||||
if (!(i < num_dacs)) {
|
|
||||||
std::ostringstream oss;
|
|
||||||
oss << "DAC index is too large needs to be below " << num_dacs;
|
|
||||||
throw RuntimeError(oss.str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CtbConfig::check_size(const std::string &name) const {
|
|
||||||
|
|
||||||
if (name.empty())
|
|
||||||
throw RuntimeError("Name needs to be at least one character");
|
|
||||||
|
|
||||||
// dacname_length -1 to account for \0 termination
|
|
||||||
if (!(name.size() < (name_length - 1))) {
|
|
||||||
std::ostringstream oss;
|
|
||||||
oss << "Length of name needs to be less than " << name_length - 1
|
|
||||||
<< " chars";
|
|
||||||
throw RuntimeError(oss.str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CtbConfig::setDacName(size_t index, const std::string &name) {
|
|
||||||
|
|
||||||
check_index(index);
|
|
||||||
check_size(name);
|
|
||||||
|
|
||||||
char *dst = &dacnames[index * name_length];
|
|
||||||
memset(dst, '\0', name_length);
|
|
||||||
memcpy(dst, &name[0], name.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
void CtbConfig::setDacNames(const std::vector<std::string>& names){
|
|
||||||
for (size_t i = 0; i!=num_dacs; ++i){
|
|
||||||
setDacName(i, names[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CtbConfig::getDacName(size_t index) const {
|
|
||||||
return dacnames + index * name_length;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> CtbConfig::getDacNames() const {
|
|
||||||
std::vector<std::string> names;
|
|
||||||
for (size_t i = 0; i != num_dacs; ++i)
|
|
||||||
names.push_back(getDacName(i));
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* CtbConfig::shm_tag(){
|
|
||||||
return shm_tag_;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace sls
|
|
@ -1,31 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
namespace sls {
|
|
||||||
|
|
||||||
|
|
||||||
class CtbConfig {
|
|
||||||
static constexpr size_t name_length = 20;
|
|
||||||
static constexpr size_t num_dacs = 18;
|
|
||||||
static constexpr const char* shm_tag_ = "ctbdacs";
|
|
||||||
char dacnames[name_length * num_dacs]{};
|
|
||||||
|
|
||||||
void check_index(size_t i) const;
|
|
||||||
void check_size(const std::string &name) const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
CtbConfig();
|
|
||||||
CtbConfig(const CtbConfig&) = default;
|
|
||||||
CtbConfig(CtbConfig&&) = default;
|
|
||||||
CtbConfig& operator=(const CtbConfig&) = default;
|
|
||||||
~CtbConfig() = default;
|
|
||||||
|
|
||||||
void setDacNames(const std::vector<std::string> &names);
|
|
||||||
void setDacName(size_t index, const std::string &name);
|
|
||||||
std::string getDacName(size_t index) const;
|
|
||||||
std::vector<std::string> getDacNames() const;
|
|
||||||
static const char* shm_tag();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace sls
|
|
@ -7,7 +7,6 @@
|
|||||||
#include "CmdProxy.h"
|
#include "CmdProxy.h"
|
||||||
#include "DetectorImpl.h"
|
#include "DetectorImpl.h"
|
||||||
#include "Module.h"
|
#include "Module.h"
|
||||||
#include "CtbConfig.h"
|
|
||||||
#include "sls/Pattern.h"
|
#include "sls/Pattern.h"
|
||||||
#include "sls/container_utils.h"
|
#include "sls/container_utils.h"
|
||||||
#include "sls/file_utils.h"
|
#include "sls/file_utils.h"
|
||||||
@ -22,7 +21,6 @@
|
|||||||
namespace sls {
|
namespace sls {
|
||||||
|
|
||||||
void freeSharedMemory(int detectorIndex, int moduleIndex) {
|
void freeSharedMemory(int detectorIndex, int moduleIndex) {
|
||||||
|
|
||||||
// single module
|
// single module
|
||||||
if (moduleIndex >= 0) {
|
if (moduleIndex >= 0) {
|
||||||
SharedMemory<sharedModule> moduleShm(detectorIndex, moduleIndex);
|
SharedMemory<sharedModule> moduleShm(detectorIndex, moduleIndex);
|
||||||
@ -46,11 +44,6 @@ void freeSharedMemory(int detectorIndex, int moduleIndex) {
|
|||||||
SharedMemory<sharedModule> moduleShm(detectorIndex, i);
|
SharedMemory<sharedModule> moduleShm(detectorIndex, i);
|
||||||
moduleShm.RemoveSharedMemory();
|
moduleShm.RemoveSharedMemory();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ctb configuration
|
|
||||||
SharedMemory<CtbConfig> ctbShm(detectorIndex, -1, CtbConfig::shm_tag());
|
|
||||||
if (ctbShm.IsExisting())
|
|
||||||
ctbShm.RemoveSharedMemory();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
using defs = slsDetectorDefs;
|
using defs = slsDetectorDefs;
|
||||||
@ -305,23 +298,6 @@ void Detector::setFlipRows(bool value, Positions pos) {
|
|||||||
pimpl->Parallel(&Module::setFlipRows, pos, value);
|
pimpl->Parallel(&Module::setFlipRows, pos, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<bool> Detector::getMaster(Positions pos) const {
|
|
||||||
return pimpl->Parallel(&Module::isMaster, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Detector::setMaster(bool master, int pos) {
|
|
||||||
// multi mod, set slaves first
|
|
||||||
if (master && size() > 1) {
|
|
||||||
if (pos == -1) {
|
|
||||||
throw RuntimeError("Master can be set only to a single module");
|
|
||||||
}
|
|
||||||
pimpl->Parallel(&Module::setMaster, {}, false);
|
|
||||||
pimpl->Parallel(&Module::setMaster, {pos}, master);
|
|
||||||
} else {
|
|
||||||
pimpl->Parallel(&Module::setMaster, {pos}, master);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Result<bool> Detector::isVirtualDetectorServer(Positions pos) const {
|
Result<bool> Detector::isVirtualDetectorServer(Positions pos) const {
|
||||||
return pimpl->Parallel(&Module::isVirtualDetectorServer, pos);
|
return pimpl->Parallel(&Module::isVirtualDetectorServer, pos);
|
||||||
}
|
}
|
||||||
@ -411,7 +387,7 @@ void Detector::setDynamicRange(int value) {
|
|||||||
std::vector<int> Detector::getDynamicRangeList() const {
|
std::vector<int> Detector::getDynamicRangeList() const {
|
||||||
switch (getDetectorType().squash()) {
|
switch (getDetectorType().squash()) {
|
||||||
case defs::EIGER:
|
case defs::EIGER:
|
||||||
return std::vector<int>{4, 8, 12, 16, 32};
|
return std::vector<int>{4, 8, 16, 32};
|
||||||
case defs::MYTHEN3:
|
case defs::MYTHEN3:
|
||||||
return std::vector<int>{8, 16, 32};
|
return std::vector<int>{8, 16, 32};
|
||||||
default:
|
default:
|
||||||
@ -780,24 +756,22 @@ void Detector::startReceiver() { pimpl->Parallel(&Module::startReceiver, {}); }
|
|||||||
|
|
||||||
void Detector::stopReceiver() { pimpl->Parallel(&Module::stopReceiver, {}); }
|
void Detector::stopReceiver() { pimpl->Parallel(&Module::stopReceiver, {}); }
|
||||||
|
|
||||||
void Detector::startDetector(Positions pos) {
|
void Detector::startDetector() {
|
||||||
auto detector_type = getDetectorType(pos).squash();
|
auto detector_type = getDetectorType().squash();
|
||||||
if (detector_type == defs::MYTHEN3 && size() > 1) {
|
if (detector_type == defs::MYTHEN3 && size() > 1) {
|
||||||
std::vector<int> slaves(pos);
|
auto is_master = getMaster();
|
||||||
auto is_master = getMaster(pos);
|
int masterPosition = 0;
|
||||||
int masterPosition = -1;
|
std::vector<int> slaves;
|
||||||
for (unsigned int i = 0; i < is_master.size(); ++i) {
|
for (int i = 0; i < size(); ++i) {
|
||||||
if (is_master[i]) {
|
if (is_master[i])
|
||||||
masterPosition = i;
|
masterPosition = i;
|
||||||
slaves.erase(slaves.begin() + i);
|
else
|
||||||
}
|
slaves.push_back(i);
|
||||||
}
|
|
||||||
pimpl->Parallel(&Module::startAcquisition, pos);
|
|
||||||
if (masterPosition != -1) {
|
|
||||||
pimpl->Parallel(&Module::startAcquisition, {masterPosition});
|
|
||||||
}
|
}
|
||||||
|
pimpl->Parallel(&Module::startAcquisition, slaves);
|
||||||
|
pimpl->Parallel(&Module::startAcquisition, {masterPosition});
|
||||||
} else {
|
} else {
|
||||||
pimpl->Parallel(&Module::startAcquisition, pos);
|
pimpl->Parallel(&Module::startAcquisition, {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -807,25 +781,6 @@ void Detector::startDetectorReadout() {
|
|||||||
|
|
||||||
void Detector::stopDetector(Positions pos) {
|
void Detector::stopDetector(Positions pos) {
|
||||||
pimpl->Parallel(&Module::stopAcquisition, pos);
|
pimpl->Parallel(&Module::stopAcquisition, pos);
|
||||||
|
|
||||||
// validate consistent frame numbers
|
|
||||||
switch (getDetectorType().squash()) {
|
|
||||||
case defs::EIGER:
|
|
||||||
case defs::JUNGFRAU:
|
|
||||||
case defs::MOENCH:
|
|
||||||
case defs::CHIPTESTBOARD: {
|
|
||||||
auto res = getNextFrameNumber(pos);
|
|
||||||
if (!res.equal()) {
|
|
||||||
uint64_t maxVal = 0;
|
|
||||||
for (auto it : res) {
|
|
||||||
maxVal = std::max(maxVal, it);
|
|
||||||
}
|
|
||||||
setNextFrameNumber(maxVal + 1);
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<defs::runStatus> Detector::getDetectorStatus(Positions pos) const {
|
Result<defs::runStatus> Detector::getDetectorStatus(Positions pos) const {
|
||||||
@ -836,20 +791,15 @@ Result<defs::runStatus> Detector::getReceiverStatus(Positions pos) const {
|
|||||||
return pimpl->Parallel(&Module::getReceiverStatus, pos);
|
return pimpl->Parallel(&Module::getReceiverStatus, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<std::vector<int64_t>> Detector::getFramesCaught(Positions pos) const {
|
Result<int64_t> Detector::getFramesCaught(Positions pos) const {
|
||||||
return pimpl->Parallel(&Module::getFramesCaughtByReceiver, pos);
|
return pimpl->Parallel(&Module::getFramesCaughtByReceiver, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<std::vector<int64_t>>
|
Result<std::vector<uint64_t>>
|
||||||
Detector::getNumMissingPackets(Positions pos) const {
|
Detector::getNumMissingPackets(Positions pos) const {
|
||||||
return pimpl->Parallel(&Module::getNumMissingPackets, pos);
|
return pimpl->Parallel(&Module::getNumMissingPackets, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<std::vector<int64_t>>
|
|
||||||
Detector::getRxCurrentFrameIndex(Positions pos) const {
|
|
||||||
return pimpl->Parallel(&Module::getReceiverCurrentFrameIndex, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
Result<uint64_t> Detector::getNextFrameNumber(Positions pos) const {
|
Result<uint64_t> Detector::getNextFrameNumber(Positions pos) const {
|
||||||
return pimpl->Parallel(&Module::getNextFrameNumber, pos);
|
return pimpl->Parallel(&Module::getNextFrameNumber, pos);
|
||||||
}
|
}
|
||||||
@ -883,7 +833,7 @@ Result<std::string> Detector::getScanErrorMessage(Positions pos) const {
|
|||||||
|
|
||||||
Result<int> Detector::getNumberofUDPInterfaces(Positions pos) const {
|
Result<int> Detector::getNumberofUDPInterfaces(Positions pos) const {
|
||||||
// also called by vetostream (for gotthard2)
|
// also called by vetostream (for gotthard2)
|
||||||
return pimpl->Parallel(&Module::getNumberofUDPInterfacesFromShm, pos);
|
return pimpl->getNumberofUDPInterfaces(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Detector::setNumberofUDPInterfaces(int n, Positions pos) {
|
void Detector::setNumberofUDPInterfaces(int n, Positions pos) {
|
||||||
@ -1220,14 +1170,6 @@ Detector::getRxThreadIds(Positions pos) const {
|
|||||||
return pimpl->Parallel(&Module::getReceiverThreadIds, pos);
|
return pimpl->Parallel(&Module::getReceiverThreadIds, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<bool> Detector::getRxArping(Positions pos) const {
|
|
||||||
return pimpl->Parallel(&Module::getRxArping, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Detector::setRxArping(bool value, Positions pos) {
|
|
||||||
pimpl->Parallel(&Module::setRxArping, pos, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// File
|
// File
|
||||||
|
|
||||||
Result<defs::fileFormat> Detector::getFileFormat(Positions pos) const {
|
Result<defs::fileFormat> Detector::getFileFormat(Positions pos) const {
|
||||||
@ -1536,14 +1478,6 @@ void Detector::setDataStream(const defs::portPosition port, const bool enable,
|
|||||||
pimpl->Parallel(&Module::setDataStream, pos, port, enable);
|
pimpl->Parallel(&Module::setDataStream, pos, port, enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<bool> Detector::getTop(Positions pos) const {
|
|
||||||
return pimpl->Parallel(&Module::getTop, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Detector::setTop(bool value, Positions pos) {
|
|
||||||
pimpl->Parallel(&Module::setTop, pos, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Jungfrau Specific
|
// Jungfrau Specific
|
||||||
Result<double> Detector::getChipVersion(Positions pos) const {
|
Result<double> Detector::getChipVersion(Positions pos) const {
|
||||||
return pimpl->Parallel(&Module::getChipVersion, pos);
|
return pimpl->Parallel(&Module::getChipVersion, pos);
|
||||||
@ -1619,6 +1553,7 @@ std::vector<defs::gainMode> Detector::getGainModeList() const {
|
|||||||
return std::vector<defs::gainMode>{
|
return std::vector<defs::gainMode>{
|
||||||
defs::DYNAMIC, defs::FORCE_SWITCH_G1, defs::FORCE_SWITCH_G2,
|
defs::DYNAMIC, defs::FORCE_SWITCH_G1, defs::FORCE_SWITCH_G2,
|
||||||
defs::FIX_G1, defs::FIX_G2, defs::FIX_G0};
|
defs::FIX_G1, defs::FIX_G2, defs::FIX_G0};
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw RuntimeError("Gain mode is not implemented for this detector.");
|
throw RuntimeError("Gain mode is not implemented for this detector.");
|
||||||
}
|
}
|
||||||
@ -1751,7 +1686,7 @@ Result<defs::streamingInterface> Detector::getVetoStream(Positions pos) const {
|
|||||||
// 3gbe
|
// 3gbe
|
||||||
auto r3 = pimpl->Parallel(&Module::getVetoStream, pos);
|
auto r3 = pimpl->Parallel(&Module::getVetoStream, pos);
|
||||||
// 10gbe (debugging interface) opens 2nd udp interface in receiver
|
// 10gbe (debugging interface) opens 2nd udp interface in receiver
|
||||||
auto r10 = getNumberofUDPInterfaces(pos);
|
auto r10 = pimpl->getNumberofUDPInterfaces(pos);
|
||||||
|
|
||||||
Result<defs::streamingInterface> res(r3.size());
|
Result<defs::streamingInterface> res(r3.size());
|
||||||
for (unsigned int i = 0; i < res.size(); ++i) {
|
for (unsigned int i = 0; i < res.size(); ++i) {
|
||||||
@ -1773,7 +1708,7 @@ void Detector::setVetoStream(defs::streamingInterface interface,
|
|||||||
pimpl->Parallel(&Module::setVetoStream, pos, LOW_LATENCY_LINK);
|
pimpl->Parallel(&Module::setVetoStream, pos, LOW_LATENCY_LINK);
|
||||||
|
|
||||||
// 10gbe (debugging interface) opens 2nd udp interface in receiver
|
// 10gbe (debugging interface) opens 2nd udp interface in receiver
|
||||||
int old_numinterfaces = getNumberofUDPInterfaces(pos).tsquash(
|
int old_numinterfaces = pimpl->getNumberofUDPInterfaces(pos).tsquash(
|
||||||
"retrieved inconsistent number of udp interfaces");
|
"retrieved inconsistent number of udp interfaces");
|
||||||
int numinterfaces =
|
int numinterfaces =
|
||||||
(((interface & defs::streamingInterface::ETHERNET_10GB) ==
|
(((interface & defs::streamingInterface::ETHERNET_10GB) ==
|
||||||
@ -1863,6 +1798,10 @@ Detector::getGateDelayForAllGates(Positions pos) const {
|
|||||||
return pimpl->Parallel(&Module::getGateDelayForAllGates, pos);
|
return pimpl->Parallel(&Module::getGateDelayForAllGates, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result<bool> Detector::getMaster(Positions pos) const {
|
||||||
|
return pimpl->Parallel(&Module::isMaster, pos);
|
||||||
|
}
|
||||||
|
|
||||||
Result<int> Detector::getChipStatusRegister(Positions pos) const {
|
Result<int> Detector::getChipStatusRegister(Positions pos) const {
|
||||||
return pimpl->Parallel(&Module::getChipStatusRegister, pos);
|
return pimpl->Parallel(&Module::getChipStatusRegister, pos);
|
||||||
}
|
}
|
||||||
@ -2074,42 +2013,6 @@ void Detector::setLEDEnable(bool enable, Positions pos) {
|
|||||||
pimpl->Parallel(&Module::setLEDEnable, pos, enable);
|
pimpl->Parallel(&Module::setLEDEnable, pos, enable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Detector::setDacNames(const std::vector<std::string> names) {
|
|
||||||
if (getDetectorType().squash() != defs::CHIPTESTBOARD)
|
|
||||||
throw RuntimeError("Named dacs only for CTB");
|
|
||||||
pimpl->setCtbDacNames(names);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> Detector::getDacNames() const {
|
|
||||||
std::vector<std::string> names;
|
|
||||||
auto type = getDetectorType().squash();
|
|
||||||
if (type == defs::CHIPTESTBOARD)
|
|
||||||
return pimpl->getCtbDacNames();
|
|
||||||
|
|
||||||
for (const auto &index : getDacList())
|
|
||||||
names.push_back(ToString(index));
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
|
|
||||||
defs::dacIndex Detector::getDacIndex(const std::string &name) {
|
|
||||||
auto type = getDetectorType().squash();
|
|
||||||
if (type == defs::CHIPTESTBOARD) {
|
|
||||||
auto names = getDacNames();
|
|
||||||
auto it = std::find(names.begin(), names.end(), name);
|
|
||||||
if (it == names.end())
|
|
||||||
throw RuntimeError("Dacname not found");
|
|
||||||
return static_cast<defs::dacIndex>(it - names.begin());
|
|
||||||
}
|
|
||||||
return StringTo<defs::dacIndex>(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Detector::getDacName(defs::dacIndex i) {
|
|
||||||
auto type = getDetectorType().squash();
|
|
||||||
if (type == defs::CHIPTESTBOARD)
|
|
||||||
return pimpl->getCtbDacName(i);
|
|
||||||
return ToString(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pattern
|
// Pattern
|
||||||
|
|
||||||
void Detector::setPattern(const std::string &fname, Positions pos) {
|
void Detector::setPattern(const std::string &fname, Positions pos) {
|
||||||
@ -2230,11 +2133,10 @@ void Detector::setAdditionalJsonParameter(const std::string &key,
|
|||||||
|
|
||||||
// Advanced
|
// Advanced
|
||||||
|
|
||||||
void Detector::programFPGA(const std::string &fname,
|
void Detector::programFPGA(const std::string &fname, Positions pos) {
|
||||||
const bool forceDeleteNormalFile, Positions pos) {
|
|
||||||
LOG(logINFO) << "Updating Firmware...";
|
LOG(logINFO) << "Updating Firmware...";
|
||||||
std::vector<char> buffer = pimpl->readProgrammingFile(fname);
|
std::vector<char> buffer = pimpl->readProgrammingFile(fname);
|
||||||
pimpl->Parallel(&Module::programFPGA, pos, buffer, forceDeleteNormalFile);
|
pimpl->Parallel(&Module::programFPGA, pos, buffer);
|
||||||
rebootController(pos);
|
rebootController(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2279,7 +2181,7 @@ void Detector::updateFirmwareAndServer(const std::string &sname,
|
|||||||
LOG(logINFO) << "Updating Firmware and Detector Server (with tftp)...";
|
LOG(logINFO) << "Updating Firmware and Detector Server (with tftp)...";
|
||||||
LOG(logINFO) << "Updating Detector Server (via tftp)...";
|
LOG(logINFO) << "Updating Detector Server (via tftp)...";
|
||||||
pimpl->Parallel(&Module::copyDetectorServer, pos, sname, hostname);
|
pimpl->Parallel(&Module::copyDetectorServer, pos, sname, hostname);
|
||||||
programFPGA(fname, false, pos);
|
programFPGA(fname, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Detector::updateFirmwareAndServer(const std::string &sname,
|
void Detector::updateFirmwareAndServer(const std::string &sname,
|
||||||
@ -2290,7 +2192,7 @@ void Detector::updateFirmwareAndServer(const std::string &sname,
|
|||||||
std::vector<char> buffer = readBinaryFile(sname, "Update Detector Server");
|
std::vector<char> buffer = readBinaryFile(sname, "Update Detector Server");
|
||||||
std::string filename = sls::getFileNameFromFilePath(sname);
|
std::string filename = sls::getFileNameFromFilePath(sname);
|
||||||
pimpl->Parallel(&Module::updateDetectorServer, pos, buffer, filename);
|
pimpl->Parallel(&Module::updateDetectorServer, pos, buffer, filename);
|
||||||
programFPGA(fname, false, pos);
|
programFPGA(fname, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<bool> Detector::getUpdateMode(Positions pos) const {
|
Result<bool> Detector::getUpdateMode(Positions pos) const {
|
||||||
@ -2399,9 +2301,25 @@ Result<ns> Detector::getMeasurementTime(Positions pos) const {
|
|||||||
|
|
||||||
std::string Detector::getUserDetails() const { return pimpl->getUserDetails(); }
|
std::string Detector::getUserDetails() const { return pimpl->getUserDetails(); }
|
||||||
|
|
||||||
|
Result<uint64_t> Detector::getRxCurrentFrameIndex(Positions pos) const {
|
||||||
|
return pimpl->Parallel(&Module::getReceiverCurrentFrameIndex, pos);
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<int> Detector::getPortNumbers(int start_port) {
|
std::vector<int> Detector::getPortNumbers(int start_port) {
|
||||||
int num_sockets_per_detector = getNumberofUDPInterfaces({}).tsquash(
|
int num_sockets_per_detector = 1;
|
||||||
"Number of UDP Interfaces is not consistent among modules");
|
switch (getDetectorType().squash()) {
|
||||||
|
case defs::EIGER:
|
||||||
|
num_sockets_per_detector *= 2;
|
||||||
|
break;
|
||||||
|
case defs::JUNGFRAU:
|
||||||
|
case defs::GOTTHARD2:
|
||||||
|
if (pimpl->getNumberofUDPInterfaces({}).squash() == 2) {
|
||||||
|
num_sockets_per_detector *= 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
std::vector<int> res;
|
std::vector<int> res;
|
||||||
res.reserve(size());
|
res.reserve(size());
|
||||||
for (int idet = 0; idet < size(); ++idet) {
|
for (int idet = 0; idet < size(); ++idet) {
|
||||||
|
@ -32,8 +32,7 @@
|
|||||||
namespace sls {
|
namespace sls {
|
||||||
|
|
||||||
DetectorImpl::DetectorImpl(int detector_index, bool verify, bool update)
|
DetectorImpl::DetectorImpl(int detector_index, bool verify, bool update)
|
||||||
: detectorIndex(detector_index), shm(detector_index, -1),
|
: detectorIndex(detector_index), shm(detector_index, -1) {
|
||||||
ctb_shm(detector_index, -1, CtbConfig::shm_tag()) {
|
|
||||||
setupDetector(verify, update);
|
setupDetector(verify, update);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,9 +44,6 @@ void DetectorImpl::setupDetector(bool verify, bool update) {
|
|||||||
if (update) {
|
if (update) {
|
||||||
updateUserdetails();
|
updateUserdetails();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctb_shm.IsExisting())
|
|
||||||
ctb_shm.OpenSharedMemory();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DetectorImpl::setAcquiringFlag(bool flag) { shm()->acquiringFlag = flag; }
|
void DetectorImpl::setAcquiringFlag(bool flag) { shm()->acquiringFlag = flag; }
|
||||||
@ -78,10 +74,6 @@ void DetectorImpl::freeSharedMemory(int detectorIndex, int detPos) {
|
|||||||
SharedMemory<sharedModule> moduleShm(detectorIndex, i);
|
SharedMemory<sharedModule> moduleShm(detectorIndex, i);
|
||||||
moduleShm.RemoveSharedMemory();
|
moduleShm.RemoveSharedMemory();
|
||||||
}
|
}
|
||||||
|
|
||||||
SharedMemory<CtbConfig> ctbShm(detectorIndex, -1, CtbConfig::shm_tag());
|
|
||||||
if (ctbShm.IsExisting())
|
|
||||||
ctbShm.RemoveSharedMemory();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DetectorImpl::freeSharedMemory() {
|
void DetectorImpl::freeSharedMemory() {
|
||||||
@ -94,9 +86,6 @@ void DetectorImpl::freeSharedMemory() {
|
|||||||
// clear detector shm
|
// clear detector shm
|
||||||
shm.RemoveSharedMemory();
|
shm.RemoveSharedMemory();
|
||||||
client_downstream = false;
|
client_downstream = false;
|
||||||
|
|
||||||
if (ctb_shm.IsExisting())
|
|
||||||
ctb_shm.RemoveSharedMemory();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DetectorImpl::getUserDetails() {
|
std::string DetectorImpl::getUserDetails() {
|
||||||
@ -256,16 +245,6 @@ void DetectorImpl::setHostname(const std::vector<std::string> &name) {
|
|||||||
addModule(hostname);
|
addModule(hostname);
|
||||||
}
|
}
|
||||||
updateDetectorSize();
|
updateDetectorSize();
|
||||||
|
|
||||||
// Here we know the detector type and can add ctb shared memory
|
|
||||||
// if needed, CTB dac names are only on detector level
|
|
||||||
|
|
||||||
if (shm()->detType == defs::CHIPTESTBOARD) {
|
|
||||||
if (ctb_shm.IsExisting())
|
|
||||||
ctb_shm.OpenSharedMemory();
|
|
||||||
else
|
|
||||||
ctb_shm.CreateSharedMemory();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DetectorImpl::addModule(const std::string &hostname) {
|
void DetectorImpl::addModule(const std::string &hostname) {
|
||||||
@ -293,13 +272,6 @@ void DetectorImpl::addModule(const std::string &hostname) {
|
|||||||
|
|
||||||
// get type by connecting
|
// get type by connecting
|
||||||
detectorType type = Module::getTypeFromDetector(host, port);
|
detectorType type = Module::getTypeFromDetector(host, port);
|
||||||
|
|
||||||
// gotthard cannot have more than 2 modules (50um=1, 25um=2
|
|
||||||
if ((type == GOTTHARD || type == GOTTHARD2) && modules.size() > 2) {
|
|
||||||
freeSharedMemory();
|
|
||||||
throw sls::RuntimeError("Gotthard cannot have more than 2 modules");
|
|
||||||
}
|
|
||||||
|
|
||||||
auto pos = modules.size();
|
auto pos = modules.size();
|
||||||
modules.emplace_back(
|
modules.emplace_back(
|
||||||
sls::make_unique<Module>(type, detectorIndex, pos, false));
|
sls::make_unique<Module>(type, detectorIndex, pos, false));
|
||||||
@ -307,20 +279,11 @@ void DetectorImpl::addModule(const std::string &hostname) {
|
|||||||
modules[pos]->setControlPort(port);
|
modules[pos]->setControlPort(port);
|
||||||
modules[pos]->setStopPort(port + 1);
|
modules[pos]->setStopPort(port + 1);
|
||||||
modules[pos]->setHostname(host, shm()->initialChecks);
|
modules[pos]->setHostname(host, shm()->initialChecks);
|
||||||
|
|
||||||
// module type updated by now
|
// module type updated by now
|
||||||
shm()->detType = Parallel(&Module::getDetectorType, {})
|
shm()->detType = Parallel(&Module::getDetectorType, {})
|
||||||
.tsquash("Inconsistent detector types.");
|
.tsquash("Inconsistent detector types.");
|
||||||
// for moench and ctb
|
// for moench and ctb
|
||||||
modules[pos]->updateNumberOfChannels();
|
modules[pos]->updateNumberOfChannels();
|
||||||
|
|
||||||
// for eiger, jungfrau, gotthard2
|
|
||||||
modules[pos]->updateNumberofUDPInterfaces();
|
|
||||||
|
|
||||||
// update zmq port in case numudpinterfaces changed
|
|
||||||
int numInterfaces = modules[pos]->getNumberofUDPInterfacesFromShm();
|
|
||||||
modules[pos]->setClientStreamingPort(DEFAULT_ZMQ_CL_PORTNO +
|
|
||||||
pos * numInterfaces);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DetectorImpl::updateDetectorSize() {
|
void DetectorImpl::updateDetectorSize() {
|
||||||
@ -439,25 +402,31 @@ int DetectorImpl::createReceivingDataSockets() {
|
|||||||
}
|
}
|
||||||
LOG(logINFO) << "Going to create data sockets";
|
LOG(logINFO) << "Going to create data sockets";
|
||||||
|
|
||||||
size_t numUDPInterfaces =
|
size_t numSockets = modules.size();
|
||||||
Parallel(&Module::getNumberofUDPInterfacesFromShm, {}).squash(1);
|
size_t numSocketsPerModule = 1;
|
||||||
// gotthard2 second interface is only for veto debugging (not in gui)
|
if (shm()->detType == EIGER) {
|
||||||
if (shm()->detType == GOTTHARD2) {
|
numSocketsPerModule = 2;
|
||||||
numUDPInterfaces = 1;
|
|
||||||
}
|
}
|
||||||
size_t numSockets = modules.size() * numUDPInterfaces;
|
// gotthard2 second interface is only for veto debugging
|
||||||
|
else if (shm()->detType != GOTTHARD2) {
|
||||||
|
if (Parallel(&Module::getNumberofUDPInterfacesFromShm, {}).squash() ==
|
||||||
|
2) {
|
||||||
|
numSocketsPerModule = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
numSockets *= numSocketsPerModule;
|
||||||
|
|
||||||
for (size_t iSocket = 0; iSocket < numSockets; ++iSocket) {
|
for (size_t iSocket = 0; iSocket < numSockets; ++iSocket) {
|
||||||
uint32_t portnum =
|
uint32_t portnum =
|
||||||
(modules[iSocket / numUDPInterfaces]->getClientStreamingPort());
|
(modules[iSocket / numSocketsPerModule]->getClientStreamingPort());
|
||||||
portnum += (iSocket % numUDPInterfaces);
|
portnum += (iSocket % numSocketsPerModule);
|
||||||
try {
|
try {
|
||||||
zmqSocket.push_back(
|
zmqSocket.push_back(sls::make_unique<ZmqSocket>(
|
||||||
sls::make_unique<ZmqSocket>(modules[iSocket / numUDPInterfaces]
|
modules[iSocket / numSocketsPerModule]
|
||||||
->getClientStreamingIP()
|
->getClientStreamingIP()
|
||||||
.str()
|
.str()
|
||||||
.c_str(),
|
.c_str(),
|
||||||
portnum));
|
portnum));
|
||||||
// set high water mark
|
// set high water mark
|
||||||
int hwm = shm()->zmqHwm;
|
int hwm = shm()->zmqHwm;
|
||||||
if (hwm >= 0) {
|
if (hwm >= 0) {
|
||||||
@ -491,9 +460,13 @@ void DetectorImpl::readFrameFromReceiver() {
|
|||||||
int nDetPixelsX = 0;
|
int nDetPixelsX = 0;
|
||||||
int nDetPixelsY = 0;
|
int nDetPixelsY = 0;
|
||||||
bool quadEnable = false;
|
bool quadEnable = false;
|
||||||
// to flip image
|
|
||||||
bool eiger = false;
|
bool eiger = false;
|
||||||
|
bool numInterfaces = 1;
|
||||||
|
// gotthard2 second interface is veto debugging
|
||||||
|
if (shm()->detType != GOTTHARD2) {
|
||||||
|
numInterfaces = Parallel(&Module::getNumberofUDPInterfacesFromShm, {})
|
||||||
|
.squash(); // cannot pick up from zmq
|
||||||
|
}
|
||||||
std::vector<bool> runningList(zmqSocket.size());
|
std::vector<bool> runningList(zmqSocket.size());
|
||||||
std::vector<bool> connectList(zmqSocket.size());
|
std::vector<bool> connectList(zmqSocket.size());
|
||||||
numZmqRunning = 0;
|
numZmqRunning = 0;
|
||||||
@ -569,9 +542,10 @@ void DetectorImpl::readFrameFromReceiver() {
|
|||||||
// shape
|
// shape
|
||||||
nPixelsX = zHeader.npixelsx;
|
nPixelsX = zHeader.npixelsx;
|
||||||
nPixelsY = zHeader.npixelsy;
|
nPixelsY = zHeader.npixelsy;
|
||||||
// module shape (port)
|
// module shape
|
||||||
nX = zHeader.ndetx;
|
nX = zHeader.ndetx;
|
||||||
nY = zHeader.ndety;
|
nY = zHeader.ndety;
|
||||||
|
nY *= numInterfaces;
|
||||||
nDetPixelsX = nX * nPixelsX;
|
nDetPixelsX = nX * nPixelsX;
|
||||||
nDetPixelsY = nY * nPixelsY;
|
nDetPixelsY = nY * nPixelsY;
|
||||||
// det type
|
// det type
|
||||||
@ -1170,7 +1144,7 @@ int DetectorImpl::acquire() {
|
|||||||
if (acquisition_finished != nullptr) {
|
if (acquisition_finished != nullptr) {
|
||||||
int status = Parallel(&Module::getRunStatus, {}).squash(ERROR);
|
int status = Parallel(&Module::getRunStatus, {}).squash(ERROR);
|
||||||
auto a = Parallel(&Module::getReceiverProgress, {});
|
auto a = Parallel(&Module::getReceiverProgress, {});
|
||||||
double progress = (*std::max_element(a.begin(), a.end()));
|
double progress = (*std::min_element(a.begin(), a.end()));
|
||||||
acquisition_finished(progress, status, acqFinished_p);
|
acquisition_finished(progress, status, acqFinished_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1389,6 +1363,10 @@ std::vector<char> DetectorImpl::readProgrammingFile(const std::string &fname) {
|
|||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sls::Result<int> DetectorImpl::getNumberofUDPInterfaces(Positions pos) const {
|
||||||
|
return Parallel(&Module::getNumberofUDPInterfaces, pos);
|
||||||
|
}
|
||||||
|
|
||||||
sls::Result<int> DetectorImpl::getDefaultDac(defs::dacIndex index,
|
sls::Result<int> DetectorImpl::getDefaultDac(defs::dacIndex index,
|
||||||
defs::detectorSettings sett,
|
defs::detectorSettings sett,
|
||||||
Positions pos) {
|
Positions pos) {
|
||||||
@ -1400,16 +1378,4 @@ void DetectorImpl::setDefaultDac(defs::dacIndex index, int defaultValue,
|
|||||||
Parallel(&Module::setDefaultDac, pos, index, defaultValue, sett);
|
Parallel(&Module::setDefaultDac, pos, index, defaultValue, sett);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> DetectorImpl::getCtbDacNames() const {
|
|
||||||
return ctb_shm()->getDacNames();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DetectorImpl::setCtbDacNames(const std::vector<std::string> &names) {
|
|
||||||
ctb_shm()->setDacNames(names);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string DetectorImpl::getCtbDacName(defs::dacIndex i) const {
|
|
||||||
return ctb_shm()->getDacName(static_cast<int>(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace sls
|
} // namespace sls
|
@ -7,8 +7,6 @@
|
|||||||
#include "sls/logger.h"
|
#include "sls/logger.h"
|
||||||
#include "sls/sls_detector_defs.h"
|
#include "sls/sls_detector_defs.h"
|
||||||
|
|
||||||
|
|
||||||
#include "CtbConfig.h"
|
|
||||||
class ZmqSocket;
|
class ZmqSocket;
|
||||||
class detectorData;
|
class detectorData;
|
||||||
|
|
||||||
@ -293,6 +291,7 @@ class DetectorImpl : public virtual slsDetectorDefs {
|
|||||||
*/
|
*/
|
||||||
std::vector<char> readProgrammingFile(const std::string &fname);
|
std::vector<char> readProgrammingFile(const std::string &fname);
|
||||||
|
|
||||||
|
sls::Result<int> getNumberofUDPInterfaces(Positions pos) const;
|
||||||
void setNumberofUDPInterfaces(int n, Positions pos);
|
void setNumberofUDPInterfaces(int n, Positions pos);
|
||||||
sls::Result<int> getDefaultDac(defs::dacIndex index,
|
sls::Result<int> getDefaultDac(defs::dacIndex index,
|
||||||
defs::detectorSettings sett,
|
defs::detectorSettings sett,
|
||||||
@ -300,11 +299,6 @@ class DetectorImpl : public virtual slsDetectorDefs {
|
|||||||
void setDefaultDac(defs::dacIndex index, int defaultValue,
|
void setDefaultDac(defs::dacIndex index, int defaultValue,
|
||||||
defs::detectorSettings sett, Positions pos);
|
defs::detectorSettings sett, Positions pos);
|
||||||
|
|
||||||
|
|
||||||
std::vector<std::string> getCtbDacNames() const;
|
|
||||||
std::string getCtbDacName(defs::dacIndex i) const;
|
|
||||||
void setCtbDacNames(const std::vector<std::string>& names);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
* Creates/open shared memory, initializes detector structure and members
|
* Creates/open shared memory, initializes detector structure and members
|
||||||
@ -388,7 +382,6 @@ class DetectorImpl : public virtual slsDetectorDefs {
|
|||||||
|
|
||||||
const int detectorIndex{0};
|
const int detectorIndex{0};
|
||||||
sls::SharedMemory<sharedDetector> shm{0, -1};
|
sls::SharedMemory<sharedDetector> shm{0, -1};
|
||||||
sls::SharedMemory<CtbConfig> ctb_shm{0, -1, CtbConfig::shm_tag()};
|
|
||||||
std::vector<std::unique_ptr<sls::Module>> modules;
|
std::vector<std::unique_ptr<sls::Module>> modules;
|
||||||
|
|
||||||
/** data streaming (down stream) enabled in client (zmq sckets created) */
|
/** data streaming (down stream) enabled in client (zmq sckets created) */
|
||||||
|
@ -214,21 +214,9 @@ void Module::setThresholdEnergy(int e_eV, detectorSettings isettings,
|
|||||||
myMod.iodelay = myMod1.iodelay;
|
myMod.iodelay = myMod1.iodelay;
|
||||||
myMod.tau =
|
myMod.tau =
|
||||||
linearInterpolation(e_eV, trim1, trim2, myMod1.tau, myMod2.tau);
|
linearInterpolation(e_eV, trim1, trim2, myMod1.tau, myMod2.tau);
|
||||||
// m3, reg is used for gaincaps
|
|
||||||
if (shm()->detType == MYTHEN3) {
|
|
||||||
if (myMod1.reg != myMod2.reg) {
|
|
||||||
throw RuntimeError(
|
|
||||||
"setThresholdEnergyAndSettings: gaincaps do not "
|
|
||||||
"match between files");
|
|
||||||
}
|
|
||||||
myMod.reg = myMod1.reg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// m3, reg is used for gaincaps
|
|
||||||
if (shm()->detType != MYTHEN3) {
|
|
||||||
myMod.reg = isettings;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
myMod.reg = isettings;
|
||||||
myMod.eV[0] = e_eV;
|
myMod.eV[0] = e_eV;
|
||||||
setModule(myMod, trimbits);
|
setModule(myMod, trimbits);
|
||||||
if (getSettings() != isettings) {
|
if (getSettings() != isettings) {
|
||||||
@ -243,7 +231,6 @@ void Module::setThresholdEnergy(int e_eV, detectorSettings isettings,
|
|||||||
|
|
||||||
void Module::setAllThresholdEnergy(std::array<int, 3> e_eV,
|
void Module::setAllThresholdEnergy(std::array<int, 3> e_eV,
|
||||||
detectorSettings isettings, bool trimbits) {
|
detectorSettings isettings, bool trimbits) {
|
||||||
// only mythen3
|
|
||||||
if (shm()->trimEnergies.empty()) {
|
if (shm()->trimEnergies.empty()) {
|
||||||
throw RuntimeError(
|
throw RuntimeError(
|
||||||
"Trim energies have not been defined for this module yet!");
|
"Trim energies have not been defined for this module yet!");
|
||||||
@ -324,13 +311,6 @@ void Module::setAllThresholdEnergy(std::array<int, 3> e_eV,
|
|||||||
|
|
||||||
myMods[i] = interpolateTrim(&myMod1, &myMod2, energy[i], trim1,
|
myMods[i] = interpolateTrim(&myMod1, &myMod2, energy[i], trim1,
|
||||||
trim2, trimbits);
|
trim2, trimbits);
|
||||||
// gaincaps
|
|
||||||
if (myMod1.reg != myMod2.reg) {
|
|
||||||
throw RuntimeError("setAllThresholdEnergy: gaincaps do not "
|
|
||||||
"match between files for energy (eV) " +
|
|
||||||
std::to_string(energy[i]));
|
|
||||||
}
|
|
||||||
myMods[i].reg = myMod1.reg;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -377,11 +357,6 @@ void Module::setAllThresholdEnergy(std::array<int, 3> e_eV,
|
|||||||
for (int i = 0; i < myMod.nchan; ++i) {
|
for (int i = 0; i < myMod.nchan; ++i) {
|
||||||
myMod.chanregs[i] = myMods[i % 3].chanregs[i];
|
myMod.chanregs[i] = myMods[i % 3].chanregs[i];
|
||||||
}
|
}
|
||||||
// gain caps
|
|
||||||
if (myMods[0].reg != myMods[1].reg || myMods[1].reg != myMods[2].reg) {
|
|
||||||
throw RuntimeError("setAllThresholdEnergy: gaincaps do not "
|
|
||||||
"match between files for all energies");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
myMod.reg = isettings;
|
myMod.reg = isettings;
|
||||||
@ -509,13 +484,6 @@ void Module::setFlipRows(bool value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Module::isMaster() const { return sendToDetectorStop<int>(F_GET_MASTER); }
|
|
||||||
|
|
||||||
void Module::setMaster(const bool master) {
|
|
||||||
sendToDetector(F_SET_MASTER, static_cast<int>(master), nullptr);
|
|
||||||
sendToDetectorStop(F_SET_MASTER, static_cast<int>(master), nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Module::isVirtualDetectorServer() const {
|
bool Module::isVirtualDetectorServer() const {
|
||||||
return sendToDetector<int>(F_IS_VIRTUAL);
|
return sendToDetector<int>(F_IS_VIRTUAL);
|
||||||
}
|
}
|
||||||
@ -873,29 +841,11 @@ double Module::getReceiverProgress() const {
|
|||||||
return sendToReceiver<double>(F_GET_RECEIVER_PROGRESS);
|
return sendToReceiver<double>(F_GET_RECEIVER_PROGRESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int64_t> Module::getFramesCaughtByReceiver() const {
|
int64_t Module::getFramesCaughtByReceiver() const {
|
||||||
// TODO!(Erik) Refactor
|
return sendToReceiver<int64_t>(F_GET_RECEIVER_FRAMES_CAUGHT);
|
||||||
LOG(logDEBUG1) << "Getting frames caught";
|
|
||||||
if (shm()->useReceiverFlag) {
|
|
||||||
auto client = ReceiverSocket(shm()->rxHostname, shm()->rxTCPPort);
|
|
||||||
client.Send(F_GET_RECEIVER_FRAMES_CAUGHT);
|
|
||||||
if (client.Receive<int>() == FAIL) {
|
|
||||||
throw ReceiverError(
|
|
||||||
"Receiver " + std::to_string(moduleIndex) +
|
|
||||||
" returned error: " + client.readErrorMessage());
|
|
||||||
} else {
|
|
||||||
auto nports = client.Receive<int>();
|
|
||||||
std::vector<int64_t> retval(nports);
|
|
||||||
client.Receive(retval);
|
|
||||||
LOG(logDEBUG1) << "Frames caught of Receiver" << moduleIndex << ": "
|
|
||||||
<< sls::ToString(retval);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw RuntimeError("No receiver to get frames caught.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int64_t> Module::getNumMissingPackets() const {
|
std::vector<uint64_t> Module::getNumMissingPackets() const {
|
||||||
// TODO!(Erik) Refactor
|
// TODO!(Erik) Refactor
|
||||||
LOG(logDEBUG1) << "Getting num missing packets";
|
LOG(logDEBUG1) << "Getting num missing packets";
|
||||||
if (shm()->useReceiverFlag) {
|
if (shm()->useReceiverFlag) {
|
||||||
@ -907,7 +857,7 @@ std::vector<int64_t> Module::getNumMissingPackets() const {
|
|||||||
" returned error: " + client.readErrorMessage());
|
" returned error: " + client.readErrorMessage());
|
||||||
} else {
|
} else {
|
||||||
auto nports = client.Receive<int>();
|
auto nports = client.Receive<int>();
|
||||||
std::vector<int64_t> retval(nports);
|
std::vector<uint64_t> retval(nports);
|
||||||
client.Receive(retval);
|
client.Receive(retval);
|
||||||
LOG(logDEBUG1) << "Missing packets of Receiver" << moduleIndex
|
LOG(logDEBUG1) << "Missing packets of Receiver" << moduleIndex
|
||||||
<< ": " << sls::ToString(retval);
|
<< ": " << sls::ToString(retval);
|
||||||
@ -917,28 +867,6 @@ std::vector<int64_t> Module::getNumMissingPackets() const {
|
|||||||
throw RuntimeError("No receiver to get missing packets.");
|
throw RuntimeError("No receiver to get missing packets.");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int64_t> Module::getReceiverCurrentFrameIndex() const {
|
|
||||||
// TODO!(Erik) Refactor
|
|
||||||
LOG(logDEBUG1) << "Getting frame index";
|
|
||||||
if (shm()->useReceiverFlag) {
|
|
||||||
auto client = ReceiverSocket(shm()->rxHostname, shm()->rxTCPPort);
|
|
||||||
client.Send(F_GET_RECEIVER_FRAME_INDEX);
|
|
||||||
if (client.Receive<int>() == FAIL) {
|
|
||||||
throw ReceiverError(
|
|
||||||
"Receiver " + std::to_string(moduleIndex) +
|
|
||||||
" returned error: " + client.readErrorMessage());
|
|
||||||
} else {
|
|
||||||
auto nports = client.Receive<int>();
|
|
||||||
std::vector<int64_t> retval(nports);
|
|
||||||
client.Receive(retval);
|
|
||||||
LOG(logDEBUG1) << "Frame index of Receiver" << moduleIndex << ": "
|
|
||||||
<< sls::ToString(retval);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw RuntimeError("No receiver to get frame index.");
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t Module::getNextFrameNumber() const {
|
uint64_t Module::getNextFrameNumber() const {
|
||||||
return sendToDetector<uint64_t>(F_GET_NEXT_FRAME_NUMBER);
|
return sendToDetector<uint64_t>(F_GET_NEXT_FRAME_NUMBER);
|
||||||
}
|
}
|
||||||
@ -976,8 +904,9 @@ int Module::getNumberofUDPInterfacesFromShm() const {
|
|||||||
return shm()->numUDPInterfaces;
|
return shm()->numUDPInterfaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Module::updateNumberofUDPInterfaces() {
|
int Module::getNumberofUDPInterfaces() const {
|
||||||
shm()->numUDPInterfaces = sendToDetector<int>(F_GET_NUM_INTERFACES);
|
shm()->numUDPInterfaces = sendToDetector<int>(F_GET_NUM_INTERFACES);
|
||||||
|
return shm()->numUDPInterfaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Module::setNumberofUDPInterfaces(int n) {
|
void Module::setNumberofUDPInterfaces(int n) {
|
||||||
@ -1092,10 +1021,6 @@ void Module::setDestinationUDPIP(const IpAddr ip) {
|
|||||||
if (ip == 0) {
|
if (ip == 0) {
|
||||||
throw RuntimeError("Invalid destination udp ip address");
|
throw RuntimeError("Invalid destination udp ip address");
|
||||||
}
|
}
|
||||||
if (ip.str() == LOCALHOST_IP && !isVirtualDetectorServer()) {
|
|
||||||
throw RuntimeError("Invalid destination udp ip. Change rx_hostname "
|
|
||||||
"from localhost or change udp_dstip from auto?");
|
|
||||||
}
|
|
||||||
sendToDetector(F_SET_DEST_UDP_IP, ip, nullptr);
|
sendToDetector(F_SET_DEST_UDP_IP, ip, nullptr);
|
||||||
if (shm()->useReceiverFlag) {
|
if (shm()->useReceiverFlag) {
|
||||||
sls::MacAddr retval(0LU);
|
sls::MacAddr retval(0LU);
|
||||||
@ -1115,10 +1040,7 @@ void Module::setDestinationUDPIP2(const IpAddr ip) {
|
|||||||
if (ip == 0) {
|
if (ip == 0) {
|
||||||
throw RuntimeError("Invalid destination udp ip address2");
|
throw RuntimeError("Invalid destination udp ip address2");
|
||||||
}
|
}
|
||||||
if (ip.str() == LOCALHOST_IP && !isVirtualDetectorServer()) {
|
|
||||||
throw RuntimeError("Invalid destination udp ip2. Change rx_hostname "
|
|
||||||
"from localhost or change udp_dstip from auto?");
|
|
||||||
}
|
|
||||||
sendToDetector(F_SET_DEST_UDP_IP2, ip, nullptr);
|
sendToDetector(F_SET_DEST_UDP_IP2, ip, nullptr);
|
||||||
if (shm()->useReceiverFlag) {
|
if (shm()->useReceiverFlag) {
|
||||||
sls::MacAddr retval(0LU);
|
sls::MacAddr retval(0LU);
|
||||||
@ -1185,7 +1107,7 @@ std::string Module::printReceiverConfiguration() {
|
|||||||
<< getReceiverHostname();
|
<< getReceiverHostname();
|
||||||
|
|
||||||
if (shm()->detType == JUNGFRAU) {
|
if (shm()->detType == JUNGFRAU) {
|
||||||
os << "\nNumber of Interfaces:\t" << getNumberofUDPInterfacesFromShm()
|
os << "\nNumber of Interfaces:\t" << getNumberofUDPInterfaces()
|
||||||
<< "\nSelected Interface:\t" << getSelectedUDPInterface();
|
<< "\nSelected Interface:\t" << getSelectedUDPInterface();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1396,14 +1318,6 @@ std::array<pid_t, NUM_RX_THREAD_IDS> Module::getReceiverThreadIds() const {
|
|||||||
F_GET_RECEIVER_THREAD_IDS);
|
F_GET_RECEIVER_THREAD_IDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Module::getRxArping() const {
|
|
||||||
return sendToReceiver<int>(F_GET_RECEIVER_ARPING);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Module::setRxArping(bool enable) {
|
|
||||||
sendToReceiver(F_SET_RECEIVER_ARPING, static_cast<int>(enable), nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// File
|
// File
|
||||||
slsDetectorDefs::fileFormat Module::getFileFormat() const {
|
slsDetectorDefs::fileFormat Module::getFileFormat() const {
|
||||||
return sendToReceiver<fileFormat>(F_GET_RECEIVER_FILE_FORMAT);
|
return sendToReceiver<fileFormat>(F_GET_RECEIVER_FILE_FORMAT);
|
||||||
@ -1719,14 +1633,6 @@ void Module::setDataStream(const portPosition port, const bool enable) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Module::getTop() const {
|
|
||||||
return (static_cast<bool>(sendToDetector<int>(F_GET_TOP)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void Module::setTop(bool value) {
|
|
||||||
sendToDetector(F_SET_TOP, static_cast<int>(value), nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Jungfrau Specific
|
// Jungfrau Specific
|
||||||
double Module::getChipVersion() const {
|
double Module::getChipVersion() const {
|
||||||
return (sendToDetector<int>(F_GET_CHIP_VERSION)) / 10.00;
|
return (sendToDetector<int>(F_GET_CHIP_VERSION)) / 10.00;
|
||||||
@ -2251,6 +2157,8 @@ std::array<time::ns, 3> Module::getGateDelayForAllGates() const {
|
|||||||
return sendToDetector<std::array<time::ns, 3>>(F_GET_GATE_DELAY_ALL_GATES);
|
return sendToDetector<std::array<time::ns, 3>>(F_GET_GATE_DELAY_ALL_GATES);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Module::isMaster() const { return sendToDetectorStop<int>(F_GET_MASTER); }
|
||||||
|
|
||||||
int Module::getChipStatusRegister() const {
|
int Module::getChipStatusRegister() const {
|
||||||
return sendToDetector<int>(F_GET_CSR);
|
return sendToDetector<int>(F_GET_CSR);
|
||||||
}
|
}
|
||||||
@ -2590,14 +2498,12 @@ void Module::setAdditionalJsonParameter(const std::string &key,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Advanced
|
// Advanced
|
||||||
void Module::programFPGA(std::vector<char> buffer,
|
void Module::programFPGA(std::vector<char> buffer) {
|
||||||
const bool forceDeleteNormalFile) {
|
|
||||||
switch (shm()->detType) {
|
switch (shm()->detType) {
|
||||||
case JUNGFRAU:
|
case JUNGFRAU:
|
||||||
case CHIPTESTBOARD:
|
case CHIPTESTBOARD:
|
||||||
case MOENCH:
|
case MOENCH:
|
||||||
sendProgram(true, buffer, F_PROGRAM_FPGA, "Update Firmware", "",
|
sendProgram(true, buffer, F_PROGRAM_FPGA, "Update Firmware");
|
||||||
forceDeleteNormalFile);
|
|
||||||
break;
|
break;
|
||||||
case MYTHEN3:
|
case MYTHEN3:
|
||||||
case GOTTHARD2:
|
case GOTTHARD2:
|
||||||
@ -2797,6 +2703,10 @@ int64_t Module::getMeasurementTime() const {
|
|||||||
return sendToDetectorStop<int64_t>(F_GET_MEASUREMENT_TIME);
|
return sendToDetectorStop<int64_t>(F_GET_MEASUREMENT_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t Module::getReceiverCurrentFrameIndex() const {
|
||||||
|
return sendToReceiver<uint64_t>(F_GET_RECEIVER_FRAME_INDEX);
|
||||||
|
}
|
||||||
|
|
||||||
// private
|
// private
|
||||||
|
|
||||||
void Module::checkArgs(const void *args, size_t args_size, void *retval,
|
void Module::checkArgs(const void *args, size_t args_size, void *retval,
|
||||||
@ -3220,10 +3130,10 @@ void Module::initializeModuleStructure(detectorType type) {
|
|||||||
sls::strcpy_safe(shm()->rxHostname, "none");
|
sls::strcpy_safe(shm()->rxHostname, "none");
|
||||||
shm()->rxTCPPort = DEFAULT_PORTNO + 2;
|
shm()->rxTCPPort = DEFAULT_PORTNO + 2;
|
||||||
shm()->useReceiverFlag = false;
|
shm()->useReceiverFlag = false;
|
||||||
shm()->numUDPInterfaces = 1;
|
shm()->zmqport = DEFAULT_ZMQ_CL_PORTNO +
|
||||||
shm()->zmqport =
|
(moduleIndex * ((shm()->detType == EIGER) ? 2 : 1));
|
||||||
DEFAULT_ZMQ_CL_PORTNO + moduleIndex * shm()->numUDPInterfaces;
|
|
||||||
shm()->zmqip = IpAddr{};
|
shm()->zmqip = IpAddr{};
|
||||||
|
shm()->numUDPInterfaces = 1;
|
||||||
shm()->stoppedFlag = false;
|
shm()->stoppedFlag = false;
|
||||||
|
|
||||||
// get the Module parameters based on type
|
// get the Module parameters based on type
|
||||||
@ -3410,11 +3320,11 @@ sls_detector_module Module::interpolateTrim(sls_detector_module *a,
|
|||||||
if (shm()->detType == EIGER) {
|
if (shm()->detType == EIGER) {
|
||||||
dacs_to_copy.insert(
|
dacs_to_copy.insert(
|
||||||
dacs_to_copy.end(),
|
dacs_to_copy.end(),
|
||||||
{E_SVP, E_SVN, E_VTGSTV, E_RXB_RB, E_RXB_LB, E_VCN, E_VIS});
|
{E_SVP, E_VTR, E_SVN, E_VTGSTV, E_RXB_RB, E_RXB_LB, E_VCN, E_VIS});
|
||||||
// interpolate vrf, vcmp, vcp
|
// interpolate vrf, vcmp, vcp
|
||||||
dacs_to_interpolate.insert(dacs_to_interpolate.end(),
|
dacs_to_interpolate.insert(
|
||||||
{E_VTR, E_VRF, E_VCMP_LL, E_VCMP_LR,
|
dacs_to_interpolate.end(),
|
||||||
E_VCMP_RL, E_VCMP_RR, E_VCP, E_VRS});
|
{E_VRF, E_VCMP_LL, E_VCMP_LR, E_VCMP_RL, E_VCMP_RR, E_VCP, E_VRS});
|
||||||
} else {
|
} else {
|
||||||
dacs_to_copy.insert(dacs_to_copy.end(),
|
dacs_to_copy.insert(dacs_to_copy.end(),
|
||||||
{M_VCASSH, M_VRSHAPER, M_VRSHAPER_N, M_VIPRE_OUT,
|
{M_VCASSH, M_VRSHAPER, M_VRSHAPER_N, M_VIPRE_OUT,
|
||||||
@ -3584,8 +3494,7 @@ sls_detector_module Module::readSettingsFile(const std::string &fname,
|
|||||||
void Module::sendProgram(bool blackfin, std::vector<char> buffer,
|
void Module::sendProgram(bool blackfin, std::vector<char> buffer,
|
||||||
const int functionEnum,
|
const int functionEnum,
|
||||||
const std::string &functionType,
|
const std::string &functionType,
|
||||||
const std::string serverName,
|
const std::string serverName) {
|
||||||
const bool forceDeleteNormalFile) {
|
|
||||||
LOG(logINFO) << "Module " << moduleIndex << " (" << shm()->hostname
|
LOG(logINFO) << "Module " << moduleIndex << " (" << shm()->hostname
|
||||||
<< "): Sending " << functionType;
|
<< "): Sending " << functionType;
|
||||||
|
|
||||||
@ -3609,11 +3518,6 @@ void Module::sendProgram(bool blackfin, std::vector<char> buffer,
|
|||||||
client.Send(sname);
|
client.Send(sname);
|
||||||
}
|
}
|
||||||
|
|
||||||
// send forceDeleteNormalFile flag
|
|
||||||
if (blackfin) {
|
|
||||||
client.Send(static_cast<int>(forceDeleteNormalFile));
|
|
||||||
}
|
|
||||||
|
|
||||||
// validate memory allocation etc in detector
|
// validate memory allocation etc in detector
|
||||||
if (client.Receive<int>() == FAIL) {
|
if (client.Receive<int>() == FAIL) {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
|
@ -120,9 +120,6 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
int setTrimEn(const std::vector<int> &energies = {});
|
int setTrimEn(const std::vector<int> &energies = {});
|
||||||
bool getFlipRows() const;
|
bool getFlipRows() const;
|
||||||
void setFlipRows(bool value);
|
void setFlipRows(bool value);
|
||||||
bool isMaster() const;
|
|
||||||
void setMaster(const bool master);
|
|
||||||
|
|
||||||
bool isVirtualDetectorServer() const;
|
bool isVirtualDetectorServer() const;
|
||||||
|
|
||||||
/**************************************************
|
/**************************************************
|
||||||
@ -187,7 +184,6 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
void setDBITPipeline(int value);
|
void setDBITPipeline(int value);
|
||||||
int getReadNRows() const;
|
int getReadNRows() const;
|
||||||
void setReadNRows(const int value);
|
void setReadNRows(const int value);
|
||||||
|
|
||||||
/**************************************************
|
/**************************************************
|
||||||
* *
|
* *
|
||||||
* Acquisition *
|
* Acquisition *
|
||||||
@ -203,9 +199,8 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
runStatus getRunStatus() const;
|
runStatus getRunStatus() const;
|
||||||
runStatus getReceiverStatus() const;
|
runStatus getReceiverStatus() const;
|
||||||
double getReceiverProgress() const;
|
double getReceiverProgress() const;
|
||||||
std::vector<int64_t> getFramesCaughtByReceiver() const;
|
int64_t getFramesCaughtByReceiver() const;
|
||||||
std::vector<int64_t> getNumMissingPackets() const;
|
std::vector<uint64_t> getNumMissingPackets() const;
|
||||||
std::vector<int64_t> getReceiverCurrentFrameIndex() const;
|
|
||||||
uint64_t getNextFrameNumber() const;
|
uint64_t getNextFrameNumber() const;
|
||||||
void setNextFrameNumber(uint64_t value);
|
void setNextFrameNumber(uint64_t value);
|
||||||
void sendSoftwareTrigger(const bool block);
|
void sendSoftwareTrigger(const bool block);
|
||||||
@ -219,7 +214,7 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
* *
|
* *
|
||||||
* ************************************************/
|
* ************************************************/
|
||||||
int getNumberofUDPInterfacesFromShm() const;
|
int getNumberofUDPInterfacesFromShm() const;
|
||||||
void updateNumberofUDPInterfaces();
|
int getNumberofUDPInterfaces() const;
|
||||||
void setNumberofUDPInterfaces(int n);
|
void setNumberofUDPInterfaces(int n);
|
||||||
int getSelectedUDPInterface() const;
|
int getSelectedUDPInterface() const;
|
||||||
void selectUDPInterface(int n);
|
void selectUDPInterface(int n);
|
||||||
@ -288,8 +283,6 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
void setReceiverLock(bool lock);
|
void setReceiverLock(bool lock);
|
||||||
sls::IpAddr getReceiverLastClientIP() const;
|
sls::IpAddr getReceiverLastClientIP() const;
|
||||||
std::array<pid_t, NUM_RX_THREAD_IDS> getReceiverThreadIds() const;
|
std::array<pid_t, NUM_RX_THREAD_IDS> getReceiverThreadIds() const;
|
||||||
bool getRxArping() const;
|
|
||||||
void setRxArping(bool enable);
|
|
||||||
|
|
||||||
/**************************************************
|
/**************************************************
|
||||||
* *
|
* *
|
||||||
@ -370,8 +363,6 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
void setQuad(const bool enable);
|
void setQuad(const bool enable);
|
||||||
bool getDataStream(const portPosition port) const;
|
bool getDataStream(const portPosition port) const;
|
||||||
void setDataStream(const portPosition port, const bool enable);
|
void setDataStream(const portPosition port, const bool enable);
|
||||||
bool getTop() const;
|
|
||||||
void setTop(bool value);
|
|
||||||
|
|
||||||
/**************************************************
|
/**************************************************
|
||||||
* *
|
* *
|
||||||
@ -463,6 +454,7 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
int64_t getGateDelay(int gateIndex) const;
|
int64_t getGateDelay(int gateIndex) const;
|
||||||
void setGateDelay(int gateIndex, int64_t value);
|
void setGateDelay(int gateIndex, int64_t value);
|
||||||
std::array<time::ns, 3> getGateDelayForAllGates() const;
|
std::array<time::ns, 3> getGateDelayForAllGates() const;
|
||||||
|
bool isMaster() const;
|
||||||
int getChipStatusRegister() const;
|
int getChipStatusRegister() const;
|
||||||
void setGainCaps(int caps);
|
void setGainCaps(int caps);
|
||||||
int getGainCaps();
|
int getGainCaps();
|
||||||
@ -545,8 +537,7 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
* Advanced *
|
* Advanced *
|
||||||
* *
|
* *
|
||||||
* ************************************************/
|
* ************************************************/
|
||||||
void programFPGA(std::vector<char> buffer,
|
void programFPGA(std::vector<char> buffer);
|
||||||
const bool forceDeleteNormalFile);
|
|
||||||
void resetFPGA();
|
void resetFPGA();
|
||||||
void copyDetectorServer(const std::string &fname,
|
void copyDetectorServer(const std::string &fname,
|
||||||
const std::string &hostname);
|
const std::string &hostname);
|
||||||
@ -583,6 +574,7 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
int64_t getNumberOfFramesFromStart() const;
|
int64_t getNumberOfFramesFromStart() const;
|
||||||
int64_t getActualTime() const;
|
int64_t getActualTime() const;
|
||||||
int64_t getMeasurementTime() const;
|
int64_t getMeasurementTime() const;
|
||||||
|
uint64_t getReceiverCurrentFrameIndex() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void checkArgs(const void *args, size_t args_size, void *retval,
|
void checkArgs(const void *args, size_t args_size, void *retval,
|
||||||
@ -761,8 +753,7 @@ class Module : public virtual slsDetectorDefs {
|
|||||||
bool trimbits = true);
|
bool trimbits = true);
|
||||||
void sendProgram(bool blackfin, std::vector<char> buffer,
|
void sendProgram(bool blackfin, std::vector<char> buffer,
|
||||||
const int functionEnum, const std::string &functionType,
|
const int functionEnum, const std::string &functionType,
|
||||||
const std::string serverName = "",
|
const std::string serverName = "");
|
||||||
const bool forceDeleteNormalFile = false);
|
|
||||||
void simulatingActivityinDetector(const std::string &functionType,
|
void simulatingActivityinDetector(const std::string &functionType,
|
||||||
const int timeRequired);
|
const int timeRequired);
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user