mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-19 16:27:13 +02:00
Compare commits
82 Commits
moench8.0.
...
8.0.2
Author | SHA1 | Date | |
---|---|---|---|
4880f87791 | |||
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.2)
|
||||||
|
|
||||||
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()
|
||||||
|
156
RELEASE.txt
156
RELEASE.txt
@ -1,21 +1,13 @@
|
|||||||
SLS Detector Package Major Release 7.x.x released on xx.xx.2023
|
SLS Detector Package Bug Fix Release 8.0.2 released on 18.09.2024
|
||||||
===============================================================
|
=================================================================
|
||||||
|
|
||||||
This document describes the differences between v7.x.x and v7.0.2
|
This document describes the differences between v8.0.2 and v8.0.1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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,108 @@ 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
|
|
||||||
|
|
||||||
|
* Rapidjson compilation with gcc 14
|
||||||
|
Fixed a compile issue with gcc 14. Same fix in later commits to rapidjson.
|
||||||
|
|
||||||
|
|
||||||
|
Client
|
||||||
|
------
|
||||||
|
|
||||||
|
|
||||||
|
* getenv("HOME") returning nullptr
|
||||||
|
When this happens, especially for systemd, it segfaults. Protection
|
||||||
|
provided by using empty string in this case.
|
||||||
|
|
||||||
|
|
||||||
|
* [Mythen3] Bad channel list for multi module
|
||||||
|
Exception thrown when loading multi module bad channel file skipping
|
||||||
|
modules in between. Fixed.
|
||||||
|
|
||||||
|
|
||||||
|
* [Gotthard2] Stopping a blocking acquisition
|
||||||
|
A check added in v8.0.0 to catch slaves that might be in waiting forever
|
||||||
|
also catches Gotthard2 25um slaves that might only be in waiting
|
||||||
|
temporarily. This is fixed with a 50ms sleep before checking again
|
||||||
|
(upto 1s).
|
||||||
|
|
||||||
|
|
||||||
|
* [Moench] Acquire finished processing call back
|
||||||
|
New executable 'sls_detector_acquire_zmq' added to listen to all zmq
|
||||||
|
packets from post processor or external process to signal end of post
|
||||||
|
processing. Post processor refactoring of zmq socket creation added.
|
||||||
|
|
||||||
|
|
||||||
|
Gui / Callback
|
||||||
|
--------------
|
||||||
|
|
||||||
|
|
||||||
|
* [Gotthard2] Stopping a blocking acquisition
|
||||||
|
From the previous issue, call back for acquisition finished status gives
|
||||||
|
error for inconsistent states. Again, a check every 50ms upto 1s is
|
||||||
|
added to let go the temporarily waiting slave.
|
||||||
|
|
||||||
|
|
||||||
|
* Different file paths
|
||||||
|
Fixes file path resetting when different modules have different fpath set.
|
||||||
|
|
||||||
|
|
||||||
|
Receiver
|
||||||
|
--------
|
||||||
|
|
||||||
|
|
||||||
|
* HDF5 fill value
|
||||||
|
Fix the fill value to accomodate all datatypes.
|
||||||
|
|
||||||
|
|
||||||
|
Firmware
|
||||||
|
--------
|
||||||
|
|
||||||
|
|
||||||
|
* [Moench] Overflow with exptime of 0
|
||||||
|
Fixed overflow when subtracting 1 clock cycle from exptime.
|
||||||
|
|
||||||
|
|
||||||
|
On-board Detector Server
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
|
||||||
|
* [Moench] Few changes in Server:
|
||||||
|
- Max shifts of adc clock changed from 240 to 200.
|
||||||
|
|
||||||
|
- Fixed overflow when subtracting 2 clock cycles from exptime of 0ms.
|
||||||
|
|
||||||
|
- Default readout speed to half speed from quarter.
|
||||||
|
|
||||||
|
- Change default ADC phase to 150 for full readout speed.
|
||||||
|
|
||||||
|
- Change default vipre_cds dac from 800 to 1280.
|
||||||
|
|
||||||
|
|
||||||
|
* [Mythen3] Change Clk divider from 10 (100MHz) to 20 (50MHz) at startup.
|
||||||
|
|
||||||
|
|
||||||
|
* [Jungfrau] Fix for HW v1.0 boards for unreliable ADC 2
|
||||||
|
Issues sometimes seen on some HW v 1.0 boards are fixed with phase
|
||||||
|
relationship of 120 degrees. HW v2.0 boards are not affected.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
|
||||||
|
* Updated troubleshooting documentaion to check links and disable firewall
|
||||||
|
|
||||||
|
|
||||||
|
* Excluded non UTF-8 encoded libzmq documents due to machine dependent
|
||||||
|
compilation issues.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -38,13 +125,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.2
|
||||||
Mythen3 7.0.0
|
Mythen3 8.0.2
|
||||||
Gotthard2 7.0.0
|
Gotthard2 8.0.0
|
||||||
Gotthard 7.0.0
|
Gotthard 8.0.0
|
||||||
Moench 7.0.0
|
Moench 8.0.2
|
||||||
Ctb 7.0.0
|
Ctb 8.0.0
|
||||||
|
|
||||||
|
|
||||||
On-board Detector Server Upgrade
|
On-board Detector Server Upgrade
|
||||||
@ -52,8 +139,6 @@ This document describes the differences between v7.x.x and v7.0.2
|
|||||||
|
|
||||||
From v6.1.0 (without tftp):
|
From v6.1.0 (without tftp):
|
||||||
Using command 'updatedetectorserver'
|
Using command 'updatedetectorserver'
|
||||||
From 5.0.0 (with tftp):
|
|
||||||
Using command 'copydetectorserver'
|
|
||||||
|
|
||||||
Instructions available at
|
Instructions available at
|
||||||
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
|
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
|
||||||
@ -65,21 +150,22 @@ 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 26.10.2023 (v0.3.2) (updated in 8.0.2,
|
||||||
|
under development)
|
||||||
|
|
||||||
Ctb 03.04.2023 (v1.2?)
|
Ctb 28.08.2023 (v1.2) (updated in 8.0.0)
|
||||||
|
|
||||||
|
|
||||||
Detector Upgrade
|
Detector Upgrade
|
||||||
@ -98,10 +184,10 @@ This document describes the differences between v7.x.x and v7.0.2
|
|||||||
|
|
||||||
Except Eiger,
|
Except Eiger,
|
||||||
upgrade
|
upgrade
|
||||||
Using command 'programfpga' or
|
using command 'programfpga' or
|
||||||
|
|
||||||
udpate both server and firmware simultaneously
|
udpate both server and firmware simultaneously
|
||||||
Using command 'update'
|
using command 'update'
|
||||||
|
|
||||||
|
|
||||||
Instructions available at
|
Instructions available at
|
||||||
|
@ -1 +0,0 @@
|
|||||||
slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh
|
|
@ -890,7 +890,7 @@ EXCLUDE_SYMLINKS = NO
|
|||||||
# Note that the wildcards are matched against the file with absolute path, so to
|
# Note that the wildcards are matched against the file with absolute path, so to
|
||||||
# exclude all test directories for example use the pattern */test/*
|
# exclude all test directories for example use the pattern */test/*
|
||||||
|
|
||||||
EXCLUDE_PATTERNS = */docs/* */tests/* */python/* */manual */slsDetectorServers/* */libs/* */integrationTests *README* */slsDetectorGui/* */ctbGui/* */slsDetectorCalibration/*
|
EXCLUDE_PATTERNS = */docs/* */tests/* */python/* */manual */slsDetectorServers/* */libs/* */integrationTests *README* */slsDetectorGui/* */ctbGui/* */slsDetectorCalibration/* *TobiSchluter*
|
||||||
|
|
||||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||||
|
@ -22,6 +22,8 @@ Common
|
|||||||
* Check transeiver and fibers are compatible (all MMF 850nm or all SMF 1030nm)
|
* Check transeiver and fibers are compatible (all MMF 850nm or all SMF 1030nm)
|
||||||
* Check fiber
|
* Check fiber
|
||||||
* Check fiber polarity (if short range, unplug the link anywhere, and look at the light/dark pattern: dark has to mate with light)
|
* Check fiber polarity (if short range, unplug the link anywhere, and look at the light/dark pattern: dark has to mate with light)
|
||||||
|
* For Jungfrau, check if the blue sfp light is blinking rapidly (even when it is not sending data). If so, most likely the link is down and something is wrong with the board. If it connected to a switch, then you do not see it with the ethtool command if link is down. One option is to connect it directly to a pc to see if link is down.
|
||||||
|
* With nc, try "nc -u -p 50001 -l" in receiving pc, and from another pc try "echo hallo | nc -u 10.1.2.172 50001" to send something to the recieving pc interface to see if the link is up and see if the other nc console receives the hallo.
|
||||||
|
|
||||||
#. Detector is not acquiring (Not Eiger)
|
#. Detector is not acquiring (Not Eiger)
|
||||||
* Take an acquisition with many images and using the following steps instead of acquire:
|
* Take an acquisition with many images and using the following steps instead of acquire:
|
||||||
@ -47,11 +49,20 @@ Common
|
|||||||
* Ensure that the interfaces (on NIC and the switch) used in receiver pc have MTU 9000 (jumbo frames) enabled.
|
* Ensure that the interfaces (on NIC and the switch) used in receiver pc have MTU 9000 (jumbo frames) enabled.
|
||||||
|
|
||||||
|
|
||||||
#. Check if 'rx_frames' counter in 'ifconfig' do not increment for interface.
|
#. Check if 'rx packets' counter in 'ifconfig' do not increment for interface.
|
||||||
* If no, check switch configuration if present. Port counters of switch can also help to identify problem.
|
* If no, check switch configuration if present. Port counters of switch can also help to identify problem.
|
||||||
* If yes, but receiver software does not see it:
|
* If yes, but receiver software does not see it:
|
||||||
|
|
||||||
* Check no firewall (eg. firewalld) is present or add rules
|
* Check no firewall (eg. firewalld) is present or add rules
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
# Stop and disable firewall
|
||||||
|
service firewalld stop
|
||||||
|
systemctl disable firewalld
|
||||||
|
# Check status
|
||||||
|
service firewalld status
|
||||||
|
|
||||||
* Check that selinux is disabled ( or add rules)
|
* Check that selinux is disabled ( or add rules)
|
||||||
|
|
||||||
#. Source UDP IP in config file (Not Eiger)
|
#. Source UDP IP in config file (Not Eiger)
|
||||||
|
@ -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.2
Symbolic link
1
serverBin/jungfrauDetectorServerv8.0.2
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv8.0.2
|
@ -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;
|
||||||
|
@ -183,8 +183,8 @@ int main(int argc, char *argv[]) {
|
|||||||
gainfname = args["gainfile"];
|
gainfname = args["gainfile"];
|
||||||
etafname = args["etafilefile"];
|
etafname = args["etafilefile"];
|
||||||
|
|
||||||
if (atoi(args["nuninterfaces"].c_str())>1){
|
if (atoi(args["numinterfaces"].c_str())>1){
|
||||||
cprintf(RED, "Sorry, at the moment only a single interface is supported instead of %d\n",atoi(args["nuninterfaces"].c_str()));
|
cprintf(RED, "Sorry, at the moment only a single interface is supported instead of %d\n",atoi(args["numinterfaces"].c_str()));
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,54 +272,35 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
sls::ZmqSocket *zmqsocket = NULL;
|
sls::ZmqSocket *zmqsocket = NULL;
|
||||||
|
|
||||||
#ifdef NEWZMQ
|
|
||||||
// receive socket
|
// receive socket
|
||||||
try {
|
try {
|
||||||
#endif
|
|
||||||
|
|
||||||
zmqsocket = new sls::ZmqSocket(socketip.c_str(), portnum);
|
zmqsocket = new sls::ZmqSocket(socketip.c_str(), portnum);
|
||||||
|
|
||||||
#ifdef NEWZMQ
|
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
cprintf(RED,
|
cprintf(RED,
|
||||||
"Error: Could not create Zmq socket on port %d with ip %s\n",
|
"Error: Could not create Zmq receiving socket on port %d with ip %s\n",
|
||||||
portnum, socketip.c_str());
|
portnum, socketip.c_str());
|
||||||
delete zmqsocket;
|
delete zmqsocket;
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NEWZMQ
|
|
||||||
if (zmqsocket->IsError()) {
|
|
||||||
cprintf(RED,
|
|
||||||
"Error: Could not create Zmq socket on port %d with ip %s\n",
|
|
||||||
portnum, socketip.c_str());
|
|
||||||
delete zmqsocket;
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (zmqsocket->Connect()) {
|
if (zmqsocket->Connect()) {
|
||||||
cprintf(RED, "Error: Could not connect to socket %s\n",
|
cprintf(RED, "Error: Could not connect to zmq receiving socket %s\n",
|
||||||
(zmqsocket->GetZmqServerAddress()).c_str());
|
(zmqsocket->GetZmqServerAddress()).c_str());
|
||||||
delete zmqsocket;
|
delete zmqsocket;
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
} else
|
} else
|
||||||
printf("Zmq Client at %s\n", zmqsocket->GetZmqServerAddress().c_str());
|
|
||||||
|
printf("Zmq receiving at %s\n", zmqsocket->GetZmqServerAddress().c_str());
|
||||||
|
|
||||||
// send socket
|
// send socket
|
||||||
sls::ZmqSocket *zmqsocket2 = 0;
|
sls::ZmqSocket *zmqsocket2 = 0;
|
||||||
// cout << "zmq2 " << endl;
|
// cout << "zmq2 " << endl;
|
||||||
if (send) {
|
if (send) {
|
||||||
#ifdef NEWZMQ
|
|
||||||
// receive socket
|
// receive socket
|
||||||
try {
|
try {
|
||||||
#endif
|
|
||||||
zmqsocket2 = new sls::ZmqSocket(portnum2, socketip2.c_str());
|
zmqsocket2 = new sls::ZmqSocket(portnum2, socketip2.c_str());
|
||||||
|
|
||||||
#ifdef NEWZMQ
|
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
cprintf(RED,
|
cprintf(RED,
|
||||||
"Error: Could not create Zmq socket server on port %d and "
|
"Error: Could not create Zmq sending socket on port %d and "
|
||||||
"ip %s\n",
|
"ip %s\n",
|
||||||
portnum2, socketip2.c_str());
|
portnum2, socketip2.c_str());
|
||||||
// delete zmqsocket2;
|
// delete zmqsocket2;
|
||||||
@ -328,28 +309,7 @@ int main(int argc, char *argv[]) {
|
|||||||
// return EXIT_FAILURE;
|
// return EXIT_FAILURE;
|
||||||
send = false;
|
send = false;
|
||||||
}
|
}
|
||||||
#endif
|
printf("Zmq sending socket at %s\n",
|
||||||
|
|
||||||
#ifndef NEWZMQ
|
|
||||||
if (zmqsocket2->IsError()) {
|
|
||||||
cprintf(RED,
|
|
||||||
"AAA Error: Could not create Zmq socket server on port %d "
|
|
||||||
"and ip %s\n",
|
|
||||||
portnum2, socketip2.c_str());
|
|
||||||
// delete zmqsocket2;
|
|
||||||
// delete zmqsocket;
|
|
||||||
// return EXIT_FAILURE;
|
|
||||||
send = false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (zmqsocket2->Connect()) {
|
|
||||||
cprintf(RED, "BBB Error: Could not connect to socket %s\n",
|
|
||||||
zmqsocket2->GetZmqServerAddress().c_str());
|
|
||||||
// delete zmqsocket2;
|
|
||||||
send = false;
|
|
||||||
// return EXIT_FAILURE;
|
|
||||||
} else
|
|
||||||
printf("Zmq Client at %s\n",
|
|
||||||
zmqsocket2->GetZmqServerAddress().c_str());
|
zmqsocket2->GetZmqServerAddress().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -839,8 +839,8 @@ void qTabMeasurement::UpdateProgress() {
|
|||||||
int qTabMeasurement::VerifyOutputDirectoryError() {
|
int qTabMeasurement::VerifyOutputDirectoryError() {
|
||||||
try {
|
try {
|
||||||
auto retval = det->getFilePath();
|
auto retval = det->getFilePath();
|
||||||
for (auto &it : retval) {
|
for (int i = 0; i < static_cast<int>(retval.size()); ++i) {
|
||||||
det->setFilePath(it);
|
det->setFilePath(retval[i], {i});
|
||||||
}
|
}
|
||||||
return slsDetectorDefs::OK;
|
return slsDetectorDefs::OK;
|
||||||
}
|
}
|
||||||
|
@ -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.2
Executable file
BIN
slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv8.0.2
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
|
||||||
@ -489,6 +488,7 @@ void setupDetector() {
|
|||||||
AD9257_SetDefines(ADC_SPI_REG, ADC_SPI_SRL_CS_OTPT_MSK,
|
AD9257_SetDefines(ADC_SPI_REG, ADC_SPI_SRL_CS_OTPT_MSK,
|
||||||
ADC_SPI_SRL_CLK_OTPT_MSK, ADC_SPI_SRL_DT_OTPT_MSK,
|
ADC_SPI_SRL_CLK_OTPT_MSK, ADC_SPI_SRL_DT_OTPT_MSK,
|
||||||
ADC_SPI_SRL_DT_OTPT_OFST);
|
ADC_SPI_SRL_DT_OTPT_OFST);
|
||||||
|
AD9257_Set_Jungfrau_Hardware_Version_1_0(isHardwareVersion_1_0());
|
||||||
AD9257_Disable();
|
AD9257_Disable();
|
||||||
AD9257_Configure();
|
AD9257_Configure();
|
||||||
|
|
||||||
|
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,6 +4,10 @@
|
|||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#ifdef JUNGFRAUD
|
||||||
|
void AD9257_Set_Jungfrau_Hardware_Version_1_0(int val);
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set Defines
|
* Set Defines
|
||||||
* @param reg spi register
|
* @param reg spi register
|
||||||
|
@ -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);
|
|
||||||
|
@ -172,6 +172,14 @@ uint32_t AD9257_DigMask = 0x0;
|
|||||||
int AD9257_DigOffset = 0x0;
|
int AD9257_DigOffset = 0x0;
|
||||||
int AD9257_VrefVoltage = 0;
|
int AD9257_VrefVoltage = 0;
|
||||||
|
|
||||||
|
#ifdef JUNGFRAUD
|
||||||
|
int AD9257_is_Jungfrau_Hardware_Version_1_0 = 0;
|
||||||
|
|
||||||
|
void AD9257_Set_Jungfrau_Hardware_Version_1_0(int val) {
|
||||||
|
AD9257_is_Jungfrau_Hardware_Version_1_0 = val;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void AD9257_SetDefines(uint32_t reg, uint32_t cmsk, uint32_t clkmsk,
|
void AD9257_SetDefines(uint32_t reg, uint32_t cmsk, uint32_t clkmsk,
|
||||||
uint32_t dmsk, int dofst) {
|
uint32_t dmsk, int dofst) {
|
||||||
AD9257_Reg = reg;
|
AD9257_Reg = reg;
|
||||||
@ -286,8 +294,18 @@ void AD9257_Configure() {
|
|||||||
AD9257_OUT_BINARY_OFST_VAL | AD9257_OUT_LVDS_IEEE_VAL);
|
AD9257_OUT_BINARY_OFST_VAL | AD9257_OUT_LVDS_IEEE_VAL);
|
||||||
|
|
||||||
// output clock phase
|
// output clock phase
|
||||||
|
#ifdef JUNGFRAUD
|
||||||
|
if (AD9257_is_Jungfrau_Hardware_Version_1_0) {
|
||||||
|
LOG(logINFO, ("\tOutput clock phase: 120\n"));
|
||||||
|
AD9257_Set(AD9257_OUT_PHASE_REG, AD9257_OUT_CLK_120_VAL);
|
||||||
|
} else {
|
||||||
LOG(logINFO, ("\tOutput clock phase: 180\n"));
|
LOG(logINFO, ("\tOutput clock phase: 180\n"));
|
||||||
AD9257_Set(AD9257_OUT_PHASE_REG, AD9257_OUT_CLK_180_VAL);
|
AD9257_Set(AD9257_OUT_PHASE_REG, AD9257_OUT_CLK_180_VAL);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
LOG(logINFO, ("\tOutput clock phase: 180\n"));
|
||||||
|
AD9257_Set(AD9257_OUT_PHASE_REG, AD9257_OUT_CLK_180_VAL);
|
||||||
|
#endif
|
||||||
|
|
||||||
// all devices on chip to receive next command
|
// all devices on chip to receive next command
|
||||||
LOG(logINFO, ("\tAll devices on chip to receive next command\n"));
|
LOG(logINFO, ("\tAll devices on chip to receive next command\n"));
|
||||||
|
@ -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,27 @@ 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_acquire_zmq"
|
||||||
"sls_detector"
|
"sls_detector_help")
|
||||||
)
|
set(cmd_name "PUT" "GET" "READOUT" "READOUTZMQ" "HELP")
|
||||||
set(det_cmd_name "PUT" "GET" "READOUT" "HELP" "INFER")
|
list(LENGTH bin_names len1)
|
||||||
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 +105,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
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user