mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-14 13:57:13 +02:00
Compare commits
39 Commits
Author | SHA1 | Date | |
---|---|---|---|
6f7c31b747 | |||
75c2d987c4 | |||
726f5eba29 | |||
4404ee717a | |||
8c1974b34e | |||
d89d349247 | |||
910961cf41 | |||
595b7aa5e8 | |||
f72ad4326f | |||
2306e44ae3 | |||
287efde54a | |||
faa25b9e9f | |||
1b92b01a46 | |||
4849063b6c | |||
5cd020ae81 | |||
160fabe02c | |||
90dd8e70e5 | |||
08e121c71f | |||
cb3b337a99 | |||
5d9a952316 | |||
8cc05c5848 | |||
d69d69e892 | |||
07a120fc4a | |||
11e8796847 | |||
f79b009978 | |||
3259bfb008 | |||
934bc5b9db | |||
6d11faed87 | |||
35fc52dae7 | |||
e599bfe56f | |||
764becc271 | |||
7462d1002d | |||
17c20748bc | |||
d5f8a1b4e7 | |||
70ce8c1653 | |||
5203a0d621 | |||
59ad15b54e | |||
afac5be3c3 | |||
688dd15fe9 |
347
RELEASE.txt
347
RELEASE.txt
@ -1,353 +1,72 @@
|
||||
SLS Detector Package 3.1.0 released on 2018-03-12
|
||||
SLS Detector Package 3.1.4 released on 2018-08-17
|
||||
=================================================
|
||||
|
||||
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
This document describes the differences between 3.1.0 and 3.0.0 releases.
|
||||
This document describes the differences between 3.1.4 into 3.1.3 releases.
|
||||
|
||||
The conda package of the binaries can be downloaded from
|
||||
|
||||
https://github.com/slsdetectorgroup/sls_detector_software.git
|
||||
|
||||
The Python interface to the software package (including the package) is at
|
||||
|
||||
https://github.com/slsdetectorgroup/sls_detector.git
|
||||
|
||||
Manual (both HTML and pdf versions) are provided in
|
||||
|
||||
manual/docs/
|
||||
|
||||
Documentation from Source Code can be found for the Command Line and C++ API in
|
||||
|
||||
html:
|
||||
manual/docs/html/slsDetectorClientDocs/index.html
|
||||
manual/docs/html/slsDetectorUsersDocs/index.html
|
||||
pdf:
|
||||
manual/docs/pdf/slsDetectorClientDocs.pdf
|
||||
manual/docs/pdf/slsDetectorUsersDocs.pdf
|
||||
|
||||
Documentation to the python API is available at
|
||||
|
||||
https://slsdetectorgroup.github.io/sls_detector/
|
||||
|
||||
Example including binaries for detector and receiver user classes can be found in
|
||||
|
||||
manual/manual-api
|
||||
|
||||
User documentation can also be accessed directly at this location:
|
||||
|
||||
https://www.psi.ch/detectors/users-support
|
||||
|
||||
If you have any software related questions or comments, please send them to:
|
||||
|
||||
dhanya.thattil@psi.ch
|
||||
anna.bergamaschi@psi.ch
|
||||
|
||||
If you have any python related questions or comments, please send them to:
|
||||
|
||||
erik.frojdh@psi.ch
|
||||
|
||||
|
||||
CONTENTS
|
||||
|
||||
- Firmware Requirements
|
||||
- Changes in User Interface
|
||||
- New Features
|
||||
- Resolved Issues
|
||||
- Known Issues
|
||||
|
||||
|
||||
|
||||
Firmware Requirements
|
||||
=====================
|
||||
|
||||
Please refer to the link below for more details on the firmware versions.
|
||||
https://www.psi.ch/detectors/firmware.
|
||||
|
||||
Gotthard
|
||||
========
|
||||
Minimum compatible version : 11.01.2013
|
||||
Latest version : 08.02.2018 (50um and 25um Master)
|
||||
09.02.2018 (25 um Slave)
|
||||
|
||||
-Can not be upgraded remotely.
|
||||
|
||||
|
||||
Eiger
|
||||
=====
|
||||
Minimum compatible version : 16
|
||||
Latest version : 20
|
||||
|
||||
-Can be upgraded remotely via bit files.
|
||||
|
||||
|
||||
Jungfrau
|
||||
========
|
||||
Minimum compatible version : 13.11.2017
|
||||
Latest version : 13.11.2017
|
||||
|
||||
-Can be upgraded remotely via sls_detector_put programfpga <pof>.
|
||||
|
||||
|
||||
|
||||
Changes in User Interface
|
||||
=========================
|
||||
|
||||
|
||||
Client
|
||||
------
|
||||
1. Additional functions added for advanced users in users class:
|
||||
(setSpeed, setClockDivider, setReadOutFlags, setDac, getADC,
|
||||
setAllTrimbits, startReceiver, stopReceiver,
|
||||
startAcquisition non blocking, setReceiverSilentMode, setHighVoltage,
|
||||
enableDataStreamingToClient, enableDataStreamingFromReceiver,
|
||||
setReceiverDataStreamingOutPort, setClientDataStreamingInPort)
|
||||
|
||||
2. Zmq set up for client and receiver are separated.
|
||||
zmqport for client and rx_zmqport for receiver. By default, they are the
|
||||
same for the slsDetectorGui to work.
|
||||
|
||||
3. Users example also works without config file, where detector already
|
||||
configured in shared memory.
|
||||
|
||||
4. Use "sls_detector_get busy 0" to clear acquiring flag in shared memory
|
||||
caused due to an earlier interrupted acquisition from Ctrl+C"
|
||||
|
||||
5. Set bit, clear bit, read register and write register cannot give -1 for
|
||||
inconsistent values from multiple detectors. One has to check error from
|
||||
API or read the values individually.
|
||||
|
||||
6. multiSlsDetector::char* getSettingsFile() function signature has been
|
||||
changed to string getSettingsFile().
|
||||
|
||||
|
||||
|
||||
Receiver
|
||||
--------
|
||||
7. Modified the help manaual/main-api/mainReceiver.cpp to make it more
|
||||
robust (handling child process exit) and flexible to determine upon
|
||||
start up the number of receivers (child processes), the start TCP port
|
||||
and whether to call back data.
|
||||
|
||||
detReceiver is now executed with [start tcp port] [number of receivers]
|
||||
[1 for call back, 0 for none] as arguments.
|
||||
By default, start tcp port is 1954, number of receivers is 1, and call
|
||||
back is initiated.
|
||||
|
||||
8. rx_datastream to enable/disable data streaming in receiver. Using the GUI
|
||||
or registering data call back in client automatically enables zmq in
|
||||
receiver and client. "externalgui" is removed from the command line. Use
|
||||
this command instead.
|
||||
|
||||
9. Rx_tcpport argument to the slsReceiver can be given using -t.
|
||||
Eg. slsReceiver -t1955
|
||||
|
||||
|
||||
New Features
|
||||
============
|
||||
|
||||
|
||||
Package
|
||||
-------
|
||||
1. In addition to the C++ API, the Python API is also now provided.
|
||||
|
||||
2. CMAKE now with debug flag and rpath, show warnings, compile only certain
|
||||
components (such as receiver or gui)
|
||||
|
||||
3. One repository for entire package and made available at github.
|
||||
|
||||
4. One can do --version or -v to all the binaries to find out the release
|
||||
version of the particular executable.
|
||||
|
||||
5. All the software version numbers have only date in format YYMMDD.
|
||||
|
||||
|
||||
Client
|
||||
------
|
||||
6. Parallelized more commands to detector. Beneficial for large detectors.
|
||||
(setTimer, setFileIndex, setOnline, setReceiverOnline, getReceiverStatus,
|
||||
resetFramesCaught, setFrameIndex, setFileName, getFramesCaughtByReceiver,
|
||||
setDynamicRange, setRateCorrection)
|
||||
|
||||
Option to also use "sls_detector_put threaded 0" to improve speed by
|
||||
eliminating progress display during acquisition. Effective only for
|
||||
large detectors.
|
||||
|
||||
|
||||
Detector Server
|
||||
---------------
|
||||
7. (Eiger) Virtual class to execute on pc.
|
||||
|
||||
8. One can now read temperatures during acquisition. It goes via the stop
|
||||
server.
|
||||
|
||||
9. (Jungfrau) One can start server in "debug" mode and then program the
|
||||
new firmware via software command "sls_detector_put programfpga xx.pof".
|
||||
|
||||
10. (Jungfrau) Server can exit on start up if either the firmware or the
|
||||
server is incompatible with each other.
|
||||
|
||||
11. (Jungfrau) One is able to set transmission delay (ms) of image for each
|
||||
individual detector using "txndelay_frame" command. Beneficial for
|
||||
large detectors.
|
||||
|
||||
12. (Jungfrau) One can set a threshold temperature (temp_threshold) and
|
||||
enable the temperature control feature (temp_control). When the
|
||||
temperature (temp_fpga) overshoots the threshold temperature, it will
|
||||
set the temperature event (temp_event) and power off the chip. One must
|
||||
then switch off the detector and check cooling. Switching back on starts
|
||||
with defaults.
|
||||
|
||||
13. (25um Gotthard) Added start acquisition delay to master module.
|
||||
|
||||
14. (Gotthard) New constraints for firmware dated 08.02.2018 and 09.02.2018
|
||||
(25 um Slave) include minimum exposure time is 186 ns and minimum
|
||||
period is 1278 ns + current exposure time.
|
||||
|
||||
|
||||
Receiver
|
||||
--------
|
||||
14. The detectorip and rx_udpip does not have to be in the same subnet anymore.
|
||||
Add the following commands after rx_hostname in config file to overwrite
|
||||
mac configuration:
|
||||
rx_udpmac [router mac]
|
||||
configuremac 0
|
||||
|
||||
15. Added silent mode to receiver using command r_silent [i] from client.
|
||||
It might be beneficial for max frame rate applications.
|
||||
|
||||
16. Receiver print out can handle black or white backgrounds.
|
||||
|
||||
17. zmq package included updated to v4.0.8.
|
||||
|
||||
18. Zmq streaming from receiver also sends file index in json header.
|
||||
|
||||
|
||||
Gui
|
||||
---
|
||||
19. If acquisition is done, but "stop dummy packet" to the gui was lost in
|
||||
the network, stop acquisition command will restream it so that the gui
|
||||
doesnt hang forever. This is used only for very fast detectors like
|
||||
Moench.
|
||||
|
||||
Topics Concerning
|
||||
==================
|
||||
- get settings in users class
|
||||
- HDF5 in Receiver
|
||||
- gotthard timer accuracy
|
||||
|
||||
|
||||
Resolved Issues
|
||||
===============
|
||||
|
||||
|
||||
Client
|
||||
------
|
||||
1. gethostbyname used in connecting to sockets was not thread safe for
|
||||
multiple detectors. Using getaddrinfo for stability in multi threaded
|
||||
environment.
|
||||
1. Users class setSettings(-1) gave undefined settings. Has been fixed.
|
||||
|
||||
2. Updated writing content of config and parameter dump into files.
|
||||
2. Users class timers give more precise values now.
|
||||
|
||||
3. More locking to handle main and processing threads using the threadpool.
|
||||
Removing unlock twice, which is undefined behavior.
|
||||
|
||||
4. (Jungfrau) adcphase returns the correct value, instead of -1.
|
||||
3. When deleting slsDetector object, Stop socket deletion includes a close on
|
||||
default file descriptor zero (which it didn't open, just set for flag).
|
||||
This is fixed with temporary solution, to connect stop socket at checkOnline
|
||||
to set file descriptor to the right one. Later releases will use exception
|
||||
to handle constructor error flags.
|
||||
|
||||
|
||||
Detector Server
|
||||
---------------
|
||||
4. (Eiger) The hardware MAC of the detector is used during configuration
|
||||
and relayed back to client. Similarly, hardware IP for 1 Gbe data mode.
|
||||
|
||||
5. (Eiger) Status will return error if there was the unlikely trouble
|
||||
reading status register in the front end board. Earlier, it would only
|
||||
return idle.
|
||||
|
||||
6. (Jungfrau) patch server v3.0.0.6.3
|
||||
Able to set settings, high voltage now correctly reads 0 when
|
||||
switched off, dacs are properly set.
|
||||
|
||||
7. (Jungfrau) FPGA reset and programming FPGA firmware via software is done
|
||||
properly
|
||||
|
||||
8. (Gotthard) patch server v3.0.0.5.1
|
||||
Able to read temperature properly.
|
||||
|
||||
9. (Gotthard) butst mode if set too fast had unwanted behavior such as
|
||||
sending same image continuously. Now it is handled to display error
|
||||
and stop acquisition.
|
||||
|
||||
10. (Gotthard) completely removed the possibility to set timing modes
|
||||
other than auto and trigger as they are not implemented anyway. Also
|
||||
signal index 1, 2 and 3 are reserved and hence, cannot be configured for
|
||||
an external trigger.
|
||||
|
||||
11. Non Mythen and non Eiger detectors can also now get settings file from
|
||||
board.
|
||||
|
||||
12. (Gotthard) Did not get first few images initially after configuring MAC
|
||||
of detector. Fixed.
|
||||
1. (Gotthard) Timers converted from time in nanoseconds to number of cycles
|
||||
is made more precise now. Clock value changed from 32.1E+6 to 32.007729E+6.
|
||||
|
||||
|
||||
Receiver
|
||||
--------
|
||||
12. Made it easier to disable the standard receiver and fixing bugs related
|
||||
to the use of a custom one.
|
||||
1. Jungfrau Single Module Master files did not link to the HDF5 data file properly.
|
||||
This is fixed now.
|
||||
|
||||
13. (Jungfrau) HDF5 dimensions (npixelsY) required for mapping fixed.
|
||||
|
||||
14. patch2-v3.0.0-slsReceiverSoftware.patch
|
||||
x, y and z coordinates in the call backs and the files are hardcoded
|
||||
for this release.
|
||||
|
||||
15. Rest implementation (not used by standard receiver) removed.
|
||||
|
||||
|
||||
Gui
|
||||
---
|
||||
16. patch1-v3.0.0-slsDetectorGui.patch
|
||||
(Eiger) In expert mode and in advanced tab, when trimbits
|
||||
loaded are different for every pixel, the gui complains and sets
|
||||
all trimbits to zero. This has been resolved. Now, the "Set All
|
||||
Trimbits" field is just set to -1.
|
||||
|
||||
17. Fixed segmentation fault of xputsn properly.
|
||||
|
||||
18. Upon clicking on "Start", clears acquiring flag in shared memory
|
||||
caused due to an earlier interrupted acquisition from Ctrl+C"
|
||||
|
||||
19. Fixed plotting twice caused due to unzooming the first time.
|
||||
|
||||
20. Removed option for compression in Gui as it is not available currently.
|
||||
|
||||
21. Can also show Jungfrau multi detector in x direction in gui.
|
||||
|
||||
22. Switching tabs sometimes results in delay and gates fields being incorrectly
|
||||
enabled. Fixed.
|
||||
2. Relative linking is used in the HDF5, instead of absolute now.
|
||||
|
||||
|
||||
|
||||
Known Issues
|
||||
New Features
|
||||
============
|
||||
|
||||
|
||||
Client
|
||||
------
|
||||
1. File name prefix can only be done at multi deector level. Changing at
|
||||
individual detector level will not include scan or position variables.
|
||||
|
||||
|
||||
Detector Server
|
||||
---------------
|
||||
2. Standard header fills x-coord in 1D. y-coord and z-coord is not
|
||||
implemented (3D).
|
||||
|
||||
1. Timers can be set/retrieved individually. It has been introduced because
|
||||
Gotthard 25um can have different delays for master and slave modules.
|
||||
|
||||
Receiver
|
||||
--------
|
||||
3. HDF5 compression and filters are not implemented yet.
|
||||
|
||||
|
||||
|
||||
|
||||
1. HDF5 x dimension (#images). Max made unlimited. Chunked Dataset by default.
|
||||
|
||||
When receiver gets an image more than #frames, the HDF5 dataset will
|
||||
extend itself in the x dimension by another #frames. So, one can do
|
||||
(in Jungfrau, Gotthard, NOT Eiger)
|
||||
sls_detector_put resetframescaught 0
|
||||
sls_detector_put receiver start
|
||||
sls_detector_put status start
|
||||
sls_detector_put status start
|
||||
...
|
||||
sls_detector_put receiver stop
|
||||
|
||||
|
||||
|
||||
|
@ -78,7 +78,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -54,7 +54,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -183,7 +183,7 @@ Versions</a></h2>
|
||||
Speed</a></h2>
|
||||
<p>commands to configure speed of detector</p>
|
||||
<ul>
|
||||
<li><b>clkdivider [i]</b> sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. MYTHEN[???]. <code>Returns</code> <code></code>(int)</li>
|
||||
<li><b>clkdivider [i]</b> sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. Jungfrau, full speed is not implemented and overwrites adcphase to recommended default. MYTHEN[???]. <code>Returns</code> <code></code>(int)</li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><b>setlength [i]</b> sets/gets length of set/reset signals (in clock cycles). Used in MYTHEN only. <code>Returns</code> <code></code>(int)</li>
|
||||
@ -207,7 +207,7 @@ Speed</a></h2>
|
||||
<li><b>adcclk [i]</b> sets/gets the ADC clock frequency in MHz. For the new chiptestboard!<code>Returns</code> <code></code>(int)</li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><b>adcphase [i]</b> Sets/gets the ADC clock frequency in MHz. For the new chiptestboard!<code>Returns</code> <code></code>(int)</li>
|
||||
<li><b>adcphase [i]</b> Sets/gets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER) <code>Returns</code> <code></code>(int)</li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><b>adcpipeline [i]</b> Sets/gets the pipeline of the ADC. For the new chiptestbaord!<code>Returns</code> <code></code>(int)</li>
|
||||
@ -251,7 +251,7 @@ Detector Parameters</a></h2>
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -83,7 +83,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -75,7 +75,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -77,7 +77,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -317,7 +317,7 @@ Temp Control</a></h2>
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||
</iframe>
|
||||
</div>
|
||||
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 12 Mar 2018 by
|
||||
<hr size="1"/><address style="text-align: right;"><small>Generated on 20 Mar 2018 by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
|
||||
</body>
|
||||
|
@ -1,4 +1,4 @@
|
||||
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=latex 2014.12.17) 12 MAR 2018 15:45
|
||||
This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=latex 2014.12.17) 20 MAR 2018 12:10
|
||||
entering extended mode
|
||||
%&-line parsing enabled.
|
||||
**./images.tex
|
||||
|
@ -43,7 +43,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds
|
||||
<H1 ALIGN="CENTER">SLS Detector text clients manual</H1>
|
||||
<DIV>
|
||||
|
||||
<P ALIGN="CENTER"><STRONG>March 12, 2018</STRONG></P>
|
||||
<P ALIGN="CENTER"><STRONG>March 20, 2018</STRONG></P>
|
||||
</DIV>
|
||||
|
||||
<P>
|
||||
@ -148,7 +148,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds
|
||||
<BR><HR>
|
||||
<ADDRESS>
|
||||
Thattil Dhanya
|
||||
2018-03-12
|
||||
2018-03-20
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
@ -123,7 +123,7 @@ For additional questions concerning the indexing of the detector, please refer t
|
||||
<!--End of Navigation Panel-->
|
||||
<ADDRESS>
|
||||
Thattil Dhanya
|
||||
2018-03-12
|
||||
2018-03-20
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
@ -68,7 +68,7 @@ For additional questions concerning the acquisition flow, please refer to the <I
|
||||
<BR><HR>
|
||||
<ADDRESS>
|
||||
Thattil Dhanya
|
||||
2018-03-12
|
||||
2018-03-20
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
@ -763,7 +763,7 @@ Debug</A>
|
||||
<!--End of Navigation Panel-->
|
||||
<ADDRESS>
|
||||
Thattil Dhanya
|
||||
2018-03-12
|
||||
2018-03-20
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
@ -815,7 +815,7 @@ Advanced settings changing the analog or digital performance of the acquisition.
|
||||
<!--End of Navigation Panel-->
|
||||
<ADDRESS>
|
||||
Thattil Dhanya
|
||||
2018-03-12
|
||||
2018-03-20
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
@ -160,7 +160,7 @@ sls_detector_put ratecorr -1
|
||||
<!--End of Navigation Panel-->
|
||||
<ADDRESS>
|
||||
Thattil Dhanya
|
||||
2018-03-12
|
||||
2018-03-20
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
@ -61,11 +61,11 @@ Mathematics Department, Macquarie University, Sydney.
|
||||
The command line arguments were: <BR>
|
||||
<STRONG>latex2html</STRONG> <TT>-split 4 slsDetectorClientHowTo.tex</TT>
|
||||
<P>
|
||||
The translation was initiated by Thattil Dhanya on 2018-03-12
|
||||
The translation was initiated by Thattil Dhanya on 2018-03-20
|
||||
<BR><HR>
|
||||
<ADDRESS>
|
||||
Thattil Dhanya
|
||||
2018-03-12
|
||||
2018-03-20
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
@ -43,7 +43,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds
|
||||
<H1 ALIGN="CENTER">SLS Detector text clients manual</H1>
|
||||
<DIV>
|
||||
|
||||
<P ALIGN="CENTER"><STRONG>March 12, 2018</STRONG></P>
|
||||
<P ALIGN="CENTER"><STRONG>March 20, 2018</STRONG></P>
|
||||
</DIV>
|
||||
|
||||
<P>
|
||||
@ -148,7 +148,7 @@ original version by: Nikos Drakos, CBLU, University of Leeds
|
||||
<BR><HR>
|
||||
<ADDRESS>
|
||||
Thattil Dhanya
|
||||
2018-03-12
|
||||
2018-03-20
|
||||
</ADDRESS>
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
Binary file not shown.
Binary file not shown.
@ -71,11 +71,6 @@ int main(int argc, char **argv) {
|
||||
|
||||
/** - registering data callback */
|
||||
pDetector->registerDataCallback(&dataCallback, NULL);
|
||||
/** - if receiver exists, enable data streaming from receiver to get the data */
|
||||
pDetector->enableDataStreamingFromReceiver(1);
|
||||
/** - create zmq sockets in client to enable data streaming in of data from receiver/different process */
|
||||
pDetector->enableDataStreamingToClient(1);
|
||||
|
||||
|
||||
|
||||
/** - ensuring detector status is idle before starting acquisition. exiting if not idle */
|
||||
|
@ -1 +0,0 @@
|
||||
../slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.0.16.1
|
1
serverBin/eigerDetectorServerv3.1.1.16.0
Symbolic link
1
serverBin/eigerDetectorServerv3.1.1.16.0
Symbolic link
@ -0,0 +1 @@
|
||||
../slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.1.1.16.0
|
@ -1 +0,0 @@
|
||||
../slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.1.0.1
|
1
serverBin/gotthardDetectorServerv3.1.4.0
Symbolic link
1
serverBin/gotthardDetectorServerv3.1.4.0
Symbolic link
@ -0,0 +1 @@
|
||||
../slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.1.4.0
|
@ -1 +0,0 @@
|
||||
../slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.0.2
|
1
serverBin/jungfrauDetectorServerv3.1.3.0
Symbolic link
1
serverBin/jungfrauDetectorServerv3.1.3.0
Symbolic link
@ -0,0 +1 @@
|
||||
../slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.3.0
|
@ -1,9 +1,9 @@
|
||||
Path: slsDetectorsPackage/slsDetectorGui
|
||||
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repsitory UUID: b389402d647e939342dbb2c9317c688c0eb6b105
|
||||
Revision: 452
|
||||
Branch: 3.1.0-rc
|
||||
Last Changed Author: Erik_Frojdh
|
||||
Last Changed Rev: 3458
|
||||
Last Changed Date: 2018-03-09 10:55:40.000000002 +0100 ./src/qTabSettings.cpp
|
||||
Repsitory UUID: 1b92b01a466aa1986b8198700274af75477a1e54
|
||||
Revision: 455
|
||||
Branch: 3.1.4
|
||||
Last Changed Author: Dhanya_Thattil
|
||||
Last Changed Rev: 3492
|
||||
Last Changed Date: 2018-08-17 16:36:24.000000002 +0200 ./src/qTabSettings.cpp
|
||||
|
@ -1,6 +1,6 @@
|
||||
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
|
||||
#define GITREPUUID "b389402d647e939342dbb2c9317c688c0eb6b105"
|
||||
#define GITAUTH "Erik_Frojdh"
|
||||
#define GITREV 0x3458
|
||||
#define GITDATE 0x20180309
|
||||
#define GITBRANCH "3.1.0-rc"
|
||||
#define GITREPUUID "1b92b01a466aa1986b8198700274af75477a1e54"
|
||||
#define GITAUTH "Dhanya_Thattil"
|
||||
#define GITREV 0x3492
|
||||
#define GITDATE 0x20180817
|
||||
#define GITBRANCH "3.1.4"
|
||||
|
Binary file not shown.
@ -1,9 +1,9 @@
|
||||
Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer
|
||||
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repsitory UUID: 8b02aa9e91bbee0470492dcf1ff67415851e14fa
|
||||
Revision: 315
|
||||
Branch: 3.1.0-rc
|
||||
Last Changed Author: Erik_Frojdh
|
||||
Last Changed Rev: 3455
|
||||
Last Changed Date: 2018-03-08 16:44:32.000000002 +0100 ./FebRegisterDefs.h
|
||||
Repsitory UUID: afac5be3c3674fe87044d3b7a54471291698d4ba
|
||||
Revision: 316
|
||||
Branch: 3.1.1-rc
|
||||
Last Changed Author: Dhanya_Thattil
|
||||
Last Changed Rev: 3467
|
||||
Last Changed Date: 2018-03-19 17:26:38.000000002 +0100 ./FebRegisterDefs.h
|
||||
|
@ -1,6 +1,6 @@
|
||||
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
|
||||
#define GITREPUUID "8b02aa9e91bbee0470492dcf1ff67415851e14fa"
|
||||
#define GITAUTH "Erik_Frojdh"
|
||||
#define GITREV 0x3455
|
||||
#define GITDATE 0x20180308
|
||||
#define GITBRANCH "3.1.0-rc"
|
||||
#define GITREPUUID "afac5be3c3674fe87044d3b7a54471291698d4ba"
|
||||
#define GITAUTH "Dhanya_Thattil"
|
||||
#define GITREV 0x3467
|
||||
#define GITDATE 0x20180319
|
||||
#define GITBRANCH "3.1.1-rc"
|
||||
|
@ -1,9 +1,9 @@
|
||||
Path: slsDetectorsPackage/slsDetectorSoftware
|
||||
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repsitory UUID: b389402d647e939342dbb2c9317c688c0eb6b105
|
||||
Revision: 1714
|
||||
Branch: 3.1.0-rc
|
||||
Last Changed Author: Erik_Frojdh
|
||||
Last Changed Rev: 3458
|
||||
Last Changed Date: 2018-03-12 14:19:44.000000002 +0100 ./threadFiles/ThreadPool.o
|
||||
Repsitory UUID: 1b92b01a466aa1986b8198700274af75477a1e54
|
||||
Revision: 1726
|
||||
Branch: 3.1.4
|
||||
Last Changed Author: Dhanya_Thattil
|
||||
Last Changed Rev: 3492
|
||||
Last Changed Date: 2018-08-17 17:57:11.000000002 +0200 ./threadFiles/ThreadPool.o
|
||||
|
@ -906,20 +906,15 @@ int64_t getFrames(){
|
||||
int64_t setExposureTime(int64_t value){
|
||||
/* time is in ns */
|
||||
if (value != -1) {
|
||||
double actualvalue = value*(1E-9*CLK_FREQ);
|
||||
value*=(1E-9*CLK_FREQ);
|
||||
if(fabs(actualvalue-value)>= 0.5){
|
||||
if(actualvalue > value)
|
||||
value++;
|
||||
else
|
||||
value--;
|
||||
value = (value * 1E-3 * CLK_FREQ ) + 0.5;
|
||||
}
|
||||
}
|
||||
return set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG)/(1E-9*CLK_FREQ);
|
||||
return (set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) /
|
||||
(1E-3 * CLK_FREQ)) + 0.5;
|
||||
}
|
||||
|
||||
int64_t getExposureTime(){
|
||||
return get64BitReg(GET_EXPTIME_LSB_REG, GET_EXPTIME_MSB_REG)/(1E-9*CLK_FREQ);
|
||||
return (get64BitReg(GET_EXPTIME_LSB_REG, GET_EXPTIME_MSB_REG) /
|
||||
(1E-3 * CLK_FREQ)) + 0.5;
|
||||
}
|
||||
|
||||
int64_t setGates(int64_t value){
|
||||
@ -933,23 +928,16 @@ int64_t getGates(){
|
||||
int64_t setPeriod(int64_t value){
|
||||
/* time is in ns */
|
||||
if (value!=-1) {
|
||||
double actualvalue = value*(1E-9*CLK_FREQ);
|
||||
value*=(1E-9*CLK_FREQ);
|
||||
if(fabs(actualvalue-value)>= 0.5){
|
||||
if(actualvalue > value)
|
||||
value++;
|
||||
else
|
||||
value--;
|
||||
}
|
||||
value = (value * 1E-3 * CLK_FREQ ) + 0.5;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG)/(1E-9*CLK_FREQ);
|
||||
return (set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG) /
|
||||
(1E-3 * CLK_FREQ)) + 0.5;
|
||||
}
|
||||
|
||||
int64_t getPeriod(){
|
||||
return get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG)/(1E-9*CLK_FREQ);
|
||||
return (get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) /
|
||||
(1E-3 * CLK_FREQ)) + 0.5;
|
||||
}
|
||||
|
||||
int64_t setDelay(int64_t value){
|
||||
@ -959,16 +947,11 @@ int64_t setDelay(int64_t value){
|
||||
value += masterdefaultdelay;
|
||||
cprintf(BLUE,"Actual delay for master: %lld\n", (long long int) value);
|
||||
}
|
||||
double actualvalue = value*(1E-9*CLK_FREQ);
|
||||
value*=(1E-9*CLK_FREQ);
|
||||
if(fabs(actualvalue-value)>= 0.5){
|
||||
if(actualvalue > value)
|
||||
value++;
|
||||
else
|
||||
value--;
|
||||
value = (value * 1E-3 * CLK_FREQ ) + 0.5;
|
||||
}
|
||||
}
|
||||
int64_t retval = set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG)/(1E-9*CLK_FREQ);
|
||||
|
||||
int64_t retval = (set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG) /
|
||||
(1E-3 * CLK_FREQ)) + 0.5;
|
||||
if (masterflags == IS_MASTER) {
|
||||
cprintf(BLUE,"Actual delay read from master: %lld\n", (long long int) retval);
|
||||
retval -= masterdefaultdelay;
|
||||
@ -978,7 +961,8 @@ int64_t setDelay(int64_t value){
|
||||
}
|
||||
|
||||
int64_t getDelay(){
|
||||
return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG)/(1E-9*CLK_FREQ);
|
||||
return (get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) /
|
||||
(1E-3 * CLK_FREQ)) + 0.5;
|
||||
}
|
||||
|
||||
int64_t setTrains(int64_t value){
|
||||
@ -996,37 +980,26 @@ int64_t setProbes(int64_t value){
|
||||
|
||||
|
||||
int64_t setProgress() {
|
||||
|
||||
//????? eventually call after setting the registers
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int64_t getProgress() {
|
||||
|
||||
|
||||
//should be done in firmware!!!!
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int64_t getActualTime(){
|
||||
return get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG)/(1E-9*CLK_FREQ);
|
||||
return (get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG) /
|
||||
(1E-3 * CLK_FREQ)) + 0.5;
|
||||
}
|
||||
|
||||
int64_t getMeasurementTime(){
|
||||
int64_t v=get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG);
|
||||
/* u_int64_t mask=0x8000000000000000;
|
||||
if (v & mask ) {
|
||||
#ifdef VERBOSE
|
||||
printf("no measurement time left\n");
|
||||
#endif
|
||||
return -1E+9;
|
||||
} else*/
|
||||
return v/(1E-9*CLK_FREQ);
|
||||
return (v / (1E-3 * CLK_FREQ)) + 0.5;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
Path: slsDetectorsPackage/slsDetectorSoftware/gotthardDetectorServer
|
||||
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repsitory UUID: 675d69392a6497d42b23057c7c8783c8dad768d0
|
||||
Revision: 223
|
||||
Branch: 3.1.0-rc
|
||||
Repsitory UUID: d69d69e8928f90b053a0e5ffccb9cfc4e9c5f960
|
||||
Revision: 225
|
||||
Branch: 3.1.4-rc
|
||||
Last Changed Author: Dhanya_Thattil
|
||||
Last Changed Rev: 3447
|
||||
Last Changed Date: 2018-02-27 14:04:08.000000002 +0100 ./server_funcs.c
|
||||
Last Changed Rev: 3483
|
||||
Last Changed Date: 2018-07-25 14:56:37.000000002 +0200 ./firmware_funcs.c
|
||||
|
@ -1,6 +1,6 @@
|
||||
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
|
||||
#define GITREPUUID "675d69392a6497d42b23057c7c8783c8dad768d0"
|
||||
#define GITREPUUID "d69d69e8928f90b053a0e5ffccb9cfc4e9c5f960"
|
||||
#define GITAUTH "Dhanya_Thattil"
|
||||
#define GITREV 0x3447
|
||||
#define GITDATE 0x20180227
|
||||
#define GITBRANCH "3.1.0-rc"
|
||||
#define GITREV 0x3483
|
||||
#define GITDATE 0x20180725
|
||||
#define GITBRANCH "3.1.4-rc"
|
||||
|
Binary file not shown.
BIN
slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.1.4.0
Executable file
BIN
slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.1.4.0
Executable file
Binary file not shown.
@ -54,7 +54,7 @@
|
||||
#define DEBUGOUT
|
||||
#endif
|
||||
|
||||
#define CLK_FREQ 32.1E+6
|
||||
#define CLK_FREQ 32.007729
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -75,8 +75,8 @@
|
||||
#define TIME_FROM_START_MSB_REG (0x11 << 11)
|
||||
|
||||
/* Get Delay 64 bit register */
|
||||
#define GET_DELAY_LSB_REG (0x12 << 11)
|
||||
#define GET_DELAY_MSB_REG (0x13 << 11)
|
||||
#define GET_DELAY_LSB_REG (0x12 << 11) // different kind of delay
|
||||
#define GET_DELAY_MSB_REG (0x13 << 11) // different kind of delay
|
||||
|
||||
/* Get Cycles 64 bit register */
|
||||
#define GET_CYCLES_LSB_REG (0x14 << 11)
|
||||
@ -321,8 +321,8 @@
|
||||
|
||||
|
||||
/* Set Delay 64 bit register */
|
||||
#define SET_DELAY_LSB_REG (0x60 << 11)
|
||||
#define SET_DELAY_MSB_REG (0x61 << 11)
|
||||
#define SET_DELAY_LSB_REG (0x60 << 11) // different kind of delay
|
||||
#define SET_DELAY_MSB_REG (0x61 << 11) // different kind of delay
|
||||
|
||||
/* Set Cycles 64 bit register */
|
||||
#define SET_CYCLES_LSB_REG (0x62 << 11)
|
||||
|
Binary file not shown.
BIN
slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.3.0
Executable file
BIN
slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.1.3.0
Executable file
Binary file not shown.
@ -1,9 +1,9 @@
|
||||
Path: slsDetectorsPackage/slsDetectorSoftware/jungfrauDetectorServer
|
||||
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repsitory UUID: 8b02aa9e91bbee0470492dcf1ff67415851e14fa
|
||||
Revision: 117
|
||||
Branch: 3.1.0-rc
|
||||
Last Changed Author: Erik_Frojdh
|
||||
Last Changed Rev: 3455
|
||||
Last Changed Date: 2018-03-08 16:44:32.000000002 +0100 ./RegisterDefs.h
|
||||
Repsitory UUID: e599bfe56f512ea6a262483f61ffd8d67d6c6fcd
|
||||
Revision: 119
|
||||
Branch: 3.1.3
|
||||
Last Changed Author: Dhanya_Thattil
|
||||
Last Changed Rev: 3475
|
||||
Last Changed Date: 2018-06-28 15:11:57.000000002 +0200 ./RegisterDefs.h
|
||||
|
@ -1,6 +1,6 @@
|
||||
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
|
||||
#define GITREPUUID "8b02aa9e91bbee0470492dcf1ff67415851e14fa"
|
||||
#define GITAUTH "Erik_Frojdh"
|
||||
#define GITREV 0x3455
|
||||
#define GITDATE 0x20180308
|
||||
#define GITBRANCH "3.1.0-rc"
|
||||
#define GITREPUUID "e599bfe56f512ea6a262483f61ffd8d67d6c6fcd"
|
||||
#define GITAUTH "Dhanya_Thattil"
|
||||
#define GITREV 0x3475
|
||||
#define GITDATE 0x20180628
|
||||
#define GITBRANCH "3.1.3"
|
||||
|
@ -155,18 +155,21 @@ int testBus() {
|
||||
printf("\nTesting Bus...\n");
|
||||
|
||||
int ret = OK;
|
||||
u_int32_t addr = SET_DELAY_LSB_REG;
|
||||
u_int32_t addr = SET_TRIGGER_DELAY_LSB_REG;
|
||||
int times = 1000 * 1000;
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < times; ++i) {
|
||||
bus_w(addr, i * 100);
|
||||
if (i * 100 != bus_r(SET_DELAY_LSB_REG)) {
|
||||
cprintf(RED,"ERROR: Mismatch! Wrote 0x%x, read 0x%x\n", i * 100, bus_r(SET_DELAY_LSB_REG));
|
||||
if (i * 100 != bus_r(addr)) {
|
||||
cprintf(RED,"ERROR: Mismatch! Wrote 0x%x, read 0x%x\n",
|
||||
i * 100, bus_r(addr));
|
||||
ret = FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
bus_w(addr, 0);
|
||||
|
||||
if (ret == OK)
|
||||
printf("Successfully tested bus %d times\n", times);
|
||||
return ret;
|
||||
@ -487,9 +490,11 @@ int adcPhase(int st){ /**carlos needed clkphase 1 and 2? cehck with Aldo */
|
||||
printf("Setting ADC Phase to %d\n",st);
|
||||
if (st > 65535 || st < -65535)
|
||||
return clkPhase[0];
|
||||
clkPhase[1] = st - clkPhase[0];
|
||||
|
||||
printf(" phase %d\n", clkPhase[1] );
|
||||
clkPhase[1] = st - clkPhase[0];
|
||||
if (clkPhase[1] == 0)
|
||||
return clkPhase[0];
|
||||
|
||||
configurePll();
|
||||
clkPhase[0] = st;
|
||||
return clkPhase[0];
|
||||
@ -695,12 +700,12 @@ int64_t getTimeLeft(enum timerIndex ind){
|
||||
retval = get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / (1E-3 * CLK_SYNC);
|
||||
printf("Getting period left: %lldns\n", (long long int)retval);
|
||||
break;
|
||||
|
||||
/*
|
||||
case DELAY_AFTER_TRIGGER:
|
||||
retval = get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) / (1E-3 * CLK_SYNC);
|
||||
retval = get64BitReg(xxx) / (1E-3 * CLK_SYNC);
|
||||
printf("Getting delay left: %lldns\n", (long long int)retval);
|
||||
break;
|
||||
|
||||
*/
|
||||
case CYCLES_NUMBER:
|
||||
retval = get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG);
|
||||
printf("Getting number of cycles left: %lld\n", (long long int)retval);
|
||||
@ -1230,8 +1235,12 @@ void configurePll() {
|
||||
#endif
|
||||
u_int32_t val;
|
||||
int32_t phase=0, inv=0;
|
||||
// ensuring PLL is never configured with same phase
|
||||
if (clkPhase[1] == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
printf(" phase in %d\n", clkPhase[1]);
|
||||
printf("Configuring PLL with phase in %d\n", clkPhase[1]);
|
||||
if (clkPhase[1]>0) {
|
||||
inv=0;
|
||||
phase=clkPhase[1];
|
||||
|
@ -101,8 +101,8 @@ enum NETWORKINDEX { TXN_FRAME };
|
||||
#define CONFIG_QUARTER_SPEED (CONFIG_TDMA_DISABLE_VAL + CONFIG_QUARTER_SPEED_10MHZ_VAL + CONFIG_MODE_1_X_10GBE_VAL)
|
||||
#define ADC_OFST_HALF_SPEED_VAL (0x20) //adc pipeline
|
||||
#define ADC_OFST_QUARTER_SPEED_VAL (0x0f)
|
||||
#define ADC_PHASE_HALF_SPEED (0x41)
|
||||
#define ADC_PHASE_QUARTER_SPEED (0x19)
|
||||
#define ADC_PHASE_HALF_SPEED (0x48) //72
|
||||
#define ADC_PHASE_QUARTER_SPEED (0x48) //72
|
||||
|
||||
/* Maybe not required for jungfrau */
|
||||
#define NTRIMBITS (6)
|
||||
|
@ -1974,10 +1974,26 @@ void multiSlsDetector::resetFinalDataQueue() {
|
||||
GATE_INTEGRATED_TIME
|
||||
}
|
||||
*/
|
||||
int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t){
|
||||
int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t, int imod){
|
||||
|
||||
int64_t ret=-100;
|
||||
|
||||
// single (for gotthard 25 um)
|
||||
if (imod != -1) {
|
||||
if (imod >= 0 && imod < thisMultiDetector->numberOfDetectors) {
|
||||
if (detectors[imod]) {
|
||||
ret = detectors[imod]->setTimer(index,t,imod);
|
||||
if(detectors[imod]->getErrorMask())
|
||||
setErrorMask(getErrorMask()|(1<<imod));
|
||||
return ret;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// multi
|
||||
if(!threadpool){
|
||||
cout << "Error in creating threadpool. Exiting" << endl;
|
||||
return -1;
|
||||
@ -1987,8 +2003,8 @@ int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t){
|
||||
for(int idet=0; idet<thisMultiDetector->numberOfDetectors; ++idet){
|
||||
if(detectors[idet]){
|
||||
iret[idet]= new int64_t(-1);
|
||||
Task* task = new Task(new func2_t<int64_t,timerIndex,int64_t>(&slsDetector::setTimer,
|
||||
detectors[idet],index,t,iret[idet]));
|
||||
Task* task = new Task(new func3_t<int64_t,timerIndex,int64_t,int>(&slsDetector::setTimer,
|
||||
detectors[idet],index,t,imod,iret[idet]));
|
||||
threadpool->add_task(task);
|
||||
}
|
||||
}
|
||||
|
@ -688,9 +688,10 @@ class multiSlsDetector : public slsDetectorUtils {
|
||||
set/get timer value
|
||||
\param index timer index
|
||||
\param t time in ns or number of...(e.g. frames, gates, probes)
|
||||
\param imod module number (gotthard delay can have different values)
|
||||
\returns timer set value in ns or number of...(e.g. frames, gates, probes)
|
||||
*/
|
||||
int64_t setTimer(timerIndex index, int64_t t=-1);
|
||||
int64_t setTimer(timerIndex index, int64_t t=-1, int imod = -1);
|
||||
/**
|
||||
set/get timer value
|
||||
\param index timer index
|
||||
|
@ -1,6 +1,6 @@
|
||||
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
|
||||
#define GITREPUUID "b389402d647e939342dbb2c9317c688c0eb6b105"
|
||||
#define GITAUTH "Erik_Frojdh"
|
||||
#define GITREV 0x3458
|
||||
#define GITDATE 0x20180312
|
||||
#define GITBRANCH "3.1.0-rc"
|
||||
#define GITREPUUID "1b92b01a466aa1986b8198700274af75477a1e54"
|
||||
#define GITAUTH "Dhanya_Thattil"
|
||||
#define GITREV 0x3492
|
||||
#define GITDATE 0x20180817
|
||||
#define GITBRANCH "3.1.4"
|
||||
|
@ -270,7 +270,10 @@ slsDetector::~slsDetector(){
|
||||
else
|
||||
printf("Shared memory %d detached\n", shmId);
|
||||
#endif
|
||||
delete thisReceiver;
|
||||
if(controlSocket) delete controlSocket;
|
||||
if(stopSocket) delete stopSocket;
|
||||
if(dataSocket) delete dataSocket;
|
||||
if(thisReceiver) delete thisReceiver;
|
||||
};
|
||||
|
||||
slsDetector::slsDetector(int pos, char *name, int id, int cport,multiSlsDetector *p) : slsDetectorUtils(),
|
||||
@ -1318,6 +1321,26 @@ string slsDetector::checkOnline() {
|
||||
disconnectControl();
|
||||
#ifdef VERBOSE
|
||||
std::cout<< "online!" << std::endl;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
//still cannot connect to socket, controlSocket=0
|
||||
if(stopSocket){
|
||||
if (connectStop() == FAIL) {
|
||||
stopSocket->SetTimeOut(5);
|
||||
thisDetector->onlineFlag=OFFLINE_FLAG;
|
||||
delete stopSocket;
|
||||
stopSocket=NULL;
|
||||
retval = string(thisDetector->hostname);
|
||||
#ifdef VERBOSE
|
||||
std::cout<< "stop offline!" << std::endl;
|
||||
#endif
|
||||
} else {
|
||||
thisDetector->onlineFlag=ONLINE_FLAG;
|
||||
stopSocket->SetTimeOut(100);
|
||||
disconnectStop();
|
||||
#ifdef VERBOSE
|
||||
std::cout<< "stop online!" << std::endl;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -3698,6 +3721,9 @@ slsDetectorDefs::detectorSettings slsDetector::setSettings( detectorSettings ise
|
||||
std::cout<< "slsDetector setSettings "<< std::endl;
|
||||
#endif
|
||||
|
||||
if (isettings == -1)
|
||||
return getSettings(imod);
|
||||
|
||||
//only set client shared memory variable for Eiger, settings threshold loads the module data (trimbits, dacs etc.)
|
||||
if (thisDetector->myDetectorType == EIGER) {
|
||||
switch(isettings) {
|
||||
@ -4583,7 +4609,7 @@ int slsDetector::startAndReadAllNoWait(){
|
||||
GATE_INTEGRATED_TIME
|
||||
}
|
||||
*/
|
||||
int64_t slsDetector::setTimer(timerIndex index, int64_t t){
|
||||
int64_t slsDetector::setTimer(timerIndex index, int64_t t, int imod){
|
||||
|
||||
|
||||
int fnum=F_SET_TIMER,fnum2=F_SET_RECEIVER_TIMER;
|
||||
@ -7392,7 +7418,7 @@ int slsDetector::programFPGA(string fname){
|
||||
#endif
|
||||
if (thisDetector->onlineFlag==ONLINE_FLAG) {
|
||||
if (connectControl() == OK){
|
||||
controlSocket->SendDataOnly(&fnum,sizeof(fnum));cprintf(BG_RED,"size of filesize:%lu\n",sizeof(filesize));
|
||||
controlSocket->SendDataOnly(&fnum,sizeof(fnum));
|
||||
controlSocket->SendDataOnly(&filesize,sizeof(filesize));
|
||||
//check opening error
|
||||
controlSocket->ReceiveDataOnly(&ret,sizeof(ret));
|
||||
|
@ -1205,9 +1205,10 @@ class slsDetector : public slsDetectorUtils, public energyConversion {
|
||||
set/get timer value
|
||||
\param index timer index
|
||||
\param t time in ns or number of...(e.g. frames, gates, probes)
|
||||
\param imod module number (pointless in slsDetector)
|
||||
\returns timer set value in ns or number of...(e.g. frames, gates, probes)
|
||||
*/
|
||||
int64_t setTimer(timerIndex index, int64_t t=-1);
|
||||
int64_t setTimer(timerIndex index, int64_t t=-1, int imod = -1);
|
||||
|
||||
/**
|
||||
get current timer value
|
||||
|
@ -369,16 +369,17 @@ class slsDetectorBase : public virtual slsDetectorDefs, public virtual errorDef
|
||||
set/get timer value
|
||||
\param index timer index
|
||||
\param t time in ns or number of...(e.g. frames, gates, probes)
|
||||
\param imod module number
|
||||
\returns timer set value in ns or number of...(e.g. frames, gates, probes)
|
||||
*/
|
||||
virtual int64_t setTimer(timerIndex index, int64_t t=-1)=0;
|
||||
int64_t setExposureTime(int64_t t=-1){return setTimer(ACQUISITION_TIME,t);};
|
||||
int64_t setSubFrameExposureTime(int64_t t=-1){return setTimer(SUBFRAME_ACQUISITION_TIME,t);};
|
||||
int64_t setExposurePeriod(int64_t t=-1){return setTimer(FRAME_PERIOD,t);};
|
||||
int64_t setDelayAfterTrigger(int64_t t=-1){return setTimer(DELAY_AFTER_TRIGGER,t);};
|
||||
int64_t setNumberOfGates(int64_t t=-1){return setTimer(GATES_NUMBER,t);};
|
||||
int64_t setNumberOfFrames(int64_t t=-1){return setTimer(FRAME_NUMBER,t);};
|
||||
int64_t setNumberOfCycles(int64_t t=-1){return setTimer(CYCLES_NUMBER,t);};
|
||||
virtual int64_t setTimer(timerIndex index, int64_t t=-1, int imod = -1) = 0;
|
||||
int64_t setExposureTime(int64_t t=-1, int imod = -1){return setTimer(ACQUISITION_TIME,t,imod);};
|
||||
int64_t setSubFrameExposureTime(int64_t t=-1, int imod = -1){return setTimer(SUBFRAME_ACQUISITION_TIME,t,imod);};
|
||||
int64_t setExposurePeriod(int64_t t=-1, int imod = -1){return setTimer(FRAME_PERIOD,t,imod);};
|
||||
int64_t setDelayAfterTrigger(int64_t t=-1, int imod = -1){return setTimer(DELAY_AFTER_TRIGGER,t,imod);};
|
||||
int64_t setNumberOfGates(int64_t t=-1, int imod = -1){return setTimer(GATES_NUMBER,t,imod);};
|
||||
int64_t setNumberOfFrames(int64_t t=-1, int imod = -1){return setTimer(FRAME_NUMBER,t,imod);};
|
||||
int64_t setNumberOfCycles(int64_t t=-1, int imod = -1){return setTimer(CYCLES_NUMBER,t,imod);};
|
||||
|
||||
|
||||
/** sets/gets the value of important readout speed parameters
|
||||
|
@ -710,7 +710,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) {
|
||||
*/
|
||||
|
||||
/*! \page config
|
||||
- <b>clkdivider [i]</b> sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. MYTHEN[???]. \c Returns \c (int)
|
||||
- <b>clkdivider [i]</b> sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. Jungfrau, full speed is not implemented and overwrites adcphase to recommended default. MYTHEN[???]. \c Returns \c (int)
|
||||
*/
|
||||
descrToFuncMap[i].m_pFuncName="clkdivider"; //
|
||||
descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed;
|
||||
@ -766,7 +766,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) {
|
||||
++i;
|
||||
|
||||
/*! \page config
|
||||
- <b>adcphase [i]</b> Sets/gets the ADC clock frequency in MHz. For the new chiptestboard!\c Returns \c (int)
|
||||
- <b>adcphase [i]</b> Sets/gets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER) \c Returns \c (int)
|
||||
*/
|
||||
descrToFuncMap[i].m_pFuncName="adcphase"; //
|
||||
descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed;
|
||||
@ -5464,11 +5464,8 @@ string slsDetectorCommand::cmdTimer(int narg, char *args[], int action) {
|
||||
else
|
||||
return string("cannot scan timer value ")+string(args[1]);
|
||||
if (index==ACQUISITION_TIME || index==SUBFRAME_ACQUISITION_TIME || index==FRAME_PERIOD || index==DELAY_AFTER_TRIGGER) {
|
||||
// t=(int64_t)(val*1E+9); for precision of eg.0.0000325, following done
|
||||
val*=1E9;
|
||||
t = (int64_t)val;
|
||||
if(fabs(val-t)) // to validate precision loss
|
||||
t = t + val - t; //even t += vak-t loses precision
|
||||
// +0.5 for precision of eg.0.0000325
|
||||
t = ( val * 1E9 + 0.5);
|
||||
}else t=(int64_t)val;
|
||||
}
|
||||
|
||||
@ -5685,9 +5682,6 @@ string slsDetectorCommand::cmdSpeed(int narg, char *args[], int action) {
|
||||
return string("cannot scan speed value ")+string(args[1]);
|
||||
|
||||
}
|
||||
// -1 could work
|
||||
else if (cmd=="adcphase")
|
||||
t = 65536;
|
||||
|
||||
myDet->setOnline(ONLINE_FLAG);
|
||||
|
||||
@ -5707,21 +5701,23 @@ string slsDetectorCommand::helpSpeed(int narg, char *args[], int action) {
|
||||
ostringstream os;
|
||||
if (action==PUT_ACTION || action==HELP_ACTION) {
|
||||
|
||||
os << "clkdivider c \t sets readout clock divider" << std::endl;
|
||||
os << "clkdivider c \t sets readout clock divider. For Jungfrau, it also overwrites adcphase to recommended default" << std::endl;
|
||||
os << "setlength c\t sets the length of the set/reset signals (in clock cycles)" << std::endl;
|
||||
os << "waitstates c \t sets the waitstates of the bus interface" << std::endl;
|
||||
os << "totdivider c\t sets the clock divider in tot mode" << std::endl;
|
||||
os << "totdutycycle c\t sets the duty cycle of the tot clock" << std::endl;
|
||||
os << "adcphase c\t Sets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER)" << std::endl;
|
||||
os << std::endl;
|
||||
|
||||
}
|
||||
if (action==GET_ACTION || action==HELP_ACTION) {
|
||||
|
||||
os << "clkdivider \t gets readout clock divider" << std::endl;
|
||||
os << "clkdivider \t gets readout clock divider. For Jungfrau, it also overwrites adcphase to recommended default" << std::endl;
|
||||
os << "setlength \t gets the length of the set/reset signals (in clock cycles)" << std::endl;
|
||||
os << "waitstates \t gets the waitstates of the bus interface" << std::endl;
|
||||
os << "totdivider \t gets the clock divider in tot mode" << std::endl;
|
||||
os << "totdutycycle \t gets the duty cycle of the tot clock" << std::endl;
|
||||
os << "totdutycycle \t gets phase of the sampling clock. For JUNGFRAU, setting speed (clkdivider) overwrites adcphase to its default recommended value. (Not for EIGER)" << std::endl;
|
||||
os << std::endl;
|
||||
|
||||
}
|
||||
|
@ -151,43 +151,58 @@ int slsDetectorUsers::setThresholdEnergy(int e_eV){
|
||||
return myDetector->setThresholdEnergy(e_eV);
|
||||
}
|
||||
|
||||
double slsDetectorUsers::setExposureTime(double t, bool inseconds){
|
||||
int64_t tms = (int64_t)(t * (1E+9));
|
||||
if (t < 0) tms = -1;
|
||||
double slsDetectorUsers::setExposureTime(double t, bool inseconds, int imod){
|
||||
if(!inseconds)
|
||||
return myDetector->setExposureTime((int64_t)t);
|
||||
else
|
||||
return ((1E-9) * (double)myDetector->setExposureTime(tms));
|
||||
}
|
||||
|
||||
double slsDetectorUsers::setExposurePeriod(double t, bool inseconds){
|
||||
int64_t tms = (int64_t)(t * (1E+9));
|
||||
return myDetector->setExposureTime((int64_t)t,imod);
|
||||
else {
|
||||
// + 0.5 to round for precision lost from converting double to int64_t
|
||||
int64_t tms = (int64_t)(t * (1E+9) + 0.5);
|
||||
if (t < 0) tms = -1;
|
||||
if(!inseconds)
|
||||
return myDetector->setExposurePeriod((int64_t)t);
|
||||
else
|
||||
return ((1E-9) * (double)myDetector->setExposurePeriod(tms));
|
||||
tms = myDetector->setExposureTime(tms,imod);
|
||||
if (tms < 0)
|
||||
return -1;
|
||||
return ((1E-9) * (double)tms);
|
||||
}
|
||||
}
|
||||
|
||||
double slsDetectorUsers::setDelayAfterTrigger(double t, bool inseconds){
|
||||
int64_t tms = (int64_t)(t * (1E+9));
|
||||
double slsDetectorUsers::setExposurePeriod(double t, bool inseconds, int imod){
|
||||
if(!inseconds)
|
||||
return myDetector->setExposurePeriod((int64_t)t,imod);
|
||||
else {
|
||||
// + 0.5 to round for precision lost from converting double to int64_t
|
||||
int64_t tms = (int64_t)(t * (1E+9) + 0.5);
|
||||
if (t < 0) tms = -1;
|
||||
tms = myDetector->setExposurePeriod(tms,imod);
|
||||
if (tms < 0)
|
||||
return -1;
|
||||
return ((1E-9) * (double)tms);
|
||||
}
|
||||
}
|
||||
|
||||
double slsDetectorUsers::setDelayAfterTrigger(double t, bool inseconds, int imod){
|
||||
if(!inseconds)
|
||||
return myDetector->setDelayAfterTrigger((int64_t)t);
|
||||
else
|
||||
return ((1E-9) * (double)myDetector->setDelayAfterTrigger(tms));
|
||||
return myDetector->setDelayAfterTrigger((int64_t)t,imod);
|
||||
else {
|
||||
// + 0.5 to round for precision lost from converting double to int64_t
|
||||
int64_t tms = (int64_t)(t * (1E+9) + 0.5);
|
||||
if (t < 0) tms = -1;
|
||||
tms = myDetector->setDelayAfterTrigger(tms,imod);
|
||||
if (tms < 0)
|
||||
return -1;
|
||||
return ((1E-9) * (double)tms);
|
||||
}
|
||||
}
|
||||
|
||||
int64_t slsDetectorUsers::setNumberOfGates(int64_t t){
|
||||
return myDetector->setNumberOfGates(t);
|
||||
int64_t slsDetectorUsers::setNumberOfGates(int64_t t, int imod){
|
||||
return myDetector->setNumberOfGates(t,imod);
|
||||
}
|
||||
|
||||
int64_t slsDetectorUsers::setNumberOfFrames(int64_t t){
|
||||
return myDetector->setNumberOfFrames(t);
|
||||
int64_t slsDetectorUsers::setNumberOfFrames(int64_t t, int imod){
|
||||
return myDetector->setNumberOfFrames(t,imod);
|
||||
}
|
||||
|
||||
int64_t slsDetectorUsers::setNumberOfCycles(int64_t t){
|
||||
return myDetector->setNumberOfCycles(t);
|
||||
int64_t slsDetectorUsers::setNumberOfCycles(int64_t t, int imod){
|
||||
return myDetector->setNumberOfCycles(t,imod);
|
||||
}
|
||||
|
||||
int slsDetectorUsers::setTimingMode(int pol){
|
||||
|
@ -270,7 +270,7 @@ class slsDetectorUsers
|
||||
*/
|
||||
int getDetectorSize(int &x0, int &y0, int &nx, int &ny);
|
||||
/**
|
||||
@short setsthe maximum detector size
|
||||
@short gets the maximum detector size
|
||||
\param x0 horizontal position origin in channel number
|
||||
\param y0 vertical position origin in channel number
|
||||
\param nx number of channels in horiziontal
|
||||
@ -315,47 +315,53 @@ class slsDetectorUsers
|
||||
@short set/get exposure time value
|
||||
\param t time in sn (-1 gets)
|
||||
\param inseconds true if the value is in s, else ns
|
||||
\param imod module number (-1 for all)
|
||||
\returns timer set value in ns, or s if specified
|
||||
*/
|
||||
|
||||
double setExposureTime(double t=-1, bool inseconds=false);
|
||||
double setExposureTime(double t=-1, bool inseconds=false, int imod = -1);
|
||||
|
||||
/**
|
||||
@short set/get exposure period
|
||||
\param t time in ns (-1 gets)
|
||||
\param inseconds true if the value is in s, else ns
|
||||
\param imod module number (-1 for all)
|
||||
\returns timer set value in ns, or s if specified
|
||||
*/
|
||||
double setExposurePeriod(double t=-1, bool inseconds=false);
|
||||
double setExposurePeriod(double t=-1, bool inseconds=false, int imod = -1);
|
||||
|
||||
/**
|
||||
@short set/get delay after trigger
|
||||
\param t time in ns (-1 gets)
|
||||
\param inseconds true if the value is in s, else ns
|
||||
\param imod module number (-1 for all)
|
||||
\returns timer set value in ns, or s if specified
|
||||
*/
|
||||
double setDelayAfterTrigger(double t=-1, bool inseconds=false);
|
||||
double setDelayAfterTrigger(double t=-1, bool inseconds=false, int imod = -1);
|
||||
|
||||
/**
|
||||
@short set/get number of gates
|
||||
\param t number of gates (-1 gets)
|
||||
\param imod module number (-1 for all)
|
||||
\returns number of gates
|
||||
*/
|
||||
int64_t setNumberOfGates(int64_t t=-1);
|
||||
int64_t setNumberOfGates(int64_t t=-1, int imod = -1);
|
||||
|
||||
/**
|
||||
@short set/get number of frames i.e. number of exposure per trigger
|
||||
\param t number of frames (-1 gets)
|
||||
\param imod module number (-1 for all)
|
||||
\returns number of frames
|
||||
*/
|
||||
int64_t setNumberOfFrames(int64_t t=-1);
|
||||
int64_t setNumberOfFrames(int64_t t=-1, int imod = -1);
|
||||
|
||||
/**
|
||||
@short set/get number of cycles i.e. number of triggers
|
||||
\param t number of frames (-1 gets)
|
||||
\param imod module number (-1 for all)
|
||||
\returns number of frames
|
||||
*/
|
||||
int64_t setNumberOfCycles(int64_t t=-1);
|
||||
int64_t setNumberOfCycles(int64_t t=-1, int imod = -1);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -39,6 +39,9 @@ char mess[MAX_STR_LENGTH];
|
||||
int dataBytes = 10;
|
||||
int isControlServer = 0;
|
||||
int debugflag = 0;
|
||||
#ifdef EIGERD
|
||||
uint32_t dhcpipad = 0;
|
||||
#endif
|
||||
|
||||
/* initialization functions */
|
||||
|
||||
@ -64,6 +67,9 @@ void init_detector(int controlserver) {
|
||||
if (controlserver) {
|
||||
isControlServer = 1;
|
||||
initControlServer();
|
||||
#ifdef EIGERD
|
||||
dhcpipad = getDetectorIP();
|
||||
#endif
|
||||
}
|
||||
else initStopServer();
|
||||
#endif
|
||||
@ -2621,6 +2627,15 @@ int get_time_left(int file_des) {
|
||||
printf("getting time left on timer %d \n",ind);
|
||||
#endif
|
||||
#ifdef SLS_DETECTOR_FUNCTION_LIST
|
||||
|
||||
#ifdef JUNGFRAUD
|
||||
if (ind == DELAY_AFTER_TRIGGER) {
|
||||
ret = FAIL;
|
||||
sprintf(mess,"Timer Left Index (%d) is not implemented for this release.\n", (int)ind);
|
||||
cprintf(RED, "%s", mess);
|
||||
} else {
|
||||
#endif
|
||||
|
||||
switch(ind) {
|
||||
#ifdef MYTHEND
|
||||
case PROBES_NUMBER:
|
||||
@ -2651,6 +2666,11 @@ int get_time_left(int file_des) {
|
||||
#ifdef VERBOSE
|
||||
printf("Time left on timer %d is %lld\n",ind, retval);
|
||||
#endif
|
||||
|
||||
#ifdef JUNGFRAUD
|
||||
} // end of if (ind == DELAY_AFTER_TRIGGER)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
if (ret==OK && differentClients)
|
||||
ret=FORCE_UPDATE;
|
||||
@ -2988,7 +3008,7 @@ int set_speed(int file_des) {
|
||||
#ifdef JUNGFRAUD
|
||||
case ADC_PHASE:
|
||||
retval = adcPhase(val);
|
||||
if ((val != 65536) && (retval!=val) && (val>=0)) {
|
||||
if ((val != 100000) && (retval!=val) && (val>=0)) {
|
||||
ret=FAIL;
|
||||
sprintf(mess,"could not change set adc phase: should be %d but is %d \n", val, retval);
|
||||
cprintf(RED, "Warning: %s", mess);
|
||||
@ -3488,16 +3508,19 @@ int configure_mac(int file_des) {
|
||||
printf("WARNING: Matched detectormac to the hardware mac now\n");
|
||||
printf("*************************************************\n");
|
||||
}
|
||||
|
||||
// always remember the ip sent from the client (could be for 10g(if not dhcp))
|
||||
if (detipad != getDetectorIP())
|
||||
dhcpipad = detipad;
|
||||
|
||||
//only for 1Gbe
|
||||
if(!enableTenGigabitEthernet(-1)){
|
||||
if (detipad != getDetectorIP()){
|
||||
printf("*************************************************\n");
|
||||
printf("WARNING: actual detector ip address %x does not match the one from client %x\n",getDetectorIP(),detipad);
|
||||
printf("WARNING: Using DHCP IP for Configuring MAC\n");
|
||||
printf("*************************************************\n");
|
||||
detipad = getDetectorIP();
|
||||
printf("WARNING: Matched detector ip to the hardware ip now\n");
|
||||
printf("*************************************************\n");
|
||||
}
|
||||
}
|
||||
} else
|
||||
detipad = dhcpipad;
|
||||
#endif
|
||||
retval=configureMAC(ipad,imacadd,idetectormacadd,detipad,udpport,udpport2,0); //digitalTestBit);
|
||||
if(retval==-1) {
|
||||
|
@ -15,9 +15,7 @@ receiverInterface::receiverInterface(MySocketTCP *socket):dataSocket(socket){}
|
||||
|
||||
|
||||
|
||||
receiverInterface::~receiverInterface(){
|
||||
delete dataSocket;
|
||||
}
|
||||
receiverInterface::~receiverInterface(){}
|
||||
|
||||
|
||||
|
||||
|
@ -110,7 +110,7 @@ class SuperTask: public virtual slsDetectorDefs {
|
||||
public:
|
||||
SuperTask():
|
||||
m1(0),m2(0),m3(0),m4(0),m5(0),m6(0),m7(0),m8(0),m9(0),m10(0),m11(0),m12(0),m13(0),m14(0),m15(0),m16(0),m17(0),m18(0){};
|
||||
~SuperTask(){};
|
||||
virtual ~SuperTask(){};
|
||||
protected:
|
||||
/** Function signature defined
|
||||
* First argument is Return type, the remaining are arguments
|
||||
@ -127,7 +127,7 @@ protected:
|
||||
func2_t <int, string,int>* m10;
|
||||
func2_t <dacs_t, dacIndex,int>* m11;
|
||||
func2_t <detectorSettings, detectorSettings,int>* m12;
|
||||
func2_t <int64_t, timerIndex,int64_t>* m13;
|
||||
func3_t <int64_t, timerIndex,int64_t,int>* m13;
|
||||
func2_t <string, networkParameter,string>* m14;
|
||||
func3_t <int, int,int,int>* m15;
|
||||
func4_t <int, trimMode,int,int,int>* m16;
|
||||
@ -152,14 +152,39 @@ public:
|
||||
Task(func2_t <int, string,int>* t): SuperTask(),fnum(10){m10 = t;};
|
||||
Task(func2_t <dacs_t, dacIndex,int>* t): SuperTask(),fnum(11){m11 = t;};
|
||||
Task(func2_t <detectorSettings, detectorSettings,int>* t): SuperTask(),fnum(12){m12 = t;};
|
||||
Task(func2_t <int64_t, timerIndex,int64_t>* t): SuperTask(),fnum(13){m13 = t;};
|
||||
Task(func3_t <int64_t, timerIndex,int64_t,int>* t): SuperTask(),fnum(13){m13 = t;};
|
||||
Task(func2_t <string, networkParameter,string>* t): SuperTask(),fnum(14){m14 = t;};
|
||||
Task(func3_t <int, int,int,int>* t): SuperTask(),fnum(15){m15 = t;};
|
||||
Task(func4_t <int, trimMode,int,int,int>* t): SuperTask(),fnum(16){m16 = t;};
|
||||
Task(func4_t <int, int,int,detectorSettings,int>* t): SuperTask(),fnum(17){m17 = t;};
|
||||
Task(func4_t <dacs_t, dacs_t,dacIndex,int,int>* t): SuperTask(),fnum(18){m18 = t;};
|
||||
|
||||
~Task(){}
|
||||
virtual ~Task(){
|
||||
switch(fnum) {
|
||||
case 1: delete m1; break;
|
||||
case 2: delete m2; break;
|
||||
case 3: delete m3; break;
|
||||
case 4: delete m4; break;
|
||||
case 5: delete m5; break;
|
||||
case 6: delete m6; break;
|
||||
case 7: delete m7; break;
|
||||
case 8: delete m8; break;
|
||||
case 9: delete m9; break;
|
||||
case 10: delete m10; break;
|
||||
case 11: delete m11; break;
|
||||
case 12: delete m12; break;
|
||||
case 13: delete m13; break;
|
||||
case 14: delete m14; break;
|
||||
case 15: delete m15; break;
|
||||
case 16: delete m16; break;
|
||||
case 17: delete m17; break;
|
||||
case 18: delete m18; break;
|
||||
default:
|
||||
cprintf(RED, "Error: Task not defined. Abort!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
void operator()(){
|
||||
switch(fnum) {
|
||||
|
@ -1,9 +1,9 @@
|
||||
Path: slsDetectorsPackage/slsReceiverSoftware
|
||||
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
|
||||
Repsitory UUID: b389402d647e939342dbb2c9317c688c0eb6b105
|
||||
Revision: 708
|
||||
Branch: 3.1.0-rc
|
||||
Last Changed Author: Erik_Frojdh
|
||||
Last Changed Rev: 3458
|
||||
Last Changed Date: 2018-03-09 12:23:14.000000002 +0100 ./src/Listener.cpp
|
||||
Repsitory UUID: 1b92b01a466aa1986b8198700274af75477a1e54
|
||||
Revision: 715
|
||||
Branch: 3.1.4
|
||||
Last Changed Author: Dhanya_Thattil
|
||||
Last Changed Rev: 3492
|
||||
Last Changed Date: 2018-08-17 16:36:25.000000002 +0200 ./src/utilities.cpp
|
||||
|
@ -198,9 +198,10 @@ class DataProcessor : private virtual slsReceiverDefs, public ThreadObject {
|
||||
|
||||
/**
|
||||
* End of Acquisition
|
||||
* @param anyPacketsCaught true if any packets are caught, else false
|
||||
* @param numf number of images caught
|
||||
*/
|
||||
void EndofAcquisition(uint64_t numf);
|
||||
void EndofAcquisition(bool anyPacketsCaught, uint64_t numf);
|
||||
|
||||
|
||||
private:
|
||||
|
@ -159,9 +159,10 @@ class File : private virtual slsReceiverDefs {
|
||||
|
||||
/**
|
||||
* End of Acquisition
|
||||
* @param anyPacketsCaught true if any packets are caught, else false
|
||||
* @param numf number of images caught
|
||||
*/
|
||||
virtual void EndofAcquisition(uint64_t numf) {
|
||||
virtual void EndofAcquisition(bool anyPacketsCaught, uint64_t numf) {
|
||||
cprintf(RED,"This is a generic function EndofAcquisition that should be overloaded by a derived class\n");
|
||||
}
|
||||
|
||||
|
@ -111,9 +111,10 @@ class HDF5File : private virtual slsReceiverDefs, public File, public HDF5FileSt
|
||||
|
||||
/**
|
||||
* End of Acquisition
|
||||
* @param anyPacketsCaught true if any packets are caught, else false
|
||||
* @param numf number of images caught
|
||||
*/
|
||||
void EndofAcquisition(uint64_t numf);
|
||||
void EndofAcquisition(bool anyPacketsCaught, uint64_t numf);
|
||||
|
||||
/**
|
||||
* Create Virtual File
|
||||
@ -180,5 +181,8 @@ class HDF5File : private virtual slsReceiverDefs, public File, public HDF5FileSt
|
||||
/** Dataset array for parameters */
|
||||
DataSet* dataset_para[HDF5FileStatic::NumberofParameters];
|
||||
|
||||
/** Number of Images (including extended during acquisition) */
|
||||
uint64_t extNumImages;
|
||||
|
||||
};
|
||||
#endif
|
||||
|
@ -112,7 +112,7 @@ public:
|
||||
}
|
||||
} catch(Exception error) {
|
||||
cprintf(RED,"Error in closing HDF5 handles of index %d\n", ind);
|
||||
error.printError();
|
||||
error.printErrorStack();
|
||||
}
|
||||
}
|
||||
|
||||
@ -130,7 +130,7 @@ public:
|
||||
}
|
||||
} catch(Exception error) {
|
||||
cprintf(RED,"Error in closing master HDF5 handles\n");
|
||||
error.printError();
|
||||
error.printErrorStack();
|
||||
}
|
||||
}
|
||||
|
||||
@ -177,7 +177,7 @@ public:
|
||||
}
|
||||
catch(Exception error){
|
||||
cprintf(RED,"Error in writing to file in object %d\n",ind);
|
||||
error.printError();
|
||||
error.printErrorStack();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@ -187,6 +187,12 @@ public:
|
||||
|
||||
/**
|
||||
* Write Parameter Arrays as datasets (to virtual file)
|
||||
* @param ind self index
|
||||
* @param dpace_para parameter dataspace
|
||||
* @param fnum frame number current
|
||||
* @param dset_para parameter dataset
|
||||
* @param header image header
|
||||
* @returns 0 for success and 1 for fail
|
||||
*/
|
||||
static int WriteParameterDatasets(int ind, DataSpace* dspace_para, uint64_t fnum,
|
||||
DataSet* dset_para[],sls_detector_header* header)
|
||||
@ -213,12 +219,50 @@ public:
|
||||
}
|
||||
catch(Exception error){
|
||||
cprintf(RED,"Error in writing parameters to file in object %d\n",ind);
|
||||
error.printError();
|
||||
error.printErrorStack();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extend datasets in #images dimension (x dimension)
|
||||
* @param ind self index
|
||||
* @param dpace data space pointer address
|
||||
* @param dset data set pointer
|
||||
* @param dspace_para parameter dataspace address pointer
|
||||
* @param dset dataset parameter pointer
|
||||
* @param initialNumImages initial number of images
|
||||
* @returns 0 for success and 1 for fail
|
||||
*/
|
||||
static int ExtendDataset(int ind, DataSpace*& dspace, DataSet* dset,
|
||||
DataSpace*& dspace_para, DataSet* dset_para[],
|
||||
uint64_t initialNumImages) {
|
||||
try{
|
||||
Exception::dontPrint(); //to handle errors
|
||||
|
||||
hsize_t dims[3];
|
||||
dspace->getSimpleExtentDims(dims);
|
||||
dims[0] += initialNumImages;
|
||||
|
||||
dset->extend(dims);
|
||||
delete dspace;
|
||||
dspace = new DataSpace(dset->getSpace());
|
||||
|
||||
hsize_t dims_para[1] = {dims[0]};
|
||||
for (int i = 0; i < NumberofParameters; ++i)
|
||||
dset_para[i]->extend(dims_para);
|
||||
delete dspace_para;
|
||||
dspace_para = new DataSpace(dset_para[0]->getSpace());
|
||||
|
||||
}
|
||||
catch(Exception error){
|
||||
cprintf(RED,"Error in extending dataset in object %d\n",ind);
|
||||
error.printErrorStack();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create master file
|
||||
@ -246,9 +290,9 @@ public:
|
||||
FileAccPropList flist;
|
||||
flist.setFcloseDegree(H5F_CLOSE_STRONG);
|
||||
if(!owenable)
|
||||
fd = new H5File( fname.c_str(), H5F_ACC_EXCL, NULL, flist );
|
||||
fd = new H5File( fname.c_str(), H5F_ACC_EXCL, FileCreatPropList::DEFAULT, flist );
|
||||
else
|
||||
fd = new H5File( fname.c_str(), H5F_ACC_TRUNC, NULL, flist );
|
||||
fd = new H5File( fname.c_str(), H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, flist );
|
||||
|
||||
//variables
|
||||
DataSpace dataspace = DataSpace (H5S_SCALAR);
|
||||
@ -328,7 +372,7 @@ public:
|
||||
|
||||
} catch(Exception error) {
|
||||
cprintf(RED,"Error in creating master HDF5 handles\n");
|
||||
error.printError();
|
||||
error.printErrorStack();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@ -374,9 +418,9 @@ public:
|
||||
FileAccPropList fapl;
|
||||
fapl.setFcloseDegree(H5F_CLOSE_STRONG);
|
||||
if(!owenable)
|
||||
fd = new H5File( fname.c_str(), H5F_ACC_EXCL, NULL,fapl );
|
||||
fd = new H5File( fname.c_str(), H5F_ACC_EXCL, FileCreatPropList::DEFAULT,fapl );
|
||||
else
|
||||
fd = new H5File( fname.c_str(), H5F_ACC_TRUNC, NULL, fapl );
|
||||
fd = new H5File( fname.c_str(), H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl );
|
||||
|
||||
//attributes - version
|
||||
double dValue=version;
|
||||
@ -386,7 +430,8 @@ public:
|
||||
|
||||
//dataspace
|
||||
hsize_t srcdims[3] = {nDimx, nDimy, nDimz};
|
||||
dspace = new DataSpace (3,srcdims);
|
||||
hsize_t srcdimsmax[3] = {H5S_UNLIMITED, nDimy, nDimz};
|
||||
dspace = new DataSpace (3,srcdims,srcdimsmax);
|
||||
|
||||
//dataset name
|
||||
ostringstream osfn;
|
||||
@ -396,23 +441,28 @@ public:
|
||||
|
||||
//dataset
|
||||
//chunked dataset if greater than max_chunked_images
|
||||
if(nDimx > maxchunkedimages){
|
||||
// always create chunked dataset as unlimited is only supported with chunked layout
|
||||
DSetCreatPropList plist;
|
||||
hsize_t chunk_dims[3] ={maxchunkedimages, nDimy, nDimz};
|
||||
plist.setChunk(3, chunk_dims);
|
||||
dset = new DataSet (fd->createDataSet(dsetname.c_str(), dtype, *dspace, plist));
|
||||
}else
|
||||
dset = new DataSet (fd->createDataSet(dsetname.c_str(), dtype, *dspace));
|
||||
|
||||
//create parameter datasets
|
||||
hsize_t dims[1] = {nDimx};
|
||||
dspace_para = new DataSpace (1,dims);
|
||||
hsize_t dimsmax[1] = {H5S_UNLIMITED};
|
||||
dspace_para = new DataSpace (1,dims,dimsmax);
|
||||
|
||||
// always create chunked dataset as unlimited is only supported with chunked layout
|
||||
DSetCreatPropList paralist;
|
||||
hsize_t chunkpara_dims[3] ={maxchunkedimages};
|
||||
paralist.setChunk(1, chunkpara_dims);
|
||||
|
||||
for (int i = 0; i < NumberofParameters; ++i)
|
||||
dset_para[i] = new DataSet(fd->createDataSet(ParameterNames[i], ParameterDataTypes[i], *dspace_para));
|
||||
dset_para[i] = new DataSet(fd->createDataSet(ParameterNames[i], ParameterDataTypes[i], *dspace_para, paralist));
|
||||
}
|
||||
catch(Exception error){
|
||||
cprintf(RED,"Error in creating HDF5 handles in object %d\n",ind);
|
||||
error.printError();
|
||||
error.printErrorStack();
|
||||
fd->close();
|
||||
return 1;
|
||||
}
|
||||
@ -488,7 +538,7 @@ public:
|
||||
hid_t vdsDataspace = H5Screate_simple(3, vdsdims ,NULL);
|
||||
if (vdsDataspace < 0)
|
||||
return CloseFileOnError(fd, string("Error in creating virtual dataspace in virtual file ") + virtualFileName + string("\n"));
|
||||
hsize_t vdsdims_para[2] = {numf, numDety * numDetz};
|
||||
hsize_t vdsdims_para[2] = {numf, (unsigned int)numDety * numDetz};
|
||||
hid_t vdsDataspace_para = H5Screate_simple(2, vdsdims_para, NULL);
|
||||
if (vdsDataspace_para < 0)
|
||||
return CloseFileOnError(fd, string("Error in creating virtual dataspace (parameters) in virtual file ") + virtualFileName + string("\n"));
|
||||
@ -541,6 +591,14 @@ public:
|
||||
string srcFileName = HDF5FileStatic::CreateFileName(fpath, fnameprefix, findex,
|
||||
frindexenable, framesSaved, dindex, numunits, i);
|
||||
|
||||
// find relative path
|
||||
string relative_srcFileName = srcFileName;
|
||||
{
|
||||
size_t i = srcFileName.rfind('/', srcFileName.length());
|
||||
if (i != string::npos)
|
||||
relative_srcFileName = (srcFileName.substr(i+1, srcFileName.length() - i));
|
||||
}
|
||||
|
||||
//source dataset name
|
||||
ostringstream osfn;
|
||||
osfn << "/data";
|
||||
@ -549,23 +607,25 @@ public:
|
||||
|
||||
//source dataspace
|
||||
hsize_t srcdims[3] = {nDimx, nDimy, nDimz};
|
||||
hid_t srcDataspace = H5Screate_simple(3, srcdims, NULL);
|
||||
hsize_t srcdimsmax[3] = {H5S_UNLIMITED, nDimy, nDimz};
|
||||
hid_t srcDataspace = H5Screate_simple(3, srcdims, srcdimsmax);
|
||||
if (srcDataspace < 0)
|
||||
return CloseFileOnError(fd, string("Error in creating source dataspace in virtual file ") + virtualFileName + string("\n"));
|
||||
hsize_t srcdims_para[1] = {nDimx};
|
||||
hid_t srcDataspace_para = H5Screate_simple(1, srcdims_para, NULL);
|
||||
hsize_t srcdimsmax_para[1] = {H5S_UNLIMITED};
|
||||
hid_t srcDataspace_para = H5Screate_simple(1, srcdims_para, srcdimsmax_para);
|
||||
if (srcDataspace_para < 0)
|
||||
return CloseFileOnError(fd, string("Error in creating source dataspace (parameters) in virtual file ") + virtualFileName + string("\n"));
|
||||
|
||||
//mapping
|
||||
if (H5Pset_virtual(dcpl, vdsDataspace, srcFileName.c_str(), srcDatasetName.c_str(), srcDataspace) < 0) {
|
||||
if (H5Pset_virtual(dcpl, vdsDataspace, relative_srcFileName.c_str(), srcDatasetName.c_str(), srcDataspace) < 0) {
|
||||
cprintf(RED,"could not set mapping for paramter 1\n");
|
||||
error = true;
|
||||
break;
|
||||
}
|
||||
|
||||
for (int k = 0; k < NumberofParameters; ++k) {
|
||||
if (H5Pset_virtual(dcpl_para[k], vdsDataspace_para, srcFileName.c_str(), ParameterNames[k], srcDataspace_para) < 0) {
|
||||
if (H5Pset_virtual(dcpl_para[k], vdsDataspace_para, relative_srcFileName.c_str(), ParameterNames[k], srcDataspace_para) < 0) {
|
||||
cprintf(RED,"could not set mapping for paramter %d\n", k);
|
||||
error = true;
|
||||
break;
|
||||
@ -587,7 +647,7 @@ public:
|
||||
return CloseFileOnError(fd, string("Error in mapping files in virtual file ") + virtualFileName + string("\n"));
|
||||
|
||||
//dataset
|
||||
string virtualDatasetName = string("/virtual_") + srcDataseName;
|
||||
string virtualDatasetName = /*string("/virtual_") + */srcDataseName;
|
||||
hid_t vdsdataset = H5Dcreate2 (fd, virtualDatasetName.c_str(), GetDataTypeinC(dataType), vdsDataspace, H5P_DEFAULT, dcpl, H5P_DEFAULT);
|
||||
if (vdsdataset < 0)
|
||||
return CloseFileOnError(fd, string("Error in creating virutal dataset in virtual file ") + virtualFileName + string("\n"));
|
||||
@ -596,7 +656,7 @@ public:
|
||||
//virtual parameter dataset
|
||||
for (int i = 0; i < NumberofParameters; ++i) {
|
||||
hid_t vdsdataset_para = H5Dcreate2 (fd,
|
||||
(string("/virtual_") + string (ParameterNames[i])).c_str(),
|
||||
(/*string("/virtual_") + */string (ParameterNames[i])).c_str(),
|
||||
GetDataTypeinC(ParameterDataTypes[i]), vdsDataspace_para, H5P_DEFAULT, dcpl_para[i], H5P_DEFAULT);
|
||||
if (vdsdataset_para < 0)
|
||||
return CloseFileOnError(fd, string("Error in creating virutal dataset (parameters) in virtual file ") + virtualFileName + string("\n"));
|
||||
@ -697,7 +757,7 @@ public:
|
||||
oldfd->close();
|
||||
} catch(Exception error){
|
||||
cprintf(RED,"Error in copying virtual files\n");
|
||||
error.printError();
|
||||
error.printErrorStack();
|
||||
free(data_out);
|
||||
oldfd->close();
|
||||
newfd->close();
|
||||
@ -739,6 +799,14 @@ public:
|
||||
return CloseFileOnError( vfd, string("Error in opening virtual file\n"));
|
||||
}
|
||||
|
||||
// find relative path
|
||||
string relative_virtualfname = virtualfname;
|
||||
{
|
||||
size_t i = virtualfname.rfind('/', virtualfname.length());
|
||||
if (i != string::npos)
|
||||
relative_virtualfname = (virtualfname.substr(i+1, virtualfname.length() - i));
|
||||
}
|
||||
|
||||
//**data dataset**
|
||||
hid_t vdset = H5Dopen2( vfd, virtualDatasetname.c_str(), H5P_DEFAULT);
|
||||
if (vdset < 0) {
|
||||
@ -746,7 +814,7 @@ public:
|
||||
return CloseFileOnError( vfd, string("Error in opening virtual data dataset\n"));
|
||||
}
|
||||
sprintf(linkname, "/entry/data/%s",virtualDatasetname.c_str());
|
||||
if(H5Lcreate_external( virtualfname.c_str(), virtualDatasetname.c_str(),
|
||||
if(H5Lcreate_external( relative_virtualfname.c_str(), virtualDatasetname.c_str(),
|
||||
mfd, linkname, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||||
H5Fclose(mfd); mfd = 0;
|
||||
return CloseFileOnError( vfd, string("Error in creating link to data dataset\n"));
|
||||
@ -755,13 +823,13 @@ public:
|
||||
|
||||
//**paramter datasets**
|
||||
for (int i = 0; i < NumberofParameters; ++i){
|
||||
hid_t vdset_para = H5Dopen2( vfd, (string("/virtual_") + string (ParameterNames[i])).c_str(), H5P_DEFAULT);
|
||||
hid_t vdset_para = H5Dopen2( vfd, (/*string("/virtual_") + */string (ParameterNames[i])).c_str(), H5P_DEFAULT);
|
||||
if (vdset_para < 0) {
|
||||
H5Fclose(mfd); mfd = 0;
|
||||
return CloseFileOnError( vfd, string("Error in opening virtual parameter dataset to create link\n"));
|
||||
}
|
||||
sprintf(linkname, "/entry/data/%s",(string("/virtual_") + string (ParameterNames[i])).c_str());
|
||||
if(H5Lcreate_external( virtualfname.c_str(), (string("/virtual_") + string (ParameterNames[i])).c_str(),
|
||||
sprintf(linkname, "/entry/data/%s",(/*string("/virtual_") + */string (ParameterNames[i])).c_str());
|
||||
if(H5Lcreate_external( relative_virtualfname.c_str(), (/*string("/virtual_") + */string (ParameterNames[i])).c_str(),
|
||||
mfd, linkname, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||||
H5Fclose(mfd); mfd = 0;
|
||||
return CloseFileOnError( vfd, string("Error in creating link to virtual parameter dataset\n"));
|
||||
|
@ -1,6 +1,6 @@
|
||||
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
|
||||
#define GITREPUUID "b389402d647e939342dbb2c9317c688c0eb6b105"
|
||||
#define GITAUTH "Erik_Frojdh"
|
||||
#define GITREV 0x3458
|
||||
#define GITDATE 0x20180309
|
||||
#define GITBRANCH "3.1.0-rc"
|
||||
#define GITREPUUID "1b92b01a466aa1986b8198700274af75477a1e54"
|
||||
#define GITAUTH "Dhanya_Thattil"
|
||||
#define GITREV 0x3492
|
||||
#define GITDATE 0x20180817
|
||||
#define GITBRANCH "3.1.4"
|
||||
|
@ -282,9 +282,9 @@ void DataProcessor::CloseFiles() {
|
||||
file->CloseAllFiles();
|
||||
}
|
||||
|
||||
void DataProcessor::EndofAcquisition(uint64_t numf) {
|
||||
void DataProcessor::EndofAcquisition(bool anyPacketsCaught, uint64_t numf) {
|
||||
if (file && file->GetFileType() == HDF5) {
|
||||
file->EndofAcquisition(numf);
|
||||
file->EndofAcquisition(anyPacketsCaught, numf);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,8 @@ HDF5File::HDF5File(int ind, uint32_t maxf, const uint32_t* ppf,
|
||||
numFramesInFile(0),
|
||||
numActualPacketsInFile(0),
|
||||
numFilesinAcquisition(0),
|
||||
dataspace_para(0)
|
||||
dataspace_para(0),
|
||||
extNumImages(0)
|
||||
{
|
||||
#ifdef VERBOSE
|
||||
PrintMembers();
|
||||
@ -97,7 +98,7 @@ int HDF5File::CreateFile(uint64_t fnum) {
|
||||
//first time
|
||||
if(!fnum) UpdateDataType();
|
||||
|
||||
uint64_t framestosave = ((*numImages - fnum) > maxFramesPerFile) ? maxFramesPerFile : (*numImages-fnum);
|
||||
uint64_t framestosave = ((extNumImages - fnum) > maxFramesPerFile) ? maxFramesPerFile : (extNumImages-fnum);
|
||||
pthread_mutex_lock(&Mutex);
|
||||
if (HDF5FileStatic::CreateDataFile(index, *overWriteEnable, currentFileName, *frameIndexEnable,
|
||||
fnum, framestosave, nPixelsY, ((*dynamicRange==4) ? (nPixelsX/2) : nPixelsX),
|
||||
@ -111,9 +112,9 @@ int HDF5File::CreateFile(uint64_t fnum) {
|
||||
if (dataspace == NULL)
|
||||
cprintf(RED,"Got nothing!\n");
|
||||
|
||||
if(!silentMode)
|
||||
if(!silentMode) {
|
||||
FILE_LOG(logINFO) << *udpPortNumber << ": HDF5 File created: " << currentFileName;
|
||||
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
@ -145,6 +146,19 @@ int HDF5File::WriteToFile(char* buffer, int buffersize, uint64_t fnum, uint32_t
|
||||
numFramesInFile++;
|
||||
numActualPacketsInFile += nump;
|
||||
pthread_mutex_lock(&Mutex);
|
||||
|
||||
// extend dataset (when receiver start followed by many status starts (jungfrau)))
|
||||
if (fnum >= extNumImages) {
|
||||
if (HDF5FileStatic::ExtendDataset(index, dataspace, dataset,
|
||||
dataspace_para, dataset_para, *numImages) == OK) {
|
||||
if (!silentMode) {
|
||||
cprintf(BLUE,"%d Extending HDF5 dataset by %lu, Total x Dimension: %lu\n",
|
||||
index, extNumImages, extNumImages + *numImages);
|
||||
}
|
||||
extNumImages += *numImages;
|
||||
}
|
||||
}
|
||||
|
||||
if (HDF5FileStatic::WriteDataFile(index, buffer + sizeof(sls_detector_header),
|
||||
fnum%maxFramesPerFile, nPixelsY, ((*dynamicRange==4) ? (nPixelsX/2) : nPixelsX),
|
||||
dataspace, dataset, datatype) == OK) {
|
||||
@ -163,18 +177,23 @@ int HDF5File::WriteToFile(char* buffer, int buffersize, uint64_t fnum, uint32_t
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int HDF5File::CreateMasterFile(bool en, uint32_t size,
|
||||
uint32_t nx, uint32_t ny, uint64_t at, uint64_t st, uint64_t ap) {
|
||||
|
||||
//beginning of every acquisition
|
||||
numFramesInFile = 0;
|
||||
numActualPacketsInFile = 0;
|
||||
extNumImages = *numImages;
|
||||
|
||||
if (master && (*detIndex==0)) {
|
||||
virtualfd = 0;
|
||||
masterFileName = HDF5FileStatic::CreateMasterFileName(filePath, fileNamePrefix, *fileIndex);
|
||||
if(!silentMode)
|
||||
if(!silentMode){
|
||||
FILE_LOG(logINFO) << "Master File: " << masterFileName;
|
||||
}
|
||||
pthread_mutex_lock(&Mutex);
|
||||
int ret = HDF5FileStatic::CreateMasterDataFile(masterfd, masterFileName, *overWriteEnable,
|
||||
*dynamicRange, en, size, nx, ny, *numImages, at, st, ap, HDF5_WRITER_VERSION);
|
||||
@ -185,11 +204,11 @@ int HDF5File::CreateMasterFile(bool en, uint32_t size,
|
||||
}
|
||||
|
||||
|
||||
void HDF5File::EndofAcquisition(uint64_t numf) {
|
||||
void HDF5File::EndofAcquisition(bool anyPacketsCaught, uint64_t numf) {
|
||||
//not created before
|
||||
if (!virtualfd) {
|
||||
if (!virtualfd && anyPacketsCaught) {
|
||||
|
||||
//only one file and one sub image
|
||||
//only one file and one sub image (link current file in master)
|
||||
if (((numFilesinAcquisition == 1) && (numDetY*numDetX) == 1)) {
|
||||
//dataset name
|
||||
ostringstream osfn;
|
||||
@ -217,7 +236,7 @@ int HDF5File::CreateVirtualFile(uint64_t numf) {
|
||||
virtualfd, masterFileName,
|
||||
filePath, fileNamePrefix, *fileIndex, *frameIndexEnable,
|
||||
*detIndex, *numUnitsPerDetector,
|
||||
maxFramesPerFile, numf,
|
||||
maxFramesPerFile, numf+1,
|
||||
"data", datatype,
|
||||
numDetY, numDetX, nPixelsY, ((*dynamicRange==4) ? (nPixelsX/2) : nPixelsX),
|
||||
HDF5_WRITER_VERSION);
|
||||
|
@ -290,7 +290,7 @@ void UDPBaseImplementation::setFilePath(const char c[]){
|
||||
else
|
||||
FILE_LOG(logERROR) << "FilePath does not exist: " << filePath;
|
||||
}
|
||||
FILE_LOG(logINFO) << "Info: File path: " << filePath;
|
||||
FILE_LOG(logINFO) << "File path: " << filePath;
|
||||
}
|
||||
|
||||
void UDPBaseImplementation::setFileIndex(const uint64_t i){
|
||||
|
@ -462,8 +462,9 @@ void UDPStandardImplementation::stopReceiver(){
|
||||
if((*it)->GetMeasurementStartedFlag())
|
||||
anycaught = true;
|
||||
}
|
||||
if (anycaught)
|
||||
dataProcessor[0]->EndofAcquisition(maxIndexCaught); //to create virtual file
|
||||
|
||||
//to create virtual file & set files/acquisition to 0 (only hdf5 at the moment)
|
||||
dataProcessor[0]->EndofAcquisition(anycaught, maxIndexCaught);
|
||||
}
|
||||
|
||||
while(DataStreamer::GetRunningMask()){
|
||||
@ -480,7 +481,7 @@ void UDPStandardImplementation::stopReceiver(){
|
||||
tot += dataProcessor[i]->GetNumFramesCaught();
|
||||
|
||||
uint64_t missingpackets = numberOfFrames*generalData->packetsPerFrame-listener[i]->GetPacketsCaught();
|
||||
if (missingpackets) {
|
||||
if ((int)missingpackets > 0) {
|
||||
cprintf(RED, "\n[Port %d]\n",udpPortNum[i]);
|
||||
cprintf(RED, "Missing Packets\t\t: %lld\n",(long long int)missingpackets);
|
||||
cprintf(RED, "Complete Frames\t\t: %lld\n",(long long int)dataProcessor[i]->GetNumFramesCaught());
|
||||
@ -562,12 +563,15 @@ void UDPStandardImplementation::shutDownUDPSockets() {
|
||||
|
||||
void UDPStandardImplementation::closeFiles() {
|
||||
uint64_t maxIndexCaught = 0;
|
||||
bool anycaught = false;
|
||||
for (vector<DataProcessor*>::const_iterator it = dataProcessor.begin(); it != dataProcessor.end(); ++it) {
|
||||
(*it)->CloseFiles();
|
||||
maxIndexCaught = max(maxIndexCaught, (*it)->GetProcessedMeasurementIndex());
|
||||
if((*it)->GetMeasurementStartedFlag())
|
||||
anycaught = true;
|
||||
}
|
||||
if (maxIndexCaught)
|
||||
dataProcessor[0]->EndofAcquisition(maxIndexCaught);
|
||||
//to create virtual file & set files/acquisition to 0 (only hdf5 at the moment)
|
||||
dataProcessor[0]->EndofAcquisition(anycaught, maxIndexCaught);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user