mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-19 16:27:13 +02:00
Compare commits
92 Commits
moench8.0.
...
802/fix_hd
Author | SHA1 | Date | |
---|---|---|---|
f377e1aae2 | |||
8d185988c1 | |||
61e9437842 | |||
2d177924eb | |||
4eb8e52360 | |||
2c278b1933 | |||
e4c52bde1d | |||
6251dc1b71 | |||
aa173d3a87 | |||
62c428320f | |||
70f467a3cd | |||
97f0c1fe46 | |||
a86fd00e59 | |||
24894667b7 | |||
4b414bfddb | |||
15d357d9ab | |||
f95de054f9 | |||
0aef8113dd | |||
9785a41048 | |||
417e1a88a5 | |||
9c0dd0385d | |||
5ab64efe3e | |||
8f77e4d4fe | |||
41c5b75b10 | |||
bfe53c6693 | |||
f7997dd09a | |||
c64e87a2b6 | |||
5eeb8e29c1 | |||
09697fa325 | |||
90b4daef39 | |||
2082f1eee7 | |||
d3a636b563 | |||
50b9b6ca39 | |||
e86b57cdfc | |||
14e11e8b5b | |||
beafe86554 | |||
af3dc1e7f4 | |||
573177203b | |||
a3ca9ebce5 | |||
8174fc9691 | |||
d6eac6da71 | |||
56c7ae4852 | |||
9b9b09ceaf | |||
cfebaee2a5 | |||
4613c54f57 | |||
51f9d6f011 | |||
58ac7ac280 | |||
82edfa75d3 | |||
35ed926047 | |||
4023ed0775 | |||
b6ef3bc39e | |||
2035666792 | |||
1ff4d806e7 | |||
3861379653 | |||
91140bbb71 | |||
a5632fcbea | |||
d44329117d | |||
4a454aa698 | |||
0e43072db8 | |||
6c67025ea8 | |||
e5ee27dbfa | |||
601249cc71 | |||
ff60b8c379 | |||
37ce3d6f59 | |||
bf26533fd8 | |||
7106273521 | |||
1484d038de | |||
fb0090c79e | |||
adc68cd519 | |||
1566eef247 | |||
e7cd90db78 | |||
45414149fe | |||
48759f440e | |||
b367b7e431 | |||
f0b2a6f6f9 | |||
f761046bfc | |||
1a859b83db | |||
70bfc875a6 | |||
c0755308a4 | |||
ab5509e10c | |||
004cb26646 | |||
a4f47a5945 | |||
312f3f473d | |||
5871086cd6 | |||
6a0fe823b3 | |||
5912aae53e | |||
8833ccf5cc | |||
77c558a7be | |||
378fc301b8 | |||
87d6e16090 | |||
2ef021041c | |||
574127b5ac |
2
.github/workflows/cmake.yml
vendored
2
.github/workflows/cmake.yml
vendored
@ -17,7 +17,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||||
with:
|
with:
|
||||||
packages: libhdf5-dev qtbase5-dev qt5-qmake libqt5svg5-dev
|
packages: libzmq3-dev libhdf5-dev qtbase5-dev qt5-qmake libqt5svg5-dev
|
||||||
version: 1.0
|
version: 1.0
|
||||||
|
|
||||||
- name: Configure CMake
|
- name: Configure CMake
|
||||||
|
@ -1 +0,0 @@
|
|||||||
# This file is generated by cmake for dependency checking of the CMakeCache.txt file
|
|
@ -2,7 +2,7 @@
|
|||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
cmake_minimum_required(VERSION 3.14)
|
cmake_minimum_required(VERSION 3.14)
|
||||||
project(slsDetectorPackage)
|
project(slsDetectorPackage)
|
||||||
set(PROJECT_VERSION 7.0.0)
|
set(PROJECT_VERSION 8.0.1)
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
||||||
|
|
||||||
@ -232,8 +232,6 @@ if (NOT TARGET slsProjectCSettings)
|
|||||||
-Wredundant-decls
|
-Wredundant-decls
|
||||||
-Wdouble-promotion
|
-Wdouble-promotion
|
||||||
-Werror=return-type
|
-Werror=return-type
|
||||||
-Wno-format-overflow
|
|
||||||
-Wno-format-truncation
|
|
||||||
)
|
)
|
||||||
sls_disable_c_warning("-Wstringop-truncation")
|
sls_disable_c_warning("-Wstringop-truncation")
|
||||||
endif()
|
endif()
|
||||||
@ -246,7 +244,6 @@ if(SLS_USE_SANITIZER)
|
|||||||
# target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread)
|
# target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(SLS_TUNE_LOCAL)
|
if(SLS_TUNE_LOCAL)
|
||||||
target_compile_options(slsProjectOptions INTERFACE -mtune=native -march=native)
|
target_compile_options(slsProjectOptions INTERFACE -mtune=native -march=native)
|
||||||
endif()
|
endif()
|
||||||
|
66
RELEASE.txt
66
RELEASE.txt
@ -1,21 +1,13 @@
|
|||||||
SLS Detector Package Major Release 7.x.x released on xx.xx.2023
|
SLS Detector Package Major Release 8.0.1 released on 16.01.2024
|
||||||
===============================================================
|
===============================================================
|
||||||
|
|
||||||
This document describes the differences between v7.x.x and v7.0.2
|
This document describes the differences between v8.0.1 and v8.0.0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CONTENTS
|
CONTENTS
|
||||||
--------
|
--------
|
||||||
1 New, Changed or Resolved Features
|
1 Resolved Issues
|
||||||
1.1 Compilation
|
|
||||||
1.2 Callback
|
|
||||||
1.3 Python
|
|
||||||
1.4 Client
|
|
||||||
1.5 Detector Server
|
|
||||||
1.6 Simulator
|
|
||||||
1.7 Receiver
|
|
||||||
1.8 Gui
|
|
||||||
2 On-board Detector Server Compatibility
|
2 On-board Detector Server Compatibility
|
||||||
3 Firmware Requirements
|
3 Firmware Requirements
|
||||||
4 Kernel Requirements
|
4 Kernel Requirements
|
||||||
@ -24,13 +16,27 @@ This document describes the differences between v7.x.x and v7.0.2
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
1 New, Changed or Resolved Features
|
1 Resolved Issues
|
||||||
=====================================
|
=================
|
||||||
|
|
||||||
|
|
||||||
- moench being made compatible with jungfrau 2.0 boards (jungfrau structure, away from ctb)
|
Compilation
|
||||||
- eiger febl and feb in versions
|
-----------
|
||||||
- fix ctb slow adcs
|
|
||||||
|
|
||||||
|
* Fixed compilation error when building without zmq-devel installed
|
||||||
|
and removed dependency on zeromq in conda build.
|
||||||
|
|
||||||
|
|
||||||
|
* Fixed libzmq compilation error to build the package as a submodule.
|
||||||
|
|
||||||
|
|
||||||
|
Calibration
|
||||||
|
-----------
|
||||||
|
|
||||||
|
|
||||||
|
* [Moench] Fixed Moench calibration
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -38,13 +44,13 @@ This document describes the differences between v7.x.x and v7.0.2
|
|||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
|
|
||||||
Eiger 7.0.0
|
Eiger 8.0.0
|
||||||
Jungfrau 7.0.2
|
Jungfrau 8.0.0
|
||||||
Mythen3 7.0.0
|
Mythen3 8.0.0
|
||||||
Gotthard2 7.0.0
|
Gotthard2 8.0.0
|
||||||
Gotthard 7.0.0
|
Gotthard 8.0.0
|
||||||
Moench 7.0.0
|
Moench 8.0.0
|
||||||
Ctb 7.0.0
|
Ctb 8.0.0
|
||||||
|
|
||||||
|
|
||||||
On-board Detector Server Upgrade
|
On-board Detector Server Upgrade
|
||||||
@ -65,21 +71,21 @@ This document describes the differences between v7.x.x and v7.0.2
|
|||||||
========================
|
========================
|
||||||
|
|
||||||
|
|
||||||
Eiger 20.02.2023 (v31)
|
Eiger 02.10.2023 (v32) (updated in 7.0.3)
|
||||||
|
|
||||||
Jungfrau 04.11.2022 (v1.4, HW v1.0)
|
Jungfrau 20.09.2023 (v1.5, HW v1.0) (updated in 8.0.0)
|
||||||
03.11.2022 (v2.4, HW v2.0)
|
21.09.2023 (v2.5, HW v2.0) (updated in 8.0.0)
|
||||||
|
|
||||||
Mythen3 24.01.2023 (v1.4)
|
Mythen3 24.01.2023 (v1.4) (updated in 7.0.0)
|
||||||
|
|
||||||
Gotthard2 23.11.2022 (v0.3)
|
Gotthard2 23.11.2022 (v0.3) (updated in 7.0.0)
|
||||||
|
|
||||||
Gotthard 08.02.2018 (50um and 25um Master)
|
Gotthard 08.02.2018 (50um and 25um Master)
|
||||||
09.02.2018 (25 um Slave)
|
09.02.2018 (25 um Slave)
|
||||||
|
|
||||||
Moench 05.12.2022 (v0.3)
|
Moench 10.07.2023 (v0.3.2) (updated in 8.0.0, under development)
|
||||||
|
|
||||||
Ctb 03.04.2023 (v1.2?)
|
Ctb 28.08.2023 (v1.2) (updated in 8.0.0)
|
||||||
|
|
||||||
|
|
||||||
Detector Upgrade
|
Detector Upgrade
|
||||||
|
@ -1 +0,0 @@
|
|||||||
slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh
|
|
@ -316,7 +316,8 @@ struct GenericStringRef {
|
|||||||
|
|
||||||
GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {}
|
GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {}
|
||||||
|
|
||||||
GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; }
|
// Removed to fix failing build in GCC 14
|
||||||
|
// GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; }
|
||||||
|
|
||||||
//! implicit conversion to plain CharType pointer
|
//! implicit conversion to plain CharType pointer
|
||||||
operator const Ch *() const { return s; }
|
operator const Ch *() const { return s; }
|
||||||
|
@ -3,10 +3,3 @@ slsDetectorPackage/7.0.1_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
|||||||
slsDetectorPackage/7.0.1_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
slsDetectorPackage/7.0.1_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
||||||
slsDetectorPackage/7.0.2_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
slsDetectorPackage/7.0.2_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
||||||
slsDetectorPackage/7.0.2_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
slsDetectorPackage/7.0.2_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
||||||
slsDetectorPackage/7.0.3_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
|
||||||
slsDetectorPackage/7.0.3_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
|
||||||
slsDetectorPackage/8.0.0_rh7 stable cmake/3.15.5 Qt/5.12.10
|
|
||||||
slsDetectorPackage/8.0.0_rh8 stable cmake/3.15.5 Qt/5.12.10
|
|
||||||
slsDetectorPackage/8.0.1_rh7 stable cmake/3.15.5 Qt/5.12.10
|
|
||||||
slsDetectorPackage/8.0.1_rh8 stable cmake/3.15.5 Qt/5.12.10
|
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ class Detector(CppDetectorApi):
|
|||||||
@element
|
@element
|
||||||
def hardwareversion(self):
|
def hardwareversion(self):
|
||||||
"""
|
"""
|
||||||
Hardware version of detector. \n
|
[Jungfrau][Moench][Gotthard2][Myhten3][Gotthard][Ctb] Hardware version of detector. \n
|
||||||
[Eiger] Hardware version of front FPGA on detector.
|
[Eiger] Hardware version of front FPGA on detector.
|
||||||
"""
|
"""
|
||||||
return self.getHardwareVersion()
|
return self.getHardwareVersion()
|
||||||
@ -308,7 +308,7 @@ class Detector(CppDetectorApi):
|
|||||||
-----
|
-----
|
||||||
[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, 12, 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][Moench][Gotthard][Ctb][Mythen3][Gotthard2][Xilinx Ctb] 16
|
[Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16
|
||||||
"""
|
"""
|
||||||
return self.getDynamicRange()
|
return self.getDynamicRange()
|
||||||
|
|
||||||
@ -400,7 +400,7 @@ class Detector(CppDetectorApi):
|
|||||||
@element
|
@element
|
||||||
def framesl(self):
|
def framesl(self):
|
||||||
"""
|
"""
|
||||||
[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB][Xilinx CTB] Number of frames left in acquisition.\n
|
[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames left in acquisition.\n
|
||||||
|
|
||||||
Note
|
Note
|
||||||
----
|
----
|
||||||
@ -414,7 +414,7 @@ class Detector(CppDetectorApi):
|
|||||||
@element
|
@element
|
||||||
def framecounter(self):
|
def framecounter(self):
|
||||||
"""
|
"""
|
||||||
[Jungfrau][Moench][Mythen3][Gotthard2][CTB][Xilinx Ctb] Number of frames from start run control.
|
[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of frames from start run control.
|
||||||
|
|
||||||
Note
|
Note
|
||||||
-----
|
-----
|
||||||
@ -443,13 +443,12 @@ class Detector(CppDetectorApi):
|
|||||||
@element
|
@element
|
||||||
def powerchip(self):
|
def powerchip(self):
|
||||||
"""
|
"""
|
||||||
[Jungfrau][Moench][Mythen3][Gotthard2][Xilinx Ctb] Power the chip.
|
[Jungfrau][Moench][Mythen3][Gotthard2] Power the chip.
|
||||||
|
|
||||||
Note
|
Note
|
||||||
----
|
----
|
||||||
[Jungfrau][Moench] Default is disabled. Get will return power status. Can be off if temperature event occured (temperature over temp_threshold with temp_control enabled. Will configure chip (only chip v1.1).\n
|
[Jungfrau][Moench] Default is disabled. Get will return power status. Can be off if temperature event occured (temperature over temp_threshold with temp_control enabled. Will configure chip (only chip v1.1).\n
|
||||||
[Mythen3][Gotthard2] Default is 1. If module not connected or wrong module, powerchip will fail.
|
[Mythen3][Gotthard2] Default is 1. If module not connected or wrong module, powerchip will fail.
|
||||||
[Xilinx Ctb] Default is 0. Also configures the chip if powered on.
|
|
||||||
"""
|
"""
|
||||||
return self.getPowerChip()
|
return self.getPowerChip()
|
||||||
|
|
||||||
@ -457,16 +456,6 @@ class Detector(CppDetectorApi):
|
|||||||
def powerchip(self, value):
|
def powerchip(self, value):
|
||||||
ut.set_using_dict(self.setPowerChip, value)
|
ut.set_using_dict(self.setPowerChip, value)
|
||||||
|
|
||||||
def configtransceiver(self):
|
|
||||||
"""
|
|
||||||
[Xilinx Ctb] Waits for transceiver to be aligned.
|
|
||||||
|
|
||||||
Note
|
|
||||||
----
|
|
||||||
Chip had to be configured (powered on) before this.
|
|
||||||
"""
|
|
||||||
self.configureTransceiver()
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def triggers(self):
|
def triggers(self):
|
||||||
@ -631,7 +620,7 @@ class Detector(CppDetectorApi):
|
|||||||
@element
|
@element
|
||||||
def periodl(self):
|
def periodl(self):
|
||||||
"""
|
"""
|
||||||
[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2][Xilinx Ctb] Period left for current frame.
|
[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Period left for current frame.
|
||||||
|
|
||||||
Note
|
Note
|
||||||
-----
|
-----
|
||||||
@ -653,7 +642,7 @@ class Detector(CppDetectorApi):
|
|||||||
@element
|
@element
|
||||||
def delay(self):
|
def delay(self):
|
||||||
"""
|
"""
|
||||||
[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2][Xilinx Ctb] Delay after trigger, accepts either a value in seconds, DurationWrapper or datetime.timedelta
|
[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Delay after trigger, accepts either a value in seconds, DurationWrapper or datetime.timedelta
|
||||||
|
|
||||||
:getter: always returns in seconds. To get in DurationWrapper, use getDelayAfterTrigger
|
:getter: always returns in seconds. To get in DurationWrapper, use getDelayAfterTrigger
|
||||||
|
|
||||||
@ -695,7 +684,7 @@ class Detector(CppDetectorApi):
|
|||||||
@element
|
@element
|
||||||
def delayl(self):
|
def delayl(self):
|
||||||
"""
|
"""
|
||||||
[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2][Xilinx Ctb] Delay left after trigger during acquisition, accepts either a value in seconds, datetime.timedelta or DurationWrapper
|
[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] Delay left after trigger during acquisition, accepts either a value in seconds, datetime.timedelta or DurationWrapper
|
||||||
|
|
||||||
Note
|
Note
|
||||||
-----
|
-----
|
||||||
@ -743,7 +732,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def nextframenumber(self):
|
def nextframenumber(self):
|
||||||
"""[Eiger][Jungfrau][Moench][CTB][Xilinx CTB] Next frame number. Stopping acquisition might result in different frame numbers for different modules. """
|
"""[Eiger][Jungfrau][Moench][CTB] Next frame number. Stopping acquisition might result in different frame numbers for different modules. """
|
||||||
return self.getNextFrameNumber()
|
return self.getNextFrameNumber()
|
||||||
|
|
||||||
@nextframenumber.setter
|
@nextframenumber.setter
|
||||||
@ -1962,7 +1951,7 @@ class Detector(CppDetectorApi):
|
|||||||
@element
|
@element
|
||||||
def triggersl(self):
|
def triggersl(self):
|
||||||
"""
|
"""
|
||||||
[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB][Xilinx CTB] Number of triggers left in acquisition.\n
|
[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Number of triggers left in acquisition.\n
|
||||||
|
|
||||||
Note
|
Note
|
||||||
----
|
----
|
||||||
@ -1975,7 +1964,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def frametime(self):
|
def frametime(self):
|
||||||
"""[Jungfrau][Moench][Mythen3][Gotthard2][CTB][Xilinx Ctb] Timestamp at a frame start.
|
"""[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Timestamp at a frame start.
|
||||||
|
|
||||||
Note
|
Note
|
||||||
----
|
----
|
||||||
@ -2191,7 +2180,7 @@ class Detector(CppDetectorApi):
|
|||||||
Note
|
Note
|
||||||
-----
|
-----
|
||||||
Default: AUTO_TIMING \n
|
Default: AUTO_TIMING \n
|
||||||
[Jungfrau][Moench][Gotthard][Ctb][Gotthard2][Xilinx Ctb] AUTO_TIMING, TRIGGER_EXPOSURE \n
|
[Jungfrau][Moench][Gotthard][Ctb][Gotthard2] AUTO_TIMING, TRIGGER_EXPOSURE \n
|
||||||
[Mythen3] AUTO_TIMING, TRIGGER_EXPOSURE, GATED, TRIGGER_GATED \n
|
[Mythen3] AUTO_TIMING, TRIGGER_EXPOSURE, GATED, TRIGGER_GATED \n
|
||||||
[Eiger] AUTO_TIMING, TRIGGER_EXPOSURE, GATED, BURST_TRIGGER
|
[Eiger] AUTO_TIMING, TRIGGER_EXPOSURE, GATED, BURST_TRIGGER
|
||||||
"""
|
"""
|
||||||
@ -2613,7 +2602,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def runtime(self):
|
def runtime(self):
|
||||||
"""[Jungfrau][Moench][Mythen3][Gotthard2][CTB][Xilinx Ctb] Time from detector start up.
|
"""[Jungfrau][Moench][Mythen3][Gotthard2][CTB] Time from detector start up.
|
||||||
|
|
||||||
Note
|
Note
|
||||||
-----
|
-----
|
||||||
@ -3248,7 +3237,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def transceiverenable(self):
|
def transceiverenable(self):
|
||||||
"""[CTB][Xilinx CTB] Transceiver Enable Mask. Enable for each 4 transceiver channel."""
|
"""[Ctb] Transceiver Enable Mask. Enable for each 4 transceiver channel."""
|
||||||
return self.getTransceiverEnableMask()
|
return self.getTransceiverEnableMask()
|
||||||
|
|
||||||
@transceiverenable.setter
|
@transceiverenable.setter
|
||||||
@ -3287,10 +3276,8 @@ class Detector(CppDetectorApi):
|
|||||||
|
|
||||||
Note
|
Note
|
||||||
------
|
------
|
||||||
[CTB] Options: ANALOG_ONLY, DIGITAL_ONLY, ANALOG_AND_DIGITAL, TRANSCEIVER_ONLY, DIGITAL_AND_TRANSCEIVER
|
Options: ANALOG_ONLY, DIGITAL_ONLY, ANALOG_AND_DIGITAL, TRANSCEIVER_ONLY, DIGITAL_AND_TRANSCEIVER
|
||||||
[CTB] Default: ANALOG_ONLY
|
Default: ANALOG_ONLY
|
||||||
[Xilinx CTB] Options: TRANSCEIVER_ONLY
|
|
||||||
[Xilinx CTB] Default: TRANSCEIVER_ONLY
|
|
||||||
|
|
||||||
Example
|
Example
|
||||||
--------
|
--------
|
||||||
@ -3327,7 +3314,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def tsamples(self):
|
def tsamples(self):
|
||||||
"""[CTB][Xilinx CTB] Number of transceiver samples expected. """
|
"""[CTB] Number of transceiver samples expected. """
|
||||||
return self.getNumberOfTransceiverSamples()
|
return self.getNumberOfTransceiverSamples()
|
||||||
|
|
||||||
@tsamples.setter
|
@tsamples.setter
|
||||||
@ -3490,7 +3477,7 @@ class Detector(CppDetectorApi):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def pattern(self):
|
def pattern(self):
|
||||||
"""[Mythen3][Ctb][Xilinx Ctb] Loads ASCII pattern file directly to server (instead of executing line by line).
|
"""[Mythen3][Ctb] Loads ASCII pattern file directly to server (instead of executing line by line).
|
||||||
|
|
||||||
:getter: Not Implemented
|
:getter: Not Implemented
|
||||||
|
|
||||||
@ -3508,7 +3495,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
def patfname(self):
|
def patfname(self):
|
||||||
"""
|
"""
|
||||||
[Ctb][Mythen3][Xilinx Ctb] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default
|
[Ctb][Mythen3] Gets the pattern file name including path of the last pattern uploaded. Returns an empty if nothing was uploaded or via a server default
|
||||||
file
|
file
|
||||||
"""
|
"""
|
||||||
return self.getPatterFileName()
|
return self.getPatterFileName()
|
||||||
@ -3533,7 +3520,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patlimits(self):
|
def patlimits(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of complete pattern.
|
"""[Ctb][Mythen3] Limits (start and stop address) of complete pattern.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
---------
|
---------
|
||||||
@ -3553,7 +3540,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patsetbit(self):
|
def patsetbit(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Sets the mask applied to every pattern to the selected bits.
|
"""[Ctb][Mythen3] Sets the mask applied to every pattern to the selected bits.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
--------
|
--------
|
||||||
@ -3570,7 +3557,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patmask(self):
|
def patmask(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern.
|
"""[Ctb][Mythen3] Selects the bits that will have a pattern mask applied to the selected patmask for every pattern.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
--------
|
--------
|
||||||
@ -3588,7 +3575,7 @@ class Detector(CppDetectorApi):
|
|||||||
# @element
|
# @element
|
||||||
def patwait(self):
|
def patwait(self):
|
||||||
"""
|
"""
|
||||||
[Ctb][Mythen3][Xilinx Ctb] Wait address of loop level provided.
|
[Ctb][Mythen3] Wait address of loop level provided.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
@ -3605,7 +3592,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patwait0(self):
|
def patwait0(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Wait 0 address.
|
"""[Ctb][Mythen3] Wait 0 address.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
--------
|
--------
|
||||||
@ -3625,7 +3612,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patwait1(self):
|
def patwait1(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Wait 1 address.
|
"""[Ctb][Mythen3] Wait 1 address.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
--------
|
--------
|
||||||
@ -3645,7 +3632,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patwait2(self):
|
def patwait2(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Wait 2 address.
|
"""[Ctb][Mythen3] Wait 2 address.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
--------
|
--------
|
||||||
@ -3665,7 +3652,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
def patwaittime(self):
|
def patwaittime(self):
|
||||||
"""
|
"""
|
||||||
[Ctb][Mythen3][Xilinx Ctb] Wait time in clock cycles of loop level provided.
|
[Ctb][Mythen3] Wait time in clock cycles of loop level provided.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
@ -3682,7 +3669,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patwaittime0(self):
|
def patwaittime0(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Wait 0 time in clock cycles."""
|
"""[Ctb][Mythen3] Wait 0 time in clock cycles."""
|
||||||
return self.getPatternWaitTime(0)
|
return self.getPatternWaitTime(0)
|
||||||
|
|
||||||
@patwaittime0.setter
|
@patwaittime0.setter
|
||||||
@ -3693,7 +3680,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patwaittime1(self):
|
def patwaittime1(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Wait 1 time in clock cycles."""
|
"""[Ctb][Mythen3] Wait 1 time in clock cycles."""
|
||||||
return self.getPatternWaitTime(1)
|
return self.getPatternWaitTime(1)
|
||||||
|
|
||||||
@patwaittime1.setter
|
@patwaittime1.setter
|
||||||
@ -3704,7 +3691,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patwaittime2(self):
|
def patwaittime2(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Wait 2 time in clock cycles."""
|
"""[Ctb][Mythen3] Wait 2 time in clock cycles."""
|
||||||
return self.getPatternWaitTime(2)
|
return self.getPatternWaitTime(2)
|
||||||
|
|
||||||
@patwaittime2.setter
|
@patwaittime2.setter
|
||||||
@ -3716,7 +3703,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
def patloop(self):
|
def patloop(self):
|
||||||
"""
|
"""
|
||||||
[Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of the loop provided.
|
[Ctb][Mythen3] Limits (start and stop address) of the loop provided.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
@ -3733,7 +3720,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patloop0(self):
|
def patloop0(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of loop 0.
|
"""[Ctb][Mythen3] Limits (start and stop address) of loop 0.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
---------
|
---------
|
||||||
@ -3753,7 +3740,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patloop1(self):
|
def patloop1(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of loop 1.
|
"""[Ctb][Mythen3] Limits (start and stop address) of loop 1.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
---------
|
---------
|
||||||
@ -3774,7 +3761,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patloop2(self):
|
def patloop2(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Limits (start and stop address) of loop 2.
|
"""[Ctb][Mythen3] Limits (start and stop address) of loop 2.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
---------
|
---------
|
||||||
@ -3796,7 +3783,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
def patnloop(self):
|
def patnloop(self):
|
||||||
"""
|
"""
|
||||||
[Ctb][Mythen3][Xilinx Ctb] Number of cycles of the loop provided.
|
[Ctb][Mythen3] Number of cycles of the loop provided.
|
||||||
|
|
||||||
Example
|
Example
|
||||||
-------
|
-------
|
||||||
@ -3813,7 +3800,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patnloop0(self):
|
def patnloop0(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Number of cycles of loop 0."""
|
"""[Ctb][Mythen3] Number of cycles of loop 0."""
|
||||||
return self.getPatternLoopCycles(0)
|
return self.getPatternLoopCycles(0)
|
||||||
|
|
||||||
@patnloop0.setter
|
@patnloop0.setter
|
||||||
@ -3824,7 +3811,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patnloop1(self):
|
def patnloop1(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Number of cycles of loop 1."""
|
"""[Ctb][Mythen3] Number of cycles of loop 1."""
|
||||||
return self.getPatternLoopCycles(1)
|
return self.getPatternLoopCycles(1)
|
||||||
|
|
||||||
@patnloop1.setter
|
@patnloop1.setter
|
||||||
@ -3835,7 +3822,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def patnloop2(self):
|
def patnloop2(self):
|
||||||
"""[Ctb][Mythen3][Xilinx Ctb] Number of cycles of loop 2."""
|
"""[Ctb][Mythen3] Number of cycles of loop 2."""
|
||||||
return self.getPatternLoopCycles(2)
|
return self.getPatternLoopCycles(2)
|
||||||
|
|
||||||
@patnloop2.setter
|
@patnloop2.setter
|
||||||
@ -3846,7 +3833,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def v_a(self):
|
def v_a(self):
|
||||||
"""[Ctb][Xilinx Ctb] Power supply a in mV."""
|
"""[Ctb] Power supply a in mV."""
|
||||||
return self.getPower(dacIndex.V_POWER_A)
|
return self.getPower(dacIndex.V_POWER_A)
|
||||||
|
|
||||||
@v_a.setter
|
@v_a.setter
|
||||||
@ -3857,7 +3844,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def v_b(self):
|
def v_b(self):
|
||||||
"""[Ctb][Xilinx Ctb] Power supply b in mV."""
|
"""[Ctb] Power supply b in mV."""
|
||||||
return self.getPower(dacIndex.V_POWER_B)
|
return self.getPower(dacIndex.V_POWER_B)
|
||||||
|
|
||||||
@v_b.setter
|
@v_b.setter
|
||||||
@ -3868,7 +3855,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def v_c(self):
|
def v_c(self):
|
||||||
"""[Ctb][Xilinx Ctb] Power supply c in mV."""
|
"""[Ctb] Power supply c in mV."""
|
||||||
return self.getPower(dacIndex.V_POWER_C)
|
return self.getPower(dacIndex.V_POWER_C)
|
||||||
|
|
||||||
@v_c.setter
|
@v_c.setter
|
||||||
@ -3879,7 +3866,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def v_d(self):
|
def v_d(self):
|
||||||
"""[Ctb][Xilinx Ctb] Power supply d in mV."""
|
"""[Ctb] Power supply d in mV."""
|
||||||
return self.getPower(dacIndex.V_POWER_D)
|
return self.getPower(dacIndex.V_POWER_D)
|
||||||
|
|
||||||
@v_d.setter
|
@v_d.setter
|
||||||
@ -3890,7 +3877,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def v_io(self):
|
def v_io(self):
|
||||||
"""[Ctb][Xilinx Ctb] Power supply io in mV. Minimum 1200 mV.
|
"""[Ctb] Power supply io in mV. Minimum 1200 mV.
|
||||||
|
|
||||||
Note
|
Note
|
||||||
----
|
----
|
||||||
@ -3906,7 +3893,7 @@ class Detector(CppDetectorApi):
|
|||||||
@property
|
@property
|
||||||
@element
|
@element
|
||||||
def v_limit(self):
|
def v_limit(self):
|
||||||
"""[Ctb][Xilinx Ctb] Soft limit for power supplies (ctb only) and DACS in mV."""
|
"""[Ctb] Soft limit for power supplies (ctb only) and DACS in mV."""
|
||||||
return self.getPower(dacIndex.V_LIMIT)
|
return self.getPower(dacIndex.V_LIMIT)
|
||||||
|
|
||||||
@v_limit.setter
|
@v_limit.setter
|
||||||
|
@ -1778,10 +1778,6 @@ void init_det(py::module &m) {
|
|||||||
(std::string(Detector::*)(const defs::dacIndex) const) &
|
(std::string(Detector::*)(const defs::dacIndex) const) &
|
||||||
Detector::getSlowADCName,
|
Detector::getSlowADCName,
|
||||||
py::arg());
|
py::arg());
|
||||||
CppDetectorApi.def("configureTransceiver",
|
|
||||||
(void (Detector::*)(sls::Positions)) &
|
|
||||||
Detector::configureTransceiver,
|
|
||||||
py::arg() = Positions{});
|
|
||||||
CppDetectorApi.def(
|
CppDetectorApi.def(
|
||||||
"getPatterFileName",
|
"getPatterFileName",
|
||||||
(Result<std::string>(Detector::*)(sls::Positions) const) &
|
(Result<std::string>(Detector::*)(sls::Positions) const) &
|
||||||
|
@ -25,8 +25,6 @@ void init_enums(py::module &m) {
|
|||||||
.value("MOENCH", slsDetectorDefs::detectorType::MOENCH)
|
.value("MOENCH", slsDetectorDefs::detectorType::MOENCH)
|
||||||
.value("MYTHEN3", slsDetectorDefs::detectorType::MYTHEN3)
|
.value("MYTHEN3", slsDetectorDefs::detectorType::MYTHEN3)
|
||||||
.value("GOTTHARD2", slsDetectorDefs::detectorType::GOTTHARD2)
|
.value("GOTTHARD2", slsDetectorDefs::detectorType::GOTTHARD2)
|
||||||
.value("XILINX_CHIPTESTBOARD",
|
|
||||||
slsDetectorDefs::detectorType::XILINX_CHIPTESTBOARD)
|
|
||||||
.export_values();
|
.export_values();
|
||||||
|
|
||||||
py::enum_<slsDetectorDefs::runStatus>(Defs, "runStatus")
|
py::enum_<slsDetectorDefs::runStatus>(Defs, "runStatus")
|
||||||
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer
|
|
1
serverBin/ctbDetectorServerv8.0.0
Symbolic link
1
serverBin/ctbDetectorServerv8.0.0
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv8.0.0
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer
|
|
1
serverBin/eigerDetectorServerv8.0.0
Symbolic link
1
serverBin/eigerDetectorServerv8.0.0
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServerv8.0.0
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer
|
|
1
serverBin/gotthard2DetectorServerv8.0.0
Symbolic link
1
serverBin/gotthard2DetectorServerv8.0.0
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServerv8.0.0
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer
|
|
1
serverBin/gotthardDetectorServerv8.0.0
Symbolic link
1
serverBin/gotthardDetectorServerv8.0.0
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServerv8.0.0
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer
|
|
1
serverBin/jungfrauDetectorServerv8.0.0
Symbolic link
1
serverBin/jungfrauDetectorServerv8.0.0
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv8.0.0
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer
|
|
1
serverBin/moenchDetectorServerv8.0.2
Symbolic link
1
serverBin/moenchDetectorServerv8.0.2
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv8.0.2
|
@ -1 +0,0 @@
|
|||||||
../slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer
|
|
1
serverBin/mythen3DetectorServerv8.0.2
Symbolic link
1
serverBin/mythen3DetectorServerv8.0.2
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServerv8.0.2
|
@ -174,7 +174,6 @@ int main(int argc, char *argv[]) {
|
|||||||
int nped = 1000;
|
int nped = 1000;
|
||||||
|
|
||||||
int cf = 0;
|
int cf = 0;
|
||||||
|
|
||||||
int numberOfPackets=nrows/8;
|
int numberOfPackets=nrows/8;
|
||||||
|
|
||||||
#ifdef RECT
|
#ifdef RECT
|
||||||
@ -300,7 +299,6 @@ int main(int argc, char *argv[]) {
|
|||||||
double *ped=new double[nx * ny];//, *ped1;
|
double *ped=new double[nx * ny];//, *ped1;
|
||||||
int pos,pos1;
|
int pos,pos1;
|
||||||
//return 0;
|
//return 0;
|
||||||
|
|
||||||
if (pedfile.find(".raw") != std::string::npos) {
|
if (pedfile.find(".raw") != std::string::npos) {
|
||||||
pos1=pedfile.rfind("/");
|
pos1=pedfile.rfind("/");
|
||||||
strcpy(froot,pedfile.substr(pos1).c_str());
|
strcpy(froot,pedfile.substr(pos1).c_str());
|
||||||
@ -311,7 +309,6 @@ int main(int argc, char *argv[]) {
|
|||||||
cout << "PEDESTAL " << endl;
|
cout << "PEDESTAL " << endl;
|
||||||
if (pedfile.find(".tif") == std::string::npos) {
|
if (pedfile.find(".tif") == std::string::npos) {
|
||||||
sprintf(fname, "%s", pedfile.c_str());
|
sprintf(fname, "%s", pedfile.c_str());
|
||||||
|
|
||||||
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;
|
||||||
@ -323,14 +320,12 @@ int main(int argc, char *argv[]) {
|
|||||||
if (filebin.is_open()) {
|
if (filebin.is_open()) {
|
||||||
ff = -1;
|
ff = -1;
|
||||||
while (decoder->readNextFrame(filebin, ff, np, buff)) {
|
while (decoder->readNextFrame(filebin, ff, np, buff)) {
|
||||||
|
|
||||||
if (np == numberOfPackets) {
|
if (np == numberOfPackets) {
|
||||||
mt->pushData(buff);
|
mt->pushData(buff);
|
||||||
mt->nextThread();
|
mt->nextThread();
|
||||||
mt->popFree(buff);
|
mt->popFree(buff);
|
||||||
ifr++;
|
ifr++;
|
||||||
if (ifr % 100 == 0)
|
if (ifr % 100 == 0)
|
||||||
|
|
||||||
cout << ifr << " " << ff << " " << np << endl;
|
cout << ifr << " " << ff << " " << np << endl;
|
||||||
// break;
|
// break;
|
||||||
} else {
|
} else {
|
||||||
@ -341,7 +336,6 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
filebin.close();
|
filebin.close();
|
||||||
while (mt->isBusy()) {
|
while (mt->isBusy()) {
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -442,7 +436,6 @@ int main(int argc, char *argv[]) {
|
|||||||
ff = -1;
|
ff = -1;
|
||||||
ifr = 0;
|
ifr = 0;
|
||||||
while (decoder->readNextFrame(filebin, ff, np, buff)) {
|
while (decoder->readNextFrame(filebin, ff, np, buff)) {
|
||||||
|
|
||||||
if (np == numberOfPackets) {
|
if (np == numberOfPackets) {
|
||||||
// //push
|
// //push
|
||||||
mt->pushData(buff);
|
mt->pushData(buff);
|
||||||
@ -470,7 +463,6 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
cout << "bp " << ifr << " " << ff << " " << np << endl;
|
cout << "bp " << ifr << " " << ff << " " << np << endl;
|
||||||
|
|
||||||
//break;
|
//break;
|
||||||
}
|
}
|
||||||
ff = -1;
|
ff = -1;
|
||||||
|
@ -11,7 +11,6 @@ install(TARGETS slsProjectCSettings
|
|||||||
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
)
|
)
|
||||||
add_subdirectory(ctbDetectorServer)
|
add_subdirectory(ctbDetectorServer)
|
||||||
add_subdirectory(xilinx_ctbDetectorServer)
|
|
||||||
add_subdirectory(eigerDetectorServer)
|
add_subdirectory(eigerDetectorServer)
|
||||||
add_subdirectory(gotthardDetectorServer)
|
add_subdirectory(gotthardDetectorServer)
|
||||||
add_subdirectory(jungfrauDetectorServer)
|
add_subdirectory(jungfrauDetectorServer)
|
||||||
|
@ -8,8 +8,7 @@ det_list=("ctbDetectorServer
|
|||||||
gotthard2DetectorServer
|
gotthard2DetectorServer
|
||||||
jungfrauDetectorServer
|
jungfrauDetectorServer
|
||||||
mythen3DetectorServer
|
mythen3DetectorServer
|
||||||
moenchDetectorServer
|
moenchDetectorServer"
|
||||||
xilinx_ctbDetectorServer"
|
|
||||||
)
|
)
|
||||||
usage="\nUsage: compileAllServers.sh [server|all(opt)] [branch(opt)]. \n\tNo arguments mean all servers with 'developer' branch. \n\tNo 'branch' input means 'developer branch'"
|
usage="\nUsage: compileAllServers.sh [server|all(opt)] [branch(opt)]. \n\tNo arguments mean all servers with 'developer' branch. \n\tNo 'branch' input means 'developer branch'"
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@ det_list=("ctbDetectorServer"
|
|||||||
"jungfrauDetectorServer"
|
"jungfrauDetectorServer"
|
||||||
"mythen3DetectorServer"
|
"mythen3DetectorServer"
|
||||||
"moenchDetectorServer"
|
"moenchDetectorServer"
|
||||||
"xilinx_ctbDetectorServer"
|
|
||||||
)
|
)
|
||||||
usage="\nUsage: compileAllServers.sh [server|all(opt)] [branch(opt)]. \n\tNo arguments mean all servers with 'developer' branch. \n\tNo 'branch' input means 'developer branch'"
|
usage="\nUsage: compileAllServers.sh [server|all(opt)] [branch(opt)]. \n\tNo arguments mean all servers with 'developer' branch. \n\tNo 'branch' input means 'developer branch'"
|
||||||
|
|
||||||
|
@ -37,7 +37,8 @@ target_compile_definitions(ctbDetectorServer_virtual
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(ctbDetectorServer_virtual
|
target_link_libraries(ctbDetectorServer_virtual
|
||||||
PUBLIC pthread rt m slsProjectCSettings
|
PUBLIC pthread rt slsProjectCSettings
|
||||||
|
m
|
||||||
)
|
)
|
||||||
|
|
||||||
set_target_properties(ctbDetectorServer_virtual PROPERTIES
|
set_target_properties(ctbDetectorServer_virtual PROPERTIES
|
||||||
|
Binary file not shown.
BIN
slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv8.0.0
Executable file
BIN
slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServerv8.0.0
Executable file
Binary file not shown.
@ -55,9 +55,7 @@
|
|||||||
#define DEFAULT_SYNC_CLK (40) // 20
|
#define DEFAULT_SYNC_CLK (40) // 20
|
||||||
#define DEFAULT_DBIT_CLK (200)
|
#define DEFAULT_DBIT_CLK (200)
|
||||||
#define DEFAULT_TRANSCEIVER_MASK (0x3)
|
#define DEFAULT_TRANSCEIVER_MASK (0x3)
|
||||||
|
|
||||||
#define MAX_TRANSCEIVER_MASK (0xF)
|
#define MAX_TRANSCEIVER_MASK (0xF)
|
||||||
#define MAX_TRANSCEIVER_SAMPLES (0xFFFF)
|
|
||||||
|
|
||||||
#define UDP_HEADER_MAX_FRAME_VALUE (0xFFFFFFFFFFFF)
|
#define UDP_HEADER_MAX_FRAME_VALUE (0xFFFFFFFFFFFF)
|
||||||
|
|
||||||
|
Binary file not shown.
Binary file not shown.
BIN
slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServerv8.0.0
Executable file
BIN
slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServerv8.0.0
Executable file
Binary file not shown.
@ -471,8 +471,7 @@ void setupDetector() {
|
|||||||
// hv
|
// hv
|
||||||
DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME);
|
DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME);
|
||||||
// dacs
|
// dacs
|
||||||
LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC, 1,
|
LTC2620_D_SetDefines(DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC);
|
||||||
0, "");
|
|
||||||
// on chip dacs
|
// on chip dacs
|
||||||
ASIC_Driver_SetDefines(ONCHIP_DAC_DRIVER_FILE_NAME);
|
ASIC_Driver_SetDefines(ONCHIP_DAC_DRIVER_FILE_NAME);
|
||||||
setTimingSource(DEFAULT_TIMING_SOURCE);
|
setTimingSource(DEFAULT_TIMING_SOURCE);
|
||||||
|
@ -35,7 +35,6 @@
|
|||||||
#define TEMPERATURE_FILE_NAME ("/sys/class/hwmon/hwmon0/temp1_input")
|
#define TEMPERATURE_FILE_NAME ("/sys/class/hwmon/hwmon0/temp1_input")
|
||||||
#endif
|
#endif
|
||||||
#define CONFIG_FILE ("config_gotthard2.txt")
|
#define CONFIG_FILE ("config_gotthard2.txt")
|
||||||
#define DAC_MIN_MV (0)
|
|
||||||
#define DAC_MAX_MV (2048)
|
#define DAC_MAX_MV (2048)
|
||||||
#define ONCHIP_DAC_MAX_VAL (0x3FF)
|
#define ONCHIP_DAC_MAX_VAL (0x3FF)
|
||||||
#define ADU_MAX_VAL (0xFFF)
|
#define ADU_MAX_VAL (0xFFF)
|
||||||
|
Binary file not shown.
BIN
slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServerv8.0.0
Executable file
BIN
slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServerv8.0.0
Executable file
Binary file not shown.
@ -90,7 +90,6 @@ void basictests() {
|
|||||||
"Could not map to memory. Cannot proceed. Check Firmware.\n");
|
"Could not map to memory. Cannot proceed. Check Firmware.\n");
|
||||||
LOG(logERROR, (initErrorMessage));
|
LOG(logERROR, (initErrorMessage));
|
||||||
initError = FAIL;
|
initError = FAIL;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
// 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
|
||||||
|
Binary file not shown.
BIN
slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv8.0.0
Executable file
BIN
slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv8.0.0
Executable file
Binary file not shown.
@ -88,7 +88,6 @@ void basictests() {
|
|||||||
"Could not map to memory. Cannot proceed. Check Firmware.\n");
|
"Could not map to memory. Cannot proceed. Check Firmware.\n");
|
||||||
LOG(logERROR, (initErrorMessage));
|
LOG(logERROR, (initErrorMessage));
|
||||||
initError = FAIL;
|
initError = FAIL;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
// 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
|
||||||
|
Binary file not shown.
BIN
slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv8.0.2
Executable file
BIN
slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServerv8.0.2
Executable file
Binary file not shown.
@ -82,7 +82,6 @@ void basictests() {
|
|||||||
"Could not map to memory. Cannot proceed. Check Firmware.\n");
|
"Could not map to memory. Cannot proceed. Check Firmware.\n");
|
||||||
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
LOG(logERROR, ("%s\n\n", initErrorMessage));
|
||||||
initError = FAIL;
|
initError = FAIL;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
// 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
|
||||||
|
@ -70,7 +70,7 @@
|
|||||||
|
|
||||||
#define ADC_PHASE_DEG_QUARTER_SPEED (0)
|
#define ADC_PHASE_DEG_QUARTER_SPEED (0)
|
||||||
#define ADC_PHASE_DEG_HALF_SPEED (0)
|
#define ADC_PHASE_DEG_HALF_SPEED (0)
|
||||||
#define ADC_PHASE_DEG_FULL_SPEED (300)
|
#define ADC_PHASE_DEG_FULL_SPEED (150)
|
||||||
|
|
||||||
#define ADC_OFST_QUARTER_SPEED (0x12)
|
#define ADC_OFST_QUARTER_SPEED (0x12)
|
||||||
#define ADC_OFST_HALF_SPEED (0x12)
|
#define ADC_OFST_HALF_SPEED (0x12)
|
||||||
@ -133,7 +133,7 @@ enum DACINDEX {
|
|||||||
680, /* MO_VB_SDA */ \
|
680, /* MO_VB_SDA */ \
|
||||||
1428, /* MO_VCASC_SFP */ \
|
1428, /* MO_VCASC_SFP */ \
|
||||||
1200, /* MO_VOUT_CM */ \
|
1200, /* MO_VOUT_CM */ \
|
||||||
800, /* MO_VIPRE_CDS */ \
|
1280, /* MO_VIPRE_CDS */ \
|
||||||
900 /* MO_IBIAS_SFP */ \
|
900 /* MO_IBIAS_SFP */ \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Binary file not shown.
BIN
slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServerv8.0.2
Executable file
BIN
slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServerv8.0.2
Executable file
Binary file not shown.
@ -92,7 +92,6 @@ void basictests() {
|
|||||||
"Could not map to memory. Cannot proceed. Check Firmware.\n");
|
"Could not map to memory. Cannot proceed. Check Firmware.\n");
|
||||||
LOG(logERROR, (initErrorMessage));
|
LOG(logERROR, (initErrorMessage));
|
||||||
initError = FAIL;
|
initError = FAIL;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
// 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
|
||||||
@ -480,11 +479,15 @@ void setupDetector() {
|
|||||||
READOUT_PLL_VCO_FREQ_HZ, SYSTEM_PLL_VCO_FREQ_HZ);
|
READOUT_PLL_VCO_FREQ_HZ, SYSTEM_PLL_VCO_FREQ_HZ);
|
||||||
ALTERA_PLL_C10_ResetPLL(READOUT_PLL);
|
ALTERA_PLL_C10_ResetPLL(READOUT_PLL);
|
||||||
ALTERA_PLL_C10_ResetPLL(SYSTEM_PLL);
|
ALTERA_PLL_C10_ResetPLL(SYSTEM_PLL);
|
||||||
|
// change startup clock divider in software
|
||||||
|
// because firmware only sets max clock divider
|
||||||
|
setClockDividerWithTimeUpdateOption(READOUT_C0, DEFAULT_READOUT_C0_STARTUP,
|
||||||
|
0);
|
||||||
|
|
||||||
// hv
|
// hv
|
||||||
DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME);
|
DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME);
|
||||||
// dac
|
// dac
|
||||||
LTC2620_D_SetDefines(DAC_MIN_MV, DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC, 1,
|
LTC2620_D_SetDefines(DAC_MAX_MV, DAC_DRIVER_FILE_NAME, NDAC);
|
||||||
0, "");
|
|
||||||
|
|
||||||
resetCore();
|
resetCore();
|
||||||
resetPeripheral();
|
resetPeripheral();
|
||||||
@ -2333,6 +2336,7 @@ int setClockDividerWithTimeUpdateOption(enum CLKINDEX ind, int val,
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (val < 2 || val > getMaxClockDivider()) {
|
if (val < 2 || val > getMaxClockDivider()) {
|
||||||
|
LOG(logERROR, ("Invalid clock divider %d\n", val));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
char *clock_names[] = {CLK_NAMES};
|
char *clock_names[] = {CLK_NAMES};
|
||||||
|
@ -34,7 +34,6 @@
|
|||||||
#else
|
#else
|
||||||
#define TEMPERATURE_FILE_NAME ("/sys/class/hwmon/hwmon0/temp1_input")
|
#define TEMPERATURE_FILE_NAME ("/sys/class/hwmon/hwmon0/temp1_input")
|
||||||
#endif
|
#endif
|
||||||
#define DAC_MIN_MV (0)
|
|
||||||
#define DAC_MAX_MV (2048)
|
#define DAC_MAX_MV (2048)
|
||||||
#define TYPE_MYTHEN3_MODULE_VAL (93)
|
#define TYPE_MYTHEN3_MODULE_VAL (93)
|
||||||
#define TYPE_TOLERANCE (5)
|
#define TYPE_TOLERANCE (5)
|
||||||
@ -65,6 +64,8 @@
|
|||||||
#define DEFAULT_SYSTEM_C2 (5) //(200000000) // smp_clk, 200 MHz const
|
#define DEFAULT_SYSTEM_C2 (5) //(200000000) // smp_clk, 200 MHz const
|
||||||
#define DEFAULT_TRIMMING_RUN_CLKDIV (40) // (25000000) // 25 MHz
|
#define DEFAULT_TRIMMING_RUN_CLKDIV (40) // (25000000) // 25 MHz
|
||||||
|
|
||||||
|
#define DEFAULT_READOUT_C0_STARTUP (20) //(50000000) // rdo_clk, 50 MHz
|
||||||
|
|
||||||
#define DEFAULT_ASIC_LATCHING_NUM_PULSES (10)
|
#define DEFAULT_ASIC_LATCHING_NUM_PULSES (10)
|
||||||
#define DEFAULT_MSTR_OTPT_P1_NUM_PULSES (20)
|
#define DEFAULT_MSTR_OTPT_P1_NUM_PULSES (20)
|
||||||
#define DEFAULT_ADIF_PIPELINE_VAL (8)
|
#define DEFAULT_ADIF_PIPELINE_VAL (8)
|
||||||
|
@ -4,11 +4,18 @@
|
|||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
|
/**
|
||||||
int numdacs, int numdevices, int startingDeviceIndex,
|
* Set Defines
|
||||||
char *powerdownDriverfname);
|
* @param hardMaxV maximum hardware limit
|
||||||
|
* @param driverfname driver file name
|
||||||
|
* @param numdacs number of dacs
|
||||||
|
*/
|
||||||
|
void LTC2620_D_SetDefines(int hardMaxV, char *driverfname, int numdacs);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get max number of steps
|
||||||
|
*/
|
||||||
int LTC2620_D_GetMaxNumSteps();
|
int LTC2620_D_GetMaxNumSteps();
|
||||||
int LTC2620_D_GetPowerDownValue();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert voltage to dac units
|
* Convert voltage to dac units
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
void bus_w(u_int32_t offset, u_int32_t data);
|
|
||||||
u_int32_t bus_r(u_int32_t offset);
|
|
||||||
uint64_t getU64BitReg(int aLSB, int aMSB);
|
|
||||||
void setU64BitReg(uint64_t value, int aLSB, int aMSB);
|
|
||||||
u_int32_t readRegister(u_int32_t offset);
|
|
||||||
u_int32_t writeRegister(u_int32_t offset, u_int32_t data);
|
|
||||||
int mapCSP0(void);
|
|
||||||
u_int32_t *Arm_getUDPBaseAddress();
|
|
@ -6,12 +6,10 @@
|
|||||||
#include "clogger.h"
|
#include "clogger.h"
|
||||||
|
|
||||||
void initializePatternAddresses();
|
void initializePatternAddresses();
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
void initializePatternWord();
|
void initializePatternWord();
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
uint64_t validate_readPatternIOControl();
|
uint64_t validate_readPatternIOControl();
|
||||||
int validate_writePatternIOControl(char *message, uint64_t arg);
|
int validate_writePatternIOControl(char *message, uint64_t arg);
|
||||||
void writePatternIOControl(uint64_t word);
|
void writePatternIOControl(uint64_t word);
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
int resetFPGA(char *mess);
|
|
||||||
int loadDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex);
|
|
||||||
|
|
||||||
int checksBeforeCreatingDeviceTree(char *mess);
|
|
||||||
int createDeviceTree(char *mess);
|
|
||||||
int verifyDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex);
|
|
@ -25,11 +25,6 @@
|
|||||||
#include "blackfin.h"
|
#include "blackfin.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ARMPROCESSOR
|
|
||||||
#include "arm64.h"
|
|
||||||
#include "programViaArm.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MYTHEN3D
|
#ifdef MYTHEN3D
|
||||||
#include "mythen3.h"
|
#include "mythen3.h"
|
||||||
#endif
|
#endif
|
||||||
@ -66,15 +61,12 @@ typedef struct udpStruct_s {
|
|||||||
int isInitCheckDone();
|
int isInitCheckDone();
|
||||||
int getInitResult(char **mess);
|
int getInitResult(char **mess);
|
||||||
void basictests();
|
void basictests();
|
||||||
#if !defined(EIGERD)
|
#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \
|
||||||
|
defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||||
int checkType();
|
int checkType();
|
||||||
int testFpga();
|
int testFpga();
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
|
||||||
int testFixedFPGAPattern();
|
|
||||||
#else
|
|
||||||
int testBus();
|
int testBus();
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(GOTTHARDD) || \
|
#if defined(GOTTHARDD) || \
|
||||||
((defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)) && \
|
((defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)) && \
|
||||||
@ -94,10 +86,8 @@ void getHardwareVersion(char *version);
|
|||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
int getHardwareVersionNumber();
|
int getHardwareVersionNumber();
|
||||||
#else
|
#else
|
||||||
#ifndef XILINX_CHIPTESTBOARDD
|
|
||||||
u_int16_t getHardwareVersionNumber();
|
u_int16_t getHardwareVersionNumber();
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD)
|
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD)
|
||||||
u_int16_t getHardwareSerialNumber();
|
u_int16_t getHardwareSerialNumber();
|
||||||
#endif
|
#endif
|
||||||
@ -121,6 +111,7 @@ int updateModuleId();
|
|||||||
void setModuleId(int modid);
|
void setModuleId(int modid);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
u_int64_t getDetectorMAC();
|
u_int64_t getDetectorMAC();
|
||||||
u_int32_t getDetectorIP();
|
u_int32_t getDetectorIP();
|
||||||
|
|
||||||
@ -145,7 +136,7 @@ int updateDatabytesandAllocateRAM();
|
|||||||
void updateDataBytes();
|
void updateDataBytes();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#ifndef CHIPTESTBOARDD
|
||||||
int resetToDefaultDacs(int hardReset);
|
int resetToDefaultDacs(int hardReset);
|
||||||
int getDefaultDac(enum DACINDEX index, enum detectorSettings sett, int *retval);
|
int getDefaultDac(enum DACINDEX index, enum detectorSettings sett, int *retval);
|
||||||
int setDefaultDac(enum DACINDEX index, enum detectorSettings sett, int value);
|
int setDefaultDac(enum DACINDEX index, enum detectorSettings sett, int value);
|
||||||
@ -181,22 +172,6 @@ uint32_t readRegister16And32(uint32_t offset);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// firmware functions (resets)
|
// firmware functions (resets)
|
||||||
#if defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
void cleanFifos();
|
|
||||||
void resetFlow();
|
|
||||||
int waitTranseiverReset(char *mess);
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
void setTransceiverAlignment(int align);
|
|
||||||
#endif
|
|
||||||
int isTransceiverAligned();
|
|
||||||
int waitTransceiverAligned(char *mess);
|
|
||||||
int configureTransceiver(char *mess);
|
|
||||||
int isChipConfigured();
|
|
||||||
int powerChip(int on, char *mess);
|
|
||||||
int getPowerChip();
|
|
||||||
int configureChip(char *mess);
|
|
||||||
void startPeriphery();
|
|
||||||
#endif
|
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \
|
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \
|
||||||
defined(MYTHEN3D) || defined(GOTTHARD2D)
|
defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||||
void cleanFifos();
|
void cleanFifos();
|
||||||
@ -236,12 +211,6 @@ uint32_t getTransceiverEnableMask();
|
|||||||
void setADCInvertRegister(uint32_t val);
|
void setADCInvertRegister(uint32_t val);
|
||||||
uint32_t getADCInvertRegister();
|
uint32_t getADCInvertRegister();
|
||||||
#endif
|
#endif
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
|
||||||
void setADCEnableMask_10G(uint32_t mask);
|
|
||||||
uint32_t getADCEnableMask_10G();
|
|
||||||
int setTransceiverEnableMask(uint32_t mask);
|
|
||||||
uint32_t getTransceiverEnableMask();
|
|
||||||
#endif
|
|
||||||
#if defined(CHIPTESTBOARDD)
|
#if defined(CHIPTESTBOARDD)
|
||||||
int setExternalSamplingSource(int val);
|
int setExternalSamplingSource(int val);
|
||||||
int setExternalSampling(int val);
|
int setExternalSampling(int val);
|
||||||
@ -257,7 +226,7 @@ int getParallelMode();
|
|||||||
int setOverFlowMode(int mode);
|
int setOverFlowMode(int mode);
|
||||||
int getOverFlowMode();
|
int getOverFlowMode();
|
||||||
#endif
|
#endif
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
int setReadoutMode(enum readoutMode mode);
|
int setReadoutMode(enum readoutMode mode);
|
||||||
int getReadoutMode();
|
int getReadoutMode();
|
||||||
#endif
|
#endif
|
||||||
@ -268,7 +237,7 @@ int selectStoragecellStart(int pos);
|
|||||||
int getMaxStoragecellStart();
|
int getMaxStoragecellStart();
|
||||||
#endif
|
#endif
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) || \
|
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) || \
|
||||||
defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
defined(CHIPTESTBOARDD)
|
||||||
int setNextFrameNumber(uint64_t value);
|
int setNextFrameNumber(uint64_t value);
|
||||||
int getNextFrameNumber(uint64_t *value);
|
int getNextFrameNumber(uint64_t *value);
|
||||||
#endif
|
#endif
|
||||||
@ -313,9 +282,11 @@ int getNumAdditionalStorageCells();
|
|||||||
int setStorageCellDelay(int64_t val);
|
int setStorageCellDelay(int64_t val);
|
||||||
int64_t getStorageCellDelay();
|
int64_t getStorageCellDelay();
|
||||||
#endif
|
#endif
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#if defined(CHIPTESTBOARDD)
|
||||||
int setNumAnalogSamples(int val);
|
int setNumAnalogSamples(int val);
|
||||||
int getNumAnalogSamples();
|
int getNumAnalogSamples();
|
||||||
|
#endif
|
||||||
|
#ifdef CHIPTESTBOARDD
|
||||||
int setNumDigitalSamples(int val);
|
int setNumDigitalSamples(int val);
|
||||||
int getNumDigitalSamples();
|
int getNumDigitalSamples();
|
||||||
int setNumTransceiverSamples(int val);
|
int setNumTransceiverSamples(int val);
|
||||||
@ -328,15 +299,12 @@ uint32_t getCounterMask();
|
|||||||
void updatePacketizing();
|
void updatePacketizing();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef EIGERD
|
|
||||||
int64_t getNumFramesLeft();
|
|
||||||
int64_t getNumTriggersLeft();
|
|
||||||
#endif
|
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARDD) || \
|
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARDD) || \
|
||||||
defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) || \
|
defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||||
defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
int setDelayAfterTrigger(int64_t val);
|
int setDelayAfterTrigger(int64_t val);
|
||||||
int64_t getDelayAfterTrigger();
|
int64_t getDelayAfterTrigger();
|
||||||
|
int64_t getNumFramesLeft();
|
||||||
|
int64_t getNumTriggersLeft();
|
||||||
int64_t getDelayAfterTriggerLeft();
|
int64_t getDelayAfterTriggerLeft();
|
||||||
int64_t getPeriodLeft();
|
int64_t getPeriodLeft();
|
||||||
#endif
|
#endif
|
||||||
@ -347,7 +315,7 @@ int64_t getNumBurstsLeft();
|
|||||||
int64_t getExpTimeLeft();
|
int64_t getExpTimeLeft();
|
||||||
#endif
|
#endif
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \
|
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \
|
||||||
defined(MYTHEN3D) || defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD)
|
defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||||
int64_t getFramesFromStart();
|
int64_t getFramesFromStart();
|
||||||
int64_t getActualTime();
|
int64_t getActualTime();
|
||||||
int64_t getMeasurementTime();
|
int64_t getMeasurementTime();
|
||||||
@ -369,12 +337,10 @@ int setTrimbits(int *trimbits);
|
|||||||
int setAllTrimbits(int val);
|
int setAllTrimbits(int val);
|
||||||
int getAllTrimbits();
|
int getAllTrimbits();
|
||||||
#endif
|
#endif
|
||||||
#ifndef XILINX_CHIPTESTBOARDD
|
|
||||||
#ifndef CHIPTESTBOARDD
|
#ifndef CHIPTESTBOARDD
|
||||||
enum detectorSettings setSettings(enum detectorSettings sett);
|
enum detectorSettings setSettings(enum detectorSettings sett);
|
||||||
#endif
|
#endif
|
||||||
enum detectorSettings getSettings();
|
enum detectorSettings getSettings();
|
||||||
#endif
|
|
||||||
#if defined(JUNGFRAUD)
|
#if defined(JUNGFRAUD)
|
||||||
enum gainMode getGainMode();
|
enum gainMode getGainMode();
|
||||||
void setGainMode(enum gainMode mode);
|
void setGainMode(enum gainMode mode);
|
||||||
@ -404,7 +370,7 @@ void setDAC(enum DACINDEX ind, int val, int mV);
|
|||||||
#endif
|
#endif
|
||||||
int getDAC(enum DACINDEX ind, int mV);
|
int getDAC(enum DACINDEX ind, int mV);
|
||||||
int getMaxDacSteps();
|
int getMaxDacSteps();
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#if defined(CHIPTESTBOARDD)
|
||||||
int dacToVoltage(int dac);
|
int dacToVoltage(int dac);
|
||||||
int checkVLimitCompliant(int mV);
|
int checkVLimitCompliant(int mV);
|
||||||
int checkVLimitDacCompliant(int dac);
|
int checkVLimitDacCompliant(int dac);
|
||||||
@ -423,12 +389,9 @@ int isPowerValid(enum DACINDEX ind, int val);
|
|||||||
int getPower();
|
int getPower();
|
||||||
void setPower(enum DACINDEX ind, int val);
|
void setPower(enum DACINDEX ind, int val);
|
||||||
void powerOff();
|
void powerOff();
|
||||||
#elif XILINX_CHIPTESTBOARDD
|
|
||||||
int getPower();
|
|
||||||
void setPower(enum DACINDEX ind, int val);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MYTHEN3D) || defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD)
|
#if defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||||
int getADC(enum ADCINDEX ind, int *value);
|
int getADC(enum ADCINDEX ind, int *value);
|
||||||
#else
|
#else
|
||||||
int getADC(enum ADCINDEX ind);
|
int getADC(enum ADCINDEX ind);
|
||||||
@ -437,12 +400,8 @@ int getADC(enum ADCINDEX ind);
|
|||||||
int getSlowADC(int ichan);
|
int getSlowADC(int ichan);
|
||||||
int getSlowADCTemperature();
|
int getSlowADCTemperature();
|
||||||
#endif
|
#endif
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
|
||||||
int getSlowADC(int ichan, int *retval);
|
|
||||||
int getTemperature(int *retval);
|
|
||||||
#else
|
|
||||||
int setHighVoltage(int val);
|
int setHighVoltage(int val);
|
||||||
#endif
|
|
||||||
|
|
||||||
// parameters - timing, extsig
|
// parameters - timing, extsig
|
||||||
#if defined(EIGERD) || defined(GOTTHARD2D) || defined(JUNGFRAUD) || \
|
#if defined(EIGERD) || defined(GOTTHARD2D) || defined(JUNGFRAUD) || \
|
||||||
@ -512,8 +471,7 @@ void setupHeader(int iRxEntry, enum interfaceType type, uint32_t destip,
|
|||||||
uint32_t sourceip, uint16_t sourceport);
|
uint32_t sourceip, uint16_t sourceport);
|
||||||
#endif
|
#endif
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARD2D) || \
|
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARD2D) || \
|
||||||
defined(MYTHEN3D) || defined(CHIPTESTBOARDD) || \
|
defined(MYTHEN3D) || defined(CHIPTESTBOARDD)
|
||||||
defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
void calcChecksum(udp_header *udp);
|
void calcChecksum(udp_header *udp);
|
||||||
#endif
|
#endif
|
||||||
#ifdef GOTTHARDD
|
#ifdef GOTTHARDD
|
||||||
@ -721,14 +679,13 @@ int startStateMachine();
|
|||||||
void *start_timer(void *arg);
|
void *start_timer(void *arg);
|
||||||
#endif
|
#endif
|
||||||
int stopStateMachine();
|
int stopStateMachine();
|
||||||
#if defined(MYTHEN3D) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef MYTHEN3D
|
||||||
int softwareTrigger();
|
int softwareTrigger();
|
||||||
#endif
|
#endif
|
||||||
#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)
|
#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)
|
||||||
int softwareTrigger(int block);
|
int softwareTrigger(int block);
|
||||||
#endif
|
#endif
|
||||||
#if defined(EIGERD) || defined(MYTHEN3D) || defined(CHIPTESTBOARDD) || \
|
#if defined(EIGERD) || defined(MYTHEN3D) || defined(CHIPTESTBOARDD)
|
||||||
defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
int startReadOut();
|
int startReadOut();
|
||||||
#endif
|
#endif
|
||||||
enum runStatus getRunStatus();
|
enum runStatus getRunStatus();
|
||||||
@ -748,8 +705,7 @@ int readFrameFromFifo();
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \
|
#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \
|
||||||
defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) || \
|
defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||||
defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
u_int32_t runBusy();
|
u_int32_t runBusy();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -760,7 +716,7 @@ u_int32_t runState(enum TLogLevel lev);
|
|||||||
// common
|
// common
|
||||||
int calculateDataBytes();
|
int calculateDataBytes();
|
||||||
int getTotalNumberOfChannels();
|
int getTotalNumberOfChannels();
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#if defined(CHIPTESTBOARDD)
|
||||||
void getNumberOfChannels(int *nchanx, int *nchany);
|
void getNumberOfChannels(int *nchanx, int *nchany);
|
||||||
#endif
|
#endif
|
||||||
int getNumberOfChips();
|
int getNumberOfChips();
|
||||||
|
@ -329,4 +329,3 @@ int getColumn();
|
|||||||
int setColumn(int);
|
int setColumn(int);
|
||||||
int get_pedestal_mode(int);
|
int get_pedestal_mode(int);
|
||||||
int set_pedestal_mode(int);
|
int set_pedestal_mode(int);
|
||||||
int config_transceiver(int);
|
|
||||||
|
@ -13,54 +13,35 @@
|
|||||||
#define LTC2620_D_MAX_STEPS (LTC2620_D_MAX_DAC_VAL + 1)
|
#define LTC2620_D_MAX_STEPS (LTC2620_D_MAX_DAC_VAL + 1)
|
||||||
|
|
||||||
// defines from the fpga
|
// defines from the fpga
|
||||||
int LTC2620_D_HardMinVoltage = 0;
|
|
||||||
int LTC2620_D_HardMaxVoltage = 0;
|
int LTC2620_D_HardMaxVoltage = 0;
|
||||||
char LTC2620_D_DriverFileName[MAX_STR_LENGTH];
|
char LTC2620_D_DriverFileName[MAX_STR_LENGTH];
|
||||||
char LTC2620_D_PowerDownDriverFileName[MAX_STR_LENGTH];
|
|
||||||
int LTC2620_D_NumDacs = 0;
|
int LTC2620_D_NumDacs = 0;
|
||||||
int LTC2620_D_NumDevices = 0;
|
|
||||||
int LTC2620_D_NumChannelsPerDevice = 0;
|
|
||||||
int LTC2620_D_DacDriverStartingDeviceIndex = 0;
|
|
||||||
|
|
||||||
void LTC2620_D_SetDefines(int hardMinV, int hardMaxV, char *driverfname,
|
void LTC2620_D_SetDefines(int hardMaxV, char *driverfname, int numdacs) {
|
||||||
int numdacs, int numdevices, int startingDeviceIndex,
|
|
||||||
char *powerdownDriverfname) {
|
|
||||||
LOG(logINFOBLUE,
|
LOG(logINFOBLUE,
|
||||||
("Configuring DACs (LTC2620) to %s\n\t (numdacs:%d, hard min:%d, hard "
|
("Configuring DACs (LTC2620) to %s (numdacs:%d, hard max: %dmV)\n",
|
||||||
"max: %dmV, idev:%d)\n",
|
driverfname, numdacs, hardMaxV));
|
||||||
driverfname, numdacs, hardMinV, hardMaxV, startingDeviceIndex));
|
|
||||||
LTC2620_D_HardMinVoltage = hardMinV;
|
|
||||||
LTC2620_D_HardMaxVoltage = hardMaxV;
|
LTC2620_D_HardMaxVoltage = hardMaxV;
|
||||||
memset(LTC2620_D_DriverFileName, 0, MAX_STR_LENGTH);
|
memset(LTC2620_D_DriverFileName, 0, MAX_STR_LENGTH);
|
||||||
strcpy(LTC2620_D_DriverFileName, driverfname);
|
strcpy(LTC2620_D_DriverFileName, driverfname);
|
||||||
memset(LTC2620_D_PowerDownDriverFileName, 0, MAX_STR_LENGTH);
|
|
||||||
strcpy(LTC2620_D_PowerDownDriverFileName, powerdownDriverfname);
|
|
||||||
LTC2620_D_NumDacs = numdacs;
|
LTC2620_D_NumDacs = numdacs;
|
||||||
LTC2620_D_NumDevices = numdevices;
|
|
||||||
LTC2620_D_NumChannelsPerDevice = LTC2620_D_NumDacs / LTC2620_D_NumDevices;
|
|
||||||
LTC2620_D_DacDriverStartingDeviceIndex = startingDeviceIndex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int LTC2620_D_GetMaxNumSteps() { return LTC2620_D_MAX_STEPS; }
|
int LTC2620_D_GetMaxNumSteps() { return LTC2620_D_MAX_STEPS; }
|
||||||
|
|
||||||
int LTC2620_D_GetPowerDownValue() { return LTC2620_D_PWR_DOWN_VAL; }
|
|
||||||
|
|
||||||
int LTC2620_D_VoltageToDac(int voltage, int *dacval) {
|
int LTC2620_D_VoltageToDac(int voltage, int *dacval) {
|
||||||
return ConvertToDifferentRange(LTC2620_D_HardMinVoltage,
|
return ConvertToDifferentRange(0, LTC2620_D_HardMaxVoltage, 0,
|
||||||
LTC2620_D_HardMaxVoltage, 0,
|
|
||||||
LTC2620_D_MAX_DAC_VAL, voltage, dacval);
|
LTC2620_D_MAX_DAC_VAL, voltage, dacval);
|
||||||
}
|
}
|
||||||
|
|
||||||
int LTC2620_D_DacToVoltage(int dacval, int *voltage) {
|
int LTC2620_D_DacToVoltage(int dacval, int *voltage) {
|
||||||
return ConvertToDifferentRange(0, LTC2620_D_MAX_DAC_VAL,
|
return ConvertToDifferentRange(0, LTC2620_D_MAX_DAC_VAL, 0,
|
||||||
LTC2620_D_HardMinVoltage,
|
|
||||||
LTC2620_D_HardMaxVoltage, dacval, voltage);
|
LTC2620_D_HardMaxVoltage, dacval, voltage);
|
||||||
}
|
}
|
||||||
|
|
||||||
int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
||||||
int *dacval) {
|
int *dacval) {
|
||||||
LOG(logDEBUG1, ("dacnum:%d, val:%d, ismV:%d\n", dacnum, val, mV));
|
LOG(logDEBUG1, ("dacnum:%d, val:%d, ismV:%d\n", dacnum, val, mV));
|
||||||
|
|
||||||
// validate index
|
// validate index
|
||||||
if (dacnum < 0 || dacnum >= LTC2620_D_NumDacs) {
|
if (dacnum < 0 || dacnum >= LTC2620_D_NumDacs) {
|
||||||
LOG(logERROR, ("Dac index %d is out of bounds (0 to %d)\n", dacnum,
|
LOG(logERROR, ("Dac index %d is out of bounds (0 to %d)\n", dacnum,
|
||||||
@ -68,30 +49,14 @@ int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate set
|
// get
|
||||||
if (val < 0 && val != LTC2620_D_PWR_DOWN_VAL)
|
if (val < 0 && val != LTC2620_D_PWR_DOWN_VAL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
int ret = OK;
|
|
||||||
*dacval = val;
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
char fnameFormat[MAX_STR_LENGTH];
|
|
||||||
memset(fnameFormat, 0, MAX_STR_LENGTH);
|
|
||||||
strcpy(fnameFormat, LTC2620_D_DriverFileName);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// power down dac (different file name)
|
|
||||||
if (val == LTC2620_D_PWR_DOWN_VAL) {
|
|
||||||
#if defined(XILINX_CHIPTESTBOARDD) && !defined(VIRTUAL)
|
|
||||||
LOG(logINFO, ("Powering down DAC %2d [%-6s] \n", dacnum, dacname));
|
|
||||||
strcpy(fnameFormat, LTC2620_D_PowerDownDriverFileName);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// proper value to set
|
|
||||||
else {
|
|
||||||
// convert to dac or get mV value
|
// convert to dac or get mV value
|
||||||
|
*dacval = val;
|
||||||
int dacmV = val;
|
int dacmV = val;
|
||||||
|
int ret = OK;
|
||||||
if (mV) {
|
if (mV) {
|
||||||
ret = LTC2620_D_VoltageToDac(val, dacval);
|
ret = LTC2620_D_VoltageToDac(val, dacval);
|
||||||
} else if (val >= 0) {
|
} else if (val >= 0) {
|
||||||
@ -106,32 +71,18 @@ int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// print and set
|
// set
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
|
||||||
if (*dacval >= 0) {
|
|
||||||
LOG(logINFO, ("Setting DAC %2d [%-6s] : %d dac (%d mV)\n", dacnum,
|
|
||||||
dacname, *dacval, dacmV));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if ((*dacval >= 0) || (*dacval == LTC2620_D_PWR_DOWN_VAL)) {
|
if ((*dacval >= 0) || (*dacval == LTC2620_D_PWR_DOWN_VAL)) {
|
||||||
LOG(logINFO, ("Setting DAC %2d [%-12s] : %d dac (%d mV)\n", dacnum,
|
LOG(logINFO, ("Setting DAC %2d [%-12s] : %d dac (%d mV)\n", dacnum,
|
||||||
dacname, *dacval, dacmV));
|
dacname, *dacval, dacmV));
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// set in file
|
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
char fname[MAX_STR_LENGTH];
|
char fname[MAX_STR_LENGTH];
|
||||||
memset(fname, 0, MAX_STR_LENGTH);
|
strcpy(fname, LTC2620_D_DriverFileName);
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
char temp[20];
|
||||||
int idev = LTC2620_D_DacDriverStartingDeviceIndex +
|
memset(temp, 0, sizeof(temp));
|
||||||
(dacnum / LTC2620_D_NumChannelsPerDevice);
|
sprintf(temp, "%d", dacnum);
|
||||||
int idac = dacnum % LTC2620_D_NumChannelsPerDevice;
|
strcat(fname, temp);
|
||||||
sprintf(fname, fnameFormat, idev, idac);
|
|
||||||
#else
|
|
||||||
sprintf(fname, "%s%d", fnameFormat, dacnum);
|
|
||||||
#endif
|
|
||||||
LOG(logDEBUG1, ("fname %s\n", fname));
|
LOG(logDEBUG1, ("fname %s\n", fname));
|
||||||
|
|
||||||
// open file
|
// open file
|
||||||
@ -142,16 +93,9 @@ int LTC2620_D_SetDACValue(int dacnum, int val, int mV, char *dacname,
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
// convert to string, add 0 and write to file
|
// convert to string, add 0 and write to file
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
|
||||||
// not changing *dacval from -100 (cant write -100 to file: invalid arg)
|
|
||||||
int writeValue = *dacval;
|
|
||||||
if (writeValue == LTC2620_D_PWR_DOWN_VAL)
|
|
||||||
writeValue = 1;
|
|
||||||
fprintf(fd, "%d\n", writeValue);
|
|
||||||
#else
|
|
||||||
fprintf(fd, "%d\n", *dacval);
|
fprintf(fd, "%d\n", *dacval);
|
||||||
#endif
|
|
||||||
fclose(fd);
|
fclose(fd);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
@ -1,94 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#include "arm64.h"
|
|
||||||
#include "RegisterDefs.h"
|
|
||||||
#include "clogger.h"
|
|
||||||
#include "common.h"
|
|
||||||
#include "sls/ansi.h"
|
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
|
|
||||||
#include <fcntl.h> // open
|
|
||||||
#include <sys/mman.h> // mmap
|
|
||||||
|
|
||||||
/* global variables */
|
|
||||||
#define CSP0 (0xB0080000)
|
|
||||||
#define CSP1 (0xB0050000) // udp
|
|
||||||
#define MEM_SIZE (0x10000)
|
|
||||||
//#define MEM_SIZE_CSP0 (4096)
|
|
||||||
//#define MEM_SIZE_CSP1 (2 * 4096)
|
|
||||||
u_int32_t *csp0base = 0;
|
|
||||||
u_int32_t *csp1base = 0;
|
|
||||||
|
|
||||||
void bus_w(u_int32_t offset, u_int32_t data) {
|
|
||||||
volatile u_int32_t *ptr1;
|
|
||||||
ptr1 = (u_int32_t *)(csp0base + offset / (sizeof(u_int32_t)));
|
|
||||||
*ptr1 = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int32_t bus_r(u_int32_t offset) {
|
|
||||||
volatile u_int32_t *ptr1;
|
|
||||||
ptr1 = (u_int32_t *)(csp0base + offset / (sizeof(u_int32_t)));
|
|
||||||
return *ptr1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t getU64BitReg(int aLSB, int aMSB) {
|
|
||||||
uint64_t retval = bus_r(aMSB);
|
|
||||||
retval = (retval << 32) | bus_r(aLSB);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setU64BitReg(uint64_t value, int aLSB, int aMSB) {
|
|
||||||
bus_w(aLSB, value & (0xffffffff));
|
|
||||||
bus_w(aMSB, (value >> 32) & (0xffffffff));
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int32_t readRegister(u_int32_t offset) { return bus_r(offset); }
|
|
||||||
|
|
||||||
u_int32_t writeRegister(u_int32_t offset, u_int32_t data) {
|
|
||||||
bus_w(offset, data);
|
|
||||||
return readRegister(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
int mapCSP0(void) {
|
|
||||||
u_int32_t csps[2] = {CSP0, CSP1};
|
|
||||||
u_int32_t **cspbases[2] = {&csp0base, &csp1base};
|
|
||||||
char names[2][10] = {"csp0base", "csp1base"};
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; ++i) {
|
|
||||||
// if not mapped
|
|
||||||
if (*cspbases[i] == 0) {
|
|
||||||
LOG(logINFO, ("Mapping memory for %s\n", names[i]));
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
*cspbases[i] = malloc(MEM_SIZE);
|
|
||||||
if (*cspbases[i] == NULL) {
|
|
||||||
LOG(logERROR,
|
|
||||||
("Could not allocate virtual memory for %s.\n", names[i]));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logINFO, ("memory allocated for %s\n", names[i]));
|
|
||||||
#else
|
|
||||||
int fd = open("/dev/mem", O_RDWR | O_SYNC, 0);
|
|
||||||
if (fd == -1) {
|
|
||||||
LOG(logERROR, ("Can't find /dev/mem for %s\n", names[i]));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logDEBUG1,
|
|
||||||
("/dev/mem opened for %s, (CSP:0x%x)\n", names[i], csps[i]));
|
|
||||||
*cspbases[i] =
|
|
||||||
(u_int32_t *)mmap(0, MEM_SIZE, PROT_READ | PROT_WRITE,
|
|
||||||
MAP_FILE | MAP_SHARED, fd, csps[i]);
|
|
||||||
if (*cspbases[i] == MAP_FAILED) {
|
|
||||||
LOG(logERROR, ("Can't map memmory area for %s\n", names[i]));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
LOG(logINFO, ("%s mapped from %p to %p,(CSP:0x%x) \n", names[i],
|
|
||||||
*cspbases[i], *cspbases[i] + MEM_SIZE, csps[i]));
|
|
||||||
// LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG)));
|
|
||||||
} else
|
|
||||||
LOG(logINFO, ("Memory %s already mapped before\n", names[i]));
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
u_int32_t *Arm_getUDPBaseAddress() { return csp1base; }
|
|
@ -114,11 +114,6 @@ int getTimeFromString(char *buf, time_t *result) {
|
|||||||
t.tm_mday, t.tm_mon, t.tm_year + 1900, t.tm_hour, t.tm_min, t.tm_sec));
|
t.tm_mday, t.tm_mon, t.tm_year + 1900, t.tm_hour, t.tm_min, t.tm_sec));
|
||||||
|
|
||||||
*result = mktime(&t);
|
*result = mktime(&t);
|
||||||
/* Do not check as it fails with nios
|
|
||||||
if (*result == (time_t)-1) {
|
|
||||||
LOG(logERROR, ("Could not convert time structure to time_t\n"));
|
|
||||||
return FAIL;
|
|
||||||
}*/
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,25 +143,14 @@ int validateKernelVersion(char *expectedVersion) {
|
|||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
strcpy(currentVersion, expectedVersion);
|
strcpy(currentVersion, expectedVersion);
|
||||||
#else
|
#else
|
||||||
#ifndef ARMPROCESSOR
|
|
||||||
// remove first word (#version number)
|
// remove first word (#version number)
|
||||||
const char *ptr = strstr(version, " ");
|
const char *ptr = strchr(version, ' ');
|
||||||
if (ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
LOG(logERROR, ("Could not parse kernel version\n"));
|
LOG(logERROR, ("Could not parse kernel version\n"));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
strcpy(currentVersion, ptr + 1);
|
strcpy(currentVersion, version + (ptr - version + 1));
|
||||||
#else
|
|
||||||
// remove first two words (#version number and SMP)
|
|
||||||
const char *ptr = strstr(version, "SMP ");
|
|
||||||
if (ptr == NULL) {
|
|
||||||
LOG(logERROR, ("Could not parse kernel version\n"));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
strcpy(currentVersion, ptr + 4);
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
currentVersion[sizeof(currentVersion) - 1] = '\0';
|
|
||||||
|
|
||||||
// convert kernel date string into time
|
// convert kernel date string into time
|
||||||
time_t kernelDate;
|
time_t kernelDate;
|
||||||
@ -175,7 +159,6 @@ int validateKernelVersion(char *expectedVersion) {
|
|||||||
("Could not parse retrieved kernel date, %s\n", currentVersion));
|
("Could not parse retrieved kernel date, %s\n", currentVersion));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logDEBUG, ("Kernel Date: [%s]\n", ctime(&kernelDate)));
|
|
||||||
|
|
||||||
// convert expected date into time
|
// convert expected date into time
|
||||||
time_t expDate;
|
time_t expDate;
|
||||||
@ -184,12 +167,11 @@ int validateKernelVersion(char *expectedVersion) {
|
|||||||
("Could not parse expected kernel date, %s\n", expectedVersion));
|
("Could not parse expected kernel date, %s\n", expectedVersion));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
LOG(logDEBUG, ("Expected Date: [%s]\n", ctime(&expDate)));
|
|
||||||
|
|
||||||
// compare if kernel time is older than expected time
|
// compare if kernel time is older than expected time
|
||||||
if (kernelDate < expDate) {
|
if (kernelDate < expDate) {
|
||||||
LOG(logERROR, ("Kernel Version Incompatible (too old)!\nExpected: '%s'"
|
LOG(logERROR, ("Kernel Version Incompatible (too old)! Expected: [%s], "
|
||||||
"\nGot : '%s'\n",
|
"Got [%s]\n",
|
||||||
expectedVersion, currentVersion));
|
expectedVersion, currentVersion));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
@ -752,17 +734,13 @@ int readADCFromFile(char *fname, int *value) {
|
|||||||
|
|
||||||
*value = -1;
|
*value = -1;
|
||||||
if (sscanf(line, "%d", value) != 1) {
|
if (sscanf(line, "%d", value) != 1) {
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
|
||||||
LOG(logERROR, ("Could not scan adc from %s\n", line));
|
|
||||||
#else
|
|
||||||
LOG(logERROR, ("Could not scan temperature from %s\n", line));
|
LOG(logERROR, ("Could not scan temperature from %s\n", line));
|
||||||
#endif
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
*value /= 10;
|
*value /= 10;
|
||||||
#elif !defined(XILINX_CHIPTESTBOARDD)
|
#else
|
||||||
LOG(logINFO, ("Temperature: %.2f °C\n", (double)(*value) / 1000.00));
|
LOG(logINFO, ("Temperature: %.2f °C\n", (double)(*value) / 1000.00));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
extern enum TLogLevel trimmingPrint;
|
extern enum TLogLevel trimmingPrint;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
uint64_t virtual_pattern[MAX_PATTERN_LENGTH];
|
uint64_t virtual_pattern[MAX_PATTERN_LENGTH];
|
||||||
#endif
|
#endif
|
||||||
@ -21,8 +21,8 @@ uint64_t virtual_pattern[MAX_PATTERN_LENGTH];
|
|||||||
|
|
||||||
extern void bus_w(u_int32_t offset, u_int32_t data);
|
extern void bus_w(u_int32_t offset, u_int32_t data);
|
||||||
extern u_int32_t bus_r(u_int32_t offset);
|
extern u_int32_t bus_r(u_int32_t offset);
|
||||||
// extern int64_t get64BitReg(int aLSB, int aMSB); TODO for all servers (only
|
extern int64_t get64BitReg(int aLSB, int aMSB);
|
||||||
// uint64_t) extern int64_t set64BitReg(int64_t value, int aLSB, int aMSB);
|
extern int64_t set64BitReg(int64_t value, int aLSB, int aMSB);
|
||||||
extern uint64_t getU64BitReg(int aLSB, int aMSB);
|
extern uint64_t getU64BitReg(int aLSB, int aMSB);
|
||||||
extern void setU64BitReg(uint64_t value, int aLSB, int aMSB);
|
extern void setU64BitReg(uint64_t value, int aLSB, int aMSB);
|
||||||
|
|
||||||
@ -44,34 +44,18 @@ void initializePatternAddresses() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
void initializePatternWord() {
|
void initializePatternWord() {
|
||||||
memset(virtual_pattern, 0, sizeof(virtual_pattern));
|
memset(virtual_pattern, 0, sizeof(virtual_pattern));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
uint64_t validate_readPatternIOControl() {
|
uint64_t validate_readPatternIOControl() {
|
||||||
#if defined(CHIPTESTBOARDD)
|
|
||||||
return getU64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
|
return getU64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
|
||||||
#elif defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
return (uint64_t)(bus_r(PINIOCTRLREG));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int validate_writePatternIOControl(char *message, uint64_t arg) {
|
int validate_writePatternIOControl(char *message, uint64_t arg) {
|
||||||
// validate input
|
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
|
||||||
if (arg > BIT32_MSK) {
|
|
||||||
strcpy(message, "Could not set pattern IO Control. Must be 32 bit for "
|
|
||||||
"this detector\n");
|
|
||||||
LOG(logERROR, (message));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
writePatternIOControl(arg);
|
writePatternIOControl(arg);
|
||||||
|
|
||||||
// validate result
|
// validate result
|
||||||
@ -91,15 +75,9 @@ int validate_writePatternIOControl(char *message, uint64_t arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void writePatternIOControl(uint64_t word) {
|
void writePatternIOControl(uint64_t word) {
|
||||||
#ifdef CHIPTESTBOARDD
|
|
||||||
LOG(logINFO,
|
LOG(logINFO,
|
||||||
("Setting Pattern I/O Control: 0x%llx\n", (long long int)word));
|
("Setting Pattern I/O Control: 0x%llx\n", (long long int)word));
|
||||||
setU64BitReg(word, PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
|
setU64BitReg(word, PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG);
|
||||||
#elif defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
uint32_t val = (uint32_t)word;
|
|
||||||
LOG(logINFO, ("Setting Pattern I/O Control: 0x%x\n", val));
|
|
||||||
bus_w(PINIOCTRLREG, val);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -123,7 +101,7 @@ uint64_t readPatternWord(int addr) {
|
|||||||
// the first word in RAM as base plus the offset of the word to write (addr)
|
// the first word in RAM as base plus the offset of the word to write (addr)
|
||||||
uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2;
|
uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2;
|
||||||
uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2;
|
uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2;
|
||||||
return getU64BitReg(reg_lsb, reg_msb);
|
return get64BitReg(reg_lsb, reg_msb);
|
||||||
#else
|
#else
|
||||||
LOG(logDEBUG1, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr));
|
LOG(logDEBUG1, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr));
|
||||||
uint32_t reg = PATTERN_CNTRL_REG;
|
uint32_t reg = PATTERN_CNTRL_REG;
|
||||||
@ -140,7 +118,7 @@ uint64_t readPatternWord(int addr) {
|
|||||||
|
|
||||||
// read value
|
// read value
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
return getU64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG);
|
return get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG);
|
||||||
#else
|
#else
|
||||||
return virtual_pattern[addr];
|
return virtual_pattern[addr];
|
||||||
#endif
|
#endif
|
||||||
@ -182,7 +160,7 @@ void writePatternWord(int addr, uint64_t word) {
|
|||||||
uint32_t reg = PATTERN_CNTRL_REG;
|
uint32_t reg = PATTERN_CNTRL_REG;
|
||||||
|
|
||||||
// write word
|
// write word
|
||||||
setU64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG);
|
set64BitReg(word, PATTERN_IN_LSB_REG, PATTERN_IN_MSB_REG);
|
||||||
|
|
||||||
// overwrite with only addr
|
// overwrite with only addr
|
||||||
bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK));
|
bus_w(reg, ((addr << PATTERN_CNTRL_ADDR_OFST) & PATTERN_CNTRL_ADDR_MSK));
|
||||||
@ -200,7 +178,7 @@ void writePatternWord(int addr, uint64_t word) {
|
|||||||
// the first word in RAM as base plus the offset of the word to write (addr)
|
// the first word in RAM as base plus the offset of the word to write (addr)
|
||||||
uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2;
|
uint32_t reg_lsb = PATTERN_STEP0_LSB_REG + addr * REG_OFFSET * 2;
|
||||||
uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2;
|
uint32_t reg_msb = PATTERN_STEP0_MSB_REG + addr * REG_OFFSET * 2;
|
||||||
setU64BitReg(word, reg_lsb, reg_msb);
|
set64BitReg(word, reg_lsb, reg_msb);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -333,23 +311,23 @@ int validate_getPatternWaitTime(char *message, int level, uint64_t *waittime) {
|
|||||||
uint64_t getPatternWaitTime(int level) {
|
uint64_t getPatternWaitTime(int level) {
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case 0:
|
case 0:
|
||||||
return getU64BitReg(PATTERN_WAIT_TIMER_0_LSB_REG,
|
return get64BitReg(PATTERN_WAIT_TIMER_0_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_0_MSB_REG);
|
PATTERN_WAIT_TIMER_0_MSB_REG);
|
||||||
case 1:
|
case 1:
|
||||||
return getU64BitReg(PATTERN_WAIT_TIMER_1_LSB_REG,
|
return get64BitReg(PATTERN_WAIT_TIMER_1_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_1_MSB_REG);
|
PATTERN_WAIT_TIMER_1_MSB_REG);
|
||||||
case 2:
|
case 2:
|
||||||
return getU64BitReg(PATTERN_WAIT_TIMER_2_LSB_REG,
|
return get64BitReg(PATTERN_WAIT_TIMER_2_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_2_MSB_REG);
|
PATTERN_WAIT_TIMER_2_MSB_REG);
|
||||||
#ifndef MYTHEN3D
|
#ifndef MYTHEN3D
|
||||||
case 3:
|
case 3:
|
||||||
return getU64BitReg(PATTERN_WAIT_TIMER_3_LSB_REG,
|
return get64BitReg(PATTERN_WAIT_TIMER_3_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_3_MSB_REG);
|
PATTERN_WAIT_TIMER_3_MSB_REG);
|
||||||
case 4:
|
case 4:
|
||||||
return getU64BitReg(PATTERN_WAIT_TIMER_4_LSB_REG,
|
return get64BitReg(PATTERN_WAIT_TIMER_4_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_4_MSB_REG);
|
PATTERN_WAIT_TIMER_4_MSB_REG);
|
||||||
case 5:
|
case 5:
|
||||||
return getU64BitReg(PATTERN_WAIT_TIMER_5_LSB_REG,
|
return get64BitReg(PATTERN_WAIT_TIMER_5_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_5_MSB_REG);
|
PATTERN_WAIT_TIMER_5_MSB_REG);
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
@ -391,28 +369,28 @@ void setPatternWaitTime(int level, uint64_t t) {
|
|||||||
(long long int)t));
|
(long long int)t));
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case 0:
|
case 0:
|
||||||
setU64BitReg(t, PATTERN_WAIT_TIMER_0_LSB_REG,
|
set64BitReg(t, PATTERN_WAIT_TIMER_0_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_0_MSB_REG);
|
PATTERN_WAIT_TIMER_0_MSB_REG);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
setU64BitReg(t, PATTERN_WAIT_TIMER_1_LSB_REG,
|
set64BitReg(t, PATTERN_WAIT_TIMER_1_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_1_MSB_REG);
|
PATTERN_WAIT_TIMER_1_MSB_REG);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
setU64BitReg(t, PATTERN_WAIT_TIMER_2_LSB_REG,
|
set64BitReg(t, PATTERN_WAIT_TIMER_2_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_2_MSB_REG);
|
PATTERN_WAIT_TIMER_2_MSB_REG);
|
||||||
break;
|
break;
|
||||||
#ifndef MYTHEN3D
|
#ifndef MYTHEN3D
|
||||||
case 3:
|
case 3:
|
||||||
setU64BitReg(t, PATTERN_WAIT_TIMER_3_LSB_REG,
|
set64BitReg(t, PATTERN_WAIT_TIMER_3_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_3_MSB_REG);
|
PATTERN_WAIT_TIMER_3_MSB_REG);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
setU64BitReg(t, PATTERN_WAIT_TIMER_4_LSB_REG,
|
set64BitReg(t, PATTERN_WAIT_TIMER_4_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_4_MSB_REG);
|
PATTERN_WAIT_TIMER_4_MSB_REG);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
setU64BitReg(t, PATTERN_WAIT_TIMER_5_LSB_REG,
|
set64BitReg(t, PATTERN_WAIT_TIMER_5_LSB_REG,
|
||||||
PATTERN_WAIT_TIMER_5_MSB_REG);
|
PATTERN_WAIT_TIMER_5_MSB_REG);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
@ -797,7 +775,7 @@ int loadPattern(char *message, enum TLogLevel printLevel,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// iocontrol
|
// iocontrol
|
||||||
#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) // TODO
|
#ifndef MYTHEN3D
|
||||||
if (ret == OK) {
|
if (ret == OK) {
|
||||||
ret = validate_writePatternIOControl(message, pat->ioctrl);
|
ret = validate_writePatternIOControl(message, pat->ioctrl);
|
||||||
}
|
}
|
||||||
@ -857,7 +835,7 @@ int getPattern(char *message, patternParameters *pat) {
|
|||||||
pat->word[i] = retval64;
|
pat->word[i] = retval64;
|
||||||
}
|
}
|
||||||
// iocontrol
|
// iocontrol
|
||||||
#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) // TODO
|
#ifndef MYTHEN3D
|
||||||
if (ret == OK) {
|
if (ret == OK) {
|
||||||
validate_readPatternIOControl();
|
validate_readPatternIOControl();
|
||||||
}
|
}
|
||||||
@ -978,7 +956,7 @@ int loadPatternFile(char *patFname, char *errMessage) {
|
|||||||
uint64_t word = 0;
|
uint64_t word = 0;
|
||||||
|
|
||||||
// cannot scan values
|
// cannot scan values
|
||||||
#if defined(VIRTUAL) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef VIRTUAL
|
||||||
if (sscanf(line, "%s 0x%x 0x%lx", command, &addr, &word) != 3) {
|
if (sscanf(line, "%s 0x%x 0x%lx", command, &addr, &word) != 3) {
|
||||||
#else
|
#else
|
||||||
if (sscanf(line, "%s 0x%x 0x%llx", command, &addr, &word) != 3) {
|
if (sscanf(line, "%s 0x%x 0x%llx", command, &addr, &word) != 3) {
|
||||||
@ -993,7 +971,7 @@ int loadPatternFile(char *patFname, char *errMessage) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// patioctrl
|
// patioctrl
|
||||||
#if !defined(MYTHEN3D) && !defined(XILINX_CHIPTESTBOARDD) // TODO
|
#ifndef MYTHEN3D
|
||||||
if (!strncmp(line, "patioctrl", strlen("patioctrl"))) {
|
if (!strncmp(line, "patioctrl", strlen("patioctrl"))) {
|
||||||
uint64_t arg = 0;
|
uint64_t arg = 0;
|
||||||
|
|
||||||
@ -1085,7 +1063,7 @@ int loadPatternFile(char *patFname, char *errMessage) {
|
|||||||
uint64_t waittime = 0;
|
uint64_t waittime = 0;
|
||||||
|
|
||||||
// cannot scan values
|
// cannot scan values
|
||||||
#if defined(VIRTUAL) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef VIRTUAL
|
||||||
if (sscanf(line, "%s %d %ld", command, &level, &waittime) != 3) {
|
if (sscanf(line, "%s %d %ld", command, &level, &waittime) != 3) {
|
||||||
#else
|
#else
|
||||||
if (sscanf(line, "%s %d %lld", command, &level, &waittime) != 3) {
|
if (sscanf(line, "%s %d %lld", command, &level, &waittime) != 3) {
|
||||||
|
@ -1,196 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#include "programViaArm.h"
|
|
||||||
#include "clogger.h"
|
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
|
|
||||||
#include <string.h> //memset
|
|
||||||
#include <unistd.h> // access
|
|
||||||
|
|
||||||
#define CMD_ARM_LOAD_BIT_FILE \
|
|
||||||
"~/fpgautil/fpgautil -b /root/apps/xilinx-ctb/XilinxCTB.bit -f Full"
|
|
||||||
#define CMD_ARM_DEVICE_TREE_API_FOLDER \
|
|
||||||
"/sys/kernel/config/device-tree/overlays/spidr"
|
|
||||||
#define CMD_ARM_DEVICE_TREE_OVERLAY_FILE "/root/apps/xilinx-ctb/pl.dtbo"
|
|
||||||
#define CMD_ARM_LOAD_DEVICE_TREE_FORMAT "cat %s > %s/dtbo"
|
|
||||||
#define CMD_ARM_DEVICE_TREE_DST "/sys/bus/iio/devices/iio:device"
|
|
||||||
#define CMD_ARM_DEVICE_NAME "xilinx-ams", "ad7689", "dac@0", "dac@1", "dac@2"
|
|
||||||
#define TIME_LOAD_DEVICE_TREE_MS (500)
|
|
||||||
|
|
||||||
extern int executeCommand(char *command, char *result, enum TLogLevel level);
|
|
||||||
|
|
||||||
int resetFPGA(char *mess) {
|
|
||||||
LOG(logINFOBLUE, ("Reseting FPGA...\n"));
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
char retvals[MAX_STR_LENGTH] = {0};
|
|
||||||
if (executeCommand(CMD_ARM_LOAD_BIT_FILE, retvals, logDEBUG1) == FAIL) {
|
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
|
||||||
"Could not reset fpga. Command to load bit file failed (%s)\n",
|
|
||||||
retvals);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
LOG(logINFOBLUE, ("FPGA reset successfully\n"))
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int loadDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex) {
|
|
||||||
if (verifyDeviceTree(mess, adcDeviceIndex, dacDeviceIndex) == OK)
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
if (checksBeforeCreatingDeviceTree(mess) == FAIL)
|
|
||||||
return FAIL;
|
|
||||||
|
|
||||||
if (createDeviceTree(mess) == FAIL)
|
|
||||||
return FAIL;
|
|
||||||
|
|
||||||
if (verifyDeviceTree(mess, adcDeviceIndex, dacDeviceIndex) == FAIL) {
|
|
||||||
LOG(logERROR, ("Device tree loading failed at verification\n"));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG(logINFOBLUE, ("Device tree loaded successfully\n"))
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int checksBeforeCreatingDeviceTree(char *mess) {
|
|
||||||
// check if device tree overlay file exists
|
|
||||||
if (access(CMD_ARM_DEVICE_TREE_OVERLAY_FILE, F_OK) != 0) {
|
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
|
||||||
"Device tree overlay file (%s) does not exist\n",
|
|
||||||
CMD_ARM_DEVICE_TREE_OVERLAY_FILE);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logINFO, ("\tDevice tree overlay file exists (%s)\n",
|
|
||||||
CMD_ARM_DEVICE_TREE_OVERLAY_FILE));
|
|
||||||
|
|
||||||
// check if device tree folder exists. If it does, remove it
|
|
||||||
if (access(CMD_ARM_DEVICE_TREE_API_FOLDER, F_OK) == 0) {
|
|
||||||
// remove it
|
|
||||||
char cmd[MAX_STR_LENGTH] = {0};
|
|
||||||
memset(cmd, 0, MAX_STR_LENGTH);
|
|
||||||
sprintf(cmd, "rmdir %s", CMD_ARM_DEVICE_TREE_API_FOLDER);
|
|
||||||
char retvals[MAX_STR_LENGTH] = {0};
|
|
||||||
memset(retvals, 0, MAX_STR_LENGTH);
|
|
||||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
|
||||||
"Could not unload device tree overlay api with %s (%s)\n",
|
|
||||||
cmd, retvals);
|
|
||||||
LOG(logWARNING, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logINFO, ("\tUnloaded existing device tree overlay api (%s)\n",
|
|
||||||
CMD_ARM_DEVICE_TREE_API_FOLDER));
|
|
||||||
} else {
|
|
||||||
LOG(logINFO, ("\tNo existing device tree overlay api found(%s)\n",
|
|
||||||
CMD_ARM_DEVICE_TREE_API_FOLDER));
|
|
||||||
}
|
|
||||||
|
|
||||||
// create device tree overlay folder
|
|
||||||
{
|
|
||||||
char cmd[MAX_STR_LENGTH] = {0};
|
|
||||||
memset(cmd, 0, MAX_STR_LENGTH);
|
|
||||||
sprintf(cmd, "mkdir %s", CMD_ARM_DEVICE_TREE_API_FOLDER);
|
|
||||||
char retvals[MAX_STR_LENGTH] = {0};
|
|
||||||
memset(retvals, 0, MAX_STR_LENGTH);
|
|
||||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
|
||||||
"Could not create device tree overlay api with %s (%s)\n",
|
|
||||||
cmd, retvals);
|
|
||||||
LOG(logWARNING, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logINFO, ("\tDevice tree overlay api created (%s)\n",
|
|
||||||
CMD_ARM_DEVICE_TREE_API_FOLDER));
|
|
||||||
}
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int createDeviceTree(char *mess) {
|
|
||||||
char cmd[MAX_STR_LENGTH] = {0};
|
|
||||||
memset(cmd, 0, MAX_STR_LENGTH);
|
|
||||||
sprintf(cmd, CMD_ARM_LOAD_DEVICE_TREE_FORMAT,
|
|
||||||
CMD_ARM_DEVICE_TREE_OVERLAY_FILE, CMD_ARM_DEVICE_TREE_API_FOLDER);
|
|
||||||
char retvals[MAX_STR_LENGTH] = {0};
|
|
||||||
memset(retvals, 0, MAX_STR_LENGTH);
|
|
||||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
|
||||||
"Could not load device tree overlay with %s (%s)\n", cmd,
|
|
||||||
retvals);
|
|
||||||
LOG(logWARNING, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
LOG(logINFO, ("\tDevice tree overlay created (cmd: %s)\n", cmd));
|
|
||||||
|
|
||||||
usleep(TIME_LOAD_DEVICE_TREE_MS * 1000);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int verifyDeviceTree(char *mess, int *adcDeviceIndex, int *dacDeviceIndex) {
|
|
||||||
LOG(logINFOBLUE, ("Verifying Device Tree...\n"));
|
|
||||||
*adcDeviceIndex = 1;
|
|
||||||
*dacDeviceIndex = 2;
|
|
||||||
#ifndef VIRTUAL
|
|
||||||
|
|
||||||
// check if iio:device0-4 exists in device tree destination
|
|
||||||
int hardcodedDeviceIndex = 0;
|
|
||||||
for (int i = 0; i != 5; ++i) {
|
|
||||||
char deviceName[MAX_STR_LENGTH] = {0};
|
|
||||||
memset(deviceName, 0, MAX_STR_LENGTH);
|
|
||||||
sprintf(deviceName, "%s%d/name", CMD_ARM_DEVICE_TREE_DST, i);
|
|
||||||
// check if device exist
|
|
||||||
if (access(deviceName, F_OK) != 0) {
|
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
|
||||||
"Could not verify device tree. Device %s does not exist\n",
|
|
||||||
deviceName);
|
|
||||||
LOG(logWARNING, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
// find name
|
|
||||||
char cmd[MAX_STR_LENGTH] = {0};
|
|
||||||
memset(cmd, 0, MAX_STR_LENGTH);
|
|
||||||
sprintf(cmd, "cat %s", deviceName);
|
|
||||||
char retvals[MAX_STR_LENGTH] = {0};
|
|
||||||
memset(retvals, 0, MAX_STR_LENGTH);
|
|
||||||
if (executeCommand(cmd, retvals, logDEBUG1) == FAIL) {
|
|
||||||
snprintf(mess, MAX_STR_LENGTH,
|
|
||||||
"Could not retrieve device name from device %s (%s)\n",
|
|
||||||
deviceName, retvals);
|
|
||||||
LOG(logWARNING, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
// verify name
|
|
||||||
char *deviceNames[] = {CMD_ARM_DEVICE_NAME};
|
|
||||||
if (strstr(retvals, deviceNames[hardcodedDeviceIndex]) == NULL) {
|
|
||||||
// dacs got loaded first
|
|
||||||
if (i == 1 &&
|
|
||||||
strstr(retvals, deviceNames[hardcodedDeviceIndex + 1]) !=
|
|
||||||
NULL) {
|
|
||||||
++hardcodedDeviceIndex;
|
|
||||||
*adcDeviceIndex = 4;
|
|
||||||
*dacDeviceIndex = 1;
|
|
||||||
} else {
|
|
||||||
snprintf(
|
|
||||||
mess, MAX_STR_LENGTH,
|
|
||||||
"Could not verify device tree. Device %s expected %s but "
|
|
||||||
"got %s\n",
|
|
||||||
deviceName, deviceNames[i], retvals);
|
|
||||||
LOG(logWARNING, (mess));
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++hardcodedDeviceIndex;
|
|
||||||
// in case dacs were loaded first
|
|
||||||
if (hardcodedDeviceIndex == 5)
|
|
||||||
hardcodedDeviceIndex = 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
LOG(logINFOBLUE, ("Device tree verified successfully [temp: 0, adc:%d, "
|
|
||||||
"dac:%d, %d, %d]\n",
|
|
||||||
*adcDeviceIndex, *dacDeviceIndex, *dacDeviceIndex + 1,
|
|
||||||
*dacDeviceIndex + 2));
|
|
||||||
return OK;
|
|
||||||
}
|
|
@ -79,7 +79,7 @@ int main(int argc, char *argv[]) {
|
|||||||
"\t-v, --version : Software version\n"
|
"\t-v, --version : Software version\n"
|
||||||
"\t-p, --port <port> : TCP communication port with client. "
|
"\t-p, --port <port> : TCP communication port with client. "
|
||||||
"\n"
|
"\n"
|
||||||
"\t-g, --nomodule : [Mythen3][Gotthard2][Xilinx Ctb] \n"
|
"\t-g, --nomodule : [Mythen3][Gotthard2] \n"
|
||||||
"\t Generic or No Module mode. Skips "
|
"\t Generic or No Module mode. Skips "
|
||||||
"detector type checks. \n"
|
"detector type checks. \n"
|
||||||
"\t-f, --phaseshift <value> : [Gotthard] only. Sets phase shift. \n"
|
"\t-f, --phaseshift <value> : [Gotthard] only. Sets phase shift. \n"
|
||||||
|
@ -7,8 +7,7 @@
|
|||||||
#include "sls/sls_detector_funcs.h"
|
#include "sls/sls_detector_funcs.h"
|
||||||
#include "slsDetectorFunctionList.h"
|
#include "slsDetectorFunctionList.h"
|
||||||
|
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) || \
|
#if defined(CHIPTESTBOARDD) || defined(MYTHEN3D)
|
||||||
defined(MYTHEN3D)
|
|
||||||
#include "Pattern.h"
|
#include "Pattern.h"
|
||||||
#include "loadPattern.h"
|
#include "loadPattern.h"
|
||||||
#endif
|
#endif
|
||||||
@ -34,8 +33,6 @@ const enum detectorType myDetectorType = MOENCH;
|
|||||||
const enum detectorType myDetectorType = MYTHEN3;
|
const enum detectorType myDetectorType = MYTHEN3;
|
||||||
#elif GOTTHARD2D
|
#elif GOTTHARD2D
|
||||||
const enum detectorType myDetectorType = GOTTHARD2;
|
const enum detectorType myDetectorType = GOTTHARD2;
|
||||||
#elif XILINX_CHIPTESTBOARDD
|
|
||||||
const enum detectorType myDetectorType = XILINX_CHIPTESTBOARD;
|
|
||||||
#else
|
#else
|
||||||
const enum detectorType myDetectorType = GENERIC;
|
const enum detectorType myDetectorType = GENERIC;
|
||||||
#endif
|
#endif
|
||||||
@ -491,7 +488,6 @@ void function_table() {
|
|||||||
flist[F_SET_COLUMN] = &set_column;
|
flist[F_SET_COLUMN] = &set_column;
|
||||||
flist[F_GET_PEDESTAL_MODE] = &get_pedestal_mode;
|
flist[F_GET_PEDESTAL_MODE] = &get_pedestal_mode;
|
||||||
flist[F_SET_PEDESTAL_MODE] = &set_pedestal_mode;
|
flist[F_SET_PEDESTAL_MODE] = &set_pedestal_mode;
|
||||||
flist[F_CONFIG_TRANSCEIVER] = &config_transceiver;
|
|
||||||
|
|
||||||
// check
|
// check
|
||||||
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
|
if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) {
|
||||||
@ -791,7 +787,7 @@ int get_serial_number(int file_des) {
|
|||||||
ret = OK;
|
ret = OK;
|
||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
int64_t retval = -1;
|
int64_t retval = -1;
|
||||||
#if defined(EIGERD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef EIGERD
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
retval = getDetectorNumber();
|
retval = getDetectorNumber();
|
||||||
@ -806,8 +802,7 @@ int set_firmware_test(int file_des) {
|
|||||||
LOG(logDEBUG1, ("Executing firmware test\n"));
|
LOG(logDEBUG1, ("Executing firmware test\n"));
|
||||||
|
|
||||||
#if !defined(GOTTHARDD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
#if !defined(GOTTHARDD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) && \
|
!defined(CHIPTESTBOARDD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
ret = testFpga();
|
ret = testFpga();
|
||||||
@ -973,22 +968,6 @@ enum DACINDEX getDACIndex(enum dacIndex ind) {
|
|||||||
case V_POWER_CHIP:
|
case V_POWER_CHIP:
|
||||||
serverDacIndex = D_PWR_CHIP;
|
serverDacIndex = D_PWR_CHIP;
|
||||||
break;
|
break;
|
||||||
#elif XILINX_CHIPTESTBOARDD
|
|
||||||
case V_POWER_A:
|
|
||||||
serverDacIndex = D_PWR_A;
|
|
||||||
break;
|
|
||||||
case V_POWER_B:
|
|
||||||
serverDacIndex = D_PWR_B;
|
|
||||||
break;
|
|
||||||
case V_POWER_C:
|
|
||||||
serverDacIndex = D_PWR_C;
|
|
||||||
break;
|
|
||||||
case V_POWER_D:
|
|
||||||
serverDacIndex = D_PWR_D;
|
|
||||||
break;
|
|
||||||
case V_POWER_IO:
|
|
||||||
serverDacIndex = D_PWR_IO;
|
|
||||||
break;
|
|
||||||
#elif MYTHEN3D
|
#elif MYTHEN3D
|
||||||
case VCASSH:
|
case VCASSH:
|
||||||
serverDacIndex = M_VCASSH;
|
serverDacIndex = M_VCASSH;
|
||||||
@ -1143,7 +1122,7 @@ enum DACINDEX getDACIndex(enum dacIndex ind) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
if (ind < NDAC_ONLY) {
|
if (ind < NDAC_ONLY) {
|
||||||
// For CTB use the index directly, no conversion
|
// For CTB use the index directly, no conversion
|
||||||
serverDacIndex = (enum DACINDEX)ind;
|
serverDacIndex = (enum DACINDEX)ind;
|
||||||
@ -1158,20 +1137,16 @@ enum DACINDEX getDACIndex(enum dacIndex ind) {
|
|||||||
|
|
||||||
int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
|
||||||
enum DACINDEX serverDacIndex = 0;
|
enum DACINDEX serverDacIndex = 0;
|
||||||
|
|
||||||
// valid enums
|
// valid enums
|
||||||
switch (ind) {
|
switch (ind) {
|
||||||
#ifndef XILINX_CHIPTESTBOARDD
|
|
||||||
case HIGH_VOLTAGE:
|
case HIGH_VOLTAGE:
|
||||||
#endif
|
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
case IO_DELAY:
|
case IO_DELAY:
|
||||||
#elif CHIPTESTBOARDD
|
#elif CHIPTESTBOARDD
|
||||||
case ADC_VPP:
|
case ADC_VPP:
|
||||||
case V_LIMIT:
|
case V_LIMIT:
|
||||||
#elif XILINX_CHIPTESTBOARDD
|
|
||||||
case V_LIMIT:
|
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1212,7 +1187,6 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// high voltage
|
// high voltage
|
||||||
#ifndef XILINX_CHIPTESTBOARDD
|
|
||||||
case HIGH_VOLTAGE:
|
case HIGH_VOLTAGE:
|
||||||
retval = setHighVoltage(val);
|
retval = setHighVoltage(val);
|
||||||
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
|
LOG(logDEBUG1, ("High Voltage: %d\n", retval));
|
||||||
@ -1246,9 +1220,9 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
// power
|
// power, vlimit
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
case V_POWER_A:
|
case V_POWER_A:
|
||||||
case V_POWER_B:
|
case V_POWER_B:
|
||||||
case V_POWER_C:
|
case V_POWER_C:
|
||||||
@ -1269,9 +1243,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
|||||||
"exceeds voltage limit %d.\n",
|
"exceeds voltage limit %d.\n",
|
||||||
ind, getVLimit());
|
ind, getVLimit());
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
}
|
} else if (!isPowerValid(serverDacIndex, val)) {
|
||||||
#ifdef CHIPTESTBOARDD
|
|
||||||
else if (!isPowerValid(serverDacIndex, val)) {
|
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
sprintf(
|
sprintf(
|
||||||
mess,
|
mess,
|
||||||
@ -1281,21 +1253,15 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
|||||||
(serverDacIndex == D_PWR_IO ? VIO_MIN_MV : POWER_RGLTR_MIN),
|
(serverDacIndex == D_PWR_IO ? VIO_MIN_MV : POWER_RGLTR_MIN),
|
||||||
(VCHIP_MAX_MV - VCHIP_POWER_INCRMNT));
|
(VCHIP_MAX_MV - VCHIP_POWER_INCRMNT));
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
}
|
} else {
|
||||||
#endif
|
|
||||||
else {
|
|
||||||
setPower(serverDacIndex, val);
|
setPower(serverDacIndex, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ret == OK) {
|
|
||||||
retval = getPower(serverDacIndex);
|
retval = getPower(serverDacIndex);
|
||||||
LOG(logDEBUG1, ("Power regulator(%d): %d\n", ind, retval));
|
LOG(logDEBUG1, ("Power regulator(%d): %d\n", ind, retval));
|
||||||
validate(&ret, mess, val, retval, "set power regulator", DEC);
|
validate(&ret, mess, val, retval, "set power regulator", DEC);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CHIPTESTBOARDD
|
|
||||||
case V_POWER_CHIP:
|
case V_POWER_CHIP:
|
||||||
if (val >= 0) {
|
if (val >= 0) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
@ -1325,8 +1291,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// vlimit
|
#if defined(CHIPTESTBOARDD)
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
case V_LIMIT:
|
case V_LIMIT:
|
||||||
if (val >= 0) {
|
if (val >= 0) {
|
||||||
if (!mV) {
|
if (!mV) {
|
||||||
@ -1360,7 +1325,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) {
|
|||||||
ind, val, getMaxDacSteps());
|
ind, val, getMaxDacSteps());
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else {
|
} else {
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#if defined(CHIPTESTBOARDD)
|
||||||
if ((val != GET_FLAG && mV && checkVLimitCompliant(val) == FAIL) ||
|
if ((val != GET_FLAG && mV && checkVLimitCompliant(val) == FAIL) ||
|
||||||
(val != GET_FLAG && !mV &&
|
(val != GET_FLAG && !mV &&
|
||||||
checkVLimitDacCompliant(val) == FAIL)) {
|
checkVLimitDacCompliant(val) == FAIL)) {
|
||||||
@ -1557,34 +1522,6 @@ int get_adc(int file_des) {
|
|||||||
case SLOW_ADC_TEMP:
|
case SLOW_ADC_TEMP:
|
||||||
serverAdcIndex = S_TMP;
|
serverAdcIndex = S_TMP;
|
||||||
break;
|
break;
|
||||||
#elif XILINX_CHIPTESTBOARDD
|
|
||||||
case TEMPERATURE_FPGA:
|
|
||||||
serverAdcIndex = TEMP_FPGA;
|
|
||||||
break;
|
|
||||||
case SLOW_ADC0:
|
|
||||||
serverAdcIndex = S_ADC0;
|
|
||||||
break;
|
|
||||||
case SLOW_ADC1:
|
|
||||||
serverAdcIndex = S_ADC1;
|
|
||||||
break;
|
|
||||||
case SLOW_ADC2:
|
|
||||||
serverAdcIndex = S_ADC2;
|
|
||||||
break;
|
|
||||||
case SLOW_ADC3:
|
|
||||||
serverAdcIndex = S_ADC3;
|
|
||||||
break;
|
|
||||||
case SLOW_ADC4:
|
|
||||||
serverAdcIndex = S_ADC4;
|
|
||||||
break;
|
|
||||||
case SLOW_ADC5:
|
|
||||||
serverAdcIndex = S_ADC5;
|
|
||||||
break;
|
|
||||||
case SLOW_ADC6:
|
|
||||||
serverAdcIndex = S_ADC6;
|
|
||||||
break;
|
|
||||||
case SLOW_ADC7:
|
|
||||||
serverAdcIndex = S_ADC7;
|
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
modeNotImplemented("Adc Index", (int)ind);
|
modeNotImplemented("Adc Index", (int)ind);
|
||||||
@ -1594,14 +1531,10 @@ int get_adc(int file_des) {
|
|||||||
// valid index
|
// valid index
|
||||||
if (ret == OK) {
|
if (ret == OK) {
|
||||||
LOG(logDEBUG1, ("Getting ADC %d\n", serverAdcIndex));
|
LOG(logDEBUG1, ("Getting ADC %d\n", serverAdcIndex));
|
||||||
#if defined(MYTHEN3D) || defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD)
|
#if defined(MYTHEN3D) || defined(GOTTHARD2D)
|
||||||
ret = getADC(serverAdcIndex, &retval);
|
ret = getADC(serverAdcIndex, &retval);
|
||||||
if (ret == FAIL) {
|
if (ret == FAIL) {
|
||||||
if (ind == TEMPERATURE_FPGA) {
|
|
||||||
strcpy(mess, "Could not get temperature\n");
|
strcpy(mess, "Could not get temperature\n");
|
||||||
} else {
|
|
||||||
strcpy(mess, "Could not get ADC\n");
|
|
||||||
}
|
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else {
|
} else {
|
||||||
LOG(logDEBUG1, ("ADC(%d): %d\n", serverAdcIndex, retval));
|
LOG(logDEBUG1, ("ADC(%d): %d\n", serverAdcIndex, retval));
|
||||||
@ -1691,6 +1624,7 @@ int read_register(int file_des) {
|
|||||||
retval = readRegister(addr);
|
retval = readRegister(addr);
|
||||||
#endif
|
#endif
|
||||||
LOG(logINFO, ("Read register (0x%x): 0x%x\n", addr, retval));
|
LOG(logINFO, ("Read register (0x%x): 0x%x\n", addr, retval));
|
||||||
|
|
||||||
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1894,7 +1828,7 @@ int set_settings(int file_des) {
|
|||||||
if (receiveData(file_des, &isett, sizeof(isett), INT32) < 0)
|
if (receiveData(file_des, &isett, sizeof(isett), INT32) < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
LOG(logDEBUG1, ("Setting settings %d\n", isett));
|
LOG(logDEBUG1, ("Setting settings %d\n", isett));
|
||||||
@ -1973,32 +1907,16 @@ int acquire(int blocking, int file_des) {
|
|||||||
}
|
}
|
||||||
// only set
|
// only set
|
||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
#if defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
if (!isChipConfigured()) {
|
|
||||||
ret = FAIL;
|
|
||||||
strcpy(mess, "Could not start acquisition. Chip is not configured. "
|
|
||||||
"Power it on to configure it.\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else if ((getReadoutMode() == TRANSCEIVER_ONLY ||
|
|
||||||
getReadoutMode() == DIGITAL_AND_TRANSCEIVER) &&
|
|
||||||
(isTransceiverAligned() == 0)) {
|
|
||||||
ret = FAIL;
|
|
||||||
strcpy(mess, "Could not start acquisition. Transceiver not "
|
|
||||||
"aligned. Use configtransceiver command.\n");
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
#if defined(JUNGFRAUD)
|
#if defined(JUNGFRAUD)
|
||||||
// chipv1.1 has to be configured before acquisition
|
// chipv1.1 has to be configured before acquisition
|
||||||
if (getChipVersion() == 11 && !isChipConfigured()) {
|
if (getChipVersion() == 11 && !isChipConfigured()) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
strcpy(mess,
|
strcpy(mess, "Could not start acquisition. Chip is not configured. "
|
||||||
"Could not start acquisition. Chip is not configured. "
|
|
||||||
"Power it on to configure it.\n");
|
"Power it on to configure it.\n");
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
if ((getReadoutMode() == ANALOG_AND_DIGITAL ||
|
if ((getReadoutMode() == ANALOG_AND_DIGITAL ||
|
||||||
getReadoutMode() == ANALOG_ONLY) &&
|
getReadoutMode() == ANALOG_ONLY) &&
|
||||||
(getNumAnalogSamples() <= 0)) {
|
(getNumAnalogSamples() <= 0)) {
|
||||||
@ -2013,8 +1931,7 @@ int acquire(int blocking, int file_des) {
|
|||||||
getReadoutMode() == DIGITAL_AND_TRANSCEIVER) &&
|
getReadoutMode() == DIGITAL_AND_TRANSCEIVER) &&
|
||||||
(getNumDigitalSamples() <= 0)) {
|
(getNumDigitalSamples() <= 0)) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
sprintf(
|
sprintf(mess,
|
||||||
mess,
|
|
||||||
"Could not start acquisition. Invalid number of digital "
|
"Could not start acquisition. Invalid number of digital "
|
||||||
"samples: %d.\n",
|
"samples: %d.\n",
|
||||||
getNumDigitalSamples());
|
getNumDigitalSamples());
|
||||||
@ -2023,9 +1940,9 @@ int acquire(int blocking, int file_des) {
|
|||||||
getReadoutMode() == DIGITAL_AND_TRANSCEIVER) &&
|
getReadoutMode() == DIGITAL_AND_TRANSCEIVER) &&
|
||||||
(getNumTransceiverSamples() <= 0)) {
|
(getNumTransceiverSamples() <= 0)) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
sprintf(mess,
|
sprintf(
|
||||||
"Could not start acquisition. Invalid number of "
|
mess,
|
||||||
"transceiver "
|
"Could not start acquisition. Invalid number of transceiver "
|
||||||
"samples: %d.\n",
|
"samples: %d.\n",
|
||||||
getNumTransceiverSamples());
|
getNumTransceiverSamples());
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
@ -2039,8 +1956,7 @@ int acquire(int blocking, int file_des) {
|
|||||||
char src_mac[MAC_ADDRESS_SIZE];
|
char src_mac[MAC_ADDRESS_SIZE];
|
||||||
getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac);
|
getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, sourcemac);
|
||||||
sprintf(mess,
|
sprintf(mess,
|
||||||
"Invalid udp source mac address for this detector. "
|
"Invalid udp source mac address for this detector. Must be "
|
||||||
"Must be "
|
|
||||||
"same as hardware detector mac address %s\n",
|
"same as hardware detector mac address %s\n",
|
||||||
src_mac);
|
src_mac);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
@ -2050,10 +1966,8 @@ int acquire(int blocking, int file_des) {
|
|||||||
uint32_t sourceip = getDetectorIP();
|
uint32_t sourceip = getDetectorIP();
|
||||||
char src_ip[INET_ADDRSTRLEN];
|
char src_ip[INET_ADDRSTRLEN];
|
||||||
getIpAddressinString(src_ip, sourceip);
|
getIpAddressinString(src_ip, sourceip);
|
||||||
sprintf(
|
sprintf(mess,
|
||||||
mess,
|
"Invalid udp source ip address for this detector. Must be "
|
||||||
"Invalid udp source ip address for this detector. Must "
|
|
||||||
"be "
|
|
||||||
"same as hardware detector ip address %s in 1G readout "
|
"same as hardware detector ip address %s in 1G readout "
|
||||||
"mode \n",
|
"mode \n",
|
||||||
src_ip);
|
src_ip);
|
||||||
@ -2067,8 +1981,7 @@ int acquire(int blocking, int file_des) {
|
|||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else if (sharedMemory_getScanStatus() == RUNNING) {
|
} else if (sharedMemory_getScanStatus() == RUNNING) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
strcpy(mess,
|
strcpy(mess, "Could not start acquisition because a scan is "
|
||||||
"Could not start acquisition because a scan is "
|
|
||||||
"already running!\n");
|
"already running!\n");
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else {
|
} else {
|
||||||
@ -2083,8 +1996,7 @@ int acquire(int blocking, int file_des) {
|
|||||||
} else {
|
} else {
|
||||||
// wait for blocking always (scan or not)
|
// wait for blocking always (scan or not)
|
||||||
// non blocking-no scan also wait (for error message)
|
// non blocking-no scan also wait (for error message)
|
||||||
// non blcoking-scan dont wait (there is
|
// non blcoking-scan dont wait (there is scanErrorMessage)
|
||||||
// scanErrorMessage)
|
|
||||||
if (blocking || !scan) {
|
if (blocking || !scan) {
|
||||||
pthread_join(pthread_tid, NULL);
|
pthread_join(pthread_tid, NULL);
|
||||||
}
|
}
|
||||||
@ -2107,7 +2019,6 @@ void *start_state_machine(void *arg) {
|
|||||||
if (scan == 0) {
|
if (scan == 0) {
|
||||||
LOG(logINFOBLUE, ("Normal Acquisition (not scan)\n"));
|
LOG(logINFOBLUE, ("Normal Acquisition (not scan)\n"));
|
||||||
}
|
}
|
||||||
#ifndef XILINX_CHIPTESTBOARDD
|
|
||||||
// scan
|
// scan
|
||||||
else {
|
else {
|
||||||
// check scan stop
|
// check scan stop
|
||||||
@ -2150,7 +2061,6 @@ void *start_state_machine(void *arg) {
|
|||||||
}
|
}
|
||||||
usleep(scanSettleTime_ns / 1000);
|
usleep(scanSettleTime_ns / 1000);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
ret = startStateMachine();
|
ret = startStateMachine();
|
||||||
LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret));
|
LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret));
|
||||||
if (ret == FAIL) {
|
if (ret == FAIL) {
|
||||||
@ -2437,7 +2347,7 @@ int get_num_analog_samples(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if !defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -2456,7 +2366,7 @@ int set_num_analog_samples(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Setting number of analog samples %d\n", arg));
|
LOG(logDEBUG1, ("Setting number of analog samples %d\n", arg));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if !defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -2486,7 +2396,7 @@ int get_num_digital_samples(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if !defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -2505,7 +2415,7 @@ int set_num_digital_samples(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Setting number of digital samples %d\n", arg));
|
LOG(logDEBUG1, ("Setting number of digital samples %d\n", arg));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if !defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -2683,8 +2593,7 @@ int get_delay_after_trigger(int file_des) {
|
|||||||
int64_t retval = -1;
|
int64_t retval = -1;
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && \
|
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -2706,8 +2615,7 @@ int set_delay_after_trigger(int file_des) {
|
|||||||
("Setting delay after trigger %lld ns\n", (long long int)arg));
|
("Setting delay after trigger %lld ns\n", (long long int)arg));
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && \
|
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -2917,8 +2825,7 @@ int get_frames_left(int file_des) {
|
|||||||
int64_t retval = -1;
|
int64_t retval = -1;
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && \
|
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -2934,8 +2841,7 @@ int get_triggers_left(int file_des) {
|
|||||||
int64_t retval = -1;
|
int64_t retval = -1;
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && \
|
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -2965,9 +2871,9 @@ int get_period_left(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
int64_t retval = -1;
|
int64_t retval = -1;
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && \
|
!defined(GOTTHARDD) /* && !defined(CHIPTESTBOARDD) \
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
&& !defined(MYTHEN3D) && !defined(GOTTHARD2D)*/
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -2982,9 +2888,9 @@ int get_delay_after_trigger_left(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
int64_t retval = -1;
|
int64_t retval = -1;
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) && \
|
!defined(GOTTHARDD) /* && !defined(CHIPTESTBOARDD) \
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
&& !defined(MYTHEN3D) && !defined(GOTTHARD2D)*/
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -3032,8 +2938,7 @@ int get_frames_from_start(int file_des) {
|
|||||||
int64_t retval = -1;
|
int64_t retval = -1;
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \
|
||||||
!defined(MYTHEN3D) && !defined(GOTTHARD2D) && \
|
!defined(MYTHEN3D) && !defined(GOTTHARD2D)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -3049,8 +2954,7 @@ int get_actual_time(int file_des) {
|
|||||||
int64_t retval = -1;
|
int64_t retval = -1;
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \
|
||||||
!defined(MYTHEN3D) && !defined(GOTTHARD2D) && \
|
!defined(MYTHEN3D) && !defined(GOTTHARD2D)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -3066,8 +2970,7 @@ int get_measurement_time(int file_des) {
|
|||||||
int64_t retval = -1;
|
int64_t retval = -1;
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \
|
||||||
!defined(MYTHEN3D) && !defined(GOTTHARD2D) && \
|
!defined(MYTHEN3D) && !defined(GOTTHARD2D)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -3108,8 +3011,7 @@ int set_dynamic_range(int file_des) {
|
|||||||
case 32:
|
case 32:
|
||||||
#endif
|
#endif
|
||||||
#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \
|
#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \
|
||||||
defined(CHIPTESTBOARDD) || defined(GOTTHARD2D) || \
|
defined(CHIPTESTBOARDD) || defined(GOTTHARD2D)
|
||||||
defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
case 16:
|
case 16:
|
||||||
#endif
|
#endif
|
||||||
if (dr >= 0) {
|
if (dr >= 0) {
|
||||||
@ -3251,7 +3153,7 @@ int enable_ten_giga(int file_des) {
|
|||||||
LOG(logDEBUG, ("Setting 10GbE: %d\n", arg));
|
LOG(logDEBUG, ("Setting 10GbE: %d\n", arg));
|
||||||
|
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARDD) || \
|
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARDD) || \
|
||||||
defined(GOTTHARD2D) || defined(XILINX_CHIPTESTBOARDD)
|
defined(GOTTHARD2D)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// set & get
|
// set & get
|
||||||
@ -3348,7 +3250,7 @@ int set_pattern_io_control(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();
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if !defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
LOG(logDEBUG1,
|
LOG(logDEBUG1,
|
||||||
@ -3365,7 +3267,7 @@ int get_pattern_io_control(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
uint64_t retval64 = -1;
|
uint64_t retval64 = -1;
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if !defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
LOG(logDEBUG1, ("Getting Pattern IO Control\n"));
|
LOG(logDEBUG1, ("Getting Pattern IO Control\n"));
|
||||||
@ -3382,8 +3284,7 @@ int set_pattern_word(int file_des) {
|
|||||||
|
|
||||||
if (receiveData(file_des, args, sizeof(args), INT64) < 0)
|
if (receiveData(file_des, args, sizeof(args), INT64) < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
int addr = (int)args[0];
|
int addr = (int)args[0];
|
||||||
@ -3411,8 +3312,7 @@ int set_pattern_loop_addresses(int file_des) {
|
|||||||
|
|
||||||
if (receiveData(file_des, args, sizeof(args), INT32) < 0)
|
if (receiveData(file_des, args, sizeof(args), INT32) < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
int loopLevel = args[0];
|
int loopLevel = args[0];
|
||||||
@ -3458,8 +3358,7 @@ int set_pattern_loop_cycles(int file_des) {
|
|||||||
|
|
||||||
if (receiveData(file_des, args, sizeof(args), INT32) < 0)
|
if (receiveData(file_des, args, sizeof(args), INT32) < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
int loopLevel = args[0];
|
int loopLevel = args[0];
|
||||||
@ -3488,8 +3387,7 @@ int set_pattern_wait_addr(int file_des) {
|
|||||||
|
|
||||||
if (receiveData(file_des, args, sizeof(args), INT32) < 0)
|
if (receiveData(file_des, args, sizeof(args), INT32) < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
int loopLevel = args[0];
|
int loopLevel = args[0];
|
||||||
@ -3518,8 +3416,7 @@ int set_pattern_wait_time(int file_des) {
|
|||||||
|
|
||||||
if (receiveData(file_des, args, sizeof(args), INT32) < 0)
|
if (receiveData(file_des, args, sizeof(args), INT32) < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
int loopLevel = (int)args[0];
|
int loopLevel = (int)args[0];
|
||||||
@ -3549,8 +3446,7 @@ int set_pattern_mask(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Set Pattern Mask to %d\n", arg));
|
LOG(logDEBUG1, ("Set Pattern Mask to %d\n", arg));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -3578,8 +3474,7 @@ int get_pattern_mask(int file_des) {
|
|||||||
|
|
||||||
LOG(logDEBUG1, ("Get Pattern Mask\n"));
|
LOG(logDEBUG1, ("Get Pattern Mask\n"));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only get
|
// only get
|
||||||
@ -3600,8 +3495,7 @@ int set_pattern_bit_mask(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Set Pattern Bit Mask to %d\n", arg));
|
LOG(logDEBUG1, ("Set Pattern Bit Mask to %d\n", arg));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -3630,8 +3524,7 @@ int get_pattern_bit_mask(int file_des) {
|
|||||||
|
|
||||||
LOG(logDEBUG1, ("Get Pattern Bit Mask\n"));
|
LOG(logDEBUG1, ("Get Pattern Bit Mask\n"));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only get
|
// only get
|
||||||
@ -3654,8 +3547,7 @@ int write_adc_register(int file_des) {
|
|||||||
uint32_t val = args[1];
|
uint32_t val = args[1];
|
||||||
LOG(logDEBUG1, ("Writing 0x%x to ADC Register 0x%x\n", val, addr));
|
LOG(logDEBUG1, ("Writing 0x%x to ADC Register 0x%x\n", val, addr));
|
||||||
|
|
||||||
#if defined(EIGERD) || defined(GOTTHARD2D) || defined(MYTHEN3D) || \
|
#if defined(EIGERD) || defined(GOTTHARD2D) || defined(MYTHEN3D)
|
||||||
defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
#ifndef VIRTUAL
|
#ifndef VIRTUAL
|
||||||
@ -4092,7 +3984,7 @@ int power_chip(int file_des) {
|
|||||||
LOG(logDEBUG1, ("Powering chip to %d\n", arg));
|
LOG(logDEBUG1, ("Powering chip to %d\n", arg));
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(MYTHEN3D) && \
|
#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(MYTHEN3D) && \
|
||||||
!defined(GOTTHARD2D) && !defined(XILINX_CHIPTESTBOARDD)
|
!defined(GOTTHARD2D)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// set & get
|
// set & get
|
||||||
@ -4111,30 +4003,11 @@ int power_chip(int file_des) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef XILINX_CHIPTESTBOARDD
|
|
||||||
if (ret == OK) {
|
|
||||||
if (arg != -1) {
|
|
||||||
if (arg != 0 && arg != 1) {
|
|
||||||
ret = FAIL;
|
|
||||||
sprintf(mess, "Power chip %d should be 0 or 1\n", arg);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
ret = powerChip(arg, mess);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ret == OK) {
|
|
||||||
retval = getPowerChip();
|
|
||||||
LOG(logDEBUG1, ("Power chip: %d\n", retval));
|
|
||||||
validate(&ret, mess, arg, retval, "power on/off chip", DEC);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (ret == OK) {
|
if (ret == OK) {
|
||||||
retval = powerChip(arg);
|
retval = powerChip(arg);
|
||||||
LOG(logDEBUG1, ("Power chip: %d\n", retval));
|
LOG(logDEBUG1, ("Power chip: %d\n", retval));
|
||||||
}
|
}
|
||||||
validate(&ret, mess, arg, retval, "power on/off chip", DEC);
|
validate(&ret, mess, arg, retval, "power on/off chip", DEC);
|
||||||
#endif
|
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD)
|
#if defined(JUNGFRAUD) || defined(MOENCHD)
|
||||||
// narrow down error when powering on
|
// narrow down error when powering on
|
||||||
if (ret == FAIL && arg > 0) {
|
if (ret == FAIL && arg > 0) {
|
||||||
@ -4449,7 +4322,7 @@ int reboot_controller(int file_des) {
|
|||||||
ret = OK;
|
ret = OK;
|
||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
|
|
||||||
#if defined(EIGERD)
|
#ifdef EIGERD
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#elif VIRTUAL
|
#elif VIRTUAL
|
||||||
ret = GOODBYE;
|
ret = GOODBYE;
|
||||||
@ -4530,7 +4403,7 @@ int set_adc_enable_mask_10g(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Seting 10Gb ADC Enable Mask to %u\n", arg));
|
LOG(logDEBUG1, ("Seting 10Gb ADC Enable Mask to %u\n", arg));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if (!defined(CHIPTESTBOARDD))
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -4557,7 +4430,7 @@ int get_adc_enable_mask_10g(int file_des) {
|
|||||||
|
|
||||||
LOG(logDEBUG1, ("Getting 10Gb ADC Enable Mask\n"));
|
LOG(logDEBUG1, ("Getting 10Gb ADC Enable Mask\n"));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if (!defined(CHIPTESTBOARDD))
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get
|
// get
|
||||||
@ -4680,7 +4553,7 @@ int set_next_frame_number(int file_des) {
|
|||||||
LOG(logDEBUG1, ("Setting next frame number to %llu\n", arg));
|
LOG(logDEBUG1, ("Setting next frame number to %llu\n", arg));
|
||||||
|
|
||||||
#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
!defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -4730,7 +4603,7 @@ int set_next_frame_number(int file_des) {
|
|||||||
} else {
|
} else {
|
||||||
if (arg != retval) {
|
if (arg != retval) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
#if defined(VIRTUAL) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef VIRTUAL
|
||||||
sprintf(mess,
|
sprintf(mess,
|
||||||
"Could not set next frame number. Set "
|
"Could not set next frame number. Set "
|
||||||
"0x%lx, but read 0x%lx\n",
|
"0x%lx, but read 0x%lx\n",
|
||||||
@ -4759,7 +4632,7 @@ 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(MOENCHD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
!defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get
|
// get
|
||||||
@ -5232,6 +5105,7 @@ int get_source_udp_ip(int file_des) {
|
|||||||
retval = udpDetails[0].srcip;
|
retval = udpDetails[0].srcip;
|
||||||
retval = __builtin_bswap32(retval);
|
retval = __builtin_bswap32(retval);
|
||||||
LOG(logDEBUG1, ("udp soure ip retval: 0x%x\n", retval));
|
LOG(logDEBUG1, ("udp soure ip retval: 0x%x\n", retval));
|
||||||
|
|
||||||
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5313,6 +5187,7 @@ int get_dest_udp_ip(int file_des) {
|
|||||||
retval = udpDetails[0].dstip;
|
retval = udpDetails[0].dstip;
|
||||||
retval = __builtin_bswap32(retval);
|
retval = __builtin_bswap32(retval);
|
||||||
LOG(logDEBUG1, ("udp destination ip retval: 0x%x\n", retval));
|
LOG(logDEBUG1, ("udp destination ip retval: 0x%x\n", retval));
|
||||||
|
|
||||||
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5397,9 +5272,11 @@ int get_source_udp_mac(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
uint64_t retval = -1;
|
uint64_t retval = -1;
|
||||||
LOG(logDEBUG1, ("Getting udp source mac\n"));
|
LOG(logDEBUG1, ("Getting udp source mac\n"));
|
||||||
|
|
||||||
// get only
|
// get only
|
||||||
retval = udpDetails[0].srcmac;
|
retval = udpDetails[0].srcmac;
|
||||||
LOG(logDEBUG1, ("udp soure mac retval: 0x%lx\n", retval));
|
LOG(logDEBUG1, ("udp soure mac retval: 0x%lx\n", retval));
|
||||||
|
|
||||||
return Server_SendResult(file_des, INT64, &retval, sizeof(retval));
|
return Server_SendResult(file_des, INT64, &retval, sizeof(retval));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5473,9 +5350,11 @@ int get_dest_udp_mac(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
uint64_t retval = -1;
|
uint64_t retval = -1;
|
||||||
LOG(logDEBUG1, ("Getting udp destination mac\n"));
|
LOG(logDEBUG1, ("Getting udp destination mac\n"));
|
||||||
|
|
||||||
// get only
|
// get only
|
||||||
retval = udpDetails[0].dstmac;
|
retval = udpDetails[0].dstmac;
|
||||||
LOG(logDEBUG1, ("udp destination mac retval: 0x%lx\n", retval));
|
LOG(logDEBUG1, ("udp destination mac retval: 0x%lx\n", retval));
|
||||||
|
|
||||||
return Server_SendResult(file_des, INT64, &retval, sizeof(retval));
|
return Server_SendResult(file_des, INT64, &retval, sizeof(retval));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5546,9 +5425,11 @@ int get_dest_udp_port(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
uint16_t retval = -1;
|
uint16_t retval = -1;
|
||||||
LOG(logDEBUG1, ("Getting destination port"));
|
LOG(logDEBUG1, ("Getting destination port"));
|
||||||
|
|
||||||
// get only
|
// get only
|
||||||
retval = udpDetails[0].dstport;
|
retval = udpDetails[0].dstport;
|
||||||
LOG(logDEBUG, ("udp destination port retval: %hu\n", retval));
|
LOG(logDEBUG, ("udp destination port retval: %hu\n", retval));
|
||||||
|
|
||||||
return Server_SendResult(file_des, INT16, &retval, sizeof(retval));
|
return Server_SendResult(file_des, INT16, &retval, sizeof(retval));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5676,6 +5557,7 @@ int get_num_interfaces(int file_des) {
|
|||||||
|
|
||||||
// get only
|
// get only
|
||||||
retval = getNumberofUDPInterfaces();
|
retval = getNumberofUDPInterfaces();
|
||||||
|
|
||||||
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));
|
||||||
}
|
}
|
||||||
@ -5837,7 +5719,7 @@ int set_readout_mode(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logINFO, ("Setting readout mode: %u\n", arg));
|
LOG(logINFO, ("Setting readout mode: %u\n", arg));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#ifndef CHIPTESTBOARDD
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -5883,7 +5765,7 @@ int get_readout_mode(int file_des) {
|
|||||||
|
|
||||||
LOG(logDEBUG1, ("Getting readout mode\n"));
|
LOG(logDEBUG1, ("Getting readout mode\n"));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#ifndef CHIPTESTBOARDD
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -7106,7 +6988,7 @@ int get_num_channels(int file_des) {
|
|||||||
|
|
||||||
LOG(logDEBUG1, ("Getting number of channels\n"));
|
LOG(logDEBUG1, ("Getting number of channels\n"));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if !defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -7261,7 +7143,7 @@ int get_receiver_parameters(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
|
||||||
// analog samples
|
// analog samples
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#if defined(CHIPTESTBOARDD)
|
||||||
i32 = getNumAnalogSamples();
|
i32 = getNumAnalogSamples();
|
||||||
#else
|
#else
|
||||||
i32 = 0;
|
i32 = 0;
|
||||||
@ -7271,7 +7153,7 @@ int get_receiver_parameters(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
|
||||||
// digital samples
|
// digital samples
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
i32 = getNumDigitalSamples();
|
i32 = getNumDigitalSamples();
|
||||||
#else
|
#else
|
||||||
i32 = 0;
|
i32 = 0;
|
||||||
@ -7410,7 +7292,7 @@ int get_receiver_parameters(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
|
||||||
// readout mode
|
// readout mode
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
i32 = getReadoutMode();
|
i32 = getReadoutMode();
|
||||||
#else
|
#else
|
||||||
i32 = 0;
|
i32 = 0;
|
||||||
@ -7430,7 +7312,7 @@ int get_receiver_parameters(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
|
||||||
// 10g adc mask
|
// 10g adc mask
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#if defined(CHIPTESTBOARDD)
|
||||||
u32 = getADCEnableMask_10G();
|
u32 = getADCEnableMask_10G();
|
||||||
#else
|
#else
|
||||||
u32 = 0;
|
u32 = 0;
|
||||||
@ -7575,7 +7457,7 @@ int get_receiver_parameters(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
|
||||||
// transceiver samples
|
// transceiver samples
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
i32 = getNumTransceiverSamples();
|
i32 = getNumTransceiverSamples();
|
||||||
#else
|
#else
|
||||||
i32 = 0;
|
i32 = 0;
|
||||||
@ -7585,7 +7467,7 @@ int get_receiver_parameters(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
|
||||||
// transceiver mask
|
// transceiver mask
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#if defined(CHIPTESTBOARDD)
|
||||||
u32 = getTransceiverEnableMask();
|
u32 = getTransceiverEnableMask();
|
||||||
#else
|
#else
|
||||||
u32 = 0;
|
u32 = 0;
|
||||||
@ -7595,6 +7477,7 @@ int get_receiver_parameters(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
|
||||||
LOG(logINFO, ("Sent %d bytes for receiver parameters\n", n));
|
LOG(logINFO, ("Sent %d bytes for receiver parameters\n", n));
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7823,8 +7706,7 @@ int set_pattern(int file_des) {
|
|||||||
char args[MAX_STR_LENGTH];
|
char args[MAX_STR_LENGTH];
|
||||||
memset(args, 0, MAX_STR_LENGTH);
|
memset(args, 0, MAX_STR_LENGTH);
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@ -7861,8 +7743,7 @@ int get_pattern_file(int file_des) {
|
|||||||
|
|
||||||
LOG(logDEBUG1, ("Getting pattern file name\n"));
|
LOG(logDEBUG1, ("Getting pattern file name\n"));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -7876,8 +7757,7 @@ int get_pattern(int file_des) {
|
|||||||
ret = OK;
|
ret = OK;
|
||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D)
|
||||||
!defined(MYTHEN3D)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
return Server_SendResult(file_des, INT32, NULL, 0);
|
||||||
#else
|
#else
|
||||||
@ -8433,8 +8313,7 @@ int get_bursts_left(int file_des) {
|
|||||||
int start_readout(int file_des) {
|
int start_readout(int file_des) {
|
||||||
ret = OK;
|
ret = OK;
|
||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
#if !defined(MYTHEN3D) && !defined(CHIPTESTBOARDD) && \
|
#if !defined(MYTHEN3D) && !defined(CHIPTESTBOARDD)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
@ -8498,7 +8377,7 @@ int reset_to_default_dacs(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Resetting dacs to defaults (hard reset: %d)\n", arg));
|
LOG(logDEBUG1, ("Resetting dacs to defaults (hard reset: %d)\n", arg));
|
||||||
|
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
@ -8913,7 +8792,7 @@ int get_default_dac(int file_des) {
|
|||||||
LOG(logDEBUG1,
|
LOG(logDEBUG1,
|
||||||
("Getting default dac [dacindex:%d, settings: %d]\n", dacindex, sett));
|
("Getting default dac [dacindex:%d, settings: %d]\n", dacindex, sett));
|
||||||
|
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -8953,7 +8832,7 @@ int set_default_dac(int file_des) {
|
|||||||
LOG(logDEBUG1, ("Setting default dac [dacindex: %d, settings: %d] to %d\n",
|
LOG(logDEBUG1, ("Setting default dac [dacindex: %d, settings: %d] to %d\n",
|
||||||
(int)dacindex, (int)sett, value));
|
(int)dacindex, (int)sett, value));
|
||||||
|
|
||||||
#if defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef CHIPTESTBOARDD
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -9573,7 +9452,6 @@ int clear_all_udp_dst(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
|
|
||||||
LOG(logINFO, ("Clearing all udp destinations\n"));
|
LOG(logINFO, ("Clearing all udp destinations\n"));
|
||||||
|
|
||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
if (check_detector_idle("clear all udp destinations") == OK) {
|
if (check_detector_idle("clear all udp destinations") == OK) {
|
||||||
memset(udpDetails, 0, sizeof(udpDetails));
|
memset(udpDetails, 0, sizeof(udpDetails));
|
||||||
@ -9759,7 +9637,7 @@ int get_kernel_version(int file_des) {
|
|||||||
int update_kernel(int file_des) {
|
int update_kernel(int file_des) {
|
||||||
ret = OK;
|
ret = OK;
|
||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
#if defined(EIGERD) || defined(XILINX_CHIPTESTBOARDD)
|
#ifdef EIGERD
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
return Server_SendResult(file_des, INT32, NULL, 0);
|
||||||
#else
|
#else
|
||||||
@ -9811,8 +9689,7 @@ 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) && \
|
#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
int forceDeleteNormalFile = 0;
|
int forceDeleteNormalFile = 0;
|
||||||
if (receiveData(file_des, &forceDeleteNormalFile,
|
if (receiveData(file_des, &forceDeleteNormalFile,
|
||||||
sizeof(forceDeleteNormalFile), INT32) < 0)
|
sizeof(forceDeleteNormalFile), INT32) < 0)
|
||||||
@ -9848,8 +9725,7 @@ int receive_program(int file_des, enum PROGRAM_INDEX index) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ret == OK) {
|
if (ret == OK) {
|
||||||
#if defined(GOTTHARD2D) || defined(MYTHEN3D) || defined(EIGERD) || \
|
#if defined(GOTTHARD2D) || defined(MYTHEN3D) || defined(EIGERD)
|
||||||
defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
receive_program_default(file_des, index, functionType, filesize,
|
receive_program_default(file_des, index, functionType, filesize,
|
||||||
checksum, serverName);
|
checksum, serverName);
|
||||||
#else
|
#else
|
||||||
@ -9995,8 +9871,7 @@ void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index,
|
|||||||
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) {
|
||||||
#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD) && \
|
#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) && !defined(EIGERD)
|
||||||
!defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
sprintf(mess,
|
sprintf(mess,
|
||||||
"Could not %s. program via blackfin not implmented for this "
|
"Could not %s. program via blackfin not implmented for this "
|
||||||
@ -10514,10 +10389,8 @@ int get_hardware_version(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
char retvals[MAX_STR_LENGTH];
|
char retvals[MAX_STR_LENGTH];
|
||||||
memset(retvals, 0, MAX_STR_LENGTH);
|
memset(retvals, 0, MAX_STR_LENGTH);
|
||||||
|
|
||||||
getHardwareVersion(retvals);
|
getHardwareVersion(retvals);
|
||||||
LOG(logDEBUG1, ("hardware version retval: %s\n", retvals));
|
LOG(logDEBUG1, ("hardware version retval: %s\n", retvals));
|
||||||
|
|
||||||
return Server_SendResult(file_des, OTHER, retvals, sizeof(retvals));
|
return Server_SendResult(file_des, OTHER, retvals, sizeof(retvals));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10691,7 +10564,7 @@ int get_num_transceiver_samples(int file_des) {
|
|||||||
memset(mess, 0, sizeof(mess));
|
memset(mess, 0, sizeof(mess));
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if !defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get only
|
// get only
|
||||||
@ -10710,24 +10583,16 @@ int set_num_transceiver_samples(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Setting number of transceiver samples %d\n", arg));
|
LOG(logDEBUG1, ("Setting number of transceiver samples %d\n", arg));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if !defined(CHIPTESTBOARDD)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
if (arg < 0 || arg > MAX_TRANSCEIVER_SAMPLES) {
|
|
||||||
ret = FAIL;
|
|
||||||
sprintf(mess,
|
|
||||||
"Could not set number of transceiver samples. Invalid "
|
|
||||||
"value %d. Must be 0-%d\n",
|
|
||||||
arg, MAX_TRANSCEIVER_SAMPLES);
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
} else {
|
|
||||||
ret = setNumTransceiverSamples(arg);
|
ret = setNumTransceiverSamples(arg);
|
||||||
if (ret == FAIL) {
|
if (ret == FAIL) {
|
||||||
sprintf(mess,
|
sprintf(
|
||||||
"Could not set number of transceiver samples to %d. "
|
mess,
|
||||||
"Could not "
|
"Could not set number of transceiver samples to %d. Could not "
|
||||||
"allocate RAM\n",
|
"allocate RAM\n",
|
||||||
arg);
|
arg);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
@ -10738,7 +10603,6 @@ int set_num_transceiver_samples(int file_des) {
|
|||||||
"set number of transceiver samples", DEC);
|
"set number of transceiver samples", DEC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
return Server_SendResult(file_des, INT32, NULL, 0);
|
||||||
}
|
}
|
||||||
@ -10752,14 +10616,14 @@ int set_transceiver_enable(int file_des) {
|
|||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
LOG(logDEBUG1, ("Setting Transceiver Enable Mask to %u\n", arg));
|
LOG(logDEBUG1, ("Setting Transceiver Enable Mask to %u\n", arg));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if (!defined(CHIPTESTBOARDD))
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
if (arg > MAX_TRANSCEIVER_MASK) {
|
if (arg > MAX_TRANSCEIVER_MASK) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
sprintf(mess, "Invalid Transceiver Mask. Option: 0 - 0x%x\n",
|
sprintf(mess, "Invalid Transceiver Mask. Max: 0x%x\n",
|
||||||
MAX_TRANSCEIVER_MASK);
|
MAX_TRANSCEIVER_MASK);
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else {
|
} else {
|
||||||
@ -10794,7 +10658,7 @@ int get_transceiver_enable(int file_des) {
|
|||||||
|
|
||||||
LOG(logDEBUG1, ("Getting Transceiver Enable Mask \n"));
|
LOG(logDEBUG1, ("Getting Transceiver Enable Mask \n"));
|
||||||
|
|
||||||
#if !defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
#if (!defined(CHIPTESTBOARDD))
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get
|
// get
|
||||||
@ -11031,21 +10895,3 @@ int set_pedestal_mode(int file_des) {
|
|||||||
#endif
|
#endif
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
return Server_SendResult(file_des, INT32, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int config_transceiver(int file_des) {
|
|
||||||
ret = OK;
|
|
||||||
memset(mess, 0, sizeof(mess));
|
|
||||||
|
|
||||||
#if !defined(XILINX_CHIPTESTBOARDD)
|
|
||||||
functionNotImplemented();
|
|
||||||
#else
|
|
||||||
if (Server_VerifyLock() == OK) {
|
|
||||||
LOG(logINFO, ("Configuring Transceiver\n"));
|
|
||||||
ret = configureTransceiver(mess);
|
|
||||||
if (ret == FAIL) {
|
|
||||||
LOG(logERROR, (mess));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return Server_SendResult(file_des, INT32, NULL, 0);
|
|
||||||
}
|
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
add_executable(xilinx_ctbDetectorServer_virtual
|
|
||||||
slsDetectorFunctionList.c
|
|
||||||
../slsDetectorServer/src/slsDetectorServer.c
|
|
||||||
../slsDetectorServer/src/slsDetectorServer_funcs.c
|
|
||||||
../slsDetectorServer/src/communication_funcs.c
|
|
||||||
../slsDetectorServer/src/arm64.c
|
|
||||||
../slsDetectorServer/src/common.c
|
|
||||||
../slsDetectorServer/src/sharedMemory.c
|
|
||||||
../slsDetectorServer/src/loadPattern.c
|
|
||||||
../slsDetectorServer/src/programViaArm.c
|
|
||||||
../slsDetectorServer/src/communication_funcs_UDP.c
|
|
||||||
../../slsSupportLib/src/md5.c
|
|
||||||
../slsDetectorServer/src/LTC2620_Driver.c
|
|
||||||
)
|
|
||||||
|
|
||||||
include_directories(
|
|
||||||
../slsDetectorServer/include
|
|
||||||
../../slsSupportLib/include
|
|
||||||
../../slsDetectorSoftware/include/sls/
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(xilinx_ctbDetectorServer_virtual
|
|
||||||
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
target_compile_definitions(xilinx_ctbDetectorServer_virtual
|
|
||||||
PUBLIC XILINX_CHIPTESTBOARDD ARMPROCESSOR VIRTUAL STOP_SERVER
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(xilinx_ctbDetectorServer_virtual
|
|
||||||
PUBLIC pthread rt m slsProjectCSettings
|
|
||||||
)
|
|
||||||
|
|
||||||
set_target_properties(xilinx_ctbDetectorServer_virtual PROPERTIES
|
|
||||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
|
||||||
)
|
|
||||||
|
|
||||||
install(TARGETS xilinx_ctbDetectorServer_virtual
|
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
)
|
|
@ -1,47 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
current_dir = $(shell pwd)
|
|
||||||
main_inc = ../slsDetectorServer/include/
|
|
||||||
main_src = ../slsDetectorServer/src/
|
|
||||||
support_lib = ../../slsSupportLib/include/
|
|
||||||
det_lib = ../../slsDetectorSoftware/include/sls/
|
|
||||||
md5_dir = ../../slsSupportLib/src/
|
|
||||||
|
|
||||||
CROSS = aarch64-none-linux-gnu-
|
|
||||||
CC = $(CROSS)gcc
|
|
||||||
#TODO: allow these warnings and fix code
|
|
||||||
CFLAGS += -Wall -std=gnu99 -Wno-format-overflow -Wno-format-truncation -DXILINX_CHIPTESTBOARDD -DARMPROCESSOR -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE
|
|
||||||
#CFLAGS += -Wall -std=gnu99 -DXILINX_CHIPTESTBOARDD -DARMPROCESSOR -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE
|
|
||||||
LDLIBS += -lm -lrt -pthread
|
|
||||||
PROGS = xilinx_ctbDetectorServer
|
|
||||||
DESTDIR ?= bin
|
|
||||||
INSTMODE = 0777
|
|
||||||
|
|
||||||
SRCS = slsDetectorFunctionList.c
|
|
||||||
SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)arm64.c $(main_src)common.c $(main_src)/sharedMemory.c $(main_src)/loadPattern.c $(md5_dir)md5.c $(main_src)programViaArm.c $(main_src)LTC2620_Driver.c
|
|
||||||
|
|
||||||
OBJS = $(SRCS:.c=.o)
|
|
||||||
|
|
||||||
all: clean $(PROGS)
|
|
||||||
version: clean versioning $(PROGS)
|
|
||||||
|
|
||||||
boot: $(OBJS)
|
|
||||||
|
|
||||||
version_branch=$(API_BRANCH)
|
|
||||||
version_name=APIXILINXCTB
|
|
||||||
version_path=slsDetectorServers/xilinx_ctbDetectorServer
|
|
||||||
versioning:
|
|
||||||
cd ../../ && echo $(PWD) && echo `tput setaf 6; ./updateAPIVersion.sh $(version_name) $(version_path) $(version_branch); tput sgr0;`
|
|
||||||
|
|
||||||
|
|
||||||
$(PROGS): $(OBJS)
|
|
||||||
# echo $(OBJS)
|
|
||||||
mkdir -p $(DESTDIR)
|
|
||||||
$(CC) -o $@ $^ $(CFLAGS) $(LDLIBS)
|
|
||||||
mv $(PROGS) $(DESTDIR)
|
|
||||||
rm $(main_src)*.o $(md5_dir)*.o
|
|
||||||
clean:
|
|
||||||
rm -rf $(DESTDIR)/$(PROGS) *.o *.gdb $(main_src)*.o $(md5_dir)*.o
|
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -1,145 +0,0 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#pragma once
|
|
||||||
#include "RegisterDefs.h"
|
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
|
|
||||||
#define REQRD_FRMWRE_VRSN (0x230710)
|
|
||||||
#define KERNEL_DATE_VRSN "Wed Nov 29 17:32:14 CET 2023"
|
|
||||||
|
|
||||||
#define LINKED_SERVER_NAME "xilinx_ctbDetectorServer"
|
|
||||||
|
|
||||||
#define CTRL_SRVR_INIT_TIME_US (2 * 1000 * 1000)
|
|
||||||
|
|
||||||
/* Hardware Definitions */
|
|
||||||
#define NCHAN (40)
|
|
||||||
#define NCHAN_ANALOG (32)
|
|
||||||
#define NCHAN_DIGITAL (64)
|
|
||||||
#define NCHAN_TRANSCEIVER (4)
|
|
||||||
#define NBITS_PER_TRANSCEIVER (64)
|
|
||||||
#define NCHIP (1)
|
|
||||||
#define NDAC (24)
|
|
||||||
#define NPWR (6)
|
|
||||||
#define NDAC_ONLY (NDAC - NPWR)
|
|
||||||
|
|
||||||
#define DYNAMIC_RANGE (16)
|
|
||||||
#define NUM_BYTES_PER_PIXEL (DYNAMIC_RANGE / 8)
|
|
||||||
|
|
||||||
#define DAC_DRIVER_NUM_DEVICES (3)
|
|
||||||
#define DAC_DRIVER_FILE_NAME \
|
|
||||||
("/sys/bus/iio/devices/iio:device%d/out_voltage%d_raw")
|
|
||||||
#define DAC_POWERDOWN_DRIVER_FILE_NAME \
|
|
||||||
("/sys/bus/iio/devices/iio:device%d/out_voltage%d_powerdown")
|
|
||||||
|
|
||||||
#define SLOWADC_DRIVER_FILE_NAME \
|
|
||||||
("/sys/bus/iio/devices/iio:device%d/in_voltage%d_raw")
|
|
||||||
//#define SLOWDAC_CONVERTION_FACTOR_TO_UV (62.500953)
|
|
||||||
|
|
||||||
#define TEMP_DRIVER_FILE_NAME \
|
|
||||||
("/sys/bus/iio/devices/iio:device0/in_temp7_input")
|
|
||||||
|
|
||||||
/** Default Parameters */
|
|
||||||
#define DEFAULT_NUM_FRAMES (1)
|
|
||||||
#define DEFAULT_NUM_CYCLES (1)
|
|
||||||
#define DEFAULT_TIMING_MODE (AUTO_TIMING)
|
|
||||||
#define DEFAULT_EXPTIME (0)
|
|
||||||
#define DEFAULT_PERIOD (300 * 1000) // 300us
|
|
||||||
#define DEFAULT_READOUT_MODE (TRANSCEIVER_ONLY)
|
|
||||||
#define DEFAULT_READOUT_MODE_STR "transceiver_only"
|
|
||||||
#define DEFAULT_TRANSCEIVER_MASK (0x3) // TODO: check
|
|
||||||
#define DEFAULT_NUM_ASAMPLES (1)
|
|
||||||
#define DEFAULT_NUM_DSAMPLES (1)
|
|
||||||
#define DEFAULT_NUM_TSAMPLES (200)
|
|
||||||
#define DEFAULT_STARTING_FRAME_NUMBER (1)
|
|
||||||
#define DEFAULT_VLIMIT (-100)
|
|
||||||
#define DEFAULT_DELAY (0)
|
|
||||||
|
|
||||||
#define MAX_TRANSCEIVER_MASK (0xF)
|
|
||||||
#define MAX_TRANSCEIVER_SAMPLES (0x1FFF)
|
|
||||||
|
|
||||||
#define MAX_ANALOG_SAMPLES (0x3FFF)
|
|
||||||
#define MAX_DIGITAL_SAMPLES (0x3FFF)
|
|
||||||
|
|
||||||
#define DAC_MIN_MV (0)
|
|
||||||
#define DAC_MAX_MV (2500)
|
|
||||||
|
|
||||||
#define TICK_CLK (20) // MHz (trig_timeFromStart, frametime, timeFromStart)
|
|
||||||
#define RUN_CLK \
|
|
||||||
(100) // MHz (framesFromStart, c_swTrigger, run, waitForTrigger, starting,
|
|
||||||
// acquiring, waitForPeriod, internalStop, c_framesFromSTart_reset,
|
|
||||||
// s_start, c_stop, triggerEnable, period, frames, cycles, delay)
|
|
||||||
|
|
||||||
/* Defines in the Firmware */
|
|
||||||
#define WAIT_TIME_PATTERN_READ (10)
|
|
||||||
#define WAIT_TIME_OUT_0US_TIMES (35000) // 2s
|
|
||||||
|
|
||||||
#define BIT32_MSK (0xFFFFFFFF)
|
|
||||||
#define BIT16_MASK (0xFFFF)
|
|
||||||
|
|
||||||
#define MAX_DATA_SIZE_IN_PACKET (8144)
|
|
||||||
|
|
||||||
/* Enum Definitions */
|
|
||||||
enum ADCINDEX {
|
|
||||||
S_ADC0,
|
|
||||||
S_ADC1,
|
|
||||||
S_ADC2,
|
|
||||||
S_ADC3,
|
|
||||||
S_ADC4,
|
|
||||||
S_ADC5,
|
|
||||||
S_ADC6,
|
|
||||||
S_ADC7,
|
|
||||||
TEMP_FPGA
|
|
||||||
};
|
|
||||||
enum DACINDEX {
|
|
||||||
D0,
|
|
||||||
D1,
|
|
||||||
D2,
|
|
||||||
D3,
|
|
||||||
D4,
|
|
||||||
D5,
|
|
||||||
D6,
|
|
||||||
D7,
|
|
||||||
D8,
|
|
||||||
D9,
|
|
||||||
D10,
|
|
||||||
D11,
|
|
||||||
D12,
|
|
||||||
D13,
|
|
||||||
D14,
|
|
||||||
D15,
|
|
||||||
D16,
|
|
||||||
D17,
|
|
||||||
D_PWR_D,
|
|
||||||
D_PWR_EMPTY,
|
|
||||||
D_PWR_IO,
|
|
||||||
D_PWR_A,
|
|
||||||
D_PWR_B,
|
|
||||||
D_PWR_C
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Struct Definitions */
|
|
||||||
typedef struct udp_header_struct {
|
|
||||||
uint32_t udp_destmac_msb;
|
|
||||||
uint16_t udp_srcmac_msb;
|
|
||||||
uint16_t udp_destmac_lsb;
|
|
||||||
uint32_t udp_srcmac_lsb;
|
|
||||||
uint8_t ip_tos;
|
|
||||||
uint8_t ip_ihl : 4, ip_ver : 4;
|
|
||||||
uint16_t udp_ethertype;
|
|
||||||
uint16_t ip_identification;
|
|
||||||
uint16_t ip_totallength;
|
|
||||||
uint8_t ip_protocol;
|
|
||||||
uint8_t ip_ttl;
|
|
||||||
uint16_t ip_fragmentoffset : 13, ip_flags : 3;
|
|
||||||
uint16_t ip_srcip_msb;
|
|
||||||
uint16_t ip_checksum;
|
|
||||||
uint16_t ip_destip_msb;
|
|
||||||
uint16_t ip_srcip_lsb;
|
|
||||||
uint16_t udp_srcport;
|
|
||||||
uint16_t ip_destip_lsb;
|
|
||||||
uint16_t udp_checksum;
|
|
||||||
uint16_t udp_destport;
|
|
||||||
} udp_header;
|
|
||||||
|
|
||||||
#define IP_HEADER_SIZE (20)
|
|
||||||
#define UDP_IP_HEADER_LENGTH_BYTES (28)
|
|
@ -4,13 +4,10 @@ set(SOURCES
|
|||||||
src/DetectorImpl.cpp
|
src/DetectorImpl.cpp
|
||||||
src/Module.cpp
|
src/Module.cpp
|
||||||
src/Detector.cpp
|
src/Detector.cpp
|
||||||
src/HelpDacs.cpp
|
src/CmdProxy.cpp
|
||||||
src/CmdParser.cpp
|
src/CmdParser.cpp
|
||||||
src/Pattern.cpp
|
src/Pattern.cpp
|
||||||
src/CtbConfig.cpp
|
src/CtbConfig.cpp
|
||||||
src/Caller.cpp
|
|
||||||
src/CallerSpecial.cpp
|
|
||||||
src/inferAction.cpp
|
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(slsDetectorObject OBJECT
|
add_library(slsDetectorObject OBJECT
|
||||||
@ -79,30 +76,26 @@ endif()
|
|||||||
|
|
||||||
|
|
||||||
if(SLS_USE_TEXTCLIENT)
|
if(SLS_USE_TEXTCLIENT)
|
||||||
set(det_bin_names "sls_detector_put"
|
# Loop over list to generate command line binaries
|
||||||
|
set(bin_names "sls_detector_put"
|
||||||
"sls_detector_get"
|
"sls_detector_get"
|
||||||
"sls_detector_acquire"
|
"sls_detector_acquire"
|
||||||
"sls_detector_help"
|
"sls_detector_help")
|
||||||
"sls_detector"
|
set(cmd_name "PUT" "GET" "READOUT" "HELP")
|
||||||
)
|
list(LENGTH bin_names len1)
|
||||||
set(det_cmd_name "PUT" "GET" "READOUT" "HELP" "INFER")
|
|
||||||
list(LENGTH det_bin_names len1)
|
|
||||||
math(EXPR len2 "${len1} - 1")
|
math(EXPR len2 "${len1} - 1")
|
||||||
|
|
||||||
foreach(val RANGE ${len2})
|
foreach(val RANGE ${len2})
|
||||||
list(GET det_bin_names ${val} val1)
|
list(GET bin_names ${val} val1)
|
||||||
list(GET det_cmd_name ${val} val2)
|
list(GET cmd_name ${val} val2)
|
||||||
message(STATUS "${val1} ${val2}")
|
message(STATUS "${val1} ${val2}")
|
||||||
|
|
||||||
add_executable(${val1} src/CmdApp.cpp)
|
add_executable(${val1} src/CmdLineApp.cpp)
|
||||||
|
|
||||||
target_link_libraries(${val1}
|
target_link_libraries(${val1}
|
||||||
slsDetectorStatic
|
slsDetectorStatic
|
||||||
pthread
|
pthread
|
||||||
rt
|
rt
|
||||||
)
|
)
|
||||||
SET_SOURCE_FILES_PROPERTIES( src/Caller.cpp PROPERTIES COMPILE_FLAGS "-Wno-unused-variable -Wno-unused-but-set-variable")
|
|
||||||
|
|
||||||
set_target_properties(${val1} PROPERTIES
|
set_target_properties(${val1} PROPERTIES
|
||||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||||
COMPILE_DEFINITIONS ${val2}=1
|
COMPILE_DEFINITIONS ${val2}=1
|
||||||
@ -111,8 +104,7 @@ if(SLS_USE_TEXTCLIENT)
|
|||||||
set_property(TARGET ${val1} PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
|
set_property(TARGET ${val1} PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
install(TARGETS ${det_bin_names} DESTINATION bin)
|
install(TARGETS ${bin_names} DESTINATION bin)
|
||||||
|
|
||||||
|
|
||||||
endif(SLS_USE_TEXTCLIENT)
|
endif(SLS_USE_TEXTCLIENT)
|
||||||
|
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
#include "Caller.h"
|
|
||||||
#include "sls/logger.h"
|
|
||||||
#include "sls/string_utils.h"
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace sls {
|
|
||||||
|
|
||||||
// THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE
|
|
||||||
|
|
||||||
}
|
|
@ -1,88 +0,0 @@
|
|||||||
// This file is used as input to generate the caller class
|
|
||||||
|
|
||||||
#include "CmdParser.h"
|
|
||||||
#include "HelpDacs.h"
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
namespace sls {
|
|
||||||
|
|
||||||
class Caller {
|
|
||||||
public:
|
|
||||||
Caller(Detector *ptr) : det(ptr) {}
|
|
||||||
void call(const std::string &command,
|
|
||||||
const std::vector<std::string> &arguments, int detector_id,
|
|
||||||
int action, std::ostream &os = std::cout, int receiver_id = -1);
|
|
||||||
|
|
||||||
IpAddr getDstIpFromAuto();
|
|
||||||
IpAddr getSrcIpFromAuto();
|
|
||||||
UdpDestination getUdpEntry();
|
|
||||||
void GetLevelAndUpdateArgIndex(int action,
|
|
||||||
std::string levelSeparatedCommand,
|
|
||||||
int &level, int &iArg, size_t nGetArgs,
|
|
||||||
size_t nPutArgs);
|
|
||||||
void WrongNumberOfParameters(size_t expected);
|
|
||||||
|
|
||||||
template <typename V> std::string OutStringHex(const V &value) {
|
|
||||||
if (value.equal())
|
|
||||||
return ToStringHex(value.front());
|
|
||||||
return ToStringHex(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V> std::string OutStringHex(const V &value, int width) {
|
|
||||||
if (value.equal())
|
|
||||||
return ToStringHex(value.front(), width);
|
|
||||||
return ToStringHex(value, width);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V> std::string OutString(const Result<V> &value) {
|
|
||||||
if (value.equal())
|
|
||||||
return ToString(value.front());
|
|
||||||
return ToString(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V> std::string OutString(const V &value) {
|
|
||||||
return ToString(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename V>
|
|
||||||
std::string OutString(const V &value, const std::string &unit) {
|
|
||||||
if (value.equal())
|
|
||||||
return ToString(value.front(), unit);
|
|
||||||
return ToString(value, unit);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> getAllCommands();
|
|
||||||
std::string list(int action);
|
|
||||||
|
|
||||||
// THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1)
|
|
||||||
|
|
||||||
std::vector<std::string> args;
|
|
||||||
std::string cmd;
|
|
||||||
Detector *det;
|
|
||||||
int det_id{-1};
|
|
||||||
int rx_id{-1};
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool ReplaceIfDepreciated(std::string &command);
|
|
||||||
using FunctionMap = std::map<std::string, std::string (Caller::*)(int)>;
|
|
||||||
using StringMap = std::map<std::string, std::string>;
|
|
||||||
Detector *ptr; // pointer to the detector that executes the command
|
|
||||||
|
|
||||||
FunctionMap functions{
|
|
||||||
{"list", &Caller::list},
|
|
||||||
|
|
||||||
// THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (2)
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
StringMap depreciated_functions{
|
|
||||||
|
|
||||||
// THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (3)
|
|
||||||
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace sls
|
|
@ -1,236 +0,0 @@
|
|||||||
import argparse
|
|
||||||
import json
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
# command to generate the ast
|
|
||||||
# clang version: 14.0.0-1ubuntu1.1
|
|
||||||
# clang++ -Xclang -ast-dump=json -Xclang -ast-dump-filter -Xclang StringTo -c ToString.cpp -I ../include/ -std=gnu++11
|
|
||||||
#
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
AUTOCOMPLETE_PATH = Path(__file__).parent
|
|
||||||
DUMP_PATH = AUTOCOMPLETE_PATH / 'dump.json'
|
|
||||||
FIXED_PATH = AUTOCOMPLETE_PATH / 'fixed.json'
|
|
||||||
|
|
||||||
type_values = {
|
|
||||||
'special::mv': ["mv", "mV"],
|
|
||||||
"special::deg": ["deg"],
|
|
||||||
"special::time_unit": ["s", "ms", "us", "ns"],
|
|
||||||
"special::hard": ["hard"],
|
|
||||||
"special::force-delete-normal-file": ["--force-delete-normal-file"],
|
|
||||||
"special::currentSourceFix": ["fix", "nofix"],
|
|
||||||
"special::currentSourceLow": ["normal", "low"],
|
|
||||||
"special::path": [],
|
|
||||||
"special::pedestal_parameters" : ["", "0"]
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def get_types(arg_types):
|
|
||||||
ret = set()
|
|
||||||
for arg_type in arg_types:
|
|
||||||
if type_info(arg_type) == 'base':
|
|
||||||
if arg_type == 'bool':
|
|
||||||
ret = ret.union(["0", "1"])
|
|
||||||
else:
|
|
||||||
tmp = [not_list for not_list in type_values[arg_type] if not isinstance(not_list, list)]
|
|
||||||
ret = ret.union(tmp)
|
|
||||||
|
|
||||||
#Intercept the options and in case detector specific options appear replace the
|
|
||||||
#list of options with a command line call that fetches them
|
|
||||||
#TODO! Rename sls_detector_get
|
|
||||||
if "defs::dacIndex" in arg_types:
|
|
||||||
return "`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`"
|
|
||||||
elif "defs::detectorSettings" in arg_types:
|
|
||||||
return "`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`"
|
|
||||||
elif "defs::timingMode" in arg_types:
|
|
||||||
return "`sls_detector_get timinglist | sed -e 's/.*\[\(.*\)\].*/\\1/' | sed 's/,//g'`"
|
|
||||||
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
def type_info(type_name):
|
|
||||||
if type_name.startswith('defs::') or type_name.startswith('slsDetectorDefs::'):
|
|
||||||
return 'enum'
|
|
||||||
if type_name.startswith('special::'):
|
|
||||||
return 'special'
|
|
||||||
return 'base'
|
|
||||||
|
|
||||||
|
|
||||||
def get_enum(function):
|
|
||||||
return function['type']['qualType'].split(' ')[0]
|
|
||||||
|
|
||||||
|
|
||||||
def get_literal(ifstmt):
|
|
||||||
stringliteral = []
|
|
||||||
expression = ifstmt['inner'][0]
|
|
||||||
if expression['kind'] == 'BinaryOperator':
|
|
||||||
if expression['opcode'] == '!=':
|
|
||||||
return None, None
|
|
||||||
for cxxOperatorCall in expression['inner']:
|
|
||||||
if cxxOperatorCall['kind'] == 'CXXOperatorCallExpr':
|
|
||||||
implicitCastExpr = cxxOperatorCall['inner'][2]
|
|
||||||
stringliteral.append(implicitCastExpr['inner'][0]['value'][1:-1])
|
|
||||||
else:
|
|
||||||
cxxOperatorCall = expression
|
|
||||||
implicitCastExpr = cxxOperatorCall['inner'][2]
|
|
||||||
stringliteral = implicitCastExpr['inner'][0]['value'][1:-1]
|
|
||||||
|
|
||||||
retstmt = get_object_by_kind(ifstmt['inner'], 'ReturnStmt')
|
|
||||||
declrefexpt = get_object_by_kind(retstmt['inner'], 'DeclRefExpr')
|
|
||||||
enum_val = declrefexpt["referencedDecl"]["name"]
|
|
||||||
|
|
||||||
return enum_val, stringliteral
|
|
||||||
|
|
||||||
|
|
||||||
def get_object_by_kind(inner, kind, position=1):
|
|
||||||
for obj in inner:
|
|
||||||
if obj['kind'] == kind:
|
|
||||||
position -= 1
|
|
||||||
if position == 0:
|
|
||||||
return obj
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def generate_type_values():
|
|
||||||
functions = json.loads(FIXED_PATH.read_text())
|
|
||||||
for function in functions:
|
|
||||||
if function['kind'] != 'FunctionDecl' or function['name'] != 'StringTo':
|
|
||||||
continue
|
|
||||||
enum = get_enum(function)
|
|
||||||
|
|
||||||
if not enum.startswith('defs::'):
|
|
||||||
continue
|
|
||||||
# if enum != 'defs::dacIndex':
|
|
||||||
# continue
|
|
||||||
if not function['loc']['file'].endswith('ToString.cpp'):
|
|
||||||
continue
|
|
||||||
|
|
||||||
compound_stmt = get_object_by_kind(function['inner'], 'CompoundStmt')
|
|
||||||
|
|
||||||
for ifstmt in compound_stmt['inner']:
|
|
||||||
if ifstmt['kind'] != 'IfStmt':
|
|
||||||
continue
|
|
||||||
enum_val, stringliteral = get_literal(ifstmt)
|
|
||||||
if enum_val is None:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if enum not in type_values or type_values[enum] is None:
|
|
||||||
type_values[enum] = []
|
|
||||||
type_values[enum].append(stringliteral)
|
|
||||||
items = list(type_values.items())
|
|
||||||
for key, val in items:
|
|
||||||
if key.startswith('defs::'):
|
|
||||||
new_key = key.split('::')[1]
|
|
||||||
new_key = 'slsDetectorDefs::' + new_key
|
|
||||||
type_values[new_key] = val
|
|
||||||
elif key.startswith('slsDetectorDefs::'):
|
|
||||||
new_key = key.split('::')[1]
|
|
||||||
new_key = 'defs::' + new_key
|
|
||||||
type_values[new_key] = val
|
|
||||||
|
|
||||||
return json.dumps(type_values, indent=2)
|
|
||||||
|
|
||||||
|
|
||||||
def fix_json():
|
|
||||||
with DUMP_PATH.open('r') as f:
|
|
||||||
tmp = '[\n'
|
|
||||||
for line in f.read().split('\n'):
|
|
||||||
if line.startswith('}'):
|
|
||||||
tmp += line + ',\n'
|
|
||||||
else:
|
|
||||||
tmp += line + '\n'
|
|
||||||
tmp = tmp[:-3] + '\n]'
|
|
||||||
with FIXED_PATH.open('w') as f:
|
|
||||||
f.write(tmp)
|
|
||||||
|
|
||||||
|
|
||||||
def generate_bash_autocomplete(output_path=Path(__file__).parent / 'bash_autocomplete.sh', input_path=Path(__file__).parent / 'bash_autocomplete.in.sh'):
|
|
||||||
generate_type_values()
|
|
||||||
output_file = output_path.open('w')
|
|
||||||
template_file = input_path.open('r')
|
|
||||||
|
|
||||||
def writeline(line):
|
|
||||||
output_file.write(line + '\n')
|
|
||||||
|
|
||||||
class if_block:
|
|
||||||
def __init__(self, condition):
|
|
||||||
self.condition = condition
|
|
||||||
|
|
||||||
def __enter__(self):
|
|
||||||
output_file.write('if [[ ' + self.condition + ' ]]; then\n')
|
|
||||||
|
|
||||||
def __exit__(self, type, value, traceback):
|
|
||||||
output_file.write('fi\n')
|
|
||||||
|
|
||||||
class function:
|
|
||||||
def __init__(self, name):
|
|
||||||
self.name = name
|
|
||||||
|
|
||||||
def __enter__(self):
|
|
||||||
output_file.write(self.name + '() {\n')
|
|
||||||
|
|
||||||
def __exit__(self, type, value, traceback):
|
|
||||||
output_file.write('}\n')
|
|
||||||
|
|
||||||
command_path = Path(__file__).parent.parent / 'extended_commands.yaml'
|
|
||||||
commands = yaml.unsafe_load(command_path.open('r'))
|
|
||||||
|
|
||||||
for line in template_file:
|
|
||||||
if '-- THIS LINE WILL BE REPLACED WITH GENERATED CODE --' not in line:
|
|
||||||
output_file.write(line)
|
|
||||||
continue
|
|
||||||
writeline(f'local SLS_COMMANDS=" {" ".join(commands.keys())} "')
|
|
||||||
# generate functions
|
|
||||||
for command_name, command in commands.items():
|
|
||||||
# added for debugging
|
|
||||||
if command_name == 'xxxexptime':
|
|
||||||
continue
|
|
||||||
with function('__' + command_name):
|
|
||||||
writeline('FCN_RETURN=""')
|
|
||||||
|
|
||||||
actions = ['GET', 'PUT']
|
|
||||||
for action in actions:
|
|
||||||
if action in command['actions'] and 'args' in command['actions'][action]:
|
|
||||||
args = command['actions'][action]['args']
|
|
||||||
possible_argc = {}
|
|
||||||
for arg in args:
|
|
||||||
if arg['argc'] == 0:
|
|
||||||
pass
|
|
||||||
for i in range(arg['argc']):
|
|
||||||
if i + 1 not in possible_argc:
|
|
||||||
possible_argc[i + 1] = []
|
|
||||||
possible_argc[i + 1].append(arg['arg_types'][i])
|
|
||||||
if possible_argc:
|
|
||||||
with if_block(f'${{IS_GET}} -eq {"1" if action == "GET" else "0"}'):
|
|
||||||
for argc in possible_argc:
|
|
||||||
with if_block(f'"${{cword}}" == "{argc + 1}"'):
|
|
||||||
if "defs::detectorSettings" in possible_argc[argc]:
|
|
||||||
print(argc, command_name, possible_argc[argc])
|
|
||||||
choices = get_types(possible_argc[argc])
|
|
||||||
|
|
||||||
#check if we got choices back or a bash command
|
|
||||||
if isinstance(choices, (list,set)):
|
|
||||||
writeline(f'FCN_RETURN="{" ".join(sorted(choices))}"')
|
|
||||||
else:
|
|
||||||
writeline(f'FCN_RETURN="{choices}"')
|
|
||||||
if 'special::path' in possible_argc[argc]:
|
|
||||||
writeline('IS_PATH=1')
|
|
||||||
|
|
||||||
writeline('return 0')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
output_file.close()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
parser = argparse.ArgumentParser(description='use parsed c++ code to generate autocomplete snippets')
|
|
||||||
parser.add_argument('-f', '--fix', action='store_true', help='fix the parsed ast to make it loadable')
|
|
||||||
# parser.add_argument('-p', '--path', type=str, help='output path to the fixed ast', default='ast.json')
|
|
||||||
args = parser.parse_known_args()
|
|
||||||
if args[0].fix:
|
|
||||||
fix_json()
|
|
||||||
ret = generate_type_values()
|
|
||||||
print(ret)
|
|
@ -1,167 +0,0 @@
|
|||||||
# GENERATED FILE - DO NOT EDIT
|
|
||||||
# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN
|
|
||||||
|
|
||||||
_sd() {
|
|
||||||
|
|
||||||
# Taken from https://github.com/scop/bash-completion/blob/15b74b1050333f425877a7cbd99af2998b95c476/bash_completion#L770C12-L770C12
|
|
||||||
# Reassemble command line words, excluding specified characters from the
|
|
||||||
# list of word completion separators (COMP_WORDBREAKS).
|
|
||||||
# @param $1 chars Characters out of $COMP_WORDBREAKS which should
|
|
||||||
# NOT be considered word breaks. This is useful for things like scp where
|
|
||||||
# we want to return host:path and not only path, so we would pass the
|
|
||||||
# colon (:) as $1 here.
|
|
||||||
# @param $2 words Name of variable to return words to
|
|
||||||
# @param $3 cword Name of variable to return cword to
|
|
||||||
#
|
|
||||||
_comp__reassemble_words()
|
|
||||||
{
|
|
||||||
local exclude="" i j line ref
|
|
||||||
# Exclude word separator characters?
|
|
||||||
if [[ $1 ]]; then
|
|
||||||
# Yes, exclude word separator characters;
|
|
||||||
# Exclude only those characters, which were really included
|
|
||||||
exclude="[${1//[^$COMP_WORDBREAKS]/}]"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Default to cword unchanged
|
|
||||||
printf -v "$3" %s "$COMP_CWORD"
|
|
||||||
# Are characters excluded which were former included?
|
|
||||||
if [[ $exclude ]]; then
|
|
||||||
# Yes, list of word completion separators has shrunk;
|
|
||||||
line=$COMP_LINE
|
|
||||||
# Re-assemble words to complete
|
|
||||||
for ((i = 0, j = 0; i < ${#COMP_WORDS[@]}; i++, j++)); do
|
|
||||||
# Is current word not word 0 (the command itself) and is word not
|
|
||||||
# empty and is word made up of just word separator characters to
|
|
||||||
# be excluded and is current word not preceded by whitespace in
|
|
||||||
# original line?
|
|
||||||
while [[ $i -gt 0 && ${COMP_WORDS[i]} == +($exclude) ]]; do
|
|
||||||
# Is word separator not preceded by whitespace in original line
|
|
||||||
# and are we not going to append to word 0 (the command
|
|
||||||
# itself), then append to current word.
|
|
||||||
[[ $line != [[:blank:]]* ]] && ((j >= 2)) && ((j--))
|
|
||||||
# Append word separator to current or new word
|
|
||||||
ref="$2[$j]"
|
|
||||||
printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}"
|
|
||||||
# Indicate new cword
|
|
||||||
((i == COMP_CWORD)) && printf -v "$3" %s "$j"
|
|
||||||
# Remove optional whitespace + word separator from line copy
|
|
||||||
line=${line#*"${COMP_WORDS[i]}"}
|
|
||||||
# Indicate next word if available, else end *both* while and
|
|
||||||
# for loop
|
|
||||||
if ((i < ${#COMP_WORDS[@]} - 1)); then
|
|
||||||
((i++))
|
|
||||||
else
|
|
||||||
break 2
|
|
||||||
fi
|
|
||||||
# Start new word if word separator in original line is
|
|
||||||
# followed by whitespace.
|
|
||||||
[[ $line == [[:blank:]]* ]] && ((j++))
|
|
||||||
done
|
|
||||||
# Append word to current word
|
|
||||||
ref="$2[$j]"
|
|
||||||
printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}"
|
|
||||||
# Remove optional whitespace + word from line copy
|
|
||||||
line=${line#*"${COMP_WORDS[i]}"}
|
|
||||||
# Indicate new cword
|
|
||||||
((i == COMP_CWORD)) && printf -v "$3" %s "$j"
|
|
||||||
done
|
|
||||||
((i == COMP_CWORD)) && printf -v "$3" %s "$j"
|
|
||||||
else
|
|
||||||
# No, list of word completions separators hasn't changed;
|
|
||||||
for i in "${!COMP_WORDS[@]}"; do
|
|
||||||
printf -v "$2[i]" %s "${COMP_WORDS[i]}"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
local FCN_RETURN=""
|
|
||||||
local IS_PATH=0
|
|
||||||
|
|
||||||
|
|
||||||
# -- THIS LINE WILL BE REPLACED WITH GENERATED CODE --
|
|
||||||
|
|
||||||
|
|
||||||
COMPREPLY=()
|
|
||||||
local OPTIONS_NEW=""
|
|
||||||
|
|
||||||
# check if bash or zsh
|
|
||||||
# _get_comp_words_by_ref is a bash built-in function, we check if it exists
|
|
||||||
declare -Ff _get_comp_words_by_ref > /dev/null && IS_BASH=1 || IS_BASH=0
|
|
||||||
|
|
||||||
|
|
||||||
# bash interprets the colon character : as a special character and splits the argument in two
|
|
||||||
# different than what zsh does
|
|
||||||
# https://stackoverflow.com/a/3224910
|
|
||||||
# https://stackoverflow.com/a/12495727
|
|
||||||
local cur
|
|
||||||
local cword words=()
|
|
||||||
_comp__reassemble_words ":" words cword
|
|
||||||
cur=${words[cword]}
|
|
||||||
|
|
||||||
# check the action (get or put)
|
|
||||||
case "${words[0]}" in
|
|
||||||
"sls_detector_get" | "g" | "detg")
|
|
||||||
local IS_GET=1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
local IS_GET=0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# if no command is written, autocomplete with the commands
|
|
||||||
if [[ ${cword} -eq 1 ]]; then
|
|
||||||
# local SLS_COMMANDS="trimbits exptime"
|
|
||||||
local SLS_COMMANDS_NEW=""
|
|
||||||
|
|
||||||
case "$cur" in
|
|
||||||
[0-9]*:*)
|
|
||||||
local suggestions=($(compgen -W "${SLS_COMMANDS}" -- "${cur#*:}"))
|
|
||||||
COMPREPLY=( ${suggestions[*]} )
|
|
||||||
;;
|
|
||||||
[0-9]*)
|
|
||||||
COMPREPLY=()
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );;
|
|
||||||
|
|
||||||
esac
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${cword} -eq 2 ]] && [[ ${words[1]} == "-h" ]]; then
|
|
||||||
COMPREPLY=( $( compgen -W "$SLS_COMMANDS" -- "$cur" ) )
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if a command is written, autocomplete with the options
|
|
||||||
# call the function for the command
|
|
||||||
|
|
||||||
if [[ "$SLS_COMMANDS" == *"${words[1]##*:}"* ]]; then
|
|
||||||
__"${words[1]##*:}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if IS_PATH is activated, autocomplete with the path
|
|
||||||
if [[ ${IS_PATH} -eq 1 ]]; then
|
|
||||||
COMPREPLY=($(compgen -f -- "${cur}"))
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# autocomplete with the options
|
|
||||||
COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}"))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
complete -F _sd -o filenames sls_detector_get
|
|
||||||
complete -F _sd -o filenames g
|
|
||||||
complete -F _sd -o filenames detg
|
|
||||||
|
|
||||||
complete -F _sd -o filenames sls_detector_put
|
|
||||||
complete -F _sd -o filenames p
|
|
||||||
complete -F _sd -o filenames detp
|
|
||||||
|
|
||||||
complete -F _sd -o filenames sls_detector
|
|
||||||
complete -F _sd -o filenames det
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,177 +0,0 @@
|
|||||||
#### simpler version of autocomplete.sh to understand the logic
|
|
||||||
#### each command has its own function when called it will produce the possible values for autocompletion
|
|
||||||
|
|
||||||
|
|
||||||
_sd() {
|
|
||||||
|
|
||||||
# Reassemble command line words, excluding specified characters from the
|
|
||||||
# list of word completion separators (COMP_WORDBREAKS).
|
|
||||||
# @param $1 chars Characters out of $COMP_WORDBREAKS which should
|
|
||||||
# NOT be considered word breaks. This is useful for things like scp where
|
|
||||||
# we want to return host:path and not only path, so we would pass the
|
|
||||||
# colon (:) as $1 here.
|
|
||||||
# @param $2 words Name of variable to return words to
|
|
||||||
# @param $3 cword Name of variable to return cword to
|
|
||||||
#
|
|
||||||
_comp__reassemble_words()
|
|
||||||
{
|
|
||||||
local exclude="" i j line ref
|
|
||||||
# Exclude word separator characters?
|
|
||||||
if [[ $1 ]]; then
|
|
||||||
# Yes, exclude word separator characters;
|
|
||||||
# Exclude only those characters, which were really included
|
|
||||||
exclude="[${1//[^$COMP_WORDBREAKS]/}]"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Default to cword unchanged
|
|
||||||
printf -v "$3" %s "$COMP_CWORD"
|
|
||||||
# Are characters excluded which were former included?
|
|
||||||
if [[ $exclude ]]; then
|
|
||||||
# Yes, list of word completion separators has shrunk;
|
|
||||||
line=$COMP_LINE
|
|
||||||
# Re-assemble words to complete
|
|
||||||
for ((i = 0, j = 0; i < ${#COMP_WORDS[@]}; i++, j++)); do
|
|
||||||
# Is current word not word 0 (the command itself) and is word not
|
|
||||||
# empty and is word made up of just word separator characters to
|
|
||||||
# be excluded and is current word not preceded by whitespace in
|
|
||||||
# original line?
|
|
||||||
while [[ $i -gt 0 && ${COMP_WORDS[i]} == +($exclude) ]]; do
|
|
||||||
# Is word separator not preceded by whitespace in original line
|
|
||||||
# and are we not going to append to word 0 (the command
|
|
||||||
# itself), then append to current word.
|
|
||||||
[[ $line != [[:blank:]]* ]] && ((j >= 2)) && ((j--))
|
|
||||||
# Append word separator to current or new word
|
|
||||||
ref="$2[$j]"
|
|
||||||
printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}"
|
|
||||||
# Indicate new cword
|
|
||||||
((i == COMP_CWORD)) && printf -v "$3" %s "$j"
|
|
||||||
# Remove optional whitespace + word separator from line copy
|
|
||||||
line=${line#*"${COMP_WORDS[i]}"}
|
|
||||||
# Indicate next word if available, else end *both* while and
|
|
||||||
# for loop
|
|
||||||
if ((i < ${#COMP_WORDS[@]} - 1)); then
|
|
||||||
((i++))
|
|
||||||
else
|
|
||||||
break 2
|
|
||||||
fi
|
|
||||||
# Start new word if word separator in original line is
|
|
||||||
# followed by whitespace.
|
|
||||||
[[ $line == [[:blank:]]* ]] && ((j++))
|
|
||||||
done
|
|
||||||
# Append word to current word
|
|
||||||
ref="$2[$j]"
|
|
||||||
printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}"
|
|
||||||
# Remove optional whitespace + word from line copy
|
|
||||||
line=${line#*"${COMP_WORDS[i]}"}
|
|
||||||
# Indicate new cword
|
|
||||||
((i == COMP_CWORD)) && printf -v "$3" %s "$j"
|
|
||||||
done
|
|
||||||
((i == COMP_CWORD)) && printf -v "$3" %s "$j"
|
|
||||||
else
|
|
||||||
# No, list of word completions separators hasn't changed;
|
|
||||||
for i in "${!COMP_WORDS[@]}"; do
|
|
||||||
printf -v "$2[i]" %s "${COMP_WORDS[i]}"
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
__exptime(){
|
|
||||||
if [ "${IS_GET}" == "1" ]; then
|
|
||||||
if [ "${cword}" == "2" ]; then
|
|
||||||
FCN_RETURN="s ms us ns"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ "${cword}" == "2" ]; then
|
|
||||||
FCN_RETURN=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${cword}" == "3" ]; then
|
|
||||||
FCN_RETURN="s ms us ns"
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# trimbits will activate IS_PATH and signal that its input is a path
|
|
||||||
__trimbits(){
|
|
||||||
if [ "${IS_GET}" == "1" ]; then
|
|
||||||
if [ "${cword}" == "2" ]; then
|
|
||||||
FCN_RETURN=""
|
|
||||||
IS_PATH=1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ "${cword}" == "2" ]; then
|
|
||||||
FCN_RETURN=""
|
|
||||||
IS_PATH=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
local cword words=()
|
|
||||||
_comp__reassemble_words ":" words cword
|
|
||||||
local FCN_RETURN=""
|
|
||||||
local IS_PATH=0
|
|
||||||
COMPREPLY=()
|
|
||||||
local OPTIONS_NEW=""
|
|
||||||
# _get_comp_words_by_ref -n : cur
|
|
||||||
local cur=${words[cword]}
|
|
||||||
# check the action (get or put)
|
|
||||||
if [ "${words[0]}" == "sls_detector_get" ]; then
|
|
||||||
local IS_GET=1
|
|
||||||
else
|
|
||||||
local IS_GET=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# if no command is written, autocomplete with the commands
|
|
||||||
if [[ ${cword} -eq 1 ]]; then
|
|
||||||
local SLS_COMMANDS="trimbits exptime"
|
|
||||||
local SLS_COMMANDS_NEW=""
|
|
||||||
|
|
||||||
case "$cur" in
|
|
||||||
[0-9]*:*)
|
|
||||||
local suggestions=($(compgen -W "${SLS_COMMANDS}" -- "${cur#*:}"))
|
|
||||||
COMPREPLY=( ${suggestions[*]} )
|
|
||||||
;;
|
|
||||||
[0-9]*)
|
|
||||||
COMPREPLY=()
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );;
|
|
||||||
|
|
||||||
esac
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if a command is written, autocomplete with the options
|
|
||||||
# call the function for the command
|
|
||||||
__"${words[1]##*:}"
|
|
||||||
|
|
||||||
# if IS_PATH is activated, autocomplete with the path
|
|
||||||
if [[ ${IS_PATH} -eq 1 ]]; then
|
|
||||||
COMPREPLY=($(compgen -f -- "${cur}"))
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# autocomplete with the options
|
|
||||||
COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}"))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
complete -F _sd -o filenames sls_detector_put
|
|
||||||
complete -F _sd -o filenames sls_detector_get
|
|
||||||
|
|
||||||
complete -F _sd -o filenames g
|
|
||||||
complete -F _sd -o filenames p
|
|
||||||
|
|
||||||
complete -F _sd -o filenames detg
|
|
||||||
complete -F _sd -o filenames detp
|
|
||||||
|
|
||||||
|
|
||||||
complete -F _sd -o filenames sls_detector
|
|
||||||
complete -F _sd -o filenames det
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
|||||||
# GENERATED FILE - DO NOT EDIT
|
|
||||||
# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN
|
|
||||||
|
|
||||||
_sd() {
|
|
||||||
|
|
||||||
|
|
||||||
# -- THIS LINE WILL BE REPLACED WITH GENERATED CODE --
|
|
||||||
|
|
||||||
|
|
||||||
local FCN_RETURN=""
|
|
||||||
local IS_PATH=0
|
|
||||||
COMPREPLY=()
|
|
||||||
local OPTIONS_NEW=""
|
|
||||||
words=("${COMP_WORDS[@]}")
|
|
||||||
cword=$COMP_CWORD
|
|
||||||
|
|
||||||
local cur=${words[cword]}
|
|
||||||
# check the action (get or put)
|
|
||||||
case "${words[0]}" in
|
|
||||||
"sls_detector_get" | "g" | "detg")
|
|
||||||
local IS_GET=1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
local IS_GET=0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# if no command is written, autocomplete with the commands
|
|
||||||
if [[ ${cword} -eq 1 ]]; then
|
|
||||||
|
|
||||||
case "$cur" in
|
|
||||||
[0-9]*)
|
|
||||||
for i in $SLS_COMMANDS; do
|
|
||||||
SLS_COMMANDS_NEW="${SLS_COMMANDS_NEW} ${cur%%:*}:$i"
|
|
||||||
done
|
|
||||||
COMPREPLY=( $( compgen -W "${SLS_COMMANDS_NEW}" -- "$cur" ) );;
|
|
||||||
*)
|
|
||||||
COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );;
|
|
||||||
esac
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${cword} -eq 2 ]] && [[ ${words[1]} == "-h" ]]; then
|
|
||||||
COMPREPLY=( $( compgen -W "$SLS_COMMANDS" -- "$cur" ) )
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if a command is written, autocomplete with the options
|
|
||||||
# call the function for the command
|
|
||||||
|
|
||||||
if [[ "$SLS_COMMANDS" == *"${words[1]##*:}"* ]]; then
|
|
||||||
__"${words[1]##*:}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# if IS_PATH is activated, autocomplete with the path
|
|
||||||
if [[ ${IS_PATH} -eq 1 ]]; then
|
|
||||||
COMPREPLY=($(compgen -f -- "${cur}"))
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# autocomplete with the options
|
|
||||||
COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}"))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
complete -F _sd -o filenames sls_detector_get
|
|
||||||
complete -F _sd -o filenames g
|
|
||||||
complete -F _sd -o filenames detg
|
|
||||||
|
|
||||||
complete -F _sd -o filenames sls_detector_put
|
|
||||||
complete -F _sd -o filenames p
|
|
||||||
complete -F _sd -o filenames detp
|
|
||||||
|
|
||||||
complete -F _sd -o filenames sls_detector
|
|
||||||
complete -F _sd -o filenames det
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,379 +0,0 @@
|
|||||||
import copy
|
|
||||||
import logging
|
|
||||||
import yaml
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
|
|
||||||
class CommandParser:
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
commands_file: Path = Path(__file__).parent.parent / 'commands.yaml',
|
|
||||||
output_file: Path = Path(__file__).parent.parent / 'extended_commands.yaml'
|
|
||||||
):
|
|
||||||
|
|
||||||
self.output_file = output_file
|
|
||||||
self.commands_file = commands_file
|
|
||||||
self.fp = self.commands_file.open('r')
|
|
||||||
self.simple_commands = yaml.unsafe_load(self.fp)
|
|
||||||
self.extended_commands = {}
|
|
||||||
self.argc_set = set()
|
|
||||||
self.logger = logging.getLogger('command_parser')
|
|
||||||
self.__current_action: str = ''
|
|
||||||
FORMAT = '[%(levelname)s] %(message)s'
|
|
||||||
logging.basicConfig(format=FORMAT, level=logging.INFO)
|
|
||||||
|
|
||||||
self.propagate_config = {
|
|
||||||
'require_det_id': False,
|
|
||||||
'convert_det_id': True,
|
|
||||||
'input': [],
|
|
||||||
'input_types': [],
|
|
||||||
'function': '',
|
|
||||||
'output': [],
|
|
||||||
'cast_input': [],
|
|
||||||
'check_det_id': False,
|
|
||||||
'arg_types': [],
|
|
||||||
# 'store_result_in_t': False, # always true in GET action
|
|
||||||
}
|
|
||||||
self.default_config = {
|
|
||||||
'infer_action': True,
|
|
||||||
'help': '',
|
|
||||||
'actions': {}
|
|
||||||
}
|
|
||||||
|
|
||||||
def _verify_argument(self, arg, infer_action, command_name, action):
|
|
||||||
if arg['function'] == '' and 'ctb_output_list' not in arg:
|
|
||||||
special_exception_message_list = ["Cannot put", "Cannot get"]
|
|
||||||
if 'exceptions' in arg and arg['exceptions'][0]['condition'] == 'true' and any(ele in arg['exceptions'][0]['message'] for ele in special_exception_message_list):
|
|
||||||
self.logger.warning(f"{command_name} has a special exception message for {action}.")
|
|
||||||
else:
|
|
||||||
self.logger.warning(f"{command_name} [{action}] does not have a function")
|
|
||||||
if len(arg['input_types']) != len(arg['input']):
|
|
||||||
raise ValueError(f'Argument {arg} does not have the correct number of inputs')
|
|
||||||
if 'separate_time_units' in arg:
|
|
||||||
|
|
||||||
if arg['separate_time_units']['input'] == "":
|
|
||||||
raise ValueError(f'Argument {arg} does not have the correct number of inputs for separate_time_units')
|
|
||||||
if len(arg['separate_time_units']['output']) != 2:
|
|
||||||
raise ValueError(f'Argument {arg} does not have the correct number of outputs for separate_time_units')
|
|
||||||
if 'convert_to_time' in arg:
|
|
||||||
if len(arg['convert_to_time']['input']) != 2:
|
|
||||||
raise ValueError(f'Argument {arg} does not have the correct number of inputs for convert_to_time')
|
|
||||||
if len(arg['convert_to_time']['output']) == "":
|
|
||||||
raise ValueError(f'Argument {arg} does not have the correct number of outputs for convert_to_time')
|
|
||||||
# if infer_action:
|
|
||||||
# if arg['argc'] in self.argc_set:
|
|
||||||
# raise ValueError(f'Argument {arg} has a duplicate argc')
|
|
||||||
# self.argc_set.add(arg['argc'])
|
|
||||||
|
|
||||||
def verify_format(self):
|
|
||||||
# todo verify detectors
|
|
||||||
# todo verify circular inheritance
|
|
||||||
# todo verify child commands (those that inherit)
|
|
||||||
# todo verify that there is no wrongly typed parameters
|
|
||||||
# todo verify that the same number of input_types and input are given
|
|
||||||
# todo verify that each argument has argc (error can happen when inheriting)
|
|
||||||
for command_name, command in self.simple_commands.items():
|
|
||||||
if 'inherit_actions' in command or 'template' in command and command[
|
|
||||||
'template'] or 'is_description' in command and command['is_description']:
|
|
||||||
continue
|
|
||||||
self.argc_set = set()
|
|
||||||
if 'infer_action' not in command:
|
|
||||||
command['infer_action'] = True
|
|
||||||
if 'actions' not in command:
|
|
||||||
raise ValueError(f'Command {command_name} does not have any actions')
|
|
||||||
for action, action_params in command['actions'].items():
|
|
||||||
if 'argc' in action_params:
|
|
||||||
if 'args' in action_params:
|
|
||||||
raise ValueError(f'Action {action} has both argc and args')
|
|
||||||
arg = {**self.propagate_config, **action_params}
|
|
||||||
self._verify_argument(arg, command['infer_action'], command_name, action)
|
|
||||||
elif 'args' in action_params:
|
|
||||||
if type(action_params['args']) is not list:
|
|
||||||
raise ValueError(f'Action {action} args is not a list')
|
|
||||||
if len(action_params['args']) == 0:
|
|
||||||
raise ValueError(f'Action {action} args is empty')
|
|
||||||
action_args = {**self.propagate_config, **action_params}
|
|
||||||
del action_args['args']
|
|
||||||
for arg in action_params['args']:
|
|
||||||
arg = {**action_args, **arg}
|
|
||||||
self._verify_argument(arg, command['infer_action'], command_name, action)
|
|
||||||
self.logger.info('Commands file is valid ✅️')
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _parse_inherited_command(self, parent, command, simple_parent):
|
|
||||||
"""
|
|
||||||
parse a command that inherits from parent command
|
|
||||||
:param parent: parsed parent command
|
|
||||||
:param command: the current command
|
|
||||||
:param simple_parent: unparsed parent command
|
|
||||||
:return: parsed command
|
|
||||||
"""
|
|
||||||
# deepcopy parent and command to avoid modifying the originals
|
|
||||||
command = copy.deepcopy(command)
|
|
||||||
config = copy.deepcopy(parent)
|
|
||||||
# add help
|
|
||||||
if 'help' in command:
|
|
||||||
config['help'] = command['help']
|
|
||||||
if 'actions' not in command:
|
|
||||||
return config
|
|
||||||
for action, command_params in command['actions'].items():
|
|
||||||
self.__current_action = action
|
|
||||||
if action not in config['actions']:
|
|
||||||
# todo: handle this case
|
|
||||||
pass
|
|
||||||
parent_params = config['actions'][action]
|
|
||||||
if 'args' in command_params:
|
|
||||||
# child has args => inherit action level params from parent + override with child args + use child's
|
|
||||||
# action level params
|
|
||||||
context = {**self.propagate_config, **simple_parent['actions'][action], **command_params}
|
|
||||||
config['actions'][action]['args'] = self.parse_action(context, command_params['args'])
|
|
||||||
elif 'argc' in command_params:
|
|
||||||
# child has action level args (argc)
|
|
||||||
context = {**self.propagate_config, **simple_parent['actions'][action], **command_params}
|
|
||||||
config['actions'][action]['args'] = self.parse_action(context, [])
|
|
||||||
else:
|
|
||||||
# child does not have args => use parent's action level params + override with child's action level
|
|
||||||
if 'args' in parent_params:
|
|
||||||
config['actions'][action]['args'] = self.parse_action({}, parent_params['args'], command_params)
|
|
||||||
|
|
||||||
if 'detectors' in command_params:
|
|
||||||
if command_params['detectors'] is None:
|
|
||||||
# if child has an empty detector section, then delete the parent's detector section
|
|
||||||
del config['actions'][action]['detectors']
|
|
||||||
continue
|
|
||||||
|
|
||||||
for detector_name, detector_params in command_params['detectors'].items():
|
|
||||||
if 'detectors' not in config['actions'][action]:
|
|
||||||
config['actions'][action]['detectors'] = {}
|
|
||||||
config_detector = config['actions'][action]['detectors']
|
|
||||||
if 'detectors' not in parent_params or detector_name not in parent_params['detectors']:
|
|
||||||
if 'args' in detector_params:
|
|
||||||
# if child has detector args and parent does not have detectors
|
|
||||||
# => use child's detector args
|
|
||||||
context = {**self.propagate_config, **simple_parent['actions'][action], **detector_params}
|
|
||||||
config_detector[detector_name] = self.parse_action(context, detector_params['args'])
|
|
||||||
elif 'args' in parent_params:
|
|
||||||
# if child does not have detector args and parent does not have detectors
|
|
||||||
# => use the child's action args
|
|
||||||
context = {**self.propagate_config, **simple_parent['actions'][action]}
|
|
||||||
config_detector[detector_name] = self.parse_action(context,
|
|
||||||
config['actions'][action]['args'],
|
|
||||||
detector_params)
|
|
||||||
elif detector_name in parent_params['detectors']:
|
|
||||||
|
|
||||||
if 'args' in detector_params:
|
|
||||||
# child and parent have the same detector and child has detector args
|
|
||||||
# => use child's detector args
|
|
||||||
context = {
|
|
||||||
**self.propagate_config,
|
|
||||||
**simple_parent['actions'][action],
|
|
||||||
**simple_parent['actions'][action]['detectors'][detector_name],
|
|
||||||
|
|
||||||
}
|
|
||||||
config_detector[detector_name] = self.parse_action(context, detector_params['args'])
|
|
||||||
else:
|
|
||||||
# child and parent have the same detector and child does not have detector args
|
|
||||||
# => use parent's detector args
|
|
||||||
priority_context = {**command_params, **detector_params}
|
|
||||||
config_detector[detector_name] = self.parse_action(
|
|
||||||
{},
|
|
||||||
parent_params['detectors'][detector_name],
|
|
||||||
priority_context
|
|
||||||
)
|
|
||||||
|
|
||||||
else:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return config
|
|
||||||
|
|
||||||
def _parse_command(self, command):
|
|
||||||
"""
|
|
||||||
logic function for parse_command.
|
|
||||||
This function is recursive
|
|
||||||
:return: parsed command
|
|
||||||
"""
|
|
||||||
config = self.default_config.copy()
|
|
||||||
config.update(command)
|
|
||||||
config['actions'] = {}
|
|
||||||
|
|
||||||
# check if command inherits from another command
|
|
||||||
if 'inherit_actions' in command:
|
|
||||||
if command['inherit_actions'] in self.extended_commands:
|
|
||||||
# if parent command has already been parsed, use that
|
|
||||||
parent = self.extended_commands[command['inherit_actions']]
|
|
||||||
else:
|
|
||||||
# if parent command has not been parsed, parse it
|
|
||||||
parent = self.parse_command(command['inherit_actions'])
|
|
||||||
# parse the current command and merge it with the parent command
|
|
||||||
config = self._parse_inherited_command(parent, command, self.simple_commands[command['inherit_actions']])
|
|
||||||
return config
|
|
||||||
|
|
||||||
if 'actions' not in command:
|
|
||||||
return config
|
|
||||||
|
|
||||||
for action, action_params in command['actions'].items():
|
|
||||||
self.__current_action = action
|
|
||||||
|
|
||||||
config['actions'][action] = {}
|
|
||||||
config_action = config['actions'][action]
|
|
||||||
# the context in the current command and the current action
|
|
||||||
action_context = {**self.propagate_config, **action_params}
|
|
||||||
if 'args' not in action_params:
|
|
||||||
# parse the action with the action context
|
|
||||||
if action_params.keys() != {'detectors'}:
|
|
||||||
config_action['args'] = self.parse_action(action_context, [])
|
|
||||||
else:
|
|
||||||
config_action['args'] = self.parse_action(action_context, action_params['args'])
|
|
||||||
|
|
||||||
# check if the action has detectors
|
|
||||||
if 'detectors' in action_params:
|
|
||||||
config_action['detectors'] = {}
|
|
||||||
for detector_name, detector_params in action_params['detectors'].items():
|
|
||||||
# get the context for the detector and merge it with the action context
|
|
||||||
detector_context = {**action_context, **detector_params}
|
|
||||||
|
|
||||||
# if the detector does not have args, then use the action args
|
|
||||||
# otherwise, use the detector args and override the action args
|
|
||||||
tmp_args = []
|
|
||||||
if 'args' not in detector_params:
|
|
||||||
if 'args' in config_action:
|
|
||||||
tmp_args = config_action['args']
|
|
||||||
else:
|
|
||||||
tmp_args = detector_params['args']
|
|
||||||
detector_params['args'] = tmp_args
|
|
||||||
|
|
||||||
# parse the action with the detector context
|
|
||||||
config_action['detectors'][detector_name] = self.parse_action(detector_context,
|
|
||||||
tmp_args,
|
|
||||||
detector_params)
|
|
||||||
return config
|
|
||||||
|
|
||||||
def sanitize_argument(func):
|
|
||||||
def f(self, action_context, args_old, priority_context={}):
|
|
||||||
args = func(self, action_context, args_old, priority_context)
|
|
||||||
for i, arg in enumerate(args):
|
|
||||||
if 'args' in arg:
|
|
||||||
del arg['args']
|
|
||||||
if 'detectors' in arg:
|
|
||||||
del arg['detectors']
|
|
||||||
if not arg['cast_input']:
|
|
||||||
# if the cast_input is empty, then set it to False
|
|
||||||
arg['cast_input'] = [False] * len(arg['input'])
|
|
||||||
|
|
||||||
elif len(arg['cast_input']) != len(arg['input']):
|
|
||||||
# if the cast_input is not the same length as the input, then set it to False
|
|
||||||
arg['cast_input'] = [False] * len(arg['input'])
|
|
||||||
self.logger.warning(f'cast_input for {arg["function"]} '
|
|
||||||
f'with argc: {arg["argc"]} has different length than input')
|
|
||||||
if 'store_result_in_t' not in arg:
|
|
||||||
if self.__current_action == 'GET':
|
|
||||||
arg['store_result_in_t'] = True
|
|
||||||
else:
|
|
||||||
arg['store_result_in_t'] = False
|
|
||||||
return args
|
|
||||||
|
|
||||||
return f
|
|
||||||
|
|
||||||
@sanitize_argument
|
|
||||||
def parse_action(self, action_context, args, priority_context={}):
|
|
||||||
"""
|
|
||||||
parse an action
|
|
||||||
:param action_context: context of the action
|
|
||||||
:param args: arguments to be used in the action
|
|
||||||
:param priority_context: context that should override the arguments params
|
|
||||||
:return: parsed action
|
|
||||||
"""
|
|
||||||
|
|
||||||
def add_cast_input(argument):
|
|
||||||
return argument
|
|
||||||
|
|
||||||
# deepcopy action_context to avoid modifying the original
|
|
||||||
action_context = {**self.propagate_config, **copy.deepcopy(action_context)}
|
|
||||||
priority_context = copy.deepcopy(priority_context)
|
|
||||||
|
|
||||||
if 'detectors' in action_context:
|
|
||||||
del action_context['detectors']
|
|
||||||
if 'detectors' in priority_context:
|
|
||||||
del priority_context['detectors']
|
|
||||||
|
|
||||||
if args == []:
|
|
||||||
# if there are no arguments, then the action has only one argument
|
|
||||||
context = {**action_context, **priority_context}
|
|
||||||
return [add_cast_input(context)]
|
|
||||||
|
|
||||||
ret_args = []
|
|
||||||
if 'args' in action_context:
|
|
||||||
del action_context['args']
|
|
||||||
if 'args' in priority_context:
|
|
||||||
del priority_context['args']
|
|
||||||
|
|
||||||
# if there are arguments, then merge them with the action context and priority context
|
|
||||||
for arg in args:
|
|
||||||
arg = {**action_context, **arg, **priority_context}
|
|
||||||
ret_args.append(add_cast_input(arg))
|
|
||||||
return ret_args
|
|
||||||
|
|
||||||
def parse_command(self, command_name):
|
|
||||||
"""
|
|
||||||
parse a single command
|
|
||||||
This function is recursive
|
|
||||||
|
|
||||||
:param command_name: name of the command to parse
|
|
||||||
:return: the parsed command
|
|
||||||
"""
|
|
||||||
command = self.simple_commands[command_name]
|
|
||||||
parsed_command = self._parse_command(command)
|
|
||||||
if 'function_alias' not in command:
|
|
||||||
if 'command_name' in command:
|
|
||||||
parsed_command['function_alias'] = command['command_name']
|
|
||||||
else:
|
|
||||||
parsed_command['function_alias'] = command_name
|
|
||||||
|
|
||||||
if 'command_name' not in command:
|
|
||||||
parsed_command['command_name'] = command_name
|
|
||||||
|
|
||||||
if 'template' in command and command['template']:
|
|
||||||
return parsed_command
|
|
||||||
self.extended_commands[command_name] = parsed_command
|
|
||||||
return self.extended_commands[command_name]
|
|
||||||
|
|
||||||
def parse_all_commands(self):
|
|
||||||
"""
|
|
||||||
iterate over all commands in yaml file and parse them
|
|
||||||
:return: None
|
|
||||||
"""
|
|
||||||
|
|
||||||
for command_name in self.simple_commands:
|
|
||||||
# todo remove this (added for debugging)
|
|
||||||
if command_name != 'xtiming':
|
|
||||||
self.parse_command(command_name)
|
|
||||||
|
|
||||||
# post-process the parsed commands
|
|
||||||
self.post_process_all_commands()
|
|
||||||
|
|
||||||
yaml.Dumper.ignore_aliases = lambda *args: True
|
|
||||||
self.logger.info(f'parsed {len(self.extended_commands)} commands')
|
|
||||||
yaml.dump(self.extended_commands, self.output_file.open('w'), default_flow_style=False)
|
|
||||||
|
|
||||||
def post_process_all_commands(self):
|
|
||||||
for command_name, command in self.extended_commands.items():
|
|
||||||
if 'is_description' in command and command['is_description']:
|
|
||||||
continue
|
|
||||||
for action_name, action, in command['actions'].items():
|
|
||||||
for arg in action['args']:
|
|
||||||
if arg['argc'] == 0:
|
|
||||||
arg['arg_types'] = []
|
|
||||||
continue
|
|
||||||
if arg['argc'] == -1:
|
|
||||||
pass
|
|
||||||
if arg['arg_types'] == []:
|
|
||||||
arg['arg_types'] = arg['input_types']
|
|
||||||
|
|
||||||
|
|
||||||
# command_parser = CommandParser(Path(
|
|
||||||
# '/afs/psi.ch/user/b/braham_b/github/slsDetectorPackage/slsDetectorSoftware/generator/tests/command_parser/data/detectors.yaml'))
|
|
||||||
command_parser = CommandParser()
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
command_parser.verify_format()
|
|
||||||
command_parser.parse_all_commands()
|
|
@ -1,282 +0,0 @@
|
|||||||
class CodeGenerator:
|
|
||||||
def __init__(self):
|
|
||||||
self.file = None
|
|
||||||
self.actions_dict = {
|
|
||||||
'GET': 'slsDetectorDefs::GET_ACTION',
|
|
||||||
'PUT': 'slsDetectorDefs::PUT_ACTION',
|
|
||||||
'READOUT': 'slsDetectorDefs::READOUT_ACTION',
|
|
||||||
'HELP': 'slsDetectorDefs::HELP_ACTION',
|
|
||||||
}
|
|
||||||
self.template_file = None
|
|
||||||
|
|
||||||
def open(self, path):
|
|
||||||
self.file = path.open('w')
|
|
||||||
|
|
||||||
def close(self):
|
|
||||||
self.file.close()
|
|
||||||
self.file = None
|
|
||||||
|
|
||||||
def write_line(self, line):
|
|
||||||
self.file.write(line + '\n')
|
|
||||||
|
|
||||||
def write(self, text):
|
|
||||||
self.file.write(text)
|
|
||||||
|
|
||||||
def write_opening(self, path):
|
|
||||||
"""Write the opening file for the caller.cpp file"""
|
|
||||||
self.template_file = path.open('r')
|
|
||||||
for line in self.template_file:
|
|
||||||
if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE" in line:
|
|
||||||
return
|
|
||||||
self.file.write(line)
|
|
||||||
|
|
||||||
def write_closing(self):
|
|
||||||
"""Write the closing file for the caller.cpp file"""
|
|
||||||
for line in self.template_file.readlines():
|
|
||||||
self.file.write(line)
|
|
||||||
self.template_file.close()
|
|
||||||
|
|
||||||
def write_header(self, in_path, out_path, commands, deprecated_commands):
|
|
||||||
"""Write the header file for the caller.h file"""
|
|
||||||
with out_path.open('w') as fp:
|
|
||||||
with in_path.open('r') as fp2:
|
|
||||||
for line in fp2:
|
|
||||||
if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1)" in line:
|
|
||||||
for command_name, command in commands.items():
|
|
||||||
if 'duplicate_function' in command and command['duplicate_function']:
|
|
||||||
continue
|
|
||||||
fp.write(f'std::string {command["function_alias"]}(int action);\n')
|
|
||||||
continue
|
|
||||||
if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (2)" in line:
|
|
||||||
map_string = ''
|
|
||||||
for command_name, command in commands.items():
|
|
||||||
map_string += f'{{"{command_name}", &Caller::{command["function_alias"]}}},'
|
|
||||||
fp.write(map_string[:-1] + '\n')
|
|
||||||
continue
|
|
||||||
|
|
||||||
if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (3)" in line:
|
|
||||||
for key, value in deprecated_commands.items():
|
|
||||||
fp.write(f'{{"{key}", "{value}"}},\n')
|
|
||||||
continue
|
|
||||||
|
|
||||||
fp.write(line)
|
|
||||||
|
|
||||||
def write_infer_header(self, in_path, out_path, commands):
|
|
||||||
"""Write the header file for the inferAction.h file"""
|
|
||||||
with out_path.open('w+') as fp:
|
|
||||||
with in_path.open('r') as fp2:
|
|
||||||
for line in fp2:
|
|
||||||
if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1) - DO NOT REMOVE" in line:
|
|
||||||
for command_name, command in commands.items():
|
|
||||||
if 'duplicate_function' in command and command['duplicate_function']:
|
|
||||||
continue
|
|
||||||
|
|
||||||
fp.write(f'int {command["function_alias"]}();\n')
|
|
||||||
continue
|
|
||||||
if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (2) - DO NOT REMOVE" in line:
|
|
||||||
map_string = ''
|
|
||||||
for command_name, command in commands.items():
|
|
||||||
map_string += f'{{"{command_name}", &InferAction::{command["function_alias"]}}},'
|
|
||||||
fp.write(map_string[:-1] + '\n')
|
|
||||||
continue
|
|
||||||
fp.write(line)
|
|
||||||
|
|
||||||
def write_infer_cpp(self, in_path, out_path, commands, non_dist, type_dist):
|
|
||||||
"""Write the source file for the inferAction.cpp file"""
|
|
||||||
with in_path.open('r') as fp2:
|
|
||||||
for line in fp2:
|
|
||||||
if "THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1) - DO NOT REMOVE" in line:
|
|
||||||
for command_name, command in commands.items():
|
|
||||||
if 'duplicate_function' in command and command['duplicate_function']:
|
|
||||||
continue
|
|
||||||
|
|
||||||
with function('int', f"InferAction::{command['function_alias']}", []) as f:
|
|
||||||
if (command_name, -1) in non_dist| type_dist:
|
|
||||||
self.write_line(
|
|
||||||
f'throw RuntimeError("sls_detector is disabled for command: {command_name}. Use sls_detector_get or sls_detector_put");')
|
|
||||||
elif not command['infer_action']:
|
|
||||||
self.write_line('throw RuntimeError("infer_action is disabled");')
|
|
||||||
else:
|
|
||||||
checked_argcs = set()
|
|
||||||
for action, action_params in command['actions'].items():
|
|
||||||
for arg in action_params['args']:
|
|
||||||
if arg['argc'] in checked_argcs:
|
|
||||||
continue
|
|
||||||
checked_argcs.add(arg['argc'])
|
|
||||||
with if_block(f'args.size() == {arg["argc"]}'):
|
|
||||||
# check if this argc is not distinguishable
|
|
||||||
if (command_name, arg["argc"]) in non_dist | type_dist:
|
|
||||||
self.write_line(
|
|
||||||
f'throw RuntimeError("sls_detector is disabled for command: {command_name} with number of arguments {arg["argc"]}. Use sls_detector_get or sls_detector_put");')
|
|
||||||
else:
|
|
||||||
self.write_line(f'return {self.actions_dict[action]};')
|
|
||||||
with else_block():
|
|
||||||
self.write_line(
|
|
||||||
'throw RuntimeError("Could not infer action: Wrong number of arguments");')
|
|
||||||
continue
|
|
||||||
self.write_line(line)
|
|
||||||
|
|
||||||
def write_check_arg(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def write_arg(self, args, action, command_name):
|
|
||||||
for arg in args:
|
|
||||||
if arg['argc'] != -1:
|
|
||||||
if_block(f'args.size() == {arg["argc"]}',).__enter__()
|
|
||||||
if 'pattern_command' in arg and arg['pattern_command']:
|
|
||||||
self.write_line(f'int level = -1, iArg = 0, '
|
|
||||||
f'nGetArgs = {arg["pattern_command"]["nGetArgs"]},'
|
|
||||||
f' nPutArgs = {arg["pattern_command"]["nPutArgs"]};\nGetLevelAndUpdateArgIndex(action, '
|
|
||||||
f'"{arg["pattern_command"]["command_name"]}", level, iArg, nGetArgs,nPutArgs);'
|
|
||||||
)
|
|
||||||
|
|
||||||
if 'extra_variables' in arg:
|
|
||||||
for var in arg['extra_variables']:
|
|
||||||
codegen.write_line(f'{var["type"]} {var["name"]} = {var["value"]};')
|
|
||||||
if 'separate_time_units' in arg and arg['separate_time_units']:
|
|
||||||
self.write_line(f'std::string tmp_time({arg["separate_time_units"]["input"]});')
|
|
||||||
self.write_line(f'std::string {arg["separate_time_units"]["output"][1]}'
|
|
||||||
f' = RemoveUnit(tmp_time);')
|
|
||||||
self.write_line(f'auto {arg["separate_time_units"]["output"][0]} = '
|
|
||||||
f'StringTo < time::ns > (tmp_time,'
|
|
||||||
f' {arg["separate_time_units"]["output"][1]});')
|
|
||||||
if 'convert_to_time' in arg and arg['convert_to_time']:
|
|
||||||
self.write_line(f'auto {arg["convert_to_time"]["output"]} = '
|
|
||||||
f'StringTo < time::ns > ({", ".join(arg["convert_to_time"]["input"])});')
|
|
||||||
input_arguments = []
|
|
||||||
if 'exceptions' in arg:
|
|
||||||
for exception in arg['exceptions']:
|
|
||||||
self.write_line(f'if ({exception["condition"]}) {{ throw RuntimeError({exception["message"]}); }}')
|
|
||||||
if 'check_det_id' in arg and arg['check_det_id']:
|
|
||||||
self.write_line(
|
|
||||||
f'if (det_id != -1) {{ throw RuntimeError("Cannot execute {command_name} at module level"); }} '
|
|
||||||
)
|
|
||||||
# only used for 3 commands :(
|
|
||||||
if 'ctb_output_list' in arg:
|
|
||||||
self.write_line(f"""
|
|
||||||
std::string suffix = " {arg['ctb_output_list']['suffix']}";
|
|
||||||
auto t = det->{arg['ctb_output_list']['GETFCNLIST']}();""")
|
|
||||||
if arg['ctb_output_list']['GETFCNNAME'] != '':
|
|
||||||
self.write_line(f"""
|
|
||||||
auto names = det->{arg['ctb_output_list']['GETFCNNAME']}();
|
|
||||||
auto name_it = names.begin();""")
|
|
||||||
self.write_line("os << '[';")
|
|
||||||
with if_block(f't.size() > 0'):
|
|
||||||
self.write_line(f"""
|
|
||||||
auto it = t.cbegin();
|
|
||||||
os << ToString({arg['ctb_output_list']['printable_name']}) << ' ';
|
|
||||||
os << OutString(det->{arg['ctb_output_list']['GETFCN']}(*it++, std::vector<int>{{det_id}}))<< suffix;
|
|
||||||
while (it != t.cend()) {{
|
|
||||||
os << ", " << ToString({arg['ctb_output_list']['printable_name']}) << ' ';
|
|
||||||
os << OutString(det->{arg['ctb_output_list']['GETFCN']}(*it++, std::vector<int>{{det_id}}))<< suffix;
|
|
||||||
}}
|
|
||||||
""")
|
|
||||||
self.write_line('os << "]\\n";')
|
|
||||||
if arg['argc'] != -1:
|
|
||||||
if_block().__exit__()
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
for i in range(len(arg['input'])):
|
|
||||||
if arg['cast_input'][i]:
|
|
||||||
self.write_line(
|
|
||||||
f'auto arg{i} = StringTo<{arg["input_types"][i]}>({arg["input"][i]});')
|
|
||||||
input_arguments.append(f'arg{i}')
|
|
||||||
else:
|
|
||||||
input_arguments.append(arg["input"][i])
|
|
||||||
if 'require_det_id' in arg and arg['require_det_id']:
|
|
||||||
if 'convert_det_id' in arg and arg['convert_det_id']:
|
|
||||||
input_arguments.append("std::vector<int>{ det_id }")
|
|
||||||
else:
|
|
||||||
input_arguments.append("det_id")
|
|
||||||
|
|
||||||
input_arguments = ", ".join(input_arguments)
|
|
||||||
# call function
|
|
||||||
if arg["function"]:
|
|
||||||
if arg['store_result_in_t']:
|
|
||||||
self.write_line(f'auto t = det->{arg["function"]}({input_arguments});')
|
|
||||||
else:
|
|
||||||
self.write_line(f'det->{arg["function"]}({input_arguments});')
|
|
||||||
else:
|
|
||||||
pass #We have no function so skip block
|
|
||||||
|
|
||||||
output_args = []
|
|
||||||
for output in arg['output']:
|
|
||||||
output_args.append(output)
|
|
||||||
if len(output_args) > 0:
|
|
||||||
self.write_line(f"os << {'<< '.join(output_args)} << '\\n';")
|
|
||||||
|
|
||||||
if arg['argc'] != -1:
|
|
||||||
if_block().__exit__()
|
|
||||||
|
|
||||||
|
|
||||||
class if_block:
|
|
||||||
def __init__(self, condition="", elseif=False):
|
|
||||||
self.condition = condition
|
|
||||||
self.elseif = elseif
|
|
||||||
self.block = False
|
|
||||||
|
|
||||||
def __enter__(self):
|
|
||||||
if self.elseif:
|
|
||||||
codegen.write_line('else if (' + self.condition + ') {')
|
|
||||||
else:
|
|
||||||
codegen.write_line('if (' + self.condition + ') {')
|
|
||||||
if self.block:
|
|
||||||
codegen.write_line('{\n')
|
|
||||||
|
|
||||||
def __exit__(self, *args):
|
|
||||||
codegen.write_line('}')
|
|
||||||
if self.block:
|
|
||||||
codegen.write_line('}')
|
|
||||||
codegen.write_line('')
|
|
||||||
|
|
||||||
|
|
||||||
class else_block:
|
|
||||||
def __init__(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __enter__(self):
|
|
||||||
codegen.write_line('else {')
|
|
||||||
codegen.write_line('')
|
|
||||||
|
|
||||||
def __exit__(self, *args):
|
|
||||||
codegen.write_line('}')
|
|
||||||
codegen.write_line('')
|
|
||||||
|
|
||||||
|
|
||||||
class for_block:
|
|
||||||
def __init__(self, condition):
|
|
||||||
self.condition = condition
|
|
||||||
|
|
||||||
def __enter__(self):
|
|
||||||
codegen.write_line('for (' + self.condition + ') {')
|
|
||||||
codegen.write_line('')
|
|
||||||
|
|
||||||
def __exit__(self, *args):
|
|
||||||
codegen.write_line('}')
|
|
||||||
codegen.write_line('')
|
|
||||||
|
|
||||||
|
|
||||||
class function:
|
|
||||||
def __init__(self, return_type, name, args: list[tuple[str, str]]):
|
|
||||||
self.name = name
|
|
||||||
self.args = args
|
|
||||||
self.return_type = return_type
|
|
||||||
|
|
||||||
def __enter__(self):
|
|
||||||
s = ""
|
|
||||||
for arg in self.args:
|
|
||||||
arg_type, arg_name = arg
|
|
||||||
s += arg_type + ' ' + arg_name + ', '
|
|
||||||
s = s[:-2]
|
|
||||||
codegen.write_line(self.return_type + ' ' + self.name +
|
|
||||||
f'({s}) {{')
|
|
||||||
codegen.write_line('')
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __exit__(self, *args):
|
|
||||||
codegen.write_line('}')
|
|
||||||
codegen.write_line('')
|
|
||||||
|
|
||||||
|
|
||||||
codegen = CodeGenerator()
|
|
@ -1,176 +0,0 @@
|
|||||||
#configuration
|
|
||||||
detectorversion: firmwareversion
|
|
||||||
softwareversion: detectorserverversion
|
|
||||||
receiverversion: rx_version
|
|
||||||
detectornumber: serialnumber
|
|
||||||
thisversion: clientversion
|
|
||||||
detsizechan: detsize
|
|
||||||
trimdir: settingspath
|
|
||||||
settingsdir: settingspath
|
|
||||||
flippeddatax: fliprows
|
|
||||||
|
|
||||||
#acquisition parameters
|
|
||||||
cycles: triggers
|
|
||||||
cyclesl: triggersl
|
|
||||||
clkdivider: readoutspeed
|
|
||||||
speed: readoutspeed
|
|
||||||
vhighvoltage: highvoltage
|
|
||||||
digitest: imagetest
|
|
||||||
filter: filterresistor
|
|
||||||
readnlines: readnrows
|
|
||||||
|
|
||||||
# temperature
|
|
||||||
|
|
||||||
# super old dacs
|
|
||||||
vtr: vtrim
|
|
||||||
vrf: vrpreamp
|
|
||||||
vrs: vrshaper
|
|
||||||
vcall: vcal
|
|
||||||
vis: vishaper
|
|
||||||
vshaper: vrshaper
|
|
||||||
vpreamp: vrpreamp
|
|
||||||
vshaperneg: vrshaper_n
|
|
||||||
viinsh: vishaper
|
|
||||||
vpl: vcal_n
|
|
||||||
vph: vcal_p
|
|
||||||
|
|
||||||
# dacs
|
|
||||||
vthreshold: dac
|
|
||||||
vsvp: dac
|
|
||||||
vsvn: dac
|
|
||||||
vtrim: dac
|
|
||||||
vrpreamp: dac
|
|
||||||
vrshaper: dac
|
|
||||||
vtgstv: dac
|
|
||||||
vcmp_ll: dac
|
|
||||||
vcmp_lr: dac
|
|
||||||
vcal: dac
|
|
||||||
vcmp_rl: dac
|
|
||||||
vcmp_rr: dac
|
|
||||||
rxb_rb: dac
|
|
||||||
rxb_lb: dac
|
|
||||||
vcp: dac
|
|
||||||
vcn: dac
|
|
||||||
vishaper: dac
|
|
||||||
iodelay: dac
|
|
||||||
vref_ds: dac
|
|
||||||
vcascn_pb: dac
|
|
||||||
vcascp_pb: dac
|
|
||||||
vout_cm: dac
|
|
||||||
vcasc_out: dac
|
|
||||||
vin_cm: dac
|
|
||||||
vref_comp: dac
|
|
||||||
ib_test_c: dac
|
|
||||||
vrshaper_n: dac
|
|
||||||
vipre: dac
|
|
||||||
vdcsh: dac
|
|
||||||
vth1: dac
|
|
||||||
vth2: dac
|
|
||||||
vth3: dac
|
|
||||||
vcal_n: dac
|
|
||||||
vcal_p: dac
|
|
||||||
vcassh: dac
|
|
||||||
vcas: dac
|
|
||||||
vicin: dac
|
|
||||||
vipre_out: dac
|
|
||||||
vref_h_adc: dac
|
|
||||||
vb_comp_fe: dac
|
|
||||||
vb_comp_adc: dac
|
|
||||||
vcom_cds: dac
|
|
||||||
vref_rstore: dac
|
|
||||||
vb_opa_1st: dac
|
|
||||||
vref_comp_fe: dac
|
|
||||||
vcom_adc1: dac
|
|
||||||
vref_prech: dac
|
|
||||||
vref_l_adc: dac
|
|
||||||
vref_cds: dac
|
|
||||||
vb_cs: dac
|
|
||||||
vb_opa_fd: dac
|
|
||||||
vcom_adc2: dac
|
|
||||||
vb_ds: dac
|
|
||||||
vb_comp: dac
|
|
||||||
vb_pixbuf: dac
|
|
||||||
vin_com: dac
|
|
||||||
vdd_prot: dac
|
|
||||||
vbp_colbuf: dac
|
|
||||||
vb_sda: dac
|
|
||||||
vcasc_sfp: dac
|
|
||||||
vipre_cds: dac
|
|
||||||
ibias_sfp: dac
|
|
||||||
|
|
||||||
defaultdacs: resetdacs
|
|
||||||
|
|
||||||
#acquisition
|
|
||||||
busy: clearbusy
|
|
||||||
receiver: rx_status
|
|
||||||
framescaught: rx_framescaught
|
|
||||||
startingfnum: nextframenumber
|
|
||||||
|
|
||||||
#Network Configuration (Detector<->Receiver)
|
|
||||||
detectorip: udp_srcip
|
|
||||||
detectorip2: udp_srcip2
|
|
||||||
detectormac: udp_srcmac
|
|
||||||
detectormac2: udp_srcmac2
|
|
||||||
rx_udpip: udp_dstip
|
|
||||||
rx_udpip2: udp_dstip2
|
|
||||||
rx_udpmac: udp_dstmac
|
|
||||||
rx_udpmac2: udp_dstmac2
|
|
||||||
rx_udpport: udp_dstport
|
|
||||||
rx_udpport2: udp_dstport2
|
|
||||||
flowcontrol_10g: flowcontrol10g
|
|
||||||
txndelay_frame: txdelay_frame
|
|
||||||
txndelay_left: txdelay_left
|
|
||||||
txndelay_right: txdelay_right
|
|
||||||
|
|
||||||
#Receiver Config
|
|
||||||
r_silent: rx_silent
|
|
||||||
r_discardpolicy: rx_discardpolicy
|
|
||||||
r_padding: rx_padding
|
|
||||||
r_lock: rx_lock
|
|
||||||
r_lastclient: rx_lastclient
|
|
||||||
|
|
||||||
#File
|
|
||||||
fileformat: fformat
|
|
||||||
outdir: fpath
|
|
||||||
index: findex
|
|
||||||
enablefwrite: fwrite
|
|
||||||
masterfile: fmaster
|
|
||||||
overwrite: foverwrite
|
|
||||||
r_framesperfile: rx_framesperfile
|
|
||||||
|
|
||||||
#ZMQ Streaming Parameters (Receiver<->Client)
|
|
||||||
r_readfreq: rx_zmqfreq
|
|
||||||
rx_readfreq: rx_zmqfreq
|
|
||||||
rx_datastream: rx_zmqstream
|
|
||||||
|
|
||||||
#Eiger Specific
|
|
||||||
resmat: partialreset
|
|
||||||
|
|
||||||
#Jungfrau Specific
|
|
||||||
storagecells: extrastoragecells
|
|
||||||
auto_comp_disable: autocompdisable
|
|
||||||
comp_disable_time: compdisabletime
|
|
||||||
|
|
||||||
#Gotthard Specific
|
|
||||||
#Gotthard2 Specific
|
|
||||||
#Mythen3 Specific
|
|
||||||
#CTB Specific
|
|
||||||
adc: slowadc
|
|
||||||
flags: romode
|
|
||||||
i_a: im_a
|
|
||||||
i_b: im_b
|
|
||||||
i_c: im_c
|
|
||||||
i_d: im_d
|
|
||||||
i_io: im_io
|
|
||||||
|
|
||||||
#Pattern
|
|
||||||
#Moench
|
|
||||||
|
|
||||||
#Advanced
|
|
||||||
copydetectorserver: updatedetectorserver
|
|
||||||
|
|
||||||
#Insignificant
|
|
||||||
nframes: framecounter
|
|
||||||
now: runtime
|
|
||||||
timestamp: frametime
|
|
||||||
frameindex: rx_frameindex
|
|
File diff suppressed because it is too large
Load Diff
@ -1,276 +0,0 @@
|
|||||||
import argparse
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from autocomplete.autocomplete import type_info
|
|
||||||
from cpp_codegen.codegen import codegen, if_block, for_block, function, else_block
|
|
||||||
from infer_action.check_infer import check_infer
|
|
||||||
from autocomplete.autocomplete import type_values
|
|
||||||
|
|
||||||
GEN_PATH = Path(__file__).parent
|
|
||||||
|
|
||||||
COMMANDS_PATH = GEN_PATH / 'extended_commands.yaml'
|
|
||||||
DEPRECATED_COMMANDS_PATH = GEN_PATH / 'deprecated_commands.yaml'
|
|
||||||
CPP_INPUT_PATH = GEN_PATH / 'Caller.in.cpp'
|
|
||||||
HEADER_INPUT_PATH = GEN_PATH / 'Caller.in.h'
|
|
||||||
CPP_OUTPUT_PATH = GEN_PATH.parent / 'src' / 'Caller.cpp'
|
|
||||||
HEADER_OUTPUT_PATH = GEN_PATH.parent / 'src' / 'Caller.h'
|
|
||||||
|
|
||||||
INFER_HEADER_INPUT_PATH = GEN_PATH / 'inferAction.in.h'
|
|
||||||
INFER_CPP_INPUT_PATH = GEN_PATH / 'inferAction.in.cpp'
|
|
||||||
INFER_HEADER_OUTPUT_PATH = GEN_PATH.parent / 'src' / 'inferAction.h'
|
|
||||||
INFER_CPP_OUTPUT_PATH = GEN_PATH.parent / 'src' / 'inferAction.cpp'
|
|
||||||
|
|
||||||
|
|
||||||
def generate(
|
|
||||||
commands_path=COMMANDS_PATH,
|
|
||||||
cpp_input_path=CPP_INPUT_PATH,
|
|
||||||
header_input_path=HEADER_INPUT_PATH,
|
|
||||||
cpp_output_path=CPP_OUTPUT_PATH,
|
|
||||||
header_output_path=HEADER_OUTPUT_PATH,
|
|
||||||
infer_header_input_path=INFER_HEADER_INPUT_PATH,
|
|
||||||
infer_cpp_input_path=INFER_CPP_INPUT_PATH,
|
|
||||||
infer_header_output_path=INFER_HEADER_OUTPUT_PATH,
|
|
||||||
infer_cpp_output_path=INFER_CPP_OUTPUT_PATH,
|
|
||||||
|
|
||||||
):
|
|
||||||
commands_config = yaml.unsafe_load(commands_path.open('r'))
|
|
||||||
deprecated_commands_config = yaml.unsafe_load(DEPRECATED_COMMANDS_PATH.open('r'))
|
|
||||||
type_dist, non_dist = check_infer(commands=commands_config)
|
|
||||||
|
|
||||||
codegen.open(cpp_output_path)
|
|
||||||
# write call function
|
|
||||||
codegen.write_opening(cpp_input_path)
|
|
||||||
|
|
||||||
# iterate over the commands and generate code for each
|
|
||||||
print(f"[X] found {len(commands_config)} commands")
|
|
||||||
print('[*] generating code for commands')
|
|
||||||
for command_name, command in commands_config.items():
|
|
||||||
if 'is_description' in command and command['is_description']:
|
|
||||||
continue
|
|
||||||
with function('std::string', 'Caller::' + command['function_alias'], [('int', 'action')]) as fn:
|
|
||||||
codegen.write_line('std::ostringstream os;')
|
|
||||||
|
|
||||||
# print help
|
|
||||||
codegen.write_line('// print help')
|
|
||||||
with if_block('action == slsDetectorDefs::HELP_ACTION'):
|
|
||||||
if command["help"].startswith('code:'):
|
|
||||||
codegen.write_line(command["help"].strip('code:'))
|
|
||||||
else:
|
|
||||||
codegen.write_line(f'os << "Command: {command_name}" << std::endl;')
|
|
||||||
codegen.write_line(f'os << R"V0G0N({command["help"]} )V0G0N" << std::endl;')
|
|
||||||
codegen.write_line('return os.str();')
|
|
||||||
|
|
||||||
# check if action and arguments are valid
|
|
||||||
|
|
||||||
codegen.write_line('// check if action and arguments are valid')
|
|
||||||
first = True
|
|
||||||
for action, action_params in command['actions'].items():
|
|
||||||
|
|
||||||
with if_block(f'action == {codegen.actions_dict[action]}', elseif=not first):
|
|
||||||
|
|
||||||
check_argc = True
|
|
||||||
for arg in action_params['args']:
|
|
||||||
if arg['argc'] == -1:
|
|
||||||
check_argc = False
|
|
||||||
break
|
|
||||||
# check number of arguments
|
|
||||||
condition = "1" if check_argc else "0"
|
|
||||||
|
|
||||||
if check_argc:
|
|
||||||
for arg in action_params['args']:
|
|
||||||
condition += f' && args.size() != {arg["argc"]}'
|
|
||||||
|
|
||||||
with if_block(condition):
|
|
||||||
codegen.write_line(f'throw RuntimeError("Wrong number of arguments for action {action}");')
|
|
||||||
|
|
||||||
for arg in action_params['args']:
|
|
||||||
if not check_argc:
|
|
||||||
continue
|
|
||||||
with if_block(f'args.size() == {arg["argc"]}'):
|
|
||||||
# check argument types
|
|
||||||
if 'extra_variables' in arg:
|
|
||||||
for var in arg['extra_variables']:
|
|
||||||
codegen.write_line(f'{var["type"]} {var["name"]} = {var["value"]};')
|
|
||||||
|
|
||||||
if 'separate_time_units' in arg and arg['separate_time_units']:
|
|
||||||
codegen.write_line(f'try {{')
|
|
||||||
# TODO: refactor this repeating code
|
|
||||||
codegen.write_line(f'std::string tmp_time({arg["separate_time_units"]["input"]});')
|
|
||||||
codegen.write_line(f'std::string {arg["separate_time_units"]["output"][1]}'
|
|
||||||
f' = RemoveUnit(tmp_time);')
|
|
||||||
codegen.write_line(f'auto {arg["separate_time_units"]["output"][0]} = '
|
|
||||||
f'StringTo < time::ns > (tmp_time,'
|
|
||||||
f' {arg["separate_time_units"]["output"][1]});')
|
|
||||||
codegen.write_line(
|
|
||||||
f'}} catch (...) {{ throw RuntimeError("Could not convert argument to time::ns");}}')
|
|
||||||
|
|
||||||
elif 'convert_to_time' in arg and arg['convert_to_time']:
|
|
||||||
codegen.write_line(f'try {{')
|
|
||||||
|
|
||||||
codegen.write_line(
|
|
||||||
f'StringTo < time::ns > ({", ".join(arg["convert_to_time"]["input"])});')
|
|
||||||
codegen.write_line(
|
|
||||||
f'}} catch (...) {{ throw RuntimeError("Could not convert arguments to time::ns");}}')
|
|
||||||
|
|
||||||
for i in range(len(arg['input'])):
|
|
||||||
if not arg['cast_input'][i]:
|
|
||||||
continue
|
|
||||||
codegen.write_line(f'try {{')
|
|
||||||
codegen.write_line(f'StringTo<{arg["input_types"][i]}>({arg["input"][i]});')
|
|
||||||
codegen.write_line(f'}} catch (...) {{')
|
|
||||||
codegen.write_line(
|
|
||||||
f' throw RuntimeError("Could not convert argument {i} to {arg["input_types"][i]}");')
|
|
||||||
codegen.write_line(f'}}')
|
|
||||||
first = False
|
|
||||||
with else_block():
|
|
||||||
codegen.write_line(
|
|
||||||
f'throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions are {list(command["actions"].keys())}");')
|
|
||||||
|
|
||||||
# generate code for each action
|
|
||||||
codegen.write_line('// generate code for each action')
|
|
||||||
for action, action_params in command['actions'].items():
|
|
||||||
if 'detectors' in action_params:
|
|
||||||
codegen.write_line('auto detector_type = det->getDetectorType().squash();')
|
|
||||||
|
|
||||||
with if_block(f'action == {codegen.actions_dict[action]}'):
|
|
||||||
if 'detectors' in action_params:
|
|
||||||
first = True
|
|
||||||
for detector, detector_params in action_params['detectors'].items():
|
|
||||||
with if_block(f'detector_type == defs::{detector}', elseif=not first):
|
|
||||||
codegen.write_arg(detector_params, action, command_name)
|
|
||||||
|
|
||||||
else_block().__enter__()
|
|
||||||
|
|
||||||
if not action_params:
|
|
||||||
codegen.write_line(f'throw RuntimeError("detector not supported for action: {action}");')
|
|
||||||
else:
|
|
||||||
tmp_args = []
|
|
||||||
if 'args' in action_params:
|
|
||||||
tmp_args = action_params['args']
|
|
||||||
codegen.write_arg(tmp_args, action, command_name)
|
|
||||||
|
|
||||||
if 'detectors' in action_params:
|
|
||||||
else_block().__exit__()
|
|
||||||
|
|
||||||
codegen.write_line('return os.str();')
|
|
||||||
|
|
||||||
# close sls namespace
|
|
||||||
codegen.write_closing()
|
|
||||||
codegen.close()
|
|
||||||
print('[X] .cpp code generated')
|
|
||||||
deprecated_commands = []
|
|
||||||
codegen.write_header(header_input_path, header_output_path, commands_config, deprecated_commands_config)
|
|
||||||
print('[X] header code generated')
|
|
||||||
|
|
||||||
|
|
||||||
codegen.write_infer_header(infer_header_input_path, infer_header_output_path, commands_config) #TODO: add deprecated commands
|
|
||||||
print('[X] infer header code generated')
|
|
||||||
codegen.open(infer_cpp_output_path)
|
|
||||||
|
|
||||||
codegen.write_infer_cpp(infer_cpp_input_path, infer_cpp_output_path, commands_config, non_dist, type_dist)
|
|
||||||
codegen.close()
|
|
||||||
print('[X] infer cpp code generated')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description='generate c++ code for cli commands from the commands.yaml file',
|
|
||||||
)
|
|
||||||
parser.add_argument('-f', '--format', action='store_true', default=False, dest='format',
|
|
||||||
help='format header and cpp file using clang-format')
|
|
||||||
parser.add_argument('-p', '--parse', action='store_true', default=False, dest='parse',
|
|
||||||
help='parse the commands.yaml file into extended_commands.yaml')
|
|
||||||
parser.add_argument('-c', '--check', action='store_true', default=False, dest='check',
|
|
||||||
help='check missing commands')
|
|
||||||
parser.add_argument('-g', '--generate', action='store_true', default=False, dest='generate', help='generate code (C++ or bash if -a is used)')
|
|
||||||
parser.add_argument('-a', '--autocomplete', action='store_true', default=False, dest='autocomplete',
|
|
||||||
help='print bash autocomplete values')
|
|
||||||
cli_args = parser.parse_args()
|
|
||||||
|
|
||||||
if cli_args.autocomplete:
|
|
||||||
from autocomplete.autocomplete import generate_type_values, generate_bash_autocomplete
|
|
||||||
if cli_args.generate:
|
|
||||||
generate_bash_autocomplete()
|
|
||||||
print('[X] bash autocomplete generated')
|
|
||||||
generate_bash_autocomplete(
|
|
||||||
output_path=Path(__file__).parent / 'autocomplete' / 'zsh_autocomplete.sh',
|
|
||||||
input_path=Path(__file__).parent / 'autocomplete' / 'zsh_autocomplete.in.sh'
|
|
||||||
)
|
|
||||||
print('[X] zsh autocomplete generated')
|
|
||||||
exit(0)
|
|
||||||
else:
|
|
||||||
ret = generate_type_values()
|
|
||||||
print(ret)
|
|
||||||
exit(0)
|
|
||||||
|
|
||||||
if cli_args.check:
|
|
||||||
from commands_parser.commands_parser import command_parser
|
|
||||||
|
|
||||||
commands_config = yaml.unsafe_load(COMMANDS_PATH.open('r'))
|
|
||||||
|
|
||||||
# infer action based on number of arguments and types
|
|
||||||
type_dist, non_dist = check_infer(commands=commands_config)
|
|
||||||
|
|
||||||
command_parser.verify_format()
|
|
||||||
command_parser.parse_all_commands()
|
|
||||||
# generate list of commands found in sls_detector_get
|
|
||||||
glist_path = GEN_PATH / 'glist'
|
|
||||||
ret = subprocess.run([f"sls_detector_get list | tail -n +2 | sort > {glist_path.absolute()}"], shell=True,
|
|
||||||
capture_output=True, check=True)
|
|
||||||
if ret.stderr != b'':
|
|
||||||
print('[!] glist generation failed and glist not found')
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
if not COMMANDS_PATH.exists():
|
|
||||||
print('[!] extended_commands.yaml not found')
|
|
||||||
exit(1)
|
|
||||||
detglist = set(command['command_name'] for __, command in commands_config.items())
|
|
||||||
detglist.add('free')
|
|
||||||
detglist.add('list')
|
|
||||||
|
|
||||||
g_path = GEN_PATH / 'glist'
|
|
||||||
if not g_path.exists():
|
|
||||||
print('[!] glist not found')
|
|
||||||
exit(1)
|
|
||||||
glist = set(g_path.read_text().split('\n'))
|
|
||||||
if "" in glist:
|
|
||||||
glist.remove("")
|
|
||||||
if "" in detglist:
|
|
||||||
detglist.remove("")
|
|
||||||
|
|
||||||
not_found = set()
|
|
||||||
for command in glist:
|
|
||||||
if command not in detglist:
|
|
||||||
not_found.add(command)
|
|
||||||
print()
|
|
||||||
if len(not_found) > 0:
|
|
||||||
print(f'[!] found {len(not_found)} missing')
|
|
||||||
print(f"not_found: {not_found}")
|
|
||||||
else:
|
|
||||||
print(f'[X] found no missing commands')
|
|
||||||
|
|
||||||
for command in detglist:
|
|
||||||
if command not in glist:
|
|
||||||
print(f'[!] command {command} found in commands.yaml but not found in g list')
|
|
||||||
|
|
||||||
exit(0)
|
|
||||||
|
|
||||||
if cli_args.parse:
|
|
||||||
from commands_parser.commands_parser import command_parser
|
|
||||||
|
|
||||||
command_parser.verify_format()
|
|
||||||
command_parser.parse_all_commands()
|
|
||||||
|
|
||||||
if cli_args.generate:
|
|
||||||
generate()
|
|
||||||
|
|
||||||
if cli_args.format:
|
|
||||||
files = [CPP_OUTPUT_PATH, HEADER_OUTPUT_PATH, INFER_HEADER_OUTPUT_PATH, INFER_CPP_OUTPUT_PATH]
|
|
||||||
for file in files:
|
|
||||||
os.system(f'clang-format -i {file.absolute()}')
|
|
||||||
#os.system(f'clang-format -i --style="{{Standard: C++11}}" {file.absolute()}')
|
|
||||||
print('[X] code formatted')
|
|
@ -1,20 +0,0 @@
|
|||||||
#include "inferAction.h"
|
|
||||||
#include "sls/sls_detector_defs.h"
|
|
||||||
namespace sls {
|
|
||||||
|
|
||||||
int InferAction::infer(sls::CmdParser &parser, std::ostream &os) {
|
|
||||||
args = parser.arguments();
|
|
||||||
cmd = parser.command();
|
|
||||||
auto it = functions.find(parser.command());
|
|
||||||
if (it != functions.end()) {
|
|
||||||
return ((*this).*(it->second))();
|
|
||||||
} else {
|
|
||||||
throw RuntimeError(
|
|
||||||
"sls_detector not implemented for command: " + parser.command() +
|
|
||||||
". Use sls_detector_get or sls_detector_put.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1) - DO NOT REMOVE
|
|
||||||
|
|
||||||
} // namespace sls
|
|
@ -1,30 +0,0 @@
|
|||||||
#include "CmdParser.h"
|
|
||||||
#include <iostream>
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace sls {
|
|
||||||
class InferAction {
|
|
||||||
public:
|
|
||||||
InferAction() {}
|
|
||||||
int infer(sls::CmdParser &parser, std::ostream &os = std::cout);
|
|
||||||
std::vector<std::string> args;
|
|
||||||
std::string cmd;
|
|
||||||
|
|
||||||
// generated functions
|
|
||||||
// THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (1) - DO NOT REMOVE
|
|
||||||
// int frames();
|
|
||||||
|
|
||||||
private:
|
|
||||||
using FunctionMap = std::map<std::string, int (InferAction::*)()>;
|
|
||||||
FunctionMap functions{
|
|
||||||
// generated functions
|
|
||||||
|
|
||||||
// THIS COMMENT TO BE REPLACED BY THE ACTUAL CODE (2) - DO NOT REMOVE
|
|
||||||
|
|
||||||
// {"frames",&InferAction::frames}
|
|
||||||
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace sls
|
|
@ -1,64 +0,0 @@
|
|||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
|
|
||||||
def check_infer(EXTENDED_COMMANDS_PATH=Path(__file__).parent.parent / "extended_commands.yaml", commands=None):
|
|
||||||
if commands is None:
|
|
||||||
# load yaml file
|
|
||||||
with EXTENDED_COMMANDS_PATH.open('r') as f:
|
|
||||||
commands = yaml.safe_load(f)
|
|
||||||
|
|
||||||
type_distinguishable = {}
|
|
||||||
non_distinguishable = {}
|
|
||||||
|
|
||||||
for command_name, command in commands.items():
|
|
||||||
# todo: remove this (added for debug)
|
|
||||||
# if command_name != 'badchannels':
|
|
||||||
# continue
|
|
||||||
if len(command["actions"]) == 1:
|
|
||||||
action = list(command["actions"].items())[0][1]
|
|
||||||
for arg in action['args']:
|
|
||||||
if arg['argc'] == -1:
|
|
||||||
non_distinguishable[(command_name, arg['argc'])] = ([], arg['arg_types'])
|
|
||||||
continue
|
|
||||||
|
|
||||||
|
|
||||||
get_argcs = {}
|
|
||||||
get_args = command['actions']['GET']['args']
|
|
||||||
for arg in get_args:
|
|
||||||
if arg['argc'] != -1:
|
|
||||||
get_argcs[arg["argc"]] = arg['arg_types']
|
|
||||||
else:
|
|
||||||
non_distinguishable[(command_name, arg['argc'])] = ([], arg['arg_types'])
|
|
||||||
put_args = command['actions']['PUT']['args']
|
|
||||||
for arg in put_args:
|
|
||||||
if arg['argc'] == -1:
|
|
||||||
non_distinguishable[(command_name, arg['argc'])] = ([], arg['arg_types'])
|
|
||||||
elif arg['argc'] in get_argcs:
|
|
||||||
if arg['arg_types'] != get_argcs[arg['argc']]:
|
|
||||||
type_distinguishable[(command_name, arg['argc'])] = (get_argcs[arg['argc']], arg['arg_types'])
|
|
||||||
else:
|
|
||||||
non_distinguishable[(command_name, arg['argc'])] = (get_argcs[arg['argc']], arg['arg_types'])
|
|
||||||
|
|
||||||
return type_distinguishable, non_distinguishable
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
argparse = argparse.ArgumentParser()
|
|
||||||
argparse.add_argument("--print", choices=['all', 'type', 'impossible'], default="all", help="command name")
|
|
||||||
args = argparse.parse_args()
|
|
||||||
|
|
||||||
type_distinguishable, non_distinguishable = check_infer()
|
|
||||||
if args.print == 'type' or args.print == 'all':
|
|
||||||
print("type distinguishable:")
|
|
||||||
print("command_name: argc get_arg_type put_arg_type\n")
|
|
||||||
for (command_name, argc), (get_arg_types, put_arg_types) in type_distinguishable.items():
|
|
||||||
print(f"{command_name}: {argc} {get_arg_types} {put_arg_types}")
|
|
||||||
|
|
||||||
if args.print == 'impossible' or args.print == 'all':
|
|
||||||
print("\n\nimpossible to distinguish:")
|
|
||||||
print("command_name: argc get_arg_type put_arg_type")
|
|
||||||
for (command_name, argc), (get_arg_types, put_arg_types) in non_distinguishable.items():
|
|
||||||
print(f"{command_name}: {argc} {get_arg_types} {put_arg_types}")
|
|
@ -1,288 +0,0 @@
|
|||||||
# Generator
|
|
||||||
used to generate C++ cli commands. and bash autocompletion scripts.
|
|
||||||
## Autocomplete
|
|
||||||
|
|
||||||
### Overview
|
|
||||||
|
|
||||||
Looks through the `dump.json` file for the different values of an enum and stores them in the dictionary `type_values`.
|
|
||||||
```sh
|
|
||||||
# To print the different values for enums
|
|
||||||
python gen_commands.py -a
|
|
||||||
```
|
|
||||||
|
|
||||||
also the autocomplete.py generates shell autocompletion scripts for both bash and zsh. It uses the template file `bash_autocomplete.in.sh` and adds the necessary code in an output file `bash_autocomplete.sh` (same for zsh).
|
|
||||||
To use the bash autocompletion the `bash_autocomplete.sh` must be sourced.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
source bash_autocomplete.sh
|
|
||||||
# g <Tab><Tab> will give the list of all commands
|
|
||||||
# p 0:<Tab><Tab> will also give the list of all commands
|
|
||||||
# g exp<Tab> will autocomplete to g exptime
|
|
||||||
# g exptime <Tab><Tab> will return "s ms us ns"
|
|
||||||
# p timing <Tab><Tab> will return "auto,burst_trigger,gating..."
|
|
||||||
```
|
|
||||||
|
|
||||||
**Note:**
|
|
||||||
The dump.json is the AST of the file `slsDetectorPackage/slsSupportLib/src/ToString.cpp`.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# to generate the dump.json file
|
|
||||||
cd slsSupportLib/src/ToString.cpp
|
|
||||||
clang++ -Xclang -ast-dump=json -Xclang -ast-dump-filter -Xclang StringTo -c ToString.cpp -I ../include/ -std=gnu++11
|
|
||||||
# clang version used: 14.0.0-1ubuntu1.1
|
|
||||||
```
|
|
||||||
|
|
||||||
the `dump.json` file produced by clang is not a correct json file because we used the `-ast-dump-filter`. autocomplete.py can be used to fix the format of `dump.json` and produce a new file called `fixed.json` that is json format.
|
|
||||||
```
|
|
||||||
# to convert dump.json into correct json format.
|
|
||||||
python autocomplete.py -f # produces the file fixed.json
|
|
||||||
```
|
|
||||||
|
|
||||||
### Code components
|
|
||||||
|
|
||||||
- `type_values` is a dictionary that contains the different values for commands args. It is populated with enum values that stard with defs:: or slsDetectorDefs:: (eg. defs::burstMode). Also it contains values added manually such as "mv,mV" and those start with special::
|
|
||||||
- `generate_type_values` parses the AST file to find the part that contains if statements. and extracts the different possible values for an enum.
|
|
||||||
- `generate_bash_autocomplete` generates autocompletion scripts for bash or zsh. the difference between zsh and bash scripts can be found in the template files. (bash handles 0:<Tab><Tab> completion differently than zsh more details can be found in the comments of the template files )
|
|
||||||
- `fix_json` fixes the file 'autocomplete/dump.json' and outputs a new corrected file in 'autocomplete/fixed.json'
|
|
||||||
|
|
||||||
## Command Parser
|
|
||||||
|
|
||||||
Definitely the most important component of all the generator module.
|
|
||||||
|
|
||||||
command_parser exist to keep the commands.yaml file concise and easy to read and produce a complete version of the commands.yaml for the code generator to work on.
|
|
||||||
|
|
||||||
The goal is that the code generator works on a version of commands.yaml that is easy to iterate over and generate code.
|
|
||||||
```
|
|
||||||
# complete version
|
|
||||||
some_command:
|
|
||||||
help: "do this"
|
|
||||||
infer_action: true
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
args:
|
|
||||||
- argc: 0
|
|
||||||
function: "getCommand"
|
|
||||||
...
|
|
||||||
- argc: 1
|
|
||||||
function: "getCommand"
|
|
||||||
...
|
|
||||||
detectors:
|
|
||||||
MYTHEN3:
|
|
||||||
- argc: 0
|
|
||||||
function: "getCommandMythen"
|
|
||||||
...
|
|
||||||
PUT:
|
|
||||||
args:
|
|
||||||
- argc: 2
|
|
||||||
function: "setCommand"
|
|
||||||
...
|
|
||||||
- argc: 3
|
|
||||||
function: "setCommand"
|
|
||||||
...
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
the complete vesion can only have `args` or `detectors` field inside an action (GET or PUT). **Each element in the args array have a different argc**. and in each element in the args array we can find all the information needed to generate the code for that one argc case. for example in the code `if(action == 'GET')` and `if (args.size() == 1)` then we can generate the code for that one case independetly.
|
|
||||||
|
|
||||||
|
|
||||||
commands.yaml has a lot on ~inheritance~. examples show best what it is:
|
|
||||||
|
|
||||||
> fields insides an action will be passed to args and detectors
|
|
||||||
|
|
||||||
> the extended args for default actions will be used for detectors
|
|
||||||
|
|
||||||
> any field can be overriden
|
|
||||||
|
|
||||||
```
|
|
||||||
resetdacs:
|
|
||||||
help: "[(optional) hard] ..."
|
|
||||||
actions:
|
|
||||||
PUT:
|
|
||||||
function: resetToDefaultDacs
|
|
||||||
require_det_id: true
|
|
||||||
output: [ '"successful"' ]
|
|
||||||
input_types: [ bool ]
|
|
||||||
args:
|
|
||||||
- argc: 1
|
|
||||||
arg_types: [ special::hard ]
|
|
||||||
input: [ '"1"' ]
|
|
||||||
- argc: 0
|
|
||||||
input: [ '"0"' ]
|
|
||||||
|
|
||||||
# this will be converted to
|
|
||||||
|
|
||||||
resetdacs:
|
|
||||||
actions:
|
|
||||||
PUT:
|
|
||||||
args:
|
|
||||||
- arg_types:
|
|
||||||
- special::hard
|
|
||||||
argc: 1
|
|
||||||
cast_input:
|
|
||||||
- false
|
|
||||||
check_det_id: false
|
|
||||||
convert_det_id: true
|
|
||||||
function: resetToDefaultDacs
|
|
||||||
input:
|
|
||||||
- '"1"'
|
|
||||||
input_types:
|
|
||||||
- bool
|
|
||||||
output:
|
|
||||||
- '"successful"'
|
|
||||||
require_det_id: true
|
|
||||||
store_result_in_t: false
|
|
||||||
- arg_types: []
|
|
||||||
argc: 0
|
|
||||||
cast_input:
|
|
||||||
- false
|
|
||||||
check_det_id: false
|
|
||||||
convert_det_id: true
|
|
||||||
function: resetToDefaultDacs
|
|
||||||
input:
|
|
||||||
- '"0"'
|
|
||||||
input_types:
|
|
||||||
- bool
|
|
||||||
output:
|
|
||||||
- '"successful"'
|
|
||||||
require_det_id: true
|
|
||||||
store_result_in_t: false
|
|
||||||
command_name: resetdacs
|
|
||||||
function_alias: resetdacs
|
|
||||||
help: "[(optional) hard] ..."
|
|
||||||
infer_action: true
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
command_parser does not have a specific schema for the commands.yaml this is by design so it can be very extensible and future-proof. This also can have problems when there is typos (writing intput instead of input...)
|
|
||||||
|
|
||||||
command_parser first verifies the commands.yaml and checks if there's some obvious problems in it.
|
|
||||||
|
|
||||||
templates found in commands.yaml were taken from the CmdProxy code they were added for debugging purposes when writing the generator.
|
|
||||||
|
|
||||||
|
|
||||||
tricky things:
|
|
||||||
--
|
|
||||||
- if input array has n elements and cast_input array is empty. command_parser will fill it with n false values.
|
|
||||||
- store_result_in_t will be added by default as true to GET action. but as false to PUT action. (unless it is written in the action)
|
|
||||||
- infer_action by default is true
|
|
||||||
- commands that have is_description true won't be verified
|
|
||||||
- function_alias is the name of the function in the c++ code. by default it is the command name. errors came up with the command virtual as virtual is a reserved keyword in c++
|
|
||||||
- command_name is the string of the command that will be typed in cli. (frames, exptime, ...). by default it is the command name. pattern is a special keyword in yaml. problems came up with the command pattern
|
|
||||||
- arg_types is by default input_types unless otherwise specified
|
|
||||||
- when the parent has specific detector behaviour and the child does not. writing an empty detector section in the action would not inherit any detector specific fields (check exptime1)
|
|
||||||
- commands can inherit other commands (check exptime1 and exptime2)
|
|
||||||
- argc: -1 means that the command has an unknown number of arguments
|
|
||||||
|
|
||||||
|
|
||||||
### Code Walkthrough
|
|
||||||
the code is well commented it is well explained in the script
|
|
||||||
|
|
||||||
### Tests
|
|
||||||
tests for command_parser can be found in `generator/tests/command_parser/`
|
|
||||||
```
|
|
||||||
pip install -r requirements.txt
|
|
||||||
python -m pytests
|
|
||||||
```
|
|
||||||
|
|
||||||
verification is not well tested
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## codegen
|
|
||||||
|
|
||||||
Now for C++ code generation. After parsing the commands.yaml file and producing the extended_commands.yaml `gen_commands.py` will iterate over the commands and generate `Caller.h`, `Caller.cpp`, `inferAction.cpp` and `inferAction.h` .
|
|
||||||
|
|
||||||
### infer action
|
|
||||||
|
|
||||||
the generated code will produce 5 new targets: "sls_detector_get sls_detector_put sls_detector_acquire sls_detector_help sls_detector"
|
|
||||||
|
|
||||||
`sls_detector_get` will set the action as GET
|
|
||||||
`sls_detector_put` will the action as PUT
|
|
||||||
|
|
||||||
`sls_detector` will guess the action depending on the number of arguments
|
|
||||||
|
|
||||||
the codegen module will generate a function for every command that will return the action based on the number of arguments
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
int InferAction::activate() {
|
|
||||||
|
|
||||||
if (args.size() == 0) {
|
|
||||||
return slsDetectorDefs::GET_ACTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.size() == 1) {
|
|
||||||
return slsDetectorDefs::PUT_ACTION;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
throw RuntimeError("Could not infer action: Wrong number of arguments");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
the `inferAction` class will be called from `CmdApp.cpp` to infer the action and the command function will be called with the appropriate action.
|
|
||||||
|
|
||||||
some commands have the same number of argument count for both get and put. These commands can be found using the the `check_infer.py` script. in the generated code it will say that "sls_detector is disabled"
|
|
||||||
```bash
|
|
||||||
# to see these commands
|
|
||||||
python infer_action/check_infer.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### Caller.cpp code
|
|
||||||
|
|
||||||
in this level we only use the extended_commands.yaml file.
|
|
||||||
the `generate()` function in `gen_commands.py` will iterate over all of the commands and :
|
|
||||||
- write the function signature
|
|
||||||
- write the help
|
|
||||||
- write c++ code to check the inputs: check argument count and check if we are able to convert the arguments into the required types
|
|
||||||
- iterate over actions and arguments
|
|
||||||
- iterate over the detectors and write code for each one of them (if mythen3 ... if eiger ... else default code... ) and call `codegen.write_arg()` to write the argument for a single argument
|
|
||||||
|
|
||||||
codegen.write_arg()
|
|
||||||
-
|
|
||||||
write_arg in codegen reads the argument fields and generate c++ code accordingly.
|
|
||||||
|
|
||||||
## fields explanations
|
|
||||||
- arg_types:[array of types] it is only used for autocompletion no C++ code is dependent on it
|
|
||||||
- is_description:[boolean] same as above
|
|
||||||
- template:[boolean] only used in commands.yaml and it won't present in extended_commands.yaml. it is inspired by the CmdProxy.h code
|
|
||||||
- help:[string] command help
|
|
||||||
- input:[array of variable names] the input arguments that will be passed to the function
|
|
||||||
- input_types:[array of types] the types of the input arguments given to the function
|
|
||||||
- cast_input:[array of boolean] if true it will cast the corresponding input to the type in input_types
|
|
||||||
- output:[array] outputs that will be printed (eg. ["123", "'a'"] will be os<<123<<'a')
|
|
||||||
- function: the function that will be called
|
|
||||||
- function_alias: the name of the function in the c++ code (more on it in tricky things)
|
|
||||||
- command_name: the string of the command that will be typed in cli. (more on it in tricky things)
|
|
||||||
- require_det_id: if true it will require a detector id to be passed as the last argument
|
|
||||||
- check_det_id: if true it will check the detector id and throw an error if it is not valid
|
|
||||||
- convert_det_id: if true it will convert the detector id to the correct type `std::vector<int>{ det_id }`
|
|
||||||
- store_result_in_t: if true it will store the result of the function in the variable t (more on it in tricky things)
|
|
||||||
- infer_action: if true it will infer the action (only if sls_detector is used)
|
|
||||||
- detectors: the detectors that have specific behaviour
|
|
||||||
- args: the arguments of the command
|
|
||||||
- argc: the number of arguments
|
|
||||||
- extra_variables[array]: each element takes three parameters: value, name, type and creates that variable in the beginning of the argument code
|
|
||||||
- exceptions[array]: each element takes two parameters: condition, message
|
|
||||||
- pattern_command: takes three arguments: nGetArgs, nPutArgs and command_name and it will write this code
|
|
||||||
```cpp
|
|
||||||
int level = -1, iArg = 0, nGetArgs = $nGetArgs$, nPutArgs = $nPutArgs$;
|
|
||||||
GetLevelAndUpdateArgIndex(action, $command_name$, level, iArg, nGetArgs,nPutArgs);
|
|
||||||
```
|
|
||||||
- separate_time_units: takes three parameters: input, output[0], output[1] each one is a variable name
|
|
||||||
```cpp
|
|
||||||
std::string tmp_time($input$);
|
|
||||||
std::string $output[1]$ = RemoveUnit(tmp_time);
|
|
||||||
auto $output[0]$ = StringTo<time::ns>(tmp_time, $output[1]$);
|
|
||||||
```
|
|
||||||
- convert_to_time: takes three parameters: input[0], input[1], output
|
|
||||||
```cpp
|
|
||||||
auto output = StringTo<time::ns>(input[0], input[1]);
|
|
||||||
```
|
|
||||||
- ctb_output_list: **maybe it should be removed?** takes 5 parameters: GETFCNLIST, GETFCNNAME, GETFCN, suffix, printable_name
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
|||||||
coverage==7.3.1
|
|
||||||
iniconfig==2.0.0
|
|
||||||
packaging==23.1
|
|
||||||
pluggy==1.3.0
|
|
||||||
pytest==7.4.2
|
|
||||||
PyYAML==6.0.1
|
|
@ -1,16 +0,0 @@
|
|||||||
basic:
|
|
||||||
infer_action: false
|
|
||||||
help: "xx11"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
function: 'func1'
|
|
||||||
output: [ OutString(t) ]
|
|
||||||
args:
|
|
||||||
- argc: 0
|
|
||||||
PUT:
|
|
||||||
function: 'func2'
|
|
||||||
output: [ 'args.front()' ]
|
|
||||||
input: [ 'args[0]' ]
|
|
||||||
input_types: [ int ]
|
|
||||||
cast_input: [ true ]
|
|
||||||
argc: 1
|
|
@ -1,66 +0,0 @@
|
|||||||
---
|
|
||||||
template:
|
|
||||||
infer_action: false
|
|
||||||
help: ""
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
function: 'func1'
|
|
||||||
args:
|
|
||||||
- argc: 0
|
|
||||||
output: [ OutString(t) ]
|
|
||||||
PUT:
|
|
||||||
function: 'func2'
|
|
||||||
output: [ 'args.front()' ]
|
|
||||||
input: [ 'args[0]' ]
|
|
||||||
input_types: [ int ]
|
|
||||||
cast_input: [ true ]
|
|
||||||
argc: 1
|
|
||||||
|
|
||||||
basic:
|
|
||||||
help: "xx11"
|
|
||||||
inherit_actions: template
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
function: 'x'
|
|
||||||
argc: 2
|
|
||||||
args:
|
|
||||||
- check_det_id: true
|
|
||||||
|
|
||||||
|
|
||||||
template2:
|
|
||||||
infer_action: false
|
|
||||||
template: true
|
|
||||||
help: ""
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
convert_to_time:
|
|
||||||
input: [ 'args[0]', 'args[1]' ]
|
|
||||||
output: converted_time
|
|
||||||
separate_time_units:
|
|
||||||
input: 'args[0]'
|
|
||||||
output: [ converted_time, unit ]
|
|
||||||
function: 'func1'
|
|
||||||
output: [ OutString(t) ]
|
|
||||||
args:
|
|
||||||
- argc: 0
|
|
||||||
- argc: 99
|
|
||||||
PUT:
|
|
||||||
function: funcTemplatePUT
|
|
||||||
args:
|
|
||||||
- argc: 19
|
|
||||||
function: 'func19'
|
|
||||||
- argc: 91
|
|
||||||
|
|
||||||
basic2:
|
|
||||||
inherit_actions: template2
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
function: 'x'
|
|
||||||
argc: 2
|
|
||||||
args:
|
|
||||||
- check_det_id: true
|
|
||||||
input: [ 'args[0]', a,b,c ]
|
|
||||||
input_types: [ int, int, int, int ]
|
|
||||||
PUT:
|
|
||||||
function: 'y'
|
|
||||||
|
|
@ -1,208 +0,0 @@
|
|||||||
basic:
|
|
||||||
infer_action: false
|
|
||||||
help: "xx11"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
function: 'func1'
|
|
||||||
output: [ OutString(t) ]
|
|
||||||
args:
|
|
||||||
- argc: 0
|
|
||||||
- argc : 1
|
|
||||||
output: [ testytest ]
|
|
||||||
detectors:
|
|
||||||
MYTHEN3:
|
|
||||||
function: 'do_mythen3'
|
|
||||||
CHIPTESTBOARD:
|
|
||||||
args:
|
|
||||||
- argc: 55
|
|
||||||
output: [ ctbOutput ]
|
|
||||||
PUT:
|
|
||||||
detectors:
|
|
||||||
EIGER:
|
|
||||||
function: 'do_eiger'
|
|
||||||
argc: 99
|
|
||||||
output: [ eigerOutput ]
|
|
||||||
|
|
||||||
|
|
||||||
# classes of tests:
|
|
||||||
# classes of template tests: has args or has detectors => 4 cases noted (0,0) ... (1,1)
|
|
||||||
# classes of childs: has args or has detectors => 4 cases noted (0,0) ... (1,1)
|
|
||||||
# => 16 cases
|
|
||||||
# example: case_0111: template (0,1) and child (1,1)
|
|
||||||
#################### exhaustive testing over chosen classes of tests
|
|
||||||
|
|
||||||
template_01:
|
|
||||||
infer_action: true
|
|
||||||
help: "vv12"
|
|
||||||
template: true
|
|
||||||
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
detectors:
|
|
||||||
MYTHEN3:
|
|
||||||
function: 'do_mythen3'
|
|
||||||
argc: 99
|
|
||||||
CHIPTESTBOARD:
|
|
||||||
function: 'do_ctb'
|
|
||||||
argc: 98
|
|
||||||
|
|
||||||
case_0100:
|
|
||||||
inherit_actions: template_01
|
|
||||||
help: "0100"
|
|
||||||
|
|
||||||
case_0101:
|
|
||||||
inherit_actions: template_01
|
|
||||||
help: "0101"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
function: 'get_function'
|
|
||||||
detectors:
|
|
||||||
MYTHEN3:
|
|
||||||
function: 'do_mythen23'
|
|
||||||
argc: 420
|
|
||||||
|
|
||||||
case_0110:
|
|
||||||
inherit_actions: template_01
|
|
||||||
help: "0110"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
argc: 111
|
|
||||||
function: 'get_function'
|
|
||||||
|
|
||||||
case_0110v2:
|
|
||||||
inherit_actions: template_01
|
|
||||||
help: "0110v2"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
args:
|
|
||||||
- argc: 111
|
|
||||||
function: 'get_function'
|
|
||||||
|
|
||||||
|
|
||||||
case_0111:
|
|
||||||
inherit_actions: template_01
|
|
||||||
help: "0111"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
args:
|
|
||||||
- argc: 111
|
|
||||||
function: 'get_function'
|
|
||||||
detectors:
|
|
||||||
MYTHEN3:
|
|
||||||
function: 'do_mythen23'
|
|
||||||
argc: 420
|
|
||||||
|
|
||||||
##### cases 10** tests
|
|
||||||
template_10:
|
|
||||||
template: true
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
args:
|
|
||||||
- argc: 0
|
|
||||||
- argc : 1
|
|
||||||
output: [ testytest ]
|
|
||||||
|
|
||||||
case_1000:
|
|
||||||
inherit_actions: template_10
|
|
||||||
help: "1000"
|
|
||||||
|
|
||||||
case_1001:
|
|
||||||
inherit_actions: template_10
|
|
||||||
help: "1001"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
detectors:
|
|
||||||
MYTHEN3:
|
|
||||||
args:
|
|
||||||
- function: 'do_mythen23'
|
|
||||||
argc: 420
|
|
||||||
- function: 'do_mythen3'
|
|
||||||
argc: 99
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case_1010:
|
|
||||||
inherit_actions: template_10
|
|
||||||
help: "1010"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
args:
|
|
||||||
- argc: 111
|
|
||||||
function: 'get_function'
|
|
||||||
|
|
||||||
case_1011:
|
|
||||||
inherit_actions: template_10
|
|
||||||
help: "1011"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
args:
|
|
||||||
- argc: 111
|
|
||||||
function: 'get_function'
|
|
||||||
detectors:
|
|
||||||
MYTHEN3:
|
|
||||||
function: 'do_mythen23'
|
|
||||||
|
|
||||||
##### cases 11** tests
|
|
||||||
template_11:
|
|
||||||
template: true
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
args:
|
|
||||||
- argc: 0
|
|
||||||
- argc : 1
|
|
||||||
output: [ testytest ]
|
|
||||||
detectors:
|
|
||||||
EIGER:
|
|
||||||
function: 'do_eiger'
|
|
||||||
args:
|
|
||||||
- argc: 99
|
|
||||||
output: [ eigerOutput ]
|
|
||||||
POTATO:
|
|
||||||
function: 'do_potato'
|
|
||||||
|
|
||||||
|
|
||||||
case_1100:
|
|
||||||
inherit_actions: template_11
|
|
||||||
help: "1100"
|
|
||||||
|
|
||||||
case_1101:
|
|
||||||
inherit_actions: template_11
|
|
||||||
help: "1101"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
detectors:
|
|
||||||
MYTHEN3:
|
|
||||||
function: 'do_mythen3'
|
|
||||||
POTATO:
|
|
||||||
function: 'do_potato'
|
|
||||||
args:
|
|
||||||
- argc: 101
|
|
||||||
function: 'potato_function'
|
|
||||||
- argc: 202
|
|
||||||
|
|
||||||
case_1110:
|
|
||||||
inherit_actions: template_11
|
|
||||||
help: "1110"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
argc: 77
|
|
||||||
function: 'get_function'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case_1111:
|
|
||||||
inherit_actions: template_11
|
|
||||||
help: "1111"
|
|
||||||
actions:
|
|
||||||
GET:
|
|
||||||
argc: 77
|
|
||||||
function: 'get_function'
|
|
||||||
detectors:
|
|
||||||
MYTHEN3:
|
|
||||||
function: 'do_mythen3'
|
|
||||||
POTATO:
|
|
||||||
function: 'do_potato'
|
|
||||||
args:
|
|
||||||
- argc: 101
|
|
||||||
function: 'potato_function'
|
|
||||||
- argc: 202
|
|
@ -1,101 +0,0 @@
|
|||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from commands_parser.commands_parser import CommandParser
|
|
||||||
|
|
||||||
data_path = Path(__file__).parent.parent / "data"
|
|
||||||
|
|
||||||
|
|
||||||
def test_basic_propagation(tmp_path):
|
|
||||||
output_file = tmp_path / "basic.yaml"
|
|
||||||
command_parser = CommandParser(commands_file=data_path / "basic.yaml", output_file=output_file)
|
|
||||||
command_parser.verify_format()
|
|
||||||
command_parser.parse_all_commands()
|
|
||||||
|
|
||||||
assert output_file.exists()
|
|
||||||
command = yaml.unsafe_load(output_file.open('r'))['basic']
|
|
||||||
assert command['help'] == "xx11"
|
|
||||||
assert len(command['actions']) == 2
|
|
||||||
# test 'GET' action
|
|
||||||
assert 'args' in command['actions']['GET']
|
|
||||||
assert len(command['actions']['GET'].keys()) == 1 # only 'args' key
|
|
||||||
assert len(command['actions']['GET']['args']) == 1 # only one argument
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 0
|
|
||||||
assert command['actions']['GET']['args'][0]['function'] == 'func1'
|
|
||||||
assert command['actions']['GET']['args'][0]['output'] == ['OutString(t)']
|
|
||||||
assert command['actions']['GET']['args'][0]['input'] == []
|
|
||||||
assert command['actions']['GET']['args'][0]['cast_input'] == []
|
|
||||||
assert command['actions']['GET']['args'][0]['require_det_id'] is False
|
|
||||||
# test PUT action
|
|
||||||
assert 'args' in command['actions']['PUT']
|
|
||||||
assert len(command['actions']['PUT'].keys()) == 1 # only 'args' key
|
|
||||||
assert len(command['actions']['PUT']['args']) == 1 # only one argument
|
|
||||||
assert command['actions']['PUT']['args'][0]['argc'] == 1
|
|
||||||
assert command['actions']['PUT']['args'][0]['function'] == 'func2'
|
|
||||||
assert command['actions']['PUT']['args'][0]['cast_input'] == [True]
|
|
||||||
assert command['actions']['PUT']['args'][0]['output'] == ['args.front()']
|
|
||||||
assert command['actions']['PUT']['args'][0]['input_types'] == ['int']
|
|
||||||
assert command['actions']['PUT']['args'][0]['require_det_id'] is False
|
|
||||||
|
|
||||||
|
|
||||||
def test_basic_inheritance(tmp_path):
|
|
||||||
output_file = tmp_path / "basic_inheritance.yaml"
|
|
||||||
command_parser = CommandParser(commands_file=data_path / "basic_inheritance.yaml", output_file=output_file)
|
|
||||||
command_parser.verify_format()
|
|
||||||
command_parser.parse_all_commands()
|
|
||||||
assert output_file.exists()
|
|
||||||
command = yaml.unsafe_load(output_file.open('r'))['basic']
|
|
||||||
assert command['help'] == "xx11"
|
|
||||||
assert command['actions'].keys() == {'GET', 'PUT'}
|
|
||||||
# test 'GET' action
|
|
||||||
assert 'args' in command['actions']['GET']
|
|
||||||
assert command['actions']['GET'].keys() == {'args'} # only 'args' key
|
|
||||||
assert len(command['actions']['GET']['args']) == 1 # only one argument
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 2
|
|
||||||
assert command['actions']['GET']['args'][0]['function'] == 'x'
|
|
||||||
assert command['actions']['GET']['args'][0]['output'] == [] # test overwriting args when they are present in child
|
|
||||||
assert command['actions']['GET']['args'][0]['input'] == []
|
|
||||||
assert command['actions']['GET']['args'][0]['cast_input'] == []
|
|
||||||
assert command['actions']['GET']['args'][0]['require_det_id'] is False
|
|
||||||
# test PUT action
|
|
||||||
assert 'args' in command['actions']['PUT']
|
|
||||||
assert command['actions']['PUT'].keys() == {'args'} # only 'args' key
|
|
||||||
assert len(command['actions']['PUT']['args']) == 1 # only one argument
|
|
||||||
assert command['actions']['PUT']['args'][0]['argc'] == 1
|
|
||||||
assert command['actions']['PUT']['args'][0]['function'] == 'func2'
|
|
||||||
assert command['actions']['PUT']['args'][0]['cast_input'] == [True]
|
|
||||||
assert command['actions']['PUT']['args'][0]['output'] == ['args.front()']
|
|
||||||
assert command['actions']['PUT']['args'][0]['input_types'] == ['int']
|
|
||||||
assert command['actions']['PUT']['args'][0]['require_det_id'] is False
|
|
||||||
|
|
||||||
|
|
||||||
def test_basic_inheritance2(tmp_path):
|
|
||||||
output_file = tmp_path / "basic_inheritance.yaml"
|
|
||||||
command_parser = CommandParser(commands_file=data_path / "basic_inheritance.yaml", output_file=output_file)
|
|
||||||
command_parser.verify_format()
|
|
||||||
command_parser.parse_all_commands()
|
|
||||||
assert output_file.exists()
|
|
||||||
command = yaml.unsafe_load(output_file.open('r'))['basic2']
|
|
||||||
# check GET
|
|
||||||
assert len(command['actions']['GET']['args']) == 1
|
|
||||||
assert command['actions']['GET'].keys() == {'args'}
|
|
||||||
arg = command['actions']['GET']['args'][0]
|
|
||||||
assert arg['argc'] == 2
|
|
||||||
assert arg['output'] == ['OutString(t)']
|
|
||||||
# check that length of cast input is equal to length of input_types and input
|
|
||||||
assert len(arg['input']) == len(arg['input_types']) == len(arg['cast_input']) == 4
|
|
||||||
assert arg['function'] == 'x'
|
|
||||||
assert 'convert_to_time' in arg
|
|
||||||
assert arg['convert_to_time'].keys() == {'input', 'output'}
|
|
||||||
assert 'separate_time_units' in arg
|
|
||||||
assert arg['separate_time_units'].keys() == {'input', 'output'}
|
|
||||||
|
|
||||||
# check PUT
|
|
||||||
assert command['actions']['PUT'].keys() == {'args'}
|
|
||||||
assert len(command['actions']['PUT']['args']) == 2
|
|
||||||
assert command['actions']['PUT']['args'][0]['argc'] == 19
|
|
||||||
assert command['actions']['PUT']['args'][0]['function'] == 'y'
|
|
||||||
assert command['actions']['PUT']['args'][1]['argc'] == 91
|
|
||||||
assert command['actions']['PUT']['args'][1]['function'] == 'y'
|
|
||||||
|
|
@ -1,309 +0,0 @@
|
|||||||
import json
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
import pytest as pytest
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
from commands_parser.commands_parser import CommandParser
|
|
||||||
|
|
||||||
data_path = Path(__file__).parent.parent / "data"
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture()
|
|
||||||
def detector_file_commands(tmp_path):
|
|
||||||
output_file = tmp_path / "detectors.yaml"
|
|
||||||
command_parser = CommandParser(commands_file=data_path / "detectors.yaml", output_file=output_file)
|
|
||||||
command_parser.verify_format()
|
|
||||||
|
|
||||||
def func(command):
|
|
||||||
return command_parser.parse_command(command)
|
|
||||||
|
|
||||||
return func
|
|
||||||
|
|
||||||
|
|
||||||
def test_basic_propagation(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('basic')
|
|
||||||
|
|
||||||
assert command['help'] == "xx11"
|
|
||||||
|
|
||||||
# GET
|
|
||||||
assert command['actions']['GET'].keys() == {'detectors', 'args'}
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3', 'CHIPTESTBOARD'}
|
|
||||||
mythen = command['actions']['GET']['detectors']['MYTHEN3']
|
|
||||||
assert len(mythen) == 2
|
|
||||||
assert mythen[0]['argc'] == 0
|
|
||||||
assert mythen[1]['argc'] == 1
|
|
||||||
assert mythen[0]['function'] == mythen[1]['function'] == 'do_mythen3'
|
|
||||||
assert mythen[0]['output'] == ['OutString(t)']
|
|
||||||
assert mythen[1]['output'] == ['testytest']
|
|
||||||
|
|
||||||
ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD']
|
|
||||||
assert len(ctb) == 1
|
|
||||||
assert ctb[0]['argc'] == 55
|
|
||||||
assert ctb[0]['function'] == 'func1'
|
|
||||||
|
|
||||||
# PUT
|
|
||||||
assert command['actions']['PUT'].keys() == {'detectors'}
|
|
||||||
assert command['actions']['PUT']['detectors'].keys() == {'EIGER'}
|
|
||||||
eiger = command['actions']['PUT']['detectors']['EIGER']
|
|
||||||
assert len(eiger) == 1
|
|
||||||
assert eiger[0]['argc'] == 99
|
|
||||||
assert eiger[0]['function'] == 'do_eiger'
|
|
||||||
assert eiger[0]['output'] == ['eigerOutput']
|
|
||||||
|
|
||||||
# 16 test cases for inheritance
|
|
||||||
# 1st bit: parent has args
|
|
||||||
# 2nd bit: parent has detectors
|
|
||||||
# 3rd bit: child has args
|
|
||||||
# 4th bit: child has detectors
|
|
||||||
# each test case is a combination of the above bits
|
|
||||||
# all the possible combinations are tested
|
|
||||||
|
|
||||||
def test_inheritance_0100(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_0100')
|
|
||||||
assert command['help'] == "0100"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'detectors'}
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3', 'CHIPTESTBOARD'}
|
|
||||||
mythen = command['actions']['GET']['detectors']['MYTHEN3']
|
|
||||||
assert len(mythen) == 1
|
|
||||||
assert mythen[0]['argc'] == 99
|
|
||||||
assert mythen[0]['function'] == 'do_mythen3'
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritance_0101(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_0101')
|
|
||||||
assert command['help'] == "0101"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'detectors'}
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3', 'CHIPTESTBOARD'}
|
|
||||||
mythen = command['actions']['GET']['detectors']['MYTHEN3']
|
|
||||||
assert len(mythen) == 1
|
|
||||||
assert mythen[0]['argc'] == 420
|
|
||||||
assert mythen[0]['function'] == 'do_mythen23'
|
|
||||||
ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD']
|
|
||||||
assert len(ctb) == 1
|
|
||||||
assert ctb[0]['argc'] == 98
|
|
||||||
assert ctb[0]['function'] == 'do_ctb'
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritance_0110(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_0110')
|
|
||||||
assert command['help'] == "0110"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args', 'detectors'}
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 111
|
|
||||||
mythen = command['actions']['GET']['detectors']['MYTHEN3']
|
|
||||||
assert len(mythen) == 1
|
|
||||||
assert mythen[0]['argc'] == 99
|
|
||||||
assert mythen[0]['function'] == 'do_mythen3'
|
|
||||||
ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD']
|
|
||||||
assert len(ctb) == 1
|
|
||||||
assert ctb[0]['argc'] == 98
|
|
||||||
assert ctb[0]['function'] == 'do_ctb'
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritance_0110v2(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_0110v2')
|
|
||||||
assert command['help'] == "0110v2"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args', 'detectors'}
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 111
|
|
||||||
mythen = command['actions']['GET']['detectors']['MYTHEN3']
|
|
||||||
assert len(mythen) == 1
|
|
||||||
assert mythen[0]['argc'] == 99
|
|
||||||
assert mythen[0]['function'] == 'do_mythen3'
|
|
||||||
ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD']
|
|
||||||
assert len(ctb) == 1
|
|
||||||
assert ctb[0]['argc'] == 98
|
|
||||||
assert ctb[0]['function'] == 'do_ctb'
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritacnce_0111(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_0111')
|
|
||||||
assert command['help'] == "0111"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args', 'detectors'}
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3', 'CHIPTESTBOARD'}
|
|
||||||
mythen = command['actions']['GET']['detectors']['MYTHEN3']
|
|
||||||
assert len(mythen) == 1
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 111
|
|
||||||
assert len(mythen) == 1
|
|
||||||
assert mythen[0]['argc'] == 420
|
|
||||||
assert mythen[0]['function'] == 'do_mythen23'
|
|
||||||
ctb = command['actions']['GET']['detectors']['CHIPTESTBOARD']
|
|
||||||
assert len(ctb) == 1
|
|
||||||
assert ctb[0]['argc'] == 98
|
|
||||||
assert ctb[0]['function'] == 'do_ctb'
|
|
||||||
|
|
||||||
|
|
||||||
# cases 1000, 1001, 1010, 1011
|
|
||||||
def test_inheritance_1000(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_1000')
|
|
||||||
assert command['help'] == "1000"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args'}
|
|
||||||
assert len(command['actions']['GET']['args']) == 2
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 0
|
|
||||||
assert command['actions']['GET']['args'][0]['output'] == []
|
|
||||||
|
|
||||||
assert command['actions']['GET']['args'][1]['argc'] == 1
|
|
||||||
assert command['actions']['GET']['args'][1]['output'] == ['testytest']
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritance_1001(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_1001')
|
|
||||||
assert command['help'] == "1001"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args', 'detectors'}
|
|
||||||
assert len(command['actions']['GET']['args']) == 2
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 0
|
|
||||||
assert command['actions']['GET']['args'][0]['output'] == []
|
|
||||||
assert command['actions']['GET']['args'][1]['argc'] == 1
|
|
||||||
assert command['actions']['GET']['args'][1]['output'] == ['testytest']
|
|
||||||
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3'}
|
|
||||||
assert len(command['actions']['GET']['detectors']['MYTHEN3']) == 2
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][0]['argc'] == 420
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][0]['function'] == 'do_mythen23'
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][1]['argc'] == 99
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][1]['function'] == 'do_mythen3'
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritance_1010(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_1010')
|
|
||||||
assert command['help'] == "1010"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args'}
|
|
||||||
assert len(command['actions']['GET']['args']) == 1
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 111
|
|
||||||
assert command['actions']['GET']['args'][0]['function'] == 'get_function'
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritance_1011(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_1011')
|
|
||||||
assert command['help'] == "1011"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args', 'detectors'}
|
|
||||||
assert len(command['actions']['GET']['args']) == 1
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 111
|
|
||||||
assert command['actions']['GET']['args'][0]['function'] == 'get_function'
|
|
||||||
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'MYTHEN3'}
|
|
||||||
assert len(command['actions']['GET']['detectors']['MYTHEN3']) == 1
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][0]['argc'] == 111
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][0]['function'] == 'do_mythen23'
|
|
||||||
|
|
||||||
|
|
||||||
# cases 1100, 1101, 1110, 1111
|
|
||||||
|
|
||||||
def test_inheritance_1100(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_1100')
|
|
||||||
assert command['help'] == "1100"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args', 'detectors'}
|
|
||||||
assert len(command['actions']['GET']['args']) == 2
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 0
|
|
||||||
assert command['actions']['GET']['args'][0]['output'] == []
|
|
||||||
|
|
||||||
assert command['actions']['GET']['args'][1]['argc'] == 1
|
|
||||||
assert command['actions']['GET']['args'][1]['output'] == ['testytest']
|
|
||||||
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'EIGER', 'POTATO'}
|
|
||||||
assert len(command['actions']['GET']['detectors']['EIGER']) == 1
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['argc'] == 99
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['function'] == 'do_eiger'
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['output'] == ['eigerOutput']
|
|
||||||
|
|
||||||
assert len(command['actions']['GET']['detectors']['POTATO']) == 2
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][0]['argc'] == 0
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][0]['function'] == 'do_potato'
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritance_1101(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_1101')
|
|
||||||
assert command['help'] == "1101"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args', 'detectors'}
|
|
||||||
assert len(command['actions']['GET']['args']) == 2
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 0
|
|
||||||
assert command['actions']['GET']['args'][0]['output'] == []
|
|
||||||
assert command['actions']['GET']['args'][1]['argc'] == 1
|
|
||||||
assert command['actions']['GET']['args'][1]['output'] == ['testytest']
|
|
||||||
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'EIGER', 'MYTHEN3', 'POTATO'}
|
|
||||||
assert len(command['actions']['GET']['detectors']['MYTHEN3']) == 2
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][0]['argc'] == 0
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][0]['function'] == 'do_mythen3'
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][1]['argc'] == 1
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][1]['function'] == 'do_mythen3'
|
|
||||||
|
|
||||||
assert len(command['actions']['GET']['detectors']['EIGER']) == 1
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['argc'] == 99
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['function'] == 'do_eiger'
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['output'] == ['eigerOutput']
|
|
||||||
|
|
||||||
assert len(command['actions']['GET']['detectors']['POTATO']) == 2
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][0]['argc'] == 101
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][0]['function'] == 'potato_function'
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][1]['argc'] == 202
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][1]['function'] == 'do_potato'
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritance_1110(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_1110')
|
|
||||||
assert command['help'] == "1110"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args', 'detectors'}
|
|
||||||
assert len(command['actions']['GET']['args']) == 1
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 77
|
|
||||||
assert command['actions']['GET']['args'][0]['function'] == 'get_function'
|
|
||||||
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'EIGER', 'POTATO'}
|
|
||||||
assert len(command['actions']['GET']['detectors']['EIGER']) == 1
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['argc'] == 99
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['function'] == 'do_eiger'
|
|
||||||
|
|
||||||
assert len(command['actions']['GET']['detectors']['POTATO']) == 2
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][0]['argc'] == 0
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][0]['function'] == 'do_potato'
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][1]['argc'] == 1
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][1]['function'] == 'do_potato'
|
|
||||||
|
|
||||||
|
|
||||||
def test_inheritance_1111(tmp_path, detector_file_commands):
|
|
||||||
command = detector_file_commands('case_1111')
|
|
||||||
assert command['help'] == "1111"
|
|
||||||
assert 'actions' in command
|
|
||||||
assert command['actions'].keys() == {'GET'}
|
|
||||||
assert command['actions']['GET'].keys() == {'args', 'detectors'}
|
|
||||||
assert len(command['actions']['GET']['args']) == 1
|
|
||||||
assert command['actions']['GET']['args'][0]['argc'] == 77
|
|
||||||
assert command['actions']['GET']['args'][0]['function'] == 'get_function'
|
|
||||||
|
|
||||||
assert command['actions']['GET']['detectors'].keys() == {'EIGER', 'MYTHEN3', 'POTATO'}
|
|
||||||
assert len(command['actions']['GET']['detectors']['MYTHEN3']) == 1
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][0]['argc'] == 77
|
|
||||||
assert command['actions']['GET']['detectors']['MYTHEN3'][0]['function'] == 'do_mythen3'
|
|
||||||
|
|
||||||
assert len(command['actions']['GET']['detectors']['EIGER']) == 1
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['argc'] == 99
|
|
||||||
assert command['actions']['GET']['detectors']['EIGER'][0]['function'] == 'do_eiger'
|
|
||||||
|
|
||||||
assert len(command['actions']['GET']['detectors']['POTATO']) == 2
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][0]['argc'] == 101
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][0]['function'] == 'potato_function'
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][1]['argc'] == 202
|
|
||||||
assert command['actions']['GET']['detectors']['POTATO'][1]['function'] == 'do_potato'
|
|
@ -1,29 +0,0 @@
|
|||||||
from pathlib import Path
|
|
||||||
from commands_parser.commands_parser import CommandParser
|
|
||||||
import gen_commands
|
|
||||||
|
|
||||||
data_path = Path(__file__).parent.parent
|
|
||||||
|
|
||||||
|
|
||||||
def test_parse_and_generate(tmp_path):
|
|
||||||
"""
|
|
||||||
tests that the parse and generate functions work without errors
|
|
||||||
:param tmp_path:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
output_file = tmp_path / "detectors.yaml"
|
|
||||||
command_parser = CommandParser(commands_file=data_path / "commands.yaml", output_file=output_file)
|
|
||||||
command_parser.verify_format()
|
|
||||||
command_parser.parse_all_commands()
|
|
||||||
assert output_file.exists()
|
|
||||||
|
|
||||||
GEN_PATH = Path(__file__).parent.parent
|
|
||||||
gen_commands.generate(
|
|
||||||
output_file,
|
|
||||||
GEN_PATH / "Caller.in.cpp",
|
|
||||||
GEN_PATH / "Caller.in.h",
|
|
||||||
tmp_path / "Caller.cpp",
|
|
||||||
tmp_path / "Caller.h",
|
|
||||||
)
|
|
||||||
assert (tmp_path / "Caller.cpp").exists()
|
|
||||||
assert (tmp_path / "Caller.h").exists()
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user