From 39b1f5bbf2ea460a84ac211d12cf508347366f79 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil <33750417+thattil@users.noreply.github.com> Date: Thu, 15 Dec 2022 09:16:51 +0100 Subject: [PATCH] Moench rewrite (#597) * copied jungfrau server to moench and adapted * fixed image size and num packets * read n rows allows 16 * commneted out configure_asic_timer at server startup. To be removed later the ASIC_CTRL_REG and storage cell options * moench:removing the decrement (which was in jf) in read n rows to register * removed lblsamples from gui --- RELEASE.txt | 795 +---- slsDetectorGui/forms/form_tab_measurement.ui | 1699 ++++----- slsDetectorGui/include/qTabMeasurement.h | 3 - slsDetectorGui/src/qDrawPlot.cpp | 4 +- slsDetectorGui/src/qTabDataOutput.cpp | 4 +- slsDetectorGui/src/qTabDeveloper.cpp | 92 +- slsDetectorGui/src/qTabMeasurement.cpp | 51 +- slsDetectorGui/src/qTabPlot.cpp | 8 + slsDetectorGui/src/qTabSettings.cpp | 6 +- .../bin/ctbDetectorServer_developer | Bin 317404 -> 317404 bytes .../bin/eigerDetectorServer_developer | Bin 431513 -> 431521 bytes .../bin/gotthard2DetectorServer_developer | Bin 282012 -> 282012 bytes .../bin/gotthardDetectorServer_developer | Bin 270844 -> 270844 bytes .../bin/jungfrauDetectorServer_developer | Bin 302632 -> 302664 bytes .../moenchDetectorServer/CMakeLists.txt | 23 +- .../DefaultPattern_moench.txt | 301 -- .../moenchDetectorServer/Makefile | 21 +- .../moenchDetectorServer/RegisterDefs.h | 1118 +++--- .../bin/DefaultPattern_moench.txt | 301 -- .../bin/moenchDetectorServer_developer | Bin 306008 -> 302608 bytes .../moenchDetectorServer/config_moench.txt | 4 + .../moenchDetectorServer/detid_moench.txt | 1 + .../slsDetectorFunctionList.c | 3038 +++++++++++------ .../slsDetectorServer_defs.h | 272 +- .../bin/mythen3DetectorServer_developer | Bin 291832 -> 291832 bytes .../slsDetectorServer/include/ALTERA_PLL.h | 11 +- .../slsDetectorServer/include/loadPattern.h | 2 +- .../include/slsDetectorFunctionList.h | 121 +- .../slsDetectorServer/src/AD9257.c | 2 +- .../slsDetectorServer/src/ALTERA_PLL.c | 8 +- .../slsDetectorServer/src/common.c | 8 +- .../slsDetectorServer/src/loadPattern.c | 6 +- .../slsDetectorServer/src/slsDetectorServer.c | 4 +- .../src/slsDetectorServer_funcs.c | 401 +-- slsDetectorSoftware/include/sls/Detector.h | 430 ++- slsDetectorSoftware/src/CmdProxy.cpp | 98 +- slsDetectorSoftware/src/CmdProxy.h | 230 +- slsDetectorSoftware/src/Detector.cpp | 25 +- slsDetectorSoftware/src/DetectorImpl.cpp | 18 +- slsDetectorSoftware/src/DetectorImpl.h | 2 +- slsDetectorSoftware/src/HelpDacs.h | 48 +- slsDetectorSoftware/src/Module.cpp | 21 +- slsDetectorSoftware/src/Module.h | 10 +- .../tests/test-CmdProxy-chiptestboard.cpp | 22 +- .../tests/test-CmdProxy-jungfrau.cpp | 30 +- .../tests/test-CmdProxy-moench.cpp | 90 - .../tests/test-CmdProxy-pattern.cpp | 34 +- .../tests/test-CmdProxy-rx.cpp | 10 +- slsDetectorSoftware/tests/test-CmdProxy.cpp | 213 +- slsReceiverSoftware/src/ClientInterface.cpp | 33 +- slsReceiverSoftware/src/DataProcessor.cpp | 1 - slsReceiverSoftware/src/GeneralData.h | 94 +- slsReceiverSoftware/src/Implementation.cpp | 8 +- slsReceiverSoftware/src/Listener.cpp | 1 - slsReceiverSoftware/src/MasterAttributes.cpp | 59 +- slsReceiverSoftware/src/receiver_defs.h | 2 +- slsSupportLib/include/sls/sls_detector_defs.h | 18 +- slsSupportLib/include/sls/versionAPI.h | 7 +- 58 files changed, 4309 insertions(+), 5499 deletions(-) delete mode 100755 slsDetectorServers/moenchDetectorServer/DefaultPattern_moench.txt delete mode 100755 slsDetectorServers/moenchDetectorServer/bin/DefaultPattern_moench.txt create mode 100755 slsDetectorServers/moenchDetectorServer/config_moench.txt create mode 100755 slsDetectorServers/moenchDetectorServer/detid_moench.txt diff --git a/RELEASE.txt b/RELEASE.txt index 274b8e239..1d64ff1fb 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -26,800 +26,7 @@ This document describes the differences between v7.0.0.rc1 and v6.1.2 1. New or Changed Features ========================== - -1.1. Compilation ----------------- - - - General: - - - * Custom location to find ZeroMQ - Option to provide a custom location to look for ZeroMQ, if not found - using FindZeroMQ.cmake - - For example, to use the system installed zmq: - Using cmake: -DZeroMQ_HINT=/usr/lib64 - Using cmk.sh script: -q /usr/lib64 - - - * Support external build - Assuming already installed version of the slsDetectorPacakge exists, - external build of python bindings, gui, ctbgui and moench has been added. - - - * Catch updated to latest 2.x version due to build failure in fedora - - - - Gui: - - - * Qt5 and in-built compressed Qwt 6.1.5 - Ported from Qt4 to Qt5. Minimum requirement: Qt 5.9 - Compressed Qwt 6.1.5 added into the package in libs. It is unpacked and built - as a static library.This allows us to remove qwt as an external dependency - and reduces the risk of picking up the wrong version. - - - Python: - - - * Install python extension - Option to copy the python extension (slsdet folder and _slsdet-..so) - to CMAKE_INSTALL_PREFIX/python using - -DSLS_INSTALL_PYTHONEXT - - - * Pybind11 (v2.10.0) - Pybind11 is removed as a submodule and instead built into package to - simplify for users. Now, there is no more need to clone with the '--recursive' - argument or to update submodule when switching to this package version - and above. - - - * Conda packages - Removed conda packages for python 3.6 and 3.7. Added for python 3.11. - - - -1.2. Callback -------------- - - - * Datatype of Metadata [registerCallBackRawDataReady, registerCallBackRawDataModifyReady] - Datatype changed from char* to sls_receiver_header. - - - * Datatype of Size [registerCallBackRawDataReady, registerCallBackRawDataModifyReady] - Datatype changed from uint32_t to size_t - - - * Datatype of file name and file path [registerCallBackStartAcquisition] - Datatype changed from string to const string reference. - - - * Incorrect image size [registerCallBackStartAcquisition] - Fixed. It used to give +120 bytes. - - - * [Gotthard2] 25um Image reconstruction for 2 modules - First module (master) interleaves with second modules(slave). First channel - of master is first channel of detector. - - Requires firmware update to reverse channels of slaves. - - - -1.3. Python ------------ - - - * Defines in sls_detector_defs - sls_detetor_defs parsed and #defines extracted into defines.py - For exmaple, one can use slsdet.LOCALHOST_IP - - - * Python sub-microsecond resolution - Reading back sub-microsecond exposure times from the Python API fixed by - addig Python datetime supports only micro seconds as lowest unit. - - This is fixed by introducing a new C++ type (DurationWrapper), which - holds number of nanoseconds as a uint64_t (only in python bindings) and - custom typecaster to convert to and from std::chrono::nanoseconds. - - A get using API now returns in DurationWrapper, instead of datetime. - Refer exptime help for examples. - - -1.4. Client ------------ - - - Breaking API: - - - * Versioning - The client, receiver and detector servers now have semantic Versioning - along with the date and are managed with the Version class. - - --version argument to the executable gives the complete versioning with date. - - Using the client to get versions gives only the semantic version. An older - server will still give date. Hence, the return type is a string, breaking API. - - Compatibility checks at hostname or rx_hostname command will only be for - backwards compatibility (ie. it only checks for the major version number). - If its an old server, then its expected to have the exact same date (as - before) - - Setting intitialchecks to 0 also bypasses the receiver compatibility check. - - - * Detector Specific fields - bunchid ->detSpec1 - reserved->detSpec2 - debug->detSpec3 - roundRnumber->detSpec4 - - Header version number stays the same in the UDP header as there is no - difference in the format from the detector. Only the structure memeber names - have changed in sls_detector_defs.h - - Further details about each detector specific field can be found at: - https://slsdetectorgroup.github.io/devdoc/udpdetspec.html - - - * Namespace sls - All files in slsSupportLib and tests have now been moved to sls namespace - including macros. Using the LOG, for example, will require the sls qualifier. - - - * [Eiger] Number of UDP interfaces - Command line: numinterfaces, API: getNumberofUDPInterfaces - This command now reflects the actual number of udp interfaces for Eiger, - which is 2. - - - * [Eiger][Jungfrau] Row column - [Jungfrau] Fixed row column indexing for multi module 2 interfaces - - [Eiger] The row indicies were switched across the Y axis for the callback - only for Eiger. This is now changed and kept similar to the other detectors. - The row indices would be in the order of the half modules in the hostname - command. Therefore, to keep the image from callback, invert the hostname - order in the config file. - - - * Deprecated CopyDetectorServer - Command line: copydetectorserver, API: copydetectorserver - Removed. Use updatedetectorserver - - - * [Eiger][Jugfrau][Mythen3] Deprecated specific transmission delay commands - txndelay_frame -> txdelay_frame - txndelay_left -> txdelay_left - txndelay_right -> txdelay_right - - - * [Eiger] Datastream only for 10GbE - Command line: datastream, API: getDataStream/ setDataStream - - This command to enable/ disable data stream from left or right port - is now allowed only for 10GbE. Previously, it incorrectly allowed to do so. - - - * [Eiger][Jungfrau][Moench][Ctb] Stop command effect on next frame number - Stopping acquisition sometimes results in different next frame numbers - for different moduels. Hence, after a stop, if the next frame numbers are - different, they are all set to their maximum value + 1. - - - * Missing packets - Command line: rx_missingpackets, API: getNumMissingPackets - This now returns a signed 64 bit instead of unsigned. The negative polarity - depicts extra packets instead of missing packets and also takes care of - disabled ports. - - - * Frames caught and frame index - Command line rx_framescaught, rx_frameindex, API: getFramesCaught/ getRxCurrentFrameIndex - They now return a vector for each port when there are 2 udp interfaces - in the receiver. - - - * [Gotthard][Gotthard2] Num modules - Only 2 modules allowed maximum in a detector shared memory. - - - * [Moench][Ctb][Mythen3] Deprecated commands - Patloopx, patnloopx, patwaitx, patwaittimex - Please use instead patloop, patnloop, patwait and patwaittime commands - with the level as an argument. - - Old commands work with warning, but the server expects the new ones - such as a default pattern file to be loaded at startup for Moench. - - Renamed patternParameters struct member from 'loop' to 'startloop' and - 'stoploop'. - - - * [Mythen3] Clock Divider 4 and 5 - Cannot be set anymore. Only read back. - - - - New commands: - - - * [Eiger][Gotthard][Gotthard2][Mythen3][Jungfrau] Master - - Setting up from client: - [Eiger][Gotthard2][Jungfrau] - Command line: master, API: getMaster/ setMaster - All of them can get master mode from the client. - - This can also be set up on the detector server. Please refer to notes - on that section. - - - * [Eiger] Top - Command line: top, API: getTop/ setTop - Sets the half module to top or bottom from the client. - - This can also be set up on the detector server. Please refer to notes - on that section. - - - * [Mythen3][Eiger] Save settings file - Command line: trimbits (sls_detector_get), API: saveTrimbits - Added - - - * [Gotthard2] Parallel readout added - Command line: parallel, API: getParallelMode/ setParallelMode - Default for Gotthard2 is parallel. Non parallel mode only works in - continuous mode. - - - * [Jungfrau] Software trigger added - Command line: trigger, API: sendSoftwareTrigger - Send software trigger instead of harware trigger. - - - * [Eiger][Jungfrau] Blocking trigger - Commandline: blockingtrigger, API: sendSoftwareTrigger with argument true - Sends software trigger signal to detector and blocks until the frames - are sent out for that trigger. - - - * [Jungfrau] Sync - Command line: sync, API: getSynchronization/ setSynchronization - Enables or disables synchronization between modules - - - * [Gotthard2][Mythen3] Temperature readout - Command line: temp_fpga, API: getTemperature with TEMPERATURE_FPGA enum - Added - - - * [Gotthard2][Mythen3] Round robin added - Command line: udp_dstlist, API: getDestinationUDPList/ setDestinationUDPList - Command line: udp_numdst, API: getNumberofUDPDestinations - One can set up to 32 (64 for Mythen3) entries in the destination list. - - - * [Jungfrau] Module Id - Command line: moduleid, API: getModuleId - 16 bit value (ideally unique) that is streamed out in the udp header of - the detector. The on-board detector server picks it up from a file - (if it exists) called detid_jungfrau.txt. - - - * [Jungfrau][[Gotthard2][Myhten3][Gotthard][Ctb][Moench] Hardware version - Command line: hardwareversion, API: getHardwareVersion - Gets the board or hardware version. - For example, Jungfrau returns 1.0 or 2.0. - It is also printed at on-board detector server start up. - Also printed before starting FPGA programming. - - - * [Eiger][Jugfrau][Mythen3] Transmission Delay - Command line: tx_delay, API: getTransmissionDelay/ setTransmissionDelay - Sets transmission delay for all modules in the detector using the step - size provided. Sets up for every module: - [Eiger] txdelay_left to (2 * mod_index * n_delay) - [Eiger] txdelay_right to ((2 * mod_index + 1) * n_delay) - [Eiger] txdelay_frame to (2 *num_modules * n_delay) - [Jungfrau][Mythen3] txdelay_frame to (num_modules * n_delay) - - - * [Mythen3] Bad channels - Command line: badchannels, API: getBadChannels/ setBadChannels - Set bad channels from file with a list of channels, which will be masked - out. Also does trimming. A detector level command will require the channel - numbers accordingly. The file also extended to include commas, colons range) - and removes duplicates. - - - * [Moench][Ctb] Starting frame number - Command line: nextframenumber, API: getNextFrameNumber/ setNextFrameNumber - Added and default set up on detector server start up. - - - * [Ctb] DAC names - Command line: daclist, API: getDacNames/ setDacNames - Can set and get dac names in the dac list now. - - - * [Mythen3] Polarity, interpolation, pump probe, analog pulsing, digital pulsing - Command line: polarity, interpolation, pumpprobe, apulse, dpulse - API: getPolarity/ setPolarity, getInterpolation/ setInterpolation, - getPumpProbe/ setPumpProbe, getAnalogPulsing/ setAnalogPulsing, - getDigitalPulsing/ setDigitalPulsing - - Added these commands. - - Enabling interpolation will also enable all counters and disable vth3. - Disabling sets to previous counter mask and previous vth values. - - In pump probe mode, only vth2 enabled. Disabling sets vth2 to prevevious - value. - - Setting counter mask will check interpolation and pump probe mode - requirements, else sets vthx dacs according to counter mask. - - Direct overwrite of any dac (including vthx) allowed using dac command - (as before). - - - - New commands for Receiver only: - - - * Arping for 10GbE - Command line: rx_arping API: getRxArping/ setRxArping - Starts a thread in the receiver to arping the interface it is listening - to in 10GbE mode every 60 s. - Changes NUM_RX_THREAD_IDS (sls_detector_defs.h) from 8 to 9. - - - * Receiver Region of Interest - Command line: rx_roi, API: getRxROI/ setRxROI - Command line: rx_clearroi, API: clearRxROI - One can set an ROI in the receiver to write to file. 1D detectors can set - xmin and xmax, whereas the 2D can also set ymin and ymax. -1 values signify - no ROI. - - This is not at network level and can only be used to reduce size of file. - Virtual HDF5 files not created when this is enabled and also no link in - master file. No file created if module not in ROI. - - There can only be one ROI per detector. Therefore, can be set only at - detector level, but can be retrieved at module level as well. - - The GUI still shows the entire image, but has a yellow border around the - ROI. Status bar displays a message when Rx ROI enabled. - - - - Additonal Features: - - - * Non-blocking start - Allowing non-blocking start at modular level again. - - - * [Jungfrau][Moench][Ctb] Additional programming checks - Also checks if the drive to write to is a special file or a normal - file. If its a normal file, it throws asking to redo the command with a - '--please-delete' argument to delete the normal file and create the device - drive and restart FPGA programming. - - More readable error message insetad of "programfpga not implemented for - this detector'. This happens when 'hostname' command fails due to - server-firmware/client compatibility and the detector type becomes - 'GENERIC'. Fixed to suggest if 'hostname' executed properly. - - - * Udp Source IP - Command line: udp_srcip(2), API: getSourceUDPIP(2)/ setSourceUDPIP(2) - One can also set this to 'auto' for 1 GbE data. It will set to IP of - rx_hostname (as in udp_dstip) - - * Incrementing default receiver tcp port - Automatically incrementing the default receiver tcp port for every module - when creating shared memory. - - - - Changes or Fixes: - - - * [Jungfrau][Gotthard2][Mythen3][Gotthard][Moench][Ctb] Can't stop - This bug was introduced in 6.1.1, when stopping an acquisition saying it - cannot stop, even though it was successful. It is fixed now. - - - * Free and config command fail - Free and config command checked mismatch of size of shared memory before - freeing or loading new config. Fixed. - - - * sls_detector_help or sls_detector_get -h - Should not create Detector object. Fixed. - - - * [Jungfrau] Storage cells in running receiver - Allowing the possibility to set this when receiver in running state. - - - * [Eiger] Vtr - Allow Vtrim to be interpolated for settings. - - - * [Mythen3] Incorrect gain caps when setting threshold energy - Gain caps overwritten with settings enum. Fixed. - - - * [Mythen3] Non blocking start acquisition - Non-blocking start acquisition was sent out twice to the master. Fixed. - - - * [Mythen3] Threshold - When settings trimbits or threshold, counter mask is set and hence, - vthx dacs are set accordingly. - - setAllThresholdEnergy takes 3 values for each counter and if one of them - is -1, the trimbits and setings for that counter is picked up from the - detector. - - - * [Moench][Ctb] Pattern levels - Changed from 3 to 6. - - - * [Mythen3][Moench][Ctb] Default patwait and patloop addresses - Set default wait and loop addresses to 0x1fff (max value) for all levels - before loading pattern. Please use the pattern command instead of parameters. - This ensures defaults are set up and is faster. - - - * [Moench] Patsetbit and patsetmask - Command line: patsetbit API: getPatternBitMask/ setPatternBitMask - Command line: patmask API: getPatternMask/ setPatternMask - - Exchanging the help and masks for patsetbit and patsetmask in the detector - server, especially in loading settings. - - - * [Moench][Ctb] ADC Vpp - Command line: adcvpp, API: getADCVpp/ setADCVpp - Moved from SetDAC function into into its own. One can use mV values or - option numbers as before. - - - * [Ctb] ADC command goes back to control server - Slow ADCs, slow ADC temperature, get measured current and voltage values - are requested via the control server again insetad of the stop server - due to configuration and definitions in the control server. - - - -1.5. Detector Server --------------------- - - - Config file: - - * [Eiger][Gotthard2][Gotthard] Master - Using config file with 'master' with argument (master=1, slave=0) - - - * [Eiger] Top - Using config file with 'top' with argument (top=1, bottom=0) - - - - Command line arguments: - - * They have precedence over config files. - - - * [Eiger][Gotthard2 Virtual][Mythen3 Virtual][Gotthard Virtual] Master - Using command line '--master = 1' or '-m = 1' with argument - (master = 1, slave = 0) - - - * [Eiger] Top - Using command line '--top = 1' or '-t = 1' with argument (top=1, bottom=0) - - - * Ignore config file - The config files can also be ignored by an argument from the command line, - '--ignore-config' or '-i'. - - - - Fixes: - - - * [Jungfrau][Eiger] Clear UDP destination - Command line: udp_cleardst, API: clearUDPDestinations - Clearing udp destination also clears it in the FPGA now. - - - * [Eiger] Incorrect next frame number - Command line: nextframenumber, API: getNextFrameNumber/ setNextFrameNumber - Get next frame number for 10g was connected to 1g registers and gave - incorrect values. Fixed. - - - * [Mythen3][Gotthard2] System clock change effects - When changing the system clock (clkdiv 2), time settings should also be - affected (exptime, period etc.). Fixed. - - [Gotthard2] System frequency should be same irrespective of timing source. - Fixed. - - - * [Mythen3] Kernel version compatibility test - Fix added to parse properly the kernel version with CET for corrected - version compatibility test. - - - * [Mythen3] Server crash for setting vthrehsold - Fixed. - - - * [Mythen3] Incorrect gaincaps - Setting threshold energy was overwriting gaincaps with settings enum. Fixed. - - - * [Ctb][Moench] Hostname fail in update mode. - Fixed - - - - Changes: - - - * [Jungfrau] Temporary fix for stop in 6.1.1 - Temporary fix introduced in 6.1.1 for not being able to start after a - stop command has been issued is removed. Reset core right after also has - been removed. It has been fixed in firmware instead. - - - * [Gotthard2] Clock Divider defaults - When chancing burst mode, clock dividers (2, 3 and 4) set to their - defaults according to burst mode. - - - * [Mythen3] DAC check for settings - Verify DAC values for each setting has been temporarily switched off - - - * [Mythen3] DAC min and max values - Vtrim minimum of 600 has been removed. - The threshold dacs minimum is 200 and maximum is 2400. - The other DACs minimum is 0 and maximum is 2800. - When out of range, will not throw, just a warning. - - - * [Mythen3] Vicin Dac changed to 800 - - - * [Jungfrau][Moench][Ctb] PLL reset at server start up - PLL reset now at server start up. - - - * [Moench] ADC9257 Vref - ADC Vref voltage modified from 1.33V to 2V - - - - * [Ctb] Allow all clock dividers for PLL - Fixed. For example, 133 MHz would not really be set previously. Fixed by - changing totaldiv from float to an integer. - - - - Additional Features: - - - * Stop server startup errors - Stop servers now also check for errors at startup (including version - compatibility) and like the control server, it will translate to the - client when connecting for the first time (hostname command). - - - * [Jungfrau][Moench][Ctb] Additional server update process - Removes old server binary or target of linked file when updating - detector server for blackfin detectors as there is less space on blackfin. - - Clearing up absolute and respawn path (removing double '/') - - Raise error if server name to be copied is the same as final soft link name. - - - * [Moench][Ctb] 1 GbE Non blocking acquisition - Previously non blocking acquisition in 1 GbE would not send data. - This feature added now. - - - * [Gotthard2] Adapted to new HDI version - HDI module ID written to FPGA register - - - -1.6. Simulator --------------- - - - * Command line arguments. Please refer to previous section on Detector Server. - - - * [Eiger] Only one executable - Only one executable for an Eiger virtual server. Master and top mode - can be provided via command line or config file to the detector server, - as well as via the client. See in Other New Features for more details. - - One can start a module using: - eigerDetectorServer_virtual # reads default config file (top master) - eigerDetectorServer_virtual -i #ignores the config file (bottom slave) - - - * [Eiger][Junfrau][Gotthard2][Mythen3] Module Id - Added into udp header - - - * Minimum Configuration - One can setup with just: - hostname localhost - rx_hostname localhost - udp_dstip auto - - - * [Mythen3] Packet size - Fixed packet size calculation. Previously, sending only header with no data. - - - -1.7. Receiver -------------- - - - Breaking API: - - - * Namespace sls - All the receiver source files have also been added to namespace sls. - - - * HDF5 and Binary writer version - Changed from 6.3 to 6.4 - - - * Master file format to json - The format has been changed from ASCII to json. - - - * Geometry metadata - Added geometry (number of modules in each direction) to metadata in file. - - - * HDF5 Dataset name - Changed to just "data" to simplify for user - - - * File write - File write is disabled by default. - - - - Fixes: - - - * Refactored and fixed minor issues - Including memory structure and udp sockets. - Fixed progress also in discard partial packaets mode and deactivated ports. - Fixed 200% progress. - Completely padded images now have detector type or version in metadata. - Fixed getting stuck at stop receiver when using zmq - Fixed clang compiler warnings - - - * Multiple files - This bug was introduced in v6.0.0, where 1 file was created per frame - after the first file. Fixed by resetting the number of frames in - current file when creating a new one. - - - * [Eiger] Datastream command order - The order of commands to set datastream from client mattered previously. - Datastream had to be set before 10GbE enable. Order does not matter anymore. - - - * Udp destination MAC - If it has been set before, changing udp_dstip will not update udp_dstmac. - Fixed to always set it in detector even if it had a value before. - Udp_dstmac can still be used to overwrite again. This is useful when - using a router for example. - - - * Stuck when using zmq - More often in 6.1.1, gets stuck at stop receiver. - - - * [Mythen3] Incorrect number of packets calculated or tengiga not set up - Runnig config second time (with tengiga=0, dr !=32, counters !=0x7) - calculated incorrect image size expected due to inconsistent copy of - detector parameters. Fixed - - - * Storage cells in receiver - Previously not updated in receiver. Fixed. - - - * Virtual HDF5 Parameter datasets - Corner case bug when frames caught is not a multiple of frames per file. - Not found in virtual image datasets. Fixed. - - - - Changes: - - - * Master file created at end of acquisition - The file is now written at the end of acquisition. So if any metadata - is changed during an acquisition, it will reflect the last value. - - - * File name prefix - Slash '/' not allowed. - - - - Additional Features: - - - * [Gotthard2] 25um image reconstruction in virtual HDF5 - Virtual HDF5 reconstructs complete image by interleaving first module - (master) with second module (slave). First channel of master is first - channel of detector. - - Requires firmware update to reverse channels of slaves. - - - * Memory size - Increased an internal fifo header by 8 bytes to align memory allocated for - to receive images for efficiency. - - - -1.8. Gui --------- - - * [Jungfrau][Eiger] Gap pixels - Enabled by default in the gui. - - - * High voltage moved from Developer tab to Settings tab. - - - * Gain plot zooming - Zooming disabled. Instead, it automatically zooms in when you zoom in - the main plot or if min and max of x and y axis set up in plot tab. - - - * [Mythen3] Inconsistent timing mode - Timing mode of the slaves should be discarded before squashing. Fixed. - - - * [Mythen3][Gotthard2] Crashes - Additional locking Added - - +- moench being made compatible with jungfrau 2.0 boards (jungfrau structure, away from ctb) 2. On-board Detector Server Compatibility diff --git a/slsDetectorGui/forms/form_tab_measurement.ui b/slsDetectorGui/forms/form_tab_measurement.ui index 7616ef49b..0b7968fe2 100755 --- a/slsDetectorGui/forms/form_tab_measurement.ui +++ b/slsDetectorGui/forms/form_tab_measurement.ui @@ -516,12 +516,344 @@ QFrame::Plain - - - + + + + + + Cantarell + 10 + + + + <html><head/><body><p>Timing Mode of the detector. </p><p> #timing#</p></body></html> + + + Timing Mode: + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + + Cantarell + 10 + + + + Timing Mode of the detector. + #timing# + + + + Auto + + + + + Trigger Exposure Series + + + + + Gated with fixed number + + + + + Burst Trigger + + + + + Trigger Gated + + + + + + + + + Cantarell + 10 + + + + <html><head/><body><p>Burst modes</p><p>#burstmode#</p></body></html> + + + Burst Mode: + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + + Cantarell + 10 + + + + <html><head/><body><p>Burst modes</p><p> #burstmode#</p></body></html> + + + + Burst Internal + + + + + Burst External + + + + + Continuous Internal + + + + + Continuous External + + + + + + + + + 170 + 0 + + + + + Cantarell + 10 + + + + <html><head/><body><p>Number of measurements (not in real time) that will be acquired. </p><p> #only in gui#</p></body></html> + + + Number of Measurements: + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + + Cantarell + 10 + + + + <html><head/><body><p>Number of measurements (not in real time) that will be acquired. </p><p> #only in gui#</p></body></html> + + + + + + + + + Qt::LeftToRight + + + + + + true + + + QAbstractSpinBox::PlusMinus + + + false + + + + + + -1 + + + 2000000000 + + + 1 + + + + + false + + + Cantarell + 10 + + + + <html><head/><body><p>Number of frames per hardware/software trigger that will be acquired </p><p> #frames#</p></body></html> + + + Number of Frames: + + + + + + + false + + + + 0 + 0 + + + + + 0 + 25 + + + + + 16777215 + 25 + + + + + Cantarell + 10 + + + + <html><head/><body><p>Number of frames per hardware/software trigger that will be acquired </p><p> #frames#</p></body></html> + + + + + + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + QAbstractSpinBox::PlusMinus + + + false + + + + + + -1 + + + 2000000000 + + + 1 + + + + + + + true + + + + Cantarell + 10 + + + + <nobr> +Exposure Time of a frame. +</nobr><br><nobr> + #exptime# +</nobr> + + + Exposure Time: + + + + + + + true + 0 @@ -548,9 +880,9 @@ <nobr> -Frame period between exposures. +Exposure Time of a frame. </nobr><br><nobr> - #period# + #exptime# </nobr> @@ -575,271 +907,11 @@ Frame period between exposures. 2000000000.000000000000000 - 0.000000000000000 + 1.000000000000000 - - - - - 0 - 0 - - - - - 171 - 32 - - - - - 171 - 32 - - - - - Cantarell - 10 - - - - 0 - - - - - Cantarell - 10 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - false - - - - Cantarell - 10 - - - - <html><head/><body><p>Number of analog samples.</p><p>#asamples#</p></body></html> - - - Number of Samples: - - - - - - - - - Cantarell - 10 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - false - - - - Cantarell - 10 - - - - <html><head/><body><p>Number of external gates.</p><p>#gates#</p></body></html> - - - Number of Gates: - - - - - - - - - - - - 170 - 0 - - - - - Cantarell - 10 - - - - <html><head/><body><p>Number of measurements (not in real time) that will be acquired. </p><p> #only in gui#</p></body></html> - - - Number of Measurements: - - - - - - - - 0 - 0 - - - - - 171 - 32 - - - - - 171 - 32 - - - - - Cantarell - 10 - - - - 0 - - - - - Cantarell - 10 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - false - - - - Cantarell - 10 - - - - <html><head/><body><p>The Delay between Trigger Edge and Start of Exposure ( or Readout). </p><p>#delay#</p></body></html> - - - Delay After Trigger: - - - - - - - - - Cantarell - 10 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - false - - - - Cantarell - 10 - - - - <html><head/><body><p>Burst period between bursts</p><p>#burstperiod#</p></body></html> - - - Burst Period: - - - - - - - - + true @@ -913,7 +985,285 @@ Exposure Time of a frame. - + + + + false + + + + Cantarell + 10 + + + + <nobr> +Frame period between exposures. +</nobr><br><nobr> + #period# +</nobr> + + + Acquisition Period: + + + + + + + false + + + + 0 + 0 + + + + + 170 + 25 + + + + + 16777215 + 25 + + + + + Cantarell + 10 + + + + <nobr> +Frame period between exposures. +</nobr><br><nobr> + #period# +</nobr> + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + QAbstractSpinBox::PlusMinus + + + false + + + 9 + + + -1.000000000000000 + + + 2000000000.000000000000000 + + + 0.000000000000000 + + + + + + + false + + + + 0 + 0 + + + + + 0 + 25 + + + + + 70 + 25 + + + + + Cantarell + 10 + + + + <nobr> +Frame period between exposures. +</nobr><br><nobr> + #period# +</nobr> + + + Qt::LeftToRight + + + 2 + + + + hr + + + + + min + + + + + s + + + + + ms + + + + + us + + + + + ns + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + Cantarell + 10 + + + + 0 + + + + + Cantarell + 10 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + false + + + + Cantarell + 10 + + + + <html><head/><body><p>Number of Triggers to be expected.</p><p> #triggers#</p></body></html> + + + Number of Triggers: + + + + + + + + + Cantarell + 10 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + false + + + + Cantarell + 10 + + + + <html><head/><body><p>Number of bursts to be expected.</p><p>#bursts#</p></body></html> + + + Number of Bursts: + + + + + + + + @@ -1110,50 +1460,24 @@ Exposure Time of a frame. - - - - false - - - - Cantarell - 10 - - - - <nobr> -Frame period between exposures. -</nobr><br><nobr> - #period# -</nobr> - - - Acquisition Period: - - - - - - - false - + + - + 0 0 - 0 - 25 + 171 + 32 - 16777215 - 25 + 171 + 32 @@ -1162,58 +1486,100 @@ Frame period between exposures. 10 - - <html><head/><body><p>Number of frames per hardware/software trigger that will be acquired </p><p> #frames#</p></body></html> - - - - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - QAbstractSpinBox::PlusMinus - - - false - - - - - - -1 - - - 2000000000 - - - 1 + + 0 + + + + Cantarell + 10 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + false + + + + Cantarell + 10 + + + + <html><head/><body><p>The Delay between Trigger Edge and Start of Exposure ( or Readout). </p><p>#delay#</p></body></html> + + + Delay After Trigger: + + + + + + + + + Cantarell + 10 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + false + + + + Cantarell + 10 + + + + <html><head/><body><p>Burst period between bursts</p><p>#burstperiod#</p></body></html> + + + Burst Period: + + + + + - - - - - Cantarell - 10 - - - - <html><head/><body><p>Burst modes</p><p>#burstmode#</p></body></html> - - - Burst Mode: - - - - + @@ -1405,426 +1771,7 @@ Frame period between exposures. - - - - true - - - - 0 - 0 - - - - - 170 - 25 - - - - - 16777215 - 25 - - - - - Cantarell - 10 - - - - <nobr> -Exposure Time of a frame. -</nobr><br><nobr> - #exptime# -</nobr> - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - QAbstractSpinBox::PlusMinus - - - false - - - 9 - - - -1.000000000000000 - - - 2000000000.000000000000000 - - - 1.000000000000000 - - - - - - - false - - - - 0 - 0 - - - - - 0 - 25 - - - - - 70 - 25 - - - - - Cantarell - 10 - - - - <nobr> -Frame period between exposures. -</nobr><br><nobr> - #period# -</nobr> - - - Qt::LeftToRight - - - 2 - - - - hr - - - - - min - - - - - s - - - - - ms - - - - - us - - - - - ns - - - - - - - - - 0 - 0 - - - - - 16777215 - 30 - - - - - Cantarell - 10 - - - - 0 - - - - - Cantarell - 10 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - false - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - - Cantarell - 10 - - - - <html><head/><body><p>Number of analog samples.</p><p>#asamples#</p><p><br/></p></body></html> - - - - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - QAbstractSpinBox::PlusMinus - - - false - - - - - - -1 - - - 2000000000 - - - 1 - - - - - - - - - Cantarell - 10 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - false - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - - Cantarell - 10 - - - - <html><head/><body><p>Number of external gates.</p><p>#gates#</p></body></html> - - - - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - QAbstractSpinBox::PlusMinus - - - false - - - - - - -1 - - - 2000000000 - - - 1 - - - - - - - - - - - true - - - - Cantarell - 10 - - - - <nobr> -Exposure Time of a frame. -</nobr><br><nobr> - #exptime# -</nobr> - - - Exposure Time: - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - - Cantarell - 10 - - - - Timing Mode of the detector. - #timing# - - - - Auto - - - - - Trigger Exposure Series - - - - - Gated with fixed number - - - - - Burst Trigger - - - - - Trigger Gated - - - - - + @@ -2046,8 +1993,8 @@ Exposure Time of a frame. - - + + false @@ -2058,134 +2005,18 @@ Exposure Time of a frame. - <html><head/><body><p>Number of frames per hardware/software trigger that will be acquired </p><p> #frames#</p></body></html> + <html><head/><body><p>Number of external gates.</p><p>#gates#</p></body></html> - Number of Frames: + Number of Gates: - - - - - 0 - 0 - + + + + false - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - Cantarell - 10 - - - - 0 - - - - - Cantarell - 10 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - false - - - - Cantarell - 10 - - - - <html><head/><body><p>Number of Triggers to be expected.</p><p> #triggers#</p></body></html> - - - Number of Triggers: - - - - - - - - - Cantarell - 10 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - false - - - - Cantarell - 10 - - - - <html><head/><body><p>Number of bursts to be expected.</p><p>#bursts#</p></body></html> - - - Number of Bursts: - - - - - - - - - 0 @@ -2211,7 +2042,7 @@ Exposure Time of a frame. - <html><head/><body><p>Number of measurements (not in real time) that will be acquired. </p><p> #only in gui#</p></body></html> + <html><head/><body><p>Number of external gates.</p><p>#gates#</p></body></html> @@ -2219,14 +2050,11 @@ Exposure Time of a frame. - - Qt::LeftToRight - - - true + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter QAbstractSpinBox::PlusMinus @@ -2248,74 +2076,7 @@ Exposure Time of a frame. - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - - Cantarell - 10 - - - - <html><head/><body><p>Burst modes</p><p> #burstmode#</p></body></html> - - - - Burst Internal - - - - - Burst External - - - - - Continuous Internal - - - - - Continuous External - - - - - - - - - Cantarell - 10 - - - - <html><head/><body><p>Timing Mode of the detector. </p><p> #timing#</p></body></html> - - - Timing Mode: - - - - + Qt::Vertical @@ -2489,8 +2250,6 @@ Exposure Time of a frame. comboDelayUnit spinBurstPeriod comboBurstPeriodUnit - spinNumSamples - spinNumGates diff --git a/slsDetectorGui/include/qTabMeasurement.h b/slsDetectorGui/include/qTabMeasurement.h index ccfa4a41d..5248476ce 100644 --- a/slsDetectorGui/include/qTabMeasurement.h +++ b/slsDetectorGui/include/qTabMeasurement.h @@ -32,7 +32,6 @@ class qTabMeasurement : public QWidget, private Ui::TabMeasurementObject { void SetNumFrames(int val); void SetNumTriggers(int val); void SetNumBursts(int val); - void SetNumSamples(int val); void SetNumGates(int val); void SetExposureTime(); void SetAcquisitionPeriod(); @@ -64,7 +63,6 @@ class qTabMeasurement : public QWidget, private Ui::TabMeasurementObject { void GetNumFrames(); void GetNumTriggers(); void GetNumBursts(); - void GetNumSamples(); void GetNumGates(); void GetExposureTime(); void GetAcquisitionPeriod(); @@ -96,7 +94,6 @@ class qTabMeasurement : public QWidget, private Ui::TabMeasurementObject { QString errPeriodTip; QPalette red; bool delayImplemented; - bool sampleImplemented; bool gateImplemented; bool startingFnumImplemented; bool isAcquisitionStopped{false}; diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index d1a233731..58e69fc0a 100644 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -52,6 +52,7 @@ void qDrawPlot::SetupWidgetWindow() { detType = det->getDetectorType().squash(); switch (detType) { case slsDetectorDefs::JUNGFRAU: + case slsDetectorDefs::MOENCH: pixelMask = ((1 << 14) - 1); gainMask = (3 << 14); gainOffset = 14; @@ -1142,7 +1143,8 @@ void qDrawPlot::toDoublePixelData(double *dest, char *source, int size, break; case 16: - if (detType == slsDetectorDefs::JUNGFRAU || + if (detType == slsDetectorDefs::MOENCH || + detType == slsDetectorDefs::JUNGFRAU || detType == slsDetectorDefs::GOTTHARD2) { // show gain plot diff --git a/slsDetectorGui/src/qTabDataOutput.cpp b/slsDetectorGui/src/qTabDataOutput.cpp index cdedf42e4..1aca7b61a 100644 --- a/slsDetectorGui/src/qTabDataOutput.cpp +++ b/slsDetectorGui/src/qTabDataOutput.cpp @@ -40,13 +40,11 @@ void qTabDataOutput::SetupWidgetWindow() { comboClkDivider->setEnabled(true); chkParallel->setEnabled(true); break; - case slsDetectorDefs::MOENCH: - chkTenGiga->setEnabled(true); - break; case slsDetectorDefs::MYTHEN3: chkParallel->setEnabled(true); break; case slsDetectorDefs::JUNGFRAU: + case slsDetectorDefs::MOENCH: lblClkDivider->setEnabled(true); comboClkDivider->setEnabled(true); break; diff --git a/slsDetectorGui/src/qTabDeveloper.cpp b/slsDetectorGui/src/qTabDeveloper.cpp index 6665f1516..f2fde92a9 100644 --- a/slsDetectorGui/src/qTabDeveloper.cpp +++ b/slsDetectorGui/src/qTabDeveloper.cpp @@ -111,6 +111,7 @@ void qTabDeveloper::SetupWidgetWindow() { break; case slsDetectorDefs::JUNGFRAU: + case slsDetectorDefs::MOENCH: dacWidgets.push_back( new qDacWidget(this, det, true, "v vb comp: ", getSLSIndex(detType, tempid++))); @@ -139,72 +140,6 @@ void qTabDeveloper::SetupWidgetWindow() { "Temperature ADC: ", getSLSIndex(detType, tempid++))); break; - case slsDetectorDefs::MOENCH: - dacWidgets.push_back( - new qDacWidget(this, det, true, - "vbp_colbuf: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vipre: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vin_cm: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vb_sda: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back( - new qDacWidget(this, det, true, - "vcasc_sfp: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vout_cm: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back( - new qDacWidget(this, det, true, - "vipre_cds: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back( - new qDacWidget(this, det, true, - "ibias_sfp: ", getSLSIndex(detType, tempid++))); - break; - - case slsDetectorDefs::MYTHEN3: - dacWidgets.push_back(new qDacWidget( - this, det, true, "vcassh: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vth2: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vrshaper: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back( - new qDacWidget(this, det, true, - "vrshaper_n: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back( - new qDacWidget(this, det, true, - "vipre_out: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vth3: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vth1: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vicin: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vcas: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vrpreamp: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vcal_p: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vipre: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vishaper: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vcal_n: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vtrim: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget( - this, det, true, "vdcsh: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back( - new qDacWidget(this, det, true, - "vthreshold: ", getSLSIndex(detType, tempid++))); - adcWidgets.push_back(new qDacWidget( - this, det, false, - "Temperature FPGA: ", getSLSIndex(detType, tempid++))); - break; - case slsDetectorDefs::GOTTHARD2: dacWidgets.push_back( new qDacWidget(this, det, true, @@ -386,6 +321,7 @@ qTabDeveloper::getSLSIndex(slsDetectorDefs::detectorType detType, int index) { break; case slsDetectorDefs::JUNGFRAU: + case slsDetectorDefs::MOENCH: switch (index) { case 0: return slsDetectorDefs::VB_COMP; @@ -411,30 +347,6 @@ qTabDeveloper::getSLSIndex(slsDetectorDefs::detectorType detType, int index) { } break; - case slsDetectorDefs::MOENCH: - switch (index) { - case 0: - return slsDetectorDefs::VBP_COLBUF; - case 1: - return slsDetectorDefs::VIPRE; - case 2: - return slsDetectorDefs::VIN_CM; - case 3: - return slsDetectorDefs::VB_SDA; - case 4: - return slsDetectorDefs::VCASC_SFP; - case 5: - return slsDetectorDefs::VOUT_CM; - case 6: - return slsDetectorDefs::VIPRE_CDS; - case 7: - return slsDetectorDefs::IBIAS_SFP; - default: - throw RuntimeError(std::string("Unknown dac/adc index") + - std::to_string(index)); - } - break; - case slsDetectorDefs::MYTHEN3: switch (index) { case 0: diff --git a/slsDetectorGui/src/qTabMeasurement.cpp b/slsDetectorGui/src/qTabMeasurement.cpp index 009ace46a..c3282d67e 100644 --- a/slsDetectorGui/src/qTabMeasurement.cpp +++ b/slsDetectorGui/src/qTabMeasurement.cpp @@ -35,7 +35,6 @@ void qTabMeasurement::SetupWidgetWindow() { // timer to update the progress bar progressTimer = new QTimer(this); - sampleImplemented = false; gateImplemented = false; delayImplemented = true; startingFnumImplemented = false; @@ -47,18 +46,11 @@ void qTabMeasurement::SetupWidgetWindow() { // default is triggers and delay (not #bursts and burst period for gotthard2 // in auto mode) ShowTriggerDelay(); - // default is to show samples, mythen3, show gates - ShowGates(); // enabling according to det type lblBurstMode->hide(); comboBurstMode->hide(); switch (det->getDetectorType().squash()) { - case slsDetectorDefs::MOENCH: - lblNumSamples->setEnabled(true); - spinNumSamples->setEnabled(true); - sampleImplemented = true; - break; case slsDetectorDefs::EIGER: delayImplemented = false; lblNextFrameNumber->setEnabled(true); @@ -66,6 +58,7 @@ void qTabMeasurement::SetupWidgetWindow() { startingFnumImplemented = true; break; case slsDetectorDefs::JUNGFRAU: + case slsDetectorDefs::MOENCH: lblNextFrameNumber->setEnabled(true); spinNextFrameNumber->setEnabled(true); startingFnumImplemented = true; @@ -112,10 +105,6 @@ void qTabMeasurement::Initialization() { connect(spinNumBursts, SIGNAL(valueChanged(int)), this, SLOT(SetNumBursts(int))); } - if (spinNumSamples->isEnabled()) { - connect(spinNumSamples, SIGNAL(valueChanged(int)), this, - SLOT(SetNumSamples(int))); - } if (gateImplemented) { connect(spinNumGates, SIGNAL(valueChanged(int)), this, SLOT(SetNumGates(int))); @@ -198,16 +187,6 @@ void qTabMeasurement::ShowTriggerDelay() { } } -void qTabMeasurement::ShowGates() { - if (det->getDetectorType().squash() == slsDetectorDefs::MYTHEN3) { - stackedLblSamplesGates->setCurrentWidget(pageLblGates); - stackedSpinSamplesGates->setCurrentWidget(pageSpinGates); - } else { - stackedLblSamplesGates->setCurrentWidget(pageLblSamples); - stackedSpinSamplesGates->setCurrentWidget(pageSpinSamples); - } -} - void qTabMeasurement::SetupTimingMode() { QStandardItemModel *model = qobject_cast(comboTimingMode->model()); @@ -510,31 +489,6 @@ void qTabMeasurement::SetNumBursts(int val) { &qTabMeasurement::GetNumBursts) } -void qTabMeasurement::GetNumSamples() { - LOG(logDEBUG) << "Getting number of samples"; - disconnect(spinNumSamples, SIGNAL(valueChanged(int)), this, - SLOT(SetNumSamples(int))); - try { - auto retval = det->getNumberOfAnalogSamples().tsquash( - "Inconsistent number of analog samples for all detectors."); - spinNumSamples->setValue(retval); - } - CATCH_DISPLAY("Could not get number of samples.", - "qTabMeasurement::GetNumSamples") - connect(spinNumSamples, SIGNAL(valueChanged(int)), this, - SLOT(SetNumSamples(int))); -} - -void qTabMeasurement::SetNumSamples(int val) { - LOG(logINFO) << "Setting number of samples to " << val; - try { - det->setNumberOfAnalogSamples(val); - } - CATCH_HANDLE("Could not set number of samples.", - "qTabMeasurement::SetNumSamples", this, - &qTabMeasurement::GetNumSamples) -} - void qTabMeasurement::GetNumGates() { LOG(logDEBUG) << "Getting number of gates"; disconnect(spinNumGates, SIGNAL(valueChanged(int)), this, @@ -1003,9 +957,6 @@ void qTabMeasurement::Refresh() { if (spinBurstPeriod->isEnabled()) { GetBurstPeriod(); } - if (sampleImplemented) { - GetNumSamples(); - } if (gateImplemented) { GetNumGates(); } diff --git a/slsDetectorGui/src/qTabPlot.cpp b/slsDetectorGui/src/qTabPlot.cpp index 1579558f9..1d3c9bcbf 100644 --- a/slsDetectorGui/src/qTabPlot.cpp +++ b/slsDetectorGui/src/qTabPlot.cpp @@ -66,6 +66,11 @@ void qTabPlot::SetupWidgetWindow() { chkGainPlot->setChecked(true); plot->EnableGainPlot(true); break; + case slsDetectorDefs::MOENCH: + chkGainPlot->setEnabled(true); + chkGainPlot->setChecked(true); + plot->EnableGainPlot(true); + break; default: break; } @@ -781,6 +786,9 @@ void qTabPlot::Refresh() { chkGapPixels->setEnabled(true); GetGapPixels(); break; + case slsDetectorDefs::MOENCH: + chkGainPlot->setEnabled(true); + break; case slsDetectorDefs::GOTTHARD2: chkGainPlot1D->setEnabled(true); break; diff --git a/slsDetectorGui/src/qTabSettings.cpp b/slsDetectorGui/src/qTabSettings.cpp index 9adf559b3..e45abdbce 100644 --- a/slsDetectorGui/src/qTabSettings.cpp +++ b/slsDetectorGui/src/qTabSettings.cpp @@ -92,7 +92,8 @@ void qTabSettings::SetupWidgetWindow() { comboDynamicRange->setEnabled(true); lblThreshold->setEnabled(true); spinThreshold->setEnabled(true); - } else if (detType == slsDetectorDefs::JUNGFRAU) { + } else if (detType == slsDetectorDefs::JUNGFRAU || + detType == slsDetectorDefs::MOENCH) { lblSpinHV->show(); spinHV->show(); lblGainMode->setEnabled(true); @@ -100,9 +101,6 @@ void qTabSettings::SetupWidgetWindow() { } else if (detType == slsDetectorDefs::GOTTHARD) { comboHV->show(); lblComboHV->show(); - } else if (detType == slsDetectorDefs::MOENCH) { - lblSpinHV->show(); - spinHV->show(); } else if (detType == slsDetectorDefs::GOTTHARD2) { lblSpinHV->show(); spinHV->show(); diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 415554feffae58b2fbac2732941e7548b12ad4d9..358e111d6babfc2655f9c6d9cddf7171ee12f464 100755 GIT binary patch delta 32838 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 delta 32814 zcma*Q4_s8m{{O#cmxBwUqM|}#f`1YfYyEe_v;_Yonkg2Q8X6`h78Ry-u}Cnnu&AJe z4JIZ2>4rv%i7f~fCKVPYniUo$>r!H3p;2L1<@cPkyRek^^ZogFyx8}1<~?&}=FFLy zGw1ADySr!Y?w*;$j1zAai~cbA@0s#m*WuNE-nMGLAX}xuSDS$)DSS~>VY{8_vbDk8 zZi}eIqtdTsvGlIOu9Ehq8MZp?IzMx)3=bLVjSRY7Pk6mEyaBsm@1AZCd-Qa;`(_z@ zBK>EOA(?6;{eo48b&ua*RZpm`@w;7hB>U2@RdGgt)B6Ue)w$2xJsqVe{_$*UTRF5t zeTLrW2#?wrJ~`s9g1J+xl~ra7(g*UWZWFJH4Fz`Y206d`P*^RQaqzRTU( zU@&c<`)Zr}_EH^IN#C2DIsLb9Kd03%&}r?R7-&tfhxXY`Nb?lrr$Spse5=p%PdTIB2wC6iV;t9|3-mmO`k_w&g^m2P^g_;t^6 zB{5CaMznXq(f%!qTkVa17<{~3C&Evj^TN_joNY&!JUI0mHM^g;EnC}sYk#${m$$8O z@4;JdP}IWP4Yoq<&uL@3c+4`|JZ6R4n*0p5CT(2gjl&b?7;K4ilqla(cVyjR7-q}; zub3ZU^P8ohNtV}Q75is{!)+n647Lz$Q{)Z(XA(1W)+Ae_pAji`&jDtip8nm7!);Oc zL}_Ot`=vB;tu#`Va9bi_$bPdaZ~vC!kXVELep6ntVqZV%ouF`A8nMWJy{T~jo?-*B zcbW=`eR7nUK?9q<(0cRU$Dv+ZVPU~LiXE?;iVBJvhs<>@Djx?MmqhqUbkHyJt)d(8x&=*hoqT(`uK+1 zEKvq2dyx`bx=2rTLWw1nVPsHo1fGg*kT!K@u$qBihW60R0JRXSP+LE9VlPK2dSnf= z)m)S(xd!hV?faQruvm3k>r4hRtOjk)?GXVEZ{I9mi+9{GTb$l48i{Sx-oAbK@b(&+ z=|IT-l_9TmONlS__{)$-iGnSzdML97PIKi}KFMHT_1FyC7{=c*L*+=ELyyhr=bL5r zQGG8yH171u%Nv3W_K{uP+tAlP+!n}j0=0)`1*lEe<(ZQyd5V2?@455> zKjQuFko-jNDA)p9bbh3_>?Kp+DLOyUI~<-1&((Qh?=Uz4PSE-8-WE6&PStrDp*AnL}Hq?HC+(n?oV zB5WadDpHoFQp2g`-VwGi80owWo(UtJ7s2r`(s>@71|yy4z&S9|c{*GOBb_6>BT{UY z1RyAVcC zhLO&T;074!JP$U^qsiwvcn<6bBRzgP90H>hJs^UBZ~~CdkyoB*Udl)&{c(s>Wu3?rR)z#jK1QaW#e zePN{YMtBg6bk2guz)0uy@Dw9|})^kJu6f)Mm8R0kob0lEYs$OiewQqWjQ-$H{R z1bqpGK?tgXW~M0}+uQK*%1}Pf72WG!6=c5Ht!3gAgy$A*eT$3?Zl+ zlnEg@|Czyj5D}?B6%c~{8bp&q2>K1Gg%H#TH9`pb5o&=D^aJFvnBjS`q;H@g2tn15 z1wwNEKLmz@h{%tixe$U%p+pElMNm3~pm(4=2togWiXa4ShAJThpm|U>grGa1?GS=)O96{O z1Wth}Aq3qF)j|mR7t{nH=myAR2@SkNQV0|XAt)Fc10m=dC=xN zN@Oa8peqCECJ=)Dgz_N-H9_SNg3dtI5Q0uYbr6ESgIXX29fy1$V1#%;(&2#-DYii% z0zV-#3_{R{&`bzH#ZWASpgm9`grJ>J8ib&2P!5EkT&Ms-&<3aiLeNW4N-c=M=fGwN zL8*{=Dg9!pq*YKLgrLWuF%W_tf}$V<#X)fpf)+qY5Q6T8(jf%RhO$$@Y#k%PJO~jP z0Tn_Bx(Ok3ZlGU=WC)G-wKh zpr@gD2tiLksStu5g>oPS#Y069f)+v55Q64IO%Q_ag!~?2J)QE9#F=0ih@h!Z6ojB# zpg0IYH$p2R1X-X=2th-k0ti6^ph^fqeW7{?L4J@SfjK5YpZ~gmfgmE%6AFV6)EZ2` zfDqIIt%MMC9?FCe^fOcdA;=C@LkOycnjr*z1^GTqw|rQi|Gof2K}6)IP$Yz)awrZ$ zPzjU-A?RHw8$!_AP$7h%?NAkjpx2=W2tltx9*;0~KBCWmFM~lKA~GGC03m1%6ayjX zNhldY&oo%_K6Hp+8pkpcE7!ZME0RkQ5!n{1*Zu@OC1nKnS`Oih~d|5lVv)6b5aF z5Hu1hhY&Ojs(}zR5Nd)D6bSjOP2#CP0U=)O)PEZ^ar~SI5mm0WQZXJ6) zuwGv zT;we`jkDowoeR9#G@fS5Cm>%B*zPSijmzLNopX6O$R;sdt#h`w+%&F->vhiXmYc>c za7&8j86Tuhpe_@%;qeQc8|W{_4^;J*(e}mPsU{MesC8M^&lz^ZvdP_?oAj>jdTq_J zUe4G}%f{ZEk;;8|s_PVGLdbcFav>ia6f@Jrofe<9SM+1Z)**lsb1j*i!4%_PhIJcB*(O4yc=u04G@ zv1>T7+SoOt)m-9pwTIU{tma|mX(!k8R||+O&`i$^RV%P6w2{x;;LLT&GsD&6_#M|a zJTuYlNWVPuppzD?b@^tk4N(18d)xfA-D?NC`>vhkq=>Xf-NHXhi@d?-89MYct@iNC zt@c~Ls-qeFEp;UflKnVg{U&iK7*SJUxXm9=e=TC&Xtx|*S~tp#zFl{#8{PEmzuIX; zvuCS4ro8PrkE;vmPkgSSeO#Aa$TM8Zn)TTTx3q<%jXd!GPCJ3L6SRrXxuw-!d(OQ~ ze?2!zjiDYfT15IpH3}i@e0 zD=EQBEn@wReLJ?_fAcIQvJLY&V!o!W4|eNO?R76Bb(wZ}{m6dp{jJsh`1*?hI7S$8?}IFL16oyjp~ zYTaIOon%>*`(L@v>G9$#ecYO>{glN&%j#Zx|CO6*Y;UT_OB9ZmNE$p0#k?4!hiWpf zVcMYnX&fVsdJOoZ{Z*4rfAf1ra}66Z)z4a}TRkn=-fA{^WNQ<%1JnYn0&PL|jU7(a zxeE9Bw1Vn^V|O3(bKI+H-8KxqxtP}$ihIe&!NYysPgr|>qwtM-ZrCD& zeQ|4hXjw0L2`%4n!&TcTi8M)C$%dh7L4Yjr=?&wr>Q{_ku{QqI9ctZk@W$c9$6M<7#QMPlm5ny|H(Io^1fDL0rb98|+_P2)8*7^|=_UMx`4W zZ`7RIoDF$b&XC}O0B$w{CfO2*OGs}jbX}oK+ETur)8BdU138liI}h1m{G8%8ex`F| zuBnaFr@PA1NJt}P`Q^N`ER@f2r(&?zTsHHh{?LZog2L$_2IPuswf8vg>NKSrhqu+t zm0OW3H?4K!DrbGVZ|*g=>5{?Tb*{lD#JAP{?orpN>-dDEJ>&JnTWdFgl*kLS6&)JpTNew3Nd%Rx%n;#v*Jy3N`$ z>Z+Gh0y!mU8@IRyIq7TOI`jYVeR%805w4!zYX9|v>QWo;xVc)(>@(1J8t1SRy46ki6 zguLL%swLn}R}RbHoa~m@7jMpRqf!64-i@C8k9*t??Qw72=jQeNTdsB1fwx@iP5nyA zchBp=4)ksZ`l|y?+Tot=`5kS!@92>GPFJ`*)+0Nk|8WCwbZ1XB{slSloY^_htvAo` zon}d0+G^jqukEaL7_s`gjaV6^&(Nm5J$&@vdNb>#f)^O3U+B1Y`Sosd&{3|2a^lLh zH{TxOY^S4dTisf0Ye8=(yX4Zd0AC+oX4P4XGx->KA5P6w3W@ZC$CYBqX-g z{z@$qxV?{|8zW>r9`#zEU9Q!JO!?9-*D6=i54&Rh|5=L`(zU#x-M!oWRPW#YfLn2I zDok|J?n2jcUS`-*c(>}CA=e0Z?s0XlxAz1%eGlz%RbKjfzw27Atb2F-KTg$=cZWJt zU4GX+)h&DH{=@g-qCQ?Pzvw)5+Q)lc{^$2Td==lm&U{}iavedIrn=~vfA}ui=ki^% z&)v6TpBxO_2Uy3@9G+pYg=<6Kb01uve9!&DtbFh4DWgdlt&Om{r(A7y@6MlD7dp!= zOFOC9wbqfevjg=gagTel#C3ySuNi`UQM733ECbkeeluF?|0q6$z#kY zy-v-HIXLu zbPdaL>NUic<0miu7x4>h^IP(PYtf_E@dNi39rd9*z1D$@4tCZr5h_QV;y-cDHl!{73F*{^yS-F{yNzei^W4z9^@~$p>Bc z1hTfT9GrF4vcyuBSnc9L*L6Lo!gXCgTG8hpXUog&Y;CES_CF@@kKC3CIpm+Cb^Ca< zGcUQ{b&y+o$Kr32t>Q%^EAj;&yPuhlK6dq(^B=p0O_}aXw{(V=j4as}ed0>D=M(pS z?fq%E+wt7fg_AB^Tk@$Zo!%2ZbsbMq*UBkwX-~P;CHW+r18mK<_FJ4J^kT=nc2UX}|}ug|8t#ZIQ}OlX?T@^UAeMSJM8$+x=} z7Htz9_bk`b@AZwC)$$I;?8|N5Y)b?%OosQ`|oFiQ`)bm*SVgQ*x1tL zTvO!_wA!ok+m6y!`Ytt7T&ISXvpg3Ke+lZE4rRdd|V$JQ#ptG3ktF1dWAJwmpU z-cp5sFS%wqJjAV(?h6V>DW@KGUxIBte4RQalf78&@L~6Hbify`{x|1~@#s@+V~SaA&zB9RE&Xc5_^MY7 zwyIaSBrD}w)StEJN0oI{cv|BOwnpUkh}_TW#eSB999^w}R1MmZuUz}T`mp--^=hCd zAAUr9-CxyDw6^5yhuk{A&tKo~h@0#n?7(8OMn`>M- zE~;_uqv`{DjeCyQp1593#XnV>bHbHl)(Q6ey|#Ske#u|KqaKfX?S@)cj(65Bam(>oZCj4tN2um(zQLf~^SvuK zS&N0aagC$CeJ z@JP~rJUQ5H+H;?xbF+=y=?|`RpE94Xa}8OtgkRLL^dpx#?P8tlI5K>e&E4x2+jXj8 zgWSM+-{$VsK6@+NK|eOuR(ymo{vn{HLqh>tyyh$hS`XUuF1wHJnK( z5G(N2D6Al?pjTtDLa;(K<)?kBJ}Hc>uDZ4GTX$_0d8+r8t? zbXI~hUgqmXFB_;7Pm-xR+CR*e)+)bNln3W&OMV`r7IUa#E$ioTZYQ99)~I~d$TuqO zKhJTl$mKAWNwK!RX|`Nk+P+h67AARlo}Hu46!L+`J7=F$8GdYo>Fz^{m9I6mp|5_>i+{wMFN84sp$Z=5@^l*N*Fg z3wJrE_&c)pmln27hVD0uM=wOEQREV(_4&>6KW_)E?1UdNiVN#quS8OpUZey+Z%cR`zIGkAIp)74bvRCD&;kM)Cdt99LP}~L! zuWTY3iD;A&1H}`n>o6LX5$~#svu?tsD&tj;jXcK^!Je45MOpu-gl2!hO$PT=r7jAI-O|s%$Gaa zdsFyKGRqVx-paI|j(Zllr!k0?Sw0c@;)J*2oFzp6&dR=_5|-sN~BI<-5;Eaqb_8JwB90f7T;T`zWr* zs zKRaF9v7hg(V+kC^qNDu@;s5(!*Z<>S-*q^c7}Y~@4KA|oPxf$KJYq|awrf=B+1At% zJr%c|Me#~c#kKB}$$#kC;gk;WQ`|-w@r<7%e;H94gP*rbF7tuIW&~V{NfQ>DyNOMSYdoe_Qf3=}W!>dO(3V)K_t?`GgYKq5AU! zm7A`bu$+YD;+;TOLcQRB1$HRfE&V#+GyRmE&gK|-t>WCD7WZAN^lEPz>r2-v!<2Rw z$NIbS5K52|pdRPA$3_1jrN7#Y*(@dpDZzamx0%%?@_C!oxACp=(v9J^$2DwHny*k$fyN<2n!r%@q{XxfAOfvZF+_z zhGM^^L{@0F8B3_BsUe_tz6}Q!E`_NTEe1(`eM49er7V+W`W$az9wlMhgpfwGz zbK~_o50==$dwR3$W`65tIg$-I*quTK;t}ZdNZ8Cf$$X{1)t~bbA2~gA%_fCZg%Z=Y7=P*$G*t8ZIf)}l%f1}gS~Emt6Vp2n@sj5#KS)hRql4E zPTW>GTixv%GWhgr>&@e~8SF0wwtJa_E^c8b>UD$BRwI5KuE<+XZ}RB4W7qIH?+%K= zp&f>i$3i;{_aB5Rp?xiHaDl$Tk61*sAHrz~b%Zi-Q6vtLZ%nd9zhOiM`w6!ak7=tp z@9sMN;_-{eZ%_aB41?OzbSz~OX_CbH5sGvFLmVB^VU!$peTQrR`RhB38((ycz5a#{ zv5(!rf@J#}^3=b6gR4X6lAoz`&n#RoLMTbh;eVuu;p@YbLBfx=Fu!o z+MjNj{dt#pGp~7WcJ0jvLWsTjus2;jZ<1}$W`2M}tR1aPyz%OZ9UJYg#J(L8$B{Tr zTpX=D`aco}>3iL-#6cYrXOK8UY#yV0KHFJ|whk`$|3=Xzu3jQbhfFP3$+TpwvO+DS zzJ+4szmy>9&BUAYBu8$OFE(+f0sh8ZuUkq zEaQGU+3M;Xec1d?O7b1W4T3#s4=?y{p(BWHVanTgwrAF%zi^Mh*iF`fWbMs8g5w1B zCIf|xWQLdj?a1(QA>YU#!wFk>)oTm;D7J@(hjnZ!1fd_-&`v5mx*UY5TDBd4*t%X!3}DA`MF3$ZQ47F;eY z-J{1IyQ-_1MZy>DE@U_a>!}>I3+QBa}z=!}Js9q#1}AXze^+d0ZKB^|Mmf zq1)G$(o43{ORVoqP^OvwN1E^sX~IcULz)^99Ig!Rki^xK%$7MMah-fgtmd}M)!d43 zWoU;a?c+;qhoi)jB$6bN;!wCUxoDuY3zL-Ds`*W>QgKq6A($az^kmFP%t-N^G~+Sj#dp$7!%P!5Ou@{@%ol5=S%Fz0 zzL}!jrq*HBi6K*!8$DYvTiz6LQSi^bAx#%vZ=Y5Kh-^X(joIRSHmxKElfm@#5+q%vGh z#!MFWNUB_jSt!O$XPHxlStTBy&JCnTzTDWbPG_C!D5Ply$sF_1=ou^<2j%lsO|fo< zGH1MFs&H*h7#id)@WsNLT$>Y27j>nxEeDpG<=Q200DXDnU#>a5`)$hD4kxYsJXd!( z&()mg2^4CASaDn1zRKp?l&977d?O7LJd@_i$IKVYXDSQk6j8pS{9*>#X>alM_n;;& zkNNNVT6p?OOtBvGubgR?*rg@-4BpN+nDi9#r=zYX1^zxi^_1~^M}nAgYyaDok;dQ( z%7E-b|A8j?8(d}lKodW1wwnzl;*N{uvsoL~VbYOiD|0+sFkAA)soBcERNo!4bN7o< zf(KeKkv+)ZxG6W-ryA64RUJnAU}_tGJX99Ikou1{yNugu)v{k zsLsbXgvhBSoPcmWplXAhTB6}-ohvrTsU;qc*STziFPsb~>s++K3}?cbV&5FLSdQ=H z>loJHJCyN?>hU%&Ns2{xGJA#>aD;;PDo%Nu$IWlcA{J-MD#pMuIu~ZkDki~6I_GE0 zDrUeLI_G7}D(1m?I_G4|Di*;-I%j6fDptakI;UsrRjehTRu4$cmQ`$mn{-afmR0ni zfF1?1K#AG1ivF;_&hgo@ilK0*xIJ3=H6Rfa*-aVMrPU>=KKeIU2ul@r-K9(%Qc%E4 z%S3P5%uf>f@;x26u;9rpE#&=;)|s8NB0`Ep>0QbKwG6XN^t+pTkP6HSG5c<1vs#H+ zDSo?~_N>FK6ZhT2)$8+)9Q3!`!{r@>86^I^hYNWM<`gk`E}6w)#)&uQGVo+#W(xaU z@-4$G6TRkf({9+s&6b!vPg$gf?&7N}V#hqCuNsXREe_37o>G%`d9qesK40l6V&*Hp z>UMa$?cz>!*SE1;aJk{O26Ac;Pu;5ot4%~Si7odkecXITwfTI0ue{sGy;=Nv zuX5DQXV)fIK3~Rg+vKyGudRv8F-kypUrgWKTt%5Kk0A>!e&|AF=#4>`L4~dM`~Q;js(f$pxxWgzCL7*L+QL_! zWbt^)yjEKOv1xQ0^}UdWfG#rlQZGU&Nmk1kY(^RtzD_DU@Gv#I2nDrUzreCA{3 ziZkd^SitqAf_*2gFNP4zSkkNCA3%OyRyT4zC=0OE1%H(cU$dW|6%4? z8ZRP{piF%JfHHcpc`skF+1rxWR5)_aBulWZ!DO%pzA(^s+T`yQz}u!x0=7!i-dlp-VDc}_fwoWvrw z7sSKyWL80Fg|Nmeqdi;jZ7C9b$2?FC+$Wo$`!aGHv`^lHj9*4>QTt>!S+PvH`Np}J zbN98{_cqJLnmqM2&8eLFaa)Ty^~oep-p8v2>%&XKIY+Xxsf4A9(|m8;d0rlRkn5s` z&>C^}LFHjJqAOEH5G?c(LI5)TtsM*n3urm ztj4$6x*VdkmAisNtn5Kpn+jcx`Ra3y#`LE#$5?qiL)`F)Y)stZ#HvT= zW0_V?l(pm$WuPk~+oQ^&;6gkK-7-pkwmqX_GAb5}6UnFnw+8V}A{qG>%USDOB1I0t z3=!Ry(|@8cqr{x$j28MhCsLL(M5Ga#CN?i8hbqh}ab~#^(bv((<+wI>oqRXMpbv#j zI5df=k10n~{}KjK5wJoT5fE0w_svUg;;UkxXUJc}%qn5#Cz@5v3ij<{F=MT7u28HV zY7(wVVo{Q^UQI4BvZDDliBoW#(BtCKRZ5oUnEf=&e#hLISju2r+CH(Y+|O;(emRam zutrWS8E}Tq3)jerB_Gb$`R+AxVkv{mbe^?FPAt`Mwa&M$krPWjT(9#jYvjbz0=MY= zuQmF_;zI#^O638sUn3`$AUH_p>(IkCjRG2;A_EOhcP z^F+i`oQ7J=TI<@UlrD-op^RH2u_2jVrew@yaXy(Tpd7PYOnaJssBfBz6;CT~s*Qv; zihiq=yVS7vx#1N5Ud;gFa5%D>fh(HOXwff){+;%|+_l`2!t`AJ0Rz_u?X6gWSH=6X zQaP(-E7robI%lqyt=Iy$=$yVsjFox2Ejo(C#{yPI0hc0bK+{*iji=n z&he}DR*WGaMh}QxEn6`WPSknsYT1fuaGK6ht7R+Zz&Sccu9mG>02hcCQ)xQ=S+C*@Z7?P&!@C^M>v4wu<=rr-=%pT?K)lK-2myth|#lP~DtZo{drt=?9$?E38 zc{=~{l&o$MT%_|)Ps!?5!j(Gz@RY1>EnKVf*H6jnHo;9gfAN%FT@MQ2Q7#Yo$y2hr z{; z6?+xSb#R@|b63d*Y=)b4j#?!f&`br);_2s=EOjR4OwscNWq3+R1>;~vd$nST zianUcs|x?U;#xZdwaT@_vaBiOl1_ZO9)I>qdFcUtg7IxFCw^X*+_o$vzEF?VGABRt6Hd-2?X8rJSN6y9 z-l{(ivAy0lST&r{S6Y}IY!A&|>J|R!O2l;z^BJ(SMLY{no z*k9-3C-jpaNzwz5Jo)i(yv{jK$djK8CyR40bM=&C zmRoyeDvz=b!>$+Wvsg(RK9%i$Hj6Dl|4-$TX7MY^<7yb8VbV}=N?F&+6|(JC!Yg$y zUm@Er6VBARc!g}c?eKP;3s=atD~5}8&R-$ht_rTwId6q*yE?c|=bROK+cgu=tOsPS zkZotCK;}cT0O>1a+XcdbI;XCXZD)ZkIw!4=Z8rs;Vjc0SqA6-RcDneOUg4R0h;Q8; za*VDupV7lUYp-K1Znb(A6CRUwY=)b49`l&2qc8rxpUEPGJ|^op2p**KpvPn#!{9KT z10R!hoC(j=+3zt~$5=R4XP?LPI<6#Or5@n%n5<(uoUZew<+6^saIVhH%Vix4;X<7o zm&-a>7 zL^e_-T&Z)=BeIcd;aZ*jACZmJ1UKpI`-p5L5AydoEb}uzA{)sc_Sf0)h~7w{1cd4V zEf32^3WvjWZhBZYQZyW`bHl^3k>cTao$DT!jg$;0iv?Slcgiu##o(>V3qg&Tjfc&a zEPZdT32M?Q+;$23(qU1(Rhgs)eZi0Mh(6nxt;4_IuwvdeWw#nbXpHExoz}@Y!lZVj zy>)W&%Kbvt=KciPIz@1i&hryw>r}(lI^U5XTc;kb*Lg;QY@HUkMdwKgvUPmO-{*+T z@1_LVIze!d&Z83a))_;<7(HNEf^3~gI8x^U39@x!;252+Nsz6R2q)^?BSE%K8k}am zxLwYsmDrWS>p#j(1o^F| zNw%1y@^8mdXA#6P~H_tIK5niihKM zercKPU&(N?&d)BB{VNmB)OqzX*}t~K+jV|one1Q1aIwyhEYtf}6#-Rxzyr%<|Eh!Q zbY8ej_OE8RS?9Z#$^K=gz~DV_rX_5+@Dnz%pm3}?jn>fsu?G+*##KgDhEPh`Z*;|tQzY zC0B3DSmr2w8UAI$F8!NvY8HLpQTmPOSbG0&=tSSRr@qaZddfF)A7RNmq)x&qNxc4! zeA5s!M;v`eS<@vShx~6CN(d?v_w7>p^eX>`TdHp+*=j9D#OkX?7XF1@%H%#iHAb6H z4a2U5OV%QPt;7-e<1S@vmnry7sfi$nZ$*hAyE#xSL9ycA-EvnRGg-W_Tj|>;6Nk(i z`C5f-B{$1ltGPtxiuZT3?keCA1;VzQ%>sR35d8|-1ZgC+QHJ&svkH0fD)WTA@E$MZ zRlu?naxbO(9%c9qe%~_Rd>dg4`IgOzZw>YxOP+kkS3|td7s#$gDB+>s-n1ngFFeIV zdz2wvVlZP!uKsJ)=!mPokFQrK* zG+ity;0p7{*CiEj}z##*KB=r~!wD@7Oh1++L&pEe5==#qXg(vK!umHwWoKd{I1gTw7ft1>~YAg)4`TFKaO zQudlo#meB|z?1yi%1Pb|Cn)5k>@`*NpDK%G4+|^8EaLWJrH^OWNe+6_ky~mpxh0b> zSsW-Pw=&$yM3)k|a>uL@qf6M+^{8WZ7fVVgm4BU)arEsHS=%~U+ao0`OJWI)75(-z z!)D`~E$-XTp22n;wu^oH$)S$WI&pfxvdpuE(3U!Jcd3%9&b2Y(itkFf;fTeI730b{ zaKQqj_h}eej_@+uZ-^>b&6f1Q^RbAwyXHIMP}abnPf{mWn>d? z$@|K{z6JOfoVv#{X{qcG`AfOX{U_N9aVQkq-e<$InOvHM?R{m$-yR-~v9sZ0S1hUe z!=o?=LE*LucG=g)f1m`6>-fael_ax668Y`1CW|+^BdbSNxGjq0QQ}3CkH32Iybj6p z+>%#skw4B7M+R}i_P>u`*dc>Lw+wo0u`l?9#|)GEX7n4T)@nLz8?r>831 zs_gpov`|h@^>Dq;uP&6+lL3E2y^Mcpp`4!lU_YIoT_~rg5I98V)eGhHGy$HV^Aii@ z^b`e0>HNq-eR_%`AWjc>V4<9zlHeqr7cP|3QwE%&^W6*O^ppqZ={#$poSur{BC)1i zxv|@JmOR`0$#?s7OMF_c4F5-MYa4WuZ}wpC?o#i`!c?2Eb+18 z?E{QFX_#r^s{`!K7GM^LX&=#-nlPKhx{s8J!~a$SefbsOYp{EbcD#Pzm0;#f`uxO_ zQ2hFlGJ8lUX6R1?Y@K{}&SI6g$bGk^5)a9aW%31Z1Xc1azz(hf4wq!F4X zK0nBgYA$B3ICqdsu?VwBjISWH3bRTqsAx;}LIsy?J)!ktHx8bcFfaXNJyxNtR8+sy za;U!T6XuXm%uw;vC)|capO*I!=RcA65Dm-)4ei||8?WrsvKutbm))cQF3`DQzU(HI zaHY<5^JO=wg==-LnJ>FZ6WpY8^?cb)JjmapLFQLEUv?9J*k9-J`Fb}AB_LD}D4s97 zNjMy?bK!j1O`_pwo%83*ZW0g2>zp@Vc9Uc{S$zK~Q(k$4+|CTBRQ7sa!o1WVj#VmU zYSVVSuzt-}vjx*4dVa&fqcNkcE51<{nbeioE3GHK z<&B2n*}w9wreEb?K6O@RX(qFKps#$SmP2^XuX3+{-fZ zliGk&gE(Vn6Q&8XNp!Er!_Xv`P&d}ol!Gt_iAU?XZY-D@kYTq$~9nHtQ4213GgOUkRepDv8%7xSIIMkkV~J61 zJnv;|v~DpO|MXTvFL>EPt*>`Ap7vA|uoJB7dl`@PaJX9+gcy&gYCgkkzIEjF#*rRs z!EfYkT{_CxM{$O)9c?`AvL795jJQQ@`pryz_pLBa?AP?0m#yiyE%SXh8b%rKO}`;5 zR*4Q8HQn}DvzP5L(S4HZVWJXd!pIf_C&MF9qAgZHP%)CHjXx_ zYn#oswPMec#(@sgdg4jrS*2T3S5F%Xy4`l6YZu!E@ny1caOdW(e-w7I+-2e3%xZet z_?)rNrLO#VZ?{P{bGHj+jD}r#hoBoz9j#kZj7N<(XExKJn?H(`Z&DjheQ7or8r5)H z=70!74Lpu?#4;`pFxV^1JnwPD@F_2Z-Om`ud1W>~@@^*%m}x!#jB%AwEu!c})<@SF zdDi07&4*cF&9labR6k5VasFB3ZZ*G|hep;npEI5@s(!zF6RbUNd`>MRVVUUvf-wM7 zcJiBFFb+w%M6+FLHd_pa$c>75jNc5%8+D&D-I5-wc&ULAmOCPwmYO}M+nVrgY7Tz) z;-g*(cza#$!>u4$)iwK%Vx>a5Cep2+egLD|jCIXkqkQkqnm=cQIeI#|HkHbw zsX;Qm!RM1c@xuOsaYV1c-#gm^e}BmGaonx8F~1w))iIttPaK?KysxVo{yR^%t?OSi zvW;nI?ZWk@Z8F}dP9b=TII_ujq)YVg2AbF3qQuHK1K!Rx_Ujc*wWEK3etuM*XOLGM zH=y0*4e0l|Mti6F-;F+ATt}b2ZXBl`|J{rCKh!sjt)A+jKfG;&tX^*#y^Nhax_i>( z9@c=jjNQF^wVz}6GdyvR@pDtBpze?EVK+u}-)B6hTDo)PTTSm7H!GdSbmwg(HVSrF zjmrl{cQ*sk-HrSH+mV&hb`h#ZQAg%e=)e`W`fX=XLV(#l@yrv+bm4J!ss}=hw>yAI0|TWmdRx>pjyuO|hN1 z>|r}2-mWnA?P9-tM~?60fqW&ti_I>+tT4Xc`Q&A<1et-i?WA?n$3~OV)Avg6thzlx zwkNu#&rqTUSUNMP@A<^|Yqy{)-nO7C@_HSPHC*ieloM~c!bopD`>CIr>l*Vo#w~Y z#=Q>H`t(ubQyyw2&Y9NBUl{`wHJkjhMc;3XFRMA2Ib!!W#(tRk?fEyx!BY#aJh#`& zR&d2&Fzz;Q?9P=mk}IizQWsq5K4qR|y6qt84qh?R^UWJgTsbo!Z`6It90so{VyndX z8sof)wO7h_d)sQS1dMuSe%R?RTQ~gJ+8XII)c1B<6KI;HE`%ge_n#_ z94JG!Ug7`dBg01Pmo>(xjoq5@ZKmmNxBZFrr?~GsW3cB%94=n5KKq^VHC2uA_O``X z2iuG#+(-9dWn;CUGLH3Ba|q87{mvNg?Ud)8xQ87;k#feEqUIBxZ#DgFT&}3)-tsxb zsWxUtLe z9^CtLMINU+h6wvbV?_V@9x|8u9y}(x;5%xP&#C@>HbvMPdMwanc!QYymod0gV~;67 zqj(7D+|c9uvW10?Sn-!}WT%E65z^IqJZwq)js`GgHQj! z2-_GvWQ=vTr)h|nmq+Jmwx&V+r<@|Cn`xrz(V45#da#>mxwjhFnNi3(?i$kw9+UT! zw}KD#H4RpyF{8zXzNQ=149pC1w6E!D)j~pxQ2Lqp0%)LVSf{Yg@??aGw*pOfwMX9G z7JgShQ~yred&&mcE}rUVI;w_~L%4O$wWe`Or?Q^EF+G)8v-+Esn}*jp>c|Ad;4SM( z3se+@Xa*l2TA_|44WGI@7&<1O56?kw8CB`nLJ)$sFjDIRmo( z&s-w)qqDE&Cl_TKhnRwc2VoBKn@S$Tt@7_p*4r%y=E&Uc&uh_2PLAuqp9ByD|9 z{_SeLma$vUR*VQSz1X3gGj}@5d90*8@2j*@hrC7ip{Bm-OwQCyF%q+1h@b4^A%1sp zG}F$xL6dFSolof*W_OMd_YE=i4bH|pyK}hhINj-ZXW8(Tb4*Ngonj+wvD7$LygAe~ zd~AZ>sS?>668u{22X^?5>UD2#-au_CWEvnw9wp4r%NdgC49OJgFw>Wv^7*e`I+ssAT2uMF#AgnlfALwt=O295^7&srTll=f zXP~c#p@q*dJ}>ea%jfTWCi9ugX9k~}_$=V_H9pJv+{kAQpE-Os^2tB(+aQnbR?8oz z>LDWW50m-5Yd!os4NUFsVQ?wzPm@8{Uwoq4%O=Bjmrdfx0FMA`^k9#B-Ad0HvX9RESd1N|cT=P$tSjxoA7eH=FKgL6=0!L62dcE6HzVvNfc_!({40 zKK~~Dze)S=3=#IJ$8fa_vs}b~>XD*OF`JSiMdPO)vpkbYm7Hu1uk?6L>H6!ydyIv|wH`o7NbR2Qnj~*Z7)E&%~fu6o=wb0-|c`D9SpD zvFWPHlb$3;ns1uJi_vtM8Ovx!&0_JnoV27 z&8BU|d`6>CL@RAgMoEP8xh)5k!!!BxM`73&GzLj~0-A!N&|DOQVi85(O3}9_Ad0>< z6;b@H6n|?5$~23+j(9w)29jrxs5|1(MYAGcs<<{3@xaSAuX43~1!s93|VL{Y&sZ-f<%&xuLv=lDngM3QTYlg|4Amw7G*N8Lsb4yjA)eh zXQcnERsXM{>-jBe^13+Q-S~_!vF(|1Qdr7Q7TG9=_mtbqHMFr;6ca_ zy8soUB28&$3>6iPIHNN*gYkXubJl@#z~=irujlpr zq4#~(-h1t}*IIk+wfFhK!I!2!`_j~!7?!>_c3oDtWc^vUBuRb}!~YWg$F<#0`zJ}` z8YDS0AN285E=$&avyM9@DM-g% zl5~}h&!GRS^@|=!a_G2El7e+SAW2hnd`Xf*2)9d;6slvJB!%hNE=f~$94blSI(AA@ zgpLy=DN@B=yI;FYlCIGU(j_TM$8Je->ewSm(K^nTq-%9tC`mCoE|#P?9dD4NX*w>I zqy!z8OH!haeUfyYSHGx|q$C~JNK&$n>m+HqjvFNDdL1`P(hMCpOOi{+Es~U?;|@u> zLC2kvl&a${NlGK^Z9gMPGxdTVNxD(TeUdaw#{-g-uH#FRltK7SNs?~Tu}zX@>)0+y znK}-Yq%0jfC25Y16C}wUEc_1+_@+ye=IRCMk~B}pZb_Q2V~-@|=r~`J7U;N8l5W;< zu_P_j@dioq=(tpp7U{TLl5Wwl5B=xr7gds!r{fw)TCC$bNm`=g21&}-aib(H)p4^V z-KOIfNm{1k4oND|ai=6L*KwC5tq|BNMt??<3iW~>Nm{AnK1sSm#{-hIO2?NZsfh3| zz+<(JZIbjo9or>ojf!idhXyKa@(VRgawu;}Hjm$tZQf4#1>ZG8muC1TK=DrtVq=Q3 z>+0;V4XEBDswov2ZqjwDvi?Y$Ok zVk!4MBL#T;ezIRF4Gsz0>5-&vt@N`1L+N^@0i}yk+C-&khSHfz7fK^hT0x~nhEl(M zQ$oVNMqwTm?iwk4;X}nWB_!odltxf#lcDrTF;olsxC(y=>VHCQ>G69Zn7bO-Qj6aU z2NlpUYw%*Z%A~QPq55zLR__0 z>n>c|T+$yU?s|>|Tl^0DD-oeFEKYHUX0s!TFEpI(R_a5y2QN*BJT*~LDC8{`jZ&O{ zwJQl>G0d*yg)Iy|J;R3?^)x%J$_(bdiEU?;#;`fl{wVEC$}Jbe0E<~W*R3kw8H;N_ zOS#AIxsTNTi~lGo0aL?+vP5G@$4EM#l0NlD8HJ@&L;N2Zu3Cettz)XTPrdP0jNXc_ zPe?A`pQW_)9s~=}1u@bo+=@hxU>@og?xbTCIdSW7u0t zrZbAIRf?ReqF)}7t?dlC%wd(Lx(rl!#u?9c?TZd!4N7Qq%&;~uWRW(Nyy$TMZD?Y1 z3AZVY4o?wIWOSQd9?PA9@KZ6J#|c-eOlqyyv2S8)zS15Y?$s-Pgvj_4{I?FzcN$ zLRaZA!@ByaAxqbl>qk>399#}=nzCwQ!c#_19EiCFA&Ql&eL{}PX{0Qz|9qu8=Kqzl z>V%C+S$|(?R@T4~O<8q8qBm7p6A-PgYZX!~fU>&qt40A~Hke9R)9>mL5D;e!9X2pbXx*iB%!yTs;*x??%e#E7b)rjGLu-Rl7Z($pFVu>)M+Eh8 z6%fKVp|wuwii>CU$|d~Ypg5=HvTu}z8)B3vrX?_+(lTxKQu3Mph%C~u!DnL4KC@p; zUsA)ljZlM)e8!eL^!4jd16IBL(Y)HilK88?V*W~b{F*pnZ03Gia;Q?#l<-L7GSzF< zf7-g0!T6-;ECf@@Bl!(Nl5y$M&`^zkYn=htE1raR*++^aF*OLwliy+^N2M@v20N=% zB`WAQ;yTV!lw;Se2n+K?Ny)-HQP=A7^>?N>NEVOZzGs!#r0nS{MKFMTGPIT;YNR;( zPm2~=#dcfz-3ar;VSV3Dr6%e6NhZ=<e48>bJw8aJ13OV$53@cc;rhpd zRqM@tnhAb-+^JJKub;v0Q7&CSJU{;?Y^JUZO7e{Gto^8Mb(wnqJOjN4Q11b`L!Ul^ z-mxT9pGUu)2JZFBt{F4fYs#@1F)PV8&lTw04ZfLb_RVS$F-P_JnOGJb)TbkNs8=kD z4)i%wak=KR0i`A-1pimN<_8Li)$#czwhSoUu35oq-zm;>EvAxcS7i7Y->7~ab+m9) zoDv@V1^k#H{KV=lE0bC-sC`{f8dK&6?$GJz>jL_ks$6wL$1V+V)(tGFSY zy@y3ON!c9dQ2ua((|Zrb>+<;hc)jouv5M=x?M-T}$}ARf{l|;0P*#n02*f|0euc6c zm4_DVtFkaVD-&C5w1h^TH@eTDY^qvVO@+zEhDuFpNLUpjq?Jl-rqT{7)w4ajsdQje zX{f2xnWl0c8Y0e4Q)zx$cvzPRE=cxlVj`JJi+4Dby0jQprL?DQW+GrlkJr`-5jLa8 zBl!Ak2(iv-Hz=>n3}c6s&Y7ufqcS-2F0?7RaRoc2wBNW+U)BfGv-GLpniU==atI2U zf6jtC8kX6!yWx&7$F7S?>8ud8L8+QGJfQ|khPkxQnmXYTKb?)zGb>zlu2;R%;^9jV zXYVNW>D%$YBVz_!JSSsC*gK>FJ6zLNnJuaMO({M)pd3S;Dy26g1~qLrCE@@6j8Ge` zAXQ4iO}XrCrQs$o3Y@c_XJN|8*-QMFLZWdg&Z7fIBQhUjiEnx=H#0$^#IYHAMnbvZ zYe7SAp_*k{o0YDt&)G4>{a`Hj{hD13I50kbvKt;52G5cm#t7N))@LrE) z-d=EtP5(BiEtGMT0FY1)ebt~QTlGy5_w)wLei$0o@GoP`uN2?aBVQi<;ck@Cv^Qdd# zaRyEHd7|*YZP7CPU$iJ2|JN@{#s6I@w%;Of&Ml7y9ju%qS=A9~i*=RKeT!&0c+0Gr zFTytpbBEp)*+xEvu>9PicSN?4@A2Cbqy-skok8bS%7)w}Y`M~s8-*q4Ol}e~RBPT6 z7Niv9tpeZXyxGXp`}3mMN+n=%5}U51FJ2-R&BgJ^j++;6$NvepMzKi6b88Yiuaw=o zm0eW&Kv}KWmLy?GOg9ete(^ zl@w@OyLj=hSt<$!@{=H5#L`t^U;D5hQ}dX5GB!mWrDo|r*eA-a+u|Wc(`{QJhI83n zLilBH-lHwcRx!3zaV%fPE-M?B3oTYHhn|nNFOO$zuF`uuoCqnty3vIQ$OXPE^Z2d9 z_F_ed|28NUxy$#LE6ppS*w;$eipP*e6csK+=5)9)o;50`3Uk?EC3IyfygzSccwnPp z7>AXzl`$x-TNxjD#4zl`P>U9(G>2_ex>vpwc-BxOU#Y!g8T#nEV+Q`OSREFw)vTwS z$!(}xujH+Yk2|lKUCQ%V;=fQ!;X0MqnfC%m>sG-ju|O9sLp;k{Jp=z&td0tsI)y%q*k(^k;*(}h~Y_-aMp6*!kHkcPfhw?Ih8scB9;@lX*+LiQ;+k=`smauOOJgbxrlr<@( z)6$fHAIuVg<_9malvAQBWU18#_RXN#K?}gI6Dn{S*qlPWOA3VG*mpCy50souD9|-IE)XQfUad$R189IX`@fH7f%@JR!ox=2@cN z=J_l`NiJQ+K2?0B53@@M-XYw3j)jGyH3j{aOCyrCTvGD3#3Q&AKM|)K+;Tno?c5SG z{glTNBz712@==xLR1=9)w4iJANOR0nO6a}6W+#=NdqWaC^)X>Td=jR#QGH2Z7f$Vo zPp9JC`T%?9X#LjhOstCA;=>X>mPz+$elO?fY{dRdDcH6UA)|g`)r1EvpgI%^2$YA z68VO&T;v;v%V)Dkl%DeJ;3_ij@NghUm6EnYgvH_=3-N#Bj@csG?s$oPsMOq_%kmZ1 z12M|b{mvk<$1E`PDN5!;!ChJDO7nx`l%GBDh=}wRTUqPTriu`Y7?d}j?NIu?sUnK{ z;zhvsEkPbx=Svl?>RTs7u3RE)TA73;xT$i!P(o!4+p9PpnjvDsL)ju4KZHr8G(EIN zEGQ4Z5q3ydBdnoK6m=qCDeigrG3-1y?V8QrR2p|J6x?=+wxN%#z!FpXNRmic9!c^$ z1cUe~4WFj%`%x}B%llE3X!awu*^h)kmq1ypgg!by*k9NV8C`QutH_t(r3tWH|Y24jlYtn^of`!z>Mb~o0dP{n?~|Iz8YAD6w0 zkShg%KMuc`x{cJ%S5s1;^9w}xh?!6HFwnb+Za6hf!FE78N%Yc@`mQfPZz8(kAl3B& z=un_n?N~i9&^mC5eP9JOFr2Nro&~*x=pBX*c7vWr^wS3V7SPj(-e;h%1YIlwV!(qH zF~cKs%`KLU=db$V?Tpvx@YV&7*^`Y#p>)shSTyhIV=l$#wkqY1Pi7Z+{wy{{dHV6l zz!zaO?D3^~k6-d0rStLl!2KdA*4E$aGnB!{Q$-&2#E>k0_IVk6q*)0Gs}+lkzNgA? z>f!iAt0BKDgGqTXG|edmul>5tQfG#-O~cHYQl`_!fN^n97@K#lmnJ|07!( z+`n1)+kpe#X<`RQrnfjpG!!RHMy9u98tB4gWO_@!fi5gYrni(B=)z)TdP}*1E-Y4? z37xod$X$=wy0};hsTU5a?uj%Yb^Us`*^( zH&-@&>_#$u?APkKeN3==ZvS!J0`CP%_IrhyK?uv&pvGKxoz~OZwcc5qR#%PNZP2}` zvn^NXOc+}iuG`et3`KNHl%i{Ydzck6!z_QgzU& zbUhiu`joyW*ToHFIiDC3`?9^)(PYHX5NlOE(|&D0DSb+8`5K;z3N+JCJvCz~ICMy( zIpDsAqz?ER`%Svsl^cy*sa$9u3R3H6>DPdgSN{O(RyymWHX3{D7RTtg0bmt3MR3AA z7bC*SOO(26%y8-(_14oO9?-VD{yX}%7Wk7~TA$rY{-Jnf{F8w$p;AovSc5>PQ@~uk z)~tRSUY(F$Z0Ym(UGt*S&=9V?e<*;RR=N*~10d(qA*3XAp=!lW`RN;`X?{q4H#p+I z#sJtlsMJ3_19my}^eon|Sf5!ab_UO!U_DAe!}XKQEEG>e5*t*?8kXVz&W1JUKjGO_ zcIIf&voQ=Ue9w(((f(W%>UKYuivR7;uM@4G-ySxIw8mZ_g{H$?)(U^wk>y01w6S&Y zsP!;sxGhnCJQ+Mt=!yVo_fnHl3=OQ4-d?km@J6$10~9LY1BuLeS%- z7tV?MfO;6To*IcF!G8N1wflf#8eqCu2S*AWA1W@Ciu-^R;rtBo#BoF^M(G}uR%mVg z@(gXaDK#ivjZz9;er1Nz1xiO_NXm4SMo`;&Luv4pBh}T9P^5DBtC8xe6g5))^2G(p zum9!X=RTKXl<)m?ns>y~ZR#vFT#MeuWg(!fO&mvCfi}ZB)8-k8Ojosz4Hj);EaDi1 z^3yh(xE4_kvp0Znq_{g^)9*j!4xL-C7HFBIW8X`6FEDNtLdCc}enDbGjdRa&Ik=f( zFSZ8B9>2+7RBQ|%o~5`Ip^irMh7LlN=9f}MD)~}sL zq_)QV#$MLgTGpho-!rPUpHld8D((eTzpO+r7}a)zu0ovk<9IFbZN>dcsyNPgWnpxv z$Rm&^h`p4i6-~XQ%}Fcwt#>H_ug=02H0Ra%?CgQ7SdwzCbW(_Bs$sK1kpVlMmU8W^ z>eVRbQ0&c{@xQM*oCPTLz(|Q-TLN74T5d`}u|M5b)#hFR9N3V6wgnXUkH1e>;NGOR z043sL!oHu4_X{YH#;1!tl@j&!6eZ(l&#~RS`Cb;g?`W=wH%FtGP1$sGHsVm@(d^)z znl`06ot5w|Wl$|oKbFnDR)_P%v`D4n*aHwY^Y!=HNr8iV~rUTdn@E3`(1y{Tn#7K9CX zgFy;-UHcT}H?3h}&)B*K=ZT)Sr0Da;8t@sH*>Y@)Qrng)4qV%o1PiYiT^^<+zj1@i z{FLH1QiDHGnW^T~vs39)rSXka-0ttj|H~D7`+SU~pnYMmdKT)DESe3-?I7X|u^(%{ zD>_o;HR6tGCc&)V9@_Vd5XJjugxIybsmV6F%7T5rNEIh$_#ZmN|ET(lD^|U{VBZO~ z>WS3I%Nf~vayB7C?-V!DJs#^|hO+C#41bz$k`2SbeY{hl%Dc}79kq2>WcXUZFH^;X z4!^t`#%=oLG8~)y>Q4C^2D@FW{ODJ6g(`ogo?YXAhvGWv6&v}JE5!NU+u1DgsORm8 z<3b&jsfgIE-bciov_bpIGw+5f55F5K{QKQC;t=}X`H6XI5X*LY^vb>oS}-)-p0N&W zQ#PDh!8}UGsiXM6?7cNCPs|-&{E#I?neo0OQtee76soOm9*bv2aB^W8575+ zc106XsrpT}7}jqd7{lR=pSC|hUy4_rI8(%0mHsoo7WdFTnk{zPAFV<#%KPJ=1@AxIAb*1S@~7GQ z9FPx>2m+qXf0`|h2L3cVl5WS!2$@=nrYi%nFG9)b&J`yS-ATc*NZ&lDW5usa)Nx5| z2})P@Z05%QQ~y8>tD9QJ<9(wThRZq z0u2`l<+Ay}!a?$mw2nK%cH+AMl#1nVWZfBU^1^`NnR?q4a#3 zD-8VEjq>lAQu5gv#ZY^3$9dcp|+wpX+6E4H^?kqarG_q z>e&c#g=4OrPAMHrm#mvlEKMWL+ae15rC%D#B9I3Z>(`ZfUDeFPysUcpm3iH!r9~(d z%p7{rf-}tK(R_E`0R^xeJr6UtwF+l{f0^A`uC`_GZ`% z{4ECz-Pno&L^*3<< z*7&zs!u^18Q|MfhIN>`tU&tX3M>$dZzsR9ZJu&T6u1)7+*nXw!TzHU>(P>DZv_kfy}4aA6($AKi|5w3HY`_50sys@7T$N$OaV{jmye_mu)rRQU! z#Sx1*YPTVdvjt#Np-NQ-d5O z{#MB#v_q--drY)AtU)3T-_g|XDDY=hrdp@K0U`D8%T|V#_%kDiP)HU*OJ}Ts2kObD zdg#MxEJq*zYv?0XssG2q;7Zg|J=`#gQ03A;V%Q?#e~N3pzq0zmbzx^Il7$KmmBUBw zZLvzjg;^{XYiz7CcwwSq`R6?4gYK)jdkVWsdHR(p*s`fn+M(26yi0lhpMOyn{PTN= z*tUz=YTS0HHTf?xS%i#m-}4&oltw56|61lBjUEF;pyICa%&Ba;v^7Xv4o^oc4@e>} zJuEWrZ(b57%>O>8)=(D*VGy;3^FN9Re*bw)BrJp5BSq|ULWOQpp*Hok9e;pwdhja| z&n|Nj#J)W$lIx*oSSv5iM%d~dx;jX0u4<8*?6h0SIki6@`#3fdwV z>XqQ=PHx4!3e3q%t!zo~5n(TMt<}(CcK|!;~7E|x7%10eq1&PYvTnr_6A$d?f&cu zp$va^7hBD36PRYDWL92)`R+}pE^I(#3=hh z7(aCtn-RP*U9t>~GJ%8JuSS~>#lre9Tgn{{7S9rSrh{E8H~R5n2Q2V1Z*j0$Y#SeN zu=#-z2LFiQ?qJl%NQ2o7_8zYjS4Vh9FiYi0Q&_z6x6(=6aV<8L-Q6}Zv9=3lQ`lGR zEq*wJy~=`kK`2;}V!qUIO8E0Rs+KMG?(td7@(!IX8pMf|wmI9T*r$e*m&IYgGuR|RtpaiTra?zDxhtM!vj|=q&lUznl=!=iAvuC~#z*UxDDF1-@kCzp8k-|m zFBL~|{J9y3ek)we?$uUXZS}2E52f`Zf9syb!qg(rsC+e>)Q$AfR+oYUIzw5#z!}cr zETB=lw$d?s+hIf7!&+bS=>CGW`jabkw#(39*Qm~f3h`va*-O0L1)E>yJuXbj+5;(Y zj#l23g2|Z4oj0&>md`V9VDE~Uo64e;H)c(>Sa%=fIjQXV#7km%d@V^DCz!dUk0l%j zM2J0ymdB_X1s$E((^v?*#1qokvLLk;y&oY;2YGcG3lF=5#%@F7Yc!^4+=0e{mtZ;Z zbe6`iHw{A9bK6X|hSeY6Fq4JL>=V9g7W*^HJYJFxhh;mCS7#s$#zkY5R8MR@*2;Up zL@Z@EfsELIeuMZHSiI~NhrpBK$T_1AgxJgj8j@J;if z=}cZdpDBWI4x1gA37PbpGnsrt4#MdNyfz2Jc#*f~zzCU&yLX0i;?v-LKeBS?0<3VE zJb3|&3C_WY)Z7CrU8bh?Ru3;(fZ+5FuU~+Eu>gpx{No8Xi_nU2un=ofCa+t_qC|71 zrWLdxdcY0}&t+5iUl4{wob!mrJl})3pLt*rV&A9Sw}_n+!(YNe_@lS50#T9*~Eon|O5|vWiR*g^>|!Ns~5vO8Gz@%oWK!i`ipB(~DVZ z@M>+Tr6+EUjQP3S5R+!#iq5eL-pXchzKl)gzqysooqi?uWf<7ubcy-&Jc?50eBO|c zQSe*P_|7F5F#`M&2r!q&=0ku$5}?;)AThGYG8BnZmzMA1x(e|SlHvK1Wo$g3x)cjy z8BbpN9pf+OHA|tdeBQW}tzv7r^)^U>q1^^4p8ZZKSUDfKO`W6x%h2rdaEGBNsau9@ z680{@it;rtFJRA$q-{C7S-y+$lI5tM$vc+AMUX(;j`0erepZQoLe7PWk!5VE_uZ6#a_?N?&z)bi6Sv4(;79q8in z@eOyd%@(n$tj0{sT~G zah{1(2H%<-qth}N!5Lvb)45XF~KOgV&Wmw7i{=3jK+h>W zS^VVlya!l(SfR(7{i&W6`utH@wT;`KS3dw9VZZkPc7N4;-~mj|YMxnvKwizuD%dpH z&3Ju^Okp~Z17Ut0$+^&x_pJR+=9Sl{dONbY*cw$qtg4uy`Z@o($o1EO*# zw^g#cg5MUlsgSNOt&mu)PS&>k^9`1N7zyKvyL$tkMV}bSV(XSSgIM_$n@9ZiU(MNdVVxcf=?Wr1S< zeiSy{k=*UJjQ7`_u7KxP$zlA>C)uQ+0<;#V@f1W5PrILlC&cnW@YYO=vy-RbBhb=Q zC@H{Ws|oz@Q;3?0eDEpcHj8;jJ$pgE#!u-=3s;7gP2hVDvHO?bBSeR33m}&@wId@_ z6aAWtV*Uds48N9ajrs^yNx(iXK))C4u|_Qx?OalZ`YxZg)<=c$qNg!+XYz)N*i(9c zlFI-1G;(j806c^B_bht5K&>i97T8Ff0Ept3Q7l5aV0ze4j1vG+yc5N>RD8-%j1vG+ zycoqLRD8iuJd<~c;z$&yX~j3GH{sN$3aycT2O3cNH3In+jtL@GizR*;l0@~CAlzSF z;lFHP3y?6no<+*Kmv4HOZC@moD{XZ_;NBbGc6#_42Ss}m+Ro55)1G;2ErBj^%xLKo z`oxl`J?&x*`-Ue!$HG(24mZ~(Xt#Ea^DDeXymwm5!0@%&UCRYt{v13zj0Zf=k|K|Y zrKvJo4J=OexcHEIM--dmIrY5Yc@`5SHrzs9lIMhvS3S?-g9fskc;)q-V`2?m;{(flnh-0HJB1ueyyEg@9b{VdpJqNyL)W#$fD`WoyqA^5Y@j=r)s7g)Gg)rV?U&F#98b@hs7v;_SZwYLm-tieH7R=e9RrZ<#U3DNRMiFvt0|9TIi z<)K}rro@{=g4E8`TOTb06uFW~#$qs-3kKpfGNCrSM)t2gV2}?6cu1IKQoVBS`U%Do z29iT%r=}wR&1G6Hc&v`O-ywUACi|t=&~+injyKx=c^O?J{c*ge$v$PS+L!vZfR+n0 zd^f65SC_pBcGv<2MI?I>7>H+#;HwVtK=dY(z2iV53tzAZlpH}xak|C*(FoncQTsh1 z0!I8Mm3NOSe_0bJ_z*8{#10}~TRg0y1DZUod9E5?MR4?u zYc0y~`gzQc{ap1LFM5g1@aqBB{k-NStn^Fy>6dWO(Z^j)NSaf4NfXOnUrFrx#Q^9* z<|1(-o8h%qnOO#9LElvw+2cGT#_(q)WNs7-&%kgPV(#%(XNs6dfK zjMF9NX)m)R@#=escG9N3_glnEUxu=~)S8-=3V0nFXOLG&*gCRk=e0 zVs2JJ4si#Uv^@`}FW?xqGF?({{^1o|x@)FRv9>NA`wG&AE?)5p7IBPg0YbsUf} z0P>6X9h#^?ouPr4-L*t-GSF9oUP1H@109h}PebOPHqgcE4tZ+*71I1ZLqQM<(umRE z2z}x=phsx*9J_)33F5~UQk98IwbO`+ILLbq$8(o?*K3&11>AX~C4oDC#^SxbWA(mX zqnY%cQ|pm}G>?&T@bYMoE(P`hL3WY|>spYN@PJ3MU()abE3lY7ND&s`$r*bO;WX&o zewr?D7;Wz)Tm;-scoT3l;a$Lo3D*PH5pD#oCVULoN4OKXj4)PI`v$^&z(p$dN((OG zB3~=G8P0FdAsh>wPBbTmf7|SaiILFf=r|oNyEHCc@Cl0K(XEPnHPRdZbAg2*XU1`UtlJchg&Bo^D)p zQNab^lNw$Gb4+R>oB-TJI1{*mZ~<^F;SIo5gv)>{2t%MrrG#sMO9(f5ywapXx)2iO z5$*zZ6Yd92)9@`4Z~|dyWl{uTA&{N05XedxS_!;F7(xX06RrjB5!maJZfU~BX(~7g z+)4N}a692X;AX-wQ{Z6@=R!k)b%Y^MU^U@1U>{)*a2a7ZY~TjMLLhGuT{Pe#pKu3o z4&ff)bPeZ8z{!N2z)r$$Uo6Lj}$OSxD6Iui?d3;2OdKz`F=T(13En&`Q82!g;{O^e)?Cs3o9)3d(^!gsXuw z2{!_}2*XzbVhO`c0ilHZfddG`OaYRHZ-sCZFA#=66Z;5fdU4TB7x}j<|4R}(%B>?1q?T&CgMVaoB|4Rm40MG;{kT|QwUTn=F&Tsq+*;AFzk)_5o3 zDqsiU24EZEWB9DvAmL8n0S$X^hq}h~Qb9lP8N!3Wr!>660o*}28Tc6COyEYsdBF9A zVajnege!n|5v~C)Cwv%q6UF}(n2Y0zso)fF0bwDWhcHy9ei#lBv(O6c(&&Yl1><4~ zyMRLpLtEnl2*Z@)B*JC*JlqAsRfzw7eRKhJ`E?U+2ks)=1$>flFK`Rt3&2epUMT@L z5DoyYB^&`glfVgtp)J1% z!u`N@4c`H6`B@1=AnPT8T zd;z#x!>jDTKElw1wM@lcX;lF(Hc&w+a1r5Z;C#Z(z&V6Z1E&+lD6PpFF2X3aLr<4f z%ID_2QyWD_A1|cN2~P?joEHe3CFsCbtkS1#Th?lgSN)8-Z&HcLG-t z?gOsSaIp>XUoNGK1Qe7I&H*kYjFHKCgnhtn!VSP_ggbx}2=@R-Xn3s^*iJYW*h(1u z*(HGy|JRn_qMr(O0rwED2R=<0s#D)$#dKW@)v

V>GN;!*^PN4-<9**Aa%9ST*57 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�pZU} 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

RR)J3dHwoMeTrcntaE*pH+JL$Oxwt722_?XV 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 LTK$%m1oQs^Z8Q7_ delta 13754 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 OD$!|FBZ4D*>;6Bdn9TVA delta 27410 zcmb8YeLz&j9{<1Rz`+Gk*F*&c0YODYT@@1*bMYZjF(1Nw!otMF)B+_##XzH^qLPj_ zSl+@L-K@BUMHdJwOuJdv+r^?A6&2f3VNqdGVX6FHb9NV&>i)jp?;mgbykthCQaK#=PJf@EkyR%>6e7iID z{lN>hHY(Ppj|iUS%J9YXV6);%y*p&0GshQS3fb7hl~Kg7FI-ly;e{^iiQ(V4EPcdh zS};Wizj%Ap9K~tsCq~X)U0_l1)}4I| zZT1wxQuJjrB0AHx?ob&@CdbOobeZ^M>S9L7827-k*^3B64y#w$%f~9CsKqj`vP#8~ zX(|r0*~^J7*X=U~_A{<_r)-7$2(Kr+UhioernO65U6KQ!5c^&4yh`#D=r`X=HV zLwJmSk8Rk9L@eZ}R4vtgt4x&jiE61bIWBgXQxwN?)n+fiqdoA;}>WRSPlC9@dGs@ zR)0GFQh)PDs@?pN$>H~a*?*wLW)JwtWDn4*X9j8Jj}*IE|8QowmQGl@-a*&_tOI(; ztQq~C`Cm~u%3gOt_TX{6kLww;LbOv@r*wVRLhTIJ8U2e{@j*^+OQFT;mpaOxV)S_} zv9h<+arKcZ3vKhOshGA2y6n0l{ow3~x$fL*W||x~q|LXdGal3L zmm{-*HfW#?%>J6?!lo%-ZM$?Z%;Xr~+p~2nfi}B|QE1XTW(R4(SiyS8oNb!Xe)_>V z5n2pkG5RZWhV`{!A;-P%+3X3}3Hpz7GJJ|ZR_w(e>z{fJ&uM6&NgLe5*=BFVsqy0r z#U{t6=T^||?Qpxn|2?-D4!}R4LB_vxE&+~$qYVD%IU5`Y#~J+Uxmb8Hyx8D>oU_8I zaH_%2or?;yU2V@IAj=5&+qp0t3g7~RA3GNa7sJH{KYY#tm&4@-KXA?rpN3EC%jQnb zNxp2dCtr47O1$0w6Gh6}T5b9~!!O<*3?qX#!d4g=ycSM`k-;nBG#DAY1kQ$$!Smn) zFfusaFFwa!N&qqfrr=NmBZJ4obucn`B-{iegTvvAFfup@4)|1&GPo}s1|x%g;b<5c ztoY@`+ie6OBjAE>ynQi@3_cI1z{ucpa5{_(w!`@_GWbLIFpLa73zxyj;J4sYFf#Z= z4gn1WAS0j(ZiSJ-$6)Wzm?l4S^3!l2jEwjra5RhzJ_Ij@k->#;wU42tbBI z72F6TgO9;2Ff#aQxE)3YAA!xEGi`tF6jEwj~I0i-r-vcMW$eJVX^F0Kl5`YYc z9dH(m49NoCqU>N5UyEGB_MghmpZSa6XI-?h6;e$Y5W%6fSk-I0F;{Y6w7v!-XE)mM}8- zJlqZ=gU`W%P27e}PPW6bFf!slgjc}G;InWRj0}DYE`p14TmdHts3ZUx4ps1J7#VyF zu7{DqPs7bHGWZDG1|x$H!R9X*6JI#F5DtWq5q}RH1?TXO5wM4VI0BHtJK!W38Jq#9 z!N}l^a5jt#UJK{J$l#T55sVC80++(b;Cb+=FO(elj}Z`0Km!iQ;3;q`j0_$Rdw7#SP{C&I|!zHlmx4EBZ7zszCKxB?UcvT;B-To_LMAq4#Zl|u;n z209HPs0nI-5cCPu0wL(XkoQ+q`YTEQfr23forYp^z!(EhfQb+y@?|ImLePs)CWN3; zr~pFHlTZnSpvRy}2tfim10iTX)CeKy9;odruD{K|y`Z_70n;oacR|4rf-)g1grF_Z zYzRR&K`S5x-2iQd5VQiygAlX?It(FbK2+XJ|ML$x3p_(4g5sb?2tkveHV8puA@eyZ zdQQ>^C>TOe7-WSI6a>wN5Of8!0zyzvXfu?+l|u-66gmwd=m69NA?SX{^o@dy`R{Hp07OLQKv58avYz^4c01=T2bQD6+uaPtLCQ>+zYmV2)q-z2q7pN3iytiekbWRC=x=@El>=EpbbzWgrF2C4MNaL zC<{W+QYarn(1IMW2t?p)s1!obbf^YG(3MafgrIRyGlZZh$n-s<{Q?z02x^5&AOxL*${_@O4xNG!^fA-`A*c>& zgAnxZ2%dk;txOTE68}kLFodAjAS;BRN@zBOpkq)HgrH}jGzdXYK-mz24nzAP1RaEq zLI`>Q%BcYnxDTv{5R?nGKnU6anaA!s1v{{!33A0%0z z$RAk$A`SEf+3zJ(4z2>KE#g%I=^R0AQX9;$;7bQWs) zf%T7nz_-DRL?Y-U6#OG2;YUfwp%@53FF}hT1U(0Bh7j}=ln)`O7%G7fbO<^FA?P8f z8Oq@w@IKJHjTx#Ii3CKnQAwRzL_k4`o6K`Wo5~A;LCQZ54Ax^ zu7B@!ITig06?^Ap|Xl+94#@zr|qS z1tyaVGIAai3n6GGv;soVG$XZQ0O9rpg<_#R~EHjCFS%5 zqd^4vK?x9oyr2{aK^Ma)9zxJhP!WWn@1SxBL0>_&5P}+^CI~?vLZ;ssYrjc)HwO#^ z5%@323L)qelmH><6(|)#&_AF&2tm(7#SnsyLdPKl9f9f~1U&+^K?u^rSpNbp(ij&d z77!T?A?Pm11|jGUC>cV~?NAnkpmgW}grJR3C4`_Gp#}&+tD$xXK}lh(fBu)4kuOPH zNMsa*psS$-2thNTGzdYlP(Fm9@lXkbpi$6q2tg509fY7@s1-s`e`uQjWs1Knu{Rh4 zA*ctG03oQgN@+HkEGAQPn5nXilVr0zN&ZXndd)a{)_bf8)mE4psQTzNyM4;B%FV_} zajUP%-sn0iVi~;w(7JVE<2zli~sb3XA~nPvuE*Fco&dkGah;Uu~yc@37l88;xkK7RA3Ojkj ztdXvB`OXvirG+0=*ScGhwp2~7vwMA9%B1P(emsl&$<~(LlnEh7c2hQlAlXZK5Q1bc z6+i|0k(7v>2I|n@=WcAqBrym-IYbUa2$Dmj1VWG;BBc<5WZB0d1j(|`KnRj$*FgyC zEZZPP$cwYqiU8N;e|B4_Pdl#de!BPe2|>=5F!NT3+)t7FshRfZo+@t_7j2*GN^YNk$pDyNL25ByrD_$Nk{8%-9AyvB|cYIvbK!O!^-QqG{xlD z(_l&|uHMf(lci_Ns>`ZO{sVdcT3l_j?HEa4$sVybnu`}=r&yT$S(x-6cMWsp6p|e>uwgHg%ifv9tEiQm zbGE<9K3iXsJ<+4Q$FdW~r4XLt-{B~}*x`8O!$xlEK&yN~{l^?O+diR`~A?DFQ*34jqWSS=1Q{l`|gPEOc(NhOtYUf`}KY~U1|F3 zx8%(4%%Q*jZjMbWqwZz;z})Ft308@|GIx^8L(d)Yr>$B`zP0*$xg+U6&$j%nxVTET zXFxCca&X|DVIHZwdN-<<%IorFd)&kL$e#XMS}!kqnqIwUj;myC?}!o37BO)Pj0khT zvg>|Bl#x@Je(hd&DtSY^uy?!1_07C9sc${CsqfX{NVwphJf6DKv!B}Tyn4K=^?4~e z+H$0-u}U$I2=pxTNR@lM%(6F8*Cu^a-ZGDJKFW*H!g|Z;uHRi#T;WUZn&z?!?;7aQ z5?y^7*PCske&Vj_uKU1J=w39uSv1_Wl~*oHSG`Z2}oXYFU@756RfE0ZsQM_NoN9ge$Bc7}CMzP}%VS=2U5U%AiS zZ?ax5?~CrL%|rQqS~&%l>wWTrv@=*|^fCFN(=YOl`QlEQ-Dr!u7}=3s4beo_O}$60 zWnQZ53N`Iw*Q4K)KkiQ(&%Y1ruzogwq}F-|OQznDKkZNb67fsauf6AKEwhh&qp#c> zt{uQSppUpWUMnTGRNr#1yQ}_wZ%B}l-yLlKi96lL32H(6BFTIO!*J3CXpbYG~e)DQ2QHSEuB_E{b`d$5J42|d1G zZf9NM2#K?p9KAYoJW{aBRfF*Rhy7`ep3}!-(l6FG-S3_Xj{P`5fAjw7t{h}n4tXHS zg9;vS&*r~95Uy>u^k8}me{j6ZWBG$2Aq{(bFcDtO1m%MotIk(hk7XRA_bevf@E1Nf z*(0~lAB^!J>;BpQGj$!Q>-56?-BRx#ywWwswuR7TTvp57Iqv>U=%%Pe+u~_gj7Z7#j~u%l(kq7f6P6%WIQrJ-}hLCD~C&uE&Ibl z(ffA`#oouC8<9=P*;g#GDqNxXw6WS=6~z>P{L@BudsAxrut(pI$9{cz@fwf*d#BiQ zOETohO&)QNb)zAFz0M=f)gyf86HDFn#0Iy;{kXKm?Jw`nw@W<7-PkAH zeY^Ha&$0DUXShr=^lw`|@_X)Y*SJV|YMn>;9Z$K#&pt6g|LQ6CCSm+h&zzq*>Ml{{ z{KL`VS_y4aqK7=~UJ+#Y)~DSw$`Qg(<8fNIck{UN8MlY@-}%gNtrf3U{mExM^ZB)# z*HzCB*8=;=FW5Fd>*@9Cvz~dWr9(Zg>Z)$Ev$XRXDfRPiH2?3OaW8bELC<-{?d?Wi zccZ1x5BbwM(AJOVeEpv1M?`epRgr8ZYOCj3iy3$SJ!6uPFDVo#pdAuJP0Iu`cTS(ljlPUe42( zU>U8Y7rx|~>(?(0*NX5c()<6z?IB0e&HwPM?{oj~tZ(m%QIneQ@Uu7HVJVFDH?vu7 zfm#d-celIoO=i~`S4p2$>RT!%&vX0EC%w$0Z=uQI*k-n-SDm))XBGRi_#EO>h|jIw zQ}qz@TN^cQ)4#2V_|x$b93XcvBP*{BvIVGiTR_*IsNXT0eMNxW${wr?)v}4r)~hNz zJlgKvs;eRnR2rr-)Q~cuX+yVp|80I^ODzQX^D6w>W5x)=l05L?mYU|xGiHMtr@GOo=dDLj?>r*}Gf!Cw8a{SBn*Isu&smYSAIO)D&C9OIc zt<~XGr{8zdo$K=_*L&nM_LOI?drw9CwBz4CKrcTP>vA(@k~hY9B)aB};ab>0`Ixxl z4R^MGdBc6d=il&rv|9Sl;o59`XY0HF>3Qkz{?mQw%A3=)G(6Ju_&0~Sb_TK&PkJ1s z6bw{3>)P|Cdq-icg>R1ZsMDy^!?jv+snwUA_AKX_)9!L)gM5cqD_*U7&|98fx4h-) z^}<`jHUB_4P(JDAHQ{Zy*V?zIX;FAY=|`}fv!VTM&)IP5zvg???y-Nl=h*ZA+7v#U zl(Pd1t2!J_b)7c`d+mR6J0ugAtnWTkb!`e(N?`iSKAgU#266x%nDO!`dvS;S{x}^@ z58POJ{&;$&_1H}7(n^!#Z-0~LU*XK5&b6%jvuQpl^7VWE9j{des?4AN`S%i!`b~Z3 z%1~!{X6rFd_-yt%O0Nr)#Am+PjrxP{xSzUYOMd;1`-&tj{g3-tX_jYY<(`r|hPc(TB@IhbP=n6NQ`3sNX9VzYCtKREYvnN_SH>iH!26L#yk&Zt4 zThHlx>$mQfKJx7}pLXihK1l!kThE2y%J1ARvTJsJ#}0q6+~Gg@ox4M1_^;o&cezWx z_q^-h`F@D28_s|K$3wv$9(SnB<@(m0E^jF3W={Wm4>9@Aqq$-!Gj?!?W5Pe&Pk+n* zA(#HTr)+Xpg*eb|GWkzri&650djlX(Ek^y1y<_5FPSFMr;)Kpp+_m*Ec2K)aj)#kF zdd7K=fwo4)E1g=TQ;Tu0%cb2lvU<+8?^jeLr{%Z~fOF zuAJf=Msh}PtTOwXExd8(N|3eIcpsC(?2e$WGK%mh(l`F-&iUAn?!G(!qsKMsGutL~ zwZHyAn`M}5(0Xjux*y_Kl5?egvduk=WiJl-$#ZtP<0sGY^Ln?qp+CFhmi*jp)cic( zqaG7}aeJ-(rE>!M#nb<)cK7I$q;aTkKz@8dWzv9Sj~TeaLelxI7? z``jyK=Wl8Bj0*!JY6q+K+QECPeOLvZYhtcPt2S}%P5QGJ+b=G|4Z=Soemw)qYwadSG_P~u7JJ%H1z85{?dSCKPxAc-{ z-@niqXTRj`IoV3rU3PmNx$L=+{Ms2Vy;gO2=KNSU`n=;AXFDG(R9t(%gRdzbFA`q* zP8p?i4I(i?Rb07=wW<=NMF+E^7dfgDswHA3iYHVhe6aKJrM5~A1E(#2T$hGJn)pmr z1`qo`-4FTnO1=p7Qao-5vD3?4wp?n&t6qxx@+A)O?iPEacemKry_KPVTIyJ4Mdt(4 zOnYT8`#9mNDG^!&6=)FSHN~TEM+|yco-vplk*3bE*SWXw>OKdHcQoa>X#pX85D~JM zBs&iVgw3^@ZsJQZ!XiVq5|)0@&lMI!Sd0;N(?Q-khOn6x6+X&BEfF(O`1Zg|#Y`2e zdnl{5Ow3GC-9uRrkssn~&ktE?o%ZDqm*h+K0-_2+EEA@F^}{8O^Pv4=q*)0cT}~0@ zAv1Z+bM63p+W#?|pTX-)#cgJ#ukxo0a@Y`Fn~KMM71zxwzV%fmE$g~Jub?%PhnNtj zj5l%0__X^G^Z3(phM)3iUn-e}N0!Uu?x*?siC-~xIG%mF6_2P#U2Q9F_f!6GQ;HLQ z%5?V@fK#7b_sP2G+f$jW@uR=udg2u!y%^=jwTk#&O8@a@9L%9z2N*?TI){bxKkN2SB-QJ4FdM1YSQKAPI z;8;L)14Fxta9Lt~A0=XK2@WNpGwo$uR~e4)d(=3l^UC>p!sT}gzf<`AePUOJVH`m? zTdVt%R~>2U#JN7oELV4ow|(rsoK+qYZn1AV*2zS~zBu9?DQ*I(-E z9uUTSv-FB?jt^gfV=#`v;=~nhN1^oVR+ClzaEiexM%>lU?PTQkQNM1v4GF+;F^-GH zynt?wj|Fsd{5+sr?PvB^u3p{MM(ykNSIfI%%9Hc$jcnE%<(iOswx#uHTd;h`BhaeoNMsQxe4$A_<+GL1O`ekNCb zRdpObZt!1o7@WCT2vE5E90huaOlH&=dD#1gdYRPh}}WTvva%J#5a&lHiIcWOs)i7m2+{?8M7q)#1i6vEp(VvFjchO{_P0c}H|OA}?F3#~ZQpE?bFBdMKFK0Ad3~ zcre?PV9a1KLz7izCia`c7l})=#mZWQbN$FNf z3Q0;xQX)o1C=QMnTMGtbZM4gmWZ#Uc?$ECm^K`<5wlS|C{6DX3?Jc;W*BCem^?yRpv7UviG3s3 zPb6U`iIXFkkkc{Kg;$g^MJvKA67f;Wc&!w(RNNj#vP#TK@n#g6HDNZ1!6PxvQS1@K ztyDdW}fuu=5sD3e1Ne+)wY zQI6xrAA{Jn&t|t0XBB71vptN%WE_pBfs-(kMEnFAcr)f^v3r6N5mA7Nc;)0gt}r=f zn;NO3*FO2myoA^iadLvP*5?$3pBiO+t!s*A2NB&h%XyDxsEwA>_#NBix)KZr8@zp+ zTvuY@Sc7lbCfAijIMLvnw#juR1x_*e`fYMu$%HcvzHXabSMuR}gRj|UtSg5JIBW!5 zy-ltwWpJ6nS8bE)$|?Ai!B=jR>qkW?DDzC5wZZSA)tGq%J`I*MZ z^nqLD6$Zco23xkuD~y7p3^s2yt}u>(I3vKcRbJs@c(K9l8S)BK;Z%cLGvpO!!C3}3 zXUHoofD6QtE0yr8YcXrbbU2ba?f`% z&z2GdwOwYF!sp@`VVLVD?e!sm<^&LmYsJQW|{atmJ!uDmcz!eMtetFnLeyt?QI=LuZ)xJm6k5sI{{8G zI3-=ScPgA}@QQTV-dS*#!Hd&ndl$e31}CJ;_AZ8t4YsAr_AZCZ4USDW+WRyCr;Pw> zx@_+TxWVA4blKjmaI3*#>9W1Osj#=z=+Jc8-hptSh@YwyYRQ<%;)AKm=$zQ`4E*t3 zmz7Rbx>df(`R%e?FlB>>b(GQIZ|$8;E=9x_8S&p-uBkp@#9KOQh_Bi!pDSvJuQB33 zzFb><)`&NC)Dr*n-bmt`iElRI|8<$$d4S>2dRgAjhxP{GV4*@5A*LxSwM5KB@zXTr zHZ2!3SKJy$R~BIwiTmQ{;8M&|@w_xoVV)B2#nHjdn9bsX4E3Hs8;FqU^mPnojF>l_ z&_v9{iY?QXb6#39cCuI}r*AyvirYwv5~?JNpcL#^B)1 zva_4vW`hGZ%g(+CUo_Z%v+QgO`B^5)^xm6gXGg-324CDHJ3AJRHMnh)(bjlZ`7%h*h+EiYGvRIchj2v7hAZOiD)pg7q0Bv2x+_0*<8*RI3=7d5HML~g6lDt znaVbqPuawbx$II`V6G5r<|-R}vL^EsG1(Z$<*{67Y}Yuh#H(_$9EW2!%5hu^*BU&0 zqa4RAaErl1Hp+2qBE2bA`VZJB$8i80U~un^avVp&Q3m^Ll;b!Kjx+djnlX+S6R_9_ z_&H6E<5W1+;P2ApIL?Bz4E{1rj^hHjz~E2Q`sn|WA?rp}YS-dn~nH3r^jfS5#%5J{suJ-YR&T8AH@fnX8 zxB&kwoU+8C1xiT2?iYQSh{Gah0d+o&`)P3qcb|)dUYsW0U7(EBg5%`;w58K*T7)Fd8U$e!6WozW&*vG#TFSFa22g3 zp1wvAn(Zn%o6T9Ij2>4+Xwg;tM2Mi$t2hi@zw_@F9dU3M%nPV8!pp9jdc=m8Tw)$y zq>Sj*h}lS@A|i__-dm(BP(n>JsOOAPcK^=Kc={o;{}5&;^9=qPo0z^t*&Sk?!LR>j z@F($jHTTi2{$Zo+-njGO1L3LSgC!hm?#Fw-P?oYCuOZ7Cv1F+-X0X}D8xfnl^tD@^ zzW^Fc<@^cd*<-0Pw_hS=qD_7b)wIrLPqN89^N&lFDU;k6xEY7dHj`uZx~>ZhC69E% z(`{Y7=Df_c*Ydz)w264>S|!w{46ibqXiZWEh}LVBFs+3W*or3cfMbrQZenc`DdI5W z#7jxaB<(onaTz*L_$*U~YNuw(wRp@jC4SV!nX3KbOq<=G(csT$a1W+}8@mRR_bh(0 zI?Gw$bIX)CEn${wPY~ZPqrkjba$rrnP8k+nOla{eo4u5v(php~IWx5$V?rmaTX0)E5A;O^D)gdBIB;(wv`H*k!6RSb9J!U!SMbQf-*x0c@Z1V=NF_8?3|^^h z)UpZ97Wb@F_Gk@+Hi$l}*v~X!Hi<2(DA;s0KcNu%DrK!U`)c{R;le5kE+Vu@%vjCy zZXKa@B4;(XY}?iR5k_%nwGuJdI+sB;ce!=u201=rH!ub8hAn2UJXHQ*HP6ObbLAA! zKUuj!tHigmVn?zvP4Q{QZk}r_36b;Idd%xu5~32A!V}~af93UZNwC2-gU4PkmxN?E z+2G;V%OxQlPB(bS^>RtbgYyg?aJ^g-ir^xHdtWb?gi^TFV4v%aC836Z8YAHH8o4CY z!F2}zyhbhw&2Y29->s2L!bSL^!C$VCOM-<9u!twGSH2HQ!bFZe%WC;KVy?gO^E$#( z#oupGW{lWBk2lIh2W>R@`!W6xzz62-Ji^N0Shl8T7~5qcEeyqc@US0%n4^ zbR#{IiJ2*;ts~!J%wn-+9k2SDFq_1q>*#;W0=bwesmfq27Bg0arz*R&^;QD)HWWCH&etBI*{H9KWs1t}l*^jjSq0Zd67quDn*>%nh7M2C3qyn^|cJFbl*7H!IU7mtdAG>~M^|AfG+u zodW$mJr=8IDg`#DPa+PMfMotCeZc)~2ahP%9&@BwH*_gA%$G0$oYOaxM zL(r|t`iO>WRC~iU?ZsUa>Aq#oi8P2+xrH<>;>fMa9L=^!?h3xSl_tzwBnMzby7Eo` z0zwNG@e%mXX8$1CtYi@{i9|#OUads6iq#p6LepYdpWlDRWWO4@IE6JZY4YKC9<>b+Ny+xM=xPNv81cUKV3VN zeT2nV)_BDdJ}?q*Y^A7D+)72CZ6t0aaif^KO$pJwm$Ej9joVl){gVL}g!W83N0N_;CTzTK{bDq0;L zb)s*UvMk(^#J!xBwa0`wL;saOdHWoy7r{0M>-q>&O49AIvmr^H!^TvxUp|o zVHNY_GC5Cf*hM47V#bQ6cPS%>Ij2nbMpE{K$&oy_rn-jdGr+?B7}w3>mtB-rj#)0^ zvz7S4&f7rFn=f8dTwP4#%Bi*3ZMAls6&^i@Dkj@0XOOFnGsv57 z`2D*uca_Sz>K+wp3@PA<;x zERc({g?P(y$^Tp+7w2d=+Td3g$i>+P+YJ840=YOR!AS-`w?Hn=X>gjse_J3I=WICJ z;Kvpii}QX0_8S2YFOZ9K30z|E0}JHhTnSeieD?ymIG=&f7<|V9xi~k%jpDXDmC1dY zIXr0QS9APAKw6^uPG$7y-vt_H3qcl>V`#YZE!fQ~&9ryq3OQW*=5fNGjLDstr;PcZ zX+P#wn0$j4VWce}L4kNYj~Sy3vrN2|$8BDZSudvD#dI3HQa{CKVSXR-ot2!KuFUgx(zQelhlDwJolFj^dM}D*sg-2Ay z8~c=Hfm+QfKjyE{V$Lm{X3!DknA5EI&k-fWPqVG^wc9GrKdXG@qvc}fR($e;@}DbQ zKF8kRmepG5mX?aU{-uof)@oLhV@36Ul!1yX{DWHME4O{}T_yf1%{$r5T}&T0@=iUEX(vhljD?`4X87Q{}Lm-!qh3gCCRtE(1QX?D&~Z# zJ5=p7RX<&Ea;Vx%(H3v_=S1rL2z8UT0&|6!6RAG09Z%-?z2ZWodQR1%*6?@e#aAQL zeG#=JtW7qVHXd4hNHKc_^xDi{4S#>SXn@!0H2YG*& z>^s47UE!)F2hBXiQ0H9hUtHJhw&q+V@LSYt}lVtkmOcZ^iO_t%ov z@RzeHwp^)diZ=VEUhGJ2pR7*SRuH_R;>F48`-+xEX=xSrPf^4D`giq%XD^(brB-7feO&30xt(t$*r5c?S2H3GY&Qc3wyT95j$gl$f2QNq z_Qi)<%fbq+$IOLQ&&e(L-{-4yv^H{R6Ti$?pPdqXyG#>&yG(NnX+ElY<+*r!-0ke8 zZkK7VB;_dLQofpR4|u_5ui5U$f90O);|1!5pkyO?GRb|zekqfM@FJeXSz>jfx~a#3 z+hz3*RQx+py{m_oy^fzniRDS^L`=D=JeZ_bXd&xO_7JgPnL0uXTQ9%Rx_z1Yv2Vos z3+ud6%=QSe`a1RCjEU<_{)&C#dX}`*dwlYH%(jnN?~NiS+%Ul>#p{-3DFK_;u1z>( zHi!4~-MnPNLi>pION%VCBJ2xIz3d~zxaI0AJtNlpZkDyfqIQYkNU z%MI#6tzf;GY4f!k)Jd4W_JWEFH>fwL+AjQei8VK>E46&gd{KR)8srN7@J4l(%M4$q zzUVY7K3u2n^498buB%v?rUofmJ^9s(+c&BYY7LkTqUX(O2&Q~49&@ugY)htD9eHriL8Skysx^;cu*(^*MsMQWJuX7eF0hWmWT5A~hBgjvTzEUyf1 zR#%3G-Bj~D|3itJf+p-;75mkD9S6VY=t$siDJ-;G8NOE0XOlWuvy#?YF>aH(TkR7| zaO_PQGt4xsX`*_I8m>*pVS0sqi@L!_E6(t<7gsFIRI3#2`0eth?zvr^zorix#lRhO&18n>C4y#sk?Adl-;Kc|L-Hg4nls%;!d zWO5*pdGD$v#pcC6VZNz0yLpFv=`WsBBV6e$r1K)(`Lh3ubY9P^s|QE!7)a@nJAABs zi2u?o3i{`gp@sjyxg;2+$5XmIBYWw2H9R~TGkV7y@_6%v{P({n7Ftg%k-6Pi+?Cg) zKVC_v?r>cs<_rTX}D@jZ?5~vf)oJ@uJ~- zr0~4O6{m?4$JEi2GIxAlB}Y)^jt<9~a?6DNs|WCDL2FsO-A0To#kRxO6;k91DH7o? zsPFYCs8O_9yhr(5Ccn!m z6=8k7y}Wv*nZ1-$v>BxfYk>D?tr)XJqy%{9Xi;V_HCi+Ucwgh=lWg|#NvVkK@BN6< zTRBWbB+5p)6^#SDKl1YNZ8dxOwuzcS<-&ik_aL9431+XM zi6VNi_o$qR60=tX`3wu-zxYJtqgqst>dan|{5P_V_+a=bb|yN2U4Zr@X%`{t8&QhN zQ6)N#YS1Zk8l6GZC!!HGp=Q)#7Vi)CzFW&8&uozr?9EGE%)=r(*n8S^yd&|B#5)r2 z$QIO!+R;U7WJ2D^jQo)W1)9C036J&`ZNW71m}0Znm=X~g;yr56Sn?Z7eq+gREcuNk zKWj9yiZmHNKGy6tJ`UN?Y?NU3nplR)MJe$b zh{MiVMY>ffC>4=@)nc>)WutVIiLy`Cz9i^f?RDkjk7rV6>m7=4l9PLL3P!TFYWvCJz7X@M7LE`UW-ZMv1 f@XpyN36bZ{OhmprNwzUoz9dzn^e}8=7dA;Yk&2yh;F1vM4 zy90aL^}XZ92`Q2!1!GB4i;x>m2~(Wow0eBh2Yg7GHmR;-kfBRy z!jCr=;r4}emdi2oym3hG+Aj>>=J-NF&vY`48Z6sE6fNK%~*JrFM02RHXqSix^ zv3Dt(${~i@YExdzU4_i%G+?II=jsum%kA;j)&Rw56rB7NkXamA4C z;b&wm{ERY5PF4nrMpsiFl3r6$Q?6WoqVqT{j>?YP`Q{Z51=-TvvX*Wg;?Uip6e91*;ovy{N46{Q5OBXFv_4W{I0R)nWHD(q>=74d0l6;fJd#iGc{ z@)^J>p-Fa)fUR@hc%Ua`U@A0hE5ncaS(GmuZ=?6qkkHmf z#hjj!f8FuwrVHK1X-O1H($1wFX32w%mYdm5)-v0T(E7Fu!esX^y^MAsO5CB%Z!KZI zrnK|2j-y)mn%}gmd*Y&fIkT^h@oBI6U0+|_Gp4X>8(LrTdTFE-dUg2UMC**{JlNNi z=X9PIYSW9~`B|?SoUBBJ4T?_WWF>8l^MU9--lIFWMSt7E<}Jmi`c958m-CeTAE}4N zISmzME?-ISJl}Uz(3K}CoRg=;@T0q&lVgY59Q6zeJJ-g(ZL_7-w$ajd-ZJ=Z+3R$^ zcWq2|Zj`L$M%ndNwsL`zU%J~>mWUEiH=$NuqP~k-b&2{NYK=)%CWWL&>TxUilU)tF z<%)}94;%RId~ryrhzcBXt{BpBjyVe>h<36oxng#}k1xxj4F{r(Bsrt4=9u(w^l)D` z@&dZ^&mmiUrLrY{OHfP?noo~2iZic#9RGzoxiro1&MVC{+&h;J9U$9!oRPF1J6|2P zH^`>rQcA1Q>(qN> z=RIR;lo-7N>&@f6cQ*14QC@c{HJj>OdTSq>-UFOlZf&yJ`$?MJ`O0mbd!_!)(ceW3 zQd+#nb3saT>>d=AP&`7*?H7bOv?3Z`k@M%;cd$t zS{1&loEv9!?O({aQ|NA+@6a01Fn3}L*Y4u7Xy&E6TDZz&w>x}Cq(cktFJaEQ8C`B2 zh7)r~wW!>^SNC{hi%LB1qr>T^T`P*u*_c@?N6+U0Xr+0o6MX&^) z%ka6(IWx86_1;1h`fT(Pbjd%eKV zh!}>TA4Nav{5rL(Ei6{j!kp(*BgQ7-N{W@;uLesL-*Z=sA{m1=25ob22wL9Nj{>QXf{c9Sxa)RpViei z0oMd)#jJ_86kI9J%hM7&d3`JSioH#GZ!KMKXwx}5-8na{&y|65UrhXqoyBP#ZMx=s zJFR!K&Dy)e6zcWiaOJ-hqRJ%q>H zgQS`Ytvr(O)1?|>|GdLE7A<1o!s63Cy^TXVfKSZ5@+Ue5?kZ>JI~LiZ2gq8qGyjfW z+35qR-+@L4bZ8j^B+9GyRwli?z`Nay$EF>onds`I~P2fQENuk*j; zc(@v_*7-Hr4%fr=I=>`GM>?iy5*d&NiUgmRBk>Rhhv~dd4u_-RXq}&y6?hmtOy@`C z5I7l5*7;%CICW5$#C!>S(wga;Vv+yb7GssY%LA}(}e^)jDazo2f(Q?rgIEDAI5Z!f^%U^ z=T2}DjOpAK-U?$nw}yAYn9g#W>_qJV0;UURS#wmwn9e8QIvCUW2e=W&bk<-cP8O!~ zmv9dl)A>F(h)FSD2KCPOy?c&8W_`g8|;EHor~dJFsAc*xEjWE z&WF#zn9h&G;e%Pi4)${P3WPWWO!x2roD5?+FM{X8n9g^@%V13B+3*?|)A?4o2*z}t z3~z@qoyWolU`%lKcZmqK2$=360d9mbod>|7*UG|lj)5a#Oy?*#4#sru1Si9o&TZlO zFs5^BI0weyZ0S20p#TBXJ)8}p(ZHC_C*VCWrt=T*F&NWXgHOVk&R@dH5Zc5LFCT%U zVN5@M5FQ3&_J(Y_*;gr2M=XzAL`}Va43xF$8UurVNB=Aa2$;3JQkiXRL&NE zbRiKT9S@k!32+vS={x{l17kYJz*}KV=O}m&jOpA7J_=(xw}tCrOy|~cd+#=+fC9fUzUp>q%hZHL0HmxVzuLVY0&dLD8>7^Ffe5C-Kz84w0N4lTQ$^IxXp zN-&Ru7zZDMN+1kc43$9`v;aB;VbEPr4TM3nppy^=O@~5npiSH$Xfo6T!k}@`up6j< z{(vLF6b@q0Fen4Upux~G2!r}Vc@PHmf=VC^iiFA_4C(|Of-tBZR0CnqWzb0|n?GPM z7&@Gs4i|L3Cpm>M=rj}$VbHJ81PFubpbQ9uG-w%wL0>_65C(k)l|UGD2r7fhvUPk9 ztO79({u`=;Fz7Al9E3rokm6uua|qf7MMD_02^t1r&;}?O!k_|ZK7>I}L93zFj%C>08aFlZWNhcM_SC<(&E_&*w) z4q}i4nh#-60<;>!pn*^cgh73vT@VKKfc8Te)D=1kVbE1j9fUzwLgye%%zq(Z*a*7Q z2ysw`><|Y1(Sss|Fz9z^41_`T&~ylczK7Bw4EisW31QF|&>9GXs-PkW6Z8K;a65=` z@Lgy>gh3V1F$jZpK_?*$dKC&CNs}EZ=p`r;!k`zRI0%CZp)n8!pF9u)-{)Wn zghB5>We^6HL5Cm=+5sJdFz98d0m7ioQ1FdRV>b#ag2EvTS_|1B40;;M9s^?FV_+JD zK{?Q32!kGgRznzcFXVzSXdbi&!k~1h3c{e7P%VT(H$x{O44MQ<*`sL~qXmuuLm>=G zgt|Z&bREsF(&~oS~gh5N7dI*CSLc!xGi*bT7phyUVW<$du47v?Ug)nF;lmq2t>o@@{0Wl7a zg7!cdbOTfcVbBn$2ErgabPmFx7$|%^ZGF6;ZcrSAL7kyw2!q0)`Oy6F`uuk}xEjPb z*b*v%FsLbtb^&2fBUA%n&_u|CuQ06{rh@K_yT;gh3mj6bOUXL75OH=D%maH6X^p z)zDT5gH}KXAPjmCs)I1-J}BfSSr{}QiiR-gPACb&pxdD|2!n2cav)61f61T=#5gz> zs)R6T1XKfI&`>CN5{+$=pg5=pghBnFBnX49fzlxiihyz<3<`&eAPmZG3+@6junklN zVNeUG4#J>wktCl?^2vfuL6Hy!{Q?bxFz7fm9m1d*Xg-8NUqY)P4Ei)1bb%Q75mW|Y z(0-^2!l1XIdI*F51%*y#w45yHbtoFbpsi36gh9nnDuhALLCYWvaz--$6@eJIhJ(8x z40;4Q0AbL>P%VT(OCf0rO>c^zOsETlL3cwA2!rl`(jg3*0p&m#loHAOR{&z*L=Kih z7<4041!2%|r~$&Dcu1MbI5$<$0H`m7LA{|Q2!pyqsSpNrfwCYB>HrNb05R|ia1Vq* zt)MChgBr?>hZG`tNP&Ipne1CT-^+@%EoP5Qn zHku3I0-gJw78}i_aH-BcPK%A^{qTOByPOsq&DC(V&S9s;Msqz}uXE^WvC%A%o-|9u zAAFjP=4>qtAxsy}oe~?((QvfRCr^ou=3($Ko$F7Djpk%HS?AhQVxu`7PS^R^DPyCV z-G29p^F|2P+jVNg+HF!G3jaR2wW( zd+uRzGr>za+T?wCrQ@`8Dj@xg#H}9RjT-0Jhq|{7R0h-R8J025=+q5<~;aN*KBW0in9l|8@#t)#LbJ=;bpEScj|?Z&|oDbt%|#Z zf%q70Vi;{=y!Sk(isuE>czdqDx+EPfJ2bqkGPXuQy!(oH-&^mIqzK7 z>-xr7Y*Wk<4NvjNTi(vVUS2W1;QYab}EEH{KPY3?iE1{KQk2qlRVJl}$_-yt*%9zlhf=2|o0ROhLP?7& z%ri*^C`dE>&GZ4?R z?2UBejmajd@AHz@_xU`N67~W;?}aLplHuYmlS}a^rcyhKb`-6xNplr5x)dv(b|x)# zi=?G)Q9SK+ExV0gh+!s=(pCz6tK#Wk(vr}U(5^CR)6u4*bu?-F(e|T-o3t)3 zbK~)4#nZ{8Wn?2}AYN?}yS#$OR}@cYla_{-hStTT6>gWb!tIKut4TYCb`0$wCT-ZO zj7+a8o(PkcgO-Dq9cdD45Ni;lOj_Y1NWZUgt*O>x!qlN$XNdrb`u150iEh z?Ic=HljhhVX^tI==Nhk;trvgz88hMKgKXeZHz znY6`kbG!R(#dEz$JBfA@?FN&U{%^+Fe=DBhChge2rEKjOqQfL6zr(!wj^ar)X?xK2 zpp7tT(Ur` zw9I#DT<#6i=F8WN~+d#&tyT%r*;#q9ca_b3PuXye^Y1L@eXiH4m zp`Rt~(9eozsYwetPL&*2JXt2K7OnPpw&HofB*xd#b?Ow)gC;HP2bLc{D4vH*TI4U1 z7Ws?fS!U8sqMbxrZqmm5N`w1V@jPtOx->9THZb)HE!$W886=WHA~`0H(Ld4%e^fjx zOxiNEWoRo++AvCM7^St!q-BywCW+*lwCEGWcS7+zV$!k~BQ8dK)Fk%(jV0J`isvzt zmW7suw%Vk{ouWsaQaq2Fv@EnNv?om3{L{3f(~9RwlU9mWdRoc$tTBo9Gc=?#isvbl zwisRaE z184;%t@=C-?!4kzYtkAoF!)?hJnKwaWs{^;HYpy}r1g+kj!TNC(4?)&MqGoq-Xxwx zJBjw3NlTN-psaW{n6z57TC^gQ);EZ%3sO8AO;M#1``r62hP4SeNwC!ly(O&dw-t}JtVguq! zCXewgsn3>*XNyTILMuYsYSL=aYSFftwCQaaZrdoHmrdH3R&>Qyisu!RmUD!9an5#7D0LjFcuGxL*;O>cs}#=;lXepAB-$JL zAmAGVQaWEeGviCan&w4(%}nFZTJh{QX=~8dpjDW(($4hb&WdM`Nn0I3n~6|7Z=19Rv<9?) zo3yw{)_-x4isv1ZxGR!X4qBy2OO7JfQHp1;N!#CzrFJ*P^R7v=cW3hLs&j%*WaSiK*YZT7`leQXdHQGUwwjXUj z+J`1BuNM!3+*$LR)bc9cGRRL_2o*quj2XK zq^(9K^NmUKKJ2M@{_EFR|J4p;02!!wzV(YN$>Ufs#3`N{lU9gU zh^Cpe9@o;}uT?zXnY3MKyU^SwZT}G3!Vtw%Ytnke6E-_u@qBL*GY~V-JSOb`+5xoV zCM`69wveEB>P%W1S{m99Caq{FBj!-W^P@>CO{B{vDxROv{OiBe5sZW*6i>a$UNh?JwMf<~~DJfjjrzoC3O+If=}K8?+eX$mhknAU%V zh=qtvCXdI^j-g3nqt`b_q~1(5-K=7tmf%JS|LGQNo$*q zn2u;OMCWJuv462;zqii3WuL>YW)6>z-}IxyyN&N0@@%hI^Zv4{Klg9?kI;6d1!0Y@ zhEmzy#=e_9_3r*KPdz)pwj8#)fsfeB&7RZHUb=TXI*_87Dh)?Vw9D?krw=pG}Y3*=b#DcW)}D z6Z5C?@87A@nQgRO=e%`2t>RgCi-p=+onxUcS0~42ab{Vwo7|4`P42M6HQbj8x7U=j zEnUyHbo~gbAqZ}P34m;Yvz?27e+{wC%SV(#&Ohm~-cbo}B`1 zj9Zz$u267CkXGP4v7w_)F9GM}MSX?@{582390;)+wKY;ZdPfUPbesV@g6x;+Jz?PY z#@Q?^>gUT%aZ#^cfx74wX_R{iT`G`vmpMVa`SNR#k@jU9V=U@*)W&QJ_4AE0+a}Fn z_@2|`zTyvG{LYcjTb1Wy&rcff&5gJr)JG{U=iQQ!Uff0soM~}+;4G8pw9u00e1R|H zJUjBn$(L^9JfmK)YLyFKxZbvg9IbJ_{z8I9j?caj>nojpu8zLa5#`~Fm3xj`=g>mt zd`Al@{KZIXo-5YpH}Lv(Fn2bMyqo&6bFVA0&wg^SpE7x=(RUY*8&<9V!hgTw@xB}_ zFOKTiy!D8dbCkG_I^Qg|D$}#YgGUEy*fY(= z_a|4mn9ilXb7M)=`0zWKQ|@eX-}R$-KP!@Q ze)7js%K5I75^?QYJC3kvgiX^^PND55L&;~_=I50wlM<8L4iqmT+V7N^k6ORj-KHOP z4tTM>aa)zLUPFE_4khL!y+rDGmX6R9?v&gw*90{0I3u|WxZf_h?_S%$SddD}sb@Oo zUm9E6{1IBlok5thJjdJnocmtve5E%;J0pbi=NCJg^3|7od404ud|Y&1)9ZM~qmCCg zi97dB@3h~ZKAmWh(>{7mrL~VmO76jHC0@dGP_o|Aed>oA{r$8i_Z!YtFSWI$a3(3v z^)E#jxp5k;QMApGrg_Ch*|_ffkusS6lhMMP+*5uq?y4{Sp@G_(!Ymx9;XxL)WG?SY z;;f{+Kl;{jg})N?0(Xwu5^K{Vaz3zS_{_iVs4ahz+_$GoT*WoHcm2no`DUkKo*s{q zu8HXaL3jTT>~fBl2n&g)Kr|PXhXBm8@toJwU0%(h;0d` zjx&ma@%o;(t(ULpMfWc)-&@|+9%2u4oRLg)EwIsA!=0@#JJVJ}X`;}CG_J0Fa z@y&7X#}%5~L3LGB#WyGV_@^x~ZS+t?>`m@BcQ?7e-7WI`M)|(-(OOcM`c}*%H!v4nP>*lv}}!LM4ab=JOW<@ZZVzX`7mwH(2vxjgkWx0^OzqN0x*Ip6r& zD2tN+{k3WTGmZ}aI2OGg)z4d6inGamwydf`bX_rn%)9i(9m1iub`P9|H?Rf z+YYPtGjWGi>Kk?>4hW=v_5VzL52^2QUjBx$nu~eEDy>D9YWW*eEo!CfPOBL1+-c?a z;LZrk)_#swaBl7uH)S&i8ST*A%dS>FE%%j*SUYDhMrBCuo&PaP zYC(C&u|}ViLdPki?KyLs+&Mf(WEERy(_DRsxDI8Ax%#+f#CEv6tHlbrK0{pl%eyj8Pd@RG1@N8mE7On=Fk+fuQ(U%>1ykN ztB3QMJsl&A*o+huXNyS5z2#OTruX*r`kM`f`8B?9&MV*UXL0ru-(F~;9=22`{(F{% z-?#rg*Fqiqj@6dLws&S&`0Y?>rLL&7iuY`#)vz;juT@ugaj%u%*6&*Ro&2s~<7_oN!pyTMk zAd$Q1>5*wG|O-k#pMttAX~EWvGOMv9|q$+V5O&&?;2B=4+~rl4JDc?sX1%lcqxQaGzWk%EQAVSa<^^feyg-w?=djV_&U|Dw z!zUiH>iXLbjc3=d4J9HPwcFIFGl)OKdF5eaB@%PEr^WnLIFDU^=beYG8qv1H<1Iq$ zBE&A|Wgic==xmcewhD2G5Qm&QEkm5O3{gvnTIY;UtkNj{WPGzLm1$e7u2gRS$SBQ@ zRaWPHjug&0r&d{|u)fNCN$HD+6-L;6cBAHZ(?)PTajUV)=-=d?dQ|KQh%eP;9j)QQ zaq54K7V5oh3^d^Wg%`IzbNh|?!bq#hIsAxK`&)5jP=dZkKU2vckQNfstyxPpLi0uo zIh{^UZziW-d~TG)&qsP$4&vs^`%*%d&Tqr8^|C+Q=ufRm>8Vex+T*EDXUz7tN2?*? zy3dW0iPSPLh|g&?l$N<#rv))=xNb6z1(rZ9t%nWgj?b*7wzfyDTJf}_R({{K^n3Q` zSkn~onW;A&ogbtfoiFx-#SJ5|b5wf3DA)Tww<@3V&#iKE{&TBRyYoM{TJ)w*{xiz* zdPG^k>of}k*L8F?7`MU>?ZRDW8C(PG5c61i_gXw0tYkN!`GFeuP^QqfWuw4)_I z{ehu2x$CRE->PhKw>?tHvHGt9^(BRFRHW=QIW4nd1p{r(T}|#SoBfBI?Ip$jWriY~ zWhnBJ40R*X8%-H1sWSF!4pxc%ngJzW%`k1)*cs=I-1C|T=ajpkn>LmnvHDY^)Sj$P zNC=Fc;z}&De1++1tZG3^t!jbT%?Vsf|Mb2Q`h4|}znKoleA+nY?3~JqBfgoZe$)SN zfs{5YkkU&Ez3hpyiX$q zg|xngE0{p#1XgQF_XKH4_eA2y+ZjhNc#M9}sOl#7iyw;{4PrR{@MCeK;l=80+-O)v z?lAWaEyR~_^U6c)@o933lpWeU8Kdb}@lW{MhJP_kJw8*2L<`k$EgFK6^bR zG^*JU|Ezzp!h1mrc`s<8q56_gnQl;@wvmsK6TW`4McqI3-j3h*w~zk9ODJ4y1yE=zxl@cK1miQ zlC?01@$7B?vODU(gGMITwb7F6l>GQmaWR_$rRdbWNQ{%`#a!YkT=*67tn|mD{x^24 z5t6$NdW>y($L-$S5WA!NfFq54JFDYYaNN%E))Qa(q@ z=N7gjE%2Abxmxu)V_L`4nb^tY#wDSbejmYGq%qq$d<<*G~K`23Ox6O{OO|2#ss>bkaz__YLNx`CNj~kn}nOo_y zUU5*2)v2Fd6-l?emu`9Oy$sq1#Z^T(^UJ*lYdAddGq&CIyWV1D-GNcSOWwQQg#;^f z_Bn3#e++H;bvVb+{OtyyNTWA7lRJ{9it3 zK7aK`tF%A=afr=M+IDB#p8{!r{^!MMAGsv$89)79+L6uDe&r{tw14<%a6$@cr`*@% z{ui5RT6r|B>g)GKtNK@!Ecyx=PmWI%pzhwd9psyx4^V& z1PILG#R%t%)%ix3p(k!3^?s-ql5TXQ}?}-`Wo=+rqtwRd!Wh#MSauXpgRP@{& z|HYU`+y5H#HzkmCNp9x;YL%PfUkBUD$W58^>t6#Uka^ae=9LXbnnN4@F3r;SFD`*+ z8m!Vh*br;0A6a@;TbOxCu8v%itMR}6U9PsiXU^4z->h<5KAD;gTd4W!|Obl+DeTOPdx5U&c|>QqVt>w{uPn zoQm_v$qsY9F@1VbOyB7-HILmqhqqHq>1_IJ)5Si$>4c<MHce zDFz!FLax(x+T0M#Hy2B22qiRx8_ELnchO#BskwKrXv#$&g#{YI>ERZO;rC8krQiBY ztgV{#tDV=MvAlLZV-@N!p-vL&q*HFR3N^9ODpY8eqsTOBb ze%5L$E9#F22KOa}zW2{&+5Y86{uL9CMU-@MXh|Hy*vuG%Ys~!$t_ip%?EK`97IM_| z1w7@lK-t|=e6r$xK3Q>p+ugmj)lKSce3uALbN>EkPg@oNvYcJdC0N{pAEB+jKZq~B zEIemChw$XN!HI#ZHgREH_hN|s?A*Zfo(Jx4p&hv2n@* zi81!>Lze_;p-Te(#g&Ng{f^)FwDYk%0l-Zv=i}#N`x)V)2^Vb&SHp7}M%bnPu-~7z zs?Y%!hDUfyC&WIPogs&ox`Ze1mk45^i95sj%!Tp8SL0f}L_DZeelSq@QfLRRwT_@Z zQIdy$Z#AU(t0B{<24|@w{IRu zHEPcmmMK2fLLP0?o0Iw_K77vsP08QQkHZ9>xc!S8Uh2$XGNvr02dZkYWyZ8%*W((@BwrM^%Vc9Y z6xinYi)}b{+GUmv?9Iz8+sWC>EZa$9sBH0+=3C1{e2%@8F2{dFCnkN`A7R#G^F&Pa|=k-_^P3w3yRlJWum~+r$>g~HJTRdqyGqriSIN_CdE_TgJ#v+7u^>^~cC;!*bz(=$ z8hW*(WeuI^D9^JP$rgmmGydl3oQL0VXl3NBO#LZb9`!dK$KkOGk5$5BcXdf8xtm35 z+d5h1?dMKZaUG%S)Tpa1ho=QsTNc4KwN2me<%!?I>mkMOFs5Ux zGy1;Np@nfqVQSYdvf3{iXY_+j?s>1}RIJe7n#g-ChehVRGUEhAB)(RvYF*^+7d<$9 zNBMo`$B@;iuJRzuK{ozDK0W#1hiN>hLKgIGEcKzTa`#y&WFdttoPO1KaijBVF0yc% zSDm~s5{RuQqccU8D^6G04zlMf7p_10M@F(Vc<|rGd5gWW9$aS6C+7L;`L1%Oq27qR z=i=>^RuP#aDCN3buVQubKjet0Pi(7Ua5%K{|1Trk ziObkJH!?C%WJLUenM=Lp8q1~6`fDr~CE7KXEwO7adHCo+dC;--2O;KD8koJR*==@l z8DnHj(5Zl|WUQ&Vpo6MLMMZ0q#k2PV0(%sMDgDCS+SGEyj8#y!dBjrhxB z@R@PxcL*pTx?Yd}|bu*A?V-NBO(tQd?xSRe#phEA4W} z!QPw@6JGhR&_*AEu5=b^B;62qTBrt*m z{&>zf)o<B~Q*t9N?Ii2CjUmeu^~068&x z@p5jfEN^n#OGVXorqi$gKc}$kMPCYZz1KDyUGKBaqU*i(>b^_5op=81u+Xl(zw{AK- zcIkUlo62{Zp7T1oyrp(@`K52&+`it3vSXa(X3gw4xs&CpDePgM6@A$IyxB5;#x}>v z7B5<?bg4d0^P|HTjni)!I|xkYnWT~Vu;hNT(8%T8gXJj8 z?6~mi@@41bX2bhVyjxxq)Z@MW;XkODD!=DH2g}y4{OK82hhA$rQ!l^vFP4>k`8kKa z+1{7)7Wfm{d#&Zfc=-@{q-gzTcPlasPVr z@DR(U*EQa9bY32B*%9|z`;JPG2gQ0vSF5YP_)X%572C4)?2gwbvI3#L)Kv+x#hoj) zJVD-OS#3%VBX7EdE)HA zD#dqFw0#$cUHYkJ7Z_@j`v zMY)6Tk?=lv6z_wpSKc6ZWm8JVIp7Allg~Nn2Ci|u>bx7|2%OvnSD(2-?(S3HLgfi9 zg86QFc|UueW0b6V;s!Ztyw}6Z_pi<|enYuESF3@Ca)ZM~XYUj44;FRty*mF9b>?tA zA0neGhRdBsd+(>UyXbz}O75rS`0vb_9tn%`K5Nv1Ung$soKhNyR~s&O=g81L^;8?LhwFcV_Xshuiz8z zD{f^DS6}p<7o#r3?seTRXp_vz`&TeDpD zr-6Gbd4x7$RggA8{h8DD#lAvMFg+=m0?p^$_3|iT$d(qlF*T$zEKs%so5_ziTw5!z( zW95mq8k{xi&%)V=vr!#BPM%>4$>n>2>I>uK@!h-Rw${4j-fAD}`R%;;-H%8PMdm64 zuRH$Rd56{m>Y-jfUXB_%CYKvwx#Dr;RqMqwsK%Kz9|F_xm6qF0n<8;tVl0r~x_i7V z%a&`;UHIRXdy74Y4@g8lWwZn51UbRC4mdJF9^Bq&K~iWt>ZXBAHK?5?GA)Nb!V`Py z(1~(qpZ6IP<$gRiFHwOBn9%u0?Mx7ktX-C0&zhno_UkkHjss5&zpbmWtP!3R5_U)^}s1##p^=e zbG&ZTpDdG$h_2|7z**LGGR~y=c?>jKjyf-y8q~k^raqO-%E9Q1!)b=TD%?CmE9I0* zAEEDb_ougcBq_DP9O4KTNOe3@s}Yai#kkbL-=`BcOYTp*_>Vb5BF`2(v;&VwLD~T| zX0qJNaz?9ugr}4rxvrS&-6xC!T{>Cr>GN#W>BH7}pEJ{+a98)?`O@{QdUmqhuepEWe}h%uMQYz9p^8-MErRDO~>DK z{GEyj_>1(HRP!F3L70q3#Udtctx*q6?%SL+64gD$^1edURLi;M&Z(ByM(Wel;^&J{-Q{;i^|4#!&f~2U@V%tyOF*eGC*UFhmoI^KBygXRfco>T@{GTT(D#y|FT%)X z5gs7I1HK5m5n-f1Lg#IA&-TmCw9%GvYhMZ#udzfj0Y$1G-6r?5MRKtosh+=0?wGAR z`>%Yzz5X0!I|f!GR7kqtjhaJTIcNCrnlnC7)W$GeFNT_d^j+&Ru{SGpyZIEZCjWtR z7|1y|89?#O!rWzMTyQuXEw;a-XSz)SC4y?k}^sPTJE+yA9d(_Q$J8 z;e%V1fg;6y{1+)MBE>9H%zAu;w)OEKZL9k8?eeIF8Bg#?;1hugK0tXLc)ZCy;(}7q zR)2AE?gfP=(nGy2%ApaU6}~ z==Sr*g6qinQjR{ou7slwjyj%bQk`k+>Wl%#sIRAy<7Ax4>S5uWj&r*DQ=0r_r>rxS z=NYjSUK&za7JXB=-PfGdXJ*SChg{mvy{)Njeq~v!{UMUSbvYZ#crMv!ZR$6(S@n9y ziye26qSu*lhuo{bbvvkO*4b++=mu-(25Z!(?~wmtimCslIWk6`#<}K^$NP!mw;Jz| zj|KI!PSepWO$TX)k!F}G-zE2K7R2Zr#sjI|=IVVQbpk;qs8jEfW10mC%pGaXQb{9~ zT!Q4P+wPJFH473*Wf4J)P7z{XRFSCdU&AG>+Ip^BJUojbHH+cd{}CjH(+o7L49nK{69pOyJnXb0K8)q)gTy?H+ zmf$Q=D}=KWXQg`OKXKOLtX1dWY$-iWr9G{d{Zk%i>w>$B+G-w;#Kqx^Q%BB|huV^H zCabIF(LSN6vrhe0I76Qic^|m| zryZwVRfRJdXR`W}aAx7mQitDzvk+&Y>bytpV=Kd1rtZ6kQ?AEZuXb8U&O-9U<>R!4 z^7S?cPKT;4wAJqsuRyooGrc1{|uFqUsEy3zIU#8 zbfnDHjbUWKAAwLIq1X9d>2mdN!vvVTUK%NdUe40RC3e>Phu`20#`m?G+#UYt@t2dW z@8JO7dZCI|nniJBsZ$sEANR;!Brmt^&kLeT8TAa1&#kVc zP|=CkF(mgto>3S}PIBa=e&pN(qTI^y^V1`|aH@w8Uu@k(2>ge7+Kc1-lq5&asZIAX zYUI*R$KfST-Fv^>HNty9e0tUEYMURD zRyt`#vO}AIrwQu$`{k(a^KoLl@9%wLghz9w8dCn(lj1wTxg5<^6PL(yT9)Lq)s?UR z#A?m6Y;8Onn8IrDRhuuC03R+DYm{^FIi25KD%L3B_z!D%L26;6pm!yVO{th$;KAY-4XofBjNaB30zoGHpq+RM$qz+M#~DRPJw6 zoZQuUOU{yq$~FgXhnn~R>$hbEWUU}jHaSl5En;!*4=)jAQwSI8ykv!m@9xroQ>+Khq<*iY@K)(zk9Yk+m^A8FEFW(XR~va zhci#zmMuSI+qJHxwo9FyBez$F<;aSy2Cfl&rhSOYqvGmUX>^i@*_czs#@vh*a+Iwv z2l}cjR?su;sCIS33ieeN<6Nx1y+S@>3b}l_5wdtCgTfj@u2DZ)$rCVnIP+A={p%vb z$ElUXT}3QaYUfqVHr^j&oxDo!)iSh@P546f;Z^c=wlTQJsBf=gHM_b{>}{V~CC3bL z;dB)?x##~OR$F3kDgTdB(Vug(iuqw$J;##UotasY$tZR;^;AhbmFl!yd89A;x1P_H zd&|D~4?iN0Z7Hp1cv`P^c~tIgi^d(Tj(?QN(Sg&UKKUp+?ncC~FSJ+Kn??Ngqk)K9 zJ|^ERhouuNefz=iwR-szG?f~hHR_}%XbGv$iKg<@6Y`ziv!3I2^mF3-_#^C5`mZ;9 zxgbhA-Xf%RCnlfO&+%*GYKJG~QMO}vJf_ZiQXbS&*}%BFK`nez{;@;!2Hp_b(B!T; z9TM7!GIMMY9bR2S*{|Wy8ugPkG^ZleBK6lb#8Zb_rzSil502?l#GqaDhpWlG@03_u zi#n-0mBZ;@p3_^a)_;w{QKZNB6ip+eNHovAPl<~ZLb}wmPjPec0O|p?>(eZfPvZBa zn(#EKjM*4O6Ik^$ewS?&57<{cEjIQxiffy1o+h%bc-X48dIk?i@o-cf{tRVw4CgU* z#WQlJtEK1Ze9yCeI?qwzpx(sE1)~K&ukLzAe%M!6#bh>Wp1-bc%#-KaQt_3lzLh60 zux-b=U5&|S?mhavNM%|+{jBl%AbMX#zTCBC@C(HFg8JWld4w(gg&^(>^n8{&PI-Z$ z=dIb#$`P_H6EB(SBTk;p-;R&%>bFkLwG6dP{nIH*6tzwrRUi*-8RlZ$>w4?a0=b(J z@YS{Q?5H?bkQQgE;|UqvspIh0;neXk7x$6W*mcA-A8+&32iDPo3y7&eEni2eZO6G? z{dyhca}?)MwX4dwp^tg$cvbG)GNhQbSFt)@m6L4AxRcd4RXMSt`6dy4sS^kT7>x#6A=K46~D-JD7eSE_y1%ZavHoV9N) zS}$MLV(@AvpVeo|Tw?cp4em8(8g+Lb?z}Vc#X>K@U2rB#cNgL=RCg4~?T2`SiqE)v zUE)X7XZ$3-zU_^O56a&>jz~mAUbh~R`ezZ(WfUP7oe@8+9nb2^pdWd1Ao7X`MJsPR ziR-;hVh9+$kydq%ET2=eH_EeH4%I`(_qnn*)>JG6F2yBqpi8>0%NrfD3f) zkuD~|Qn*y-F6m+t+z;>9IV@dFg4J-f&Y|gI60C>obq-D!lb}R;(q<9=xjFhI7={q0 z3n%A@NiZ6Y*13L;m;{Hx!*s5lBPPLQI9caobHpT=4yWsUbdJB-*E}z;v~A_cR(0+R zGOrYuusA9SoaG)4?b)2qUAR9l7=v$QlNfw|Uy?+mwH&Y2kN1L0ON#d{mcRWuiG^XP!f+c?Ba7~VD} zzVPpDVTWBztcQs5klN&;ht}e(RXZ0mMm6H(HW$v8%8QJhFRJOqa-=N|cbxjT@R5u& zS$(ybfg%TIj{2og*Wg^Eo-dYT?{v}nT)tLcg1f}m>bK(F>TC7eac}pv`ZC;QXUg;* zum|^^GmW~t5_jd9_)Vghl;SQulcl?N;oha@Z<5;&Eh1ISJzVk@iR4b_t!nlw?;l4N zL^ebZ^14J1npr1$ke;CW?IyWHgq5d}CQt1*%hOtxzQ~9BUer59{Yy03mjcbDfebXf zC>m|XY|$w~I3Dtn;I!GIQ}lp)=sbP4=oImAyw1t9MW>hmPtbYHY|$yw;53~bvqh&^ z3@_F>em0%r9&I(kYF)6;7M-F9F48%Aw&)b4aH-Cbvqh)a5AWAGe75Km)o``W%50-k zh*fjXyS*#qEStm+LproBTf|k$iV`+nt;%T8aZ!-o8ubo8-dYsyR`w?M_~Vh9(o1rG z{-9C(%`0MZv+$K86H|QE!eAyy#1V5`WGPfjhaT%G{o0_`fMY+RJt26w~6JqB@e*J9z zwFUj}W7H{EkclFFm@*=h5 zHF-*_aas)-s!{iDVXc~6Du)Gq_Pu&nsoYn+YO9=b|cgZ zv$t{krJBIi>dtNQ5MLN^J?c$Q6vRcL)yrR&pZY&}eEVg8@(Yg0b(dSa(RGquc6n!oe&eZwpne@47S}sDaF0`8|`dlGgsB@c{qR(xIx9c1< zQ}nq?xKigoQbnIT3Ln+^w^XCgsU_Rxb=~!XrKZYUt3$4)O?%mRd?tJwSApuxSLKnu z8hG(ld3Zz;YSOk4d%nJ7HwGG`6IX$_Q`8o(;Xi8|d#vjC*H{P@q86%8y(V{@SW7+D z`bOqD+;zT@xgK}DZ)9%3-QXLUPvSo58<`t%H~L2AbGXl`CthPmW)}(VQWIb2s=481 z#=@5a^>mViPi_;H_j0ChF}pmYBj zqMnYy$8^4ChEY#qY#cf#FgCVe|JhrNqUC#CVrE&ZMTrs7TdLj>(Oarsw_d91W2L;I zt{0@bx0HwH^l}uN6Rj@`58<)(ahjn#_^RR*&$)R^U36e?nP0X;+!T97+#kDshum?1 zkrlpn;7?r)0p7GlIB$K54y)Iu`p6Dm-<`k>$O+tljMv{8j3d6dSDM_vd>;~emBM>+ z`cdyq`DBh^?we#sMPj-5nW6h+2Q%!^1!8;G>r-s@_SWjS2ogW4H^MIC>$^Ky;Ssj} z6+umtq|gLz_yljKt8VWdu6rJ5zmCOGTxJO0ogSg}*dD|s`J^}GLBo^rg}E)m_g*u@?132_6NQOE z2EhbG-A+_kn4pkgkZ78enxkT1Qj*X))S(~L@f0bYn9!CMKA}?KM+%A#C@G?n=RBtL zWaq5|zOo%uDzZT=@uTLs*4{Iqr#k2T#1J z(KhhAy9=R!vz}uIAB^7_t_&0pfRSlRz#1{-Xt@TbcDl^JZX+2FUy{--n8V9SR; zU-mD~@D4V5bT1#FsYgsb?b(Y4=-kEjd;RwDch4}_z#yq{J1uUd5#7!tH*3TXmSfqb zpA6+WQ1h{<`FNy{uZfcS&@GjE9){%_>uEVPZ0Yz0n1)s&Q6-q3?YH&SvaP>#Icf}X zO;p+kF}gs}MQ<=MB5I+uYTeH2e(V0zpIafuxZe;X1L-qrZxv(XGm03+wFJiVOAeS1 zjY!l;_d58gmM%EEkY2dy6+7LN-hVfd{CCs9dfuu@-HpnnGwS)^p|_Vh7ZJI%s2)OB zAbkbhP!ImC2yLaG)nm4G!Rex!2L9!V+#Vuvd!U#1KrinZ*i|WgOxabjV8tD{2e%>i zOp%Oz1i%3i(q_;@4gA!AOps@S+}MYn(dVl1Mw<5X_ZTXWu3`^PYeAnu=j}(%^$4n` zZ|=td$7wiE(?k1l>#z$6y7sWc!0k)0>V}TEg2*ehXFpaT>N+B+>*(+U{Jk1kNzs`H zuv|$*a3X!?0Cpd`>QG&D>j9qn`0vGi$i4KTMm}nM&R%SY?@f@35mvkxKS?*6DO3Pw zB4+H4tU~yzz4vd5M=GSG?=|wH4RvtVfhY%&IrQ^Je!_62Y`kqV^h1`-TUL7K$9#>^ z*oVF2z8ArRLk)0!^q(K|i4mv4V4Q# z**8Ue2ls`ZTBx@~NovsH<`KeU>Hj&%j~bM@57oS{pUn3VKV{I`eXx`EB_Mky0)65T zA0FNgl6J7d_iq>1;5{q$-LC|x1EC%JyzNIfAL8$dQN-nK>|Ug1p;vsI!8&lH@7Rsb zockzdX9qgEBLM}&=29QMd59P9@m6a*QpP)Q9yM#AT0@XqBEl0L-rT&EyQqnuW>7Nq zvG4h)LG zSp$RO%LeRJHh8&v)6(i@eoCNuKYn&|zqh&AsPGhv9N}Xg&e)IPv)@~(Zf9kmcaPy% zADd0?S{fy-g~FO5<%3T?_!NVpc>e$&u@G2J?RY&wDg`MZ7Rx8{W$*#; z#Y<~JvX-v+8*iF;`&9uiN!e{AWiSrI`+R{}cJ?!c)gZ5?he3YJ2UXcE7cY6`ZRC}= zkhgAPzv|Ek28{>VrtrP}r-t+7Q^Q7V4E(xCHMjAsQFsngWZE1rwSr|U&H6jPz^4-> z?K~)3DwZbLQ%wVwO86ld4u@n*C5>4saq!2<{@rQJQptcnL-ub=W0pz|{5i6Ja~iW$ zis3Jo{qLkPOJyzmYi0jiY0OfohQC_&uTGOKl|}?K$^oyWF-xTt{#M!lVj8nlI^pk> z{VUU$rP2p~pX`4+jae#s6hPm^1YVrh-^Y&rHy<%L9fopxH`||*UG&C(^JB*ROQ39J zn~a=uP?&P1sBs=Xk1eHxX*!*G0;}EJ$z=BJ%1GS*4ulPU7&iD}TKFk%4)xODXEbWP>1Wwt z`R~Ru8R?Q~!>9b@-xO<vLJbVe&=Q3QCd6^DU}lMXmP z?sqzzt^AGQn&_iCSo+S3yh9Ux#23!@y7(VF&JADlwTja*;~Tz#XmXl$QjWv$9e>qV zvjgrO4qYFA(MQt_cemq*pZQaFcu4;?gp4XGHnDv@+>A6a8%Q5G10U%Vd=37%S75>k zIYI?rAKdGlDBPZss_UO0?M;LXC5hLeTb_)D><=yCp}rqR$yrC%qmnai z8ie>^oJ=*5i5j_y=*uRuNMmv7u!O&8A}K{BR<0|L)1gqw_JZB<`axJImY^S(uyIhH zf^89RuTHMPw08;CmE5nPk}nxA4B>Du1-+vT?x7r3aX-(UmjoMNTr8RarHghAK}&N^ zb!?It2_4HJe4q~e%+r08N}zl1Bq0zBeS>~=Cz)ob#GTi2_rwctxz(uIu|XuwBXm&^ z3D!iQg(L9cD>7CSeGIwK&x6SG50qIgn{nJ{)n(5tPr)FIwCeD8x_!!{U+Cgc-QI!x z7u`MnhMctWpH@sjZ;3Pe;>`5VW-?~R0Ld3R$aV{X+CzXtBeY$k{FBKvu?PW0`jeUb;1T<3FbN6u4ib|*NMe(t%w6akoYUp!sV#cn2og40 z88sL&RyK0xl&`3T3JvVSf$9NYt^R(fB)Mwo%Ol7fPd9BFL6(myGqHYNW-^vfI==ze z*w&&M*P3EG-*p?y(Jx#%cGee`hmiY*DMQ4NJqJG_+jw(2It#0LM+gZSHqbo8_`z6D zC#Bzpkl?#nUr~AbO04+r`$`)63LB>nSV+&<7*t0L`lX5sw6)e~ZP@+j3#gr2JGX|` zpaS6IoPNV_zZvN==;NUz^mo%@pM{dwbuoPyv!U43b1WH21{2v|6$U^3Q#c7tV9~M{ z;#7q#<|6HZ_`McEAL!qKgVKyXem2DH!%Z_`FvfU9xgJwrYF`41h;M%MF-!MMI0*`p zOT+Zg^oa6!M6f)eCs@98=qNHiP05GlfuO#{oDsYRqjLJiL;jVai#e@cYi2np74_&) zHji+&MvamCNfTk6hV)vnd~*~D)1~&wky5JTz$kJb|9e%VBV{x(sXR(LD~gOV+^$SF zM3G6qSKf5&7&1*WA9XXIzAy&UP`@)|{0$A%y^HI*3u+Q7!ZpiovfeMw5#|MY1`R^y z2gC+3Do=1#KVr95#N5G zkL?-(UTFy_Ch3AzU}ly-%n;D9F=3-`PJn7x=Kb0UWSVXuhPM(^h{Ak=D32FU7K=Gt z^u4CF;i@m4XeD9eWihWYu1tc}PdtW6OBr>Gx$$`6QEwTXd260)tYo>S(4@w-q8nE7 z_>e--6`I`6P0*hOC_#Z^>D|QiyNx6IMGRRw0hyva6U33ClKHluJ(-)*?eTh*zdBoO zu~|7gn^_7WR3Tk{5BcNJLX!dBB%B04?j>;ia1Z%fBO9|k?4o~f%%bYLQE}bu2J-F3 z>|o3>-f3U(70d}x=Gf7?G}!V=4(oJH*12egChPSqd!=3XV@PYI(YH5%7d-~<6sZqm zkb?kyux`9o?@dqG&Hk_y#OoOBEVWUbs2_@1_a?@`P5NFOnW6RMLw|@PV?!%Y@(R=x zQlcRhu58VugdvVjokWr}%7A!d5?SYQj(!k&5lX>1-=K%p@aTgi(k~pcL~x?W?AO;G zgc+omrAE6}7>=?lM%?u!>6o6c&u}|WVu~y^ahP3U-lGvb22wc_q7G`9_b6^@$8-NH5>3c`t$|s^c(4Hn$uEcLf#pqynu4GAG()BGtL^;O4 z&W1IoA{fr-W47PiA<=pA=6bvx-g3embJYNbSnPFD9Kr&B)f0d5Ha$mLaRA ziKZESS;DNhroJ-U7XrHk@A4=en{bs7vC^cNh_bkF4@Gm?dZ0*p*x?yuggcr(mq12` ztTH8FR$XNpg5YA=kU{4yN99>L8>){w5}@=Wu;7TGswretfT9_V_J>j6H0WK?N5%y`4yC^mR=Vf5x=?WtHq<%d#dok2msa$ap_Sl3e>8#5L z_95jj>wLWyC7m#pn6mnfZ0G1vD>0_3Rzk6@WJ?1r5-Q6~k>03-OhWiu@7W1F_1Z}ok~KBN--OjS}hVUC?;h@Ei)=jKHje0ihCi~ zuWI!}{BI#O;e-;6*likOA1QHzIp^y>vEpRC5#3-w_ygf=3&5y#;jcm4w`3}c67F&} zVD;u=^;o&GqrvwPJeWrrS4<2etiM~A0&EpEupH9jMU0DA+|KPc+|Dmhk8YnFYcp!L7LB;GUFv#xneXL>A&JTs=!iut0OjcyoYR?I5hWi_59@uf0+^^bE- zjKaM!FkbIi@DQ2F4~sKr*G82;U9+v`>zb(AZ)&&IvK7XWY2?G-Yl?OpP9|E?KafvN zCs`V~cRL<T#O#emZ%aXk`84P(4aazM9-)0?zV67m&%pxyN);?y*fz7&mZMGOuJj`+Y@=HAT9N z@XPe21z683sXtsmKGYQS3hXtSC&^Mz=*LfzW1i607NRGW_C|=WW@#~czF0^ibz+`g z)QAMyMQbCcj6Y(@`QtGSx)a~x3pg&=$R%Fjdg6B*B(8_HFD6!_v4@k4J%cSN2+^_7 z5lhH*A61JWsaoiWOfu5zekhaljZf~GF103OVNwqUAN!CN1{jU(3cKz6m5v^s8(V9I)eTf>d{Qid290GL9m4oW(tvvpD{shGhf? z4KhjEGVBV-B#!5nks^Mut!I7Z`r0pR18XxdsBF~zG#NHCxhEB3_&{c*`t#Qefeb6?Z9UL&;KNOe>|D0W=3_g*#E3qgl}E}oYr$wOb?1@SG;wgo(KY$R1SfWL z>DGLL*LhlWQelfAa$NETUWkEyFGRY+mLZ8LVu_8{Y0L@YtYlY~;FBWdB5iI<=K{T8k9MX`;7Za2`Hl z&#(21XI>x=4?iv&g2!b;(95zfi`Mj!;e(km=){`b+t|G?kjN#;=xwYgREBCrWl*O= zBE6?yX5K0pHjmOITZ#eDiaOg;ZkW|88KYNvE#sl|SVpV#s-hRsq_Sy6H@*lnPIfwa zUL@apYwvs^$@0-Op(i)dnSUmchT>jkOLJDe*NQja31qYk=?e8Fo@ zqg$MIJohR|&}gey4#qO4nl`K<$0kQy9?%;Rms!EWFV7IAEF3>vX1AKK%OtThY=IbY z853|Q+YOoQHALyhrDW`+UtzSHeyc`fG7uV92Q z8}TLB>xEhp6F~nZ@IA!QdF|?=>N# z>{CSF8K?zkF*n%yw0-9MWl+M(KIFo`l8}V(%e!W=Tn$LFn2YfpYL1!p_#(kq>n*q0 zXn*xlCS9GJ4n=i7g1YOkDaWC|lF#{J0~+>L{rX`UdD&3V8z?sHwu%whBQ2mk?Zo7G z#7;)=Vq!1T@ZRB+*z48sEZnQ%6MNZAq{han+Dt3nB0Dv)aL3Xa<>dVl^Lrb1V{4|D z-K)2O+}1nGPB0YQnwn-iFe+UeYNWc(dUvN;Fmpe+?QUB6CdC70&JIubEl zF!Sk5wDekyJ_{3}C!O!x2=5$<9qAifH5R*AE7%)w z2Ttr@oL?Q_TuI5j;kFK}_B&q2J{OzvT{W2WdyICL^6`O`*C~k-1hbD^A{xD(Jd~+O zQGfo1TM+b+;z!6(BFj)B%OF68e>QxKimOHr)v_%2LXs$OzJ7t#2VT(ZVD$hk-jQCb zY?5=fvYIItZ}roEtS9$QQEDp%a<$?TJ1e`dxqjzWO?)S+3TwQYJ{9$gNW@ z=`J}Jxuzf4Kt?=}MZ;0CbX`^6|w7j@8*`6*~{MkLA!N`Nv$W^&U zP``K^8TBi%`u)QNy_J0SEe)9!yRh9!y08xmSQmg zV(F*vl8~9%7@FA-7(>vWr1!^`XD&i=d*_r3_7|Y~8;tmv0YY+mIlVfNooWyZ8wBy@ zf-OuucBIhV>*tZ5$-bh31O;et3TLn`;(jG^+C*7Pm*b~J?*ep459cL`#vFaZW zTLC5GxG8$r3uaBAQ8u+^vFR<(7h441SCFs}*_nq+xgw{Zg~6X3j;{oTr%9>iDS87o z-6w1$cWadN%Qlkn9_Pl5*i}?Q4{ao-A;<_>@PZFicV-?tk^g!l37T|kunobsJhjCl zm2vni8RWtikG#E;?Pdr0x2C;FkLnQfaOrIk`X_#>^!RsJ6(LHc;Qa5D)ST+my8q06noR6MZjl zdUrahub@9Ez%zb zl}zW;M~Z&1fqLF2-w$p*iCQ|zmU3-ywbAcCfaTJG;&wR3e2BG&w(}&rDu+)h?7-rs z@1%ftzqafkxTJm(8<&nVJIF$!xrp=^amAlJuDJr|75d&T7-LH4$GgZ>k5f}a_IN{U z$TeL-FSkGU09%P3s_kEXzP_9Mq^v|8YxaM%%2=1>e7?Yt#F?0*3lUpL|KuQ#PcA*xvw!MX-tzU zVB=Msnu!gZWRcfo9n(neQTyoId?kIGa9dTK2F?h|4%#RcQ-&tMo^z5W7Y#B25OuGaOU@MxMi)yluFE>}dEqHZ%OX@>Ytg zvX(xjm%1FmpOWQT?d;$rtO{q-H&5fPMM)d;l+fDKNGa>@Uf3)0y?U zSGHd96ANFVK`(o(e7d2H6zO6;6J0C~Z6`-O=IThrTy?-)-NPfSVfXdjt^*d?gsuI* zl{bUl6Cyhj9{GC1v6b9i@pDhV4T*`rR|dYa2IuS zD zFKQ!q3~NaamkHSMjZ%;am&h263j(+ti!PCg*iAdv+sH}WIlB3K@(1WjtEs@=ag;JXY)>h(W>bG#-!?udf0+bChhu<*=g+c#CYbyar0{b*FjC^xv7LL}Zs*OG zN$2;wr%V1w<)2RzFOvc=PxcHx0Z&Cr8zj7qxkI{4hLK53>eggsM~XmhZ>RgM(hNhb zHue^r&vCP|-2DT#1C{K&C1F`=#b0D6k9D~ybn6dfjVE7)s4#dyLHwtD{~+i4+>c~p zky3}=72|Kz;Vn9bZMl5I*3IV>1TpcRn0QZ2ksPzn|L>T# zQa14Vy@AP+yocKxX`MnNuabKr3wqJ>dY`sOTDQ$Nu8T8E-%AM48N57_owYC2-dNF6W2#9k#drJy>%cO5 zL1pIxP|aoMd|(<>?VXAYTV{^54{!_lCAVZ*iUdf(UI_m51_=#a59j)G?40|P!|d-r z4yTESXEJV!D+hSp^B;JjJ>1TB53|494v(-TfF;<{MK__`6p;_yBzNB?a#x)q^8Yjp zWK;D2lFbM?o3V$#YS5;y&bC-*`ewlny9xDnvu*X0v+T3DDCx?Lx%1M*js_g9sol<= z<^-wYTq0_#;@ljF_+DLxWvZ0eeooFhu|2`tl=SQCWN2t&JC=m)xFg(-JHqX(^^VU} zq4l)31nD%&b(((l6B%=F$GLM2Og(p?8!o6bT8GUWj_-i6J%k;IVY%%%r}KoUol1z> zN$>xeM0n~X>u0jD-^?&OneAbA40V%3WK6769=}Z0OR-L64BxRk0_ULYT1TQ1izi~} zPrT}|=YZu1QH}Q4h2IlZxkl5`tAn}ynxIMw)6PprNWD#Y>47}Zfip=NXTb4P_GIhnX`OBVte%Z5GmOn1b&tCC-{y1N3!8zWgs`Il) z!zKT-b*ngr{(tIz7guRjQ~ndxD8EXR5?Wa!JMF(qNHa z!iGPKoyOZ}f=hLFtiDIZ&6z#5pY!C&lVx`%!mEHz!0XPWX+5gR!6%UAi8}%Iyag;d zp^JJ|L8FX3$Kk({EXb3bk$AwkDoLsOvMOE`+bc_W2TyZ*ReIX^g36D%0!K!7s5mdW zK2dQp{*EV5dQ!!$IY}SsQQhe{+N+{t#zKFzb*s7d5ggY(63=uzXX9CkXBD28@Vu<% z&ct!tnRrJ@i2BH=QKv!kCF1T!+=FZ$saa6vUe zFQ~*$pbKb+-vR`}?ZT4-%y4%D9l#Z!54eeNH6Q>+z@HjR)lojyQbA=cbHtabRVo8` zJ_eqTfzM;zH2qEW7!6p>wb0@>)kT^rIIF3;O#O(@TyV?a92sTmclbdI3I)}IVnl`m zJNCV${-?@kUb~>0*FihhA&Z5Tf@)zEHNLGL{-CWuP}z`v5wckX5f>q=MG$cjL|g=> zi;e>jd(jD?6*vui34q_CPMZ0)`bD3`;IX)ncD}8SDtbL#P`y4|P_14CfbSacT3rTY z12sTBP=|0l*MQd=mp6&{Xh(9BVRw`G5_`1R%p2@L!WlW7ex5m;`aw)Bzx01M)RTf#bjlpcVKM zXa_ogPM{0u23$ZN-LW23SuO~way@N_`_8oxX>GNj+8hBy10oOu#8PpC`p%*)WrAu8 zim?U7*ir#h0-&i{1(X1#0Mb+;%?HTm1LX6;6`&8eDX2c=05yO-Khy(8z#j+{RMlMo zXsSU|4Vr4uRD)(KXtsi8s~{Aqwt{FYh_-@g8xn3q!fi;n4GFg+;dUh44(8jDZadO# zN4o7`zTGUSc0s^hr9c_57FZ8d04T(+DxezJ0n`9>f~v^^gaZ*kG$0n?PYe(X!~yX@ zB9IKE3aaK@02wqRgXVmo5Lg9(adQrU%$ku|Gcs!~1|URp0Z;-!m}X?$d;(|%AV6~? za1`hQ+JT}D{OJUmfYU%da2)s&*a374D%>|x9WeqCfElm=;fU+QQvd?tzKJIX=mCHD zUBDGVucssvS$s}hbH0GYX}fzv=MZ~~|U$^a0!K zZ-WqR$gHgbs00`R1ZaaGZDl|yupU?ooB&P(UjpqwE8qh9fGdIuR>1JOVn z3YiZS0EIv?Py(z1vVj~RS5S4^fJ{O49prRDuJ2C^s!K@I1KD~YZx2N30lyyb?SW`T zJuDIldyWdK%ZTi*0(QU;hCRrz2O0Jt!=7RQ8T7EYI-nkC1e$;v&>+pF`GV?-8bDdE vFgL=kQ~=<8#U-eI@CV`n2>b(t|Djq4QvGlOj&4EqqY;P$G66*XxZ{5T&m4F; delta 60203 zcmb51eLxh|{{Lr?RWz!>hs4wiC?+V%s+gFTpqTiS_*9mfOH$fR6N}Ue1C@$O3tDtA zu|O@gtT62cLN`n+y=h_D&B}^tX{DmVLd8<~z0T~;?x0im`}^Yq=k=cRH0No~oH;Xl zptAk8%JwmL+&E#HBuRl-lGG}wMrw7sUJA@`NRlGyZYla>j>&TiM~qb?K4=x1pOn;h z$LY(o9j8OrOLeUzDL6)%pzZ%X7)#I&{4QbB>=U)p)5?^~wbJ}uv9?2qhw@LvUViBJ zL~ZwJ;CETu?d&O!xTX4ZJFWV(k}uck3G%nBbkB|iZCQ5-Q=H?pL-;u4_aUX*q`J-l zhAugTA5Sd8?G5QHm!t3T#38wAKR0}v;|mHt)5Sy7j#26PVd+IMKmCA=n&7zC2Do;WNZ(ad1|%l>wOK%HGpZ zVVqa~Wtu!*FA}|g+Hqb+B}>7r6v=h3WK^jrOmEYWq&geAKU|6t&iVG`L+1Gl-zbGd zEmD!OcPX2yA%@!Q`sL4tij$mcv#Z0o2F`WQ2y<%f!zI_MRzbl*#O`TUA`flCz2uyE z#gLv&r)90_v@%IfQ3i@eS5qF8R#Q<^u3Uby>o~0=mECdIn^!y>U`uw%TC#I+NTO{% zuKCV~Lq?Cvz?I=z`F@9N5xl*#l)$AGr39`caFVMXrsStrggO!`?2eR*c!#4xa#U3; z4zDUt)I2e^YCo*29;3^X2_?U}qJ4M`$Mx8qx3=%y{TP`%=FMbCK9w325h`NPb?3(R znO zQ8A~dH8GRJ%;h{K|3~Vf zX>LPBS+TdIcb$(J9dPAQ3g_r)G5qK*=j7NCwy64cTGXz!v2WXK$+hjY{SLLpq$-nw(!%w)mHf%Y z4SVE@i(>CM@ZAOCkWvxhKjd67r1M;J7Df{7ZyRKFi@mPH%(M;T6XMqAA`>7nSM z-fZOgb?2W$wt7otYy8%L=s=oJ;2Fi4S3Zva!ktp;@VWC!(+&5orNaiuw!kxz7P#xx z;d=vYdT(^zKcc7CwPD0wk84+ILYp?NoAj>iym!nahV!>Ev%)>9C%;qjzpUsQE;(xS zI`tgcb#HQw60KKYy?MO%T#Yz1wf>uo2#m-4HdqoG`-%bm&i@?A||{aVOgqlAoZ}p<%AXR>gZt%A&X~-PNkNOm?|KcZMfu=Qw(< zpR;aew_D@-OB&{iXjQdmukP{2R#kZ1M~Bl-yH*szQv{lUPs|nEs(Q~6-RFQ-)%bi3 zpPuWRD1s&U%)n=cbM~yx*Lw<4=&9&M=$PxffQCIM^%&Z;Y9NLjV(?UhNNWNO{SxB^qdi$Jo#;(-$y%kRy3R8 zc3B(lTtBC~EeThWvtrIf+XP$_oR>QiyLfyn`HH<=S|2Sxe1^u5x5?hA;2 zfwRQX*`{mGw;eshjIdQBCD&z{ClKOC4nMxL!!@;u%|= zZ>RPgwwv&nYmih^p_PXdeuh*-?4NZS$D~C}T$p^iX0%Jts_==qR{liCzsyiDhhtJ zXgCeVbdG>CVNB;PZ~=_z90C`^n9gnC9WbV|+%79ot3tqZ;Vg5GY8cb`BwPbyI{yGS zz?jY&926%D)AydJKGF`e__Mi|ri30N5{3)4Ak1wsr0rV9_k$uOq#VmJ-PbiNzTfH9p@;T#y# z`Bu09#&n(xZ-FtL$HG-GCOGT6M1KI1a|_4Ow)vy$BN!Fx^8r?0_+ycft!`Oy}+JG8ogj1kQyqo!7&~ zFs5@pyc@=JegZxKWA-f3&sQMSB4E0Q2jM0d(|Iu*8c&hOd-!fR4#xE3sqh3C)A?37 z4aRhy3@?K*oyWqfVJu4*5)rl_U^)+lD`8CM0q`Lh(>WThfiayU;074exeFXLlqwkN z;Se|!#`NQD;TSk(XqHEi5fTtE-NV^7bW0f1`6Rpy#&rGxE`%|iHMk7Mbp8T924gxO zftz4V=Yw$Qbz~^(I*+gyAszwKJ(R=AFsAcPcm|B=yd9noV>*|>88D{vdN>!xbk2th zVNB;I;B9age{^95LL~yG^MmkF7}I$%TnA%1-wmIGF`ZN4z+rULVIIB}4uvuO_+&T+ z#&jMFCk>Oc#2;NqM3{vKOy{9+I*jQ&0M3CioulDm7}Gfd-VI|qcYzPVn9d<^EsW{h z7H$}pMWgWwGQv4LV0but4f!8V{)Y?t4T^&>=qD%{!k}7c7KA}xLkl1b`Y)6NVbI4= z5rjbppxs&EZXNf6hailDd!QN!gLXlU5C-jlg0Gi_K`%m)5C%OD#X}gRLK7ei%7Yvb z20Z~~T+jJu=(rNhW~9!k`&Y;0?5i8w5>; zxh`sWWg3Y@?}3>pqOAPgD|Wk49zAIgO=s5evuVNf_!3Sm$eXg`EO?V)23 z23-c#Ls|R*1Hr%%cb|@UepiNL5gh3miWC()_pfm`B z)?%g)ry^CkpnPZs zgh5$Pf(t+lTm@x97?cSWKp6A@v<1STd!gMB2F-&GK^WwK>L3id6>5SoXbKdRL<3F| zG(HOq1u-xQih(fbdME+HplhLN5C+9U^C1k1g0dkDihv3s47wWH0bx)Fs0zZM;K(cr z7{ovu2Wue=y3mtm0%6b@D0nojWVE0LC=$Y;AD}o0gT8~3APo8nngwCdQ78k#pu;`6 z|H%b0@O=&zK^XK7R0?5G8MGh5pqL3i-44s28s0dPSq#NESXe|^4VbIf1 zRsx8DkApKH49bQUKp6BOlnr6feNZ8ULH9trAq+}`4nP<*8#)eQ(9KXigh7*_rYx{Y z$7C>Y4DET0IG6}^gfQqjC=$Y;K~Ow|K{3z-2!nb-4hVz(0cAiK)EQb0VUPlC8IwhO z*0C*E$w7>R0nkwhgZ}J6yMQpL5jqE9(9clEWHOp8$PL9n81yZa0AbKEXc~k;N1z4C zT>tn3{s+wDAO`J&iXaTCgmyz1^d?jdVbE((J%mA9p`fvJuCaoOp-2dW)0=n#ZKOQ2c^gBC&OAPkxhg^r^$j}w#%#X%T!8#E2VpsCO@ zXjzty6Tl)6a0r8Lhh{(+bPKc$ z!o>A21uO(H4vvM&APgD_9fL4v7<3N8pg5@8BqnK-1oeZ4Ll|@oGz-F@Fenqkpirm) z!l0}Wa0iHi?Vtk?2DO4}APhPePVx{2oq|GBXzMA0eu3g33_1a&Kp0d5r9l|<1(Xe8 z&?i}7A&7w=LZuJ}?S~FP81yz&3t`Z|puowDmXig&4uwM)v<(^#VNeM)4Z@)3pbQ9u zoZ(#m3P228&A}ZI20aQ@K^XK1bR5E+C6PgBLP&X(Y z!k|vju+<<2UIFfgFsKc50K%Y#a$}Q1IGYq$x1Pj?=mRlvrp^hLd%! zJtY>JXTh^{K7PtrXlAwFb@IGXf`Jl`s_<1jr`a{F*?1oRU^8Xxa{lprp=HI*u2~m? zf&-NxM>S6g{qfP=qv`I^#xumS;yWboBanLE!;pIMY_ZyCR%~zx@c9u>l55H%wD{(r zpa|!knZ2)Xn8Px~9MKR(3vPrkNVMQ{5C(|`9Oz(7a0n6&I2a0c9?a~SHOoP@IE;2h zcjX9%Khb--K^P=@Pb7pvqW8o=7$njj4q=c;djf<(BJF7q2Kmy~iHgngZt;;h$+T!H zGn$sOmX@u)54qN-n3P78#`Sq7W!iI+Hto4;lTu$KY4t_Q zE`L0kSsNuSb7P80ig{krVxG@4DIH(niQNm;CS`sx`w)s1w_+-_qi9FbLQGn53B9RA zakn>Vv$j&9kK&^nv6{b>8q zLQPt?mnE&+%Zj^;Nt>UAI3Mw9li2MQJiem1yP7lynggwyNh{nTX@xr!cXyL^9PK#T zKTO*2S9zlQs^ShaY1wGmXj$PVu?DdQF~X!3zD6RiDefL7t@?Gw&es)pPm|WIluVZ@ z?nsl?h}MYK%cLdjA*n6$z-vpBmq6?Z?ASo*4NLtw*#XZ!kWr+c2Mg_U4P~6v`=P-->&LNjv^;DN8$!m|zl9-jTGFcNBM` zNvlMwL>p<+qN><1Ql+>@nY3cGVzeZa7Pyys->bMso3sgN6VPsyvixIFDPk$&7?Z~) zv?jD-J=UZhLpz2x&ZH&mqowat+~ZB!HneSM6AUej;t$#{VTyaAA)+ln zTYz?xN!yLK8*P$Ft9*}=c~5btn6&u!X&>(^?#U*t_ybDj1I0bXq;)$WX<6M4DDJ5y zu?VpUZJJ4|L90QVZqghF>7EA__su443)&X6TTEIFS`FF^lXmPsl-7R~_pQ=6(f>U| zaNUPon?6+Bx0yVq9HK28Qrt7m+F`WAihGtxYeH*6n{CpHKjMr(Qrx$jwB(PuYJRM^ z=lHa&1TCSOda7334xgByMIE7W9Z}q=CN1t0u9TlBZZT&uGF^mLgf`ct1$|0&eyX_B zOxg^z8EAK!v@*1^EX2D^V)0ROeN=JJGii>`DC*A?_k5GK1#Ju3-6k#gzl?z5pB6iOa7Gx_p9Q5#H4j=;7ZxRrB`TK-r}E6BJ)Wk+vG9o zM;hUeihG4g%S6jWTWQjUQ(D6*tyLy1okY?}B*&yhog}`Kiu+NMmX(2+f%uq7jQNcz z*l&vaag(+TZ5djwNsBv0k2s~cpD=05(3YV+Y0?&)rX8JD+)tUbQZ#nMXSr9KMEe;U z(iz3Q#-wGSWuQH6(i+hk(Vj7B@l8}+lj6=ZX=P|-X!$1X9NIawXLZdx|8tzBi=9>6 zPLsz2Xa~>=Oxm&YG`RDMd#y=py1?LbL2<7$X;sZ^n`&0vs!5BKn2t+|yU?Vq&O%&` zxZWf-qBWvDXVM%p8I%?G29s8cR*P0-(qaOrx&Xz!(WJ$-qMBMM?&nQfU?5k;KpNo- zCb15&4zbvz<)Y=Hm6)`1j9lj!xHg%zSqxmW7`Qf@v=|$iu_^8?CT$1W4zw3NnrHsk zfY^ZelF4IyYwEML;@)b~iqMMCwwbhAv|6<7CT&JLhTC?E`(=}s+=i~$MsdGl(q>)8 z{BPD}ihGAiJV)Sj1b)?|6<@}%jK9}RS{+&)+Uq7QGMG9JR@|i~t?Viq;Z=%zr%7u> zYeaiP9|XK(z_iZXFm+bkyG$Mn(F)Oao3xIh3`n7h`%ROUjh2n}FOyb>R)_YMNlWR% z)w7G@F7s;o{I3A90I}TUvE$Vwa<$^#W71ZmtwyUbX{BB1$6Xb7rAf;Tqs@dV?zc@^ z16l*xzfD?PIP<@_aK-(ON!%UIEC;R1q@_fV>j=fY*QD+5!Bo44;(php*?Tg6^i4((2Ia&^|Y5Dg8L%ev12;dHz?4Sc&+B$)nVtTk!sh`%9A+9?PXS zR&jr2(hk|V=Gztbag#P}0KI8|;{MvCr3@tDfr|SZpT_*J7O@ubTc603JdO!NoZ_xA zX@zKoXqrijyq5lct>XU9r0quAjpj0G`-jjLhA8e@lNK3I*sOTP{k=(?k2oLAZPE^) z9Y8x_(t?N57KSSBI+Nx=bD;fT(u#&LVh&T>Kbo}CM7nIE;{FNEH~*V8l96zv;;uJ& z+%}54l~IcOXOmWsR*&|JNjsOsh?%6ge>G{VN7HjgEA9r9mNbSoGe&Wr^lMo>A7r3O zR@}e&MJ)v_1?_i}Hf=KXIazTxnzUlHVzg5xt&Sd1M~^sd(hf|a1g9wOGbSx~DkV6T z`CpSsT!6S>s^UIt(n`@v(f%-L$~5ljrz!3~P1-cHX=vw6+EKKlXy;8@=yVo4rYpSI zV4D9GA{HVxn>-#zJB}uagKlU${?Dy80m+Y6Zs=17<<2U_iEZGlvws)*~eL1^7k8}Eu)OI)m zu%_aMQrX_lzK13Bp1v?^o*m#_lNKx0-k5fM{A?S!>v0k|?ii^D$oL_?BN4}KGb2n#n!9rUgu0ZF8f-swsN@Y3UDTua3;fiwpTo9Y+ z&!#uY{$g33H#c3=8jS_(_W8y!p4$*xe5&NCs54G>_S!+0X53k__I{flx3kN-*q)wL zOef|`<=?-L(=unb(=wg+tm|bJ&$?SI)VAte3w60VIX0a$OHXZfC7f?|bv#_dbD24u1|Ez9=L;?ic9 zzfA851HU)UW>HZ;Z*EG8diVC%MelH<+=J*+{iFWVSxQLm#nW?878 zZJZr4d@lEybDLdP{Nat?IqG?<@_hXHN#i}a5pT2fRZ7ZvwTFBh*Xd#8a7-`*89P9P#fBia;C!0pzO?}z9w>YtHB{`_1OkQg8KE>mKRolPt z->+o6H%H4$B09HhJ)-3tBCbQuH%qL_^lZuCG5#7h&cPV7KK!|?*z?}dapE{meu{o7 zt|;NXp=Q_KpNh*RSJ5f)-cTb)8=Vhq8W8QT2_r5Zily;TEUkw&RpRxwpN$gvcvF|L z6L?{7Lape#eHEi5T9&1Qu#U7ojF2OYkd$yrEzkOECD(g~<{YrOr)Ao?gwG}I1k%3J z=X?3)F1Ca^rrXX9xEvA8Z=B_uyIa=g0b)3y=iuXdBk$)ohjobJF=&+jPPKRi*TDl* zhckA|;GurKU8s1W@61}x48Jk>&F1Ceyo&oGcyQ_qtuSgeq;V7D+_)uTymBYklslVU zcl{{d&kCoUpZc+sa=xokytKY=?Kr|F5H>+ic^Yls4%yFy`vc>(%7<;!xt6q?bq?d+7+Bbf@HcxyG+~#u>>~!1H#=b@$o^ z#)9FbJp4@O{7YjC$segX?hL@3<=LLz=iK*V*DF0C+8ZI9Kfl=7l&=`_v^3a`Ph}!3yF?HHzH9*|DZH&brxN}>l?*0>OO{z;PYAQ}vv=f&I3Nyy( z+Sb=1T-f%Zrj9dO4Bfi#d$#xX7QN{HrR96eL+n9z?@^liC@yrZurXTQooz5Xm#v1< z5PK{8l~jM$H~y;l`h@4>3eB#7x@xN8>yv$bmo0JGh*U)E&8|21G`qgtBl7%4`M&Zo zT1>b4He5$;B$3uwP5H@k`_9EX6SVldSTAz+dwGb(={)fA^%m;BmnU|Q`HR?6h%Lq0 z?-k3~Ua_ix@>fP!j!X0JVnf+o?=mv}+c$R%+tI79e*|uJMVFf=*2RPR3lgn!7>pLu_(9V-Pta3T{Rjawq+E=aoeqrf%=xf6)NAMzE zZM;N9pD=R1@wL$wCI91&fd1us{KsdX_fkhorwedsbBp+Q{PSMyPcQ6Va(>D->^z+v87u6##D=1 z>AuS)*MQW+LNBxf&=KEs!aQ85a+4Lwa zYJMxOpJ8uy^49jyHzQ0nm}t>bo-N1t!AXx z|I12!;$K#!dc@Li_qVKKxce=u7`N z&hr_g=1ZJyp~+u`!= z7Bl49`QqMR-qX2t6RxKD&VTH=#-eFW-}8!v8d4GFoqi9lnC@+Q{z?87e=%v_Sutps zXD6MwDs|*an9P+hnF-H0Z33E!Bzto@3$n?SId+PzS$bwIs3qotYMXJ5^b!E2^yGJzHfp?9AS4)fHacYvs4? zyHLrg_`djPQ+$g> znnKbl)YIDfm66uO_Xk;&SpNI5wklGqa=!O|?*X2UFJ_9nSc)>1K+Q~A6S=0@;`YH=zQ}7tNfq+ zpnF$iX=*-k&e!97(|181aKI|m0|#Pl1;kq5+%P28pBXN-RSmvwikG_yx*G!dyXLBRx|LjPg&}P@h4HA2H z$JmP*x*y#T6dBwdFaByg;=2M!u54eSJoBHP*Be<76L;}pF3;#ceM3-iw-zz%HN}wP zi{aP*Sj}Jud^p0}gv6j~Q)*}o70ioV<<*ueo3#{Xt+V9A4&GtD{KM`MMx$%`XMoo9 zPk)oU_ps6A&U|Qfg-<+W)%CX@8qca++`W!tYwJfggEY;`LR_RB_EG( zai=nUtJR&#?H?MY*}2;4yc|sT3Zhr&YhoHUD`s9 zTD9WoN3Hz6Y3cXu(XpmW#HXg-bZ9|u0Zvtg%~YHd@YgZMuf)fioW$f z1;QYI>zRf&ZDD&_^3xv}YO|}px=R06WwR^fNEOHGzx3Ca6ueQ9vK+D_y z=E5G@Sb9Y6Cq}6~b!_NR|L7_1#L~-GnC`|7ENrbESSVI={P)s7y>Em*e{9I#Tn>{z zX_|X>ZdJt*@0F*1)BkUQl(s04(n|{DjdH1->nUG$-u|MCcVJZV?ZM`mnfc@oA2G5o ze`(b~M}HY>3%Xa_3q1Ix)g0hG%TR5{}0)pCJBUbo)7dHP~ZTP(b+VFeB@#E==BN;l9-!m$j#~vSv#|&aH z{_rF5nBk>k+j-28LEbReh*sh|xOwG4_IQUpO$xpyt3@(SQ;*Ljq1<~DOq0S+reyB_ zNUXApWC}kjC7Jt=EeUUS@y1JVj}|c+8RM1kd%35)w}*BUEpS@3p=UL_Zu-dRSoeP< zI@V3cCWq%Su{ipAP;f+x0sdLvRE4*K7V%clB9?yl8&R=n_mR;fZu&^{i0ET6Wa_5U z8opdB9(eU?k+nQ=vj6lx1suMJVqN4ijc+fQB0hiESf%dqQ3Da5|J*!s=Z?*;$Tqzm z^;e_z*I!#dCrRg2(ia6Vp1tjxc1L_OXjFV%JF)dOKR#I8%npZ!>(sJPjML}ET;j=F z^d<4E^u?oo6Fb%jIgZ#wj3K<^c3)1AJ)!(Sf`fHCtK(O2+|Kcoipk}7Q0#{mi6>!K ze%o`jzft;AZY1T#MeRvB!bq8ULD$2cPX_Z0{4kB%)%EkaJcH3+iE}RfwqK{vblyo# zZzvtf)nv`S1kIi!!#qcv6?xxyq!l#t;Uqv zPR&T|gl44nY{{o3yh0bjD|F6I-^E&7!=`^Xbb#keh+-}zzMoh`x|l1BPf}mW4BDs_ z#o2&cuM6ip-;Fgb>Wf+ScZd8#z>ah_Z%}T=){R4Zjhbk7_4&|fsgphwEwztt#^Ik; zTrNpmsFp;e(*evMNflpYmFRK_;t63me|V3Til|G!kBFWlkl&STgijuDB$YcWQgLIFn76oXHkKZ_z`4Q+07Ugni$#9KO3GbTy%? z_0Vrz5_;+PVZ2331M+^4_T2^6`Iqiv8_j*9ELU9;$7dJCF>;}G95KWZqsKArk~jvr zdwM_WJJa1Y%YP3#fqT$J7o^~1o>U##YFv~2?}myd(~Ad$#y$Eh(wKGM8(ftZa0^01 z((BN82s-PK;gdH~4;rKOii2Xbp7rTf;dIOU=$6;s*X){jP~267a)r6?U=4>Se#-Km z{?uE{tUECZc*yhAJC9&_&b}wCcJ8E}7-HMc@%_$?C&C7K`d_o_ne$w$_;|b|dB>B8 zkj=d08WbAJ*j{lZpO^l`=pW8sPh9VviCWF-5B*1cO4%5drq)?4_T|?NvDK1?TIb<9 ze;&@9yEqS%|1u9@Km1)D;#%Zk)elyA*!#l}Tj2fdGIyT;A*`=a4s*yuhZg0Kzgb)? z+lGp<$uqu=`7!!$&j00u=JQv7v`YK4ABWhYNIS|I@{>R9&;GnP?IV|@J@co(OFO(p z+OPa%mG%!m4IVmyv?tu(?D`jrXf*vDk82YPt_-SCzw{PAoGBj?~2EwM#wYuR=ary{5;sUfZQx_-t%)A1`l0LnyV>+d*2gR2vGvg_rw+A-jDg| zfdnbIx2XgI$xWCqHz$5EuA?1(jsBYwNV+69^M19;P06o=ZKdR<)cMt~{t`$(YfkgZ z1|!X34S$zr>H8O#z%vb2X&!8dwH+hPW6tvp{`U86)5YyCzxa~2fAa6zUmw!<_kH!G z)%bJxWbCAKq3?uoa$P?{(r;IcwlMpWTphV2SL1*CyIgI1&z!3b zzggw#$ZxT>@C^2!I&HuAHO=bYHBGXUGT6_O!EvYL#pIc0ShdgN5BEt7_j>9n0THw5#;#UdI)5e?ynGXM3vXsIqfvl$)$VO>D9XmEXkO{R86e z{yoc3A!n^ZO+P!;;%v&#S}kQo{PE!6NK%M=AeCwR7a#g&Ol*tT(j`F~&M}O|j09W> z4=A{ja3$^f_>Wd{M9M-YObeAgt;HuR9^jJ|4}|RLqvbZMxA9#fc!u-$KYQ8I36SpW zer~A6GkA7!KETdm=c04QK7^;v4NmmmwTWBnx)+1&XXp9%dsaQrN~?OnlTNy4*BN_T zr*L2P!)|YdJLU6zqm8xuz$F1%;1a)oaVH{tzvJ^g{d_Dt0A%v<#QE5MM!0aog`2|F zuusDXyVMu<`}0;6I^e>HFi+_O*(b9yl%P#p!uI|pf)X?bZin-k3*$#*=8XUfANH?m%*`>L+MP*NJo<6LQm6deWqIbM*;UJBd9ZCa`Q5GlF3T2=Q`GAN zJ;oS!`C4Ub;4&&c(`xg(q)Y*Y#ENCe` zP*nphGo}T~77NyDqD{8wn(CuAIo1|Od~s^IO}1z^s;#wUz_G0@&p*GlRh6ixtbJeK z#?p658~H)Y-Bc+{xp7|FLmSN+*p5Bko~4colKWaNbQj{iaH&|(S>^M*Hc0N}E&g|c z!ejuP%D$^4UKM*BjBw3T~VdQVu!-q2;9rzQXJd7sl(4zu)Li1$Lg&nNajjERA| zwXJ-;rFZE;Zd@Piq1}S_4}9J)Zzp&5oY{eC#ls+V zXFGY4HwxQjvN0X)yuAshj^W1u8;?Lomp4-JnZs&_!SQq?GPQCTUxQ#zeDt`5m(Bm0ApMh zw??&>m$$NIP-GeEd!6J#S;jU~JJSNgEd^gI))LRKmdG}l1de$2Gf&A^@>6^yw$kX^ zOYze*Px0=K7Hfqb-~8srz#c4A7%W1|Q_?xE?*}H-4o%6^W30f(6D^-6Al}G=L$8mT(fX4&E zV^4KS7rBQ;YTLV5=I!S$RB;WVYt)FVEr+LtS6ddrcH~G;4O`u8F58))H4$yogKE>& zavxt+mr@1RRbAz)JW*NIKC-Ur8sBm2s&3%8zpC@plCHA%8NXWIRgNC!ZJXZT%M-ta z7b(T>G%m+hXY_q(f)@M`F953DyUA+5aGc=}HM{P4ExTfc{?m+d5b-g4poqknifQ-g>8ZJf7QD~sedJB^sr z)britF2g(#dCtYtE3G0jM^MUrxn9NUCC*(jOQ2$dxNz&7#AL*C>=p z-0c6$=a&c2H5DCLO4EI-6+}43<259oUyBPm(ZM)Xv70|gNzpPNQn1{C5AG2kPRph2 zFnjtQBMI^T!s>^3qe_hklSdC}xtaUj@=wima#tx!>ph&t2tX9W;Oa@PnMo~ z)$smk4>|0A?r*3kX#Kn}Egs;j-FsS2EuZLVIW0WdQ||4(8h4MBjipNe z)wqrIRt9xNq`c~H)|4DOBv)B4DR?a1COA_J53#-E&a;iBlK*@o1rK6n`so^DIaoB* zK6DX(aeK>$4J_fAGIlj5-+G5%HC~BYZD{J|Uh;syd9vN~3b$o_KP5 z4THm>UH^X>*+E>!(z%h5fg&S;{Ut41z2zFqsn7arEGH$}HI^;0dvAHf7=L-tvGt7* zX_N+LuWs>}UEIbP8Crmk1(~04T7@roRdsW3%f|9UZ_5jObd+U|?u@eRgFB<-F8{Ly zuO?HgGsOdjNiQ3jIv-`(>l35p!K1cNQ(LI1H;#)n&MKC5BKd(y9xXEu@)wGE)vJ^g zN;7#T`MeQ-d9)mBnKAP&gX07{u4k-jyAiN!AGw$1z7%sn{}~k+0eO1*^j2eeW!KgQ zs^ICJq2c?=OIb;~=)DuJTAp*XGn}UD_tRp3PD&r|GivpnK5`d}Da#LiEDNn)U(3nY zn!c94kMy-14Ti>8-WY9+v5Z8Eu}m_tpJm+J`&o`lo%&nGeQST;>`q*MC$SMcLOUP@ z1qFsyb8+s>0-oLq)V=-XPBT3X!Z)X`7o$mk<-79x`2MLUSeww1T4QDawz8r%ix8eA ziELA^30ltfq~$Bie=8MF>yB(N+QNWX%TD`XtUTE}aDE&sck#|qL|#{r*PZ3>l1pu| z(N=v~Q?InkodGY-{^C=eVoD&z zlz`_{r;xx%68Pge<5a)3%Y*;sh4C3LiFrq}>%zmHoz3BYFjjs3UX3_Otdv)I>-A-(U zOVBb&F>|@M(R|d>gulpWs9X#b;Kaq`sEyd9A~!} zWwd>eY<}ye)8m)EH?^sJmua8Zq2;Z$L(4CH>*n_LMwFf7EEj81uj*em*o zXTMpdFJqhIWQ!NA)RS?H(=#67UjLD1*O&hl<8-M$PV=L~7md?z7%K=|&gYZH{6{3$ zn}tR$?;b2iSZ1dXuZ7<1G;TJ$@4~y~JwYwrYajW8imCQ_{&TQw{mP%7adp_WmRIWK z*Z#${GLoNjh|Kc5oVU=I$lhx$FN~KDkw=*(kmik<=~)3 zRYPTqCs%6uP~TNtu7dx0qKdT0Ta(gP##Dy+jpz zVyZ4t#TJihlj`4mB33?9_?h7rv8%m@$q#tP_>y6Av@zTdlRI5{U4HA-FnJz7u*|t6 ztEtz^6I1=O6z@sV_6s>&sGn+9fuT0LzTRkT{tI|s+^T-P^;ATHb}XCa-0Wu8l24@I zpF2UQ*L0W=jb&W0Pl(Y#gjwva!3>Jm~;%U_ElW(M0u!phTz#> zW84y)qurg$zKxNwoiRJ+f*Dw3JQI#Cs-fKlzSNCH1^rQEZ50b6hFg5DK57NKK-7vv z-#wz$c;MbB-hJ{0Q^Q8eVJ(Kg8Zv4;Q%YVDpe3*H?@J%}tkLxsjg$xf&B9*Z#ssa9 z%oM605PzpKoMkJTU4MKm1uqthG!bHv=FgFGSIe>H=nB@@SKLQI#1fBZ+35OFa+j`u zch-wX$z3h)Bh0TL1g_*WNh=>B=3k18nBN&?d3BMKEXUx{N%Hk`JoyO8&%Nk7FGgL6 z-%b8wo-uatn;;|`w^DKiQAeKI=35%i8TI9Ac zs9gCa1^bdOj!8Glo$v9^`k8V+B5n}Vlq-Tl#cNSboJrG4@wn8NLHsPh51-t5#HZ1` zjTnO1$YH*f3|_@FXccb+<{344N>|;7*6z7>UabnPO4lUvRLyBu zs~g736K%(E9#el7&IX(f>WFdjOq-O$hYHmf#>wM*cFbw3b5n#PfF1;~{$^#I9fCng6g& zS@simE!$MS$^3<*~JjUiZhG(b}x9Y$2f z%Rx7;HriLSYs*^WRe^(RxiY%8ykJBt%GI37=n(G_b@@&5X48mYWg71%kl2J4iS2#L zDAdW5d=Ez-o+RHAyPC3F{b;l6c!9W~6MNp|wGCw9`19u9dzoW&U{y{LE9&}N7vcu| zDqa`zoa1$y{$!e5Ky(F<`p>eai*Y6`&tss`a@2cLs6qWpZ|a&9W)4PQ96>YmR^jH6 z+BQyU+oSZIp1$-pk0Pa37{8lCs@qJdj_1;9#N%_3+fK9_BTmWnNjKjyXHfXrk_4^l zQ7J&HQllr!#;3_zw(IIg*`@sGbtT;IK4}!_(#di!@8!>`(|26w*=MHja98)?`O^8U zdUmqhucs$t{0`M)?D>C;mtEuh+4H*8u~R4^!=oLK_QytQ!yn_t3<7lL)dAzI<9wx; zh#!x?6#S*&?^KxIU%0QNTArzcFpkH>B*wAUD6?kQZB81A>Y8HtTp?nr<+bL{sh0Of z?^*k9JI&Jf-P0`NesvlT5LQ1%3s$vhmbZodrdtMFJe`2s2)Ipsak^!|lhy$T-%P+N z0#>Pa-)tH1&6_P#JSzeoC*X0l-z}B_AH2mf;M=!w=YNiX=N@ZzWxOZu{HvKfN3u3| z@twbUJDT!1zg_n@E5MH%4R!Dgx%br<7ERqi_8IsxxXirxg23UdO5Bv9y0pgjrPZzQ1pe5*Y3FCz55 zWay1ByhVgnL|EmGum=%_`yzDSCim(vi)V~ouoP(1AR3B2*S7*v|Y_*(ttr{{*?wu9>1W%ZsFn(q#L5s{~(_XIlHLdbj%L?EEoqx#@KVP;D-lnrV zho3K-u2mvb>cTfU;drQqt9AZwj`;bqTDVr{k8;G%mo>pnI=`PIrZK^sK=2bH!~f1P zE@x`+Y&m9Vc0aPxFH!T#O+0z9zw)B!8p_O@wE3;G2xYhOHD z9x}#X>}^96Xy<&K;c+or`nEZUN=bRV9X8HB)ctL<(Mvk>M%fLwDSSbX_hO$-)KZ?H zN2tHfW~)nfKbd%Y-_C{EMTq|D z;=BtAO(asiE+RoY%F&}79dseQB0@hp<3cz`JE?s+dYq%jIU0GvUNJyFI`)E{qpj6$ z9IfYQy;?Gd6KllTsJ?@<^*Nm9o>0G;BZt}o$xER6CvsLW&fq868hT#rY!GiyUO1mk zR2A!vaK;@u+L5FGId8l>_v`sQj_z3ZE=R*T8qU#*^Ts+)&G}-EZd|vEqcI$f;pmR@ z#)Rw0`BIKPy>1If<2f4tWV7mYu&R>)B&e@D$Z;~xWc9Fcrr=Cbe{#rAb(wL7N$wdj z6N8&y1`TG(|5@KFvZmW(i|BhPt!c}$m97$@mo!I$j1Zv zS*MxMBFzNS3|>v0sq$TNuNFa!&S7jw^)y${hSVg2B&k#HlA~J$@n1U}EmCoiN+v-v z)$Mo5gIWafr?QwJMyCj}FRtL{URQHVtG1mdmyDRfkUE3mndi^A_y`iiX)-RW4MpHKLt%n$IJtjyOB2_snOL-Ef@4)pvw*7S35}hr4lR;>=X% z31<<`BDF#|%W#&dSN;>{ah%81xj0)l;cQx?mi<#6XY2U1h`7x?Y>A7(8KaK6M;>NN z#+j_Hx`+0Wjx$}|dyhQ8mV+}#J#&vd-j;_mPaU&>h%0ecsvCr}24{`>t8fNBBl13K zAiObvc zMe_Bwc%1R7x`=JBo=mzH5lo+psvXi<*7lTqNd6eRV;*13lDHQ1XP{-3c19k(DDM{g z9q6$Sdv*1JbU7l+Qw8E`Dt_P5|2?Z#yl=OIfz>cswuv!&Ph_E0JLH5HTW zd*_L*BW1-s7)A#C;SUuQe4Y1|uI&Ep$V$q3X_ORvIa8Nxu_?QM=nbA=d|$iS)#;DO zzr5IbHwSp<3)QsJbc!Qgox0e!-6LzUyxdlq7eJNB_fb*DaUNGE-zU$WT*vv>bl$X7%uyV$L+9s~GDpeMG7vI!;n}5Pj*<)K>ipzVF-Iwai*#PO zRLoII;ZmI+S}Nu!`{DgM-?!A5qlioP<5|YqkpB9ms6?vBqov!DWT~#5v}~vP(Nej; zEy&4Jowwv=@-W#Jk2_vXe31EDMgdtX@R!Xpr})aZIQK`Eh_cCp^K@RaM3l`Ac!$pS zE)iu@1y|{O*Ah`SN8zJ7-@ZhYO&wgP^UX^{*_?yV>3q`?%4WKzkO8GYBzWTzQ8tlq zq|P@i5oHq($LoCU5>Yl2;0ZeSUn0uJ0XuZQW{FWY>hOo;nl4*7g1HVZtY+UqHm_$U zXuHvNtAihwNA#{K;CG%moVtR+gC&YuxVGS-k|wgU@qx?2=|w1Y>V}8q*|r9p4eI%a z<$kT3a5fdF_DuQt*5`1aD^QPS%6Hj1uH{n->WJlxbqQ<5ykNz02E%DMr>UPWXV_bY zbD7%n5uz)^S*Skx2*dP#ocq;%k8lUjfU`k8^$3r);?{}1_&u}aRGVWRUtm(7$YSLx z7iX@zJxhMrwqspuZHGEJTkfC^&z2S2G5DC^GaV#V+(>-skX+%9urQ~Jg}Iq4;~E8&M}^&CqsS9*FyI-}Ut)YCTN*``jf9v@i zxsU9P|L~*o*w%GKT34ucdrawjYoC)j3begIYHcyy-c$@G1GnPRa(B5;ruvYEB0Q zccILpHt;=eRb5TlXK*M({dhIaDF-!2{dG0*RHIg_L)XZIqXUbW02KXE-0a$SO3bZA zoz$Jm=JYSm?xP*ke~lulNRMv~O(Ug<6(e=;8lui6WUhL44G$MfQA^eCPcunAj^E?z z(5FeozA=C%uT0p@OG`>Xo((?phshdi~-GkB=PL!~<68Omrs&i(3& zXXGwd*WtHrBg?1vBvd3&Z{p zUT7=8S)fMebM38sUZgTTpMF;Jd;oKxihQ|y>v}xYKd*k1FORf^zrf2@YOiOhgWP_SnG3yJNLp{j}^#0 zjDWAMl~W_S6$fbDOm#eAeoyK+v~4JL99b;-YV0~VxZO!I{OPIhC)Y)CzDG zs9&w4d@6BPs@+w_4Smd0$E$MJ)(xl)#p(i8PO`<9Fo>#es&ZmiPsH89n5Bjk${*WuaOSAr7s~y*Y$;)fY>8OQ+;DFYA2847Y0fqdZ&UlOmlJJ=a2|SV z@p}2PR)gnr@tJ?7tXRyK7vNrSrb&0F<4!*lUn2Aj+!<$<>F#B?m#I68 zJudMh>N9^5U*Gmb#0TYX9!Df1B9B{-Nd2>jeHod^nPT<=4&j_G zG|m+lL4^z{n?(ld=Z3z5(*^NuAu$jr%~c$C zEfH(SjT~>(kAHPRe1k$9mzt|N{^^oPj&~!yZd*kBA6{Uxc9rg-;X(}__AL=FxhCNu zN$p)syVWaBon9>WotTZ9y`{Y5p%Q+3;DYhQq4Yun;Z|{p_cW5LXfB@S(FvEQafp{N zJZ(&T;osB34i|G_-A$Cc)#hS)=pmek)UG9rQ8hSg)DbvaH{opBqNbI|;kIrsl5O<~ z;UgYry!vVh1I2ut^VKhent?MzJzpZn-kDA7%l5YV9NanHR-cPI*W2n><6iA;^@X?# z&y?vspa^%-nI_#`jJxFkqyyT>I`bH0dCOQkt#YxF#dyI631txicS#@hwGe@Dmq0R9H(<~s^}ESaI($` zsiITNf@kR*pGv2=S4&4o*9Cj3=oC3{j?Pi3qEi&Yg*u0)icYZu-l217s^}C|aFxzV zs?jOLthv|So*D8o-lqwa612dr;*NL478YKu%4qQkQIMV*^$b6rS`_X!_GZ`k6XBZD zTXKE&kWu_CD`Iks@KvJ{r+KS|!Ay{dBl?8MQoP#vMY+Q*o(7}jH&iSuk%HTBU+ZZS zLK#OB6U|J?A4>OV<4ro>m$Yd3#rP=ZJI+nTq4uW|E+g}LQ&U&GD0doWb%wvWgY3M> zub<6--JY{?_@eZkje6uoM$jlqD@twql04StX`Q#c#0_K;YLc4ul6=2y)>b}Uqn>$5 zUVQ5oa+`70Y;62mUq6bk zqgzE^9yeR`^?JBo=aI8TUk}26&^B@Wy4j+ycZ0j>JaD$?>vq_#bD!CwuP4DtI`^0@ z`uYrbhR#>drms)e79cFph4!;WU(bfKb#6CX^z{O`K<9wjqOWg*x9R-HEYa61;Yyu< zn`QKMb;}NUT~ALt3dt`k&JDVnzT{zJ+m5tdEKtpURUYN7ffrwuM})DS~NZABa}QWIb2Ci~dS z44p6gi}yJGk8c;n_sC39yp3?9&P!&B;#Kgkyey92J5v;IBpj*pT{A`T#>4SC-#$|m z?*w>)&Nt5##p{3_I^Q&t;+?5wAY|ymjWb2@=EAu;-!M}YZxLLi^R+WY@s`4+I`^L` zig!P}U*~IP8pSJy(qVJe_qWPD0@iBkk6Yy!_1RMHd5+OTkEwf0*)n$==W($l(e|>? zAU3OygFMPZuPRQlyG{3eMsy$jhEWtzRi6>vZ3b(X*Z6?j&VG8jMv{3>_&XuUTJpy@_i7y5qP&yKk9iD zAI~w&b(5S>kytK%TQ}@!s2UY>l}Z1v zwy%$is!abr=bjnn49w`5C^O3-gWwAIHcnVrnuCIZNg`rWVh)NyNh=9$Y}p5F*)+9{ z3GLQaH&iOtH3i=W6jKqD-JdD_vK|XuIevdiC z+jU>}%Q?f2I~cu7TrqMygd8r!x%My_|KO2Pc%Rj7%mKCy@IHYuUvz-KH#8NYKwCa1 z+k)5x;VMAm$80839%A!oiF+vyM&7m@|iwSdvSYiucVT4_MxQv2F6StQswPsW8z3E z8#5c>-zfR_r?N3q4u84i-<`_FObz@sl7D9^8#9gYH%k7uQrVbkhreC&zmdwuOfUSs zl7D?F#>@gy3jwtI7{ixS*_biIZ60B85%gTU19Fn{k{Wd+QT3U`~?EjOaOEzZpv@!b_ztZAn~ zbq&;fG-^H^>BB1`#a?tvxt@n%k;ZyjN(Eamz6PQp>yT(2h+giu@RgEeedIuR>@Q{iq6a-9Dmz03CjmzfUD8DLU^c z7Aa#75^Rb;a};|HjR#R(^lwLb>eF`+n~ewQ%o;v&Ldqd*Hyy&u8;5Yk@DP58E`=#n z04E_P?1^L}Jp0fCJ8VeBHm2UL;YaJX!MP2YQV^L!Kd#{?4wuWu+jn9BXWG4GrN24G zSLj_gu;+Q>1<+_g4Yb^#pC996!)rjK=1`=l?Qg%SPYc=+=yr97uorcxpT^7&_`IM_ zuo_O>70d7S@klq@c9XSX3$OT6O8uHd`z-VbaZD73Wj~)8?^5@Z<*w+)^MZ@cj6Q(d7xT@!EG$U$2z^-yp@}Nf}f?6 znR;4;9y-AX56?#G>^o9>s`0B6*g7l+_i{SyBtK!i92_aG#^;G&K$Uc~kG$I%Z?@?(eRS7B$iYCt%d?whsHIEB^BKp9ud$2?F~O~fkf)lzX z?`5;eZ1OwVM)tL{F9iLHUcU!#KOYh2F zdPnxg9qhLp%0Qs(1GW`>U;kO*BI&HK2HOEYFH*%_G%IA9gJhX@+Qcf5tfHC!5!EclNyAzqEk^+B<s^1qPCES0nH zpOyTp5}Bpa0)LC-e>#y_Dn0P`NdBdX{e7(NfB5jh(J+*wJK3(3&s^|q2v&~!<@kk&{Yw*^=*I+jx3!g=;{x7Q;0VYemtYnn?BhA z%O7TeR2~-za&2!mR!h)e> zp-Sn}Vdt}HC^;3HXT{kJ?g2*Nr|5)7ZSgu&yd4!{4Zr#{H|~oSsMu_J(w~G3<6OQX z=L&GdS)zsCqRy1?E9nh?lHN~y$uJ^C;X8QNxBp4poQ5`%V4JUyQ z3%y)NIA{yKtkD!E-mXD$w3r68QV37@hi4;JuuEx5cuY*3J^E^s+hU&s){$biJNjy~ zTMJhA2ax+!g;pI3mm5GvsivTzr_k*IWTHxHbNX=r2@TA$3SyQu#&Jr?bwqOE))?&| zbc#ZhzK{+vkZFl>s~7L!bQ-W~Il9o2wS%|U;_6XNFbBpq$Z+kj3iyfxipyEzc7-7f-Ec7k;`dNsCY;Iew%g>7K&Nu$60I~lq6tV z#M`UmD`ul7V1AMMHRhOW`l~}YSX<~FIdBiN3H~V=r<%7Vxe!)&wfK@=?ZbvwZuL7>Kkq)vpfSyqDSb0KoX=9 z(82;fcSXjj{Og$__&AU}_h63Iyc36fR!!Etk^~I02&)EvXFI0P|3otd)$JX~f6`3y z*JUS`{IGH&dW*^Ai}RX4n#h>B16e-NK(;$FC_Nc)RD>4Hv9cW<-X3QeDYo!j+iDBG zKgGHWd*vsCX<|JD)YBhKjmsz7lQu&wV8keT9wF2hF5woIk3=AN^9n8SIS}YP(Gw+Z#~1uySDqtw069 z$F=zlgOz}E(e$wp67s8Qv5!K?s~Z1a9CL(V+sL_WBpFO3e_1HoMtU)fgv79D$qRAH zLYHz84g-FtMbH}jTW~xY-OHyy%wF6t69!|9hnHwE^^NVtuc7qf3QsSJLobDqz(A=q zOb^WtFR>wl@x;*z<4cE*A`=p2K8y!~dY5u~&>D=&=@$?DOGB1&YOUJDILH+>e<+(r zID3ss&;6hZx6VR(HAucbiiB#$_DYdhWgZDEXx z_1EG}$BiMgR8vqlQ|KSYU>fRo22Z%Hg1UEc9lwQ|goJolDFL!*fZ2}uLWm&&v@}dD zk0Z|hS&tu2-oIbKI26EV2>3K(@ZG6Hzw!=7=u}>(GsIcg4zrYlUKvj&|7!L9+yt^i zWxENxhXz{6IF0S5!K$_^;hkq8?|5QvTgbwxHoS_5&Wv#m(*oLu4IZ=TR;Yco*x<3< zB*4q3g9}NLV8uO8t=1oA2=cHoVWY24gld=P{mO}CmS!M^w-RHpOnjn68ZRCeOF3+z z-BjDzCfZ~x37sH`d6Q9P60CpxQA}F$s9VZSz-x|L^Wcm-d2Xm#G zX~>smbhqt*{!B#)Qk~21CB|QE9MMmr$nuF`itNZcK96vP@Ob)BfVPImA3Zew;Z z<{0m^FZc>3Y`9&+hTFBl=9jZsrz^ECL^G6HZ)G}49h&ch8%y=R-2uGCW8h8~FJcUG z5a1%L8?V*d>n)SDLow?%V+=IYx2KS~Y7Za!-4rq|WHm~@8a0KK zXh@kVTQkXFh@&&6k~oz-AYPkFHhY|-AA(+lQfN!lX<;?Ye~3i*DIrTZXR$E*b?rki zgJiQ*?@$ZFQFhsgyR|F{)AOyl?zVH7BD0MgW>=W^XatXeRKkQf2sO-c%pO#5_)*p$ znHgt>)unV9aC~GkBqFsA2*;4VZ}gpX!b=Q}M6qxcP6(njusc_=Brj=tmm#7A<6mRP zno|}GCz{5T5^Ta5&63Skgl<|y|2U0Injou;mZQ;EFS+%OL<@mIp%~>=9o~>zVP2K@ z#WXUyU+E09k!Slouh|Ih@1ypWRJ4(ZOuLcUPp6a^sU4a4ouu=q8Od5Q4RO4DdPvbM zi*asmrjY!`jF(eh3X#mu+o4EgVfWc>esYL_`jD+CiVV->qhF0df6X^0`1~+oYT9vsg?FFsGF>NJv38X2Wc&S>y%TqztcQMy1im+tnL!8|2mv zwRVXA9a)Xo3qd1x8izPWiriqX?Ny&>%QUSX-C#iYqhV|dK(BV;uTI^&YzB&=bh)b0 zi(IT83s<#N`#ypP^T^|hiJ^z}cjr=ot)d2&Lu$N!@kNij?eDkUZJ+dod)8_h(z1xH z)!vRJ6Fp;?Ee){-jU{m!4C=Nn4O=!v#F0fY=4%2N#t15Zc131S2fN^xgDQc6j7lB` zhVs}-cFYsh{O5xF@;vl7oBW$V~uCUtkPLr;aL)2E3RaHYH}oQ zi-B;ybMZ_vj~`|-WmQI&JYBK7;>(K2%C9PSSF#nxsafQ`Uu%kXo{T4I(m#;T&nB5F zsdqace3&fbpZJxw1g2=S{AiWd9yJm}x@wohp4?%@@sZo86@k_C`X5nR_lEnk}QVu?J zv@-h4ax%-4NzTBs{&J>rWGbg^%Sobf-DMvUFei%ZFYAEkEEoq}Z1tD$BnkA}c=`JZ zwPk??pTwgppCkc7pG$x=eJ=XvC&>pB)E-J#Y#hEDh8E}x}PS)=7o37ffzoJS*|`Ud>K;ZB|<12 zfRpa7T4yVgKPa*;J8i|%N2uArWxc|Mgzwm0&6xY22W2+TQ%lJdA5tlCS!tn>wmYOv1dfN zwk^WAy>Z$v13XEb&t{Y5=<27THk?hrBRXDHc3F#7|7InO)je?Tp^J0KK9&A7SUQJ1 zOJc~d)b7TkEl1zmk?!EK6m}o`m1TPL@yuLOqFN0?tEoGetW|}<8Adnc5hI+~&82_K zBcls4PHV)B(}IQL;f`etj}fC!$8W}w)M<@X|ES~fd7Fil1Ws}4#=W&pCjXj6`l4Ii%zew)Mv~Tx1Hv)R8c& zH#KxIy5#Tj$)*)@>lb>uWO&!zt42V362 zk^5v0ofL_pQLH*;gmsR1ccyRuNM`u71meYqKpI^{MyR%&*WtyaMMc<3-2+a0oV191 z!mDb~Eoz+4zCvPD>UFCIW0|v#R&OBn(}e2-dPBI*3Z}e1*CJ-(D$8|ts|mYIB1^*- zh{AQKju5sRGRwWm20FKdyfb1-clCa3 z&2+QNtu|!0btgLrrs9r34M6YNL@c2lfo!L;Barp>jzAp{?#S97zMt(39=r_G6xZ#S zZz7Z8`x92qMk1Ca`Tglyr6~!TqYSknhuz~y+NswNQ}TXqh+gvF)9=rUJLzbfI%5AqGXd%V-kRhjq$&k~+WDp?3=heqhamCH*uFElHK~COKy>u9$B2RzLl83%PH)Tw4i{s}Wb%S=oI}ReNuMUxmc40{k@Q8x^dS zG2&TpJ1doRpTtF~=|{Gb5s!isa)X*bXK$#8f)VBoQJOxi5gZZb7xuLn_|GhTVdL^?Ww& zh1`ZxY~|%LcWn1MxMOM1Tjc#9y$N%+$-8@jLUiMRy&DDT#vwcX;w>DJnK78mrew!- zEitiy76yM94f+e292jnr7b4-%0PJ-}d95m|j%Se|)E{a6O})DqUn!rd3hof=J=RET zyl5~97^WZog#^!w$Iy(2z!-v#IITanJd+TT)V-iYaQp$Pzgmw^7$9U$H>Xt^*r^6F zvq4}sQaR?ZJ1uytOb;stiD?49qCxKJ%47MTI zma8Npy8Y(eu_=&rw##cFLX>qlCr`fW0Ss2a}_+|zq-2e~)2@hqDAmU+^e~>p}B41v*$R5 zw(BOn)vHbYQ62hRTzX4K|HMyZHhhCcZZ59NoWlhjq&L$gJ4xW+)b6UQ9c~paA1Hn| z1T)90JIVW+=g-|-rmzd*^K{xSvN>SwIS$RZ_8jin0T3{E<4 z4;C*i=LEd*wQCQV1Sb}C&P#j95~4bf^yhI?pFE~&h7)_2`(TX8p~v=-86Kyqf*kOM zR*;*T)Nbxb&QZ1!Jzm+r{Cssk`9WTZIyW33@AIng^DtqZQx9PiS~d2(2HkwoVe-1l z0;h$3dl-G&f)o}y#7RcQ#hzb#KqJPU=Qy%Y*g6Ep{6vhC*z?dn=ZC~TW=RkiA>X3& z1je_pRRQCDHhjLokl1;cqcaejL0@!|$EM|-Kd}$Thv$vfmmiP*;$!#bD{gnZHbS2$ z7Qx0VIzIz@DrbHy)T&GoTMhU;m!FA+?EDcU8U%}+L#s$2-d1HRZRfq!{cbw{2$?!~ zBS>sKufihqb+}%qZyzBcDhKj8ob^XYy4PeKQ$r>xeR@9k6?;B+K6!#v@H%-8MOPKk zL1<_#EXpEi&LZbiwd8dY+JHXNkc;d6xq@Tzm5;Dtbjgj2{!khi8@WOW#)LDlp6ntM zxF9xK%pP-}3-XQ@7S0TF7E%_PC>ny6qNf_@H)n{^XbQqlsRzN>@)dAYHy5hF6vT{G z6Af;_iqX=lvByhGLJWq0+kKnHs_3gkY`aNO}K#Uto|o9GyEEIS6PZO zmp`dRcMJNEtWc|?g5t0$jH0h!z+H=+Cg#bZl^4h-gS`c}h&USpm(8D$zw`&rkpkz? zX`hnCsyuMWbME+*93}Ck7&ndaSXE<&VapG1DOtEzCzMLooC|u^mCN2zl9wLXz)4`b zq8<9JJ=arisLi`)RhEBxb!HlB`$! zu)=3|*sgSI6DiObJQJOPhBT8?9&>f1Y_2+Ct{&hKR=xk$e%Dd6WWrYdi_{O^)-($% z6uj5aq{>obQS+zEXq9cK{cX-um&s;+Xmk+H>w=grkH+4AbP!JK=n4`04O7tEQ|RAC z5;#k?fLVPNW)kt2EnsY6p|3C+He`+t3c)XWtrG%F4}*gri0N9f&~IlpkH`#VJ??<PPwhD;WH@oVgb z6~b9a-}xHKt_sd7Dt=8~QZ=BW8t9O3NGN@!lSHZ;r9Rw9ot?O6&>xxDAHMt>+{bAY zSto6z8@?gWOim5biK#(2#y|zbZ1CsW_Nc;3uq^<=Q-h=_&G9Fto~y@NlEY;Jc6=ij zWa2e4Ms*PaTy&;iBa?ZdL+r+`P=`o&eoKB2U8%PF+5Mm^LtLb3Mp{s!)UDHkDAW>b zDjzgwWBhV-*fePXv%!nQGz?yB=7M`3s`KVfcU$a>c%88u9fD5lBHKsFJZqLB zLf+51YkW}tItdu7%)^>4FWK>tVDyg>wXOK1aO+5sS4OuVa=Y95PEWmZ#64T=L9_Ja z(%9=HAH?H5gHOOymeLLh?;`FLuajY9DwDb~Ufz+y#b!t>3-U{)8HQTj)}4PP+s(>y z?|0Y^l-YSp!dR*;KVc`0b*U)yZ{Lv(9=>v>w4eb6@!$CVUgG=g_hfQ`T!-Ej<1f_V z9Xf_>xqQW}jaGc7pcQHyRT zEZq^-=``X7nG})Qjh@&2v?Id0J59eiJl;p2WakA}05SW%#j*^-Ih>S+uDwBm3v8{d zs%_vp>lCLo`^Q1YX|q)LJH-6n6Z-ZWZuWMS3R9vBGm0x$n_d2dz9h~fWC$hAf&klC z)|U$$3v?a9_>o|V-W<>i2EAY$n5IY}DF_*kkm08L&3fxtnBYCRg4h#~du!#>CB;~Y z;rDU>`LrVe!5Y?Yrt}hXgp?##YaL*z&2AQa_5Ricj>WpKgH`5O^hBkobpENA?T*QZ zfk$tWzb8apVuQ+H!R=5n>Jrw}Ee8F|r;RvpXLmsjg5IC`*gi(oC11cM)?LEA&`awd zpI0g*`It3098W`=q|tr1NT^OGrw2I&CMCyh5;Xe1ixSUc2Pd(-+Sk{!uhq}X$N;i5!KOEr$xl_0)EJjSl6i zp`ZOg#@yG?+FH%ja|62J;)8nYutmf1^)I%Eun94Y+oo2HC#2I8(%DKM_>qKr>Ll|= zvc2ETP_{AKL+KpqCdbJbbDK1NnW`7fZSoktXMZ@(LD{vAv2rY)h@n65ij$rLmQzGA z+G7`fOB5w4)roG6c*40>P{f7O__2x+&g)|oZ>$Jj^7M1R%Y1TG`g7y+^7G7jE6usf z^UTkz%y=$)x%sIKU*`d;xRMfV>r`+I{r{BxF0Rn3q#HMf&5yvZ# zg+(n_6noMrvaTsuTq3VBU&Dqzi=D;WXu3;rd0eMU!7WIc(NB5Wv}uw%woAbk0d;`a z9ZR3-QcMfl1D1P!1F+{EV95zx)2#>`rRO;g|K((Xp5!cx2aKwml!jeb*c66tNy2-0 zTHLMB(y?b0e#~VE^KVgbUNoLja1#EBCy;ke!Q}!p>9oS&Z0}akG2^asT+>%duGz$K z&1O6w!7~}pzv8(Q&rUpDO77AF9Czs|6=|{v7q?w85Y&;o+; zXx)cr5}ql}Z3W61+Ic2HF;OWfEX_a*Z~=Y;pohBy=!M%K&vxJ<&@<9%GSX*0=*@3&rfyU!6gtp(6!{-T-bYviQAm03_M45M3KR~D$s;oL(_ z#mYx~79rQ77H3Ye@-2SQLK7m&fIdNy$~g^hC_h*DEXffROY&&%W@Y5#_B26Zw*whK z7LW}f-kv8Y(ovRl@Jt8qbns1w%;}Ih{RDt=q}Krrz*(RXxB!5AI?9{gM_0e8e8J~c z2>EIl?R!%hS+IV!pjZ#O8$fIQIskmvmje~R9)#n$0kk%N$NEA%=K$GoL$>u<0CVR6 z`9Kk{5hw;W0b77=Kq*iL90aO>8sG#_C(w7O@)cDQXr@rh7G;16q&DQyIa`zuPDSbs zNWB56Hz4%}lxzb^wxJQY09*u`ffk@0=m1=T;thnq(M;>MptUyT35remvoNnZ@k`(|usN4@~!g={^XyuZU{jLfi>KP@K>LdcYqr046#GaRs%h zf}$4rYLTxt4M1UQQHa`NAO%3-YEih_jX)Lv+O>87{A$6Yb_;M2r~_#6~GB#lTe_jy#Pli&?_iT=>a7m09u5#04}&WJllZ|paiq!&U;@lQ7!Z!QBA^f`1~vlgfP(-8aP0v$72r<}fQ&8>ae;^{A6P9Yx@+(RA(sUh z3&aDlKr|2qBmr{(#%Ky)1I_{$fNj7QAOo-isXz*l24n$sKsI<3Y{Z{p0FrehLz5QJ z0}$r(9-tR)4p73~ho=A-025#a!T<=+G#2?c0Yz}f0`b5c075o_aTA1V$^alh6Zkc; zbl_Rg1Ob{DV`Og12l9YIU^Q?Mr~ys@bwCwx5oiIL0T<9CD4IDu`|xDKwF4bMC(w&9 zC7=aRsAhk_0GI$X5GE)T&Ed3jn{q}$k)UYX1e5{bi$iZk+XbK<=n)j{O28ioLm^Xu zR3Hto16e=@5D%cx-6(XY4Tu#K-++b-@_lKyTGsu47x9l$jgFM6F}VrL`0N;sUoFzBe^SWQG;R&mbL+@ z#okmmfEo~WqgYYX8WeRmiyD+#Y^erI1tDt2iAzw_@V>#oKHuxiPBJL_{o%b{6Z6>!&np&)BS_U#vOLvF0^kdt#j0FKr(=~Oi4cWmx*PP0N7{6!y*JbW_ zL(?upE=R6FCXIH5iu@Pc(IxoeYron!!5HICM-JCaFeY&|$$jz0fYCNnLtLNEyY`z- z*BC2~orQSUXwB)G<{73>HP#>YAOT~;VGSwvUu%Sp=`*_W|I&9`x(}()wB)VP%q%^7 zbk@9|uUdWcjEY;dAr;Zg#K0-UAPXtUn?-JTPDJKW6JduBJyeKqrjsN3VyZMOx+ zCbtXuV~NYWml#;7(aaBBWwH5DjToGAl@WvATxnZ$t8}!H);7|rdGdAg@i^slTxhhe znI&m%Po`Hhm+;$(-?#X^z!73IAvU`Q851>^c{O1U%hZqp!gfjc=A*9i*b)_XovWO% zuQ)C2`*Jk%@pR2|KILo0w!j#Z=|b)y4LN79cb6*^t5EhTT_NoCInCb9IYW)@-#ju) zN}VIUl`w$)XegX##+rBn9)+}ifQJ5()3tPY^c$6 z+-dF9cuUh^?P$A3GyjsNnU|&qj6s@a__O_3*_IZFO^@Bvv?n>iD9ubqBsMqBYK*kh zv_xD{|HkbQzkf><3VR{X~KjVDg}h(Y4ya<}fauH3{*M|b?> z^32X&>&pF|Sk)7&`m=gO&-+%ae(s1>uGSbcRIIMn8j01m3C_Ig?h6=GJ(`HwU2BOQ zRAnP<2yG{&y-2TSW?^-&|*QseUHpsx+P%(4EK zSWC2=@@$Fb82i%QnQm`^G1uclq`h~RSYVePm3}l*(^?Y=-xPFb{X&m~m%gnp4H)aY zYKW^yA3dXDhDO~Xej7Zk*xo&ICh@I<>lD|IEP@;02F2S(PKI0H7R7ZV18@fRGP;WY z$jCg{3wssUjP%39;9-h4j2sLH;DF-rNFQ7b7b~tD>4oRQa}|e1>hNNCvEt<;-EasF zDJ~y5#b{{BLg?4chc30#-C2{IXnncvy2e;zbV$(c?nQ626Ms9q8quM_qmxbne5K(lX=?2;I$yhkN;+(lCM?jo-I;izW*@a1po^OXK4FL!Yd^q%?N^p|z&eTW!@x^?#_&1X(oH9u)? zKP4%N3U4Nt?T}qB;uksmf#C^b~xJKH%VYM)rO=q#Jq^*!nYAr3yBF6h+@1{G z9c+wsrtFetB&l&t`KJ2VKTs3%;=fG}HQG+fxZxYk8ijnCrv+WyS)9y||0WqQf}|kW zy}$@{cZrxy!y6fEBu+gt>(gi^@1?*v}$KeUru zB{3gJ&eGNjbiaMSnfuM^{-$A9`2)9F`YEI$oM-!%bl;dtcO&T*%hUV?w@U6D&$BJH zV5z11js8JOKYfhV%h+|$IrhzBRAtWrG*3Ds;oIBi4KnUYz5X)bfrB>D>S<_N7PyG{B^skN81Ng2O?3^Beow zw(pyI?Edr$spH*zjXc$MAEO68rcaacg3Nmw>A$4@>s=4_pJE(gOnT&)=zYPKnn2LM zF;P-Jt!!g?ux6uH(y~zt`d{=JPii?vSj(clFM3BaUqx zT(Pn>v&FI%?19S<|H&9^JK_IJY*ng$Ql3ulF$-RxYe>?(Oy#hY(=Fdf4jY%tyuj^Q z>`j{cPP#n{y>5IgWgZsqq?sO4@a{R3=}FBaqp)#Tx{P&0UH-aQ7hi!fYnDp{@)`GO zjHk`D8#Obpk7kY?Sc#R-&XRZx=<24Q(9BI;tl#D?K107yH2vN3B+r{B*M?hq6V3c} zX433_Qu^Iax))y4`7EDU>6*2W|5tXlTm`a3_Xm0{@pEyPa-;dAX093_+9|~Mt2VLF zh5MR0{#?;Mb#Bu9cN?kDg|?sLGeR!S)O&Z-m-Fa{BVnms1x5|E6Y&RXyZDNXh^`~c zM_*kVFgBBqoArW7(yTlovp~to*G`m^ljARsgf-7SjKg>UAVZDH#(UiV6E9YXKY$G0jPNfYRF%;$4cp6B2qH6H8wPXA2&^zuc*dEGL+nYii3 z^|wn${7X%!u}1(r5Bj9i5-?_GYsj?GOKxwiZKP(mMvODmY&*@rBF#E!_K{|(qjj;l zq?vqEu-ji}!ob5vLs$`~UmCEjf z-KU>SP@d-E@lu}7nvz$guS%Pn6$|>lZEXYAHk@W{W5S-re2|dm*AJC7XU^Kz^2t|? zva?HH@A?S&>Y_f|`I;HK@H-*yCdA#Rg}5+bk2fDnNUa(${@Z0?hp44WLe}esYnSia zm7L^ntnGM~vzpcZl$}vAcHi#gsX?r(^0PtmOe%`ah^8^$I59^rz9%@nc9P3hlD7@eh-E zO&>Da+LO%VIv;&vPClA~;(T~va4dJ07XLSU4cKc?_8L<5_F``@_8PFqZ@fX-+pFyD zRrYXMTom<|dQ0`|q;B+{ILTjLniu~FpC2Vft4|Zkhq7Zjt3icEuO7@kduZmCjjZ+Q zS;4WS^^QS0vo@Fc^f{VG@@8-k4N00W9G7)C$(xmIBO_OL^9ng6)ZE*)#sbNUKm(!A%mv~ro9KXE)vNav2roSRR%4H^_M zRuh}mJ!qBK>_x0fkIRaeJZJ7dUV~frI2lot#mY#-cgyJ$^7Rvyub-sy^<#49WAfw^ z@|EBCCn{e*R{8p|%2!+#pUGO!+Mba;H}tHP@=mMOBH0nGHoG=4#}z3kcGWHn_K1kT zZVN6hAjIQ-Z3L^g60>T(Y7^4WIP=)c` zl+LN0gTFb--wgWQl1Nc)3I3+zZ#w>NIb+<)YRgh_E32I!85J9vGc;PXMw`&DM0e-* z^^v_&CBheF1!A;V zOv7Rp>kJ*5Yl2?4Td$`#mVT=)y2RbgGs^96y|q5-%FNJRb6aa~_nj$^R@JT|t*ca8 zm)4d?Dk9~z6{K|uXT0({3Sxm&`F%d>Dpp$Sqf4es%HJ97_H#YMTE%>2lwHcZMqL=46b;}aGFtarcb^%R z6+Be?apZ91EYE!1pR)HRehQ3gYI${!S+vHyi#5*;GCGUpL@%c0MrgT_9#{FbpW1!C z%lve>?&<0s#Ojj0vR;RO#LT|n8lM)OPU-aaYSCFi-QB~RPVRTieS7t!C+OK>D{=m4 zeEf(~>A|@8Z^t!HH~IqG?!ulfV`0xh#)BHq`%&lMGHLEQZl|(zR9Bxf7Vcgy12Nw{ z-|h27=SOcL{U?TNo*g}cT>UF|3U;#)sTrE5A3Hl8tIf>)PupKen!h+|uRDc~HsZf~ zzO1qq_0o`}Is2$QH>5vUaifTn-9qV|+VpA_!k6C}j z9vQrIL`q|FUef&QG0oG3+A{7+;ySd3m6HH7Aq|mnldN2_8a7kb(i*VS&}&Qded^Ee z+EcXth?LxUdGrs=oY=#9t|M=|FmDrG*7NnTq`By{km?*E)iLsvn9+O8>{$2Gn!Bnr zm&IgFs+|9|?yO-jJ4l*yj@?8~bk{S3k#M$uX&}unu4-^qZfGr`SP)l{aJgr+m+=De zZd2*cJz|fuu0BFo=C(`And!xzbNfTlx(NlvLXSTu|8IOw_s?er(${})Af2_fP}Egi zc!S(|;JKukt3uCUWOqw!qAzIEs9IqHh6v&wp6K6B{-XS4Esc58TSRnmOuuw6@Q4`bKNzw|_S zTveJsajPf2OWIlV?u&{B86RkeY6clQDb+R4egFOYpR;PBtnONCyNMc~F`3nZDfpg6 z4)HcyG6dw-w8Ovn{i#&H4u6y^Xfg){-Z(vYV;pZCtc*VO2S;aAB3^>7(cI ze=kzEjL?>yonLhiW%Kt#c0YRHkhI)iTp}}~U*jr_t8mKIruH~}ct}cc<|TPmi>fs9 z`~_jYbwuihWz#AZX&-s2 zRHQumsQM?RvYGteoN6&`2klbHQKb_8fyDAAT4SdXV%PTPTBO8=jFH;@Ke(DlT<7(+T;16o+ecJvdyiRI z6{WVXJN$ipP+v;Sby#BIGfolHgMWUzaADQbx6A)fTlG7BmoB~LhNW-+p}g}AZolQ? zAAh#{70dp-@3p_ESu=MW68no%{Yvz|wgMSv+U-E%^8BBP$M0n=K{NBeHrx947jF|R$0R6I*Y;rAE# z-GAu&`hsKoH1oQ4zY-T8Cxdc~Nu+Y>x8kFfWMi`cn{Rxt&F$FCZMSLX+f=Mxht(YX zKk>c(tMQ-F?q5bG)>>nW`9k_!QFj_qWMp? zMD=L}McJdXE7JV3QaUQlUMplRF7xaD9b;l^OqpZ6qq!Ne+3USCD(;C@sHaP``e%%# z@Z}!t4Mx}SdzEhOi9YkR+wV&4kN)q|mhLfhjIfF4CgOSID|@HE@7MITX65Jrt9Tkx z!z!EQW0_bi8|^x1QOCSg7OwuDbl6;jQQYF1qM@s%xEoaTsYI)~AX&$Yt%R zzeT0q7$q*Vl;19_PRK}6_9ez~hGR*roD(>j&Q6L~U2!n6leY`&pP|@AzU*K{Y%r^! zat<$>(>i6*QIxyf_j13#FNgbHpR(v3jHU;DUJ>yqQt@d0Qu=3E0Xz3A>7O4P)jFqw z{S9aO<*ZPx%0bP%cYQf?lfm7#Gmf=R`E2lVs>f@e@>xO-?SIczT+X`K66O#;TyN#x zt?Q+(EhgN>l>O^p$_k&f3G++BGH)66lCQ&Oc{Di1_Wy&F|ErY$YW!E@|M4%SEX4m? zUxx8tIBJ!{zgVJ_Zm@0iOxZYJ*=WE<12z_aX`Nt8npI!cV8b_RzQaa&)ZHG3!%tah z=%oC6NUw)oy4hda?PbZA(q6Pt(;fboNd0J!!TTu-O;1TKjKRVfER6foZY#kr>#^{O z-|w(c9`&`y;Kh{xt;+vw{LjXJ|1a&HCGe%Rpf~)wYGKQ`zl{55wU@2`%NFjxpw6qv zvszE}Qwg5eH&HL^@KNWTHrlxTrdS|0cJ58lg6Mbm$r9lpWpC{Ue9B%?z-Yu@BO!fo zz<$bqb3j76$1n4maaC9O>)Kb1*dMIZJcFn=x3C)I+z0BhDiW4Hs~6+ca!Uk?fvUEGH{OKkTWFy4gO*@_4X&y44vKpHtTpb6SY=>38&sX@28Y z&3yW`7H00`Tzgwj$NqxXY?gVSkMZD8V>LU7gN&loiHjkF>Baiei}jT|H_p<=44V7x zJw@MR?nj0i&*5)MtrjeZWRKP#2}HCp!6(Yu&HVq9CSdqUi=VV?PNl`wzCW6|(zPyg zrKBY^I`mnZwmhDuUFEO*=^vRxv2K51U5V_4GS+|6>Kl_?q;I4rGcV?8vcu{x-7^38 zcx$5N6B@ZE|2N{|ecI0sR%WIJG(!u>c_7&-)XY2giQdX{&ibh{W!`C1{9C36j0eBv z_JAp8hb9;;-gJc7Urn|@-7jax{`7@iBVYVNYUHSqmi2SKl+v}%Y;}xT`+4QbG?RRo z**9t4(e8J(^4oJHCqqhE52=fUrx=?!iLmLIoT*M-*(beeSKVn>?D1n~LEjK*E9a`b zZG--_L>r1|LQ(ih2dpx+nL7p)nQId_qI?u(7(Vk5P#H!o#l1U59! zdDv*cMgunf{ki=_Pkb)@(XU3hgJtY)KOK=7oX^bIMObC0 zwL^L4NXXYzEo9U$&*)lKSlUNIYAotA*5P7ol`rMOZnxGrOjcVYPXqnfmF?&9H>$G| zQy~PRy!%n!{S0#SmnvS8qmQb1^&26+Jzgt>Oj4gi4oYZWhULVWT%8J|B~Rq~({M-F zUDP~CRs}W6qKcujny;#C!v6Ref^sO%^6uCDDlJzAw`f=s8Bl3OSi>hx}S9btUkDtTR{VKN~d_u}*GOj1%x~ zSjY*q-{dA_)_foHb(u9UNtapky`M+*RgtRCqxG9=pIrKOTDdFuc{H?X;gkGdlX$ZH zI_|%kfa+geSS1wV_w#5`JX_0qN`7@MkGnn zOCdWwg# zNv^y4{@eXJP5~Y2Y5UN+>T18#>ADN^0I^(tt&4JyU(Iv8XMMD;P+C}{Ixk#XUG%C| z*W{eTG>vB$=~zxW%zeSyl8CfscXKe}GXHQ<(melEpf+i?oGPjf80&DiuD_hgdUv1f z>q?3b?<>RQofj2FG~V^$L|1=KboF=n^Ww3j+sC*JMies+#X?>G>5;Kbu_SGEUwQ2k zWu<;!Iaa1!)REh)QsQDnjJ)_q6&CffS%Xg@{U=+JV;z0{{{>lM?(@@~(!t-m=>?#SCd9e3RL;?yQF zl6(GGf#aSP(?Y_T9xjTNeCLjw?CP-O!;-Whu~hERd(nGS`jA6!S-*uig&AKhW^CHR zdqUa%Lp8d;&|eYcT;IB(#!U2n#{W+Jedy<*-xw+6#P&a-$&0Py;}?A+|s{_TJ==iK7p|e`zoFvOMhe^dOMKqod7OaR6K|2E2DQs zpNV`Bky_AFGiu|V8>ODedt@~c|BH9M*oD=^-lVhB$tR=t;xZnQGPYbwEfAM=DVLeb zWlP&gpOjLc|7Y8~+Iss|D(l}D56k+Nws3^=l(bA&3A=_p0@Rf!zA57WpSSVsZK2<7 zVZGIDJ+tlipkysgPHQr9sE}u^K6(%>V@WLZElo+REXJO3o9u=D^&7@a-VkR;LafP5 zF`AeQG%*(lwO<$21lzAeHD&GB^^B(y?0YaOG>u2guPvWe5`Cv|@(sdoJu3fy@aUGp zAbT9?UN^B4&A-r;N6Q%l2-PT8Z#~Kr^4{`xcRu4p%IYi1>il-AmCF6|*eGjvEq0zn z6Kc2md*!N9Sq-(j3o~}TL}y=;^!Ct~L{~;>C%nHpfHS>~O;Wq%DbVRNsol#4=dfxa zE+*n)A}-!*vd4%=nxuB#HMoScCX9f&KacxwG}$AMrY5O(a|VYy#-5BeG@dz4$27zq z^LW&lTHZyAgck*6Y$)f&DzR62j*PD!ZjzosW-qa(8Z3?->}KU~u`g*p7S}vIaJvb& zn+SVJleBPg`RArOT%JFe(Pr#cUnDFmgyoEg=SLTn&ga^9Z7Ak5mTO^V3K{1zk~?>0 zRKg0X^h>MxeUqd=gV<~4@wINhc8lzcYv$gy^8Z(Bb$>-vMyG{02-mNTgmXCU>~_nT zZ5S4ZaTYpX<&{{wS>@G77g}!RZ5FwDd994uif~p?2##PwAw=iXMXqlBG5MO;6= zRwLci4r?UOsEqx6a-b74nUJfFbwWvzW`^vOP^30Ykn|ntu-RPe68}W#^vIx{@QwM8;tQ} zyxe!Kod>c;#EDSPWz-$bGl04(H zx7t9;U?#q1;wz}qCiVaKDs34lU&q#1^EdIeXU%DEEGSFyHSX`sQ{{be>&*sE;HJu~ zGi5g8vzu5C`w@AaG{Z^GV-f3lgg=k)eWu<1t~90oZM{Iw@5p-~!-q3x#8o-2x~jBE zO&P7ywh>pGh}l!b(z;r{#%H{OX06i5)$h<)mfXxRYtXDv_vC8+8g}5Zy&l`2d}_Df z43z`-USOv}PFdRNu=D)~D&PB&f(ZU2_X`5nE+UNNxi=0tT;L3UJ==F?4*v(}FM zeBYV&d5;k0k%86@?$1?BrMGxc#kAW6a&r5J#LVkspVw!(y0JZWi&gBtIp5mnUGmxY z?HZo?NHgP2606p*&)7}O->5u&f4Ag&{olTaGxaI|w8QW0jmx?88r44KO*qK|nPE#f zRfIFA>HFdqz;TP~{%TpO6y8l23m^c0qUTFH!RU?We)R#WAxUe0K) zkv>K4-c~8ITa7o)3W^(}GLseURQ$;A&D;$bFpEHQ$y6083=f`oJa`ErW<(wu;?92d)RQD(?aiqy4-j51vGIzMUt(UcR7U1eVD z@{zi*=I8(4Xn`1K)?)HzOoz58rM2Sq0Ci;pmN#H|f+1(V#qwOE9LxK1ljgO=ud7$A zV7sSSxn0?Q7%S)C=h{@r0p&thF09aBz=g+`(r0&s{|EGpAjlJWr+OP>;S;FqF!cJMZKrA$z7It?#)hcYia^VcyXXyu>9<~-NVy7=)G!t^OPo9{6Zp__^keX)+5#$$a|cGE>g8bRvPjjvF={O-GHIxXh_n0veDkN`FkUE z+nkh}9rYQ@aG!&F`Mp@VAAtJ-xc_6LJ)VD|kv3wE$j!n1i@3|gz5Mo9?(=Y;hx

7J_8)psp-2h3+}*r#wSlWnT)FsG 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�h!tcrRf+31=x+WCFG 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

&-iz#_Flns(5&TMl+6pd)2G^QNb`u*;_sD&27 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 EKjIzNy8r+H diff --git a/slsDetectorServers/moenchDetectorServer/config_moench.txt b/slsDetectorServers/moenchDetectorServer/config_moench.txt new file mode 100755 index 000000000..48fea871e --- /dev/null +++ b/slsDetectorServers/moenchDetectorServer/config_moench.txt @@ -0,0 +1,4 @@ + + +#chip version version (multiplied by 10) +chipversion 11 diff --git a/slsDetectorServers/moenchDetectorServer/detid_moench.txt b/slsDetectorServers/moenchDetectorServer/detid_moench.txt new file mode 100755 index 000000000..274c0052d --- /dev/null +++ b/slsDetectorServers/moenchDetectorServer/detid_moench.txt @@ -0,0 +1 @@ +1234 \ No newline at end of file diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index f327b5071..07aa4d4d3 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -8,29 +8,27 @@ #include "ALTERA_PLL.h" // pll #include "LTC2620.h" // dacs #include "MAX1932.h" // hv -#include "UDPPacketHeaderGenerator.h" #include "common.h" +#ifdef VIRTUAL #include "communication_funcs_UDP.h" -#include "loadPattern.h" +#endif #include #include +#include #include // usleep #ifdef VIRTUAL -#include //ceil #include #include #endif - +extern int portno; // Global variable from slsDetectorServer_funcs extern int debugflag; extern int updateFlag; extern udpStruct udpDetails[MAX_UDP_DESTINATION]; +extern int numUdpDestinations; extern const enum detectorType myDetectorType; - -// Global variable from UDPPacketHeaderGenerator -extern uint64_t udpFrameNumber; -extern uint32_t udpPacketNumber; +extern int ignoreConfigFileFlag; // Global variable from communication_funcs.c extern int isControlServer; @@ -43,38 +41,19 @@ char initErrorMessage[MAX_STR_LENGTH]; #ifdef VIRTUAL pthread_t pthread_virtual_tid; +int virtual_image_test_mode = 0; +int virtual_moduleid = 0; #endif -// 1g readout -int dataBytes = 0; -int analogDataBytes = 0; -int digitalDataBytes = 0; -char *analogData = 0; -char *digitalData = 0; -char volatile *analogDataPtr = 0; -char volatile *digitalDataPtr = 0; -char udpPacketData[UDP_PACKET_DATA_BYTES + sizeof(sls_detector_header)]; -uint32_t adcEnableMask_1g = BIT32_MSK; - -// 10g readout -uint8_t adcEnableMask_10g = 0xFF; - -int32_t clkPhase[NUM_CLOCKS] = {}; -uint32_t clkFrequency[NUM_CLOCKS] = {40, 20, 20, 200}; -int dacValues[NDAC] = {}; -int defaultDacValues[NDAC] = DEFAULT_DAC_VALS; -// software limit that depends on the current chip on the ctb -int vLimit = 0; enum detectorSettings thisSettings = UNINITIALIZED; int highvoltage = 0; - -// getNumberofchannels return 0 for y in --update mode (virtual servers) -#ifdef VIRTUAL -int nSamples = DEFAULT_NUM_SAMPLES; -#else -int nSamples = 1; -#endif -int detPos[2] = {0, 0}; +int dacValues[NDAC] = {}; +int defaultDacValues[] = DEFAULT_DAC_VALS; +int defaultDacValue_G0[] = SPECIAL_DEFAULT_DYNAMIC_GAIN_VALS; +int defaultDacValue_HG0[] = SPECIAL_DEFAULT_DYNAMICHG0_GAIN_VALS; +int32_t clkPhase[NUM_CLOCKS] = {}; +int detPos[4] = {}; +int chipConfigured = 0; int isInitCheckDone() { return initCheckDone; } @@ -88,9 +67,9 @@ void basictests() { initCheckDone = 0; memset(initErrorMessage, 0, MAX_STR_LENGTH); #ifdef VIRTUAL - LOG(logINFOBLUE, ("********* Moench Detector Virtual Server *********\n")); + LOG(logINFOBLUE, ("******** Moench Virtual Server *****************\n")); #else - LOG(logINFOBLUE, ("************* Moench Detector Server *************\n")); + LOG(logINFOBLUE, ("************ Moench Server *********************\n")); initError = defineGPIOpins(initErrorMessage); if (initError == FAIL) { @@ -104,9 +83,8 @@ void basictests() { if (mapCSP0() == FAIL) { strcpy(initErrorMessage, "Could not map to memory. Dangerous to continue.\n"); - LOG(logERROR, ("%s\n\n", initErrorMessage)); + LOG(logERROR, (initErrorMessage)); initError = FAIL; - return; } #ifndef VIRTUAL // does check only if flag is 0 (by default), set by command line @@ -119,6 +97,14 @@ void basictests() { initError = FAIL; return; } + // works currenly only for hw2.0 + if (isHardwareVersion_1_0()) { + strcpy(initErrorMessage, + "HW v1.0 not supported yet. Please use HW v2.0\n"); + LOG(logERROR, ("%s\n\n", initErrorMessage)); + initError = FAIL; + return; + } #endif char hversion[MAX_STR_LENGTH] = {0}; memset(hversion, 0, MAX_STR_LENGTH); @@ -130,12 +116,13 @@ void basictests() { char swversion[MAX_STR_LENGTH] = {0}; memset(swversion, 0, MAX_STR_LENGTH); getServerVersion(swversion); - int64_t sw_fw_apiversion = 0; + uint32_t requiredFirmwareVersion = + (isHardwareVersion_1_0() ? REQRD_FRMWRE_VRSN_BOARD2 + : REQRD_FRMWRE_VRSN); + int64_t sw_fw_apiversion = getFirmwareAPIVersion(); - if (fwversion >= MIN_REQRD_VRSN_T_RD_API) - sw_fw_apiversion = getFirmwareAPIVersion(); LOG(logINFOBLUE, - ("**************************************************\n" + ("************ Moench Server *********************\n" "Hardware Version:\t\t %s\n" "Hardware Serial Nr:\t\t 0x%x\n" @@ -149,7 +136,7 @@ void basictests() { "********************************************************\n", hversion, hsnumber, ipadd, (long long unsigned int)macadd, (long long int)fwversion, swversion, (long long int)sw_fw_apiversion, - REQRD_FRMWR_VRSN)); + requiredFirmwareVersion)); #ifndef VIRTUAL // return if flag is not zero, debug mode @@ -168,31 +155,32 @@ void basictests() { } // check for API compatibility - old server - if (sw_fw_apiversion > REQRD_FRMWR_VRSN) { + if (sw_fw_apiversion > requiredFirmwareVersion) { sprintf(initErrorMessage, "This firmware-software api version (0x%llx) is incompatible " "with the software's minimum required firmware version " "(0x%llx).\nPlease update detector software to be compatible " "with this firmware.\n", (long long int)sw_fw_apiversion, - (long long int)REQRD_FRMWR_VRSN); + (long long int)requiredFirmwareVersion); LOG(logERROR, (initErrorMessage)); initError = FAIL; return; } // check for firmware compatibility - old firmware - if (REQRD_FRMWR_VRSN > fwversion) { + if (requiredFirmwareVersion > fwversion) { sprintf(initErrorMessage, "This firmware version (0x%llx) is incompatible.\n" "Please update firmware (min. 0x%llx) to be compatible with " "this server.\n", - (long long int)fwversion, (long long int)REQRD_FRMWR_VRSN); + (long long int)fwversion, + (long long int)requiredFirmwareVersion); LOG(logERROR, (initErrorMessage)); initError = FAIL; return; } - LOG(logINFO, ("\tCompatibility - success\n")); + LOG(logINFO, ("Compatibility - success\n")); #endif } @@ -200,18 +188,14 @@ int checkType() { #ifdef VIRTUAL return OK; #endif - uint32_t type = ((bus_r(FPGA_VERSION_REG) & FPGA_VERSION_DTCTR_TYP_MSK) >> - FPGA_VERSION_DTCTR_TYP_OFST); - uint32_t expectedType = - (((FPGA_VERSION_DTCTR_TYP_MOENCH_VAL)&FPGA_VERSION_DTCTR_TYP_MSK) >> - FPGA_VERSION_DTCTR_TYP_OFST); - - if (type != expectedType) { - LOG(logERROR, ("(Type Fail) - This is not a Moench Detector firmware " - "(read %d, expected %d)\n", - type, expectedType)); + u_int32_t type = + ((bus_r(FPGA_VERSION_REG) & DETECTOR_TYPE_MSK) >> DETECTOR_TYPE_OFST); + if (type != MOENCH) { + LOG(logERROR, ("This is not a Moench firmware (read %d, expected %d)\n", + type, MOENCH)); return FAIL; } + return OK; } @@ -223,73 +207,15 @@ int testFpga() { // fixed pattern int ret = OK; - uint32_t val = bus_r(FIX_PATT_REG); + volatile u_int32_t val = bus_r(FIX_PATT_REG); if (val == FIX_PATT_VAL) { - LOG(logINFO, ("\tFixed pattern: successful match (0x%08x)\n", val)); + LOG(logINFO, ("Fixed pattern: successful match 0x%08x\n", val)); } else { LOG(logERROR, ("Fixed pattern does not match! Read 0x%08x, expected 0x%08x\n", val, FIX_PATT_VAL)); ret = FAIL; } - - if (ret == OK) { - // Delay LSB reg - LOG(logINFO, ("\tTesting Delay LSB Register:\n")); - uint32_t addr = DELAY_LSB_REG; - - // store previous delay value - uint32_t previousValue = bus_r(addr); - - volatile uint32_t val = 0, readval = 0; - int times = 1000 * 1000; - for (int i = 0; i < times; ++i) { - val = 0x5A5A5A5A - i; - bus_w(addr, val); - readval = bus_r(addr); - if (readval != val) { - LOG(logERROR, ("1:Mismatch! Loop(%d): Wrote 0x%x, read 0x%x\n", - i, val, readval)); - ret = FAIL; - break; - } - val = (i + (i << 10) + (i << 20)); - bus_w(addr, val); - readval = bus_r(addr); - if (readval != val) { - LOG(logERROR, ("2:Mismatch! Loop(%d): Wrote 0x%x, read 0x%x\n", - i, val, readval)); - ret = FAIL; - break; - } - val = 0x0F0F0F0F; - bus_w(addr, val); - readval = bus_r(addr); - if (readval != val) { - LOG(logERROR, ("3:Mismatch! Loop(%d): Wrote 0x%x, read 0x%x\n", - i, val, readval)); - ret = FAIL; - break; - } - val = 0xF0F0F0F0; - bus_w(addr, val); - readval = bus_r(addr); - if (readval != val) { - LOG(logERROR, ("4:Mismatch! Loop(%d): Wrote 0x%x, read 0x%x\n", - i, val, readval)); - ret = FAIL; - break; - } - } - // write back previous value - bus_w(addr, previousValue); - if (ret == OK) { - LOG(logINFO, - ("\tSuccessfully tested FPGA Delay LSB Register %d times\n", - times)); - } - } - return ret; } @@ -300,47 +226,55 @@ int testBus() { LOG(logINFO, ("Testing Bus:\n")); int ret = OK; - uint32_t addr = DELAY_LSB_REG; + u_int32_t addr = SET_TRIGGER_DELAY_LSB_REG; + u_int32_t times = 1000 * 1000; - // store previous delay value - uint32_t previousValue = bus_r(addr); - - volatile uint32_t val = 0, readval = 0; - int times = 1000 * 1000; - - for (int i = 0; i < times; ++i) { - val += 0xbbbbb; - bus_w(addr, val); - readval = bus_r(addr); - if (readval != val) { - LOG(logERROR, ("Mismatch! Loop(%d): Wrote 0x%x, read 0x%x\n", i, - val, readval)); + for (u_int32_t i = 0; i < times; ++i) { + bus_w(addr, i * 100); + if (i * 100 != bus_r(addr)) { + LOG(logERROR, + ("Mismatch! Wrote 0x%x, read 0x%x\n", i * 100, bus_r(addr))); ret = FAIL; } } - // write back previous value - bus_w(addr, previousValue); + bus_w(addr, 0); if (ret == OK) { - LOG(logINFO, ("\tSuccessfully tested bus %d times\n", times)); + LOG(logINFO, ("Successfully tested bus %d times\n", times)); } return ret; } +#ifdef VIRTUAL +void setTestImageMode(int ival) { + if (ival >= 0) { + if (ival == 0) { + LOG(logINFO, ("Switching off Image Test Mode\n")); + virtual_image_test_mode = 0; + } else { + LOG(logINFO, ("Switching on Image Test Mode\n")); + virtual_image_test_mode = 1; + } + } +} + +int getTestImageMode() { return virtual_image_test_mode; } +#endif + /* Ids */ void getServerVersion(char *version) { strcpy(version, APIMOENCH); } -uint64_t getFirmwareVersion() { +u_int64_t getFirmwareVersion() { #ifdef VIRTUAL return 0; #endif - return ((bus_r(FPGA_VERSION_REG) & FPGA_VERSION_BRD_RVSN_MSK) >> - FPGA_VERSION_BRD_RVSN_OFST); + return ((bus_r(FPGA_VERSION_REG) & FPGA_COMPILATION_DATE_MSK) >> + FPGA_COMPILATION_DATE_OFST); } -uint64_t getFirmwareAPIVersion() { +u_int64_t getFirmwareAPIVersion() { #ifdef VIRTUAL return 0; #endif @@ -362,35 +296,82 @@ void getHardwareVersion(char *version) { } } -uint16_t getHardwareVersionNumber() { +u_int16_t getHardwareVersionNumber() { #ifdef VIRTUAL - return 0x1; + return 0x3; #endif - return ((bus_r(MOD_SERIAL_NUMBER_REG) & MOD_SERIAL_NUMBER_VRSN_MSK) >> - MOD_SERIAL_NUMBER_VRSN_OFST); + return ((bus_r(MOD_SERIAL_NUM_REG) & HARDWARE_VERSION_NUM_MSK) >> + HARDWARE_VERSION_NUM_OFST); } -uint16_t getHardwareSerialNumber() { +u_int16_t getHardwareSerialNumber() { #ifdef VIRTUAL return 0; #endif - return ((bus_r(MOD_SERIAL_NUMBER_REG) & MOD_SERIAL_NUMBER_MSK) >> - MOD_SERIAL_NUMBER_OFST); + return ((bus_r(MOD_SERIAL_NUM_REG) & HARDWARE_SERIAL_NUM_MSK) >> + HARDWARE_SERIAL_NUM_OFST); } -uint32_t getDetectorNumber() { +int isHardwareVersion_1_0() { + const int hwNumberList[] = HARDWARE_VERSION_NUMBERS; + return ((getHardwareVersionNumber() == hwNumberList[0]) ? 1 : 0); +} + +int getChipVersion() { + // chip v1.1 + if (bus_r(DAQ_REG) & DAQ_CHIP11_VRSN_MSK) { + return 11; + } + // chip v1.0 + return 10; +} + +void setChipVersion(int version) { + LOG(logINFO, + ("Setting chip version to %0.1f in FPGA\n", (double)version / 10.0)); + if (version == 11) { + bus_w(DAQ_REG, bus_r(DAQ_REG) | DAQ_CHIP11_VRSN_MSK); + } else { + bus_w(DAQ_REG, bus_r(DAQ_REG) & ~DAQ_CHIP11_VRSN_MSK); + } +} + +u_int32_t getDetectorNumber() { #ifdef VIRTUAL return 0; #endif - return bus_r(MOD_SERIAL_NUMBER_REG); + return bus_r(MOD_SERIAL_NUM_REG); } -uint64_t getDetectorMAC() { +int getModuleId(int *ret, char *mess) { + return ((bus_r(MOD_ID_REG) & MOD_ID_MSK) >> MOD_ID_OFST); +} + +void setModuleId(int modid) { + LOG(logINFOBLUE, ("Setting module id in fpga: %d\n", modid)); + bus_w(MOD_ID_REG, bus_r(MOD_ID_REG) & ~MOD_ID_MSK); + bus_w(MOD_ID_REG, + bus_r(MOD_ID_REG) | ((modid << MOD_ID_OFST) & MOD_ID_MSK)); +} + +int updateModuleId() { + int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE); + if (initError == FAIL) { + return FAIL; + } +#ifdef VIRTUAL + virtual_moduleid = modid; +#endif + setModuleId(modid); + return OK; +} + +u_int64_t getDetectorMAC() { #ifdef VIRTUAL return 0; #else char output[255], mac[255] = ""; - uint64_t res = 0; + u_int64_t res = 0; FILE *sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); fgets(output, sizeof(output), sysFile); @@ -407,12 +388,12 @@ uint64_t getDetectorMAC() { #endif } -uint32_t getDetectorIP() { +u_int32_t getDetectorIP() { #ifdef VIRTUAL return 0; #endif char temp[INET_ADDRSTRLEN] = ""; - uint32_t res = 0; + u_int32_t res = 0; // execute and get address char output[255]; FILE *sysFile = popen( @@ -456,8 +437,15 @@ void initStopServer() { initCheckDone = 1; return; } + if (readConfigFile() == FAIL) { + initCheckDone = 1; + return; + } #ifdef VIRTUAL sharedMemory_setStop(0); + // temp threshold and reset event (read by stop server) + setThresholdTemperature(DEFAULT_TMP_THRSHLD); + setTemperatureEvent(0); #endif } initCheckDone = 1; @@ -466,70 +454,28 @@ void initStopServer() { /* set up detector */ void setupDetector() { - LOG(logINFO, ("This Server is for 1 Moench Board module\n")); + LOG(logINFO, ("This Server is for 1 Moench module (500k)\n")); - // default variables - dataBytes = 0; - analogDataBytes = 0; - digitalDataBytes = 0; - if (analogData) { - free(analogData); - analogData = 0; - } - if (digitalData) { - free(digitalData); - digitalData = 0; - } - analogDataPtr = 0; - digitalDataPtr = 0; for (int i = 0; i < NUM_CLOCKS; ++i) { clkPhase[i] = 0; } - clkFrequency[RUN_CLK] = DEFAULT_RUN_CLK_AT_STARTUP; - clkFrequency[ADC_CLK] = DEFAULT_ADC_CLK_AT_STARTUP; - clkFrequency[SYNC_CLK] = DEFAULT_SYNC_CLK_AT_STARTUP; - clkFrequency[DBIT_CLK] = DEFAULT_DBIT_CLK_AT_STARTUP; - // default adc phase in deg - /* - { - int phase_shifts = 0; - ConvertToDifferentRange(0, 359, 0, getMaxPhase(ADC_CLK) - 1, - DEFAULT_ADC_PHASE_DEG, &phase_shifts); clkPhase[ADC_CLK] = - phase_shifts; - } - LOG(logINFO, ("Default Run clk: %d MHz\n", - clkFrequency[RUN_CLK])); LOG(logINFO, ("Default Adc clk: %d MHz\n", - clkFrequency[ADC_CLK])); LOG(logINFO, ("Default Sync clk: %d MHz\n", - clkFrequency[SYNC_CLK])); LOG(logINFO, ("Default Dbit clk: %d MHz\n", - clkFrequency[DBIT_CLK])); LOG(logINFO, ("Default Adc Phase: %d (%d - deg)\n", clkPhase[ADC_CLK], getPhase(ADC_CLK, 1))); - */ - for (int i = 0; i < NDAC; ++i) - dacValues[i] = -1; - vLimit = DEFAULT_VLIMIT; - highvoltage = 0; - adcEnableMask_1g = BIT32_MSK; - adcEnableMask_10g = 0xFF; - nSamples = 1; + chipConfigured = 0; #ifdef VIRTUAL sharedMemory_setStatus(IDLE); - initializePatternWord(); -#endif setupUDPCommParameters(); +#endif // altera pll - ALTERA_PLL_SetDefines(PLL_CNTRL_REG, PLL_PARAM_REG, - PLL_CNTRL_RCNFG_PRMTR_RST_MSK, PLL_CNTRL_WR_PRMTR_MSK, - PLL_CNTRL_PLL_RST_MSK, PLL_CNTRL_ADDR_MSK, - PLL_CNTRL_ADDR_OFST); - ALTERA_PLL_ResetPLLAndReconfiguration(); + ALTERA_PLL_SetDefines( + PLL_CNTRL_REG, PLL_PARAM_REG, PLL_CNTRL_RCNFG_PRMTR_RST_MSK, + PLL_CNTRL_WR_PRMTR_MSK, PLL_CNTRL_PLL_RST_MSK, PLL_CNTRL_ADDR_MSK, + PLL_CNTRL_ADDR_OFST, PLL_CNTRL_DBIT_WR_PRMTR_MSK, DBIT_CLK_INDEX); + ALTERA_PLL_ResetPLL(); resetCore(); resetPeripheral(); cleanFifos(); - initializePatternAddresses(); - // hv MAX1932_SetDefines(SPI_REG, SPI_HV_SRL_CS_OTPT_MSK, SPI_HV_SRL_CLK_OTPT_MSK, SPI_HV_SRL_DGTL_OTPT_MSK, SPI_HV_SRL_DGTL_OTPT_OFST, @@ -537,142 +483,165 @@ void setupDetector() { MAX1932_Disable(); setHighVoltage(DEFAULT_HIGH_VOLTAGE); - // power off chip - powerChip(0); - - // adcs + // adc 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_DT_OTPT_OFST); AD9257_Disable(); AD9257_Configure(); - // dacs + // dac LTC2620_SetDefines(SPI_REG, SPI_DAC_SRL_CS_OTPT_MSK, SPI_DAC_SRL_CLK_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_OFST, NDAC, DAC_MIN_MV, - DAC_MAX_MV); // has to be before setvchip + DAC_MAX_MV); LTC2620_Disable(); LTC2620_Configure(); resetToDefaultDacs(0); - // not using setADCInvertRegister command (as it xors the default) - bus_w(ADC_PORT_INVERT_REG, ADC_PORT_INVERT_VAL); + /* Only once at server startup */ + bus_w(DAQ_REG, 0x0); LOG(logINFOBLUE, ("Setting Default parameters\n")); - cleanFifos(); // FIXME: why twice? + + // get chip version + if (readConfigFile() == FAIL) { + return; + } + + if (updateModuleId() == FAIL) { + return; + } + + setReadoutSpeed(HALF_SPEED); + cleanFifos(); resetCore(); - // 1G UDP - enableTenGigabitEthernet(0); + alignDeserializer(); + // configureASICTimer(); ASIC_CTRL_REG to be removed along with storage cell + // delay + bus_w(ADC_PORT_INVERT_REG, + (isHardwareVersion_1_0() ? ADC_PORT_INVERT_BOARD2_VAL + : ADC_PORT_INVERT_VAL)); + + initReadoutConfiguration(); // Initialization of acquistion parameters - setNumAnalogSamples(DEFAULT_NUM_SAMPLES); + disableCurrentSource(); + setSettings(DEFAULT_SETTINGS); + setGainMode(DEFAULT_GAINMODE); + setNumFrames(DEFAULT_NUM_FRAMES); - setExpTime(DEFAULT_EXPTIME); setNumTriggers(DEFAULT_NUM_CYCLES); + setExpTime(DEFAULT_EXPTIME); setPeriod(DEFAULT_PERIOD); setDelayAfterTrigger(DEFAULT_DELAY); + if (getChipVersion() == 11) { + selectStoragecellStart(DEFAULT_STRG_CLL_STRT_CHIP11); + } else { + setNumAdditionalStorageCells(DEFAULT_NUM_STRG_CLLS); + selectStoragecellStart(DEFAULT_STRG_CLL_STRT); + // not applicable for chipv1.1 + setStorageCellDelay(DEFAULT_STRG_CLL_DLY); + } setTiming(DEFAULT_TIMING_MODE); - setADCEnableMask(BIT32_MSK); - setADCEnableMask_10G(BIT32_MSK); - if (setAnalogOnlyReadout() == FAIL) { - strcpy(initErrorMessage, - "Could not set readout mode to analog only.\n"); - LOG(logERROR, ("%s\n\n", initErrorMessage)); - initError = FAIL; - } - setADCPipeline(DEFAULT_PIPELINE); - if (initError != FAIL) { - initError = loadPatternFile(DEFAULT_PATTERN_FILE, initErrorMessage); - } - setSettings(DEFAULT_SETTINGS); - - setFrequency(RUN_CLK, DEFAULT_RUN_CLK); - setFrequency(ADC_CLK, DEFAULT_ADC_CLK); - setFrequency(DBIT_CLK, DEFAULT_DBIT_CLK); - setPhase(ADC_CLK, DEFAULT_ADC_PHASE_DEG, 1); setNextFrameNumber(DEFAULT_STARTING_FRAME_NUMBER); -} -int updateDatabytesandAllocateRAM() { - - int oldDataBytes = analogDataBytes; - updateDataBytes(); - - // update only if change in databytes - if (analogDataBytes == oldDataBytes) { - LOG(logDEBUG1, - ("RAM size (Databytes:%d) already allocated. Nothing to be done.\n", - dataBytes)); - return OK; + // temp threshold and reset event + setThresholdTemperature(DEFAULT_TMP_THRSHLD); + setTemperatureEvent(0); + if (getChipVersion() == 11) { + setFilterResistor(DEFAULT_FILTER_RESISTOR); + setNumberOfFilterCells(DEFAULT_FILTER_CELL); } - // Zero databytes - if (analogDataBytes == 0) { - LOG(logERROR, ("Can not allocate RAM for 0 bytes.\n")); - return FAIL; + if (!isHardwareVersion_1_0()) { + setFlipRows(DEFAULT_FLIP_ROWS); + setReadNRows(MAX_ROWS_PER_READOUT); } - // clear RAM - if (analogData) { - free(analogData); - analogData = 0; - } - // allocate RAM - analogData = malloc(analogDataBytes); - // cannot malloc - if (analogData == NULL) { - LOG(logERROR, ("Can not allocate data RAM for even 1 frame. " - "Probable cause: Memory Leak.\n")); - return FAIL; - } - LOG(logINFO, ("\tRAM allocated to %d bytes\n", analogDataBytes)); - return OK; -} - -void updateDataBytes() { - int nchans = 0; - analogDataBytes = 0; - - if (adcEnableMask_1g == BIT32_MSK) - nchans = 32; - else { - for (int ichan = 0; ichan < NCHAN; ++ichan) { - if (adcEnableMask_1g & (1 << ichan)) - ++nchans; - } - } - analogDataBytes = nchans * (DYNAMIC_RANGE / 8) * nSamples; - LOG(logINFO, ("\t#Channels:%d, Databytes:%d\n", nchans, analogDataBytes)); - - dataBytes = analogDataBytes; } int resetToDefaultDacs(int hardReset) { + LOG(logINFOBLUE, ("Resetting %s to Default Dac values\n", + (hardReset == 1 ? "hard" : ""))); + // reset defaults to hardcoded defaults if (hardReset) { const int vals[] = DEFAULT_DAC_VALS; for (int i = 0; i < NDAC; ++i) { defaultDacValues[i] = vals[i]; } - } - // reset dacs to defaults - int ret = OK; - LOG(logINFOBLUE, ("Setting Default Dac values\n")); - for (int i = 0; i < NDAC; ++i) { - setDAC((enum DACINDEX)i, defaultDacValues[i], 0); - if (dacValues[i] != defaultDacValues[i]) { - ret = FAIL; - LOG(logERROR, ("Setting dac %d failed, wrote %d, read %d\n", i, - defaultDacValues[i], dacValues[i])); + const int vals_G0[] = SPECIAL_DEFAULT_DYNAMIC_GAIN_VALS; + for (int i = 0; i < NSPECIALDACS; ++i) { + defaultDacValue_G0[i] = vals_G0[i]; + } + const int vals_HG0[] = SPECIAL_DEFAULT_DYNAMICHG0_GAIN_VALS; + for (int i = 0; i < NSPECIALDACS; ++i) { + defaultDacValue_HG0[i] = vals_HG0[i]; } } - return ret; + + // remember settings + enum detectorSettings oldSettings = thisSettings; + + // reset dacs to defaults + const int specialDacs[] = SPECIALDACINDEX; + for (int i = 0; i < NDAC; ++i) { + int value = defaultDacValues[i]; + + for (int j = 0; j < NSPECIALDACS; ++j) { + // special dac: replace default value + if (specialDacs[j] == i) { + switch (oldSettings) { + case GAIN0: + value = defaultDacValue_G0[j]; + break; + case HIGHGAIN0: + value = defaultDacValue_HG0[j]; + break; + default: + break; + } + break; + } + } + + // set to defualt + setDAC((enum DACINDEX)i, value, 0); + if (dacValues[i] != value) { + LOG(logERROR, ("Setting dac %d failed, wrote %d, read %d\n", i, + value, dacValues[i])); + return FAIL; + } + } + return OK; } + int getDefaultDac(enum DACINDEX index, enum detectorSettings sett, int *retval) { + + // settings only for special dacs if (sett != UNDEFINED) { + const int specialDacs[] = SPECIALDACINDEX; + // find special dac index + for (int i = 0; i < NSPECIALDACS; ++i) { + if ((int)index == specialDacs[i]) { + switch (sett) { + case GAIN0: + *retval = defaultDacValue_G0[i]; + return OK; + case HIGHGAIN0: + *retval = defaultDacValue_HG0[i]; + return OK; + // unknown settings + default: + return FAIL; + } + } + } + // not a special dac return FAIL; } + if (index < 0 || index >= NDAC) return FAIL; *retval = defaultDacValues[index]; @@ -680,19 +649,184 @@ int getDefaultDac(enum DACINDEX index, enum detectorSettings sett, } int setDefaultDac(enum DACINDEX index, enum detectorSettings sett, int value) { + char *dac_names[] = {DAC_NAMES}; + + // settings only for special dacs if (sett != UNDEFINED) { + const int specialDacs[] = SPECIALDACINDEX; + // find special dac index + for (int i = 0; i < NSPECIALDACS; ++i) { + if ((int)index == specialDacs[i]) { + switch (sett) { + case GAIN0: + LOG(logINFO, ("Setting Default Dac [%d - %s, gain0]: %d\n", + (int)index, dac_names[index], value)); + defaultDacValue_G0[i] = value; + return OK; + case HIGHGAIN0: + LOG(logINFO, + ("Setting Default Dac [%d - %s, highgain0]: %d\n", + (int)index, dac_names[index], value)); + defaultDacValue_HG0[i] = value; + return OK; + // unknown settings + default: + return FAIL; + } + } + } + // not a special dac return FAIL; } if (index < 0 || index >= NDAC) return FAIL; - - char *dac_names[] = {DAC_NAMES}; LOG(logINFO, ("Setting Default Dac [%d - %s]: %d\n", (int)index, dac_names[index], value)); defaultDacValues[index] = value; return OK; } +int readConfigFile() { + + if (initError == FAIL) { + return initError; + } + + if (ignoreConfigFileFlag) { + LOG(logWARNING, ("Ignoring Config file\n")); + return OK; + } + + const int fileNameSize = 128; + char fname[fileNameSize]; + if (getAbsPath(fname, fileNameSize, CONFIG_FILE) == FAIL) { + return FAIL; + } + + // file doesnt exist (give warning and assume chipv1.0) + if (access(fname, F_OK) != 0) { + LOG(logWARNING, ("Could not find config file. Assuming chipv1.0\n")); + return OK; + } + + // open config file + FILE *fd = fopen(fname, "r"); + if (fd == NULL) { + + sprintf(initErrorMessage, + "Could not open on-board detector server config file [%s].\n", + CONFIG_FILE); + initError = FAIL; + LOG(logERROR, ("%s\n\n", initErrorMessage)); + return FAIL; + } + + LOG(logINFOBLUE, ("Reading config file %s\n", CONFIG_FILE)); + + // Initialization + const size_t LZ = 256; + char line[LZ]; + memset(line, 0, LZ); + char command[LZ]; + + // keep reading a line + while (fgets(line, LZ, fd)) { + + // ignore comments + if (line[0] == '#') { + LOG(logDEBUG1, ("Ignoring Comment\n")); + continue; + } + + // ignore empty lines + if (strlen(line) <= 1) { + LOG(logDEBUG1, ("Ignoring Empty line\n")); + continue; + } + + // removing leading spaces + if (line[0] == ' ' || line[0] == '\t') { + int len = strlen(line); + // find first valid character + int i = 0; + for (i = 0; i < len; ++i) { + if (line[i] != ' ' && line[i] != '\t') { + break; + } + } + // ignore the line full of spaces (last char \n) + if (i >= len - 1) { + LOG(logDEBUG1, ("Ignoring line full of spaces\n")); + continue; + } + // copying only valid char + char temp[LZ]; + memset(temp, 0, LZ); + memcpy(temp, line + i, strlen(line) - i); + memset(line, 0, LZ); + memcpy(line, temp, strlen(temp)); + LOG(logDEBUG1, ("Removing leading spaces.\n")); + } + + LOG(logDEBUG1, ("Command to process: (size:%d) %.*s\n", strlen(line), + strlen(line) - 1, line)); + memset(command, 0, LZ); + + // chipversion command + if (!strncmp(line, "chipversion", strlen("chipversion"))) { + int version = 0; + + // cannot scan values + if (sscanf(line, "%s %d", command, &version) != 2) { + sprintf( + initErrorMessage, + "Could not scan chipversion commands from on-board server " + "config file. Line:[%s].\n", + line); + break; + } + // validations + if (version != 10 && version != 11) { + sprintf(initErrorMessage, + "Could not set chip version from on-board server " + "config file. Invalid chip version %d. Line:[%s].\n", + version, line); + break; + } + // chipversion 1.1 and HW 1.0 is incompatible + if (version == 11 && isHardwareVersion_1_0()) { + strcpy(initErrorMessage, + "Chip version 1.1 (from on-board config file) is " + "incompatible with hardware version v1.0. Please update " + "board or correct on-board config file.\n"); + break; + } + + setChipVersion(version); + } + + // other commands + else { + sprintf(initErrorMessage, + "Could not scan command from on-board server " + "config file. Line:[%s].\n", + line); + break; + } + + memset(line, 0, LZ); + } + fclose(fd); + + if (strlen(initErrorMessage)) { + initError = FAIL; + LOG(logERROR, ("%s\n\n", initErrorMessage)); + } else { + LOG(logINFOBLUE, ("Successfully read config file\n")); + } + return initError; +} + /* firmware functions (resets) */ void cleanFifos() { @@ -700,8 +834,8 @@ void cleanFifos() { return; #endif LOG(logINFO, ("Clearing Acquisition Fifos\n")); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CLR_ACQSTN_FIFO_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_CLR_ACQSTN_FIFO_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_ACQ_FIFO_CLR_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_ACQ_FIFO_CLR_MSK); } void resetCore() { @@ -709,8 +843,9 @@ void resetCore() { return; #endif LOG(logINFO, ("Resetting Core\n")); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CRE_RST_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_CRE_RST_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CORE_RST_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_CORE_RST_MSK); + usleep(1000 * 1000); } void resetPeripheral() { @@ -718,11 +853,11 @@ void resetPeripheral() { return; #endif LOG(logINFO, ("Resetting Peripheral\n")); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PRPHRL_RST_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_PRPHRL_RST_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PERIPHERAL_RST_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_PERIPHERAL_RST_MSK); } -/* set parameters - dr, adcenablemask */ +/* set parameters - dr, roi */ int setDynamicRange(int dr) { if (dr == 16) @@ -735,89 +870,11 @@ int getDynamicRange(int *retval) { return OK; } -int setADCEnableMask(uint32_t mask) { - if (mask == 0u) { - LOG(logERROR, ("Cannot set 1gb adc mask to 0\n")); - return FAIL; - } - int topAdcs = __builtin_popcount(mask & 0xF0F0F0F0); - int bottomAdcs = __builtin_popcount(mask & 0x0F0F0F0F); - if (topAdcs > 0 && bottomAdcs > 0 && topAdcs != bottomAdcs) { - LOG(logERROR, - ("Invalid mask. Top and bottom number of adcs do not match\n")); - return FAIL; - } - LOG(logINFO, ("Setting adcEnableMask 1G to 0x%08x\n", mask)); - adcEnableMask_1g = mask; - // 1Gb enabled - if (!enableTenGigabitEthernet(-1)) { - if (updateDatabytesandAllocateRAM() == FAIL) { - return FAIL; - } - } - return OK; -} - -uint32_t getADCEnableMask() { return adcEnableMask_1g; } - -void setADCEnableMask_10G(uint32_t mask) { - if (mask == 0u) { - LOG(logERROR, ("Cannot set 10gb adc mask to 0\n")); - return; - } - int topAdcs = __builtin_popcount(mask & 0xF0F0F0F0); - int bottomAdcs = __builtin_popcount(mask & 0x0F0F0F0F); - if (topAdcs > 0 && bottomAdcs > 0 && topAdcs != bottomAdcs) { - LOG(logERROR, - ("Invalid mask. Top and bottom number of adcs do not match\n")); - return; - } - // convert 32 bit mask to 8 bit mask - uint8_t actualMask = 0; - if (mask != 0) { - int ival = 0; - for (int ich = 0; ich < NCHAN; ich = ich + 4) { - if ((1 << ich) & mask) { - actualMask |= (1 << ival); - } - ++ival; - } - } - - LOG(logINFO, ("Setting adcEnableMask 10G to 0x%x (from 0x%08x)\n", - actualMask, mask)); - adcEnableMask_10g = actualMask; - uint32_t addr = READOUT_10G_ENABLE_REG; - bus_w(addr, bus_r(addr) & (~READOUT_10G_ENABLE_ANLG_MSK)); - bus_w(addr, - bus_r(addr) | ((adcEnableMask_10g << READOUT_10G_ENABLE_ANLG_OFST) & - READOUT_10G_ENABLE_ANLG_MSK)); -} - -uint32_t getADCEnableMask_10G() { - adcEnableMask_10g = - ((bus_r(READOUT_10G_ENABLE_REG) & READOUT_10G_ENABLE_ANLG_MSK) >> - READOUT_10G_ENABLE_ANLG_OFST); - - // convert 8 bit mask to 32 bit mask - uint32_t retval = 0; - if (adcEnableMask_10g) { - for (int ival = 0; ival < 8; ++ival) { - // if bit in 8 bit mask set - if ((1 << ival) & adcEnableMask_10g) { - // set it for 4 bits in 32 bit mask - for (int iloop = 0; iloop < 4; ++iloop) { - retval |= (1 << (ival * 4 + iloop)); - } - } - } - } - return retval; -} - void setADCInvertRegister(uint32_t val) { LOG(logINFO, ("Setting ADC Port Invert Reg to 0x%x\n", val)); - uint32_t defaultValue = ADC_PORT_INVERT_VAL; + uint32_t defaultValue = + (isHardwareVersion_1_0() ? ADC_PORT_INVERT_BOARD2_VAL + : ADC_PORT_INVERT_VAL); uint32_t changeValue = defaultValue ^ val; LOG(logINFO, ("\t default: 0x%x, final:0x%x\n", defaultValue, changeValue)); bus_w(ADC_PORT_INVERT_REG, changeValue); @@ -825,7 +882,8 @@ void setADCInvertRegister(uint32_t val) { uint32_t getADCInvertRegister() { uint32_t readValue = bus_r(ADC_PORT_INVERT_REG); - int32_t defaultValue = ADC_PORT_INVERT_VAL; + int32_t defaultValue = (isHardwareVersion_1_0() ? ADC_PORT_INVERT_BOARD2_VAL + : ADC_PORT_INVERT_VAL); uint32_t val = defaultValue ^ readValue; LOG(logDEBUG1, ("\tread:0x%x, default:0x%x returned:0x%x\n", readValue, defaultValue, val)); @@ -833,76 +891,131 @@ uint32_t getADCInvertRegister() { } /* parameters - timer */ +int selectStoragecellStart(int pos) { + int value = pos; + uint32_t addr = DAQ_REG; + uint32_t mask = DAQ_STRG_CELL_SLCT_MSK; + int offset = DAQ_STRG_CELL_SLCT_OFST; + if (getChipVersion() == 11) { + // set the bit + value = 1 << pos; + addr = CONFIG_V11_REG; + mask = CONFIG_V11_STRG_CLL_MSK; + offset = CONFIG_V11_STRG_CLL_OFST; + } + if (pos >= 0) { + LOG(logINFO, ("Setting storage cell start: %d\n", pos)); + bus_w(addr, bus_r(addr) & ~mask); + bus_w(addr, bus_r(addr) | ((value << offset) & mask)); + // should not do a get to verify (status register does not update + // immediately during acquisition) + if (getChipVersion() == 11) { + return pos; + } + } + + // read value back + // chipv1.1, writing and reading registers are different +#ifndef VIRTUAL + if (getChipVersion() == 11) { + addr = CONFIG_V11_STATUS_REG; + mask = CONFIG_V11_STATUS_STRG_CLL_MSK; + offset = CONFIG_V11_STATUS_STRG_CLL_OFST; + } +#endif + uint32_t regval = bus_r(addr); +#ifndef VIRTUAL + // flip all contents of register //TODO FIRMWARE FIX + if (getChipVersion() == 11) { + regval ^= BIT32_MASK; + } +#endif + uint32_t retval = ((regval & mask) >> offset); + if (getChipVersion() == 11) { + // get which bit + int max = getMaxStoragecellStart(); + for (int i = 0; i != max + 1; ++i) { + if (retval & (1 << i)) { + return i; + } + } + } + // chip v1.0 + return retval; +} + +int getMaxStoragecellStart() { + if (getChipVersion() == 11) { + return MAX_STORAGE_CELL_CHIP11_VAL; + } else { + return MAX_STORAGE_CELL_VAL; + } +} + int setNextFrameNumber(uint64_t value) { LOG(logINFO, ("Setting next frame number: %llu\n", (long long unsigned int)value)); - setU64BitReg(value, NEXT_FRAME_NUMB_LOCAL_LSB_REG, - NEXT_FRAME_NUMB_LOCAL_MSB_REG); -#ifndef VIRTUAL - // for 1g udp interface - setUDPFrameNumber(value); +#ifdef VIRTUAL + setU64BitReg(value, FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG); +#else + // decrement is for firmware + setU64BitReg(value - 1, FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG); + // need to set it twice for the firmware to catch + setU64BitReg(value - 1, FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG); #endif return OK; } int getNextFrameNumber(uint64_t *retval) { - *retval = getU64BitReg(NEXT_FRAME_NUMB_LOCAL_LSB_REG, - NEXT_FRAME_NUMB_LOCAL_MSB_REG); +#ifdef VIRTUAL + *retval = getU64BitReg(FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG); +#else + // increment is for firmware + *retval = + (getU64BitReg(GET_FRAME_NUMBER_LSB_REG, GET_FRAME_NUMBER_MSB_REG) + 1); +#endif return OK; } void setNumFrames(int64_t val) { if (val > 0) { LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val)); - set64BitReg(val, FRAMES_LSB_REG, FRAMES_MSB_REG); + set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); } } -int64_t getNumFrames() { return get64BitReg(FRAMES_LSB_REG, FRAMES_MSB_REG); } +int64_t getNumFrames() { + return get64BitReg(SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); +} void setNumTriggers(int64_t val) { if (val > 0) { LOG(logINFO, ("Setting number of triggers %lld\n", (long long int)val)); - set64BitReg(val, CYCLES_LSB_REG, CYCLES_MSB_REG); + set64BitReg(val, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); } } -int64_t getNumTriggers() { return get64BitReg(CYCLES_LSB_REG, CYCLES_MSB_REG); } - -int setNumAnalogSamples(int val) { - if (val < 0) { - LOG(logERROR, ("Invalid analog samples: %d\n", val)); - return FAIL; - } - LOG(logINFO, ("Setting number of analog samples %d\n", val)); - nSamples = val; - bus_w(SAMPLES_REG, bus_r(SAMPLES_REG) & ~SAMPLES_ANALOG_MSK); - bus_w(SAMPLES_REG, bus_r(SAMPLES_REG) | - ((val << SAMPLES_ANALOG_OFST) & SAMPLES_ANALOG_MSK)); - - // 1Gb - if (!enableTenGigabitEthernet(-1)) { - if (updateDatabytesandAllocateRAM() == FAIL) { - return FAIL; - } - } - return OK; +int64_t getNumTriggers() { + return get64BitReg(SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); } -int getNumAnalogSamples() { return nSamples; } - int setExpTime(int64_t val) { if (val < 0) { LOG(logERROR, ("Invalid exptime: %lld ns\n", (long long int)val)); return FAIL; } LOG(logINFO, ("Setting exptime %lld ns\n", (long long int)val)); - val *= (1E-3 * clkFrequency[RUN_CLK]); - setPatternWaitTime(0, val); + val *= (1E-3 * CLK_RUN); + val -= ACQ_TIME_MIN_CLOCK; + if (val < 0) { + val = 0; + } + set64BitReg(val, SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG); // validate for tolerance + val += ACQ_TIME_MIN_CLOCK; int64_t retval = getExpTime(); - val /= (1E-3 * clkFrequency[RUN_CLK]); + val /= (1E-3 * CLK_RUN); if (val != retval) { return FAIL; } @@ -910,7 +1023,9 @@ int setExpTime(int64_t val) { } int64_t getExpTime() { - return getPatternWaitTime(0) / (1E-3 * clkFrequency[RUN_CLK]); + return (get64BitReg(SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) + + ACQ_TIME_MIN_CLOCK) / + (1E-3 * CLK_RUN); } int setPeriod(int64_t val) { @@ -919,12 +1034,12 @@ int setPeriod(int64_t val) { return FAIL; } LOG(logINFO, ("Setting period %lld ns\n", (long long int)val)); - val *= (1E-3 * clkFrequency[SYNC_CLK]); - set64BitReg(val, PERIOD_LSB_REG, PERIOD_MSB_REG); + val *= (1E-3 * CLK_SYNC); + set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG); // validate for tolerance int64_t retval = getPeriod(); - val /= (1E-3 * clkFrequency[SYNC_CLK]); + val /= (1E-3 * CLK_SYNC); if (val != retval) { return FAIL; } @@ -932,8 +1047,8 @@ int setPeriod(int64_t val) { } int64_t getPeriod() { - return get64BitReg(PERIOD_LSB_REG, PERIOD_MSB_REG) / - (1E-3 * clkFrequency[SYNC_CLK]); + return get64BitReg(SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG) / + (1E-3 * CLK_SYNC); } int setDelayAfterTrigger(int64_t val) { @@ -943,12 +1058,12 @@ int setDelayAfterTrigger(int64_t val) { return FAIL; } LOG(logINFO, ("Setting delay after trigger %lld ns\n", (long long int)val)); - val *= (1E-3 * clkFrequency[SYNC_CLK]); - set64BitReg(val, DELAY_LSB_REG, DELAY_MSB_REG); + val *= (1E-3 * CLK_SYNC); + set64BitReg(val, SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG); // validate for tolerance int64_t retval = getDelayAfterTrigger(); - val /= (1E-3 * clkFrequency[SYNC_CLK]); + val /= (1E-3 * CLK_SYNC); if (val != retval) { return FAIL; } @@ -956,151 +1071,243 @@ int setDelayAfterTrigger(int64_t val) { } int64_t getDelayAfterTrigger() { - return get64BitReg(DELAY_LSB_REG, DELAY_MSB_REG) / - (1E-3 * clkFrequency[SYNC_CLK]); + return get64BitReg(SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG) / + (1E-3 * CLK_SYNC); +} + +void setNumAdditionalStorageCells(int val) { + if (val >= 0) { + LOG(logINFO, ("Setting number of addl. storage cells %d\n", val)); + bus_w(CONTROL_REG, + (bus_r(CONTROL_REG) & ~CONTROL_STORAGE_CELL_NUM_MSK) | + ((val << CONTROL_STORAGE_CELL_NUM_OFST) & + CONTROL_STORAGE_CELL_NUM_MSK)); + } +} + +int getNumAdditionalStorageCells() { + return ((bus_r(CONTROL_REG) & CONTROL_STORAGE_CELL_NUM_MSK) >> + CONTROL_STORAGE_CELL_NUM_OFST); +} + +int setStorageCellDelay(int64_t val) { + if (val < 0) { + LOG(logERROR, + ("Invalid delay after trigger: %lld ns\n", (long long int)val)); + return FAIL; + } + LOG(logINFO, ("Setting storage cell delay %lld ns\n", (long long int)val)); + val *= (1E-3 * CLK_RUN); + bus_w(ASIC_CTRL_REG, + (bus_r(ASIC_CTRL_REG) & ~ASIC_CTRL_EXPSRE_TMR_MSK) | + ((val << ASIC_CTRL_EXPSRE_TMR_OFST) & ASIC_CTRL_EXPSRE_TMR_MSK)); + + // validate for tolerance + int64_t retval = getStorageCellDelay(); + val /= (1E-3 * CLK_RUN); + if (val != retval) { + return FAIL; + } + return OK; +} + +int64_t getStorageCellDelay() { + return (((int64_t)((bus_r(ASIC_CTRL_REG) & ASIC_CTRL_EXPSRE_TMR_MSK) >> + ASIC_CTRL_EXPSRE_TMR_OFST)) / + (1E-3 * CLK_RUN)); } int64_t getNumFramesLeft() { - return get64BitReg(FRAMES_LEFT_LSB_REG, FRAMES_LEFT_MSB_REG); + return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); } int64_t getNumTriggersLeft() { - return get64BitReg(CYCLES_LEFT_LSB_REG, CYCLES_LEFT_MSB_REG); -} - -int64_t getDelayAfterTriggerLeft() { - return get64BitReg(DELAY_LEFT_LSB_REG, DELAY_LEFT_MSB_REG) / - (1E-3 * clkFrequency[SYNC_CLK]); + return get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); } int64_t getPeriodLeft() { - return get64BitReg(PERIOD_LEFT_LSB_REG, PERIOD_LEFT_MSB_REG) / - (1E-3 * clkFrequency[SYNC_CLK]); + return get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / + (1E-3 * CLK_SYNC); +} + +int64_t getDelayAfterTriggerLeft() { + return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) / + (1E-3 * CLK_SYNC); } int64_t getFramesFromStart() { - return get64BitReg(FRAMES_FROM_START_PG_LSB_REG, - FRAMES_FROM_START_PG_MSB_REG); + return get64BitReg(FRAMES_FROM_START_LSB_REG, FRAMES_FROM_START_MSB_REG); } int64_t getActualTime() { return get64BitReg(TIME_FROM_START_LSB_REG, TIME_FROM_START_MSB_REG) / - (1E-3 * CLK_FREQ); + (1E-3 * CLK_SYNC); } int64_t getMeasurementTime() { return get64BitReg(START_FRAME_TIME_LSB_REG, START_FRAME_TIME_MSB_REG) / - (1E-3 * CLK_FREQ); + (1E-3 * CLK_SYNC); } -/* parameters - settings */ +/* parameters - channel, chip, module, settings */ + +int setModule(sls_detector_module myMod, char *mess) { + + LOG(logINFO, ("Setting module with settings %d\n", myMod.reg)); + + // settings + setSettings((enum detectorSettings)myMod.reg); + + // set dac values + for (int i = 0; i < NDAC; ++i) + setDAC((enum DACINDEX)i, myMod.dacs[i], 0); + return OK; +} enum detectorSettings setSettings(enum detectorSettings sett) { if (sett == UNINITIALIZED) return thisSettings; + int *dacVals = NULL; // set settings switch (sett) { - case G1_HIGHGAIN: - LOG(logINFO, ("Set settings - G1_HIGHGAIN\n")); - setPatternBitMask(G1_HIGHGAIN_PATSETBIT); + case GAIN0: + bus_w(DAQ_REG, bus_r(DAQ_REG) & ~DAQ_HIGH_GAIN_MSK); + LOG(logINFO, + ("Set settings - Gain 0 [DAQ Reg:0x%x]\n", bus_r(DAQ_REG))); + dacVals = defaultDacValue_G0; break; - case G1_LOWGAIN: - LOG(logINFO, ("Set settings - G1_LOWGAIN\n")); - setPatternBitMask(G1_LOWGAIN_PATSETBIT); - break; - case G2_HIGHCAP_HIGHGAIN: - LOG(logINFO, ("Set settings - G2_HIGHCAP_HIGHGAIN\n")); - setPatternBitMask(G2_HIGHCAP_HIGHGAIN_PATSETBIT); - break; - case G2_HIGHCAP_LOWGAIN: - LOG(logINFO, ("Set settings - G2_HIGHCAP_LOWGAIN\n")); - setPatternBitMask(G2_HIGHCAP_LOWGAIN_PATSETBIT); - break; - case G2_LOWCAP_HIGHGAIN: - LOG(logINFO, ("Set settings - G2_LOWCAP_HIGHGAIN\n")); - setPatternBitMask(G2_LOWCAP_HIGHGAIN_PATSETBIT); - break; - case G2_LOWCAP_LOWGAIN: - LOG(logINFO, ("Set settings - G2_LOWCAP_LOWGAIN\n")); - setPatternBitMask(G2_LOWCAP_LOWGAIN_PATSETBIT); - break; - case G4_HIGHGAIN: - LOG(logINFO, ("Set settings - G4_HIGHGAIN\n")); - setPatternBitMask(G4_HIGHGAIN_PATSETBIT); - break; - case G4_LOWGAIN: - LOG(logINFO, ("Set settings - G4_LOWGAIN\n")); - setPatternBitMask(G4_LOWGAIN_PATSETBIT); + case HIGHGAIN0: + bus_w(DAQ_REG, bus_r(DAQ_REG) | DAQ_HIGH_GAIN_MSK); + LOG(logINFO, + ("Set settings - High Gain 0 [DAQ Reg:0x%x]\n", bus_r(DAQ_REG))); + dacVals = defaultDacValue_HG0; break; default: - LOG(logERROR, - ("This settings is not defined for this detector %d\n", (int)sett)); + LOG(logERROR, ("This settings %d is not defined\n", (int)sett)); return -1; } - setPatternMask(DEFAULT_PATMASK); + thisSettings = sett; + // set special dacs + const int specialDacs[] = SPECIALDACINDEX; + for (int i = 0; i < NSPECIALDACS; ++i) { + setDAC(specialDacs[i], dacVals[i], 0); + } + + // if chipv1.1 and powered on + configureChip(); + return getSettings(); } enum detectorSettings getSettings() { + if (bus_r(DAQ_REG) & DAQ_HIGH_GAIN_MSK) + return HIGHGAIN0; + return GAIN0; +} - uint64_t patmask = getPatternMask(); - if (patmask != DEFAULT_PATMASK) { - LOG(logERROR, - ("Patmask is 0x%llx, and not 0x%llx. Undefined Settings!\n", - patmask, DEFAULT_PATMASK)); - thisSettings = UNDEFINED; - return thisSettings; +enum gainMode getGainMode() { + uint32_t regval = bus_r(DAQ_REG); + uint32_t retval_force = regval & DAQ_FRCE_SWTCH_GAIN_MSK; + uint32_t retval_fix = regval & DAQ_FIX_GAIN_MSK; + uint32_t retval_cmp_rst = regval & DAQ_CMP_RST_MSK; + + // only one set should be valid + if ((retval_force && retval_fix) || (retval_fix && retval_cmp_rst) || + (retval_force && retval_cmp_rst)) { + LOG(logERROR, ("undefined gain mode. DAQ reg: 0x%x\n", regval)); } - uint64_t patsetbit = getPatternBitMask(); - switch (patsetbit) { - case G1_HIGHGAIN_PATSETBIT: - thisSettings = G1_HIGHGAIN; + // dynamic gain, when nothing is set + if (retval_force == 0 && retval_fix == 0 && retval_cmp_rst == 0) { + return DYNAMIC; + } + + switch (retval_force) { + case DAQ_FRCE_GAIN_STG_1_VAL: + return FORCE_SWITCH_G1; + case DAQ_FRCE_GAIN_STG_2_VAL: + return FORCE_SWITCH_G2; + default: break; - case G1_LOWGAIN_PATSETBIT: - thisSettings = G1_LOWGAIN; + } + + switch (retval_fix) { + case DAQ_FIX_GAIN_STG_1_VAL: + return FIX_G1; + case DAQ_FIX_GAIN_STG_2_VAL: + return FIX_G2; + default: break; - case G2_HIGHCAP_HIGHGAIN_PATSETBIT: - thisSettings = G2_HIGHCAP_HIGHGAIN; + } + + if (retval_cmp_rst) { + return FIX_G0; + } + + LOG(logERROR, ("This gain mode is undefined [DAQ reg: %d]\n", regval)); + return -1; +} + +void setGainMode(enum gainMode mode) { + uint32_t addr = DAQ_REG; + uint32_t value = bus_r(addr); + + switch (mode) { + case DYNAMIC: + value &= ~(DAQ_GAIN_MODE_MASK); + bus_w(addr, value); + LOG(logINFO, + ("Set gain mode - Dynamic Gain [DAQ Reg:0x%x]\n", bus_r(DAQ_REG))); break; - case G2_HIGHCAP_LOWGAIN_PATSETBIT: - thisSettings = G2_HIGHCAP_LOWGAIN; + case FORCE_SWITCH_G1: + value &= ~(DAQ_GAIN_MODE_MASK); + value |= DAQ_FRCE_GAIN_STG_1_VAL; + bus_w(addr, value); + LOG(logINFO, ("Set gain mode - Force Switch G1 [DAQ Reg:0x%x]\n", + bus_r(DAQ_REG))); break; - case G2_LOWCAP_HIGHGAIN_PATSETBIT: - thisSettings = G2_LOWCAP_HIGHGAIN; + case FORCE_SWITCH_G2: + value &= ~(DAQ_GAIN_MODE_MASK); + value |= DAQ_FRCE_GAIN_STG_2_VAL; + bus_w(addr, value); + LOG(logINFO, ("Set gain mode - Force Switch G2 [DAQ Reg:0x%x]\n", + bus_r(DAQ_REG))); break; - case G2_LOWCAP_LOWGAIN_PATSETBIT: - thisSettings = G2_LOWCAP_LOWGAIN; + case FIX_G1: + value &= ~(DAQ_GAIN_MODE_MASK); + value |= DAQ_FIX_GAIN_STG_1_VAL; + bus_w(addr, value); + LOG(logINFO, + ("Set gain mode - Fix G1 [DAQ Reg:0x%x]\n", bus_r(DAQ_REG))); break; - case G4_HIGHGAIN_PATSETBIT: - thisSettings = G4_HIGHGAIN; + case FIX_G2: + value &= ~(DAQ_GAIN_MODE_MASK); + value |= DAQ_FIX_GAIN_STG_2_VAL; + bus_w(addr, value); + LOG(logINFO, + ("Set gain mode - Fix G2 [DAQ Reg:0x%x]\n", bus_r(DAQ_REG))); break; - case G4_LOWGAIN_PATSETBIT: - thisSettings = G4_LOWGAIN; + case FIX_G0: + value &= ~(DAQ_GAIN_MODE_MASK); + value |= DAQ_CMP_RST_MSK; + bus_w(addr, value); + LOG(logINFO, + ("Set gain mode - Fix G0 [DAQ Reg:0x%x]\n", bus_r(DAQ_REG))); break; default: - LOG(logERROR, - ("Patsetbit is 0x%llx. Undefined Settings!\n", patsetbit)); - thisSettings = UNDEFINED; - break; + LOG(logERROR, ("This gain mode %d is not defined\n", (int)mode)); } - return thisSettings; } /* parameters - dac, adc, hv */ - void setDAC(enum DACINDEX ind, int val, int mV) { - if (val < 0 && val != LTC2620_GetPowerDownValue()) { + if (val < 0) return; - } char *dac_names[] = {DAC_NAMES}; - LOG(logINFO, ("Setting DAC %s\n", dac_names[ind])); - LOG(logDEBUG, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dac_names[ind], - val, (mV ? "mV" : "dac units"))); int dacval = val; #ifdef VIRTUAL LOG(logINFO, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dac_names[ind], @@ -1113,8 +1320,18 @@ void setDAC(enum DACINDEX ind, int val, int mV) { dacValues[ind] = dacval; } #else - if (LTC2620_SetDACValue((int)ind, val, mV, &dacval) == OK) + LOG(logINFO, ("Setting DAC %s\n", dac_names[ind])); + if (LTC2620_SetDACValue((int)ind, val, mV, &dacval) == OK) { dacValues[ind] = dacval; + if (ind == J_VREF_COMP && + (val >= 0)) { // FIXME: if val == pwr down value, write 0? + bus_w(EXT_DAQ_CTRL_REG, + (bus_r(EXT_DAQ_CTRL_REG) & + ~(EXT_DAQ_CTRL_VREF_COMP_MSK)) // reset + | ((val << EXT_DAQ_CTRL_VREF_COMP_OFST) & + EXT_DAQ_CTRL_VREF_COMP_MSK)); // or it with value + } + } #endif } @@ -1132,52 +1349,37 @@ int getDAC(enum DACINDEX ind, int mV) { int getMaxDacSteps() { return LTC2620_GetMaxNumSteps(); } -int dacToVoltage(int dac) { - int val; - LTC2620_DacToVoltage(dac, &val); - return val; -} +int getADC(enum ADCINDEX ind) { +#ifdef VIRTUAL + return 0; +#endif + char tempnames[2][40] = {"VRs/FPGAs Temperature", "ADCs/ASICs Temperature"}; + LOG(logDEBUG1, ("Getting Temperature for %s\n", tempnames[ind])); + u_int32_t addr = GET_TEMPERATURE_TMP112_REG; + uint32_t regvalue = bus_r(addr); + uint32_t value = regvalue & TEMPERATURE_VALUE_MSK; + double retval = value; -int checkVLimitCompliant(int mV) { - if (vLimit > 0 && mV > vLimit) - return FAIL; - return OK; -} - -int checkVLimitDacCompliant(int dac) { - if (vLimit > 0) { - int mv = 0; - // could not convert - if (LTC2620_DacToVoltage(dac, &mv) == FAIL) - return FAIL; - if (mv > vLimit) - return FAIL; + // negative + if (regvalue & TEMPERATURE_POLARITY_MSK) { + // 2s complement + int ret = (~value) + 1; + // attach negative sign + ret = 0 - value; + retval = ret; } - return OK; -} -int getVLimit() { return vLimit; } - -void setVLimit(int l) { - if (l >= 0) - vLimit = l; + // conversion + retval *= 625.0 / 10.0; + LOG(logINFO, ("Temperature %s: %f °C\n", tempnames[ind], retval / 1000.00)); + return retval; } int setHighVoltage(int val) { // setting hv if (val >= 0) { - LOG(logINFO, ("Setting High voltage: %d V\n", val)); - uint32_t addr = POWER_REG; - - // switch to external high voltage - bus_w(addr, bus_r(addr) & (~POWER_HV_INTERNAL_SLCT_MSK)); - + LOG(logINFO, ("Setting High voltage: %d V", val)); MAX1932_Set(&val); - - // switch on internal high voltage, if set - if (val > 0) - bus_w(addr, bus_r(addr) | POWER_HV_INTERNAL_SLCT_MSK); - highvoltage = val; } return highvoltage; @@ -1185,6 +1387,55 @@ int setHighVoltage(int val) { /* parameters - timing, extsig */ +int setMaster(enum MASTERINDEX m) { + char *master_names[] = {MASTER_NAMES}; + LOG(logINFOBLUE, ("Setting up as %s in (%s server)\n", master_names[m], + (isControlServer ? "control" : "stop"))); + int retval = -1; + switch (m) { + case OW_MASTER: + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_MASTER_MSK); + isMaster(&retval); + if (retval != 1) { + LOG(logERROR, ("Could not set master\n")); + return FAIL; + } + break; + case OW_SLAVE: + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_MASTER_MSK); + isMaster(&retval); + if (retval != 0) { + LOG(logERROR, ("Could not set slave\n")); + return FAIL; + } + break; + default: + LOG(logERROR, ("Cannot reset to hardware settings from client. Restart " + "detector server.\n")); + return FAIL; + } + return OK; +} + +int isMaster(int *retval) { + *retval = + ((bus_r(CONTROL_REG) & CONTROL_MASTER_MSK) >> CONTROL_MASTER_OFST); + return OK; +} + +int getSynchronization() { + return ((bus_r(EXT_SIGNAL_REG) & EXT_SYNC_MSK) >> EXT_SYNC_OFST); +} + +void setSynchronization(int enable) { + LOG(logINFOBLUE, + ("%s Synchronization\n", (enable ? "Enabling" : "Disabling"))); + if (enable) + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) | EXT_SYNC_MSK); + else + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) & ~EXT_SYNC_MSK); +} + void setTiming(enum timingMode arg) { switch (arg) { case AUTO_TIMING: @@ -1207,8 +1458,122 @@ enum timingMode getTiming() { } /* configure mac */ +void setNumberofUDPInterfaces(int val) { + uint32_t addr = CONFIG_REG; -int getNumberofUDPInterfaces() { return 1; } + // enable 2 interfaces + if (val > 1) { + LOG(logINFOBLUE, ("Setting #Interfaces: 2\n")); + bus_w(addr, bus_r(addr) | CONFIG_OPRTN_MDE_2_X_10GbE_MSK); + } + // enable only 1 interface + else { + LOG(logINFOBLUE, ("Setting #Interfaces: 1\n")); + bus_w(addr, bus_r(addr) & ~CONFIG_OPRTN_MDE_2_X_10GbE_MSK); + } + LOG(logDEBUG, ("config reg:0x%x\n", bus_r(addr))); +} + +int getNumberofUDPInterfaces() { + LOG(logDEBUG, ("config reg:0x%x\n", bus_r(CONFIG_REG))); + // return 2 if enabled, else 1 + return ((bus_r(CONFIG_REG) & CONFIG_OPRTN_MDE_2_X_10GbE_MSK) ? 2 : 1); +} + +int getNumberofDestinations(int *retval) { + *retval = (((bus_r(CONTROL_REG) & CONTROL_RX_ADDTNL_ENDPTS_NUM_MSK) >> + CONTROL_RX_ADDTNL_ENDPTS_NUM_OFST) + + 1); + return OK; +} + +int setNumberofDestinations(int value) { + LOG(logINFO, ("Setting number of entries to %d\n", value)); + --value; + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_RX_ADDTNL_ENDPTS_NUM_MSK); + bus_w(CONTROL_REG, + bus_r(CONTROL_REG) | ((value << CONTROL_RX_ADDTNL_ENDPTS_NUM_OFST) & + CONTROL_RX_ADDTNL_ENDPTS_NUM_MSK)); + return OK; +} + +int getFirstUDPDestination() { + return ((bus_r(CONTROL_REG) & CONTROL_RX_ENDPTS_START_MSK) >> + CONTROL_RX_ENDPTS_START_OFST); +} + +void setFirstUDPDestination(int value) { + LOG(logINFO, ("Setting first entry to %d\n", value)); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_RX_ENDPTS_START_MSK); + bus_w(CONTROL_REG, + bus_r(CONTROL_REG) | ((value << CONTROL_RX_ENDPTS_START_OFST) & + CONTROL_RX_ENDPTS_START_MSK)); +} + +void selectPrimaryInterface(int val) { + uint32_t addr = CONFIG_REG; + + // outer (user input: 0) + if (val == 0) { + LOG(logINFOBLUE, ("Setting Primary Interface: 0 (Outer)\n")); + bus_w(addr, bus_r(addr) & ~CONFIG_INNR_PRIMRY_INTRFCE_MSK); + } + // inner (user input: 1) + else { + LOG(logINFOBLUE, ("Setting Secondary Interface: 1 (Inner)\n")); + bus_w(addr, bus_r(addr) | CONFIG_INNR_PRIMRY_INTRFCE_MSK); + } +} + +int getPrimaryInterface() { + return ((bus_r(CONFIG_REG) & CONFIG_INNR_PRIMRY_INTRFCE_MSK) ? 1 : 0); +} + +void setupHeader(int iRxEntry, enum interfaceType type, uint32_t destip, + uint64_t destmac, uint32_t destport, uint64_t sourcemac, + uint32_t sourceip, uint32_t sourceport) { + + // start addr + uint32_t addr = (type == INNER ? RXR_ENDPOINT_INNER_START_REG + : RXR_ENDPOINT_OUTER_START_REG); + // calculate rxr endpoint offset + addr += (iRxEntry * RXR_ENDPOINT_OFST); + // get struct memory + udp_header *udp = (udp_header *)(Blackfin_getBaseAddress() + addr / 2); + memset(udp, 0, sizeof(udp_header)); + + // mac addresses + // msb (32) + lsb (16) + udp->udp_destmac_msb = ((destmac >> 16) & BIT32_MASK); + udp->udp_destmac_lsb = ((destmac >> 0) & BIT16_MASK); + // msb (16) + lsb (32) + udp->udp_srcmac_msb = ((sourcemac >> 32) & BIT16_MASK); + udp->udp_srcmac_lsb = ((sourcemac >> 0) & BIT32_MASK); + + // ip addresses + udp->ip_srcip_msb = ((sourceip >> 16) & BIT16_MASK); + udp->ip_srcip_lsb = ((sourceip >> 0) & BIT16_MASK); + udp->ip_destip_msb = ((destip >> 16) & BIT16_MASK); + udp->ip_destip_lsb = ((destip >> 0) & BIT16_MASK); + + // source port + udp->udp_srcport = sourceport; + udp->udp_destport = destport; + + // other defines + udp->udp_ethertype = 0x800; + udp->ip_ver = 0x4; + udp->ip_ihl = 0x5; + udp->ip_flags = 0x2; // FIXME + udp->ip_ttl = 0x40; + udp->ip_protocol = 0x11; + // total length is redefined in firmware + + calcChecksum(udp); + if (iRxEntry < numUdpDestinations) { + LOG(logINFO, ("\tIP checksum : 0x%lx\n\n", udp->ip_checksum)); + } +} void calcChecksum(udp_header *udp) { int count = IP_HEADER_SIZE; @@ -1238,171 +1603,498 @@ void calcChecksum(udp_header *udp) { sum = (sum & 0xffff) + (sum >> 16); // Fold 32-bit sum to 16 bits long int checksum = sum & 0xffff; checksum += UDP_IP_HEADER_LENGTH_BYTES; - LOG(logINFO, ("\tIP checksum is 0x%lx\n", checksum)); udp->ip_checksum = checksum; } int configureMAC() { - uint32_t srcip = udpDetails[0].srcip; - uint32_t dstip = udpDetails[0].dstip; - uint64_t srcmac = udpDetails[0].srcmac; - uint64_t dstmac = udpDetails[0].dstmac; - int srcport = udpDetails[0].srcport; - int dstport = udpDetails[0].dstport; LOG(logINFOBLUE, ("Configuring MAC\n")); - char src_mac[MAC_ADDRESS_SIZE], src_ip[INET_ADDRSTRLEN], - dst_mac[MAC_ADDRESS_SIZE], dst_ip[INET_ADDRSTRLEN]; - getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, srcmac); - getMacAddressinString(dst_mac, MAC_ADDRESS_SIZE, dstmac); - getIpAddressinString(src_ip, srcip); - getIpAddressinString(dst_ip, dstip); - LOG(logINFO, ("\tSource IP : %s\n" - "\tSource MAC : %s\n" - "\tSource Port : %d\n" - "\tDest IP : %s\n" - "\tDest MAC : %s\n" - "\tDest Port : %d\n", - src_ip, src_mac, srcport, dst_ip, dst_mac, dstport)); + int numInterfaces = getNumberofUDPInterfaces(); + int selInterface = getPrimaryInterface(); + LOG(logINFO, ("\t#Interfaces : %d\n", numInterfaces)); + LOG(logINFO, ("\tInterface : %d %s\n\n", selInterface, + (selInterface ? "Inner" : "Outer"))); - // 1 giga udp - if (!enableTenGigabitEthernet(-1)) { - LOG(logINFOBLUE, ("\t1G MAC\n")); - if (updateDatabytesandAllocateRAM() == FAIL) - return -1; - if (setUDPDestinationDetails(0, 0, dst_ip, dstport) == FAIL) { - LOG(logERROR, ("could not set udp 1G destination IP and port\n")); + LOG(logINFO, ("Number of entries: %d\n\n", numUdpDestinations)); + for (int iRxEntry = 0; iRxEntry != MAX_UDP_DESTINATION; ++iRxEntry) { + uint32_t srcip = udpDetails[iRxEntry].srcip; + uint32_t srcip2 = udpDetails[iRxEntry].srcip2; + uint32_t dstip = udpDetails[iRxEntry].dstip; + uint32_t dstip2 = udpDetails[iRxEntry].dstip2; + uint64_t srcmac = udpDetails[iRxEntry].srcmac; + uint64_t srcmac2 = udpDetails[iRxEntry].srcmac2; + uint64_t dstmac = udpDetails[iRxEntry].dstmac; + uint64_t dstmac2 = udpDetails[iRxEntry].dstmac2; + int srcport = udpDetails[iRxEntry].srcport; + int srcport2 = udpDetails[iRxEntry].srcport2; + int dstport = udpDetails[iRxEntry].dstport; + int dstport2 = udpDetails[iRxEntry].dstport2; + + char src_mac[MAC_ADDRESS_SIZE], src_ip[INET_ADDRSTRLEN], + dst_mac[MAC_ADDRESS_SIZE], dst_ip[INET_ADDRSTRLEN]; + getMacAddressinString(src_mac, MAC_ADDRESS_SIZE, srcmac); + getMacAddressinString(dst_mac, MAC_ADDRESS_SIZE, dstmac); + getIpAddressinString(src_ip, srcip); + getIpAddressinString(dst_ip, dstip); + char src_mac2[MAC_ADDRESS_SIZE], src_ip2[INET_ADDRSTRLEN], + dst_mac2[MAC_ADDRESS_SIZE], dst_ip2[INET_ADDRSTRLEN]; + getMacAddressinString(src_mac2, MAC_ADDRESS_SIZE, srcmac2); + getMacAddressinString(dst_mac2, MAC_ADDRESS_SIZE, dstmac2); + getIpAddressinString(src_ip2, srcip2); + getIpAddressinString(dst_ip2, dstip2); + + if (iRxEntry < numUdpDestinations) { + LOG(logINFOBLUE, ("\tEntry %d\n", iRxEntry)); + + LOG(logINFO, + ("\tOuter %s\n", (numInterfaces == 2) + ? "(Bottom)" + : (selInterface ? "Not Used" : "Used"))); + LOG(logINFO, ("\tSource IP : %s\n" + "\tSource MAC : %s\n" + "\tSource Port : %d\n" + "\tDest IP : %s\n" + "\tDest MAC : %s\n" + "\tDest Port : %d\n\n", + src_ip, src_mac, srcport, dst_ip, dst_mac, dstport)); + + LOG(logINFO, + ("\tInner %s\n", (numInterfaces == 2) + ? "(Top)" + : (selInterface ? "Used" : "Not Used"))); + LOG(logINFO, + ("\tSource IP2 : %s\n" + "\tSource MAC2 : %s\n" + "\tSource Port2: %d\n" + "\tDest IP2 : %s\n" + "\tDest MAC2 : %s\n" + "\tDest Port2 : %d\n\n", + src_ip2, src_mac2, srcport2, dst_ip2, dst_mac2, dstport2)); + } +#ifdef VIRTUAL + if (setUDPDestinationDetails(iRxEntry, 0, dst_ip, dstport) == FAIL) { + LOG(logERROR, ("could not set udp destination IP and port for " + "interface 1 [entry:%d] \n", + iRxEntry)); return FAIL; } - return OK; + if (numInterfaces == 2 && + setUDPDestinationDetails(iRxEntry, 1, dst_ip2, dstport2) == FAIL) { + LOG(logERROR, ("could not set udp destination IP and port for " + "interface 2 [entry:%d]\n", + iRxEntry)); + return FAIL; + } +#endif + if (numInterfaces == 2) { + // bottom + setupHeader(iRxEntry, OUTER, dstip, dstmac, dstport, srcmac, srcip, + srcport); + // top + setupHeader(iRxEntry, INNER, dstip2, dstmac2, dstport2, srcmac2, + srcip2, srcport2); + } + // single interface + else { + // default + if (selInterface == 0) { + setupHeader(iRxEntry, OUTER, dstip, dstmac, dstport, srcmac, + srcip, srcport); + } else { + setupHeader(iRxEntry, INNER, dstip, dstmac, dstport, srcmac, + srcip, srcport2); + } + } } + setNumberofUDPInterfaces(numInterfaces); + selectPrimaryInterface(selInterface); - // 10 G - LOG(logINFOBLUE, ("\t10G MAC\n")); - - // start addr - uint32_t addr = RXR_ENDPOINT_START_REG; - // get struct memory - udp_header *udp = (udp_header *)(Blackfin_getBaseAddress() + addr / 2); - memset(udp, 0, sizeof(udp_header)); - - // mac addresses - // msb (32) + lsb (16) - udp->udp_destmac_msb = ((dstmac >> 16) & BIT32_MASK); - udp->udp_destmac_lsb = ((dstmac >> 0) & BIT16_MASK); - // msb (16) + lsb (32) - udp->udp_srcmac_msb = ((srcmac >> 32) & BIT16_MASK); - udp->udp_srcmac_lsb = ((srcmac >> 0) & BIT32_MASK); - - // ip addresses - udp->ip_srcip_msb = ((srcip >> 16) & BIT16_MASK); - udp->ip_srcip_lsb = ((srcip >> 0) & BIT16_MASK); - udp->ip_destip_msb = ((dstip >> 16) & BIT16_MASK); - udp->ip_destip_lsb = ((dstip >> 0) & BIT16_MASK); - - // source port - udp->udp_srcport = srcport; - udp->udp_destport = dstport; - - // other defines - udp->udp_ethertype = 0x800; - udp->ip_ver = 0x4; - udp->ip_ihl = 0x5; - udp->ip_flags = 0x2; // FIXME - udp->ip_ttl = 0x40; - udp->ip_protocol = 0x11; - // total length is redefined in firmware - - calcChecksum(udp); - - cleanFifos(); // FIXME: resetPerpheral() for ctb? - resetPeripheral(); - LOG(logINFO, ("Waiting for %d s for mac to be up\n", - WAIT_TIME_CONFIGURE_MAC / (1000 * 1000))); - usleep(WAIT_TIME_CONFIGURE_MAC); // todo maybe without - + cleanFifos(); + resetCore(); + alignDeserializer(); return OK; } int setDetectorPosition(int pos[]) { - memcpy(detPos, pos, sizeof(detPos)); - return OK; + int ret = OK; + // row, col + uint32_t innerPos[2] = {pos[X], pos[Y]}; + uint32_t outerPos[2] = {pos[X], pos[Y]}; + int selInterface = getPrimaryInterface(); + + if (getNumberofUDPInterfaces() == 1) { + LOG(logDEBUG, + ("Setting detector position: 1 Interface %s \n(%d, %d)\n", + (selInterface ? "Inner" : "Outer"), innerPos[X], innerPos[Y])); + } else { + // top has row incremented by 1 + ++innerPos[Y]; + LOG(logDEBUG, ("Setting detector position: 2 Interfaces \n" + " inner top(%d, %d), outer bottom(%d, %d)\n", + innerPos[X], innerPos[Y], outerPos[X], outerPos[Y])); + } + detPos[0] = innerPos[X]; + detPos[1] = innerPos[Y]; + detPos[2] = outerPos[X]; + detPos[3] = outerPos[Y]; + + // row + // outer + uint32_t addr = COORD_ROW_REG; + bus_w(addr, + (bus_r(addr) & ~COORD_ROW_OUTER_MSK) | + ((outerPos[X] << COORD_ROW_OUTER_OFST) & COORD_ROW_OUTER_MSK)); + if (((bus_r(addr) & COORD_ROW_OUTER_MSK) >> COORD_ROW_OUTER_OFST) != + outerPos[X]) + ret = FAIL; + // inner + bus_w(addr, + (bus_r(addr) & ~COORD_ROW_INNER_MSK) | + ((innerPos[X] << COORD_ROW_INNER_OFST) & COORD_ROW_INNER_MSK)); + if (((bus_r(addr) & COORD_ROW_INNER_MSK) >> COORD_ROW_INNER_OFST) != + innerPos[X]) + ret = FAIL; + + // col + // outer + addr = COORD_COL_REG; + bus_w(addr, + (bus_r(addr) & ~COORD_COL_OUTER_MSK) | + ((outerPos[Y] << COORD_COL_OUTER_OFST) & COORD_COL_OUTER_MSK)); + if (((bus_r(addr) & COORD_COL_OUTER_MSK) >> COORD_COL_OUTER_OFST) != + outerPos[Y]) + ret = FAIL; + // inner + bus_w(addr, + (bus_r(addr) & ~COORD_COL_INNER_MSK) | + ((innerPos[Y] << COORD_COL_INNER_OFST) & COORD_COL_INNER_MSK)); + if (((bus_r(addr) & COORD_COL_INNER_MSK) >> COORD_COL_INNER_OFST) != + innerPos[Y]) + ret = FAIL; + + if (ret == OK) { + if (getNumberofUDPInterfaces() == 1) { + LOG(logINFOBLUE, ("Position set to [%d, %d] #(col, row)\n", + innerPos[X], innerPos[Y])); + } else { + LOG(logINFOBLUE, (" Inner (top) position set to [%d, %d]\n", + innerPos[X], innerPos[Y])); + LOG(logINFOBLUE, (" Outer (bottom) position set to [%d, %d]\n", + outerPos[X], outerPos[Y])); + } + } + return ret; } int *getDetectorPosition() { return detPos; } -int enableTenGigabitEthernet(int val) { - uint32_t addr = CONFIG_REG; +/* moench specific - powerchip, autocompdisable, asictimer, clockdiv, pll, + * flashing fpga */ - // set - if (val != -1) { - LOG(logINFO, ("Setting 10Gbe: %d\n", (val > 0) ? 1 : 0)); - if (val > 0) { - bus_w(addr, bus_r(addr) | CONFIG_GB10_SND_UDP_MSK); - } else { - bus_w(addr, bus_r(addr) & (~CONFIG_GB10_SND_UDP_MSK)); - } - // configuremac called from client +int setReadNRows(int value) { + if (value < 0 || (value % READ_N_ROWS_MULTIPLE != 0)) { + LOG(logERROR, ("Invalid number of rows %d\n", value)); + return FAIL; } - return ((bus_r(addr) & CONFIG_GB10_SND_UDP_MSK) >> - CONFIG_GB10_SND_UDP_OFST); + if (isHardwareVersion_1_0()) { + LOG(logERROR, ("Could not set number of rows. Only available for " + "Hardware Board version v2.0.\n")); + return FAIL; + } + + // regval is numpackets + int regval = (value / READ_N_ROWS_MULTIPLE); + uint32_t addr = READ_N_ROWS_REG; + LOG(logINFO, ("Setting number of rows: %d (regval:%d)\n", value, regval)); + bus_w(addr, bus_r(addr) & ~READ_N_ROWS_NUM_ROWS_MSK); + bus_w(addr, bus_r(addr) | ((regval << READ_N_ROWS_NUM_ROWS_OFST) & + READ_N_ROWS_NUM_ROWS_MSK)); + if (value == MAX_ROWS_PER_READOUT) { + LOG(logINFO, ("Disabling Partial Readout (#rows)\n")); + bus_w(addr, bus_r(addr) & ~READ_N_ROWS_ENBL_MSK); + } else { + LOG(logINFO, ("Enabling Partial Readout (#rows)\n")); + bus_w(addr, bus_r(addr) | READ_N_ROWS_ENBL_MSK); + } + return OK; +} + +int getReadNRows() { + // cannot set it in old board + if (isHardwareVersion_1_0()) { + return MAX_ROWS_PER_READOUT; + } + int enable = (bus_r(READ_N_ROWS_REG) & READ_N_ROWS_ENBL_MSK); + int regval = ((bus_r(READ_N_ROWS_REG) & READ_N_ROWS_NUM_ROWS_MSK) >> + READ_N_ROWS_NUM_ROWS_OFST); + + int maxRegval = (MAX_ROWS_PER_READOUT / READ_N_ROWS_MULTIPLE); + if ((regval == maxRegval && enable) || (regval != maxRegval && !enable)) { + return -1; + } + + return (regval * READ_N_ROWS_MULTIPLE); +} + +void initReadoutConfiguration() { + + LOG(logINFO, ("Initializing Readout Configuration:\n" + "\t Reset readout Timer\n" + "\t 1 x 10G mode\n" + "\t outer interface is primary\n" + "\t half speed\n" + "\t TDMA disabled, 0 as TDMA slot\n" + "\t Ethernet overflow disabled\n" + "\t Reset Round robin entries\n")); + + uint32_t val = 0; + // reset readouttimer + val &= ~CONFIG_RDT_TMR_MSK; + // 1 x 10G mode + val &= ~CONFIG_OPRTN_MDE_2_X_10GbE_MSK; + // outer interface + val &= ~CONFIG_INNR_PRIMRY_INTRFCE_MSK; + // half speed + val &= ~CONFIG_READOUT_SPEED_MSK; + val |= CONFIG_HALF_SPEED_20MHZ_VAL; + // tdma disable + val &= ~CONFIG_TDMA_ENABLE_MSK; + // tdma slot 0 + val &= ~CONFIG_TDMA_TIMESLOT_MSK; + // no ethernet overflow + val &= ~CONFIG_ETHRNT_FLW_CNTRL_MSK; + bus_w(CONFIG_REG, val); + + val = bus_r(CONTROL_REG); + // reset (addtional round robin entry) rx endpoints num + val &= CONTROL_RX_ADDTNL_ENDPTS_NUM_MSK; + // reset start of round robin entry to 0 + val &= CONTROL_RX_ENDPTS_START_MSK; + bus_w(CONTROL_REG, val); } -/* moench specific - powerchip, configure frequency, phase, pll*/ int powerChip(int on) { - uint32_t addr = POWER_REG; - if (on > 0) { - LOG(logINFOBLUE, ("Powering on chip\n")); - bus_w(addr, bus_r(addr) | POWER_CHIP_MSK); - } else if (on == 0) { - LOG(logINFOBLUE, ("Powering off chip\n")); - bus_w(addr, bus_r(addr) & ~POWER_CHIP_MSK); + if (on != -1) { + if (on) { + LOG(logINFOBLUE, ("Powering chip: on\n")); + bus_w(CHIP_POWER_REG, + bus_r(CHIP_POWER_REG) | CHIP_POWER_ENABLE_MSK); + + configureChip(); + } else { + LOG(logINFOBLUE, ("Powering chip: off\n")); + bus_w(CHIP_POWER_REG, + bus_r(CHIP_POWER_REG) & ~CHIP_POWER_ENABLE_MSK); + + chipConfigured = 0; + } } - return ((bus_r(addr) & POWER_CHIP_MSK) >> POWER_CHIP_OFST); +#ifdef VIRTUAL + return ((bus_r(CHIP_POWER_REG) & CHIP_POWER_ENABLE_MSK) >> + CHIP_POWER_ENABLE_OFST); +#endif + return ((bus_r(CHIP_POWER_REG) & CHIP_POWER_STATUS_MSK) >> + CHIP_POWER_STATUS_OFST); } -/* parameters - readout */ +int isChipConfigured() { return chipConfigured; } -int setAnalogOnlyReadout() { - LOG(logINFOBLUE, ("Setting Number of Digital samples to 0\n")); +void configureChip() { + // only for chipv1.1 and chip is powered on + if (getChipVersion() == 11 && powerChip(-1)) { + LOG(logINFOBLUE, ("\tConfiguring chip\n")); - // digital num samples = 0 - bus_w(SAMPLES_REG, bus_r(SAMPLES_REG) & ~SAMPLES_DIGITAL_MSK); + // waiting 500 ms before configuring selection + usleep(500 * 1000); - LOG(logINFOBLUE, ("Setting Analog Only Readout\n")); - // analog only readout - uint32_t addr = CONFIG_REG; - uint32_t addr_readout_10g = READOUT_10G_ENABLE_REG; - // default: analog only - bus_w(addr, bus_r(addr) & (~CONFIG_DSBL_ANLG_OTPT_MSK) & - (~CONFIG_ENBLE_DGTL_OTPT_MSK)); - bus_w(addr_readout_10g, bus_r(addr_readout_10g) & - (~READOUT_10G_ENABLE_ANLG_MSK) & - ~(READOUT_10G_ENABLE_DGTL_MSK)); - bus_w(addr_readout_10g, - bus_r(addr_readout_10g) | - ((adcEnableMask_10g << READOUT_10G_ENABLE_ANLG_OFST) & - READOUT_10G_ENABLE_ANLG_MSK)); + // write same values to configure selection + // if (chip was powered off earlier) + LOG(logINFO, ("\tRewriting values for selection\n")) + bus_w(CRRNT_SRC_COL_LSB_REG, bus_r(CRRNT_SRC_COL_LSB_REG)); + bus_w(CRRNT_SRC_COL_MSB_REG, bus_r(CRRNT_SRC_COL_MSB_REG)); - // 1Gb - if (!enableTenGigabitEthernet(-1)) { - if (updateDatabytesandAllocateRAM() == FAIL) { - return FAIL; + // waiting 500 ms before configuring chip + usleep(500 * 1000); + + // write same register values back to configure chip + bus_w(CONFIG_V11_REG, bus_r(CONFIG_V11_REG)); + + LOG(logINFOBLUE, ("\tChip configured\n")); + chipConfigured = 1; + } +} + +int autoCompDisable(int on) { + if (on != -1) { + if (on) { + LOG(logINFO, ("Auto comp disable mode: on\n")); + bus_w(EXT_DAQ_CTRL_REG, + bus_r(EXT_DAQ_CTRL_REG) | EXT_DAQ_CTRL_CMP_LGC_ENBL_MSK); + } else { + LOG(logINFO, ("Auto comp disable mode: off\n")); + bus_w(EXT_DAQ_CTRL_REG, + bus_r(EXT_DAQ_CTRL_REG) & ~EXT_DAQ_CTRL_CMP_LGC_ENBL_MSK); } } - // 10Gb - else { - // validate adcenablemask for 10g - if (adcEnableMask_10g != - ((bus_r(READOUT_10G_ENABLE_REG) & READOUT_10G_ENABLE_ANLG_MSK) >> - READOUT_10G_ENABLE_ANLG_OFST)) { - LOG(logERROR, ("Setting readout mode failed. Could not set 10g adc " - "enable mask to 0x%x\n.", - adcEnableMask_10g)); + return ((bus_r(EXT_DAQ_CTRL_REG) & EXT_DAQ_CTRL_CMP_LGC_ENBL_MSK) >> + EXT_DAQ_CTRL_CMP_LGC_ENBL_OFST); +} + +int setComparatorDisableTime(int64_t val) { + if (getChipVersion() != 11) { + return FAIL; + } + if (val < 0) { + LOG(logERROR, + ("Invalid comp disable time: %lld ns\n", (long long int)val)); + return FAIL; + } + LOG(logINFO, ("Setting comp disable time %lld ns\n", (long long int)val)); + val *= (1E-3 * CLK_RUN); + bus_w(COMP_DSBLE_TIME_REG, val); + + // validate for tolerance + int64_t retval = getComparatorDisableTime(); + val /= (1E-3 * CLK_RUN); + if (val != retval) { + return FAIL; + } + return OK; +} + +int64_t getComparatorDisableTime() { + return bus_r(COMP_DSBLE_TIME_REG) / (1E-3 * CLK_RUN); +} + +void configureASICTimer() { + bus_w(ASIC_CTRL_REG, (bus_r(ASIC_CTRL_REG) & ~ASIC_CTRL_PRCHRG_TMR_MSK) | + ASIC_CTRL_PRCHRG_TMR_VAL); + + uint32_t val = ASIC_CTRL_DS_TMR_VAL; + if (getChipVersion() == 11) { + val = ASIC_CTRL_DS_TMR_CHIP1_1_VAL; + } + bus_w(ASIC_CTRL_REG, (bus_r(ASIC_CTRL_REG) & ~ASIC_CTRL_DS_TMR_MSK) | val); + LOG(logINFO, ("Configured ASIC Timer [0x%x]\n", bus_r(ASIC_CTRL_REG))); +} + +int setReadoutSpeed(int val) { + // stop state machine if running + if (runBusy()) { + stopStateMachine(); + } + + uint32_t adcOfst = 0; + uint32_t sampleAdcSpeed = 0; + uint32_t adcPhase = 0; + uint32_t dbitPhase = 0; + uint32_t config = CONFIG_FULL_SPEED_40MHZ_VAL; + + switch (val) { + + case FULL_SPEED: + if (isHardwareVersion_1_0()) { + LOG(logERROR, ("Cannot set full speed. Should not be here\n")); return FAIL; } + LOG(logINFO, ("Setting Full Speed (40 MHz):\n")); + if (getChipVersion() == 10) { + sampleAdcSpeed = SAMPLE_ADC_FULL_SPEED_CHIP10; + adcPhase = ADC_PHASE_FULL_SPEED_CHIP10; + dbitPhase = DBIT_PHASE_FULL_SPEED_CHIP10; + adcOfst = ADC_OFST_FULL_SPEED_VAL_CHIP10; + } else { + sampleAdcSpeed = SAMPLE_ADC_FULL_SPEED_CHIP11; + adcPhase = ADC_PHASE_FULL_SPEED_CHIP11; + dbitPhase = DBIT_PHASE_FULL_SPEED_CHIP11; + adcOfst = ADC_OFST_FULL_SPEED_VAL_CHIP11; + } + config = CONFIG_FULL_SPEED_40MHZ_VAL; + break; + + case HALF_SPEED: + LOG(logINFO, ("Setting Half Speed (20 MHz):\n")); + if (isHardwareVersion_1_0()) { + adcOfst = ADC_OFST_HALF_SPEED_BOARD2_VAL; + sampleAdcSpeed = SAMPLE_ADC_HALF_SPEED_BOARD2; + adcPhase = ADC_PHASE_HALF_SPEED_BOARD2; + dbitPhase = DBIT_PHASE_HALF_SPEED_BOARD2; + } else if (getChipVersion() == 10) { + adcOfst = ADC_OFST_HALF_SPEED_VAL_CHIP10; + sampleAdcSpeed = SAMPLE_ADC_HALF_SPEED_CHIP10; + adcPhase = ADC_PHASE_HALF_SPEED_CHIP10; + dbitPhase = DBIT_PHASE_HALF_SPEED_CHIP10; + } else { + adcOfst = ADC_OFST_HALF_SPEED_VAL_CHIP11; + sampleAdcSpeed = SAMPLE_ADC_HALF_SPEED_CHIP11; + adcPhase = ADC_PHASE_HALF_SPEED_CHIP11; + dbitPhase = DBIT_PHASE_HALF_SPEED_CHIP11; + } + config = CONFIG_HALF_SPEED_20MHZ_VAL; + break; + + case QUARTER_SPEED: + LOG(logINFO, ("Setting Half Speed (10 MHz):\n")); + if (isHardwareVersion_1_0()) { + adcOfst = ADC_OFST_QUARTER_SPEED_BOARD2_VAL; + sampleAdcSpeed = SAMPLE_ADC_QUARTER_SPEED_BOARD2; + adcPhase = ADC_PHASE_QUARTER_SPEED_BOARD2; + dbitPhase = DBIT_PHASE_QUARTER_SPEED_BOARD2; + } else if (getChipVersion() == 10) { + adcOfst = ADC_OFST_QUARTER_SPEED_VAL_CHIP10; + sampleAdcSpeed = SAMPLE_ADC_QUARTER_SPEED_CHIP10; + adcPhase = ADC_PHASE_QUARTER_SPEED_CHIP10; + dbitPhase = DBIT_PHASE_QUARTER_SPEED_CHIP10; + } else { + adcOfst = ADC_OFST_QUARTER_SPEED_VAL_CHIP11; + sampleAdcSpeed = SAMPLE_ADC_QUARTER_SPEED_CHIP11; + adcPhase = ADC_PHASE_QUARTER_SPEED_CHIP11; + dbitPhase = DBIT_PHASE_QUARTER_SPEED_CHIP11; + } + config = CONFIG_QUARTER_SPEED_10MHZ_VAL; + break; + + default: + LOG(logERROR, ("Unknown speed val %d\n", val)); + return FAIL; + } + + bus_w(CONFIG_REG, (bus_r(CONFIG_REG) & ~CONFIG_READOUT_SPEED_MSK) | config); + LOG(logINFO, ("\tSet Config Reg to 0x%x\n", bus_r(CONFIG_REG))); + + bus_w(ADC_OFST_REG, adcOfst); + LOG(logINFO, ("\tSet ADC Ofst Reg to 0x%x\n", bus_r(ADC_OFST_REG))); + + bus_w(SAMPLE_REG, sampleAdcSpeed); + LOG(logINFO, ("\tSet Sample Reg to 0x%x\n", bus_r(SAMPLE_REG))); + + setPhase(ADC_CLK, adcPhase, 0); + LOG(logINFO, ("\tSet ADC Phase Reg to %d\n", adcPhase)); + + setPhase(DBIT_CLK, dbitPhase, 0); + LOG(logINFO, ("\tSet DBIT Phase Reg to %d\n", dbitPhase)); + + return OK; +} + +int getReadoutSpeed(int *retval) { + u_int32_t speed = bus_r(CONFIG_REG) & CONFIG_READOUT_SPEED_MSK; + switch (speed) { + case CONFIG_FULL_SPEED_40MHZ_VAL: + *retval = FULL_SPEED; + break; + case CONFIG_HALF_SPEED_20MHZ_VAL: + *retval = HALF_SPEED; + break; + case CONFIG_QUARTER_SPEED_10MHZ_VAL: + *retval = QUARTER_SPEED; + break; + default: + LOG(logERROR, ("Unknown speed val: %d\n", speed)); + *retval = -1; + return FAIL; } return OK; } @@ -1415,15 +2107,16 @@ int setPhase(enum CLKINDEX ind, int val, int degrees) { char *clock_names[] = {CLK_NAMES}; LOG(logINFO, ("Setting %s clock (%d) phase to %d %s\n", clock_names[ind], ind, val, degrees == 0 ? "" : "degrees")); - int maxShift = getMaxPhase(ind); + int maxShift = MAX_PHASE_SHIFTS; // validation if (degrees && (val < 0 || val > 359)) { - LOG(logERROR, ("\tPhase outside limits (0 - 359°C)\n")); + LOG(logERROR, ("\tPhase provided outside limits (0 - 359°C)\n")); return FAIL; } - if (!degrees && (val < 0 || val > maxShift - 1)) { + if (!degrees && (val < 0 || val > MAX_PHASE_SHIFTS - 1)) { LOG(logERROR, - ("\tPhase outside limits (0 - %d phase shifts)\n", maxShift - 1)); + ("\tPhase provided outside limits (0 - %d phase shifts)\n", + maxShift - 1)); return FAIL; } @@ -1440,7 +2133,7 @@ int setPhase(enum CLKINDEX ind, int val, int degrees) { // same phase if (!relativePhase) { - LOG(logINFO, ("\tNothing to do in Phase Shift\n")); + LOG(logINFO, ("Nothing to do in Phase Shift\n")); return OK; } LOG(logINFOBLUE, ("Configuring Phase\n")); @@ -1454,9 +2147,12 @@ int setPhase(enum CLKINDEX ind, int val, int degrees) { LOG(logDEBUG1, ("[Single Direction] Phase:%d (0x%x). Max Phase shifts:%d\n", phase, phase, maxShift)); - ALTERA_PLL_SetPhaseShift(phase, (int)ind, 0); + ALTERA_PLL_SetPhaseShift( + phase, (ind == ADC_CLK ? ADC_CLK_INDEX : DBIT_CLK_INDEX), 0); clkPhase[ind] = valShift; + + alignDeserializer(); return OK; } @@ -1469,7 +2165,7 @@ int getPhase(enum CLKINDEX ind, int degrees) { return clkPhase[ind]; // convert back to degrees int val = 0; - ConvertToDifferentRange(0, getMaxPhase(ind) - 1, 0, 359, clkPhase[ind], + ConvertToDifferentRange(0, MAX_PHASE_SHIFTS - 1, 0, 359, clkPhase[ind], &val); return val; } @@ -1479,15 +2175,7 @@ int getMaxPhase(enum CLKINDEX ind) { LOG(logERROR, ("Unknown clock index %d to get max phase\n", ind)); return -1; } - int ret = ((double)PLL_VCO_FREQ_MHZ / (double)clkFrequency[ind]) * - MAX_PHASE_SHIFTS_STEPS; - - char *clock_names[] = {CLK_NAMES}; - LOG(logDEBUG1, - ("Max Phase Shift (%s): %d (Clock: %d MHz, VCO:%d MHz)\n", - clock_names[ind], ret, clkFrequency[ind], PLL_VCO_FREQ_MHZ)); - - return ret; + return MAX_PHASE_SHIFTS; } int validatePhaseinDegrees(enum CLKINDEX ind, int val, int retval) { @@ -1499,8 +2187,8 @@ int validatePhaseinDegrees(enum CLKINDEX ind, int val, int retval) { if (val == -1) { return OK; } - LOG(logDEBUG1, ("validating phase in degrees for clk %d\n", ind)); - int maxShift = getMaxPhase(ind); + LOG(logDEBUG1, ("validating phase in degrees\n")); + int maxShift = MAX_PHASE_SHIFTS; // convert degrees to shift int valShift = 0; ConvertToDifferentRange(0, 359, 0, maxShift - 1, val, &valShift); @@ -1512,132 +2200,358 @@ int validatePhaseinDegrees(enum CLKINDEX ind, int val, int retval) { return FAIL; } -int setFrequency(enum CLKINDEX ind, int val) { - if (ind < 0 || ind >= NUM_CLOCKS) { - LOG(logERROR, ("Unknown clock index %d to set frequency\n", ind)); - return FAIL; - } - if (val <= 0) { - return FAIL; - } - char *clock_names[] = {CLK_NAMES}; - LOG(logINFOBLUE, ("Setting %s clock (%d) frequency to %d MHz\n", - clock_names[ind], ind, val)); +int setThresholdTemperature(int val) { - // check adc clk too high - if (ind == ADC_CLK && val > MAXIMUM_ADC_CLK) { - LOG(logERROR, ("Frequency %d MHz too high for ADC\n", val)); - return FAIL; + if (val >= 0) { + LOG(logINFO, ("Setting Threshold Temperature: %f °C\n", val / 1000.00)); + val *= (10.0 / 625.0); + LOG(logDEBUG1, ("Converted Threshold Temperature: %d\n", val)); + bus_w(TEMP_CTRL_REG, + (bus_r(TEMP_CTRL_REG) & ~(TEMP_CTRL_PROTCT_THRSHLD_MSK) & + ~(TEMP_CTRL_OVR_TMP_EVNT_MSK)) | + (((val << TEMP_CTRL_PROTCT_THRSHLD_OFST) & + TEMP_CTRL_PROTCT_THRSHLD_MSK))); + LOG(logDEBUG1, + ("Converted Threshold Temperature set to %d\n", + ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_THRSHLD_MSK) >> + TEMP_CTRL_PROTCT_THRSHLD_OFST))); + } + uint32_t temp = ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_THRSHLD_MSK) >> + TEMP_CTRL_PROTCT_THRSHLD_OFST); + + // conversion + temp = (temp * (625.0 / 10.0)); + + double ftemp = (double)temp / 1000.00; + LOG(logDEBUG1, ("Threshold Temperature read %f °C\n", ftemp)); + + return temp; +} + +int setTemperatureControl(int val) { + if (val >= 0) { + // binary value + if (val > 0) + val = 1; + LOG(logINFO, ("Setting Temperature control: %d\n", val)); + bus_w(TEMP_CTRL_REG, + (bus_r(TEMP_CTRL_REG) & ~(TEMP_CTRL_PROTCT_ENABLE_MSK) & + ~(TEMP_CTRL_OVR_TMP_EVNT_MSK)) | + (((val << TEMP_CTRL_PROTCT_ENABLE_OFST) & + TEMP_CTRL_PROTCT_ENABLE_MSK))); + LOG(logDEBUG1, ("Temperature control read: %d\n", + ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_ENABLE_MSK) >> + TEMP_CTRL_PROTCT_ENABLE_OFST))); + } + return ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_ENABLE_MSK) >> + TEMP_CTRL_PROTCT_ENABLE_OFST); +} + +int setTemperatureEvent(int val) { +#ifdef VIRTUAL + return 0; +#endif + if (val >= 0) { + // set bit to clear it + val = 1; + LOG(logINFO, ("Setting Temperature Event (clearing): %d\n", val)); + bus_w(TEMP_CTRL_REG, + (bus_r(TEMP_CTRL_REG) & ~TEMP_CTRL_OVR_TMP_EVNT_MSK) | + (((val << TEMP_CTRL_OVR_TMP_EVNT_OFST) & + TEMP_CTRL_OVR_TMP_EVNT_MSK))); + LOG(logDEBUG1, ("Temperature Event read %d\n", + ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_OVR_TMP_EVNT_MSK) >> + TEMP_CTRL_OVR_TMP_EVNT_OFST))); + } + return ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_OVR_TMP_EVNT_MSK) >> + TEMP_CTRL_OVR_TMP_EVNT_OFST); +} + +void alignDeserializer() { + // refresh alignment + bus_w(ADC_DSRLZR_0_REG, + bus_r(ADC_DSRLZR_0_REG) | ADC_DSRLZR_0_RFRSH_ALGNMNT_MSK); + bus_w(ADC_DSRLZR_1_REG, + bus_r(ADC_DSRLZR_1_REG) | ADC_DSRLZR_1_RFRSH_ALGNMNT_MSK); + bus_w(ADC_DSRLZR_2_REG, + bus_r(ADC_DSRLZR_2_REG) | ADC_DSRLZR_2_RFRSH_ALGNMNT_MSK); + bus_w(ADC_DSRLZR_3_REG, + bus_r(ADC_DSRLZR_3_REG) | ADC_DSRLZR_3_RFRSH_ALGNMNT_MSK); + + usleep(1 * 1000 * 1000); + + // disable the refresh + bus_w(ADC_DSRLZR_0_REG, + bus_r(ADC_DSRLZR_0_REG) & (~(ADC_DSRLZR_0_RFRSH_ALGNMNT_MSK))); + bus_w(ADC_DSRLZR_1_REG, + bus_r(ADC_DSRLZR_1_REG) & (~(ADC_DSRLZR_1_RFRSH_ALGNMNT_MSK))); + bus_w(ADC_DSRLZR_2_REG, + bus_r(ADC_DSRLZR_2_REG) & (~(ADC_DSRLZR_2_RFRSH_ALGNMNT_MSK))); + bus_w(ADC_DSRLZR_3_REG, + bus_r(ADC_DSRLZR_3_REG) & (~(ADC_DSRLZR_3_RFRSH_ALGNMNT_MSK))); +} + +int getFlipRows() { + return ((bus_r(CONFIG_REG) & CONFIG_BOTTOM_INVERT_STREAM_MSK) >> + CONFIG_BOTTOM_INVERT_STREAM_OFST); +} + +void setFlipRows(int arg) { + if (isHardwareVersion_1_0()) { + LOG(logERROR, ("Could not set flip rows. Only available for " + "Hardware Board version 2.0.\n")); + return; + } + if (arg >= 0) { + if (arg == 0) { + LOG(logINFO, ("Switching off bottom row flipping\n")); + bus_w(CONFIG_REG, + bus_r(CONFIG_REG) & ~CONFIG_BOTTOM_INVERT_STREAM_MSK); + } else { + LOG(logINFO, ("Switching on bottom row flipping\n")); + bus_w(CONFIG_REG, + bus_r(CONFIG_REG) | CONFIG_BOTTOM_INVERT_STREAM_MSK); + } + } +} + +int getFilterResistor() { +#ifdef VIRTUAL + uint32_t addr = CONFIG_V11_REG; +#else + uint32_t addr = CONFIG_V11_STATUS_REG; +#endif + // return 0 for lower value, 1 for higher value + if (bus_r(addr) & CONFIG_V11_STATUS_FLTR_RSSTR_SMLR_MSK) { + return 0; + } + return 1; +} + +int setFilterResistor(int value) { + // lower resistor + if (value == 0) { + LOG(logINFO, ("Setting Lower Filter Resistor\n")); + bus_w(CONFIG_V11_REG, + bus_r(CONFIG_V11_REG) | CONFIG_V11_FLTR_RSSTR_SMLR_MSK); + return OK; + } + // higher resistor + else if (value == 1) { + LOG(logINFO, ("Setting Higher Filter Resistor\n")); + bus_w(CONFIG_V11_REG, + bus_r(CONFIG_V11_REG) & ~CONFIG_V11_FLTR_RSSTR_SMLR_MSK); + return OK; + } + LOG(logERROR, ("Could not set Filter Resistor. Invalid value %d\n", value)); + return FAIL; +} + +int getNumberOfFilterCells() { +#ifdef VIRTUAL + uint32_t addr = CONFIG_V11_REG; +#else + uint32_t addr = CONFIG_V11_STATUS_REG; +#endif + uint32_t regval = bus_r(addr); +#ifndef VIRTUAL + // flip all contents of register //TODO FIRMWARE FIX + regval ^= BIT32_MASK; +#endif + uint32_t retval = + (regval & CONFIG_V11_FLTR_CLL_MSK) >> CONFIG_V11_FLTR_CLL_OFST; + // count number of bits = which icell + return (__builtin_popcount(retval)); +} + +void setNumberOfFilterCells(int iCell) { + if (iCell > MAX_FILTER_CELL_VAL) { + return; } - // Remembering adcphase/ dbit phase in degrees - int adcPhase = getPhase(ADC_CLK, 1); - LOG(logDEBUG1, ("\tRemembering ADC phase: %d degrees\n", adcPhase)); - int dbitPhase = getPhase(DBIT_CLK, 1); - LOG(logDEBUG1, ("\tRemembering DBIT phase: %d degrees\n", dbitPhase)); + uint32_t addr = CONFIG_V11_REG; + bus_w(addr, bus_r(addr) & ~CONFIG_V11_FLTR_CLL_MSK); - // Calculate and set output frequency - clkFrequency[ind] = - ALTERA_PLL_SetOuputFrequency(ind, PLL_VCO_FREQ_MHZ, val); - LOG(logINFO, ("\t%s clock (%d) frequency set to %d MHz\n", clock_names[ind], - ind, clkFrequency[ind])); + if (iCell > 0) { + // enables as many cells + uint32_t value = 0; + for (int i = 0; i != iCell; ++i) { + value |= (1 << i); + } + bus_w(addr, bus_r(addr) | ((value << CONFIG_V11_FLTR_CLL_OFST) & + CONFIG_V11_FLTR_CLL_MSK)); + } + LOG(logINFO, ("Setting Number of Filter Cells to %d [Reg:0x%x]\n", iCell, + bus_r(addr))); +} - // phase reset by pll (when setting output frequency) - clkPhase[ADC_CLK] = 0; - clkPhase[DBIT_CLK] = 0; +void disableCurrentSource() { + LOG(logINFO, ("Disabling Current Source\n")); - // set the phase (reset by pll) - LOG(logINFO, ("\tCorrecting ADC phase to %d degrees\n", adcPhase)); - setPhase(ADC_CLK, adcPhase, 1); - LOG(logINFO, ("\tCorrecting DBIT phase to %d degrees\n", dbitPhase)); - setPhase(DBIT_CLK, dbitPhase, 1); + // set default values for current source first + if (getChipVersion() == 11) { + LOG(logINFO, ("\tSetting default values for selection\n")) + bus_w(CRRNT_SRC_COL_LSB_REG, BIT32_MASK); + bus_w(CRRNT_SRC_COL_MSB_REG, BIT32_MASK); + } - // required to reconfigure as adc clock is stopped temporarily when - // resetting pll (in changing output frequency) - AD9257_Configure(); + bus_w(DAQ_REG, bus_r(DAQ_REG) & ~DAQ_CRRNT_SRC_ENBL_MSK); + LOG(logINFO, ("\tCurrent Source disabled\n")); - if (ind != SYNC_CLK) { - configureSyncFrequency(ind); + configureChip(); +} + +void enableCurrentSource(int fix, uint64_t select, int normal) { + disableCurrentSource(); + + if (getChipVersion() == 11) { + LOG(logINFO, ("Enabling current source [fix:%d, select:0x%lx]\n", fix, + (long unsigned int)select)); + } else { + LOG(logINFO, + ("Enabling current source [fix:%d, select:%ld, normal:%d]\n", fix, + (long int)select, normal)); + } + // fix + if (fix) { + LOG(logINFO, ("\tEnabling fix\n")); + bus_w(DAQ_REG, bus_r(DAQ_REG) | DAQ_CRRNT_SRC_CLMN_FIX_MSK); + } else { + LOG(logINFO, ("\tDisabling fix\n")); + bus_w(DAQ_REG, bus_r(DAQ_REG) & ~DAQ_CRRNT_SRC_CLMN_FIX_MSK); + } + if (getChipVersion() == 10) { + // select + LOG(logINFO, ("\tSetting selection to %ld\n", (long int)select)); + bus_w(DAQ_REG, bus_r(DAQ_REG) & ~DAQ_CRRNT_SRC_CLMN_SLCT_MSK); + bus_w(DAQ_REG, + bus_r(DAQ_REG) | ((select << DAQ_CRRNT_SRC_CLMN_SLCT_OFST) & + DAQ_CRRNT_SRC_CLMN_SLCT_MSK)); + + } else { + // select + // invert select first + uint64_t tmp = select; + uint64_t inverted = 0; + for (int i = 0; i != 64; ++i) { + // get each bit from LSB side + uint64_t bit = (tmp >> i) & 0x1; + // push the bit into MSB side + inverted |= (bit << (63 - i)); + } + LOG(logINFO, ("\tSetting selection to 0x%lx (inverted from 0x%lx)\n", + (long unsigned int)inverted, (long unsigned int)select)); + set64BitReg(inverted, CRRNT_SRC_COL_LSB_REG, CRRNT_SRC_COL_MSB_REG); + + // normal + if (normal) { + LOG(logINFO, ("\tEnabling normal\n")) + bus_w(CONFIG_V11_REG, + bus_r(CONFIG_V11_REG) & ~CONFIG_V11_CRRNT_SRC_LOW_MSK); + } else { + LOG(logINFO, ("\tEnabling low\n")) + bus_w(CONFIG_V11_REG, + bus_r(CONFIG_V11_REG) | CONFIG_V11_CRRNT_SRC_LOW_MSK); + } + } + // validating before enabling current source + if (getFixCurrentSource() != fix || getSelectCurrentSource() != select) { + LOG(logERROR, + ("Could not set fix or select parameters for current source.\n")) + return; + } + // not validating normal because the status register might not update during + // acquisition + + // enabling current source + LOG(logINFO, ("\tEnabling Current Source\n")); + bus_w(DAQ_REG, bus_r(DAQ_REG) | DAQ_CRRNT_SRC_ENBL_MSK); + + configureChip(); +} + +int getCurrentSource() { + return ((bus_r(DAQ_REG) & DAQ_CRRNT_SRC_ENBL_MSK) >> + DAQ_CRRNT_SRC_ENBL_OFST); +} + +int getFixCurrentSource() { + return ((bus_r(DAQ_REG) & DAQ_CRRNT_SRC_CLMN_FIX_MSK) >> + DAQ_CRRNT_SRC_CLMN_FIX_OFST); +} + +int getNormalCurrentSource() { + if (getChipVersion() == 11) { + int low = ((bus_r(CONFIG_V11_STATUS_REG) & + CONFIG_V11_STATUS_CRRNT_SRC_LOW_MSK) >> + CONFIG_V11_STATUS_CRRNT_SRC_LOW_OFST); + return (low == 0 ? 1 : 0); + } + return -1; +} + +uint64_t getSelectCurrentSource() { + if (getChipVersion() == 10) { + return ((bus_r(DAQ_REG) & DAQ_CRRNT_SRC_CLMN_SLCT_MSK) >> + DAQ_CRRNT_SRC_CLMN_SLCT_OFST); + } else { + // invert the select + uint64_t retval = + get64BitReg(CRRNT_SRC_COL_LSB_REG, CRRNT_SRC_COL_MSB_REG); + + uint64_t tmp = retval; + uint64_t inverted = 0; + for (int i = 0; i != 64; ++i) { + // get each bit from LSB side + uint64_t bit = (tmp >> i) & 0x1; + // push the bit into MSB side + inverted |= (bit << (63 - i)); + } + return inverted; + } +} + +int getTenGigaFlowControl() { + return ((bus_r(CONFIG_REG) & CONFIG_ETHRNT_FLW_CNTRL_MSK) >> + CONFIG_ETHRNT_FLW_CNTRL_OFST); +} + +int setTenGigaFlowControl(int value) { + if (value >= 0) { + if (value == 0) { + LOG(logINFO, ("Switching off 10G flow control\n")); + bus_w(CONFIG_REG, bus_r(CONFIG_REG) & ~CONFIG_ETHRNT_FLW_CNTRL_MSK); + } else { + LOG(logINFO, ("Switching on 10G flow control\n")); + bus_w(CONFIG_REG, bus_r(CONFIG_REG) | CONFIG_ETHRNT_FLW_CNTRL_MSK); + } } return OK; } -int getFrequency(enum CLKINDEX ind) { - if (ind < 0 || ind >= NUM_CLOCKS) { - LOG(logERROR, ("Unknown clock index %d to get frequency\n", ind)); - return -1; - } - return clkFrequency[ind]; +int getTransmissionDelayFrame() { + return ((bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK) >> + CONFIG_TDMA_TIMESLOT_OFST); } -void configureSyncFrequency(enum CLKINDEX ind) { - char *clock_names[] = {CLK_NAMES}; - int clka = 0, clkb = 0; - switch (ind) { - case ADC_CLK: - clka = DBIT_CLK; - clkb = RUN_CLK; - break; - case DBIT_CLK: - clka = ADC_CLK; - clkb = RUN_CLK; - break; - case RUN_CLK: - clka = DBIT_CLK; - clkb = ADC_CLK; - break; - default: - LOG(logERROR, - ("Unknown clock index %d to configure sync frequcny\n", ind)); - return; +int setTransmissionDelayFrame(int value) { + if (value >= 0) { + LOG(logINFO, ("Setting transmission delay: %d\n", value)); + bus_w(CONFIG_REG, (bus_r(CONFIG_REG) & ~CONFIG_TDMA_TIMESLOT_MSK) | + (((value << CONFIG_TDMA_TIMESLOT_OFST) & + CONFIG_TDMA_TIMESLOT_MSK))); + if (value == 0) { + LOG(logINFO, ("Switching off transmission delay\n")); + bus_w(CONFIG_REG, bus_r(CONFIG_REG) & ~CONFIG_TDMA_ENABLE_MSK); + } else { + LOG(logINFO, ("Switching on transmission delay\n")); + bus_w(CONFIG_REG, bus_r(CONFIG_REG) | CONFIG_TDMA_ENABLE_MSK); + } + LOG(logDEBUG1, ("Transmission delay read %d\n", + ((bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK) >> + CONFIG_TDMA_TIMESLOT_OFST))); } - - int syncFreq = getFrequency(SYNC_CLK); - int retval = getFrequency(ind); - int aFreq = getFrequency(clka); - int bFreq = getFrequency(clkb); - LOG(logDEBUG1, - ("Sync Frequncy:%d, RetvalFreq(%s):%d, aFreq(%s):%d, bFreq(%s):%d\n", - syncFreq, clock_names[ind], retval, clock_names[clka], aFreq, - clock_names[clkb], bFreq)); - - int configure = 0; - - // find the smallest frequency - int min = (aFreq < bFreq) ? aFreq : bFreq; - min = (retval < min) ? retval : min; - - // sync is greater than min - if (syncFreq > retval) { - LOG(logINFO, ("\t--Configuring Sync Clock\n")); - configure = 1; - } - - // sync is smaller than min - else if (syncFreq < min) { - LOG(logINFO, ("\t++Configuring Sync Clock\n")); - configure = 1; - } - - // configure sync to current - if (configure) - setFrequency(SYNC_CLK, min); -} - -void setADCPipeline(int val) { - if (val < 0) { - return; - } - LOG(logINFO, ("Setting adc pipeline to %d\n", val)); - uint32_t addr = ADC_OFFSET_REG; - bus_w(addr, bus_r(addr) & ~ADC_OFFSET_ADC_PPLN_MSK); - bus_w(addr, bus_r(addr) | ((val << ADC_OFFSET_ADC_PPLN_OFST) & - ADC_OFFSET_ADC_PPLN_MSK)); -} - -int getADCPipeline() { - return ((bus_r(ADC_OFFSET_REG) & ADC_OFFSET_ADC_PPLN_MSK) >> - ADC_OFFSET_ADC_PPLN_OFST); + return OK; } /* aquisition */ @@ -1648,7 +2562,10 @@ int startStateMachine() { if (createUDPSocket(0) != OK) { return FAIL; } - LOG(logINFOBLUE, ("Starting State Machine\n")); + if (getNumberofUDPInterfaces() == 2 && createUDPSocket(1) != OK) { + return FAIL; + } + LOG(logINFOBLUE, ("starting state machine\n")); if (sharedMemory_getStop() != 0) { LOG(logERROR, ("Cant start acquisition. " "Stop server has not updated stop status to 0\n")); @@ -1663,30 +2580,13 @@ int startStateMachine() { LOG(logINFOGREEN, ("Virtual Acquisition started\n")); return OK; #endif - int send_to_10g = enableTenGigabitEthernet(-1); - // 1 giga udp - if (send_to_10g == 0) { - // create udp socket - if (createUDPSocket(0) != OK) { - return FAIL; - } - // update header with modId, detType and version. Reset offset and fnum - createUDPPacketHeader(udpPacketData, getHardwareSerialNumber()); - } - LOG(logINFOBLUE, ("Starting State Machine\n")); + cleanFifos(); - if (send_to_10g == 0) { - unsetFifoReadStrobes(); // FIXME: unnecessary to write bus_w(dumm, 0) as - // it is 0 in the beginnig and the strobes are - // always unset if set - } // start state machine - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_ACQSTN_MSK | - CONTROL_STRT_EXPSR_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STRT_ACQSTN_MSK & - ~CONTROL_STRT_EXPSR_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_START_ACQ_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_START_ACQ_MSK); LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG))); return OK; @@ -1697,77 +2597,170 @@ void *start_timer(void *arg) { if (!isControlServer) { return NULL; } - + int firstDest = getFirstUDPDestination(); + int transmissionDelayUs = getTransmissionDelayFrame() * 1000; + int numInterfaces = getNumberofUDPInterfaces(); int64_t periodNs = getPeriod(); - int numFrames = (getNumFrames() * getNumTriggers()); - int64_t expNs = getExpTime(); + int numFrames = (getNumFrames() * getNumTriggers() * + (getNumAdditionalStorageCells() + 1)); + int64_t expUs = getExpTime() / 1000; + const int maxPacketsPerFrame = (MAX_ROWS_PER_READOUT / ROWS_PER_PACKET); + const int dataSize = (DATA_BYTES / maxPacketsPerFrame); + const int packetsize = dataSize + sizeof(sls_detector_header); + const int maxRows = MAX_ROWS_PER_READOUT; + int readNRows = getReadNRows(); + if (readNRows == -1) { + LOG(logERROR, + ("number of rows is -1. Assuming no partial readout (#rows).\n")); + readNRows = MAX_ROWS_PER_READOUT; + } + const int packetsPerFrame = + ((maxPacketsPerFrame / 2) * readNRows) / (maxRows / 2); - int imageSize = dataBytes; - int dataSize = UDP_PACKET_DATA_BYTES; - int packetSize = sizeof(sls_detector_header) + dataSize; - int packetsPerFrame = ceil((double)imageSize / (double)dataSize); + // Generate data + char imageData[DATA_BYTES]; + memset(imageData, 0, DATA_BYTES); + { + const int npixels = (NCHAN * NCHIP); + const int pixelsPerPacket = dataSize / NUM_BYTES_PER_PIXEL; + int dataVal = 0; + int gainVal = 0; + int pixelVal = 0; + for (int i = 0; i < npixels; ++i) { + if (i % pixelsPerPacket == 0) { + ++dataVal; + } + if ((i % 400) < 100) { + gainVal = 1; + } else if ((i % 400) < 300) { + gainVal = 2; + } else { + gainVal = 3; + } + pixelVal = (dataVal & ~GAIN_VAL_MSK) | (gainVal << GAIN_VAL_OFST); +// to debug multi module geometry (row, column) in virtual servers (all pixels +// in a module set to particular value) +#ifdef TEST_MOD_GEOMETRY + *((uint16_t *)(imageData + i * sizeof(uint16_t))) = + portno % 1900 + (i >= npixels / 2 ? 1 : 0); +#else + *((uint16_t *)(imageData + i * sizeof(uint16_t))) = + virtual_image_test_mode ? 0x0FFE : (uint16_t)pixelVal; - // Generate Data - char imageData[imageSize]; - memset(imageData, 0, imageSize); - for (int i = 0; i < imageSize; i += sizeof(uint16_t)) { - *((uint16_t *)(imageData + i)) = i; +#endif + } } // Send data - uint64_t frameNr = 0; - getNextFrameNumber(&frameNr); - // loop over number of frames - for (int iframes = 0; iframes != numFrames; ++iframes) { + { + uint64_t frameNr = 0; + getNextFrameNumber(&frameNr); + int iRxEntry = firstDest; + for (int iframes = 0; iframes != numFrames; ++iframes) { + usleep(transmissionDelayUs); - // check if manual stop - if (sharedMemory_getStop() == 1) { - setNextFrameNumber(frameNr + iframes + 1); - break; - } + // check if manual stop + if (sharedMemory_getStop() == 1) { + setNextFrameNumber(frameNr + iframes + 1); + break; + } - // sleep for exposure time - struct timespec begin, end; - clock_gettime(CLOCK_REALTIME, &begin); - usleep(expNs / 1000); + // sleep for exposure time + struct timespec begin, end; + clock_gettime(CLOCK_REALTIME, &begin); + usleep(expUs); - int srcOffset = 0; - // loop packet - for (int i = 0; i != packetsPerFrame; ++i) { - // set header - char packetData[packetSize]; - memset(packetData, 0, packetSize); - sls_detector_header *header = (sls_detector_header *)(packetData); - header->detType = (uint16_t)myDetectorType; - header->version = SLS_DETECTOR_HEADER_VERSION; - header->frameNumber = frameNr + iframes; - header->packetNumber = i; - header->modId = 0; - header->row = detPos[Y]; - header->column = detPos[X]; + int srcOffset = 0; + int srcOffset2 = DATA_BYTES / 2; + int row0 = (numInterfaces == 1 ? detPos[1] : detPos[3]); + int col0 = (numInterfaces == 1 ? detPos[0] : detPos[2]); + int row1 = detPos[1]; + int col1 = detPos[0]; + // loop packet (50 packets) + for (int i = 0; i != maxPacketsPerFrame; ++i) { - // fill data - memcpy(packetData + sizeof(sls_detector_header), - imageData + srcOffset, dataSize); - srcOffset += dataSize; + const int startval = + (maxPacketsPerFrame / 2) - (packetsPerFrame / 2); + const int endval = startval + packetsPerFrame - 1; + int pnum = i; - sendUDPPacket(0, 0, packetData, packetSize); - } - LOG(logINFO, ("Sent frame: %d [%lld]\n", iframes, frameNr + iframes)); - clock_gettime(CLOCK_REALTIME, &end); - int64_t timeNs = - ((end.tv_sec - begin.tv_sec) * 1E9 + (end.tv_nsec - begin.tv_nsec)); + // first interface + if (numInterfaces == 1 || i < (maxPacketsPerFrame / 2)) { + char packetData[packetsize]; + memset(packetData, 0, packetsize); + sls_detector_header *header = + (sls_detector_header *)(packetData); + header->detType = (uint16_t)myDetectorType; + header->version = SLS_DETECTOR_HEADER_VERSION; + header->frameNumber = frameNr + iframes; + header->packetNumber = pnum; + header->modId = virtual_moduleid; + header->row = row0; + header->column = col0; - // sleep for (period - exptime) - if (iframes < numFrames) { // if there is a next frame - if (periodNs > timeNs) { - usleep((periodNs - timeNs) / 1000); + // fill data + memcpy(packetData + sizeof(sls_detector_header), + imageData + srcOffset, dataSize); + srcOffset += dataSize; + + if (i >= startval && i <= endval) { + sendUDPPacket(iRxEntry, 0, packetData, packetsize); + LOG(logDEBUG1, ("Sent packet: %d [interface 0]\n", i)); + } + } + + // second interface + else if (numInterfaces == 2 && i >= (maxPacketsPerFrame / 2)) { + pnum = i % (maxPacketsPerFrame / 2); + + char packetData2[packetsize]; + memset(packetData2, 0, packetsize); + sls_detector_header *header = + (sls_detector_header *)(packetData2); + header->detType = (uint16_t)myDetectorType; + header->version = SLS_DETECTOR_HEADER_VERSION; + header->frameNumber = frameNr + iframes; + header->packetNumber = pnum; + header->modId = virtual_moduleid; + header->row = row1; + header->column = col1; + + // fill data + memcpy(packetData2 + sizeof(sls_detector_header), + imageData + srcOffset2, dataSize); + srcOffset2 += dataSize; + + if (i >= startval && i <= endval) { + sendUDPPacket(iRxEntry, 1, packetData2, packetsize); + LOG(logDEBUG1, + ("Sent packet: %d [interface 1]\n", pnum)); + } + } + } + LOG(logINFO, ("Sent frame %d [#%ld] to E%d\n", iframes, + frameNr + iframes, iRxEntry)); + clock_gettime(CLOCK_REALTIME, &end); + int64_t timeNs = ((end.tv_sec - begin.tv_sec) * 1E9 + + (end.tv_nsec - begin.tv_nsec)); + + // sleep for (period - exptime) + if (iframes < numFrames) { // if there is a next frame + if (periodNs > timeNs) { + usleep((periodNs - timeNs) / 1000); + } + } + ++iRxEntry; + if (iRxEntry == numUdpDestinations) { + iRxEntry = 0; } } setNextFrameNumber(frameNr + numFrames); } closeUDPSocket(0); + if (numInterfaces == 2) { + closeUDPSocket(1); + } sharedMemory_setStatus(IDLE); LOG(logINFOBLUE, ("Transmitting frames done\n")); @@ -1791,11 +2784,37 @@ int stopStateMachine() { return OK; #endif // stop state machine - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STP_ACQSTN_MSK); - usleep(WAIT_TIME_US_STP_ACQ); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STP_ACQSTN_MSK); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STOP_ACQ_MSK); + usleep(100); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STOP_ACQ_MSK); LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG))); + return OK; +} + +int softwareTrigger(int block) { +#ifndef VIRTUAL + // ready for trigger + if (getRunStatus() != WAITING) { + LOG(logWARNING, ("Not yet ready for trigger!\n")); + return 0; + } +#endif + + LOG(logINFO, ("Sending Software Trigger\n")); + bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_SOFTWARE_TRIGGER_MSK); + +#ifndef VIRTUAL + // block till frame is sent out + if (block) { + enum runStatus s = getRunStatus(); + while (s == RUNNING || s == TRANSMITTING) { + usleep(5000); + s = getRunStatus(); + } + } + LOG(logINFO, ("Ready for Next Trigger...\n")); +#endif return OK; } @@ -1820,76 +2839,40 @@ enum runStatus getRunStatus() { return IDLE; #endif - uint32_t retval = bus_r(STATUS_REG); + enum runStatus s; + u_int32_t retval = bus_r(STATUS_REG); LOG(logINFO, ("Status Register: %08x\n", retval)); - // error - // if (retval & STATUS_SM_FF_FLL_MSK) { This bit is high when a analog fifo - // is full Or when external stop - if (retval & STATUS_ANY_FF_FLL_MSK) { // if adc or digital fifo is full - LOG(logINFORED, ("Status: Error (Any fifo full)\n")); - return ERROR; - } - // running - if (retval & STATUS_RN_BSY_MSK) { - if (retval & STATUS_WTNG_FR_TRGGR_MSK) { - LOG(logINFOBLUE, ("Status: Waiting for Trigger\n")); - return WAITING; + if (retval & RUN_BUSY_MSK) { + if (retval & WAITING_FOR_TRIGGER_MSK) { + LOG(logINFOBLUE, ("Status: WAITING\n")); + s = WAITING; + } else { + LOG(logINFOBLUE, ("Status: RUNNING\n")); + s = RUNNING; } - - LOG(logINFOBLUE, ("Status: Running\n")); - return RUNNING; - } // not running else { - if (retval & STATUS_STPPD_MSK) { - LOG(logINFOBLUE, ("Status: Stopped\n")); - return STOPPED; - } - - if (retval & STATUS_FRM_RN_BSY_MSK) { - LOG(logINFOBLUE, ("Status: Transmitting (Read machine busy)\n")); - return TRANSMITTING; - } - - if (!(retval & STATUS_IDLE_MSK)) { - LOG(logINFOBLUE, ("Status: Idle\n")); - return IDLE; - } - - LOG(logERROR, ("Status: Unknown status %08x\n", retval)); - return ERROR; - } -} - -void readandSendUDPFrames(int *ret, char *mess) { - LOG(logDEBUG1, ("Reading from 1G UDP\n")); - - // validate udp socket - if (getUdPSocketDescriptor(0, 0) <= 0) { - *ret = FAIL; - sprintf(mess, "UDP Socket not created. sockfd:%d\n", - getUdPSocketDescriptor(0, 0)); - LOG(logERROR, (mess)); - return; - } - - // every frame read - while (readFrameFromFifo() == OK) { - int bytesToSend = 0, n = 0; - while ((bytesToSend = fillUDPPacket(udpPacketData))) { - n += sendUDPPacket(0, 0, udpPacketData, bytesToSend); - } - if (n >= dataBytes) { - LOG(logINFO, (" Frame %lld sent (%d packets, %d databytes, n:%d " - "bytes sent)\n", - udpFrameNumber, udpPacketNumber + 1, dataBytes, n)); + // stopped or error + if (retval & STOPPED_MSK) { + LOG(logINFOBLUE, ("Status: STOPPED\n")); + s = STOPPED; + } else if (retval & RUNMACHINE_BUSY_MSK) { + LOG(logINFOBLUE, ("Status: READ MACHINE BUSY\n")); + s = TRANSMITTING; + } else if (!retval) { + LOG(logINFOBLUE, ("Status: IDLE\n")); + s = IDLE; + } else { + LOG(logERROR, ("Status: Unknown status %08x\n", retval)); + s = ERROR; } } - closeUDPSocket(0); + + return s; } void waitForAcquisitionEnd() { @@ -1905,171 +2888,22 @@ void waitForAcquisitionEnd() { LOG(logINFOGREEN, ("Blocking Acquisition done\n")); } -void readFrames(int *ret, char *mess) { -#ifdef VIRTUAL - while (runBusy()) { - usleep(500); - } -#else - // 1G force reading of frames - if (!enableTenGigabitEthernet(-1)) { - readandSendUDPFrames(ret, mess); - LOG(logINFOBLUE, ("Transmitting frames done\n")); - } -#endif -} - -void unsetFifoReadStrobes() { - bus_w(DUMMY_REG, bus_r(DUMMY_REG) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK) & - (~DUMMY_DGTL_FIFO_RD_STRBE_MSK)); -} - -void readSample(int ns) { - uint32_t addr = DUMMY_REG; - - // read adcs - if (ns < nSamples) { - - uint32_t fifoAddr = FIFO_DATA_REG; - - // read strobe to all analog fifos - bus_w(addr, bus_r(addr) | DUMMY_ANLG_FIFO_RD_STRBE_MSK); - bus_w(addr, bus_r(addr) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK)); - - // wait for 1 us to latch different clocks of read and read strobe - for (int i = 0; i < WAIT_TIME_1US_FOR_LOOP_CNT; ++i) - ; - - if (!(ns % 1000)) { - LOG(logDEBUG1, ("Reading sample ns:%d of %d AEmtpy:0x%x AFull:0x%x " - "Status:0x%x\n", - ns, nSamples, bus_r(FIFO_EMPTY_REG), - bus_r(FIFO_FULL_REG), bus_r(STATUS_REG))); - } - - // loop through all channels - for (int ich = 0; ich < NCHAN; ++ich) { - - // if channel is in enable mask - if ((1 << ich) & (adcEnableMask_1g)) { - - // unselect channel - bus_w(addr, bus_r(addr) & ~(DUMMY_FIFO_CHNNL_SLCT_MSK)); - - // select channel - bus_w(addr, bus_r(addr) | ((ich << DUMMY_FIFO_CHNNL_SLCT_OFST) & - DUMMY_FIFO_CHNNL_SLCT_MSK)); - - // read fifo and write it to current position of data pointer - *((uint16_t *)analogDataPtr) = bus_r16(fifoAddr); - - // keep reading till the value is the same - /* while (*((uint16_t*)analogDataPtr) != bus_r16(fifoAddr)) { - LOG(logDEBUG1, ("%d ", ich)); - *((uint16_t*)analogDataPtr) = bus_r16(fifoAddr); - }*/ - - // increment pointer to data out destination - analogDataPtr += 2; - } - } - } -} - -uint32_t checkDataInFifo() { - uint32_t dataPresent = 0; - uint32_t fifoEmpty = bus_r(FIFO_EMPTY_REG); - LOG(logINFO, ("Analog Fifo Empty (32 channels): 0x%08x\n", fifoEmpty)); - dataPresent = (~fifoEmpty); - LOG(logDEBUG2, ("Data in Fifo :0x%x\n", dataPresent)); - return dataPresent; -} - -// only called for starting of a new frame -int checkFifoForEndOfAcquisition() { - uint32_t dataPresent = checkDataInFifo(); - LOG(logDEBUG2, ("status:0x%x\n", bus_r(STATUS_REG))); - - // as long as no data - while (!dataPresent) { - // acquisition done - if (!runBusy()) { - // wait to be sure there is no data in fifo - usleep(WAIT_TME_US_FR_ACQDONE_REG); - - // still no data - if (!checkDataInFifo()) { - LOG(logINFO, ("Acquisition Finished (State: 0x%08x), " - "no frame found .\n", - bus_r(STATUS_REG))); - return FAIL; - } - // got data, exit - else { - break; - } - } - // check if data in fifo again - dataPresent = checkDataInFifo(); - } - LOG(logDEBUG1, ("Got data :0x%x\n", dataPresent)); - return OK; -} - -int readFrameFromFifo() { - int ns = 0; - // point the data pointer to the starting position of data - analogDataPtr = analogData; - - // no data for this frame - if (checkFifoForEndOfAcquisition() == FAIL) { - return FAIL; - } - - // read Sample - while (ns < nSamples) { - readSample(ns); - ns++; - } - - // got frame - return OK; -} - -uint32_t runBusy() { +u_int32_t runBusy() { #ifdef VIRTUAL return ((sharedMemory_getStatus() == RUNNING) ? 1 : 0); #endif - uint32_t s = (bus_r(STATUS_REG) & STATUS_RN_BSY_MSK); - // LOG(logDEBUG1, ("Status Register: %08x\n", s)); + u_int32_t s = (bus_r(STATUS_REG) & RUN_BUSY_MSK); + LOG(logDEBUG1, ("Status Register: %08x\n", s)); return s; } /* common */ -int calculateDataBytes() { return dataBytes; } +int calculateDataBytes() { return DATA_BYTES; } int getTotalNumberOfChannels() { - int nchanx = 0, nchany = 0; - getNumberOfChannels(&nchanx, &nchany); - return nchanx * nchany; + return (getNumberOfChannelsPerChip() * getNumberOfChips()); } - -void getNumberOfChannels(int *nchanx, int *nchany) { - uint32_t mask = - enableTenGigabitEthernet(-1) ? adcEnableMask_10g : adcEnableMask_1g; - // count number of channels in x, each adc has 25 channels each - int nchanTop = __builtin_popcount(mask & 0xF0F0F0F0) * NCHANS_PER_ADC; - int nchanBot = __builtin_popcount(mask & 0x0F0F0F0F) * NCHANS_PER_ADC; - *nchanx = nchanTop > 0 ? nchanTop : nchanBot; - // if both top and bottom adcs enabled, rows = 2 - int nrows = 1; - if (nchanTop > 0 && nchanBot > 0) { - nrows = 2; - } - *nchany = nSamples / NSAMPLES_PER_ROW * nrows; -} - int getNumberOfChips() { return NCHIP; } int getNumberOfDACs() { return NDAC; } int getNumberOfChannelsPerChip() { return NCHAN; } diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h index 2d2275382..9e10f115e 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h @@ -4,18 +4,147 @@ #include "RegisterDefs.h" #include "sls/sls_detector_defs.h" -#define MIN_REQRD_VRSN_T_RD_API 0x180314 -#define REQRD_FRMWR_VRSN 0x221205 +#define REQRD_FRMWRE_VRSN_BOARD2 0x221130 // 1.0 pcb (version = 010) +#define REQRD_FRMWRE_VRSN 0x221130 // 2.0 pcb (version = 011) -#define NUM_HARDWARE_VERSIONS (1) +#define NUM_HARDWARE_VERSIONS (2) #define HARDWARE_VERSION_NUMBERS \ - { 0x1 } + { 0x2, 0x3 } #define HARDWARE_VERSION_NAMES \ - { "1.0" } + { "1.0", "2.0" } +#define ID_FILE ("detid_moench.txt") +#define CONFIG_FILE ("config_moench.txt") #define LINKED_SERVER_NAME "moenchDetectorServer" -#define CTRL_SRVR_INIT_TIME_US (2 * 1000 * 1000) +#define CTRL_SRVR_INIT_TIME_US (300 * 1000) + +/* Hardware Definitions */ +#define NCHAN (400 * 400) +#define NCHIP (1) +#define NDAC (8) +#define DYNAMIC_RANGE (16) +#define NUM_BYTES_PER_PIXEL (DYNAMIC_RANGE / 8) +#define DATA_BYTES (NCHIP * NCHAN * NUM_BYTES_PER_PIXEL) +#define CLK_RUN (40) // MHz +#define CLK_SYNC (20) // MHz +#define ADC_CLK_INDEX (1) +#define DBIT_CLK_INDEX (0) + +/** Default Parameters */ +#define DEFAULT_NUM_FRAMES (1) +#define DEFAULT_STARTING_FRAME_NUMBER (1) +#define DEFAULT_NUM_CYCLES (1) +#define DEFAULT_EXPTIME (10 * 1000) // ns +#define DEFAULT_PERIOD (2 * 1000 * 1000) // ns +#define DEFAULT_DELAY (0) +#define DEFAULT_HIGH_VOLTAGE (0) +#define DEFAULT_TIMING_MODE (AUTO_TIMING) +#define DEFAULT_SETTINGS (GAIN0) +#define DEFAULT_GAINMODE (DYNAMIC) +#define DEFAULT_TX_UDP_PORT (0x7e9a) +#define DEFAULT_TMP_THRSHLD (65 * 1000) // milli degree Celsius +#define DEFAULT_NUM_STRG_CLLS (0) +#define DEFAULT_STRG_CLL_STRT (0xf) +#define DEFAULT_STRG_CLL_STRT_CHIP11 (0x3) +#define DEFAULT_STRG_CLL_DLY (0) +#define DEFAULT_FLIP_ROWS (0) +#define DEFAULT_FILTER_RESISTOR (1) // higher resistor +#define DEFAULT_FILTER_CELL (0) + +#define HIGHVOLTAGE_MIN (60) +#define HIGHVOLTAGE_MAX (200) +#define DAC_MIN_MV (0) +#define DAC_MAX_MV (2500) +#define MAX_FILTER_CELL_VAL (12) + +#define READ_N_ROWS_MULTIPLE (16) // 400 rows/50packets * 2 interfaces +#define MIN_ROWS_PER_READOUT (16) +#define MAX_ROWS_PER_READOUT (400) +#define ROWS_PER_PACKET (8) + +/* Defines in the Firmware */ +#define MAX_TIMESLOT_VAL (0x1F) +#define MAX_THRESHOLD_TEMP_VAL (127999) // millidegrees +#define MAX_STORAGE_CELL_VAL (15) // 0xF +#define MAX_STORAGE_CELL_CHIP11_VAL (3) +#define MAX_STORAGE_CELL_DLY_NS_VAL (ASIC_CTRL_EXPSRE_TMR_MAX_VAL) +#define ACQ_TIME_MIN_CLOCK (2) +#define ASIC_FILTER_MAX_RES_VALUE (1) +#define MAX_SELECT_CHIP10_VAL (63) + +#define MAX_PHASE_SHIFTS (240) +#define BIT16_MASK (0xFFFF) + +#define GAIN_VAL_OFST (14) +#define GAIN_VAL_MSK (0x3 << GAIN_VAL_OFST) + +// pipeline +#define ADC_PORT_INVERT_VAL (0x5A5A5A5A) +#define ADC_PORT_INVERT_BOARD2_VAL (0x453b2a9c) + +// 2.0 pcb (chipv1.1) +#define SAMPLE_ADC_FULL_SPEED_CHIP11 \ + (SAMPLE_ADC_SAMPLE_0_VAL + SAMPLE_ADC_DECMT_FACTOR_0_VAL + \ + SAMPLE_DGTL_SAMPLE_0_VAL + SAMPLE_DECMT_FACTOR_FULL_VAL) // 0x0000 +#define SAMPLE_ADC_HALF_SPEED_CHIP11 \ + (SAMPLE_ADC_SAMPLE_0_VAL + SAMPLE_ADC_DECMT_FACTOR_1_VAL + \ + SAMPLE_DGTL_SAMPLE_1_VAL + SAMPLE_DECMT_FACTOR_HALF_VAL) // 0x1110 +#define SAMPLE_ADC_QUARTER_SPEED_CHIP11 \ + (SAMPLE_ADC_SAMPLE_0_VAL + SAMPLE_ADC_DECMT_FACTOR_3_VAL + \ + SAMPLE_DGTL_SAMPLE_2_VAL + SAMPLE_DECMT_FACTOR_QUARTER_VAL) // 0x2230 + +#define ADC_PHASE_FULL_SPEED_CHIP11 (160) +#define ADC_PHASE_HALF_SPEED_CHIP11 (160) +#define ADC_PHASE_QUARTER_SPEED_CHIP11 (160) + +#define DBIT_PHASE_FULL_SPEED_CHIP11 (80) +#define DBIT_PHASE_HALF_SPEED_CHIP11 (135) +#define DBIT_PHASE_QUARTER_SPEED_CHIP11 (135) + +#define ADC_OFST_FULL_SPEED_VAL_CHIP11 (0x10) +#define ADC_OFST_HALF_SPEED_VAL_CHIP11 (0x08) +#define ADC_OFST_QUARTER_SPEED_VAL_CHIP11 (0x04) + +// 2.0 pcb (chipv1.0) +#define SAMPLE_ADC_FULL_SPEED_CHIP10 \ + (SAMPLE_ADC_SAMPLE_0_VAL + SAMPLE_ADC_DECMT_FACTOR_0_VAL + \ + SAMPLE_DGTL_SAMPLE_1_VAL + SAMPLE_DECMT_FACTOR_FULL_VAL) // 0x0100 +#define SAMPLE_ADC_HALF_SPEED_CHIP10 \ + (SAMPLE_ADC_SAMPLE_0_VAL + SAMPLE_ADC_DECMT_FACTOR_1_VAL + \ + SAMPLE_DGTL_SAMPLE_3_VAL + SAMPLE_DECMT_FACTOR_HALF_VAL) // 0x1310 +#define SAMPLE_ADC_QUARTER_SPEED_CHIP10 \ + (SAMPLE_ADC_SAMPLE_0_VAL + SAMPLE_ADC_DECMT_FACTOR_3_VAL + \ + SAMPLE_DGTL_SAMPLE_6_VAL + SAMPLE_DECMT_FACTOR_QUARTER_VAL) // 0x2630 + +#define ADC_PHASE_FULL_SPEED_CHIP10 (160) +#define ADC_PHASE_HALF_SPEED_CHIP10 (160) +#define ADC_PHASE_QUARTER_SPEED_CHIP10 (160) + +#define DBIT_PHASE_FULL_SPEED_CHIP10 (125) +#define DBIT_PHASE_HALF_SPEED_CHIP10 (175) +#define DBIT_PHASE_QUARTER_SPEED_CHIP10 (175) + +#define ADC_OFST_FULL_SPEED_VAL_CHIP10 (0x10) +#define ADC_OFST_HALF_SPEED_VAL_CHIP10 (0x08) +#define ADC_OFST_QUARTER_SPEED_VAL_CHIP10 (0x04) + +// 1.0 pcb (2 resistor network) +#define SAMPLE_ADC_HALF_SPEED_BOARD2 \ + (SAMPLE_ADC_SAMPLE_0_VAL + SAMPLE_ADC_DECMT_FACTOR_0_VAL + \ + SAMPLE_DGTL_SAMPLE_3_VAL + SAMPLE_DECMT_FACTOR_HALF_VAL) // 0x1300 +#define SAMPLE_ADC_QUARTER_SPEED_BOARD2 \ + (SAMPLE_ADC_SAMPLE_0_VAL + SAMPLE_ADC_DECMT_FACTOR_1_VAL + \ + SAMPLE_DGTL_SAMPLE_6_VAL + SAMPLE_DECMT_FACTOR_QUARTER_VAL) // 0x2610 + +#define ADC_PHASE_HALF_SPEED_BOARD2 (110) +#define ADC_PHASE_QUARTER_SPEED_BOARD2 (220) + +#define DBIT_PHASE_HALF_SPEED_BOARD2 (150) +#define DBIT_PHASE_QUARTER_SPEED_BOARD2 (150) + +#define ADC_OFST_HALF_SPEED_BOARD2_VAL (0x10) +#define ADC_OFST_QUARTER_SPEED_BOARD2_VAL (0x08) /* Struct Definitions */ typedef struct udp_header_struct { @@ -45,111 +174,44 @@ typedef struct udp_header_struct { #define UDP_IP_HEADER_LENGTH_BYTES (28) /* Enums */ +enum ADCINDEX { TEMP_FPGA, TEMP_ADC }; enum DACINDEX { - MO_VBP_COLBUF, - MO_VIPRE, - MO_VIN_CM, - MO_VB_SDA, - MO_VCASC_SFP, - MO_VOUT_CM, - MO_VIPRE_CDS, - MO_IBIAS_SFP + J_VB_COMP, + J_VDD_PROT, + J_VIN_COM, + J_VREF_PRECH, + J_VB_PIXBUF, + J_VB_DS, + J_VREF_DS, + J_VREF_COMP }; #define DAC_NAMES \ - "vbp_colbuf", "vipre", "vin_cm", "vb_sda", "vcasc_sfp", "vout_cm", \ - "vipre_cds", "ibias_sfp" + "vb_comp", "vdd_prot", "vin_com", "vref_prech", "vb_pixbuf", "vb_ds", \ + "vref_ds", "vref_comp" + #define DEFAULT_DAC_VALS \ { \ - 1300, /* MO_VBP_COLBUF */ \ - 1000, /* MO_VIPRE */ \ - 1400, /* MO_VIN_CM */ \ - 680, /* MO_VB_SDA */ \ - 1428, /* MO_VCASC_SFP */ \ - 1200, /* MO_VOUT_CM */ \ - 800, /* MO_VIPRE_CDS */ \ - 900 /* MO_IBIAS_SFP */ \ + 1220, /* J_VB_COMP */ \ + 3000, /* J_VDD_PROT */ \ + 1053, /* J_VIN_COM */ \ + 1450, /* J_VREF_PRECH */ \ + 750, /* J_VB_PIXBUF */ \ + 1000, /* J_VB_DS */ \ + 480, /* J_VREF_DS */ \ + 420 /* J_VREF_COMP */ \ }; -enum CLKINDEX { RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS }; -#define CLK_NAMES "run", "adc", "sync", "dbit" +enum MASTERINDEX { MASTER_HARDWARE, OW_MASTER, OW_SLAVE }; +#define MASTER_NAMES "hardware", "master", "slave" -/* Hardware Definitions */ -#define NCHAN (32) -#define NCHIP (1) -#define NDAC (8) -#define DYNAMIC_RANGE (16) -#define NUM_BYTES_PER_PIXEL (DYNAMIC_RANGE / 8) -#define CLK_FREQ (156.25) /* MHz */ -#define NSAMPLES_PER_ROW (25) -#define NCHANS_PER_ADC (25) +#define NUMSETTINGS (2) +#define NSPECIALDACS (3) +#define SPECIALDACINDEX {J_VREF_PRECH, J_VREF_DS, J_VREF_COMP}; +#define SPECIAL_DEFAULT_DYNAMIC_GAIN_VALS \ + { 1450, 480, 420 } +#define SPECIAL_DEFAULT_DYNAMICHG0_GAIN_VALS \ + { 1550, 450, 620 } -/** Default Parameters */ -#define DEFAULT_PATTERN_FILE ("DefaultPattern_moench.txt") -#define DEFAULT_STARTING_FRAME_NUMBER (1) -#define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL) -#define DEFAULT_NUM_SAMPLES (5000) -#define DEFAULT_EXPTIME (0) -#define DEFAULT_NUM_FRAMES (1) -#define DEFAULT_NUM_CYCLES (1) -#define DEFAULT_PERIOD (1 * 1000 * 1000) // ns -#define DEFAULT_DELAY (0) -#define DEFAULT_HIGH_VOLTAGE (0) -#define DEFAULT_VLIMIT (-100) -#define DEFAULT_TIMING_MODE (AUTO_TIMING) -#define DEFAULT_TX_UDP_PORT (0x7e9a) - -#define DEFAULT_RUN_CLK_AT_STARTUP (200) // 40 -#define DEFAULT_ADC_CLK_AT_STARTUP (40) // 20 -#define DEFAULT_SYNC_CLK_AT_STARTUP (40) // 20 -#define DEFAULT_DBIT_CLK_AT_STARTUP (200) - -#define DEFAULT_RUN_CLK (40) -#define DEFAULT_ADC_CLK (20) -#define DEFAULT_DBIT_CLK (40) -#define DEFAULT_ADC_PHASE_DEG (30) - -#define DEFAULT_PIPELINE (15) -#define DEFAULT_SETTINGS (G4_HIGHGAIN) - -#define UDP_HEADER_MAX_FRAME_VALUE (0xFFFFFFFFFFFF) - -// settings -#define DEFAULT_PATMASK (0x00000C800000800AULL) -#define G1_HIGHGAIN_PATSETBIT (0x00000C0000008008ULL) -#define G1_LOWGAIN_PATSETBIT (0x0000040000008000ULL) -#define G2_HIGHCAP_HIGHGAIN_PATSETBIT (0x0000080000000008ULL) -#define G2_HIGHCAP_LOWGAIN_PATSETBIT (0x0000000000000000ULL) -#define G2_LOWCAP_HIGHGAIN_PATSETBIT (0x00000C800000800AULL) -#define G2_LOWCAP_LOWGAIN_PATSETBIT (0x0000048000008002ULL) -#define G4_HIGHGAIN_PATSETBIT (0x000008800000000AULL) -#define G4_LOWGAIN_PATSETBIT (0x0000008000000002ULL) - -#define HIGHVOLTAGE_MIN (60) -#define HIGHVOLTAGE_MAX (200) // min dac val -#define DAC_MIN_MV (0) -#define DAC_MAX_MV (2500) - -/* Defines in the Firmware */ -#define DIGITAL_IO_DELAY_MAXIMUM_PS \ - ((OUTPUT_DELAY_0_OTPT_STTNG_MSK >> OUTPUT_DELAY_0_OTPT_STTNG_OFST) * \ - OUTPUT_DELAY_0_OTPT_STTNG_STEPS) -#define MAX_PHASE_SHIFTS_STEPS (8) - -#define WAIT_TME_US_FR_ACQDONE_REG \ - (100) // wait time in us after acquisition done to ensure there is no data - // in fifo -#define WAIT_TIME_US_PLL (10 * 1000) -#define WAIT_TIME_US_STP_ACQ (100) -#define WAIT_TIME_CONFIGURE_MAC (2 * 1000 * 1000) -#define WAIT_TIME_PATTERN_READ (10) -#define WAIT_TIME_1US_FOR_LOOP_CNT (50) // around 30 is 1 us in blackfin - -/* MSB & LSB DEFINES */ -#define MSB_OF_64_BIT_REG_OFST (32) -#define LSB_OF_64_BIT_REG_OFST (0) -#define BIT32_MSK (0xFFFFFFFF) -#define BIT16_MASK (0xFFFF) - -#define ADC_PORT_INVERT_VAL (0x4a342593) -#define MAXIMUM_ADC_CLK (20) -#define PLL_VCO_FREQ_MHZ (800) +enum NETWORKINDEX { TXN_FRAME, FLOWCTRL_10G }; +enum CLKINDEX { RUN_CLK, ADC_CLK, DBIT_CLK, NUM_CLOCKS }; +#define CLK_NAMES "run", "adc", "dbit" diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index f085171bff8e1743e26f8d86dabd6261ce2a30d0..7e1066f332e60e5446a07e04e99e6e29b654820d 100755 GIT binary patch delta 14309 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 delta 14350 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 a=4H9wkGAr#bW5;@^Z)FpFHX1gaQ`oVSUpVu diff --git a/slsDetectorServers/slsDetectorServer/include/ALTERA_PLL.h b/slsDetectorServers/slsDetectorServer/include/ALTERA_PLL.h index 57e6fac7d..bdf5a7fcf 100644 --- a/slsDetectorServers/slsDetectorServer/include/ALTERA_PLL.h +++ b/slsDetectorServers/slsDetectorServer/include/ALTERA_PLL.h @@ -4,7 +4,7 @@ #include -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) /** * Set Defines * @param creg control register @@ -14,8 +14,9 @@ * @param prmsk pll reset mask * @param amsk address mask * @param aofst address offset - * @param wd2msk write parameter mask for pll for dbit clock (Jungfrau only) - * @param clk2Index clkIndex of second pll (Jungfrau only) + * @param wd2msk write parameter mask for pll for dbit clock (Jungfrau/moench + * only) + * @param clk2Index clkIndex of second pll (Jungfrau/moench only) */ void ALTERA_PLL_SetDefines(uint32_t creg, uint32_t preg, uint32_t rprmsk, uint32_t wpmsk, uint32_t prmsk, uint32_t amsk, @@ -50,8 +51,8 @@ void ALTERA_PLL_ResetPLLAndReconfiguration(); * Set PLL Reconfig register * @param reg register * @param val value - * @param useDefaultWRMask only jungfrau for dbit clk (clkindex1, use second WR - * mask) + * @param useDefaultWRMask only jungfrau/moench for dbit clk (clkindex1, use + * second WR mask) */ void ALTERA_PLL_SetPllReconfigReg(uint32_t reg, uint32_t val, int useSecondWRMask); diff --git a/slsDetectorServers/slsDetectorServer/include/loadPattern.h b/slsDetectorServers/slsDetectorServer/include/loadPattern.h index e6a23bf43..dfc040270 100644 --- a/slsDetectorServers/slsDetectorServer/include/loadPattern.h +++ b/slsDetectorServers/slsDetectorServer/include/loadPattern.h @@ -6,7 +6,7 @@ #include "clogger.h" void initializePatternAddresses(); -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#ifdef CHIPTESTBOARDD #ifdef VIRTUAL void initializePatternWord(); #endif diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 71eaedf05..a4004f8cd 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -6,8 +6,8 @@ #include "AD9252.h" // old board compatibility #include "clogger.h" // runState(enum TLogLevel) #endif -#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || \ - defined(MOENCHD) +#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ + defined(CHIPTESTBOARDD) #include "AD9257.h" // commonServerFunctions.h, blackfin.h, ansi.h #endif @@ -20,8 +20,8 @@ #if defined(MYTHEN3D) || defined(GOTTHARD2D) #include "nios.h" -#elif defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || \ - defined(MOENCHD) +#elif defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ + defined(CHIPTESTBOARDD) #include "blackfin.h" #endif @@ -61,15 +61,16 @@ typedef struct udpStruct_s { int isInitCheckDone(); int getInitResult(char **mess); void basictests(); -#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || \ - defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) +#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ + defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int checkType(); int testFpga(); int testBus(); #endif #if defined(GOTTHARDD) || \ - ((defined(EIGERD) || defined(JUNGFRAUD)) && defined(VIRTUAL)) + ((defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)) && \ + defined(VIRTUAL)) void setTestImageMode(int ival); int getTestImageMode(); #endif @@ -82,14 +83,14 @@ u_int64_t getFirmwareAPIVersion(); void getHardwareVersion(char *version); u_int16_t getHardwareVersionNumber(); #endif -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) u_int16_t getHardwareSerialNumber(); #endif -#if defined(JUNGFRAUD) || defined(GOTTHARD2D) || defined(MYTHEN3D) || \ - defined(GOTTHARDD) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARD2D) || \ + defined(MYTHEN3D) || defined(GOTTHARDD) int isHardwareVersion_1_0(); #endif -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) int getChipVersion(); void setChipVersion(int version); #endif @@ -98,7 +99,7 @@ u_int32_t getDetectorNumber(); #endif #if defined(GOTTHARD2D) || defined(EIGERD) || defined(MYTHEN3D) || \ - defined(JUNGFRAUD) + defined(JUNGFRAUD) || defined(MOENCHD) int getModuleId(int *ret, char *mess); int updateModuleId(); #ifndef EIGERD @@ -125,7 +126,7 @@ void checkVirtual9MFlag(); void allocateDetectorStructureMemory(); #endif void setupDetector(); -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) int updateDatabytesandAllocateRAM(); void updateDataBytes(); #endif @@ -141,7 +142,8 @@ void setASICDefaults(); #ifdef MYTHEN3D void setADIFDefaults(); #endif -#if defined(GOTTHARD2D) || defined(EIGERD) || defined(JUNGFRAUD) +#if defined(GOTTHARD2D) || defined(EIGERD) || defined(JUNGFRAUD) || \ + defined(MOENCHD) int readConfigFile(); #endif #if defined(GOTTHARDD) || defined(GOTTHARD2D) || defined(EIGERD) || \ @@ -157,14 +159,13 @@ void resetToHardwareSettings(); int writeRegister(uint32_t offset, uint32_t data); int readRegister(uint32_t offset, uint32_t *retval); #elif GOTTHARDD -uint32_t -writeRegister16And32(uint32_t offset, - uint32_t data); // FIXME its not there in ctb or moench? +uint32_t writeRegister16And32(uint32_t offset, + uint32_t data); // FIXME its not there in ctb uint32_t readRegister16And32(uint32_t offset); #endif // firmware functions (resets) -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || \ +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \ defined(MYTHEN3D) || defined(GOTTHARD2D) void cleanFifos(); void resetCore(); @@ -189,11 +190,11 @@ int getDynamicRange(int *retval); int setROI(ROI arg); ROI getROI(); #endif -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) void setADCInvertRegister(uint32_t val); uint32_t getADCInvertRegister(); #endif -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) int setADCEnableMask(uint32_t mask); uint32_t getADCEnableMask(); void setADCEnableMask_10G(uint32_t mask); @@ -221,11 +222,11 @@ int getReadoutMode(); #endif // parameters - timer -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) int selectStoragecellStart(int pos); int getMaxStoragecellStart(); #endif -#if defined(JUNGFRAUD) || defined(EIGERD) || defined(MOENCHD) || \ +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) || \ defined(CHIPTESTBOARDD) int setNextFrameNumber(uint64_t value); int getNextFrameNumber(uint64_t *value); @@ -265,13 +266,13 @@ int64_t getSubDeadTime(); int64_t getMeasuredPeriod(); int64_t getMeasuredSubPeriod(); #endif -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) void setNumAdditionalStorageCells(int val); int getNumAdditionalStorageCells(); int setStorageCellDelay(int64_t val); int64_t getStorageCellDelay(); #endif -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) int setNumAnalogSamples(int val); int getNumAnalogSamples(); #endif @@ -286,8 +287,8 @@ uint32_t getCounterMask(); void updatePacketizing(); #endif -#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || \ - defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARDD) || \ + defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int setDelayAfterTrigger(int64_t val); int64_t getDelayAfterTrigger(); int64_t getNumFramesLeft(); @@ -301,7 +302,7 @@ int64_t getNumBurstsLeft(); #ifdef GOTTHARDD int64_t getExpTimeLeft(); #endif -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || \ +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \ defined(MYTHEN3D) || defined(GOTTHARD2D) int64_t getFramesFromStart(); int64_t getActualTime(); @@ -312,7 +313,7 @@ int64_t getMeasurementTime(); #if defined(MYTHEN3D) || defined(EIGERD) void getModule(sls_detector_module *myMod); #endif -#if (!defined(CHIPTESTBOARDD)) && (!defined(MOENCHD)) && (!defined(GOTTHARD2D)) +#if (!defined(CHIPTESTBOARDD)) && (!defined(GOTTHARD2D)) int setModule(sls_detector_module myMod, char *mess); #endif @@ -328,7 +329,7 @@ int getAllTrimbits(); enum detectorSettings setSettings(enum detectorSettings sett); #endif enum detectorSettings getSettings(); -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) enum gainMode getGainMode(); void setGainMode(enum gainMode mode); #endif @@ -357,7 +358,7 @@ void setDAC(enum DACINDEX ind, int val, int mV); #endif int getDAC(enum DACINDEX ind, int mV); int getMaxDacSteps(); -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) int dacToVoltage(int dac); int checkVLimitCompliant(int mV); int checkVLimitDacCompliant(int dac); @@ -380,14 +381,15 @@ void powerOff(); #if defined(MYTHEN3D) || defined(GOTTHARD2D) int getADC(enum ADCINDEX ind, int *value); -#elif !defined(MOENCHD) +#else int getADC(enum ADCINDEX ind); #endif int setHighVoltage(int val); // parameters - timing, extsig -#if defined(EIGERD) || defined(GOTTHARD2D) || defined(JUNGFRAUD) +#if defined(EIGERD) || defined(GOTTHARD2D) || defined(JUNGFRAUD) || \ + defined(MOENCHD) int setMaster(enum MASTERINDEX m); #endif #ifdef EIGERD @@ -395,11 +397,11 @@ int setTop(enum TOPINDEX t); int isTop(int *retval); #endif #if defined(MYTHEN3D) || defined(EIGERD) || defined(GOTTHARDD) || \ - defined(GOTTHARD2D) || defined(JUNGFRAUD) + defined(GOTTHARD2D) || defined(JUNGFRAUD) || defined(MOENCHD) int isMaster(int *retval); #endif -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) int getSynchronization(); void setSynchronization(int enable); #endif @@ -430,29 +432,30 @@ int getExtSignal(int signalIndex); #ifdef GOTTHARDD void calcChecksum(mac_conf *mac, int sourceip, int destip); #endif -#if defined(JUNGFRAUD) || defined(GOTTHARD2D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARD2D) void setNumberofUDPInterfaces(int val); #endif int getNumberofUDPInterfaces(); -#if defined(JUNGFRAUD) || defined(EIGERD) || defined(MYTHEN3D) || \ - defined(GOTTHARD2D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) || \ + defined(MYTHEN3D) || defined(GOTTHARD2D) int getNumberofDestinations(int *retval); int setNumberofDestinations(int value); #endif -#if defined(JUNGFRAUD) || defined(MYTHEN3D) || defined(GOTTHARD2D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(MYTHEN3D) || \ + defined(GOTTHARD2D) int getFirstUDPDestination(); void setFirstUDPDestination(int value); #endif -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) void selectPrimaryInterface(int val); int getPrimaryInterface(); void setupHeader(int iRxEntry, enum interfaceType type, uint32_t destip, uint64_t destmac, uint32_t destport, uint64_t sourcemac, uint32_t sourceip, uint32_t sourceport); #endif -#if defined(JUNGFRAUD) || defined(GOTTHARD2D) || defined(MYTHEN3D) || \ - defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARD2D) || \ + defined(MYTHEN3D) || defined(CHIPTESTBOARDD) void calcChecksum(udp_header *udp); #endif #ifdef GOTTHARDD @@ -471,22 +474,15 @@ int getInterruptSubframe(); int setReadNRows(int value); int getReadNRows(); #endif -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(EIGERD) || \ - defined(MYTHEN3D) +#if defined(CHIPTESTBOARDD) || defined(EIGERD) || defined(MYTHEN3D) int enableTenGigabitEthernet(int val); #endif // very detector specific -// moench specific - powerchip -#ifdef MOENCHD -int powerChip(int on); -int setAnalogOnlyReadout(); -#endif - -// chip test board or moench specific - configure frequency, phase, pll, +// chip test board specific - configure frequency, phase, pll, // flashing firmware -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) int setPhase(enum CLKINDEX ind, int val, int degrees); int getPhase(enum CLKINDEX ind, int degrees); int getMaxPhase(enum CLKINDEX ind); @@ -505,9 +501,9 @@ int setLEDEnable(int enable); void setDigitalIODelay(uint64_t pinMask, int delay); #endif -// jungfrau specific - powerchip, autocompdisable, clockdiv, asictimer, clock, -// pll, flashing firmware -#ifdef JUNGFRAUD +// jungfrau/moench specific - powerchip, autocompdisable, clockdiv, asictimer, +// clock, pll, flashing firmware +#if defined(JUNGFRAUD) || defined(MOENCHD) int setReadNRows(int value); int getReadNRows(); void initReadoutConfiguration(); @@ -637,11 +633,12 @@ int setBadChannels(int numChannels, int *channelList); int *getBadChannels(int *numChannels); #endif -#if defined(JUNGFRAUD) || defined(EIGERD) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) int getTenGigaFlowControl(); int setTenGigaFlowControl(int value); #endif -#if defined(JUNGFRAUD) || defined(EIGERD) || defined(MYTHEN3D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) || \ + defined(MYTHEN3D) int getTransmissionDelayFrame(); int setTransmissionDelayFrame(int value); #endif @@ -661,14 +658,14 @@ int stopStateMachine(); #ifdef MYTHEN3D int softwareTrigger(); #endif -#if defined(EIGERD) || defined(JUNGFRAUD) +#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD) int softwareTrigger(int block); #endif #if defined(EIGERD) || defined(MYTHEN3D) int startReadOut(); #endif enum runStatus getRunStatus(); -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) void readFrames(int *ret, char *mess); #endif #ifdef EIGERD @@ -676,7 +673,7 @@ void waitForAcquisitionEnd(int *ret, char *mess); #else void waitForAcquisitionEnd(); #endif -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) void readandSendUDPFrames(int *ret, char *mess); void unsetFifoReadStrobes(); void readSample(int ns); @@ -685,8 +682,8 @@ int checkFifoForEndOfAcquisition(); int readFrameFromFifo(); #endif -#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || \ - defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) +#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ + defined(CHIPTESTBOARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) u_int32_t runBusy(); #endif @@ -697,7 +694,7 @@ u_int32_t runState(enum TLogLevel lev); // common int calculateDataBytes(); int getTotalNumberOfChannels(); -#if defined(MOENCHD) || defined(CHIPTESTBOARDD) +#if defined(CHIPTESTBOARDD) void getNumberOfChannels(int *nchanx, int *nchany); #endif int getNumberOfChips(); diff --git a/slsDetectorServers/slsDetectorServer/src/AD9257.c b/slsDetectorServers/slsDetectorServer/src/AD9257.c index 7d49d4f0e..20502922d 100644 --- a/slsDetectorServers/slsDetectorServer/src/AD9257.c +++ b/slsDetectorServers/slsDetectorServer/src/AD9257.c @@ -300,7 +300,7 @@ void AD9257_Configure() { AD9257_CLK_CH_IFCO_MSK); // vref -#if defined(GOTTHARDD) || defined(MOENCHD) +#ifdef GOTTHARDD LOG(logINFO, ("\tVref default at 2.0\n")); AD9257_SetVrefVoltage(AD9257_VREF_DEFAULT_VAL, 0); #else diff --git a/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL.c b/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL.c index 230d3f241..1b7960933 100644 --- a/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL.c +++ b/slsDetectorServers/slsDetectorServer/src/ALTERA_PLL.c @@ -127,7 +127,7 @@ uint32_t ALTERA_PLL_Cntrl_Reg = 0x0; uint32_t ALTERA_PLL_Param_Reg = 0x0; uint32_t ALTERA_PLL_Cntrl_RcnfgPrmtrRstMask = 0x0; uint32_t ALTERA_PLL_Cntrl_WrPrmtrMask = 0x0; -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) uint32_t ALTERA_PLL_Cntrl_DBIT_PLL_WrPrmtrMask = 0x0; int ALTERA_PLL_Cntrl_DBIT_ClkIndex = 0; @@ -136,7 +136,7 @@ uint32_t ALTERA_PLL_Cntrl_PLLRstMask = 0x0; uint32_t ALTERA_PLL_Cntrl_AddrMask = 0x0; int ALTERA_PLL_Cntrl_AddrOfst = 0; -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) void ALTERA_PLL_SetDefines(uint32_t creg, uint32_t preg, uint32_t rprmsk, uint32_t wpmsk, uint32_t prmsk, uint32_t amsk, int aofst, uint32_t wd2msk, int clk2Index) { @@ -201,7 +201,7 @@ void ALTERA_PLL_SetPllReconfigReg(uint32_t reg, uint32_t val, reg, val, useSecondWRMask)); uint32_t wrmask = ALTERA_PLL_Cntrl_WrPrmtrMask; -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) if (useSecondWRMask) { wrmask = ALTERA_PLL_Cntrl_DBIT_PLL_WrPrmtrMask; } @@ -252,7 +252,7 @@ void ALTERA_PLL_SetPhaseShift(int32_t phase, int clkIndex, int pos) { LOG(logDEBUG1, ("C%d phase word:0x%08x\n", clkIndex, value)); int useSecondWR = 0; -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) if (clkIndex == ALTERA_PLL_Cntrl_DBIT_ClkIndex) { useSecondWR = 1; } diff --git a/slsDetectorServers/slsDetectorServer/src/common.c b/slsDetectorServers/slsDetectorServer/src/common.c index d1151bfa0..3a00038e3 100644 --- a/slsDetectorServers/slsDetectorServer/src/common.c +++ b/slsDetectorServers/slsDetectorServer/src/common.c @@ -224,10 +224,10 @@ int getModuleIdInFile(int *ret, char *mess, char *fileName) { // open id file FILE *fd = fopen(fname, "r"); if (fd == NULL) { -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) *ret = OK; - LOG(logWARNING, - ("Could not find detid_jungfrau.txt to set module id\n")); + LOG(logWARNING, ("Could not find detid file to set module id. " + "Continuing without.\n")); return 0; #else *ret = FAIL; @@ -485,7 +485,7 @@ int setupDetectorServer(char *mess, char *sname) { // blackfin boards (respawn) (only kept for backwards compatibility) #ifndef VIRTUAL -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || \ +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \ defined(GOTTHARDD) // delete every line with DetectorServer in /etc/inittab strcpy(cmd, "sed -i '/DetectorServer/d' /etc/inittab"); diff --git a/slsDetectorServers/slsDetectorServer/src/loadPattern.c b/slsDetectorServers/slsDetectorServer/src/loadPattern.c index 017b99b00..e0e0db094 100644 --- a/slsDetectorServers/slsDetectorServer/src/loadPattern.c +++ b/slsDetectorServers/slsDetectorServer/src/loadPattern.c @@ -13,7 +13,7 @@ extern enum TLogLevel trimmingPrint; #endif -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#ifdef CHIPTESTBOARDD #ifdef VIRTUAL uint64_t virtual_pattern[MAX_PATTERN_LENGTH]; #endif @@ -40,7 +40,7 @@ void initializePatternAddresses() { } } -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#ifdef CHIPTESTBOARDD #ifdef VIRTUAL void initializePatternWord() { memset(virtual_pattern, 0, sizeof(virtual_pattern)); @@ -128,7 +128,7 @@ int validate_writePatternWord(char *message, int addr, uint64_t word) { // validate result int ret = OK; - // cannot validate for moench, ctb ( same as executing pattern word) + // cannot validate for ctb ( same as executing pattern word) #ifdef MYTHEN3D uint64_t retval = readPatternWord(addr); LOG(logDEBUG1, ("Pattern word (addr:0x%x) retval: 0x%llx\n", addr, diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c index 3542ba431..43e2a6345 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer.c @@ -88,7 +88,7 @@ int main(int argc, char *argv[]) { "and " "initial detector setup. \n" "\t-i, --ignore-config : " - "[Eiger][Jungfrau][Gotthard][Gotthard2] \n" + "[Eiger][Jungfrau][Gotthard][Gotthard2][Moench] \n" "\t Ignore config file. \n" "\t-m, --master : " "[Eiger][Mythen3][Gotthard][Gotthard2] \n" @@ -205,7 +205,7 @@ int main(int argc, char *argv[]) { case 'i': #if defined(EIGERD) || defined(GOTTHARDD) || defined(GOTTHARD2D) || \ - defined(JUNGFRAUD) + defined(JUNGFRAUD) || defined(MOENCHD) LOG(logINFO, ("Ignoring config file\n")); ignoreConfigFileFlag = 1; #else diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 7f5c0b2e5..7e90a19bc 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -7,7 +7,7 @@ #include "sls/sls_detector_funcs.h" #include "slsDetectorFunctionList.h" -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(CHIPTESTBOARDD) || defined(MYTHEN3D) #include "Pattern.h" #include "loadPattern.h" #endif @@ -764,8 +764,8 @@ int set_firmware_test(int file_des) { memset(mess, 0, sizeof(mess)); LOG(logDEBUG1, ("Executing firmware test\n")); -#if !defined(GOTTHARDD) && !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && \ - !defined(MOENCHD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) +#if !defined(GOTTHARDD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(CHIPTESTBOARDD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else ret = testFpga(); @@ -782,8 +782,8 @@ int set_bus_test(int file_des) { memset(mess, 0, sizeof(mess)); LOG(logDEBUG1, ("Executing bus test\n")); -#if !defined(GOTTHARDD) && !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && \ - !defined(MOENCHD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) +#if !defined(GOTTHARDD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(CHIPTESTBOARDD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else ret = testBus(); @@ -805,7 +805,8 @@ int set_image_test_mode(int file_des) { LOG(logDEBUG1, ("Setting image test mode to \n", arg)); #if defined(GOTTHARDD) || \ - ((defined(EIGERD) || defined(JUNGFRAUD)) && defined(VIRTUAL)) + ((defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)) && \ + defined(VIRTUAL)) setTestImageMode(arg); #else functionNotImplemented(); @@ -820,7 +821,8 @@ int get_image_test_mode(int file_des) { LOG(logDEBUG1, ("Getting image test mode\n")); #if defined(GOTTHARDD) || \ - ((defined(EIGERD) || defined(JUNGFRAUD)) && defined(VIRTUAL)) + ((defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD)) && \ + defined(VIRTUAL)) retval = getTestImageMode(); LOG(logDEBUG1, ("image test mode retval: %d\n", retval)); #else @@ -929,31 +931,6 @@ enum DACINDEX getDACIndex(enum dacIndex ind) { case V_POWER_CHIP: serverDacIndex = D_PWR_CHIP; break; -#elif MOENCHD - case VBP_COLBUF: - serverDacIndex = MO_VBP_COLBUF; - break; - case VIPRE: - serverDacIndex = MO_VIPRE; - break; - case VIN_CM: - serverDacIndex = MO_VIN_CM; - break; - case VB_SDA: - serverDacIndex = MO_VB_SDA; - break; - case VCASC_SFP: - serverDacIndex = MO_VCASC_SFP; - break; - case VOUT_CM: - serverDacIndex = MO_VOUT_CM; - break; - case VIPRE_CDS: - serverDacIndex = MO_VIPRE_CDS; - break; - case IBIAS_SFP: - serverDacIndex = MO_IBIAS_SFP; - break; #elif MYTHEN3D case VCASSH: serverDacIndex = M_VCASSH; @@ -1051,7 +1028,7 @@ enum DACINDEX getDACIndex(enum dacIndex ind) { case VCOM_ADC2: serverDacIndex = G2_VCOM_ADC2; break; -#elif JUNGFRAUD +#elif defined(JUNGFRAUD) || defined(MOENCHD) case HIGH_VOLTAGE: break; case VB_COMP: @@ -1106,9 +1083,6 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { #elif CHIPTESTBOARDD case ADC_VPP: case V_LIMIT: -#elif MOENCHD - case ADC_VPP: - case V_LIMIT: #endif break; default: @@ -1120,7 +1094,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { } switch (ind) { // adc vpp -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) case ADC_VPP: // set if (val >= 0) { @@ -1152,7 +1126,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { case HIGH_VOLTAGE: retval = setHighVoltage(val); LOG(logDEBUG1, ("High Voltage: %d\n", retval)); -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || \ +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) || \ defined(GOTTHARD2D) || defined(MYTHEN3D) validate(&ret, mess, val, retval, "set high voltage", DEC); #endif @@ -1253,7 +1227,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { break; #endif -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) case V_LIMIT: if (val >= 0) { if (!mV) { @@ -1287,7 +1261,7 @@ int validateAndSetDac(enum dacIndex ind, int val, int mV) { ind, val, getMaxDacSteps()); LOG(logERROR, (mess)); } else { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) if ((val != GET_FLAG && mV && checkVLimitCompliant(val) == FAIL) || (val != GET_FLAG && !mV && checkVLimitDacCompliant(val) == FAIL)) { @@ -1385,9 +1359,6 @@ int get_adc(int file_des) { if (receiveData(file_des, &ind, sizeof(ind), INT32) < 0) return printSocketReadError(); -#if defined(MOENCHD) - functionNotImplemented(); -#else enum ADCINDEX serverAdcIndex = 0; // get @@ -1397,7 +1368,7 @@ int get_adc(int file_des) { serverAdcIndex = TEMP_FPGA; break; #endif -#if defined(GOTTHARDD) || defined(JUNGFRAUD) +#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) case TEMPERATURE_FPGA: serverAdcIndex = TEMP_FPGA; break; @@ -1509,7 +1480,6 @@ int get_adc(int file_des) { LOG(logDEBUG1, ("ADC(%d): %d\n", serverAdcIndex, retval)); #endif } -#endif return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } @@ -1751,7 +1721,7 @@ void validate_settings(enum detectorSettings sett) { switch (sett) { #ifdef EIGERD case STANDARD: -#elif JUNGFRAUD +#elif defined(JUNGFRAUD) || defined(MOENCHD) case GAIN0: case HIGHGAIN0: #elif GOTTHARDD @@ -1764,15 +1734,6 @@ void validate_settings(enum detectorSettings sett) { case DYNAMICGAIN: case FIXGAIN1: case FIXGAIN2: -#elif MOENCHD - case G1_HIGHGAIN: - case G1_LOWGAIN: - case G2_HIGHCAP_HIGHGAIN: - case G2_HIGHCAP_LOWGAIN: - case G2_LOWCAP_HIGHGAIN: - case G2_LOWCAP_LOWGAIN: - case G4_HIGHGAIN: - case G4_LOWGAIN: #elif MYTHEN3D case STANDARD: case FAST: @@ -1873,7 +1834,7 @@ int acquire(int blocking, int file_des) { } // only set if (Server_VerifyLock() == OK) { -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) // chipv1.1 has to be configured before acquisition if (getChipVersion() == 11 && !isChipConfigured()) { ret = FAIL; @@ -1882,16 +1843,6 @@ int acquire(int blocking, int file_des) { LOG(logERROR, (mess)); } else #endif -#ifdef MOENCHD - if (getNumAnalogSamples() <= 0) { - ret = FAIL; - sprintf(mess, - "Could not start acquisition. Invalid number of analog " - "samples: %d.\n", - getNumAnalogSamples()); - LOG(logERROR, (mess)); - } else -#endif #ifdef CHIPTESTBOARDD if ((getReadoutMode() == ANALOG_AND_DIGITAL || getReadoutMode() == ANALOG_ONLY) && @@ -2027,7 +1978,7 @@ void *start_state_machine(void *arg) { ret = startStateMachine(); LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret)); if (ret == FAIL) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(VIRTUAL) +#if defined(CHIPTESTBOARDD) || defined(VIRTUAL) sprintf(mess, "Could not start acquisition. Could not create udp " "socket in server. Check udp_dstip & udp_dstport.\n"); #else @@ -2042,7 +1993,7 @@ void *start_state_machine(void *arg) { break; } -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) readFrames(&ret, mess); if (ret == FAIL && scan) { sprintf(scanErrMessage, "Cannot scan at %d. ", scanSteps[i]); @@ -2207,7 +2158,7 @@ int get_num_additional_storage_cells(int file_des) { memset(mess, 0, sizeof(mess)); int retval = -1; -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only @@ -2226,7 +2177,7 @@ int set_num_additional_storage_cells(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting number of addl. storage cells %d\n", arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -2258,7 +2209,7 @@ int get_num_analog_samples(int file_des) { memset(mess, 0, sizeof(mess)); int retval = -1; -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) functionNotImplemented(); #else // get only @@ -2277,21 +2228,11 @@ int set_num_analog_samples(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting number of analog samples %d\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) functionNotImplemented(); #else // only set if (Server_VerifyLock() == OK) { -#ifdef MOENCHD - if (arg % NSAMPLES_PER_ROW != 0) { - ret = FAIL; - sprintf(mess, - "Could not set number of analog samples to %d. Must be " - "divisible by %d\n", - arg, NSAMPLES_PER_ROW); - LOG(logERROR, (mess)); - } -#endif if (ret == OK) { ret = setNumAnalogSamples(arg); if (ret == FAIL) { @@ -2513,8 +2454,8 @@ int get_delay_after_trigger(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && \ - !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \ + !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -2535,8 +2476,8 @@ int set_delay_after_trigger(int file_des) { LOG(logDEBUG1, ("Setting delay after trigger %lld ns\n", (long long int)arg)); -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && \ - !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \ + !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -2679,7 +2620,7 @@ int get_storage_cell_delay(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only @@ -2706,7 +2647,7 @@ int set_storage_cell_delay(int file_des) { LOG(logDEBUG1, ("Setting storage cell delay %lld ns\n", (long long int)arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -2745,8 +2686,8 @@ int get_frames_left(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && \ - !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \ + !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -2761,8 +2702,8 @@ int get_triggers_left(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) && !defined(CHIPTESTBOARDD) && \ - !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARDD) && \ + !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -2792,8 +2733,9 @@ int get_period_left(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) /* && !defined(CHIPTESTBOARDD) \ - && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D)*/ +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(GOTTHARDD) /* && !defined(CHIPTESTBOARDD) \ +&& !defined(MYTHEN3D) && !defined(GOTTHARD2D)*/ functionNotImplemented(); #else // get only @@ -2808,8 +2750,9 @@ int get_delay_after_trigger_left(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(GOTTHARDD) /* && !defined(CHIPTESTBOARDD) \ - && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D)*/ +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(GOTTHARDD) /* && !defined(CHIPTESTBOARDD) \ +&& !defined(MYTHEN3D) && !defined(GOTTHARD2D)*/ functionNotImplemented(); #else // get only @@ -2856,7 +2799,7 @@ int get_frames_from_start(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && \ +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \ !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else @@ -2872,7 +2815,7 @@ int get_actual_time(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && \ +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \ !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else @@ -2888,7 +2831,7 @@ int get_measurement_time(int file_des) { memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && \ +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \ !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else @@ -2929,8 +2872,8 @@ int set_dynamic_range(int file_des) { case 16: case 32: #endif -#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || \ - defined(MOENCHD) || defined(GOTTHARD2D) +#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ + defined(CHIPTESTBOARDD) || defined(GOTTHARD2D) case 16: #endif if (dr >= 0) { @@ -3071,7 +3014,8 @@ int enable_ten_giga(int file_des) { return printSocketReadError(); LOG(logDEBUG, ("Setting 10GbE: %d\n", arg)); -#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(GOTTHARD2D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARDD) || \ + defined(GOTTHARD2D) functionNotImplemented(); #else // set & get @@ -3169,7 +3113,7 @@ int set_pattern_io_control(int file_des) { if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) functionNotImplemented(); #else LOG(logDEBUG1, @@ -3192,7 +3136,7 @@ int set_pattern_word(int file_des) { if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int addr = (int)args[0]; @@ -3220,7 +3164,7 @@ int set_pattern_loop_addresses(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -3266,7 +3210,7 @@ int set_pattern_loop_cycles(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -3295,7 +3239,7 @@ int set_pattern_wait_addr(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = args[0]; @@ -3324,7 +3268,7 @@ int set_pattern_wait_time(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else int loopLevel = (int)args[0]; @@ -3354,7 +3298,7 @@ int set_pattern_mask(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Set Pattern Mask to %d\n", arg)); -#if !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -3376,7 +3320,7 @@ int get_pattern_mask(int file_des) { LOG(logDEBUG1, ("Get Pattern Mask\n")); -#if !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only get @@ -3397,7 +3341,7 @@ int set_pattern_bit_mask(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Set Pattern Bit Mask to %d\n", arg)); -#if !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -3419,7 +3363,7 @@ int get_pattern_bit_mask(int file_des) { LOG(logDEBUG1, ("Get Pattern Bit Mask\n")); -#if !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else // only get @@ -3448,7 +3392,7 @@ int write_adc_register(int file_des) { #ifndef VIRTUAL // only set if (Server_VerifyLock() == OK) { -#if defined(JUNGFRAUD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(CHIPTESTBOARDD) AD9257_Set(addr, val); #elif GOTTHARDD if (isHardwareVersion_1_0()) { @@ -3615,7 +3559,7 @@ int set_ten_giga_flow_control(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting ten giga flow control: %d\n", arg)); -#if !defined(EIGERD) && !defined(JUNGFRAUD) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -3641,7 +3585,7 @@ int get_ten_giga_flow_control(int file_des) { LOG(logDEBUG1, ("Getting ten giga flow control\n")); -#if !defined(EIGERD) && !defined(JUNGFRAUD) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only @@ -3664,7 +3608,8 @@ int set_transmission_delay_frame(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting transmission delay frame: %d\n", arg)); -#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MYTHEN3D) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -3702,7 +3647,8 @@ int get_transmission_delay_frame(int file_des) { LOG(logDEBUG1, ("Getting transmission delay frame\n")); -#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MYTHEN3D) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -3901,7 +3847,7 @@ int power_chip(int file_des) { LOG(logDEBUG1, ("Power chip: %d\n", retval)); } validate(&ret, mess, arg, retval, "power on/off chip", DEC); -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) // narrow down error when powering on if (ret == FAIL && arg > 0) { if (setTemperatureEvent(GET_FLAG) == 1) @@ -3966,7 +3912,7 @@ int threshold_temp(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting threshold temperature to %d\n", arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // set & get @@ -3999,7 +3945,7 @@ int temp_control(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting temperature control to %d\n", arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // set & get @@ -4023,7 +3969,7 @@ int temp_event(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting temperature event to %d\n", arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // set & get @@ -4046,7 +3992,7 @@ int auto_comp_disable(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting Auto comp disable to %d\n", arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // set & get @@ -4069,7 +4015,7 @@ int storage_cell_start(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting Storage cell start to %d\n", arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // set & get @@ -4129,7 +4075,8 @@ int software_trigger(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Software Trigger (block: %d\n", arg)); -#if !defined(EIGERD) && !defined(MYTHEN3D) && !defined(JUNGFRAUD) +#if !defined(EIGERD) && !defined(MYTHEN3D) && !defined(JUNGFRAUD) && \ + !defined(MOENCHD) functionNotImplemented(); #else if (arg && myDetectorType == MYTHEN3) { @@ -4244,7 +4191,7 @@ int set_adc_enable_mask(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Seting 1Gb ADC Enable Mask to %u\n", arg)); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if (!defined(CHIPTESTBOARDD)) functionNotImplemented(); #else // only set @@ -4276,7 +4223,7 @@ int get_adc_enable_mask(int file_des) { LOG(logDEBUG1, ("Getting 1Gb ADC Enable Mask \n")); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if (!defined(CHIPTESTBOARDD)) functionNotImplemented(); #else // get @@ -4295,7 +4242,7 @@ int set_adc_enable_mask_10g(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Seting 10Gb ADC Enable Mask to %u\n", arg)); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if (!defined(CHIPTESTBOARDD)) functionNotImplemented(); #else // only set @@ -4322,7 +4269,7 @@ int get_adc_enable_mask_10g(int file_des) { LOG(logDEBUG1, ("Getting 10Gb ADC Enable Mask\n")); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if (!defined(CHIPTESTBOARDD)) functionNotImplemented(); #else // get @@ -4341,7 +4288,7 @@ int set_adc_invert(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Seting ADC Invert to %u\n", arg)); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) && (!defined(JUNGFRAUD)) +#if !defined(CHIPTESTBOARDD) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -4368,7 +4315,7 @@ int get_adc_invert(int file_des) { LOG(logDEBUG1, ("Getting ADC Invert register \n")); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) && (!defined(JUNGFRAUD)) +#if !defined(CHIPTESTBOARDD) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get @@ -4444,8 +4391,8 @@ int set_next_frame_number(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting next frame number to %llu\n", arg)); -#if (!defined(EIGERD)) && (!defined(JUNGFRAUD)) && (!defined(MOENCHD)) && \ - (!defined(CHIPTESTBOARDD)) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(CHIPTESTBOARDD) functionNotImplemented(); #else // only set @@ -4455,7 +4402,7 @@ int set_next_frame_number(int file_des) { sprintf(mess, "Could not set next frame number. Cannot be 0.\n"); LOG(logERROR, (mess)); } -#if (defined(EIGERD)) || (defined(MOENCHD)) || (defined(CHIPTESTBOARDD)) +#if (defined(EIGERD)) || (defined(CHIPTESTBOARDD)) else if (arg > UDP_HEADER_MAX_FRAME_VALUE) { ret = FAIL; #ifdef VIRTUAL @@ -4523,8 +4470,8 @@ int get_next_frame_number(int file_des) { LOG(logDEBUG1, ("Getting next frame number \n")); -#if (!defined(EIGERD)) && (!defined(JUNGFRAUD)) && (!defined(MOENCHD)) && \ - (!defined(CHIPTESTBOARDD)) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(CHIPTESTBOARDD) functionNotImplemented(); #else // get @@ -4660,12 +4607,12 @@ int set_read_n_rows(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting number of rows: %u\n", arg)); -#if !defined(EIGERD) && !defined(JUNGFRAUD) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set if (Server_VerifyLock() == OK) { - if (arg <= 0 || arg > MAX_ROWS_PER_READOUT) { + if (arg < MIN_ROWS_PER_READOUT || arg > MAX_ROWS_PER_READOUT) { ret = FAIL; sprintf(mess, "Could not set read n rows. Must be between %d " @@ -4695,7 +4642,7 @@ int set_read_n_rows(int file_des) { maxnl); LOG(logERROR, (mess)); } else -#elif JUNGFRAUD +#elif defined(JUNGFRAUD) || defined(MOENCHD) if ((check_detector_idle("set number of rows") == OK) && (arg % READ_N_ROWS_MULTIPLE != 0)) { ret = FAIL; @@ -4741,7 +4688,7 @@ int get_read_n_rows(int file_des) { LOG(logDEBUG1, ("Getting number of rows\n")); -#if !defined(EIGERD) && !defined(JUNGFRAUD) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else retval = getReadNRows(); @@ -4769,10 +4716,10 @@ void calculate_and_set_position() { int pos[2] = {0, 0}; int portGeometry[2] = {1, 1}; - // position does change for eiger and jungfrau (2 interfaces) + // position does change for eiger and jungfrau/moench (2 interfaces) #if defined(EIGERD) portGeometry[X] = getNumberofUDPInterfaces(); // horz -#elif defined(JUNGFRAUD) +#elif defined(JUNGFRAUD) || defined(MOENCHD) portGeometry[Y] = getNumberofUDPInterfaces(); // vert #endif LOG(logDEBUG1, ("moduleIndex:%d maxymods:%d portGeo.x:%d portgeo.y:%d\n", @@ -4806,7 +4753,7 @@ void calculate_and_set_position() { udpDetails[iRxEntry].srcmac = udpDetails[0].srcmac; } } -#if defined(JUNGFRAUD) || defined(GOTTHARD2D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARD2D) if (getNumberofUDPInterfaces() > 1) { if (udpDetails[0].srcmac2 == 0) { char dmac2[MAC_ADDRESS_SIZE]; @@ -4830,7 +4777,7 @@ void calculate_and_set_position() { #endif configure_mac(); } - // no need to do a get (also jungfrau gives bigger set for second) + // no need to do a get (also jungfrau/moench gives bigger set for second) } int set_detector_position(int file_des) { @@ -4899,7 +4846,7 @@ int is_udp_configured() { return FAIL; } #endif -#if defined(JUNGFRAUD) || defined(GOTTHARD2D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARD2D) if (getNumberofUDPInterfaces() == 2) { if (udpDetails[i].srcip2 == 0) { sprintf(configureMessage, @@ -4938,7 +4885,7 @@ void configure_mac() { if (is_udp_configured() == OK) { ret = configureMAC(); if (ret != OK) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) if (ret == -1) { sprintf(mess, "Could not allocate RAM\n"); } else { @@ -5011,7 +4958,7 @@ int set_source_udp_ip2(int file_des) { arg = __builtin_bswap32(arg); LOG(logINFO, ("Setting udp source ip2: 0x%x\n", arg)); -#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -5036,7 +4983,7 @@ int get_source_udp_ip2(int file_des) { uint32_t retval = -1; LOG(logDEBUG1, ("Getting udp source ip2\n")); -#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -5093,7 +5040,7 @@ int set_dest_udp_ip2(int file_des) { arg = __builtin_bswap32(arg); LOG(logINFO, ("Setting udp destination ip2: 0x%x\n", arg)); -#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -5115,7 +5062,7 @@ int get_dest_udp_ip2(int file_des) { uint32_t retval = -1; LOG(logDEBUG1, ("Getting udp destination ip2\n")); -#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -5172,7 +5119,7 @@ int set_source_udp_mac2(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting udp source mac2: 0x%lx\n", arg)); -#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -5197,7 +5144,7 @@ int get_source_udp_mac2(int file_des) { uint64_t retval = -1; LOG(logDEBUG1, ("Getting udp source mac2\n")); -#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -5250,7 +5197,7 @@ int set_dest_udp_mac2(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting udp destination mac2: 0x%lx\n", arg)); -#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -5272,7 +5219,7 @@ int get_dest_udp_mac2(int file_des) { uint64_t retval = -1; LOG(logDEBUG1, ("Getting udp destination mac2\n")); -#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -5325,7 +5272,8 @@ int set_dest_udp_port2(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting udp destination port2: %u\n", arg)); -#if !defined(JUNGFRAUD) && !defined(EIGERD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(EIGERD) && \ + !defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -5347,7 +5295,8 @@ int get_dest_udp_port2(int file_des) { int retval = -1; LOG(logDEBUG1, ("Getting destination port2\n")); -#if !defined(JUNGFRAUD) && !defined(EIGERD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(EIGERD) && \ + !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -5366,7 +5315,7 @@ int set_num_interfaces(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting number of interfaces: %d\n", arg)); -#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(GOTTHARD2D) // fixed number of udp interfaces int num_interfaces = getNumberofUDPInterfaces(); if (arg != num_interfaces) { @@ -5452,7 +5401,7 @@ int set_interface_sel(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting selected interface: %d\n", arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -5479,7 +5428,7 @@ int get_interface_sel(int file_des) { int retval = -1; LOG(logDEBUG1, ("Getting selected interface\n")); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only @@ -5667,7 +5616,7 @@ int set_clock_frequency(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting clock (%d) frequency : %u\n", args[0], args[1])); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) functionNotImplemented(); #else @@ -5730,14 +5679,13 @@ int get_clock_frequency(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Getting clock (%d) frequency\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(GOTTHARD2D) && \ - !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only enum CLKINDEX c = 0; switch (arg) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) case ADC_CLOCK: c = ADC_CLK; break; @@ -5786,7 +5734,7 @@ int set_clock_phase(int file_des) { LOG(logDEBUG1, ("Setting clock (%d) phase: %u %s\n", args[0], args[1], (args[2] == 0 ? "" : "degrees"))); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(JUNGFRAUD) && \ +#if !defined(CHIPTESTBOARDD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ !defined(GOTTHARDD) && !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else @@ -5797,13 +5745,13 @@ int set_clock_phase(int file_des) { int inDegrees = args[2] == 0 ? 0 : 1; enum CLKINDEX c = 0; switch (ind) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(JUNGFRAUD) || \ +#if defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ defined(GOTTHARDD) case ADC_CLOCK: c = ADC_CLK; break; #endif -#if defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) +#if defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) case DBIT_CLOCK: c = DBIT_CLK; break; @@ -5895,7 +5843,7 @@ int get_clock_phase(int file_des) { LOG(logINFOBLUE, ("Getting clock (%d) phase %s \n", args[0], (args[1] == 0 ? "" : "in degrees"))); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(JUNGFRAUD) && \ +#if !defined(CHIPTESTBOARDD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else @@ -5904,12 +5852,12 @@ int get_clock_phase(int file_des) { int inDegrees = args[1] == 0 ? 0 : 1; enum CLKINDEX c = 0; switch (ind) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(JUNGFRAUD) +#if defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) case ADC_CLOCK: c = ADC_CLK; break; #endif -#if defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) +#if defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) case DBIT_CLOCK: c = DBIT_CLK; break; @@ -5945,19 +5893,19 @@ int get_max_clock_phase_shift(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Getting clock (%d) max phase shift\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(JUNGFRAUD) && \ +#if !defined(CHIPTESTBOARDD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only enum CLKINDEX c = 0; switch (arg) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(JUNGFRAUD) +#if defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) case ADC_CLOCK: c = ADC_CLK; break; #endif -#if defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) +#if defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) case DBIT_CLOCK: c = DBIT_CLK; break; @@ -6679,7 +6627,7 @@ int set_current_source(int file_des) { "normal:%d]\n", enable, fix, (long long int)select, normal)); -#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) +#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -6752,7 +6700,7 @@ int set_current_source(int file_des) { } if (ret == OK) { -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) if (enable == 0) { disableCurrentSource(); } else { @@ -6779,13 +6727,13 @@ int get_current_source(int file_des) { LOG(logDEBUG1, ("Getting current source\n")); -#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) +#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only retvals[0] = getCurrentSource(); LOG(logDEBUG1, ("current source enable retval: %u\n", retvals[0])); -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) if (retvals[0]) { retvals[1] = getFixCurrentSource(); retvals[2] = getNormalCurrentSource(); @@ -6866,7 +6814,7 @@ int get_num_channels(int file_des) { LOG(logDEBUG1, ("Getting number of channels\n")); -#if !defined(MOENCHD) && !defined(CHIPTESTBOARDD) +#if !defined(CHIPTESTBOARDD) functionNotImplemented(); #else // get only @@ -7010,7 +6958,7 @@ int get_receiver_parameters(int file_des) { return printSocketReadError(); // additional storage cells -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) i32 = getNumAdditionalStorageCells(); #else i32 = 0; @@ -7020,7 +6968,7 @@ int get_receiver_parameters(int file_des) { return printSocketReadError(); // analog samples -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) i32 = getNumAnalogSamples(); #else i32 = 0; @@ -7119,7 +7067,7 @@ int get_receiver_parameters(int file_des) { return printSocketReadError(); // ReadNRows -#if defined(EIGERD) || defined(JUNGFRAUD) +#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD) i32 = getReadNRows(); #else i32 = 0; @@ -7159,8 +7107,7 @@ int get_receiver_parameters(int file_des) { return printSocketReadError(); // 10 gbe -#if defined(EIGERD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || \ - defined(MYTHEN3D) +#if defined(EIGERD) || defined(CHIPTESTBOARDD) || defined(MYTHEN3D) i32 = enableTenGigabitEthernet(GET_FLAG); #else i32 = 0; @@ -7180,7 +7127,7 @@ int get_receiver_parameters(int file_des) { return printSocketReadError(); // adc mask -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) u32 = getADCEnableMask(); #else u32 = 0; @@ -7190,7 +7137,7 @@ int get_receiver_parameters(int file_des) { return printSocketReadError(); // 10g adc mask -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) u32 = getADCEnableMask_10G(); #else u32 = 0; @@ -7562,7 +7509,7 @@ int set_pattern(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); #else @@ -7590,7 +7537,7 @@ int get_pattern(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MYTHEN3D) functionNotImplemented(); return Server_SendResult(file_des, INT32, NULL, 0); #else @@ -7801,11 +7748,11 @@ int get_filter_resistor(int file_des) { LOG(logDEBUG1, ("Getting filter resistor\n")); -#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) +#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) if (getChipVersion() == 10) { ret = FAIL; strcpy(mess, "Could not get filter cell. Not available for this chip " @@ -7830,7 +7777,7 @@ int set_filter_resistor(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting filter resistor: %u\n", arg)); -#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) +#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -7844,7 +7791,7 @@ int set_filter_resistor(int file_des) { arg, ASIC_FILTER_MAX_RES_VALUE); LOG(logERROR, (mess)); } -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) else if (getChipVersion() == 10) { ret = FAIL; strcpy(mess, "Could not set filter cell. Not available for this " @@ -7858,8 +7805,9 @@ int set_filter_resistor(int file_des) { strcpy(mess, "Could not set filter resistor.\n"); LOG(logERROR, (mess)); } -#ifndef JUNGFRAUD - // jungfrau might take time to update status register if acquiring +#if !defined(JUNGFRAUD) && !defined(MOENCHD) + // jungfrau/moench might take time to update status register if + // acquiring int retval = getFilterResistor(); LOG(logDEBUG1, ("filter resistor retval: %u\n", retval)); validate(&ret, mess, arg, retval, "set filter resistor", DEC); @@ -8207,7 +8155,7 @@ int load_default_pattern(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#if !defined(MYTHEN3D) && !defined(MOENCHD) +#if !defined(MYTHEN3D) functionNotImplemented(); #else if (Server_VerifyLock() == OK) { @@ -8246,7 +8194,7 @@ int get_master(int file_des) { LOG(logDEBUG1, ("Getting master\n")); #if !defined(MYTHEN3D) && !defined(EIGERD) && !defined(GOTTHARDD) && \ - !defined(GOTTHARD2D) && !defined(JUNGFRAUD) + !defined(GOTTHARD2D) && !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else ret = isMaster(&retval); @@ -8267,7 +8215,8 @@ int set_master(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting master: %u\n", (int)arg)); -#if !defined(EIGERD) && !defined(GOTTHARD2D) && !defined(JUNGFRAUD) +#if !defined(EIGERD) && !defined(GOTTHARD2D) && !defined(JUNGFRAUD) && \ + !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -8569,7 +8518,7 @@ int get_chip_version(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); int retval = -1; -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else retval = getChipVersion(); @@ -8676,7 +8625,7 @@ int get_gain_mode(int file_des) { enum gainMode retval = DYNAMIC; LOG(logDEBUG1, ("Getting gain mode\n")); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only @@ -8700,7 +8649,7 @@ int set_gain_mode(int file_des) { enum gainMode gainmode = arg; LOG(logDEBUG1, ("Setting gain mode %d\n", (int)gainmode)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -8736,7 +8685,7 @@ int get_comp_disable_time(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); int64_t retval = -1; -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only @@ -8762,7 +8711,7 @@ int set_comp_disable_time(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting comp disable time %lld ns\n", (long long int)arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -8797,7 +8746,7 @@ int get_flip_rows(int file_des) { LOG(logDEBUG1, ("Getting flip rows\n")); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only @@ -8823,7 +8772,7 @@ int set_flip_rows(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting flip rows: %u\n", (int)arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -8862,7 +8811,7 @@ int get_num_filter_cells(int file_des) { LOG(logDEBUG1, ("Getting number of filter cellsn")); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // get only @@ -8889,7 +8838,7 @@ int set_num_filter_cells(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting number of filter cells: %u\n", (int)arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set @@ -8930,7 +8879,7 @@ int set_adc_pipeline(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting adc pipeline : %u\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) functionNotImplemented(); #else @@ -8952,7 +8901,7 @@ int get_adc_pipeline(int file_des) { LOG(logDEBUG1, ("Getting adc pipeline\n")); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) functionNotImplemented(); #else // get only @@ -9007,7 +8956,7 @@ int get_module_id(int file_des) { memset(mess, 0, sizeof(mess)); int retval = -1; #if !(defined(GOTTHARD2D) || defined(EIGERD) || defined(MYTHEN3D) || \ - defined(JUNGFRAUD)) + defined(JUNGFRAUD) || defined(MOENCHD)) functionNotImplemented(); #else retval = getModuleId(&ret, mess); @@ -9027,8 +8976,8 @@ int get_dest_udp_list(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Getting udp destination list for entry %d\n", arg)); -#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MYTHEN3D) && \ - !defined(GOTTHARD2D) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else if (arg >= MAX_UDP_DESTINATION) { @@ -9095,8 +9044,8 @@ int set_dest_udp_list(int file_des) { getMacAddressinString(mac, MAC_ADDRESS_SIZE, args64[0]); getMacAddressinString(mac2, MAC_ADDRESS_SIZE, args64[1]); -#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MYTHEN3D) && \ - !defined(GOTTHARD2D) +#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \ + !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -9146,7 +9095,7 @@ int set_dest_udp_list(int file_des) { // if still 0, set defaults int twoInterfaces = 0; -#if defined(JUNGFRAUD) || defined(GOTTHARD2D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(GOTTHARD2D) twoInterfaces = getNumberofUDPInterfaces() == 2 ? 1 : 0; #endif udpDetails[entry].srcport = DEFAULT_UDP_SRC_PORTNO; @@ -9217,8 +9166,8 @@ int get_num_dest_list(int file_des) { memset(mess, 0, sizeof(mess)); int retval = -1; -#if !defined(JUNGFRAUD) && !defined(EIGERD) && !defined(MYTHEN3D) && \ - !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(EIGERD) && \ + !defined(MYTHEN3D) && !defined(GOTTHARD2D) functionNotImplemented(); #else retval = numUdpDestinations; @@ -9248,8 +9197,8 @@ int clear_all_udp_dst(int file_des) { // minimum 1 destination in fpga int numdest = 1; // set number of destinations -#if defined(JUNGFRAUD) || defined(EIGERD) || defined(MYTHEN3D) || \ - defined(GOTTHARD2D) +#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) || \ + defined(MYTHEN3D) || defined(GOTTHARD2D) if (setNumberofDestinations(numdest) == FAIL) { ret = FAIL; strcpy(mess, "Could not clear udp destinations to 1 entry.\n"); @@ -9276,7 +9225,8 @@ int get_udp_first_dest(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); int retval = -1; -#if !defined(JUNGFRAUD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(MYTHEN3D) && \ + !defined(GOTTHARD2D) functionNotImplemented(); #else retval = getFirstUDPDestination(); @@ -9294,7 +9244,8 @@ int set_udp_first_dest(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting first udp destination to %d\n", arg)); -#if !defined(JUNGFRAUD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(MYTHEN3D) && \ + !defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -9323,7 +9274,8 @@ int get_readout_speed(int file_des) { int retval = -1; LOG(logDEBUG1, ("Getting readout speed\n")); -#if !defined(JUNGFRAUD) && !defined(EIGERD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(EIGERD) && \ + !defined(GOTTHARD2D) functionNotImplemented(); #else // get only @@ -9346,12 +9298,13 @@ int set_readout_speed(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting readout speed : %u\n", arg)); -#if !defined(JUNGFRAUD) && !defined(EIGERD) && !defined(GOTTHARD2D) +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(EIGERD) && \ + !defined(GOTTHARD2D) functionNotImplemented(); #else // only set if (Server_VerifyLock() == OK) { -#ifdef JUNGFRAUD +#if defined(JUNGFRAUD) || defined(MOENCHD) if (arg == (int)FULL_SPEED && isHardwareVersion_1_0()) { ret = FAIL; strcpy( @@ -9362,7 +9315,7 @@ int set_readout_speed(int file_des) { #endif if (ret == OK) { switch (arg) { -#if defined(EIGERD) || defined(JUNGFRAUD) +#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD) case FULL_SPEED: case HALF_SPEED: case QUARTER_SPEED: @@ -9536,7 +9489,7 @@ void receive_program_via_blackfin(int file_des, enum PROGRAM_INDEX index, char *checksum, char *serverName, int forceDeleteNormalFile) { -#if !defined(JUNGFRAUD) && !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && \ +#if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(CHIPTESTBOARDD) && \ !defined(GOTTHARDD) ret = FAIL; sprintf(mess, @@ -10130,7 +10083,7 @@ int get_synchronization(int file_des) { LOG(logDEBUG1, ("Getting synchronization\n")); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else retval = getSynchronization(); @@ -10147,7 +10100,7 @@ int set_synchronization(int file_des) { return printSocketReadError(); LOG(logDEBUG1, ("Setting synchronization: %u\n", (int)arg)); -#ifndef JUNGFRAUD +#if !defined(JUNGFRAUD) && !defined(MOENCHD) functionNotImplemented(); #else // only set diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 248607ca1..dac27eb56 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -80,16 +80,16 @@ class Detector { Result getDetectorServerVersion(Positions pos = {}) const; - /** [Jungfrau][Gotthard2][Myhten3][Gotthard][Ctb][Moench] */ + /** [Jungfrau][Moench][Gotthard2][Myhten3][Gotthard][Ctb] */ Result getHardwareVersion(Positions pos = {}) const; Result getKernelVersion(Positions pos = {}) const; - /* [Jungfrau][Gotthard][Mythen3][Gotthard2][CTB][Moench] */ + /* [Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][CTB] */ Result getSerialNumber(Positions pos = {}) const; - /** [Eiger][Gotthard2][Mythen3][Jungfrau] 6 bit value (ideally unique) that - * is streamed out in the UDP header of the detector.*/ + /** [Eiger][Gotthard2][Mythen3][Jungfrau][Moench] 6 bit value (ideally + * unique) that is streamed out in the UDP header of the detector.*/ Result getModuleId(Positions pos = {}) const; Result getReceiverVersion(Positions pos = {}) const; @@ -122,14 +122,12 @@ class Detector { /** list of possible settings for this detector */ std::vector getSettingsList() const; - /** [Jungfrau][Gotthard][Gotthard2][Mythen3] */ + /** [Jungfrau][Moench][Gotthard][Gotthard2][Mythen3] */ Result getSettings(Positions pos = {}) const; - /** [Jungfrau] GAIN0, HIGHGAIN0 \n [Gotthard] DYNAMICGAIN, HIGHGAIN, + /** [Jungfrau][Moench] GAIN0, HIGHGAIN0 \n [Gotthard] DYNAMICGAIN, HIGHGAIN, * LOWGAIN, MEDIUMGAIN, VERYHIGHGAIN \n [Gotthard2] DYNAMICGAIN, - * FIXGAIN1, FIXGAIN2 \n [Moench] G1_HIGHGAIN, G1_LOWGAIN, - * G2_HIGHCAP_HIGHGAIN, G2_HIGHCAP_LOWGAIN, G2_LOWCAP_HIGHGAIN, - * G2_LOWCAP_LOWGAIN, G4_HIGHGAIN, G4_LOWGAIN \n [Mythen3] STANDARD, FAST, + * FIXGAIN1, FIXGAIN2 \n [Mythen3] STANDARD, FAST, * HIGHGAIN. Also changes vrshaper and vrpreamp \n [Eiger] Use threshold * command. Settings loaded from file found in settingspath */ @@ -179,38 +177,39 @@ class Detector { * files exist in corresponding trim folders */ void setTrimEnergies(std::vector energies, Positions pos = {}); - /**[Eiger][Jungfrau] */ + /**[Eiger][Jungfrau][Moench] */ bool getGapPixelsinCallback() const; /** - * [Eiger][Jungfrau] + * [Eiger][Jungfrau][Moench] * Include gap pixels in client data call back. Will not be in detector * streaming, receiver file or streaming. Default is disabled. */ void setGapPixelsinCallback(const bool enable); - /** [Eiger][Jungfrau] */ + /** [Eiger][Jungfrau][Moench] */ Result getFlipRows(Positions pos = {}) const; /** [Eiger] flips rows paramater sent to slsreceiver to stream as json - * parameter to flip rows in gui \n[Jungfrau] flips rows in the detector - * itself. For bottom module and number of interfaces must be set to 2. - * slsReceiver and slsDetectorGui does not handle.slsReceiver and + * parameter to flip rows in gui \n[Jungfrau][Moench] flips rows in the + * detector itself. For bottom module and number of interfaces must be set + * to 2. slsReceiver and slsDetectorGui does not handle.slsReceiver and * slsDetectorGui does not handle */ void setFlipRows(bool value, Positions pos = {}); - /** [Eiger][Mythen3][Gotthard1][Gotthard2][Jungfrau] via stop server **/ + /** [Eiger][Mythen3][Gotthard1][Gotthard2][Jungfrau][Moench] via stop server + * **/ Result getMaster(Positions pos = {}) const; - /** [Eiger][Gotthard2][Jungfrau] Set (half) module to master and the + /** [Eiger][Gotthard2][Jungfrau][Moench] Set (half) module to master and the * other(s) to slaves */ void setMaster(bool value, int pos); - /** [Jungfrau] **/ + /** [Jungfrau][Moench] **/ Result getSynchronization(Positions pos = {}) const; - /** [Jungfrau] */ + /** [Jungfrau][Moench] */ void setSynchronization(bool value); /** [Gotthard2][Mythen3] */ @@ -274,11 +273,11 @@ class Detector { void setNumberOfTriggers(int64_t value); - /** [Gotthard][Jungfrau][Eiger][CTB][Moench][Gotthard2] \n + /** [Gotthard][Jungfrau][Moench][Eiger][CTB][Gotthard2] \n * [Mythen3] use function with gate index **/ Result getExptime(Positions pos = {}) const; - /** [Gotthard][Jungfrau][Eiger][CTB][Moench][Gotthard2] \n + /** [Gotthard][Jungfrau][Moench][Eiger][CTB][Gotthard2] \n * [Mythen3] sets exptime for all gate signals. To specify gate index, use * function with gate index **/ void setExptime(ns t, Positions pos = {}); @@ -287,25 +286,25 @@ class Detector { void setPeriod(ns t, Positions pos = {}); - /** [Gotthard][Jungfrau][CTB][Moench][Mythen3][Gotthard2] */ + /** [Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] */ Result getDelayAfterTrigger(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Moench][Mythen3][Gotthard2] */ + /** [Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] */ void setDelayAfterTrigger(ns value, Positions pos = {}); - /** [Gotthard][Jungfrau][CTB][Moench][Mythen3] + /** [Gotthard][Jungfrau][Moench][CTB][Mythen3] * [Gotthard2] only in continuous auto mode */ Result getNumberOfFramesLeft(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Moench][Mythen3] + /** [Gotthard][Jungfrau][Moench][CTB][Mythen3] * Only when external trigger used */ Result getNumberOfTriggersLeft(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Moench][Mythen3][Gotthard2] + /** [Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2] * [Gotthard2] only in continuous mode */ Result getPeriodLeft(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Moench][Mythen3] + /** [Gotthard][Jungfrau][Moench][CTB][Mythen3] * [Gotthard2] only in continuous mode */ Result getDelayAfterTriggerLeft(Positions pos = {}) const; @@ -314,7 +313,7 @@ class Detector { /** * [Eiger] Options: 4, 8, 12, 16, 32. If i is 32, also sets clkdivider to 2, * else sets clkdivider to 1 \n [Mythen3] Options: 8, 16, 32 \n - * [Jungfrau][Gotthard][Ctb][Moench][Mythen3][Gotthard2] 16 + * [Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16 */ void setDynamicRange(int value); @@ -324,7 +323,7 @@ class Detector { Result getTimingMode(Positions pos = {}) const; /** - * [Gotthard][Jungfrau][Gotthard][CTB][Moench][Gotthard2] Options: + * [Gotthard][Jungfrau][Moench][Gotthard][CTB][Gotthard2] Options: * AUTO_TIMING, TRIGGER_EXPOSURE \n * [Mythen3] Options: AUTO_TIMING, TRIGGER_EXPOSURE, GATED, TRIGGER_GATED \n * [Eiger] Options: AUTO_TIMING, TRIGGER_EXPOSURE, GATED, BURST_TRIGGER @@ -334,64 +333,62 @@ class Detector { /** list of possible timing modes for this detector */ std::vector getTimingModeList() const; - /** [Eiger][Jungfrau][Gotthard2] */ + /** [Eiger][Jungfrau][Moench][Gotthard2] */ Result getReadoutSpeed(Positions pos = {}) const; - /** [Eiger][Jungfrau][Gotthard2] - * [Jungfrau] Options: FULL_SPEED, HALF_SPEED (Default), QUARTER_SPEED \n - * [Eiger] Options: FULL_SPEED (Default), HALF_SPEED, QUARTER_SPEED \n - * [Gotthard2] Options: G2_108MHZ (Default), G2_144MHZ \n - * [Jungfrau] FULL_SPEED option only available from v2.0 boards and is - * recommended to set number of interfaces to 2. \n Also overwrites adcphase - * to recommended default. + /** [Eiger][Jungfrau][Moench][Gotthard2] + * [Jungfrau][Moench] Options: FULL_SPEED, HALF_SPEED (Default), + * QUARTER_SPEED \n [Eiger] Options: FULL_SPEED (Default), HALF_SPEED, + * QUARTER_SPEED \n [Gotthard2] Options: G2_108MHZ (Default), G2_144MHZ \n + * [Jungfrau][Moench] FULL_SPEED option only available from v2.0 boards and + * is recommended to set number of interfaces to 2. \n Also overwrites + * adcphase to recommended default. */ void setReadoutSpeed(defs::speedLevel value, Positions pos = {}); /** list of possible readoutspeed modes for this detector */ std::vector getReadoutSpeedList() const; - /** [Jungfrau][CTB][Moench] */ + /** [Jungfrau][Moench][CTB] */ Result getADCPhase(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Moench] - * [Jungfrau] Absolute phase shift. Changing Speed also resets adcphase to - * recommended defaults. \n - * [Ctb][Moench] Absolute phase shift. Changing adcclk also resets adcphase - * and sets it to previous values. \n - * [Gotthard] Relative phase shift + /** [Gotthard][Jungfrau][Moench][CTB] + * [Jungfrau][Moench] Absolute phase shift. Changing Speed also resets + * adcphase to recommended defaults. \n [Ctb] Absolute phase shift. Changing + * adcclk also resets adcphase and sets it to previous values. \n [Gotthard] + * Relative phase shift */ void setADCPhase(int value, Positions pos = {}); - /** [Jungfrau][CTB][Moench] */ + /** [Jungfrau][Moench][CTB] */ Result getMaxADCPhaseShift(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Moench] */ + /** [Gotthard][Jungfrau][Moench][CTB] */ Result getADCPhaseInDegrees(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Moench] - * [Jungfrau] Absolute phase shift. Changing Speed also resets adcphase to - * recommended defaults. \n - * [Ctb][Moench] Absolute phase shift. Changing adcclk also resets adcphase - * and sets it to previous values. \n - * [Gotthard] Relative phase shift + /** [Gotthard][Jungfrau][Moench][CTB] + * [Jungfrau][Moench] Absolute phase shift. Changing Speed also resets + * adcphase to recommended defaults. \n [Ctb] Absolute phase shift. Changing + * adcclk also resets adcphase and sets it to previous values. \n [Gotthard] + * Relative phase shift */ void setADCPhaseInDegrees(int value, Positions pos = {}); - /** [CTB][Jungfrau] */ + /** [CTB][Jungfrau][Moench] */ Result getDBITPhase(Positions pos = {}) const; - /** [CTB][Jungfrau] Absolute phase shift \n + /** [CTB][Jungfrau][Moench] Absolute phase shift \n * [CTB] changing dbitclk also resets dbitphase and sets to previous values. */ void setDBITPhase(int value, Positions pos = {}); - /** [CTB][Jungfrau] */ + /** [CTB][Jungfrau][Moench] */ Result getMaxDBITPhaseShift(Positions pos = {}) const; - /** [CTB][Jungfrau] */ + /** [CTB][Jungfrau][Moench] */ Result getDBITPhaseInDegrees(Positions pos = {}) const; - /** [CTB][Jungfrau] Absolute phase shift \n + /** [CTB][Jungfrau][Moench] Absolute phase shift \n * [CTB] changing dbitclk also resets dbitphase and sets to previous values. */ void setDBITPhaseInDegrees(int value, Positions pos = {}); @@ -424,18 +421,18 @@ class Detector { /** * [Gotthard] Options: 0, 90, 110, 120, 150, 180, 200 - * [Jungfrau][CTB][Moench] Options: 0, 60 - 200 + * [Jungfrau][Moench][CTB] Options: 0, 60 - 200 * [Eiger][Mythen3][Gotthard2] Options: 0 - 200 */ void setHighVoltage(int value, Positions pos = {}); - /** [Jungfrau][Mythen3][Gotthard2][Moench] */ + /** [Jungfrau][Moench][Mythen3][Gotthard2] */ Result getPowerChip(Positions pos = {}) const; - /** [Jungfrau][Mythen3][Gotthard2][Moench] Power the chip. \n - * [Moench] Default is disabled. \n - * [Jungfrau] Default is disabled. Get will return power status. Can be off - * if temperature event occured (temperature over temp_threshold with + /** [Jungfrau][Moench][Mythen3][Gotthard2] Power the chip. \n + * Default is disabled. \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. @@ -447,8 +444,8 @@ class Detector { /** [Gotthard] If 1, adds channel intensity with precalculated values. * Default is 0 \n - * [Eiger][Jungfrau] Only for virtual servers, if 1, pixels are saturated. - * If 0, increasing intensity */ + * [Eiger][Jungfrau][Moench] Only for virtual servers, if 1, pixels are + * saturated. If 0, increasing intensity */ void setImageTestMode(const int value, Positions pos = {}); /** gets list of temperature indices for this detector */ @@ -458,7 +455,7 @@ class Detector { * (Degrees) * [Mythen3][Gotthard2] Options: TEMPERATURE_FPGA * [Gotthard] Options: TEMPERATURE_ADC, TEMPERATURE_FPGA \n - * [Jungfrau] Options: TEMPERATURE_ADC, TEMPERATURE_FPGA \n + * [Jungfrau][Moench] Options: TEMPERATURE_ADC, TEMPERATURE_FPGA \n * [Eiger] Options: TEMPERATURE_FPGA, TEMPERATURE_FPGAEXT, TEMPERATURE_10GE, * TEMPERATURE_DCDC, TEMPERATURE_SODL, TEMPERATURE_SODR, TEMPERATURE_FPGA2, * TEMPERATURE_FPGA3 \n [CTB] Options: SLOW_ADC_TEMP @@ -475,11 +472,11 @@ class Detector { void setDefaultDac(defs::dacIndex index, int defaultValue, Positions pos = {}); - /** [Jungfrau][Mythen3] */ + /** [Jungfrau][Moench][Mythen3] */ Result getDefaultDac(defs::dacIndex index, defs::detectorSettings sett, Positions pos = {}); - /** [Jungfrau][Mythen3] */ + /** [Jungfrau][Moench][Mythen3] */ void setDefaultDac(defs::dacIndex index, int defaultValue, defs::detectorSettings sett, Positions pos = {}); @@ -528,20 +525,21 @@ class Detector { * mode.*/ void setParallelMode(bool value, Positions pos = {}); - /** [Gotthard2][Jungfrau] */ + /** [Gotthard2][Jungfrau][Moench] */ Result getFilterResistor(Positions pos = {}) const; - /** [Gotthard2][Jungfrau] Set filter resistor. Increasing values for + /** [Gotthard2][Jungfrau][Moench] Set filter resistor. Increasing values for * increasing resistance.\n[Gotthard2] Options: [0|1|2|3]. Default is - * 0.\n[Jungfrau] Options: [0|1]. Default is 1.*/ + * 0.\n[Jungfrau][Moench] Options: [0|1]. Default is 1.*/ void setFilterResistor(int value, Positions pos = {}); - /** [Gotthard2][Jungfrau] */ + /** [Gotthard2][Jungfrau][Moench] */ Result getCurrentSource(Positions pos = {}) const; - /** [Gotthard2][Jungfrau] Please refer documentation on currentSrcParameters - * (sls_detector_defs.h) on the structure and its members */ + /** [Gotthard2][Jungfrau][Moench] Please refer documentation on + * currentSrcParameters (sls_detector_defs.h) on the structure and its + * members */ void setCurrentSource(defs::currentSrcParameters par, Positions pos = {}); /** [CTB][Gotthard2] */ @@ -550,14 +548,14 @@ class Detector { /** [CTB] Options: 0-255 \n [Gotthard2] Options: 0-7 */ void setDBITPipeline(int value, Positions pos = {}); - /** [Eiger][Jungfrau] */ + /** [Eiger][Jungfrau][Moench] */ Result getReadNRows(Positions pos = {}) const; /** [Eiger] Number of rows to read out per half module * Options: 0 - 256. 256 is default. The permissible values depend on - * dynamic range and 10Gbe enabled. \n[Jungfrau] Number of rows per module - * starting from the centre. Options: 8 - 512, must be multiples of 8. - * Default is 512. + * dynamic range and 10Gbe enabled. \n[Jungfrau][Moench] Number of rows per + * module starting from the centre. Options: 8 - 512, must be multiples + * of 8. Default is 512. */ void setReadNRows(const int lines, Positions pos = {}); @@ -636,10 +634,9 @@ class Detector { * different frame numbers for different modules.*/ void setNextFrameNumber(uint64_t value, Positions pos = {}); - /** [Eiger][Mythen3][Jungfrau] Sends an internal software trigger to the - * detector block true if command blocks till frames are sent out from that - * trigger - * [Eiger][Jungfrau] Block can be true + /** [Eiger][Mythen3][Jungfrau][Moench] Sends an internal software trigger to + * the detector block true if command blocks till frames are sent out from + * that trigger [Eiger][Jungfrau][Moench] Block can be true */ void sendSoftwareTrigger(const bool block = false, Positions pos = {}); @@ -665,23 +662,23 @@ class Detector { * * * ************************************************/ - /** [Jungfrau][Gotthard2][Eiger] */ + /** [Jungfrau][Moench][Gotthard2][Eiger] */ Result getNumberofUDPInterfaces(Positions pos = {}) const; - /** [Jungfrau][Gotthard2] Number of udp interfaces to stream data from - * detector. Default is 1. \n Also enables second interface in receiver for - * listening (Writes a file per interface if writing enabled). \n Also + /** [Jungfrau][Moench][Gotthard2] Number of udp interfaces to stream data + * from detector. Default is 1. \n Also enables second interface in receiver + * for listening (Writes a file per interface if writing enabled). \n Also * restarts client and receiver zmq sockets if zmq streaming enabled. \n * [Gotthard2] second interface enabled to send veto information via 10Gbps * for debugging. By default, if veto enabled, it is sent via 2.5 gbps * interface. */ void setNumberofUDPInterfaces(int n, Positions pos = {}); - /** [Jungfrau] */ + /** [Jungfrau][Moench] */ Result getSelectedUDPInterface(Positions pos = {}) const; /** - * [Jungfrau] + * [Jungfrau][Moench] * Effective only when number of interfaces is 1. * Options: 0 (outer, default), 1(inner)] //TODO: enum? */ @@ -695,11 +692,11 @@ class Detector { */ void setSourceUDPIP(const IpAddr ip, Positions pos = {}); - /** [Jungfrau] bottom half [Gotthard2] veto debugging */ + /** [Jungfrau][Moench] bottom half [Gotthard2] veto debugging */ Result getSourceUDPIP2(Positions pos = {}) const; - /** [Jungfrau] bottom half [Gotthard2] veto debugging. \n The source UDP IP - * must be in the same subnet of the destination UDP IP2 */ + /** [Jungfrau][Moench] bottom half [Gotthard2] veto debugging. \n The source + * UDP IP must be in the same subnet of the destination UDP IP2 */ void setSourceUDPIP2(const IpAddr ip, Positions pos = {}); Result getSourceUDPMAC(Positions pos = {}) const; @@ -710,10 +707,10 @@ class Detector { */ void setSourceUDPMAC(const MacAddr mac, Positions pos = {}); - /** [Jungfrau] bottom half [Gotthard2] veto debugging */ + /** [Jungfrau][Moench] bottom half [Gotthard2] veto debugging */ Result getSourceUDPMAC2(Positions pos = {}) const; - /** [Jungfrau] bottom half [Gotthard2] veto debugging */ + /** [Jungfrau][Moench] bottom half [Gotthard2] veto debugging */ void setSourceUDPMAC2(const MacAddr mac, Positions pos = {}); Result getDestinationUDPList(const uint32_t entry, @@ -721,16 +718,16 @@ class Detector { void setDestinationUDPList(const UdpDestination, const int module_id); - /** [Jungfrau][Eiger][Mythen3][Gotthard2] */ + /** [Jungfrau][Moench][Eiger][Mythen3][Gotthard2] */ Result getNumberofUDPDestinations(Positions pos = {}) const; void clearUDPDestinations(Positions pos = {}); - /** [Jungfrau][Mythen3][Gotthard2] */ + /** [Jungfrau][Moench][Mythen3][Gotthard2] */ Result getFirstUDPDestination(Positions pos = {}) const; - /**[Jungfrau][Gotthard2] Options 0-31 (or number of udp destinations)\n - * [Mythen3] Options 0-63 (or number of udp destinations) + /**[Jungfrau][Moench][Gotthard2] Options 0-31 (or number of udp + * destinations)\n [Mythen3] Options 0-63 (or number of udp destinations) */ void setFirstUDPDestination(const int value, Positions pos = {}); @@ -739,10 +736,10 @@ class Detector { /** IP of the interface in receiver that the detector sends data to */ void setDestinationUDPIP(const IpAddr ip, Positions pos = {}); - /** [Jungfrau] bottom half \n [Gotthard2] veto debugging */ + /** [Jungfrau][Moench] bottom half \n [Gotthard2] veto debugging */ Result getDestinationUDPIP2(Positions pos = {}) const; - /** [Jungfrau] bottom half \n [Gotthard2] veto debugging */ + /** [Jungfrau][Moench] bottom half \n [Gotthard2] veto debugging */ void setDestinationUDPIP2(const IpAddr ip, Positions pos = {}); Result getDestinationUDPMAC(Positions pos = {}) const; @@ -754,14 +751,15 @@ class Detector { */ void setDestinationUDPMAC(const MacAddr mac, Positions pos = {}); - /** [Jungfrau] bottom half \n [Gotthard2] veto debugging */ + /** [Jungfrau][Moench] bottom half \n [Gotthard2] veto debugging */ Result getDestinationUDPMAC2(Positions pos = {}) const; - /* [Jungfrau][Gotthard2] Mac address of the receiver (destination) udp - * interface 2. \n Not mandatory to set as udp_dstip2 retrieves it from + /* [Jungfrau][Moench][Gotthard2] Mac address of the receiver (destination) + * udp interface 2. \n Not mandatory to set as udp_dstip2 retrieves it from * slsReceiver process but must be set if you use a custom receiver (not - * slsReceiver). \n [Jungfrau] bottom half \n [Gotthard2] veto debugging \n - * Use router mac address if router in between detector and receiver. + * slsReceiver). \n [Jungfrau][Moench] bottom half \n [Gotthard2] veto + * debugging \n Use router mac address if router in between detector and + * receiver. */ void setDestinationUDPMAC2(const MacAddr mac, Positions pos = {}); @@ -771,12 +769,13 @@ class Detector { * calculated (incremented by 1 if no 2nd interface) */ void setDestinationUDPPort(int port, int module_id = -1); - /** [Eiger] right port[Jungfrau] bottom half [Gotthard2] veto debugging */ + /** [Eiger] right port[Jungfrau][Moench] bottom half [Gotthard2] veto + * debugging */ Result getDestinationUDPPort2(Positions pos = {}) const; - /** [Eiger] right port[Jungfrau] bottom half [Gotthard2] veto debugging \n - * Default is 50002. \n If module_id is -1, ports for each module is - * calculated (incremented by 1 if no 2nd interface)*/ + /** [Eiger] right port[Jungfrau][Moench] bottom half [Gotthard2] veto + * debugging \n Default is 50002. \n If module_id is -1, ports for each + * module is calculated (incremented by 1 if no 2nd interface)*/ void setDestinationUDPPort2(int port, int module_id = -1); /** Reconfigures Detector with UDP destination. More for debugging as the @@ -791,27 +790,28 @@ class Detector { Result printRxConfiguration(Positions pos = {}) const; - /** [Eiger][CTB][Moench][Mythen3] */ + /** [Eiger][CTB][Mythen3] */ Result getTenGiga(Positions pos = {}) const; - /** [Eiger][CTB][Moench][Mythen3] */ + /** [Eiger][CTB][Mythen3] */ void setTenGiga(bool value, Positions pos = {}); - /** [Eiger][Jungfrau] */ + /** [Eiger][Jungfrau][Moench] */ Result getTenGigaFlowControl(Positions pos = {}) const; - /** [Eiger][Jungfrau] */ + /** [Eiger][Jungfrau][Moench] */ void setTenGigaFlowControl(bool enable, Positions pos = {}); - /** [Eiger][Jungfrau][Mythen3] */ + /** [Eiger][Jungfrau][Moench][Mythen3] */ Result getTransmissionDelayFrame(Positions pos = {}) const; /** - * Eiger][Jungfrau][Mythen3] Transmission delay of first udp packet being - * streamed out of the module.\n[Jungfrau] [0-31] Each value represents 1 - * ms\n[Eiger] Additional delay to txndelay_left and txndelay_right. Each - * value represents 10ns. Typical value is 50000.\n[Mythen3] [0-16777215] - * Each value represents 8 ns (125 MHz clock), max is 134 ms. + * Eiger][Jungfrau][Moench][Mythen3] Transmission delay of first udp packet + * being streamed out of the module.\n[Jungfrau][Moench] [0-31] Each value + * represents 1 ms\n[Eiger] Additional delay to txndelay_left and + * txndelay_right. Each value represents 10ns. Typical value is + * 50000.\n[Mythen3] [0-16777215] Each value represents 8 ns (125 MHz + * clock), max is 134 ms. */ void setTransmissionDelayFrame(int value, Positions pos = {}); @@ -836,16 +836,16 @@ class Detector { */ void setTransmissionDelayRight(int value, Positions pos = {}); - /** [Eiger][Jungfrau] */ + /** [Eiger][Jungfrau][Moench] */ int getTransmissionDelay() const; /** - * [Eiger][Jungfrau][Mythen3] Set transmission delay for all modules in the - * detector using the step size provided.Sets up \n\t\t[Eiger] txdelay_left - * to (2 * mod_index * n_delay), \n\t\t[Eiger] txdelay_right to ((2 * - * mod_index + 1) * n_delay) and \n\t\t[Eiger] txdelay_frame to (2 - * *num_modules * n_delay) \n\t\t[Jungfrau][Mythen3] txdelay_frame to - * (num_modules * n_delay) \nfor every module. + * [Eiger][Jungfrau][Moench][Mythen3] Set transmission delay for all modules + * in the detector using the step size provided.Sets up \n\t\t[Eiger] + * txdelay_left to (2 * mod_index * n_delay), \n\t\t[Eiger] txdelay_right to + * ((2 * mod_index + 1) * n_delay) and \n\t\t[Eiger] txdelay_frame to (2 + * *num_modules * n_delay) \n\t\t[Jungfrau][Moench][Mythen3] txdelay_frame + * to (num_modules * n_delay) \nfor every module. */ void setTransmissionDelay(int step); @@ -1226,22 +1226,22 @@ class Detector { ///@} - /** @name Jungfrau Specific */ + /** @name Jungfrau/Moench Specific */ ///@{ /************************************************** * * - * Jungfrau Specific * + * Jungfrau/Moench Specific * * * * ************************************************/ - /** [Jungfrau] */ + /** [Jungfrau][Moench] */ Result getChipVersion(Positions pos = {}) const; - /** [Jungfrau] */ + /** [Jungfrau][Moench] */ Result getThresholdTemperature(Positions pos = {}) const; /** - * [Jungfrau]Set threshold temperature in degrees. + * [Jungfrau][Moench]Set threshold temperature in degrees. * If temperature crosses threshold temperature * and temperature control is enabled (default is disabled), power to chip * will be switched off and temperature event will be set. \n To power on @@ -1250,23 +1250,23 @@ class Detector { */ void setThresholdTemperature(int temp, Positions pos = {}); - /** [Jungfrau] */ + /** [Jungfrau][Moench] */ Result getTemperatureControl(Positions pos = {}) const; - /** [Jungfrau] refer to setThresholdTemperature + /** [Jungfrau][Moench] refer to setThresholdTemperature * Default is disabled */ void setTemperatureControl(bool enable, Positions pos = {}); - /** [Jungfrau] refer to setThresdholdTemperature */ + /** [Jungfrau][Moench] refer to setThresdholdTemperature */ Result getTemperatureEvent(Positions pos = {}) const; - /** [Jungfrau] refer to setThresdholdTemperature */ + /** [Jungfrau][Moench] refer to setThresdholdTemperature */ void resetTemperatureEvent(Positions pos = {}); - /** [Jungfrau] */ + /** [Jungfrau][Moench] */ Result getAutoComparatorDisable(Positions pos = {}) const; - /** [Jungfrau] Advanced + /** [Jungfrau][Moench] Advanced * //TODO naming * By default, the on-chip gain switching is active during the * entire exposure. This mode disables the on-chip gain switching comparator @@ -1278,55 +1278,55 @@ class Detector { */ void setAutoComparatorDisable(bool value, Positions pos = {}); - /** [Jungfrau] */ + /** [Jungfrau][Moench] */ Result getComparatorDisableTime(Positions pos = {}) const; - /** [Jungfrau] Time before end of exposure when comparator is disabled. It - * is only possible for chipv1.1.*/ + /** [Jungfrau][Moench] Time before end of exposure when comparator is + * disabled. It is only possible for chipv1.1.*/ void setComparatorDisableTime(ns t, Positions pos = {}); - /** [Jungfrau] Advanced TODO naming */ + /** [Jungfrau][Moench] Advanced TODO naming */ Result getNumberOfAdditionalStorageCells(Positions pos = {}) const; - /** [Jungfrau] Advanced \n + /** [Jungfrau][Moench] Advanced \n * Only for chipv1.0. Options: 0 - 15. Default: 0. \n * The #images = #frames x #triggers x (#storagecells + 1) */ void setNumberOfAdditionalStorageCells(int value); - /** [Jungfrau] Advanced */ + /** [Jungfrau][Moench] Advanced */ Result getStorageCellStart(Positions pos = {}) const; - /** [Jungfrau] Advanced. Sets the storage cell storing the first acquisition - * of the series. Options: 0-max. max is 15 (default) for chipv1.0 and 3 - * (default) for chipv1.1. + /** [Jungfrau][Moench] Advanced. Sets the storage cell storing the first + * acquisition of the series. Options: 0-max. max is 15 (default) for + * chipv1.0 and 3 (default) for chipv1.1. */ void setStorageCellStart(int cell, Positions pos = {}); - /** [Jungfrau] Advanced*/ + /** [Jungfrau][Moench] Advanced*/ Result getStorageCellDelay(Positions pos = {}) const; - /** [Jungfrau] Advanced \n Additional time delay between 2 consecutive - * exposures in burst mode. \n Options: (0-1638375 ns (resolution of 25ns)\n - * Only applicable for chipv1.0. + /** [Jungfrau][Moench] Advanced \n Additional time delay between 2 + * consecutive exposures in burst mode. \n Options: (0-1638375 ns + * (resolution of 25ns)\n Only applicable for chipv1.0. */ void setStorageCellDelay(ns value, Positions pos = {}); /** list of possible gainmode */ std::vector getGainModeList() const; - /** [Jungfrau]*/ + /** [Jungfrau][Moench]*/ Result getGainMode(Positions pos = {}) const; - /** [Jungfrau] Options: DYNAMIC, FORCE_SWITCH_G1, FORCE_SWITCH_G2, + /** [Jungfrau][Moench] Options: DYNAMIC, FORCE_SWITCH_G1, FORCE_SWITCH_G2, * FIX_G1, FIX_G2, FIX_G0 \n\CAUTION: Do not use FIX_G0 without caution, you * can damage the detector!!!\n */ void setGainMode(const defs::gainMode mode, Positions pos = {}); - /** [Jungfrau] Advanced */ + /** [Jungfrau][Moench] Advanced */ Result getNumberOfFilterCells(Positions pos = {}) const; - /** [Jungfrau] Advanced Options[0-12], only for chip v1.1 + /** [Jungfrau][Moench] Advanced Options[0-12], only for chip v1.1 */ void setNumberOfFilterCells(int cell, Positions pos = {}); @@ -1557,69 +1557,68 @@ class Detector { ///@} - /** @name CTB / Moench Specific */ + /** @name CTB Specific */ ///@{ /************************************************** * * - * CTB / Moench Specific * + * CTB Specific * * * * ************************************************/ - /** [CTB][Moench] */ + /** [CTB] */ Result getNumberOfAnalogSamples(Positions pos = {}) const; - /** [CTB][Moench] */ + /** [CTB] */ void setNumberOfAnalogSamples(int value, Positions pos = {}); - /** [CTB][Moench] */ + /** [CTB] */ Result getADCClock(Positions pos = {}) const; - /** [CTB][Moench] */ + /** [CTB] */ void setADCClock(int value_in_MHz, Positions pos = {}); - /** [CTB][Moench] */ + /** [CTB] */ Result getRUNClock(Positions pos = {}) const; - /** [CTB][Moench] */ + /** [CTB] */ void setRUNClock(int value_in_MHz, Positions pos = {}); - /** [CTB][Moench] in MHZ */ + /** [CTB] in MHZ */ Result getSYNCClock(Positions pos = {}) const; - /** [CTB][Moench] */ + /** [CTB] */ Result getADCPipeline(Positions pos = {}) const; - /** [CTB][Moench] */ + /** [CTB] */ void setADCPipeline(int value, Positions pos = {}); - /** [CTB][Moench] */ + /** [CTB] */ Result getVoltage(defs::dacIndex index, Positions pos = {}) const; /** - * [CTB][Moench] mV + * [CTB] mV * [Ctb] Options: V_LIMIT, V_POWER_A, V_POWER_B, V_POWER_C, * V_POWER_D, V_POWER_IO, V_POWER_CHIP - * [Moench] Options: V_LIMIT */ void setVoltage(defs::dacIndex index, int value, Positions pos = {}); /** - * [CTB][Moench] Options: [0- 4] or [1V, 1.14V, 1.33V, 1.6V, 2V] + * [CTB] Options: [0- 4] or [1V, 1.14V, 1.33V, 1.6V, 2V] */ Result getADCVpp(bool mV = false, Positions pos = {}) const; - /** [CTB][Moench] */ + /** [CTB] */ void setADCVpp(int value, bool mV = false, Positions pos = {}); - /** [CTB][Moench] */ + /** [CTB] */ Result getADCEnableMask(Positions pos = {}) const; - /** [CTB][Moench] */ + /** [CTB] */ void setADCEnableMask(uint32_t mask, Positions pos = {}); - /** [CTB][Moench] */ + /** [CTB] */ Result getTenGigaADCEnableMask(Positions pos = {}) const; - /** [CTB][Moench] If any of a consecutive 4 bits are enabled, the " + /** [CTB] If any of a consecutive 4 bits are enabled, the " "complete 4 bits are enabled */ void setTenGigaADCEnableMask(uint32_t mask, Positions pos = {}); ///@} @@ -1721,78 +1720,78 @@ class Detector { * * * ************************************************/ - /** [CTB][Moench][Mythen3] Loads ASCII pattern file directly to server + /** [CTB][Mythen3] Loads ASCII pattern file directly to server * (instead of executing line by line)*/ void setPattern(const std::string &fname, Positions pos = {}); - /** [CTB][Moench][Mythen3] Loads pattern parameters structure directly to + /** [CTB][Mythen3] Loads pattern parameters structure directly to * server */ void setPattern(const Pattern &pat, Positions pos = {}); - /** [CTB][Moench][Mythen3] [Ctb][Moench][Mythen3] Saves pattern to file - * (ascii). \n [Ctb][Moench] Also executes pattern.*/ + /** [CTB][Mythen3] [Ctb][Mythen3] Saves pattern to file + * (ascii). \n [Ctb] Also executes pattern.*/ void savePattern(const std::string &fname); - /** [Mythen3][Moench] Loads and runs default pattern */ + /** [Mythen3] Loads and runs default pattern */ void loadDefaultPattern(Positions pos = {}); - /** [CTB][Moench] */ + /** [CTB] */ Result getPatternIOControl(Positions pos = {}) const; - /** [CTB][Moench] */ + /** [CTB] */ void setPatternIOControl(uint64_t word, Positions pos = {}); - /** [CTB][Moench][Mythen3] same as executing for ctb and moench */ + /** [CTB][Mythen3] same as executing for ctb */ Result getPatternWord(int addr, Positions pos = {}); - /** [CTB][Moench] Caution: If word is -1 reads the addr (same as + /** [CTB] Caution: If word is -1 reads the addr (same as * executing the pattern) * [Mythen3] */ void setPatternWord(int addr, uint64_t word, Positions pos = {}); - /**[CTB][Moench][Mythen3] Options: level: -1 (complete pattern) and 0-2 + /**[CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 * levels * @returns array of start address and stop address */ Result> getPatternLoopAddresses(int level, Positions pos = {}) const; - /** [CTB][Moench][Mythen3] Options: level: -1 (complete pattern) and 0-2 + /** [CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 * levels */ void setPatternLoopAddresses(int level, int start, int stop, Positions pos = {}); - /**[CTB][Moench][Mythen3] Options: level: -1 (complete pattern) and 0-2 + /**[CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 * levels */ Result getPatternLoopCycles(int level, Positions pos = {}) const; - /** [CTB][Moench][Mythen3] n: 0-2, level: -1 (complete pattern) and 0-2 + /** [CTB][Mythen3] n: 0-2, level: -1 (complete pattern) and 0-2 * levels */ void setPatternLoopCycles(int level, int n, Positions pos = {}); - /**[CTB][Moench][Mythen3] */ + /**[CTB][Mythen3] */ Result getPatternWaitAddr(int level, Positions pos = {}) const; - /** [CTB][Moench][Mythen3] Options: level 0-2 */ + /** [CTB][Mythen3] Options: level 0-2 */ void setPatternWaitAddr(int level, int addr, Positions pos = {}); - /** [CTB][Moench][Mythen3] */ + /** [CTB][Mythen3] */ Result getPatternWaitTime(int level, Positions pos = {}) const; - /** [CTB][Moench][Mythen3] Options: level 0-2 */ + /** [CTB][Mythen3] Options: level 0-2 */ void setPatternWaitTime(int level, uint64_t t, Positions pos = {}); - /** [CTB][Moench][Mythen3] */ + /** [CTB][Mythen3] */ Result getPatternMask(Positions pos = {}); - /** [CTB][Moench][Mythen3] Selects the bits that will have a pattern mask + /** [CTB][Mythen3] Selects the bits that will have a pattern mask * applied to the selected patmask for every pattern. */ void setPatternMask(uint64_t mask, Positions pos = {}); - /** [CTB][Moench][Mythen3] */ + /** [CTB][Mythen3] */ Result getPatternBitMask(Positions pos = {}) const; - /** [CTB][Moench][Mythen3] Sets the mask applied to every pattern to the + /** [CTB][Mythen3] Sets the mask applied to every pattern to the * selected bits */ void setPatternBitMask(uint64_t mask, Positions pos = {}); @@ -1800,19 +1799,18 @@ class Detector { void startPattern(Positions pos = {}); ///@} - /** @name Moench specific */ + /** @name Json Header specific */ ///@{ /************************************************** * * - * Moench specific * + * Json Header specific * * * * ************************************************/ - /** [Moench] */ Result> getAdditionalJsonHeader(Positions pos = {}) const; - /** [Moench] If empty, reset additional json header. Default is empty. Max + /** If empty, reset additional json header. Default is empty. Max * 20 characters for each key/value. Empty value deletes header. Use only if * to be processed by an intermediate user process listening to receiver zmq * packets such as in Moench */ @@ -1820,11 +1818,9 @@ class Detector { const std::map &jsonHeader, Positions pos = {}); - /** [Moench] */ Result getAdditionalJsonParameter(const std::string &key, Positions pos = {}) const; /** - * [Moench] * Sets the value for additional json header parameters. If not found, * the pair is appended. Empty value deletes parameter. Max 20 characters * for each key/value. @@ -1842,41 +1838,41 @@ class Detector { * * * ************************************************/ - /** [Jungfrau][Gotthard][CTB][Moench][Mythen3][Gotthard2] + /** [Jungfrau][Moench][Gotthard][CTB][Mythen3][Gotthard2] * Advanced user Function! * Program firmware from command line, after which detector controller is * rebooted. forceDeleteNormalFile is true, if normal file found * in device tree, it must be deleted, a new device drive created and - * programming continued.[Jungfrau][CTB][Moench] fname is a pof file (full + * programming continued.[Jungfrau][Moench][CTB] fname is a pof file (full * path) \n [Mythen3][Gotthard2] fname is an rbf file (full path) */ void programFPGA(const std::string &fname, const bool forceDeleteNormalFile, Positions pos = {}); - /** [Jungfrau][CTB][Moench] Advanced user Function! */ + /** [Jungfrau][Moench][CTB] Advanced user Function! */ void resetFPGA(Positions pos = {}); - /** [Jungfrau][Eiger][Ctb][Moench][Mythen3][Gotthard2] Copies detector + /** [Jungfrau][Moench][Eiger][Ctb][Mythen3][Gotthard2] Copies detector * server via TCP (without tftp).\nMakes a symbolic link with a shorter * name (without vx.x.x).\nThen, detector controller reboots (except - * Eiger).\n[Jungfrau][Ctb][Moench] Also deletes old server binary and + * Eiger).\n[Jungfrau][Moench][Ctb] Also deletes old server binary and * changes respawn server to the link, which is effective after a reboot. */ void updateDetectorServer(const std::string &fname, Positions pos = {}); - /** [Jungfrau][Ctb][Moench][Mythen3][Gotthard2] \n + /** [Jungfrau][Moench][Ctb][Mythen3][Gotthard2] \n * Advanced Command!! You could damage the detector. Please use with * caution.\nUpdates the kernel image. Then, detector controller reboots * with new kernel */ void updateKernel(const std::string &fname, Positions pos = {}); - /** [Jungfrau][Gotthard][CTB][Moench][Mythen3][Gotthard2] Advanced user + /** [Jungfrau][Moench][Gotthard][CTB][Mythen3][Gotthard2] Advanced user * Function! */ void rebootController(Positions pos = {}); /** - * Advanced user Function!\n [Jungfrau][Gotthard][CTB][Moench] Updates the + * Advanced user Function!\n [Jungfrau][Moench][Gotthard][CTB] Updates the * firmware, detector server, make a soft link and then reboots detector * controller. \n [Mythen3][Gotthard2] Will require a script to start up the * shorter named server link at start up \n sname is full path name of @@ -1913,16 +1909,16 @@ class Detector { /** Advanced user Function! */ Result getBit(uint32_t addr, int bitnr, Positions pos = {}); - /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] Advanced user + /** [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Advanced user * Function! */ void executeFirmwareTest(Positions pos = {}); - /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] Advanced user + /** [Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] Advanced user * Function! Writes different values in a R/W register and confirms the * writes to check bus */ void executeBusTest(Positions pos = {}); - /** [Gotthard][Jungfrau][CTB][Moench] Advanced user Function! not possible + /** [Gotthard][Jungfrau][Moench][CTB] Advanced user Function! not possible * to read back */ void writeAdcRegister(uint32_t addr, uint32_t value, Positions pos = {}); @@ -1935,11 +1931,11 @@ class Detector { * incompatible. \n Advanced user Function! */ void setInitialChecks(const bool value); - /** [CTB][Moench][Jungfrau] Advanced user Function! */ + /** [CTB][Jungfrau][Moench] Advanced user Function! */ Result getADCInvert(Positions pos = {}) const; - /** [CTB][Moench][Jungfrau] Advanced user Function! \n - [Jungfrau] Inversions on top of default mask */ + /** [CTB][Jungfrau][Moench] Advanced user Function! \n + [Jungfrau][Moench] Inversions on top of default mask */ void setADCInvert(uint32_t value, Positions pos = {}); ///@} @@ -1976,15 +1972,15 @@ class Detector { Result executeCommand(const std::string &value, Positions pos = {}); - /** [Jungfrau][Mythen3][CTB][Moench] + /** [Jungfrau][Moench][Mythen3][CTB] * [Gotthard2] only in continuous mode */ Result getNumberOfFramesFromStart(Positions pos = {}) const; - /** [Jungfrau][Mythen3][CTB][Moench] Get time from detector start + /** [Jungfrau][Moench][Mythen3][CTB] Get time from detector start * [Gotthard2] not in burst and auto mode */ Result getActualTime(Positions pos = {}) const; - /** [Jungfrau][Mythen3][CTB][Moench] Get timestamp at a frame start + /** [Jungfrau][Moench][Mythen3][CTB] Get timestamp at a frame start * [Gotthard2] not in burst and auto mode */ Result getMeasurementTime(Positions pos = {}) const; diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 36eb2602f..80e38c01e 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -516,7 +516,8 @@ std::string CmdProxy::GapPixels(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[0, 1]\n\t[Eiger][Jungfrau] Include Gap pixels in client data " + os << "[0, 1]\n\t[Eiger][Jungfrau][Moench] Include Gap pixels in " + "client data " "call back in Detecor api. Will not be in detector streaming, " "receiver file or streaming. Default is 0. " << '\n'; @@ -591,8 +592,8 @@ std::string CmdProxy::Exptime(int action) { if (action == defs::HELP_ACTION) { if (cmd == "exptime") { os << "[duration] [(optional unit) " - "ns|us|ms|s]\n\t[Eiger][Jungfrau][Gotthard][Gotthard2][" - "Moench][Ctb] Exposure time" + "ns|us|ms|s]\n\t[Eiger][Jungfrau][Moench][Gotthard][" + "Gotthard2][Ctb] Exposure time" "\n\t[Mythen3] Exposure time of all gate signals in auto and " "trigger mode (internal gating). To specify gate index, use " "exptime1, exptime2, exptime3." @@ -676,9 +677,10 @@ std::string CmdProxy::ReadoutSpeed(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "\n\t[0 or full_speed|1 or half_speed|2 or " - "quarter_speed]\n\t\t[Eiger][Jungfrau] Readout " + "quarter_speed]\n\t\t[Eiger][Jungfrau][Moench] Readout " "speed of chip.\n\t\t[Eiger] Default speed is full_speed." - "\n\t\t[Jungfrau] Default speed is half_speed. full_speed " + "\n\t\t[Jungfrau][Moench] Default speed is half_speed. " + "full_speed " "option only available from v2.0 boards and is recommended to " "set " "number of interfaces to 2. Also overwrites " @@ -687,7 +689,7 @@ std::string CmdProxy::ReadoutSpeed(int action) { << '\n'; } else { defs::detectorType type = det->getDetectorType().squash(); - if (type == defs::CHIPTESTBOARD || type == defs::MOENCH) { + if (type == defs::CHIPTESTBOARD) { throw RuntimeError( "ReadoutSpeed not implemented. Did you mean runclk?"); } @@ -716,10 +718,11 @@ std::string CmdProxy::Adcphase(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[n_value] " - "[(optional)deg]\n\t[Jungfrau][Ctb][Moench][Gotthard] " - "Phase shift of ADC clock. \n\t[Jungfrau] Absolute phase shift. " + "[(optional)deg]\n\t[Jungfrau][Moench][Ctb][Gotthard] " + "Phase shift of ADC clock. \n\t[Jungfrau][Moench] Absolute phase " + "shift. " "If deg used, then shift in degrees. Changing Speed also resets " - "adcphase to recommended defaults.\n\t[Ctb][Moench] Absolute " + "adcphase to recommended defaults.\n\t[Ctb] Absolute " "phase shift. If deg used, then shift in degrees. Changing " "adcclk also resets adcphase and sets it to previous " "values.\n\t[Gotthard] Relative phase shift. Cannot get" @@ -772,7 +775,8 @@ std::string CmdProxy::Dbitphase(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[n_value] [(optional)deg]\n\t[Ctb][Jungfrau] Phase shift of " + os << "[n_value] [(optional)deg]\n\t[Ctb][Jungfrau][Moench] Phase " + "shift of " "clock to latch digital bits. Absolute phase shift. If deg used, " "then shift in degrees. \n\t[Ctb]Changing dbitclk also resets " "dbitphase and sets to previous values." @@ -1009,7 +1013,8 @@ std::string CmdProxy::CurrentSource(int action) { os << "\n\t[0|1]\n\t\t[Gotthard2] Enable or disable current source. " "Default " "is disabled.\n\t[0|1] [fix|nofix] [select source] [(only for " - "chipv1.1)normal|low]\n\t\t[Jungfrau] Disable or enable current " + "chipv1.1)normal|low]\n\t\t[Jungfrau][Moench] Disable or enable " + "current " "source with some parameters. The select source is 0-63 for " "chipv1.0 and a 64 bit mask for chipv1.1. To disable, one needs " "only one argument '0'." @@ -1258,7 +1263,7 @@ std::string CmdProxy::ResetDacs(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[(optional) hard] " - "\n\t[Eiger][Jungfrau][Gotthard][Moench][Gotthard2][" + "\n\t[Eiger][Jungfrau][Moench][Gotthard][Gotthard2][" "Mythen3]Reset dac values to the defaults. A 'hard' optional " "reset will reset the dacs to the hardcoded defaults in on-board " "detector server." @@ -1289,7 +1294,8 @@ std::string CmdProxy::DefaultDac(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[dac name][value][(optional)setting]\n\tSets the default for " - "that dac to this value.\n\t[Jungfrau][Mythen3] When settings is " + "that dac to this value.\n\t[Jungfrau][Moench][Mythen3] When " + "settings is " "provided, it sets the default value only for that setting" << '\n'; } else if (action == defs::GET_ACTION) { @@ -1432,10 +1438,12 @@ std::string CmdProxy::Trigger(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "trigger") { - os << "\n\t[Eiger][Mythen3][Jungfrau] Sends software trigger " + os << "\n\t[Eiger][Mythen3][Jungfrau][Moench] Sends software " + "trigger " "signal to detector"; } else if (cmd == "blockingtrigger") { - os << "\n\t[Eiger][Jungfrau] Sends software trigger signal to " + os << "\n\t[Eiger][Jungfrau][Moench] Sends software trigger signal " + "to " "detector and blocks till the frames are sent out for that " "trigger."; } else { @@ -1524,7 +1532,8 @@ std::string CmdProxy::UDPDestinationList(int action) { "[(optional)mac2=xx:xx:xx:xx:xx:xx]\n\t[port=value] " "[(optional)port2=value\n\tThe order of ip, mac and port does " "not matter. entry_value can be >0 only for " - "[Eiger][Jungfrau][Mythen3][Gotthard2] where round robin is " + "[Eiger][Jungfrau][Moench][Mythen3][Gotthard2] where round robin " + "is " "implemented. If 'auto' used, then ip is set to ip of " "rx_hostname." << '\n'; @@ -1603,9 +1612,10 @@ std::string CmdProxy::UDPSourceIP2(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[x.x.x.x] or auto\n\t[Jungfrau][Gotthard2] Ip address of the " + os << "[x.x.x.x] or auto\n\t[Jungfrau][Moench][Gotthard2] Ip address " + "of the " "detector (source) udp interface 2. Must be same subnet as " - "destination udp ip2.\n\t [Jungfrau] top half or inner " + "destination udp ip2.\n\t [Jungfrau][Moench] top half or inner " "interface\n\t [Gotthard2] veto debugging. If 'auto' used, then " "ip is set to ip of rx_hostname." << '\n'; @@ -1675,9 +1685,10 @@ std::string CmdProxy::UDPDestinationIP2(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[x.x.x.x] or auto\n\t[Jungfrau][Gotthard2] Ip address of the " + os << "[x.x.x.x] or auto\n\t[Jungfrau][Moench][Gotthard2] Ip address " + "of the " "receiver (destination) udp interface 2. If 'auto' used, then ip " - "is set to ip of rx_hostname.\n\t[Jungfrau] bottom half " + "is set to ip of rx_hostname.\n\t[Jungfrau][Moench] bottom half " "\n\t[Gotthard2] veto debugging. " << '\n'; } else if (action == defs::GET_ACTION) { @@ -1711,12 +1722,13 @@ std::string CmdProxy::TransmissionDelay(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[n_delay]\n\t[Eiger][Jungfrau][Mythen3] Set transmission delay " + os << "[n_delay]\n\t[Eiger][Jungfrau][Moench][Mythen3] Set " + "transmission delay " "for all modules in the detector using the step size " "provided.Sets up \n\t\t[Eiger] txdelay_left to (2 * mod_index * " "n_delay), \n\t\t[Eiger] txdelay_right to ((2 * mod_index + 1) * " "n_delay) and \n\t\t[Eiger] txdelay_frame to (2 *num_modules * " - "n_delay) \n\t\t[Jungfrau][Mythen3] txdelay_frame to " + "n_delay) \n\t\t[Jungfrau][Moench][Mythen3] txdelay_frame to " "(num_modules * n_delay) \nfor every module." << '\n'; } else if (action == defs::GET_ACTION) { @@ -2058,7 +2070,8 @@ std::string CmdProxy::TemperatureEvent(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[0]\n\t[Jungfrau] 1, if a temperature event occured. To clear " + os << "[0]\n\t[Jungfrau][Moench] 1, if a temperature event occured. To " + "clear " "this event, set it to 0.\n\tIf temperature crosses threshold " "temperature and temperature control is enabled, power to chip " "will be switched off and temperature event occurs. To power on " @@ -2552,14 +2565,14 @@ std::string CmdProxy::GainCaps(int action) { return os.str(); } -/* CTB / Moench Specific */ +/* CTB Specific */ std::string CmdProxy::Samples(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[n_samples]\n\t[CTB] Number of samples (both analog and " - "digitial) expected.\n\t[Moench] Number of samples (analog only)" + "digitial) expected.\n" << '\n'; } else if (action == defs::GET_ACTION) { if (!args.empty()) { @@ -2601,7 +2614,7 @@ std::string CmdProxy::AdcVpp(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[dac or mV value][(optional unit) mV] \n\t[Ctb][Moench] Vpp of " + os << "[dac or mV value][(optional unit) mV] \n\t[Ctb] Vpp of " "ADC.\n\t 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> " "2V. \n\tAdvanced User function!\n" << '\n'; @@ -2743,7 +2756,7 @@ std::string CmdProxy::Pattern(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[fname]\n\t[Mythen3][Moench][Ctb] Loads ASCII pattern file " + os << "[fname]\n\t[Mythen3][Ctb] Loads ASCII pattern file " "directly to server (instead of executing line by line)" << '\n'; } else if (action == defs::GET_ACTION) { @@ -2764,8 +2777,8 @@ std::string CmdProxy::PatternWord(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[step or address] [64 bit mask]\n\t[Ctb][Moench][Mythen3] 64 " - "bit pattern at address of pattern memory.\n\t[Ctb][Moench] read " + os << "[step or address] [64 bit mask]\n\t[Ctb][Mythen3] 64 " + "bit pattern at address of pattern memory.\n\t[Ctb] read " "is same as executing pattern" << '\n'; } else if (action == defs::GET_ACTION) { @@ -2824,11 +2837,11 @@ std::string CmdProxy::PatternLoopAddresses(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patlimits") { - os << "[start addr] [stop addr] \n\t[Ctb][Moench][Mythen3] Limits " + os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits " "of complete pattern." << '\n'; } else if (cmd == "patloop") { - os << "[0-6] [start addr] [stop addr] \n\t[Ctb][Moench][Mythen3] " + os << "[0-6] [start addr] [stop addr] \n\t[Ctb][Mythen3] " "Limits of the loop level provided." << "\n\t[Mythen3] Level options: 0-3 only." << '\n'; } else { @@ -2867,7 +2880,7 @@ std::string CmdProxy::PatternLoopCycles(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patnloop") { - os << "[0-6] [n_cycles] \n\t[Ctb][Moench][Mythen3] Number of " + os << "[0-6] [n_cycles] \n\t[Ctb][Mythen3] Number of " "cycles of " "the loop level provided." << "\n\t[Mythen3] Level options: 0-3 only." << '\n'; @@ -2901,7 +2914,7 @@ std::string CmdProxy::PatternWaitAddress(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patwait") { - os << "[0-6] [addr] \n\t[Ctb][Moench][Mythen3] Wait address for " + os << "[0-6] [addr] \n\t[Ctb][Mythen3] Wait address for " "loop level provided." << "\n\t[Mythen3] Level options: 0-3 only."; } else { @@ -2935,7 +2948,7 @@ std::string CmdProxy::PatternWaitTime(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patwaittime") { - os << "[0-6] [n_clk] \n\t[Ctb][Moench][Mythen3] Wait time in clock " + os << "[0-6] [n_clk] \n\t[Ctb][Mythen3] Wait time in clock " "cycles for the loop provided." << "\n\t[Mythen3] Level options: 0-3 only." << '\n'; } else { @@ -2959,8 +2972,6 @@ std::string CmdProxy::PatternWaitTime(int action) { return os.str(); } -/* Moench */ - std::string CmdProxy::AdditionalJsonHeader(int action) { std::ostringstream os; os << cmd << ' '; @@ -3043,8 +3054,9 @@ std::string CmdProxy::ProgramFpga(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[fname.pof | fname.rbf (full " - "path)][(opitonal)--force-delete-normal-file]\n\t[Jungfrau][Ctb][" - "Moench] Programs FPGA from pof file (full path). Then, detector " + "path)][(opitonal)--force-delete-normal-file]\n\t[Jungfrau][" + "Moench][Ctb] " + "Programs FPGA from pof file (full path). Then, detector " "controller is rebooted. \n\t\tUse --force-delete-normal-file " "argument, if normal file found in device tree, it must be " "deleted, a new device drive created and programming " @@ -3078,11 +3090,11 @@ std::string CmdProxy::UpdateDetectorServer(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[server_name with full " - "path]\n\t[Jungfrau][Eiger][Ctb][Moench][Mythen3][Gotthard2] " + "path]\n\t[Jungfrau][Moench][Eiger][Ctb][Mythen3][Gotthard2] " "Copies detector server via TCP (without tftp). Makes a symbolic " "link with a shorter name (without vx.x.x). Then, detector " "controller reboots (except " - "Eiger).\n\t[Jungfrau][Ctb][Moench]Also changes respawn server " + "Eiger).\n\t[Jungfrau][Moench][Ctb]Also changes respawn server " "to the link, which is effective after a reboot." << '\n'; } else if (action == defs::GET_ACTION) { @@ -3104,7 +3116,7 @@ std::string CmdProxy::UpdateKernel(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[kernel_name with full " - "path]\n\t[Jungfrau][Ctb][Moench][Mythen3][Gotthard2] Advanced " + "path]\n\t[Jungfrau][Moench][Ctb][Mythen3][Gotthard2] Advanced " "Command!! You could damage the detector. Please use with " "caution.\n\tUpdates the kernel image. Then, detector controller " "reboots with new kernel." @@ -3129,7 +3141,7 @@ std::string CmdProxy::UpdateFirmwareAndDetectorServer(int action) { if (action == defs::HELP_ACTION) { os << "\n\tWithout tftp: [server_name (incl fullpath)] [fname.pof " "(incl full path)] This does not use " - "tftp.\n\t\t[Jungfrau][Gotthard][CTB][Moench] Updates the " + "tftp.\n\t\t[Jungfrau][Moench][Gotthard][CTB] Updates the " "firmware, detector server, deletes old server, creates the " "symbolic link and then reboots detector controller. " "\n\t\t[Mythen3][Gotthard2] will require a script to start up " @@ -3191,7 +3203,7 @@ std::string CmdProxy::AdcRegister(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[address] [value]\n\t[Jungfrau][Ctb][Moench][Gotthard] Writes " + os << "[address] [value]\n\t[Jungfrau][Moench][Ctb][Gotthard] Writes " "to an adc register in hex. Advanced user Function!" << '\n'; } else if (action == defs::GET_ACTION) { diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index dd3b69449..9ea873828 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1252,13 +1252,14 @@ class CmdProxy { GET_COMMAND(rx_version, getReceiverVersion, "\n\tReceiver version"); GET_COMMAND_HEX(serialnumber, getSerialNumber, - "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][CTB][Moench]" + "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][CTB]" "Serial number of detector."); - GET_COMMAND(moduleid, getModuleId, - "\n\t[Gotthard2][Eiger][Mythen3][Jungfrau] 16 bit value " - "(ideally unique) that is streamed out in the UDP header of " - "the detector. Picked up from a file on the module."); + GET_COMMAND( + moduleid, getModuleId, + "\n\t[Gotthard2][Eiger][Mythen3][Jungfrau][Moench] 16 bit value " + "(ideally unique) that is streamed out in the UDP header of " + "the detector. Picked up from a file on the module."); GET_COMMAND(type, getDetectorType, "\n\tReturns detector type. Can be Eiger, Jungfrau, Gotthard, " @@ -1278,12 +1279,10 @@ class CmdProxy { "verylowgain, g1_hg, g1_lg, g2_hc_hg, g2_hc_lg, " "g2_lc_hg, g2_lc_lg, g4_hg, g4_lg, gain0]" "\n\t Detector Settings" - "\n\t[Jungfrau] - [ gain0 | highgain0]" + "\n\t[Jungfrau][Moench] - [ gain0 | highgain0]" "\n\t[Gotthard] - [dynamicgain | highgain | lowgain | " "mediumgain | veryhighgain]" "\n\t[Gotthard2] - [dynamicgain | fixgain1 | fixgain2]" - "\n\t[Moench] - [g1_hg | g1_lg | g2_hc_hg | g2_hc_lg | " - "g2_lc_hg | g2_lc_lg | g4_hg | g4_lg]" "\n\t[Mythen3] - [standard | fast | highgain] Also changes vrshaper " "and vrpreamp. \n\t[Eiger] Use threshold or thresholdnotb. \n\t[Eiger] " "threshold and settings loaded from file found in settingspath. " @@ -1301,22 +1300,24 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( fliprows, getFlipRows, setFlipRows, StringTo, "[0, 1]\n\t[Eiger] flips rows paramater sent to slsreceiver " - "to stream as json parameter to flip rows in gui \n\t[Jungfrau] flips " + "to stream as json parameter to flip rows in gui " + "\n\t[Jungfrau][Moench] flips " "rows in the detector itself. For bottom module and number of " "interfaces must be set to 2. slsReceiver and slsDetectorGui " "does not handle."); - INTEGER_COMMAND_VEC_ID_GET( - master, getMaster, setMaster, StringTo, - "[0, 1]\n\t[Eiger][Gotthard2][Jungfrau] Sets (half) module to master " - "and other(s) to " - "slaves.\n\t[Gotthard][Gotthard2][Mythen3][Eiger][Jungfrau] Gets if " - "the current (half) module is master."); + INTEGER_COMMAND_VEC_ID_GET(master, getMaster, setMaster, StringTo, + "[0, 1]\n\t[Eiger][Gotthard2][Jungfrau][Moench] " + "Sets (half) module to master " + "and other(s) to " + "slaves.\n\t[Gotthard][Gotthard2][Mythen3][" + "Eiger][Jungfrau][Moench] Gets if " + "the current (half) module is master."); - INTEGER_COMMAND_SET_NOID_GET_ID(sync, getSynchronization, - setSynchronization, StringTo, - "[0, 1]\n\t[Jungfrau] Enables or disables " - "synchronization between modules."); + INTEGER_COMMAND_SET_NOID_GET_ID( + sync, getSynchronization, setSynchronization, StringTo, + "[0, 1]\n\t[Jungfrau][Moench] Enables or disables " + "synchronization between modules."); /* acquisition parameters */ @@ -1336,28 +1337,29 @@ class CmdProxy { period, getPeriod, setPeriod, "[duration] [(optional unit) ns|us|ms|s]\n\tPeriod between frames"); - TIME_COMMAND(delay, getDelayAfterTrigger, setDelayAfterTrigger, - "[duration] [(optional unit) " - "ns|us|ms|s]\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb][" - "Moench] Delay after trigger"); + TIME_COMMAND( + delay, getDelayAfterTrigger, setDelayAfterTrigger, + "[duration] [(optional unit) " + "ns|us|ms|s]\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb][" + "Moench] Delay after trigger"); GET_COMMAND(framesl, getNumberOfFramesLeft, - "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] " + "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] " "Number of frames left in acquisition." "\n\t[Gotthard2] only in continuous auto mode."); GET_COMMAND(triggersl, getNumberOfTriggersLeft, - "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] " + "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB] " "Number of triggers left in acquisition. Only when external " "trigger used."); TIME_GET_COMMAND(delayl, getDelayAfterTriggerLeft, - "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench]" + "\n\t[Gotthard][Jungfrau][Moench][Mythen3][Gotthard2][CTB]" " DelayLeft Delay Left in Acquisition." "\n\t[Gotthard2] only in continuous mode."); TIME_GET_COMMAND(periodl, getPeriodLeft, - "\n\t[Gotthard][Jungfrau][CTB][Moench][Mythen3][Gotthard2]" + "\n\t[Gotthard][Jungfrau][Moench][CTB][Mythen3][Gotthard2]" " Period left for current frame." "\n\t[Gotthard2] only in continuous mode."); @@ -1368,7 +1370,7 @@ class CmdProxy { "[Eiger] Options: 4, 8, 12, 16, 32. If set to 32, also sets " "clkdivider to 2, else to 0.\n\t" "[Mythen3] Options: 8, 16, 32\n\t" - "[Jungfrau][Gotthard][Ctb][Moench][Mythen3][Gotthard2] 16"); + "[Jungfrau][Moench][Gotthard][Ctb][Mythen3][Gotthard2] 16"); GET_COMMAND_NOID(drlist, getDynamicRangeList, "\n\tGets the list of dynamic ranges for this detector."); @@ -1377,7 +1379,7 @@ class CmdProxy { timing, getTimingMode, setTimingMode, StringTo, "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of " - "detector.\n\t[Jungfrau][Gotthard][Ctb][Moench][Gotthard2] " + "detector.\n\t[Jungfrau][Moench][Gotthard][Ctb][Gotthard2] " "[auto|trigger]\n\t[Mythen3] " "[auto|trigger|gating|trigger_gating]\n\t[Eiger] " "[auto|trigger|gating|burst_trigger]"); @@ -1390,24 +1392,25 @@ class CmdProxy { "\n\tList of readout speed levels implemented for this detector."); GET_COMMAND(maxadcphaseshift, getMaxADCPhaseShift, - "\n\t[Jungfrau][CTB][Moench] Absolute maximum Phase shift of " + "\n\t[Jungfrau][Moench][CTB] Absolute maximum Phase shift of " "ADC clock."); - GET_COMMAND(maxdbitphaseshift, getMaxDBITPhaseShift, - "\n\t[CTB][Jungfrau] Absolute maximum Phase shift of of the " - "clock to latch digital bits."); + GET_COMMAND( + maxdbitphaseshift, getMaxDBITPhaseShift, + "\n\t[CTB][Jungfrau][Moench] Absolute maximum Phase shift of of the " + "clock to latch digital bits."); INTEGER_COMMAND_VEC_ID(highvoltage, getHighVoltage, setHighVoltage, StringTo, "[n_value]\n\tHigh voltage to the sensor in Voltage." "\n\t[Gotthard] [0|90|110|120|150|180|200]" "\n\t[Eiger][Mythen3][Gotthard2] 0-200" - "\n\t[Jungfrau][Ctb][Moench] [0|60-200]"); + "\n\t[Jungfrau][Moench][Ctb] [0|60-200]"); INTEGER_COMMAND_VEC_ID( powerchip, getPowerChip, setPowerChip, StringTo, - "[0, 1]\n\t[Jungfrau][Mythen3][Gotthard2][Moench] Power " - "the chip. \n\t[Moench] Default is 0. \n\t[Jungfrau] Default is 0. Get " + "[0, 1]\n\t[Jungfrau][Moench][Mythen3][Gotthard2] Power " + "the chip. \n\t[Jungfrau][Moench] Default is 0. 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\t[Mythen3][Gotthard2] " @@ -1418,7 +1421,8 @@ class CmdProxy { imagetest, getImageTestMode, setImageTestMode, StringTo, "[0, 1]\n\t[Gotthard] 1 adds channel intensity with precalculated " "values when taking an acquisition. Default is 0." - "\n\t[Eiger][Jungfrau] Only for Virtual servers. If 0, each pixel " + "\n\t[Eiger][Jungfrau][Moench] Only for Virtual servers. If 0, each " + "pixel " "intensity incremented by 1. If 1, all pixels almost saturated."); INTEGER_COMMAND_VEC_ID( @@ -1432,9 +1436,10 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( filterresistor, getFilterResistor, setFilterResistor, StringTo, - "[value] [Gotthard2][Jungfrau] Set filter resistor. Increasing values " + "[value] [Gotthard2][Jungfrau][Moench] Set filter resistor. Increasing " + "values " "for increasing resistance.\n\t[Gotthard2] Options: [0|1|2|3]. Default " - "is 0.\n\t[Jungfrau] Options: [0|1]. Default is 1."); + "is 0.\n\t[Jungfrau][Moench] Options: [0|1]. Default is 1."); INTEGER_COMMAND_VEC_ID(dbitpipeline, getDBITPipeline, setDBITPipeline, StringTo, @@ -1449,19 +1454,22 @@ class CmdProxy { "permissible values depend on dynamic range and 10Gbe " "enabled.\n\t[8-512 (multiple of 8)]\n\t\t[Jungfrau] Number of rows " "per module starting from the centre. Options: 8 - 512, must be " - "multiples of 8. Default is 512."); + "multiples of 8. Default is 512.\n\t\t[Moench] Number of rows " + "per module starting from the centre. Options:16 - 400, must be " + "multiples of 16. Default is 400."); /** temperature */ GET_COMMAND_NOID( templist, getTemperatureList, "\n\tList of temperature commands implemented for this detector."); - GET_IND_COMMAND(temp_adc, getTemperature, slsDetectorDefs::TEMPERATURE_ADC, - " °C", "[n_value]\n\t[Jungfrau][Gotthard] ADC Temperature"); + GET_IND_COMMAND( + temp_adc, getTemperature, slsDetectorDefs::TEMPERATURE_ADC, " °C", + "[n_value]\n\t[Jungfrau][Moench][Gotthard] ADC Temperature"); GET_IND_COMMAND(temp_fpga, getTemperature, slsDetectorDefs::TEMPERATURE_FPGA, " °C", - "[n_value]\n\t[Eiger][Jungfrau][Gotthard][Mythen3][" + "[n_value]\n\t[Eiger][Jungfrau][Moench][Gotthard][Mythen3][" "Gotthard2] FPGA Temperature"); GET_IND_COMMAND(temp_fpgaext, getTemperature, @@ -1595,7 +1603,7 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( numinterfaces, getNumberofUDPInterfaces, setNumberofUDPInterfaces, StringTo, - "[1, 2]\n\t[Jungfrau] Number of udp interfaces to stream " + "[1, 2]\n\t[Jungfrau][Moench] Number of udp interfaces to stream " "data from detector. Default: 1.\n\tAlso enables second interface in " "receiver for listening (Writes a file per interface if writing " "enabled).\n\tAlso restarts client and receiver zmq sockets if zmq " @@ -1604,12 +1612,14 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( selinterface, getSelectedUDPInterface, selectUDPInterface, StringTo, - "[0, 1]\n\t[Jungfrau] The udp interface to stream data from detector. " + "[0, 1]\n\t[Jungfrau][Moench] The udp interface to stream data from " + "detector. " "Effective only when number of interfaces is 1. Default: 0 (outer)"); GET_COMMAND( udp_numdst, getNumberofUDPDestinations, - "\n\t[Jungfrau][Eiger][Mythen3][Gotthard2] One can enter upto 32 (64 " + "\n\t[Jungfrau][Moench][Eiger][Mythen3][Gotthard2] One can enter upto " + "32 (64 " "for Mythen3) destinations that the detector will stream images out in " "a round robin fashion. This is get only command. Default: 1"); @@ -1620,7 +1630,8 @@ class CmdProxy { udp_firstdst, getFirstUDPDestination, setFirstUDPDestination, StringTo, "\n[0 - 31 (or number of udp " - "destinations)]\n\t[Jungfrau][Gotthard2]\n[0-63]\n\t[Mythen3]\n\n\t " + "destinations)]\n\t[Jungfrau][Moench][Gotthard2]\n[0-63]\n\t[Mythen3]" + "\n\n\t " "One can set which is the first destination that the detector will " "stream images out from in a round robin fashion. The entry must not " "have been empty. Default: 0"); @@ -1631,10 +1642,10 @@ class CmdProxy { "interface. \n\t[Eiger] Do not set as detector will replace with its " "own DHCP Mac (1G) or DHCP Mac + 1 (10G)."); - INTEGER_COMMAND_VEC_ID(udp_srcmac2, getSourceUDPMAC2, setSourceUDPMAC2, - MacAddr, - "[x:x:x:x:x:x]\n\t[Jungfrau] Mac address of the top " - "half or inner (source) udp interface. "); + INTEGER_COMMAND_VEC_ID( + udp_srcmac2, getSourceUDPMAC2, setSourceUDPMAC2, MacAddr, + "[x:x:x:x:x:x]\n\t[Jungfrau][Moench] Mac address of the top " + "half or inner (source) udp interface. "); INTEGER_COMMAND_VEC_ID( udp_dstmac, getDestinationUDPMAC, setDestinationUDPMAC, MacAddr, @@ -1646,10 +1657,12 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( udp_dstmac2, getDestinationUDPMAC2, setDestinationUDPMAC2, MacAddr, - "[x:x:x:x:x:x]\n\t[Jungfrau] Mac address of the receiver (destination) " + "[x:x:x:x:x:x]\n\t[Jungfrau][Moench] Mac address of the receiver " + "(destination) " "udp interface 2. Not mandatory to set as udp_dstip2 retrieves it from " "slsReceiver process but must be set if you use a custom receiver (not " - "slsReceiver). \n\t [Jungfrau] top half or inner interface \n\t " + "slsReceiver). \n\t [Jungfrau][Moench] top half or inner interface " + "\n\t " "[Gotthard2] veto debugging. Use router mac if router between detector " "and receiver."); @@ -1663,10 +1676,10 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID_GET( udp_dstport2, getDestinationUDPPort2, setDestinationUDPPort2, StringTo, - "[n]\n\t[Jungfrau][Eiger][Gotthard2] Port number of the " + "[n]\n\t[Jungfrau][Moench][Eiger][Gotthard2] Port number of the " "receiver (destination) udp interface 2. Default is 50002. " "\n\tIf multi command, ports for each module is calculated " - "(incremented by 2) \n\t[Jungfrau] top half or inner interface " + "(incremented by 2) \n\t[Jungfrau][Moench] top half or inner interface " "\n\t[Eiger] " "right half \n\t[Gotthard2] veto debugging"); @@ -1685,19 +1698,21 @@ class CmdProxy { GET_COMMAND(rx_printconfig, printRxConfiguration, "\n\tPrints the receiver configuration."); - INTEGER_COMMAND_VEC_ID( - tengiga, getTenGiga, setTenGiga, StringTo, - "[0, 1]\n\t[Eiger][Ctb][Moench][Mythen3] 10GbE Enable."); + INTEGER_COMMAND_VEC_ID(tengiga, getTenGiga, setTenGiga, StringTo, + "[0, 1]\n\t[Eiger][Ctb][Mythen3] 10GbE Enable."); - INTEGER_COMMAND_VEC_ID(flowcontrol10g, getTenGigaFlowControl, - setTenGigaFlowControl, StringTo, - "[0, 1]\n\t[Eiger][Jungfrau] 10GbE Flow Control."); + INTEGER_COMMAND_VEC_ID( + flowcontrol10g, getTenGigaFlowControl, setTenGigaFlowControl, + StringTo, + "[0, 1]\n\t[Eiger][Jungfrau][Moench] 10GbE Flow Control."); INTEGER_COMMAND_VEC_ID( txdelay_frame, getTransmissionDelayFrame, setTransmissionDelayFrame, StringTo, - "[n_delay]\n\t[Eiger][Jungfrau][Mythen3] Transmission delay of first " - "udp packet being streamed out of the module.\n\t[Jungfrau] [0-31] " + "[n_delay]\n\t[Eiger][Jungfrau][Moench][Mythen3] Transmission delay of " + "first " + "udp packet being streamed out of the module.\n\t[Jungfrau][Moench] " + "[0-31] " "Each value represents 1 ms\n\t[Eiger] Additional delay to " "txdelay_left and txdelay_right. Each value represents 10ns. Typical " "value is 50000.\n\t[Mythen3] [0-16777215] Each value represents 8 ns " @@ -1939,13 +1954,15 @@ class CmdProxy { /* Jungfrau Specific */ - GET_COMMAND(chipversion, getChipVersion, - "\n\t[Jungfrau] Returns chip version. Can be 1.0 or 1.1"); + GET_COMMAND( + chipversion, getChipVersion, + "\n\t[Jungfrau][Moench] Returns chip version. Can be 1.0 or 1.1"); INTEGER_COMMAND_VEC_ID( temp_threshold, getThresholdTemperature, setThresholdTemperature, StringTo, - "[n_temp (in degrees)]\n\t[Jungfrau] Threshold temperature in degrees. " + "[n_temp (in degrees)]\n\t[Jungfrau][Moench] Threshold temperature in " + "degrees. " "If temperature crosses threshold temperature and temperature control " "is enabled, power to chip will be switched off and temperature event " "occurs. To power on chip again, temperature has to be less than " @@ -1954,7 +1971,7 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( temp_control, getTemperatureControl, setTemperatureControl, StringTo, - "[0, 1]\n\t[Jungfrau] Temperature control enable. Default is 0 " + "[0, 1]\n\t[Jungfrau][Moench] Temperature control enable. Default is 0 " "(disabled). If temperature crosses threshold temperature and " "temperature control is enabled, power to chip will be switched off " "and temperature event occurs. To power on chip again, temperature has " @@ -1964,7 +1981,8 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( autocompdisable, getAutoComparatorDisable, setAutoComparatorDisable, StringTo, - "[0, 1]\n\t[Jungfrau] Auto comparator disable mode. By default, the " + "[0, 1]\n\t[Jungfrau][Moench] Auto comparator disable mode. By " + "default, the " "on-chip gain switching is active during the entire exposure.This mode " "disables the on - chip gain switching comparator automatically after " "93.75% (only for chipv1.0) of exposure time (only for longer than " @@ -1973,16 +1991,17 @@ class CmdProxy { "disabled(comparator enabled throughout). 1 enables mode. 0 disables " "mode. "); - TIME_COMMAND(compdisabletime, getComparatorDisableTime, - setComparatorDisableTime, - "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau] Time " - "before end of exposure when comparator is disabled. It is " - "only possible for chipv1.1."); + TIME_COMMAND( + compdisabletime, getComparatorDisableTime, setComparatorDisableTime, + "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau][Moench] Time " + "before end of exposure when comparator is disabled. It is " + "only possible for chipv1.1."); INTEGER_COMMAND_SET_NOID_GET_ID( extrastoragecells, getNumberOfAdditionalStorageCells, setNumberOfAdditionalStorageCells, StringTo, - "[0-15]\n\t[Jungfrau] Only for chipv1.0. Number of additional storage " + "[0-15]\n\t[Jungfrau][Moench] Only for chipv1.0. Number of additional " + "storage " "cells. Default is " "0. For advanced users only. \n\tThe #images = #frames x #triggers x " "(#extrastoragecells + 1)."); @@ -1990,13 +2009,15 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( storagecell_start, getStorageCellStart, setStorageCellStart, StringTo, - "[0-max]\n\t[Jungfrau] Storage cell that stores the first acquisition " + "[0-max]\n\t[Jungfrau][Moench] Storage cell that stores the first " + "acquisition " "of the series. max is 15 (default) for chipv1.0 and 3 (default) for " "chipv1.1. For advanced users only."); TIME_COMMAND( storagecell_delay, getStorageCellDelay, setStorageCellDelay, - "[duration (0-1638375 ns)] [(optional unit) ns|us|ms|s]\n\t[Jungfrau] " + "[duration (0-1638375 ns)] [(optional unit) " + "ns|us|ms|s]\n\t[Jungfrau][Moench] " "Additional time delay between 2 consecutive exposures in burst mode " "(resolution of 25ns). Only applicable for chipv1.0. For advanced " "users only."); @@ -2007,10 +2028,11 @@ class CmdProxy { "Jungfrau] Gain mode.\n\tCAUTION: Do not use fixg0 without caution, " "you can damage the detector!!!"); - INTEGER_COMMAND_VEC_ID(filtercells, getNumberOfFilterCells, - setNumberOfFilterCells, StringTo, - "[0-12]\n\t[Jungfrau] Set Filter Cell. Only for " - "chipv1.1. Advanced user Command"); + INTEGER_COMMAND_VEC_ID( + filtercells, getNumberOfFilterCells, setNumberOfFilterCells, + StringTo, + "[0-12]\n\t[Jungfrau][Moench] Set Filter Cell. Only for " + "chipv1.1. Advanced user Command"); /* Gotthard Specific */ TIME_GET_COMMAND(exptimel, getExptimeLeft, @@ -2092,36 +2114,36 @@ class CmdProxy { INTEGER_COMMAND_VEC_ID( asamples, getNumberOfAnalogSamples, setNumberOfAnalogSamples, StringTo, - "[n_samples]\n\t[CTB][Moench] Number of analog samples expected."); + "[n_samples]\n\t[CTB] Number of analog samples expected."); INTEGER_COMMAND_VEC_ID( adcclk, getADCClock, setADCClock, StringTo, - "[n_clk in MHz]\n\t[Ctb][Moench] ADC clock frequency in MHz."); + "[n_clk in MHz]\n\t[Ctb] ADC clock frequency in MHz."); INTEGER_COMMAND_VEC_ID(runclk, getRUNClock, setRUNClock, StringTo, - "[n_clk in MHz]\n\t[Ctb][Moench] Run clock in MHz."); + "[n_clk in MHz]\n\t[Ctb] Run clock in MHz."); GET_COMMAND(syncclk, getSYNCClock, - "[n_clk in MHz]\n\t[Ctb][Moench] Sync clock in MHz."); + "[n_clk in MHz]\n\t[Ctb] Sync clock in MHz."); - INTEGER_COMMAND_VEC_ID( - adcpipeline, getADCPipeline, setADCPipeline, StringTo, - "[n_value]\n\t[Ctb][Moench] Pipeline for ADC clock."); + INTEGER_COMMAND_VEC_ID(adcpipeline, getADCPipeline, setADCPipeline, + StringTo, + "[n_value]\n\t[Ctb] Pipeline for ADC clock."); INTEGER_IND_COMMAND(v_limit, getVoltage, setVoltage, StringTo, defs::V_LIMIT, - "[n_value]\n\t[Ctb][Moench] Soft limit for power " + "[n_value]\n\t[Ctb] Soft limit for power " "supplies (ctb only) and DACS in mV."); INTEGER_COMMAND_HEX(adcenable, getADCEnableMask, setADCEnableMask, StringTo, - "[bitmask]\n\t[Ctb][Moench] ADC Enable Mask for 1Gb " + "[bitmask]\n\t[Ctb] ADC Enable Mask for 1Gb " "Enable for each 32 ADC channel."); INTEGER_COMMAND_HEX( adcenable10g, getTenGigaADCEnableMask, setTenGigaADCEnableMask, StringTo, - "[bitmask]\n\t[Ctb][Moench] ADC Enable Mask for 10Gb mode for each 32 " + "[bitmask]\n\t[Ctb] ADC Enable Mask for 10Gb mode for each 32 " "ADC channel. However, if any of a consecutive 4 bits are enabled, the " "complete 4 bits are enabled."); @@ -2222,28 +2244,28 @@ class CmdProxy { EXECUTE_SET_COMMAND_NOID_1ARG( savepattern, savePattern, - "[fname]\n\t[Ctb][Moench][Mythen3] Saves pattern to file (ascii). " - "\n\t[Ctb][Moench] Also executes pattern."); + "[fname]\n\t[Ctb][Mythen3] Saves pattern to file (ascii). " + "\n\t[Ctb] Also executes pattern."); EXECUTE_SET_COMMAND( defaultpattern, loadDefaultPattern, - "\n\t[Mythen3][Moench] Loads and runs default pattern in pattern " + "\n\t[Mythen3] Loads and runs default pattern in pattern " "generator. It is to go back to initial settings."); INTEGER_COMMAND_HEX_WIDTH16(patioctrl, getPatternIOControl, setPatternIOControl, StringTo, - "[64 bit mask]\n\t[Ctb][Moench] 64 bit mask " + "[64 bit mask]\n\t[Ctb] 64 bit mask " "defining input (0) and output (1) signals."); INTEGER_COMMAND_HEX_WIDTH16( patmask, getPatternMask, setPatternMask, StringTo, - "[64 bit mask]\n\t[Ctb][Moench][Mythen3] Selects the bits that will " + "[64 bit mask]\n\t[Ctb][Mythen3] Selects the bits that will " "have a pattern mask applied to the selected patmask for every " "pattern."); INTEGER_COMMAND_HEX_WIDTH16( patsetbit, getPatternBitMask, setPatternBitMask, StringTo, - "[64 bit mask]\n\t[Ctb][Moench][Mythen3] Sets the mask applied to " + "[64 bit mask]\n\t[Ctb][Mythen3] Sets the mask applied to " "every pattern to the selected bits."); EXECUTE_SET_COMMAND(patternstart, startPattern, @@ -2253,10 +2275,10 @@ class CmdProxy { /* Advanced */ EXECUTE_SET_COMMAND(resetfpga, resetFPGA, - "\n\t[Jungfrau][Ctb][Moench] Reset FPGA."); + "\n\t[Jungfrau][Moench][Ctb] Reset FPGA."); EXECUTE_SET_COMMAND(rebootcontroller, rebootController, - "\n\t[Jungfrau][Ctb][Moench][Gotthard][Mythen3][" + "\n\t[Jungfrau][Moench][Ctb][Gotthard][Mythen3][" "Gotthard2] Reboot controller of detector."); INTEGER_COMMAND_VEC_ID( @@ -2267,18 +2289,18 @@ class CmdProxy { EXECUTE_SET_COMMAND( firmwaretest, executeFirmwareTest, - "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb][Moench] Firmware " + "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Firmware " "test, ie. reads a read fixed pattern from a register."); EXECUTE_SET_COMMAND( bustest, executeBusTest, - "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb][Moench] Bus test, " + "\n\t[Jungfrau][Moench][Gotthard][Mythen3][Gotthard2][Ctb] Bus test, " "ie. Writes different values in a R/W register and confirms the " "writes to check bus.\n\tAdvanced User function!"); INTEGER_COMMAND_HEX( adcinvert, getADCInvert, setADCInvert, StringTo, - "[bitmask]\n\t[Ctb][Moench][Jungfrau] ADC Inversion " + "[bitmask]\n\t[Ctb][Jungfrau][Moench] ADC Inversion " "Mask.\n\t[Jungfrau][Moench] Inversions on top of the default mask."); /* Insignificant */ @@ -2303,19 +2325,19 @@ class CmdProxy { "\n\tClient IP Address that last communicated with the detector."); GET_COMMAND(framecounter, getNumberOfFramesFromStart, - "\n\t[Jungfrau][Mythen3][Gotthard2][Moench][CTB] " + "\n\t[Jungfrau][Moench][Mythen3][Gotthard2][CTB] " "Number of frames from start run control." "\n\t[Gotthard2] only in continuous mode."); TIME_GET_COMMAND(runtime, getActualTime, "[(optional unit) " - "ns|us|ms|s]\n\t[Jungfrau][Mythen3][Gotthard2][Moench][" + "ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][" "CTB] Time from detector start up." "\n\t[Gotthard2] not in burst and auto mode."); TIME_GET_COMMAND(frametime, getMeasurementTime, "[(optional unit) " - "ns|us|ms|s]\n\t[Jungfrau][Mythen3][Gotthard2][Moench][" + "ns|us|ms|s]\n\t[Jungfrau][Moench][Mythen3][Gotthard2][" "CTB] Timestamp at a frame start." "\n\t[Gotthard2] not in burst and auto mode."); }; diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 343fa283f..c547504fd 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -183,17 +183,12 @@ std::vector Detector::getSettingsList() const { defs::HIGHGAIN, defs::DYNAMICGAIN, defs::LOWGAIN, defs::MEDIUMGAIN, defs::VERYHIGHGAIN}; case defs::JUNGFRAU: + case defs::MOENCH: return std::vector{defs::GAIN0, defs::HIGHGAIN0}; case defs::GOTTHARD2: return std::vector{ defs::DYNAMICGAIN, defs::FIXGAIN1, defs::FIXGAIN2}; - case defs::MOENCH: - return std::vector{ - defs::G1_HIGHGAIN, defs::G1_LOWGAIN, - defs::G2_HIGHCAP_HIGHGAIN, defs::G2_HIGHCAP_LOWGAIN, - defs::G2_LOWCAP_HIGHGAIN, defs::G2_LOWCAP_LOWGAIN, - defs::G4_HIGHGAIN, defs::G4_LOWGAIN}; case defs::MYTHEN3: return std::vector{defs::STANDARD, defs::FAST, defs::HIGHGAIN}; @@ -482,6 +477,7 @@ std::vector Detector::getReadoutSpeedList() const { switch (getDetectorType().squash()) { case defs::EIGER: case defs::JUNGFRAU: + case defs::MOENCH: return std::vector{defs::FULL_SPEED, defs::HALF_SPEED, defs::QUARTER_SPEED}; case defs::GOTTHARD2: @@ -604,6 +600,7 @@ std::vector Detector::getTemperatureList() const { case defs::CHIPTESTBOARD: return std::vector{defs::SLOW_ADC_TEMP}; case defs::JUNGFRAU: + case defs::MOENCH: case defs::GOTTHARD: return std::vector{defs::TEMPERATURE_ADC, defs::TEMPERATURE_FPGA}; @@ -642,6 +639,7 @@ Result Detector::getTemperature(defs::dacIndex index, switch (getDetectorType().squash()) { case defs::EIGER: case defs::JUNGFRAU: + case defs::MOENCH: case defs::MYTHEN3: case defs::GOTTHARD2: for (auto &it : res) { @@ -669,6 +667,7 @@ std::vector Detector::getDacList() const { defs::VREF_DS, defs::VCASCN_PB, defs::VCASCP_PB, defs::VOUT_CM, defs::VCASC_OUT, defs::VIN_CM, defs::VREF_COMP, defs::IB_TESTC}; case defs::JUNGFRAU: + case defs::MOENCH: return std::vector{ defs::VB_COMP, defs::VDD_PROT, defs::VIN_COM, defs::VREF_PRECH, defs::VB_PIXBUF, defs::VB_DS, defs::VREF_DS, defs::VREF_COMP}; @@ -686,10 +685,6 @@ std::vector Detector::getDacList() const { defs::VCAS, defs::VRPREAMP, defs::VCAL_N, defs::VIPRE, defs::VISHAPER, defs::VCAL_P, defs::VTRIM, defs::VDCSH, defs::VTHRESHOLD}; - case defs::MOENCH: - return std::vector{ - defs::VBP_COLBUF, defs::VIPRE, defs::VIN_CM, defs::VB_SDA, - defs::VCASC_SFP, defs::VOUT_CM, defs::VIPRE_CDS, defs::IBIAS_SFP}; case defs::CHIPTESTBOARD: for (int i = 0; i != 18; ++i) { retval.push_back(static_cast(i)); @@ -919,7 +914,8 @@ Result Detector::getNumberofUDPInterfaces(Positions pos) const { } void Detector::setNumberofUDPInterfaces(int n, Positions pos) { - if (getDetectorType().squash() != defs::JUNGFRAU) { + auto detType = getDetectorType().squash(); + if (detType != defs::JUNGFRAU && detType != defs::MOENCH) { throw RuntimeError( "Cannot set number of udp interfaces for this detector."); } @@ -1600,7 +1596,7 @@ void Detector::setTop(bool value, Positions pos) { pimpl->Parallel(&Module::setTop, pos, value); } -// Jungfrau Specific +// Jungfrau/moench Specific Result Detector::getChipVersion(Positions pos) const { return pimpl->Parallel(&Module::getChipVersion, pos); } @@ -1672,6 +1668,7 @@ void Detector::setStorageCellDelay(ns value, Positions pos) { std::vector Detector::getGainModeList() const { switch (getDetectorType().squash()) { case defs::JUNGFRAU: + case defs::MOENCH: return std::vector{ defs::DYNAMIC, defs::FORCE_SWITCH_G1, defs::FORCE_SWITCH_G2, defs::FIX_G1, defs::FIX_G2, defs::FIX_G0}; @@ -1963,7 +1960,7 @@ void Detector::setDigitalPulsing(bool value, Positions pos) { pimpl->Parallel(&Module::setDigitalPulsing, pos, value); } -// CTB/ Moench Specific +// CTB Specific Result Detector::getNumberOfAnalogSamples(Positions pos) const { return pimpl->Parallel(&Module::getNumberOfAnalogSamples, pos); @@ -2301,8 +2298,6 @@ void Detector::startPattern(Positions pos) { pimpl->Parallel(&Module::startPattern, pos); } -// Moench - Result> Detector::getAdditionalJsonHeader(Positions pos) const { return pimpl->Parallel(&Module::getAdditionalJsonHeader, pos); diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index fcfca99d3..ae26db0b6 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -320,10 +320,10 @@ void DetectorImpl::addModule(const std::string &hostname) { // module type updated by now shm()->detType = Parallel(&Module::getDetectorType, {}) .tsquash("Inconsistent detector types."); - // for moench and ctb + // for ctb modules[pos]->updateNumberOfChannels(); - // for eiger, jungfrau, gotthard2 + // for eiger, jungfrau, moench, gotthard2 modules[pos]->updateNumberofUDPInterfaces(); // update zmq port in case numudpinterfaces changed @@ -413,6 +413,7 @@ void DetectorImpl::setGapPixelsinCallback(const bool enable) { if (enable) { switch (shm()->detType) { case JUNGFRAU: + case MOENCH: break; case EIGER: if (size() && modules[0]->getQuad()) { @@ -435,6 +436,7 @@ int DetectorImpl::getTransmissionDelay() const { bool eiger = false; switch (shm()->detType) { case JUNGFRAU: + case MOENCH: case MYTHEN3: break; case EIGER: @@ -478,6 +480,7 @@ void DetectorImpl::setTransmissionDelay(int step) { bool eiger = false; switch (shm()->detType) { case JUNGFRAU: + case MOENCH: case MYTHEN3: break; case EIGER: @@ -882,10 +885,10 @@ int DetectorImpl::InsertGapPixels(char *image, char *&gpImage, bool quadEnable, nMod1TotPixelsx /= 2; } // eiger requires inter chip gap pixels are halved - // jungfrau prefers same inter chip gap pixels as the boundary pixels + // jungfrau/moench prefers same inter chip gap pixels as the boundary pixels int divisionValue = 2; slsDetectorDefs::detectorType detType = shm()->detType; - if (detType == JUNGFRAU) { + if (detType == JUNGFRAU || detType == MOENCH) { divisionValue = 1; } LOG(logDEBUG) << "Insert Gap pixels Calculations:\n\t" @@ -1382,8 +1385,8 @@ std::vector DetectorImpl::readProgrammingFile(const std::string &fname) { bool isPof = false; switch (shm()->detType) { case JUNGFRAU: - case CHIPTESTBOARD: case MOENCH: + case CHIPTESTBOARD: if (fname.find(".pof") == std::string::npos) { throw RuntimeError("Programming file must be a pof file."); } @@ -1521,6 +1524,7 @@ defs::xy DetectorImpl::getPortGeometry() const { portGeometry.x = modules[0]->getNumberofUDPInterfacesFromShm(); break; case JUNGFRAU: + case MOENCH: portGeometry.y = modules[0]->getNumberofUDPInterfacesFromShm(); break; default: @@ -1539,7 +1543,7 @@ defs::xy DetectorImpl::calculatePosition(int moduleIndex, } defs::ROI DetectorImpl::getRxROI() const { - if (shm()->detType == CHIPTESTBOARD || shm()->detType == MOENCH) { + if (shm()->detType == CHIPTESTBOARD) { throw RuntimeError("RxRoi not implemented for this Detector"); } if (modules.size() == 0) { @@ -1614,7 +1618,7 @@ defs::ROI DetectorImpl::getRxROI() const { } void DetectorImpl::setRxROI(const defs::ROI arg) { - if (shm()->detType == CHIPTESTBOARD || shm()->detType == MOENCH) { + if (shm()->detType == CHIPTESTBOARD) { throw RuntimeError("RxRoi not implemented for this Detector"); } if (modules.size() == 0) { diff --git a/slsDetectorSoftware/src/DetectorImpl.h b/slsDetectorSoftware/src/DetectorImpl.h index 11fde7235..21f8dcdd8 100644 --- a/slsDetectorSoftware/src/DetectorImpl.h +++ b/slsDetectorSoftware/src/DetectorImpl.h @@ -357,7 +357,7 @@ class DetectorImpl : public virtual slsDetectorDefs { */ void readFrameFromReceiver(); - /** [Eiger][Jungfrau] + /** [Eiger][Jungfrau][Moench] * add gap pixels to the imag * @param image pointer to image without gap pixels * @param gpImage poiner to image with gap pixels, if NULL, allocated diff --git a/slsDetectorSoftware/src/HelpDacs.h b/slsDetectorSoftware/src/HelpDacs.h index f5eb3e9b1..793038f81 100644 --- a/slsDetectorSoftware/src/HelpDacs.h +++ b/slsDetectorSoftware/src/HelpDacs.h @@ -91,7 +91,7 @@ std::string GetHelpDac(std::string dac) { } if (dac == "vref_ds") { return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard][Jungfrau] Dac for ??"); + "\n\t[Gotthard][Jungfrau][Moench] Dac for ??"); } if (dac == "vcascn_pb") { return std::string( @@ -103,7 +103,7 @@ std::string GetHelpDac(std::string dac) { } if (dac == "vout_cm") { return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard] Dac for ??\n\t[Moench] Dac for 5"); + "\n\t[Gotthard] Dac for ??"); } if (dac == "vcasc_out") { return std::string( @@ -111,11 +111,11 @@ std::string GetHelpDac(std::string dac) { } if (dac == "vin_cm") { return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard] Dac for ??\n\t[Moench] Dac for 2"); + "\n\t[Gotthard] Dac for ??"); } if (dac == "vref_comp") { return std::string("[dac or mV value][(optional unit) mV] " - "\n\t[Gotthard][Jungfrau] Dac for ??"); + "\n\t[Gotthard][Jungfrau][Moench] Dac for ??"); } if (dac == "ib_test_c") { return std::string( @@ -129,7 +129,7 @@ std::string GetHelpDac(std::string dac) { if (dac == "vipre") { return std::string( "[dac or mV value][(optional unit) mV] \n\t[Mythen3] Dac for the " - "preamplifier's input transistor current.\n\t[Moench] Dac for 1"); + "preamplifier's input transistor current."); } if (dac == "vdcsh") { return std::string( @@ -224,7 +224,8 @@ std::string GetHelpDac(std::string dac) { } if (dac == "vref_prech") { return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Gotthard2][Jungfrau] " + "[dac or mV value][(optional unit) mV] " + "\n\t[Gotthard2][Jungfrau][Moench] " "Dac for reference votlage for precharing the preamplifier."); } if (dac == "vref_l_adc") { @@ -254,44 +255,39 @@ std::string GetHelpDac(std::string dac) { "common mode voltage of ADC DAC bank 2."); } if (dac == "vb_ds") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Jungfrau] Dac for ??"); + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau][Moench] Dac for ??"); } if (dac == "vb_comp") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Jungfrau] Dac for ??"); + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau][Moench] Dac for ??"); } if (dac == "vb_pixbuf") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Jungfrau] Dac for ??"); + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau][Moench] Dac for ??"); } if (dac == "vin_com") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Jungfrau] Dac for ??"); + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau][Moench] Dac for ??"); } if (dac == "vdd_prot") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Jungfrau] Dac for ??"); + return std::string("[dac or mV value][(optional unit) mV] " + "\n\t[Jungfrau][Moench] Dac for ??"); } if (dac == "vbp_colbuf") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 0"); + return std::string("[dac or mV value][(optional unit) mV] \n"); } if (dac == "vb_sda") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 3"); + return std::string("[dac or mV value][(optional unit) mV] \n"); } if (dac == "vcasc_sfp") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 4"); + return std::string("[dac or mV value][(optional unit) mV] \n"); } if (dac == "vipre_cds") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 6"); + return std::string("[dac or mV value][(optional unit) mV] \n"); } if (dac == "ibias_sfp") { - return std::string( - "[dac or mV value][(optional unit) mV] \n\t[Moench] Dac for 7"); + return std::string("[dac or mV value][(optional unit) mV] \n"); } // clang-format off diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 5772e2672..07b5cdeb7 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -155,7 +155,7 @@ slsDetectorDefs::detectorType Module::getDetectorType() const { } void Module::updateNumberOfChannels() { - if (shm()->detType == CHIPTESTBOARD || shm()->detType == MOENCH) { + if (shm()->detType == CHIPTESTBOARD) { std::array retvals{}; sendToDetector(F_GET_NUM_CHANNELS, nullptr, retvals); shm()->nChan.x = retvals[0]; @@ -1225,7 +1225,7 @@ std::string Module::printReceiverConfiguration() { os << "\n\nModule " << moduleIndex << "\nReceiver Hostname:\t" << getReceiverHostname(); - if (shm()->detType == JUNGFRAU) { + if (shm()->detType == JUNGFRAU || shm()->detType == MOENCH) { os << "\nNumber of Interfaces:\t" << getNumberofUDPInterfacesFromShm() << "\nSelected Interface:\t" << getSelectedUDPInterface(); } @@ -1235,14 +1235,15 @@ std::string Module::printReceiverConfiguration() { << getDestinationUDPIP() << "\nDestination UDP MAC:\t" << getDestinationUDPMAC(); - if (shm()->detType == JUNGFRAU) { + if (shm()->detType == JUNGFRAU || shm()->detType == MOENCH) { os << "\nSource UDP IP2:\t" << getSourceUDPIP2() << "\nSource UDP MAC2:\t" << getSourceUDPMAC2() << "\nDestination UDP IP2:\t" << getDestinationUDPIP2() << "\nDestination UDP MAC2:\t" << getDestinationUDPMAC2(); } os << "\nDestination UDP Port:\t" << getDestinationUDPPort(); - if (shm()->detType == JUNGFRAU || shm()->detType == EIGER) { + if (shm()->detType == JUNGFRAU || shm()->detType == MOENCH || + shm()->detType == EIGER) { os << "\nDestination UDP Port2:\t" << getDestinationUDPPort2(); } os << "\n"; @@ -1791,7 +1792,7 @@ void Module::setTop(bool value) { sendToDetector(F_SET_TOP, static_cast(value), nullptr); } -// Jungfrau Specific +// Jungfrau/Moench Specific double Module::getChipVersion() const { return (sendToDetector(F_GET_CHIP_VERSION)) / 10.00; } @@ -2303,7 +2304,7 @@ void Module::setDigitalPulsing(const bool enable) { sendToDetector(F_SET_DIGITAL_PULSING, static_cast(enable), nullptr); } -// CTB / Moench Specific +// CTB Specific int Module::getNumberOfAnalogSamples() const { return sendToDetector(F_GET_NUM_ANALOG_SAMPLES); } @@ -2538,8 +2539,6 @@ void Module::setPatternBitMask(uint64_t mask) { void Module::startPattern() { sendToDetector(F_START_PATTERN); } -// Moench - std::map Module::getAdditionalJsonHeader() const { // TODO, refactor this function with a more robust sending. // Now assuming whitespace separated key value @@ -2632,8 +2631,8 @@ void Module::programFPGA(std::vector buffer, const bool forceDeleteNormalFile) { switch (shm()->detType) { case JUNGFRAU: - case CHIPTESTBOARD: case MOENCH: + case CHIPTESTBOARD: sendProgram(true, buffer, F_PROGRAM_FPGA, "Update Firmware", "", forceDeleteNormalFile); break; @@ -2653,8 +2652,8 @@ void Module::updateDetectorServer(std::vector buffer, const std::string &serverName) { switch (shm()->detType) { case JUNGFRAU: - case CHIPTESTBOARD: case MOENCH: + case CHIPTESTBOARD: sendProgram(true, buffer, F_UPDATE_DETECTOR_SERVER, "Update Detector Server (no tftp)", serverName); break; @@ -2674,8 +2673,8 @@ void Module::updateDetectorServer(std::vector buffer, void Module::updateKernel(std::vector buffer) { switch (shm()->detType) { case JUNGFRAU: - case CHIPTESTBOARD: case MOENCH: + case CHIPTESTBOARD: sendProgram(true, buffer, F_UPDATE_KERNEL, "Update Kernel"); break; case MYTHEN3: diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index 58c6de954..ca496d407 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -388,7 +388,7 @@ class Module : public virtual slsDetectorDefs { /************************************************** * * - * Jungfrau Specific * + * Jungfrau/Moench Specific * * * * ************************************************/ double getChipVersion() const; @@ -490,7 +490,7 @@ class Module : public virtual slsDetectorDefs { /************************************************** * * - * CTB / Moench Specific * + * CTB Specific * * * * ************************************************/ int getNumberOfAnalogSamples() const; @@ -501,12 +501,6 @@ class Module : public virtual slsDetectorDefs { void setADCEnableMask(uint32_t mask); uint32_t getTenGigaADCEnableMask() const; void setTenGigaADCEnableMask(uint32_t mask); - - /************************************************** - * * - * CTB Specific * - * * - * ************************************************/ int getNumberOfDigitalSamples() const; void setNumberOfDigitalSamples(int value); readoutMode getReadoutMode() const; diff --git a/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp b/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp index 3ead23a64..c1ee17480 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-chiptestboard.cpp @@ -107,7 +107,7 @@ TEST_CASE("adcvpp", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getADCVpp(false); { std::ostringstream oss; @@ -132,14 +132,14 @@ TEST_CASE("adcvpp", "[.cmd]") { } } -/* CTB/ Moench Specific */ +/* CTB Specific */ TEST_CASE("samples", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_asamples = det.getNumberOfAnalogSamples(); Result prev_dsamples = 0; if (det_type == defs::CHIPTESTBOARD) { @@ -186,7 +186,7 @@ TEST_CASE("asamples", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getNumberOfAnalogSamples(); { std::ostringstream oss; @@ -216,7 +216,7 @@ TEST_CASE("adcclk", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getADCClock(); { std::ostringstream oss; @@ -247,7 +247,7 @@ TEST_CASE("runclk", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getRUNClock(); { std::ostringstream oss; @@ -277,7 +277,7 @@ TEST_CASE("syncclk", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { REQUIRE_NOTHROW(proxy.Call("syncclk", {}, -1, GET)); } else { // clock index might work @@ -290,7 +290,7 @@ TEST_CASE("adcpipeline", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getADCPipeline(); { std::ostringstream oss; @@ -325,7 +325,7 @@ TEST_CASE("v_limit", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getVoltage(defs::V_LIMIT); { std::ostringstream oss; @@ -363,7 +363,7 @@ TEST_CASE("adcenable", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getADCEnableMask(); { std::ostringstream oss; @@ -393,7 +393,7 @@ TEST_CASE("adcenable10g", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getTenGigaADCEnableMask(); { std::ostringstream oss; diff --git a/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp b/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp index 21e8eb1e8..71cc96989 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-jungfrau.cpp @@ -23,7 +23,7 @@ TEST_CASE("Setting and reading back Jungfrau dacs", "[.cmd][.dacs]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { SECTION("vb_comp") { test_dac(defs::VB_COMP, "vb_comp", 1220); } SECTION("vdd_prot") { test_dac(defs::VDD_PROT, "vdd_prot", 3000); } SECTION("vin_com") { test_dac(defs::VIN_COM, "vin_com", 1053); } @@ -102,7 +102,7 @@ TEST_CASE("selinterface", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getSelectedUDPInterface().tsquash( "inconsistent selected interface to test"); { @@ -127,13 +127,13 @@ TEST_CASE("selinterface", "[.cmd]") { } } -/* Jungfrau Specific */ +/* Jungfrau/moench Specific */ TEST_CASE("temp_threshold", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getThresholdTemperature(); { std::ostringstream oss; @@ -163,7 +163,7 @@ TEST_CASE("chipversion", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { REQUIRE_NOTHROW(proxy.Call("chipversion", {}, -1, GET)); } else { REQUIRE_THROWS(proxy.Call("chipversion", {}, -1, GET)); @@ -175,7 +175,7 @@ TEST_CASE("temp_control", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getTemperatureControl(); { std::ostringstream oss; @@ -205,7 +205,7 @@ TEST_CASE("temp_event", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { { std::ostringstream oss; proxy.Call("temp_event", {"0"}, -1, PUT, oss); @@ -226,7 +226,7 @@ TEST_CASE("autocompdisable", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getAutoComparatorDisable(); { std::ostringstream oss; @@ -256,7 +256,7 @@ TEST_CASE("compdisabletime", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU && + if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) && det.getChipVersion().squash() * 10 == 11) { auto prev_val = det.getComparatorDisableTime(); { @@ -287,7 +287,7 @@ TEST_CASE("extrastoragecells", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { // chip version 1.0 if (det.getChipVersion().squash() * 10 == 10) { auto prev_val = det.getNumberOfAdditionalStorageCells().tsquash( @@ -330,7 +330,7 @@ TEST_CASE("storagecell_start", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getStorageCellStart(); { std::ostringstream oss; @@ -375,7 +375,7 @@ TEST_CASE("storagecell_delay", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { // chip version 1.0 if (det.getChipVersion().squash() * 10 == 10) { auto prev_val = det.getStorageCellDelay(); @@ -416,7 +416,7 @@ TEST_CASE("gainmode", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getGainMode(); { std::ostringstream oss; @@ -465,7 +465,7 @@ TEST_CASE("filtercells", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { // chip version 1.1 if (det.getChipVersion().squash() * 10 == 11) { auto prev_val = det.getNumberOfFilterCells(); @@ -510,7 +510,7 @@ TEST_CASE("sync", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getSynchronization().tsquash( "inconsistent synchronization to test"); { diff --git a/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp b/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp index b7656db3a..78319f98b 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp @@ -19,94 +19,4 @@ using test::PUT; /* dacs */ -TEST_CASE("Setting and reading back MOENCH dacs", "[.cmd][.dacs]") { - // vbp_colbuf, vipre, vin_cm", vb_sda, vcasc_sfp, vout_cm, vipre_cds, - // ibias_sfp - - Detector det; - CmdProxy proxy(&det); - auto det_type = det.getDetectorType().squash(); - if (det_type == defs::MOENCH) { - SECTION("vbp_colbuf") { - test_dac(defs::VBP_COLBUF, "vbp_colbuf", 1300); - } - SECTION("vipre") { test_dac(defs::VIPRE, "vipre", 1000); } - SECTION("vin_cm") { test_dac(defs::VIN_CM, "vin_cm", 1400); } - SECTION("vb_sda") { test_dac(defs::VB_SDA, "vb_sda", 680); } - SECTION("vcasc_sfp") { test_dac(defs::VCASC_SFP, "vcasc_sfp", 1428); } - SECTION("vout_cm") { test_dac(defs::VOUT_CM, "vout_cm", 1200); } - SECTION("vipre_cds") { test_dac(defs::VIPRE_CDS, "vipre_cds", 800); } - SECTION("ibias_sfp") { test_dac(defs::IBIAS_SFP, "ibias_sfp", 900); } - - // eiger - REQUIRE_THROWS(proxy.Call("dac", {"vthreshold"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vsvp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vsvn"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtrim"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrpreamp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtgstv"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_ll"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_lr"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rl"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcmp_rr"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"rxb_rb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"rxb_lb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcn"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vishaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"iodelay"}, -1, GET)); - // jungfrau - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vdd_prot"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vin_com"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_prech"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_pixbuf"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp"}, -1, GET)); - // gotthard - REQUIRE_THROWS(proxy.Call("dac", {"vref_ds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcascn_pb"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcascp_pb"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vout_cm"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcasc_out"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vin_cm"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"ib_test_c"}, -1, GET)); - // mythen3 - REQUIRE_THROWS(proxy.Call("dac", {"vrpreamp"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vrshaper_n"}, -1, GET)); - // REQUIRE_THROWS(proxy.Call("dac", {"vipre"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vishaper"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vdcsh"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth2"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vth3"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal_n"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcal_p"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vtrim"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcassh"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcas"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vicin"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vipre_out"}, -1, GET)); - // gotthard2 - REQUIRE_THROWS(proxy.Call("dac", {"vref_h_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp_fe"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_comp_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_cds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_rstore"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_opa_1st"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_comp_fe"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_adc1"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_l_adc"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vref_cds"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_cs"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vb_opa_fd"}, -1, GET)); - REQUIRE_THROWS(proxy.Call("dac", {"vcom_adc2"}, -1, GET)); - } -} - } // namespace sls diff --git a/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp b/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp index 5e5fc2a67..623d9fdcb 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-pattern.cpp @@ -23,8 +23,7 @@ TEST_CASE("pattern", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { // no proper test for put REQUIRE_THROWS(proxy.Call("pattern", {}, -1, GET)); } else { @@ -36,8 +35,7 @@ TEST_CASE("savepattern", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { REQUIRE_THROWS( proxy.Call("savepattern", {"/tmp/pattern.txt"}, -1, GET)); if (det.size() == 1) { @@ -54,7 +52,7 @@ TEST_CASE("defaultpattern", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::MOENCH || det_type == defs::MYTHEN3) { + if (det_type == defs::MYTHEN3) { REQUIRE_THROWS(proxy.Call("defaultpattern", {}, -1, GET)); REQUIRE_NOTHROW(proxy.Call("defaultpattern", {}, -1, PUT)); } else { @@ -68,7 +66,7 @@ TEST_CASE("patioctrl", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getPatternIOControl(); { std::ostringstream oss; @@ -98,8 +96,7 @@ TEST_CASE("patword", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { int addr = 0x23; std::string saddr = ToStringHex(addr, 4); auto prev_val = det.getPatternWord(addr); @@ -134,8 +131,7 @@ TEST_CASE("patlimits", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternLoopAddresses(-1); { std::ostringstream oss; @@ -161,8 +157,7 @@ TEST_CASE("patloop", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -208,8 +203,7 @@ TEST_CASE("patnloop", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -254,8 +248,7 @@ TEST_CASE("patwait", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -300,8 +293,7 @@ TEST_CASE("patwaittime", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { for (int iLoop = 0; iLoop != MAX_PATTERN_LEVELS; ++iLoop) { // m3 only has 3 levels if (det_type == defs::MYTHEN3 && iLoop >= 3) { @@ -346,8 +338,7 @@ TEST_CASE("patmask", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternMask(); { std::ostringstream oss; @@ -372,8 +363,7 @@ TEST_CASE("patsetbit", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::MYTHEN3) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3) { auto prev_val = det.getPatternBitMask(); { std::ostringstream oss; diff --git a/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp b/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp index 728035b8b..8431a5700 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-rx.cpp @@ -451,7 +451,7 @@ TEST_CASE("rx_roi", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { REQUIRE_THROWS(proxy.Call("rx_roi", {"5", "10"}, -1, PUT)); } else { auto prev_val = det.getRxROI(); @@ -513,7 +513,7 @@ TEST_CASE("rx_clearroi", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + if (det_type == defs::CHIPTESTBOARD) { REQUIRE_THROWS(proxy.Call("rx_clearroi", {}, -1, PUT)); } else { auto prev_val = det.getRxROI(); @@ -805,7 +805,7 @@ TEST_CASE("rx_zmqport", "[.cmd][.rx]") { auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER) { socketsperdetector *= 2; - } else if (det_type == defs::JUNGFRAU) { + } else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { proxy.Call("numinterfaces", {"2"}, -1, PUT); socketsperdetector *= 2; } @@ -830,7 +830,7 @@ TEST_CASE("rx_zmqport", "[.cmd][.rx]") { for (int i = 0; i != det.size(); ++i) { det.setRxZmqPort(prev_val_zmqport[i], i); } - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { det.setNumberofUDPInterfaces(prev_val_numinterfaces); } } @@ -948,8 +948,6 @@ TEST_CASE("rx_dbitoffset", "[.cmd][.rx]") { } } -/* Moench */ - TEST_CASE("rx_jsonaddheader", "[.cmd][.rx]") { Detector det; CmdProxy proxy(&det); diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index dcee45551..72387362f 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -149,7 +149,8 @@ TEST_CASE("moduleid", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2 || det_type == defs::MYTHEN3 || - det_type == defs::EIGER || det_type == defs::JUNGFRAU) { + det_type == defs::EIGER || det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) { REQUIRE_NOTHROW(proxy.Call("moduleid", {}, -1, GET)); } else { REQUIRE_THROWS(proxy.Call("moduleid", {}, -1, GET)); @@ -217,6 +218,7 @@ TEST_CASE("settings", "[.cmd]") { std::vector sett; switch (det_type) { case defs::JUNGFRAU: + case defs::MOENCH: sett.push_back("gain0"); sett.push_back("highgain0"); break; @@ -232,16 +234,6 @@ TEST_CASE("settings", "[.cmd]") { sett.push_back("fixgain1"); sett.push_back("fixgain2"); break; - case defs::MOENCH: - sett.push_back("g1_hg"); - sett.push_back("g1_lg"); - sett.push_back("g2_hc_hg"); - sett.push_back("g2_hc_lg"); - sett.push_back("g2_lc_hg"); - sett.push_back("g2_lc_lg"); - sett.push_back("g4_hg"); - sett.push_back("g4_lg"); - break; case defs::MYTHEN3: sett.push_back("standard"); sett.push_back("fast"); @@ -525,7 +517,8 @@ TEST_CASE("gappixels", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::EIGER) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::EIGER) { auto prev_val = det.getGapPixelsinCallback(); { std::ostringstream oss; @@ -562,17 +555,17 @@ TEST_CASE("fliprows", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - bool jungfrauhw2 = false; - if (det_type == defs::JUNGFRAU && + bool hw2 = false; + if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) && ((det.getHardwareVersion().tsquash( "inconsistent serial number to test") == "2.0"))) { - jungfrauhw2 = true; + hw2 = true; } - if (det_type == defs::EIGER || jungfrauhw2) { + if (det_type == defs::EIGER || hw2) { auto previous = det.getFlipRows(); auto previous_numudp = det.getNumberofUDPInterfaces().tsquash( "inconsistent number of udp interfaces to test"); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { det.setNumberofUDPInterfaces(2); } std::ostringstream oss1, oss2, oss3; @@ -585,7 +578,7 @@ TEST_CASE("fliprows", "[.cmd]") { for (int i = 0; i != det.size(); ++i) { det.setFlipRows(previous[i], {i}); } - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { det.setNumberofUDPInterfaces(previous_numudp); } } else { @@ -599,10 +592,10 @@ TEST_CASE("master", "[.cmd]") { auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD || det_type == defs::GOTTHARD2 || - det_type == defs::JUNGFRAU) { + det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { REQUIRE_NOTHROW(proxy.Call("master", {}, -1, GET)); if (det_type == defs::EIGER || det_type == defs::GOTTHARD2 || - det_type == defs::JUNGFRAU) { + det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { // get previous master int prevMaster = 0; { @@ -743,7 +736,7 @@ TEST_CASE("exptime", "[.cmd][.time]") { proxy.Call("exptime", {"1s"}, -1, PUT, oss); REQUIRE(oss.str() == "exptime 1s\n"); } - if (det_type != defs::JUNGFRAU) { + if (det_type != defs::JUNGFRAU && det_type != defs::MOENCH) { { std::ostringstream oss; proxy.Call("exptime", {"0"}, -1, PUT, oss); @@ -849,7 +842,6 @@ TEST_CASE("delayl", "[.cmd]") { switch (det_type) { case defs::EIGER: case defs::CHIPTESTBOARD: - case defs::MOENCH: case defs::GOTTHARD2: case defs::MYTHEN3: REQUIRE_THROWS(proxy.Call("delayl", {}, -1, GET)); @@ -867,7 +859,6 @@ TEST_CASE("periodl", "[.cmd]") { switch (det_type) { case defs::EIGER: case defs::CHIPTESTBOARD: - case defs::MOENCH: case defs::GOTTHARD2: case defs::MYTHEN3: REQUIRE_THROWS(proxy.Call("periodl", {}, -1, GET)); @@ -1001,12 +992,12 @@ TEST_CASE("readoutspeed", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || - det_type == defs::GOTTHARD2) { + det_type == defs::MOENCH || det_type == defs::GOTTHARD2) { auto prev_val = det.getReadoutSpeed(); - // full speed for jungfrau only works for new boards (chipv1.1 is with - // new board [hw1.0 and chipv1.0 not tested here]) - if ((det_type == defs::JUNGFRAU && + // full speed for jungfrau/moench only works for new boards (chipv1.1 is + // with new board [hw1.0 and chipv1.0 not tested here]) + if (((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) && det.getChipVersion().squash() * 10 == 11) || (det_type == defs::EIGER)) { std::ostringstream oss1, oss2, oss3, oss4; @@ -1020,7 +1011,8 @@ TEST_CASE("readoutspeed", "[.cmd]") { REQUIRE(oss4.str() == "readoutspeed full_speed\n"); } - if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) { + if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) { { std::ostringstream oss1, oss2, oss3, oss4; proxy.Call("readoutspeed", {"1"}, -1, PUT, oss1); @@ -1086,7 +1078,7 @@ TEST_CASE("readoutspeedlist", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2 || det_type == defs::JUNGFRAU || - det_type == defs::EIGER) { + det_type == defs::MOENCH || det_type == defs::EIGER) { REQUIRE_NOTHROW(proxy.Call("readoutspeedlist", {}, -1, GET)); REQUIRE_THROWS(proxy.Call("readoutspeedlist", {}, -1, PUT)); } else { @@ -1099,7 +1091,7 @@ TEST_CASE("adcphase", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD || det_type == defs::JUNGFRAU || - det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH) { + det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD) { if (det_type == defs::GOTTHARD) { std::ostringstream oss1; proxy.Call("adcphase", {"20"}, -1, PUT, oss1); @@ -1137,8 +1129,8 @@ TEST_CASE("maxadcphaseshift", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || // only because clk index of 0 exists det_type == defs::GOTTHARD2) { // only because clk index of 0 exists REQUIRE_NOTHROW(proxy.Call("maxadcphaseshift", {}, -1, GET)); @@ -1151,7 +1143,8 @@ TEST_CASE("dbitphase", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD) { auto prev_val = det.getDBITPhase(); { std::ostringstream oss1, oss2; @@ -1180,7 +1173,8 @@ TEST_CASE("maxdbitphaseshift", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || // only because clk index of 0 exists det_type == defs::GOTTHARD2) { // only because clk index of 0 exists REQUIRE_NOTHROW(proxy.Call("maxdbitphaseshift", {}, -1, GET)); @@ -1305,8 +1299,8 @@ TEST_CASE("highvoltage", "[.cmd]") { } } // range 0, 60 - 200 - else if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH) { + else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD) { REQUIRE_THROWS(proxy.Call("highvoltage", {"50"}, -1, PUT)); { std::ostringstream oss1, oss2; @@ -1384,8 +1378,8 @@ TEST_CASE("powerchip", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::MYTHEN3 || - det_type == defs::GOTTHARD2 || det_type == defs::MOENCH) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { auto prev_val = det.getPowerChip(); { std::ostringstream oss; @@ -1434,8 +1428,9 @@ TEST_CASE("imagetest", "[.cmd]") { for (int i = 0; i != det.size(); ++i) { det.setImageTestMode(prev_val[i], {i}); } - } else if (det_type != defs::JUNGFRAU && det_type != defs::EIGER) { - // wont fail for eiger and jungfrau virtual servers + } else if (det_type != defs::JUNGFRAU && det_type != defs::MOENCH && + det_type != defs::EIGER) { + // wont fail for eiger and jungfrau/moench virtual servers REQUIRE_THROWS(proxy.Call("imagetest", {}, -1, GET)); } } @@ -1557,7 +1552,7 @@ TEST_CASE("filterresistor", "[.cmd]") { // only for chipv1.1 bool chip11 = false; - if (det_type == defs::JUNGFRAU && + if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) && det.getChipVersion().squash() * 10 == 11) { chip11 = true; } @@ -1648,14 +1643,15 @@ TEST_CASE("readnrows", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) { - bool jungfrauhw2 = false; - if (det_type == defs::JUNGFRAU && + if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) { + bool hw2 = false; + if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) && ((det.getHardwareVersion().tsquash( "inconsistent hardware version number to test") == "2.0"))) { - jungfrauhw2 = true; + hw2 = true; } - if (det_type == defs::JUNGFRAU && !jungfrauhw2) { + if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) && !hw2) { { std::ostringstream oss; proxy.Call("readnrows", {}, -1, GET, oss); @@ -1678,7 +1674,7 @@ TEST_CASE("readnrows", "[.cmd]") { proxy.Call("readnrows", {"16"}, -1, PUT, oss); REQUIRE(oss.str() == "readnrows 16\n"); } - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { REQUIRE_THROWS(proxy.Call("readnrows", {"7"}, -1, PUT)); REQUIRE_THROWS(proxy.Call("readnrows", {"20"}, -1, PUT)); REQUIRE_THROWS(proxy.Call("readnrows", {"44"}, -1, PUT)); @@ -1700,7 +1696,8 @@ TEST_CASE("currentsource", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::GOTTHARD2 || det_type == defs::JUNGFRAU) { + if (det_type == defs::GOTTHARD2 || det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) { auto prev_val = det.getCurrentSource(); if (det_type == defs::GOTTHARD2) { @@ -1724,7 +1721,7 @@ TEST_CASE("currentsource", "[.cmd]") { REQUIRE_THROWS(proxy.Call("currentsource", {"1", "fix", "42", "normal"}, -1, PUT)); } - // jungfrau + // jungfrau/moench else { int chipVersion = det.getChipVersion().tsquash( "inconsistent chip versions to test") * @@ -1852,7 +1849,8 @@ TEST_CASE("temp_adc", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::GOTTHARD) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::GOTTHARD) { REQUIRE_NOTHROW(proxy.Call("temp_adc", {}, -1, GET)); std::ostringstream oss; REQUIRE_NOTHROW(proxy.Call("temp_adc", {}, 0, GET, oss)); @@ -1867,7 +1865,7 @@ TEST_CASE("temp_fpga", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type != defs::MOENCH && det_type != defs::CHIPTESTBOARD) { + if (det_type != defs::CHIPTESTBOARD) { REQUIRE_NOTHROW(proxy.Call("temp_fpga", {}, -1, GET)); std::ostringstream oss; REQUIRE_NOTHROW(proxy.Call("temp_fpga", {}, 0, GET, oss)); @@ -1924,7 +1922,7 @@ TEST_CASE("defaultdac", "[.cmd]") { det.setDefaultDac(it, prev_val[i], {i}); } } - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { std::vector daclist = { defs::VREF_PRECH, defs::VREF_DS, defs::VREF_COMP}; for (auto it : daclist) { @@ -1964,7 +1962,7 @@ TEST_CASE("resetdacs", "[.cmd]") { REQUIRE_NOTHROW(proxy.Call("resetdacs", {}, -1, PUT)); REQUIRE_NOTHROW(proxy.Call("resetdacs", {"hard"}, -1, PUT)); - // settings should not change especially for jungfrau and m3 + // settings should not change especially for jungfrau/moench and m3 auto next_val = det.getSettings(); for (int i = 0; i != det.size(); ++i) { REQUIRE(prev_val[i] == next_val[i]); @@ -1984,7 +1982,8 @@ TEST_CASE("trigger", "[.cmd]") { auto det_type = det.getDetectorType().squash(); if (det_type == defs::MYTHEN3) { REQUIRE_NOTHROW(proxy.Call("trigger", {}, -1, PUT)); - } else if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) { + } else if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) { auto prev_timing = det.getTimingMode().tsquash("inconsistent timing mode in test"); auto prev_frames = @@ -2024,7 +2023,8 @@ TEST_CASE("blockingtrigger", "[.cmd]") { CmdProxy proxy(&det); REQUIRE_THROWS(proxy.Call("blockingtrigger", {}, -1, GET)); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) { + if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) { auto prev_timing = det.getTimingMode().tsquash("inconsistent timing mode in test"); auto prev_frames = @@ -2275,6 +2275,7 @@ TEST_CASE("scan", "[.cmd]") { notImplementedInd = defs::VCASCP_PB; break; case defs::JUNGFRAU: + case defs::MOENCH: ind = defs::VB_COMP; notImplementedInd = defs::VSVP; break; @@ -2282,10 +2283,6 @@ TEST_CASE("scan", "[.cmd]") { ind = defs::VREF_DS; notImplementedInd = defs::VSVP; break; - case defs::MOENCH: - ind = defs::VBP_COLBUF; - notImplementedInd = defs::VSVP; - break; case defs::GOTTHARD2: ind = defs::VB_COMP_FE; notImplementedInd = defs::VSVP; @@ -2401,7 +2398,7 @@ TEST_CASE("numinterfaces", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { auto prev_val = det.getNumberofUDPInterfaces().tsquash( "inconsistent numinterfaces to test"); { @@ -2456,8 +2453,9 @@ TEST_CASE("udp_dstlist", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::EIGER || - det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2) { REQUIRE_NOTHROW(proxy.Call("udp_dstlist", {}, 0, GET, std::cout, 0)); REQUIRE_THROWS(proxy.Call( "udp_dstlist", {"ip=0.0.0.0", "mac=00:00:00:00:00:00", "port=1233"}, @@ -2471,8 +2469,9 @@ TEST_CASE("udp_numdst", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::EIGER || - det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::EIGER || det_type == defs::MYTHEN3 || + det_type == defs::GOTTHARD2) { REQUIRE_NOTHROW(proxy.Call("udp_numdst", {}, -1, GET)); } else { REQUIRE_THROWS(proxy.Call("udp_numdst", {}, -1, GET)); @@ -2491,8 +2490,8 @@ TEST_CASE("udp_firstdst", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::MYTHEN3 || - det_type == defs::GOTTHARD2) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { auto prev_val = det.getFirstUDPDestination(); { std::ostringstream oss; @@ -2568,7 +2567,8 @@ TEST_CASE("udp_srcip2", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::GOTTHARD2) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::GOTTHARD2) { auto prev_val = det.getSourceUDPIP2(); REQUIRE_THROWS(proxy.Call("udp_srcip2", {"0.0.0.0"}, -1, PUT)); { @@ -2589,7 +2589,8 @@ TEST_CASE("udp_dstip2", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::GOTTHARD2) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::GOTTHARD2) { REQUIRE_THROWS(proxy.Call("udp_dstip2", {"0.0.0.0"}, -1, PUT)); } else { REQUIRE_THROWS(proxy.Call("udp_dstip2", {}, -1, GET)); @@ -2600,7 +2601,8 @@ TEST_CASE("udp_srcmac2", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::GOTTHARD2) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::GOTTHARD2) { auto prev_val = det.getSourceUDPMAC2(); REQUIRE_THROWS( proxy.Call("udp_srcmac2", {"00:00:00:00:00:00"}, -1, PUT)); @@ -2623,7 +2625,8 @@ TEST_CASE("udp_dstmac2", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::GOTTHARD2) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::GOTTHARD2) { REQUIRE_THROWS( proxy.Call("udp_dstmac2", {"00:00:00:00:00:00"}, -1, PUT)); } else { @@ -2635,8 +2638,8 @@ TEST_CASE("udp_dstport2", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::GOTTHARD2 || - det_type == defs::EIGER) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::GOTTHARD2 || det_type == defs::EIGER) { auto prev_val = det.getDestinationUDPPort2(); { std::ostringstream oss; @@ -2671,7 +2674,7 @@ TEST_CASE("tengiga", "[.cmd]") { auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || det_type == defs::MYTHEN3) { + det_type == defs::MYTHEN3) { auto tengiga = det.getTenGiga(); det.setTenGiga(false); @@ -2694,7 +2697,8 @@ TEST_CASE("flowcontrol10g", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) { + if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) { auto prev_val = det.getTenGigaFlowControl(); { std::ostringstream oss; @@ -2724,10 +2728,11 @@ TEST_CASE("txdelay_frame", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || - det_type == defs::MYTHEN3) { + det_type == defs::MOENCH || det_type == defs::MYTHEN3) { auto prev_val = det.getTransmissionDelayFrame(); auto val = 5000; - if (det_type == defs::JUNGFRAU || det_type == defs::MYTHEN3) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::MYTHEN3) { val = 5; } std::string sval = std::to_string(val); @@ -2751,10 +2756,11 @@ TEST_CASE("txdelay", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || - det_type == defs::MYTHEN3) { + det_type == defs::MOENCH || det_type == defs::MYTHEN3) { // cannot get transmission delay with just one module - if ((det_type == defs::JUNGFRAU || det_type == defs::MYTHEN3) && + if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::MYTHEN3) && (det.size() < 2)) { REQUIRE_THROWS(proxy.Call("txdelay", {}, -1, GET)); int val = 5; @@ -2776,7 +2782,8 @@ TEST_CASE("txdelay", "[.cmd]") { } auto prev_frame = det.getTransmissionDelayFrame(); auto val = 5000; - if (det_type == defs::JUNGFRAU || det_type == defs::MYTHEN3) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::MYTHEN3) { val = 5; } std::string sval = std::to_string(val); @@ -2829,7 +2836,7 @@ TEST_CASE("zmqport", "[.cmd]") { int prev = 1; if (det_type == defs::EIGER) { socketsperdetector *= 2; - } else if (det_type == defs::JUNGFRAU) { + } else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { prev = det.getNumberofUDPInterfaces().squash(); det.setNumberofUDPInterfaces(2); socketsperdetector *= 2; @@ -2863,7 +2870,7 @@ TEST_CASE("zmqport", "[.cmd]") { std::to_string(port + i * socketsperdetector) + '\n'); } - if (det_type == defs::JUNGFRAU) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) { det.setNumberofUDPInterfaces(prev); } } @@ -2917,8 +2924,8 @@ TEST_CASE("programfpga", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::JUNGFRAU || det_type == defs::MYTHEN3 || + if (det_type == defs::CHIPTESTBOARD || det_type == defs::JUNGFRAU || + det_type == defs::MOENCH || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { // TODO program a real board? /// afs/psi.ch/project/sls_det_firmware/jungfrau_firmware/cyclone_V/v0_8/Jungfrau_MCB.pof @@ -2949,8 +2956,8 @@ TEST_CASE("updatekernel", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || det_type == defs::MYTHEN3 || + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { // TODO: send real server? // std::ostringstream oss; @@ -2968,8 +2975,8 @@ TEST_CASE("rebootcontroller", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || det_type == defs::MYTHEN3 || + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2 || det_type == defs::GOTTHARD) { // TODO: reboot real server? // REQUIRE_NOTHROW(proxy.Call("rebootcontroller", {}, -1, PUT)); @@ -2984,8 +2991,8 @@ TEST_CASE("update", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD) { // TODO: update real server and firmware? // REQUIRE_NOTHROW(proxy.Call("update", // {"jungfrauDetectorServerv4.0.1.0", "pc13784", @@ -3028,8 +3035,8 @@ TEST_CASE("adcreg", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || det_type == defs::GOTTHARD) { + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::GOTTHARD) { std::ostringstream oss; proxy.Call("adcreg", {"0x8", "0x3"}, -1, PUT, oss); REQUIRE(oss.str() == "adcreg [0x8, 0x3]\n"); @@ -3113,8 +3120,8 @@ TEST_CASE("firmwaretest", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || det_type == defs::GOTTHARD || + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::GOTTHARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; proxy.Call("firmwaretest", {}, -1, PUT, oss); @@ -3130,8 +3137,8 @@ TEST_CASE("bustest", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || det_type == defs::GOTTHARD || + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::GOTTHARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; proxy.Call("bustest", {}, -1, PUT, oss); @@ -3170,8 +3177,8 @@ TEST_CASE("adcinvert", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::CHIPTESTBOARD || det_type == defs::MOENCH || - det_type == defs::JUNGFRAU) { + if (det_type == defs::CHIPTESTBOARD || det_type == defs::JUNGFRAU || + det_type == defs::MOENCH) { auto prev_val = det.getADCInvert(); { std::ostringstream oss; @@ -3261,8 +3268,8 @@ TEST_CASE("framecounter", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || det_type == defs::MYTHEN3 || + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { auto framecounter = det.getNumberOfFramesFromStart().squash(); std::ostringstream oss; @@ -3280,8 +3287,8 @@ TEST_CASE("runtime", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || det_type == defs::MYTHEN3 || + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; proxy.Call("runtime", {}, -1, GET, oss); @@ -3298,8 +3305,8 @@ TEST_CASE("frametime", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); - if (det_type == defs::JUNGFRAU || det_type == defs::CHIPTESTBOARD || - det_type == defs::MOENCH || det_type == defs::MYTHEN3 || + if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH || + det_type == defs::CHIPTESTBOARD || det_type == defs::MYTHEN3 || det_type == defs::GOTTHARD2) { std::ostringstream oss; proxy.Call("frametime", {}, -1, GET, oss); diff --git a/slsReceiverSoftware/src/ClientInterface.cpp b/slsReceiverSoftware/src/ClientInterface.cpp index bad6ab5d6..804ebcd20 100644 --- a/slsReceiverSoftware/src/ClientInterface.cpp +++ b/slsReceiverSoftware/src/ClientInterface.cpp @@ -351,7 +351,7 @@ int ClientInterface::setup_receiver(Interface &socket) { } impl()->setUDPPortNumber(arg.udp_dstport); impl()->setUDPPortNumber2(arg.udp_dstport2); - if (detType == JUNGFRAU || detType == GOTTHARD2) { + if (detType == JUNGFRAU || detType == MOENCH || detType == GOTTHARD2) { try { impl()->setNumberofUDPInterfaces(arg.udpInterfaces); } catch (const RuntimeError &e) { @@ -367,10 +367,10 @@ int ClientInterface::setup_receiver(Interface &socket) { if (detType == GOTTHARD2) { impl()->setNumberOfBursts(arg.bursts); } - if (detType == JUNGFRAU) { + if (detType == JUNGFRAU || detType == MOENCH) { impl()->setNumberOfAdditionalStorageCells(arg.additionalStorageCells); } - if (detType == MOENCH || detType == CHIPTESTBOARD) { + if (detType == CHIPTESTBOARD) { try { impl()->setNumberofAnalogSamples(arg.analogSamples); } catch (const RuntimeError &e) { @@ -408,7 +408,7 @@ int ClientInterface::setup_receiver(Interface &socket) { } impl()->setThresholdEnergy(arg.thresholdEnergyeV[0]); } - if (detType == EIGER || detType == JUNGFRAU) { + if (detType == EIGER || detType == JUNGFRAU || detType == MOENCH) { impl()->setReadNRows(arg.readNRows); } if (detType == MYTHEN3) { @@ -428,8 +428,7 @@ int ClientInterface::setup_receiver(Interface &socket) { } } impl()->setTimingMode(arg.timMode); - if (detType == EIGER || detType == MOENCH || detType == CHIPTESTBOARD || - detType == MYTHEN3) { + if (detType == EIGER || detType == CHIPTESTBOARD || detType == MYTHEN3) { try { impl()->setTenGigaEnable(arg.tenGiga); } catch (const RuntimeError &e) { @@ -444,7 +443,7 @@ int ClientInterface::setup_receiver(Interface &socket) { "due to fifo memory allocation."); } } - if (detType == CHIPTESTBOARD || detType == MOENCH) { + if (detType == CHIPTESTBOARD) { try { impl()->setADCEnableMask(arg.adcMask); } catch (const RuntimeError &e) { @@ -488,8 +487,8 @@ void ClientInterface::setDetectorType(detectorType arg) { case GOTTHARD: case EIGER: case CHIPTESTBOARD: - case MOENCH: case JUNGFRAU: + case MOENCH: case MYTHEN3: case GOTTHARD2: break; @@ -611,7 +610,7 @@ int ClientInterface::set_burst_mode(Interface &socket) { int ClientInterface::set_num_analog_samples(Interface &socket) { auto value = socket.Receive(); LOG(logDEBUG1) << "Setting num analog samples to " << value; - if (detType != CHIPTESTBOARD && detType != MOENCH) { + if (detType != CHIPTESTBOARD) { functionNotImplemented(); } try { @@ -939,8 +938,7 @@ int ClientInterface::get_overwrite(Interface &socket) { int ClientInterface::enable_tengiga(Interface &socket) { auto val = socket.Receive(); - if (detType != EIGER && detType != CHIPTESTBOARD && detType != MOENCH && - detType != MYTHEN3) + if (detType != EIGER && detType != CHIPTESTBOARD && detType != MYTHEN3) functionNotImplemented(); if (val >= 0) { @@ -1365,7 +1363,7 @@ int ClientInterface::set_read_n_rows(Interface &socket) { auto arg = socket.Receive(); if (arg >= 0) { verifyIdle(socket); - if (detType != EIGER && detType != JUNGFRAU) { + if (detType != EIGER && detType != JUNGFRAU && detType != MOENCH) { throw RuntimeError("Could not set number of rows. Not implemented " "for this detector"); } @@ -1448,7 +1446,7 @@ MacAddr ClientInterface::setUdpIp2(IpAddr arg) { int ClientInterface::set_udp_ip2(Interface &socket) { auto arg = socket.Receive(); verifyIdle(socket); - if (detType != JUNGFRAU && detType != GOTTHARD2) { + if (detType != JUNGFRAU && detType != MOENCH && detType != GOTTHARD2) { throw RuntimeError( "UDP Destination IP2 not implemented for this detector"); } @@ -1467,7 +1465,8 @@ int ClientInterface::set_udp_port(Interface &socket) { int ClientInterface::set_udp_port2(Interface &socket) { auto arg = socket.Receive(); verifyIdle(socket); - if (detType != JUNGFRAU && detType != EIGER && detType != GOTTHARD2) { + if (detType != JUNGFRAU && detType != MOENCH && detType != EIGER && + detType != GOTTHARD2) { throw RuntimeError( "UDP Destination Port2 not implemented for this detector"); } @@ -1480,7 +1479,7 @@ int ClientInterface::set_num_interfaces(Interface &socket) { auto arg = socket.Receive(); arg = (arg > 1 ? 2 : 1); verifyIdle(socket); - if (detType != JUNGFRAU && detType != GOTTHARD2) { + if (detType != JUNGFRAU && detType != MOENCH && detType != GOTTHARD2) { throw RuntimeError( "Number of interfaces not implemented for this detector"); } @@ -1727,7 +1726,7 @@ int ClientInterface::get_receiver_roi(Interface &socket) { int ClientInterface::set_receiver_roi(Interface &socket) { auto arg = socket.Receive(); - if (detType == CHIPTESTBOARD || detType == MOENCH) + if (detType == CHIPTESTBOARD) functionNotImplemented(); LOG(logDEBUG1) << "Set Receiver ROI: " << ToString(arg); verifyIdle(socket); @@ -1741,7 +1740,7 @@ int ClientInterface::set_receiver_roi(Interface &socket) { int ClientInterface::set_receiver_roi_metadata(Interface &socket) { auto arg = socket.Receive(); - if (detType == CHIPTESTBOARD || detType == MOENCH) + if (detType == CHIPTESTBOARD) functionNotImplemented(); LOG(logDEBUG1) << "Set Receiver ROI Metadata: " << ToString(arg); verifyIdle(socket); diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/src/DataProcessor.cpp index 6e9b1e854..0c174638d 100644 --- a/slsReceiverSoftware/src/DataProcessor.cpp +++ b/slsReceiverSoftware/src/DataProcessor.cpp @@ -480,7 +480,6 @@ void DataProcessor::PadMissingPackets(sls_receiver_header header, char *data) { memset(data + (pnum * dsize), 0xFF, dsize + 2); break; case CHIPTESTBOARD: - case MOENCH: if (pnum == (pperFrame - 1)) memset(data + (pnum * dsize), 0xFF, corrected_dsize); else diff --git a/slsReceiverSoftware/src/GeneralData.h b/slsReceiverSoftware/src/GeneralData.h index 9803a7295..4bc71bc79 100644 --- a/slsReceiverSoftware/src/GeneralData.h +++ b/slsReceiverSoftware/src/GeneralData.h @@ -352,6 +352,36 @@ class JungfrauData : public GeneralData { }; }; +class MoenchData : public GeneralData { + + public: + MoenchData() { + detType = slsDetectorDefs::MOENCH; + headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); + dataSize = 6400; + packetSize = headerSizeinPacket + dataSize; + framesPerFile = MOENCH_MAX_FRAMES_PER_FILE; + fifoDepth = 1000; + standardheader = true; + maxRowsPerReadout = 400; + UpdateImageSize(); + }; + + void SetNumberofInterfaces(const int n) { + numUDPInterfaces = n; + UpdateImageSize(); + }; + + private: + void UpdateImageSize() { + nPixelsX = (400); + nPixelsY = (400) / numUDPInterfaces; + imageSize = int(nPixelsX * nPixelsY * GetPixelDepth()); + packetsPerFrame = imageSize / dataSize; + udpSocketBufferSize = (1000 * 1024 * 1024) / numUDPInterfaces; + }; +}; + class Mythen3Data : public GeneralData { private: int ncounters{0}; @@ -565,68 +595,4 @@ class ChipTestBoardData : public GeneralData { }; }; -class MoenchData : public GeneralData { - - private: - const int NUM_BYTES_PER_ANALOG_CHANNEL = 2; - - public: - MoenchData() { - detType = slsDetectorDefs::MOENCH; - headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); - frameIndexMask = 0xFFFFFF; - framesPerFile = MOENCH_MAX_FRAMES_PER_FILE; - fifoDepth = 2500; - standardheader = true; - UpdateImageSize(); - }; - - void SetNumberOfAnalogSamples(int n) { - nAnalogSamples = n; - UpdateImageSize(); - }; - - void SetOneGigaAdcEnableMask(int n) { - adcEnableMaskOneGiga = n; - UpdateImageSize(); - }; - - void SetTenGigaAdcEnableMask(int n) { - adcEnableMaskTenGiga = n; - UpdateImageSize(); - }; - - void SetTenGigaEnable(bool tg) { - tengigaEnable = tg; - UpdateImageSize(); - }; - - private: - void UpdateImageSize() { - uint32_t adcEnableMask = - (tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga); - - // count number of channels in x, each adc has 25 channels each - int nchanTop = __builtin_popcount(adcEnableMask & 0xF0F0F0F0) * 25; - int nchanBot = __builtin_popcount(adcEnableMask & 0x0F0F0F0F) * 25; - nPixelsX = nchanTop > 0 ? nchanTop : nchanBot; - - // if both top and bottom adcs enabled, rows = 2 - int nrows = 1; - if (nchanTop > 0 && nchanBot > 0) { - nrows = 2; - } - nPixelsY = nAnalogSamples / 25 * nrows; - LOG(logINFO) << "Number of Pixels: [" << nPixelsX << ", " << nPixelsY - << "]"; - - dataSize = tengigaEnable ? 8144 : UDP_PACKET_DATA_BYTES; - packetSize = headerSizeinPacket + dataSize; - imageSize = nPixelsX * nPixelsY * NUM_BYTES_PER_ANALOG_CHANNEL; - packetsPerFrame = ceil((double)imageSize / (double)dataSize); - - LOG(logDEBUG) << "Databytes: " << imageSize; - }; -}; - } // namespace sls diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index d67fd0cee..d2b3236f5 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -113,8 +113,8 @@ void Implementation::setDetectorType(const detectorType d) { case GOTTHARD: case EIGER: case JUNGFRAU: - case CHIPTESTBOARD: case MOENCH: + case CHIPTESTBOARD: case MYTHEN3: case GOTTHARD2: LOG(logINFO) << " ***** " << ToString(d) << " Receiver *****"; @@ -138,12 +138,12 @@ void Implementation::setDetectorType(const detectorType d) { case JUNGFRAU: generalData = new JungfrauData(); break; - case CHIPTESTBOARD: - generalData = new ChipTestBoardData(); - break; case MOENCH: generalData = new MoenchData(); break; + case CHIPTESTBOARD: + generalData = new ChipTestBoardData(); + break; case MYTHEN3: generalData = new Mythen3Data(); break; diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index 68ac3ca50..bd0c07a2b 100644 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -460,7 +460,6 @@ void Listener::CopyPacket(char *dst, char *src, uint32_t dataSize, memcpy(dst + dataSize - 2, &src[detHeaderSize], dataSize + 2); break; case CHIPTESTBOARD: - case MOENCH: if (pnum == (generalData->packetsPerFrame - 1)) memcpy(dst + (pnum * dataSize), &src[detHeaderSize], correctedDataSize); diff --git a/slsReceiverSoftware/src/MasterAttributes.cpp b/slsReceiverSoftware/src/MasterAttributes.cpp index 807e25c82..037353923 100644 --- a/slsReceiverSoftware/src/MasterAttributes.cpp +++ b/slsReceiverSoftware/src/MasterAttributes.cpp @@ -16,6 +16,9 @@ void MasterAttributes::GetBinaryAttributes( case slsDetectorDefs::JUNGFRAU: GetJungfrauBinaryAttributes(w); break; + case slsDetectorDefs::MOENCH: + GetMoenchBinaryAttributes(w); + break; case slsDetectorDefs::EIGER: GetEigerBinaryAttributes(w); break; @@ -25,9 +28,6 @@ void MasterAttributes::GetBinaryAttributes( case slsDetectorDefs::GOTTHARD2: GetGotthard2BinaryAttributes(w); break; - case slsDetectorDefs::MOENCH: - GetMoenchBinaryAttributes(w); - break; case slsDetectorDefs::CHIPTESTBOARD: GetCtbBinaryAttributes(w); break; @@ -48,6 +48,9 @@ void MasterAttributes::WriteHDF5Attributes(H5::H5File *fd, H5::Group *group) { case slsDetectorDefs::JUNGFRAU: WriteJungfrauHDF5Attributes(fd, group); break; + case slsDetectorDefs::MOENCH: + WriteMoenchHDF5Attributes(fd, group); + break; case slsDetectorDefs::EIGER: WriteEigerHDF5Attributes(fd, group); break; @@ -57,9 +60,6 @@ void MasterAttributes::WriteHDF5Attributes(H5::H5File *fd, H5::Group *group) { case slsDetectorDefs::GOTTHARD2: WriteGotthard2HDF5Attributes(fd, group); break; - case slsDetectorDefs::MOENCH: - WriteMoenchHDF5Attributes(fd, group); - break; case slsDetectorDefs::CHIPTESTBOARD: WriteCtbHDF5Attributes(fd, group); break; @@ -622,6 +622,28 @@ void MasterAttributes::WriteJungfrauHDF5Attributes(H5::H5File *fd, } #endif +void MasterAttributes::GetMoenchBinaryAttributes( + rapidjson::PrettyWriter *w) { + w->Key("Exptime"); + w->String(ToString(exptime).c_str()); + w->Key("Period"); + w->String(ToString(period).c_str()); + w->Key("Number of UDP Interfaces"); + w->Uint(numUDPInterfaces); + w->Key("Number of rows"); + w->Uint(readNRows); +} + +#ifdef HDF5C +void MasterAttributes::WriteMoenchuHDF5Attributes(H5::H5File *fd, + H5::Group *group) { + MasterAttributes::WriteHDF5Exptime(fd, group); + MasterAttributes::WriteHDF5Period(fd, group); + MasterAttributes::WriteHDF5NumUDPInterfaces(fd, group); + MasterAttributes::WriteHDF5ReadNRows(fd, group); +} +#endif + void MasterAttributes::GetEigerBinaryAttributes( rapidjson::PrettyWriter *w) { w->Key("Dynamic Range"); @@ -719,31 +741,6 @@ void MasterAttributes::WriteGotthard2HDF5Attributes(H5::H5File *fd, } #endif -void MasterAttributes::GetMoenchBinaryAttributes( - rapidjson::PrettyWriter *w) { - w->Key("Exptime"); - w->String(ToString(exptime).c_str()); - w->Key("Period"); - w->String(ToString(period).c_str()); - w->Key("Ten Giga"); - w->Uint(tenGiga); - w->Key("ADC Mask"); - w->String(ToStringHex(adcmask).c_str()); - w->Key("Analog Samples"); - w->Uint(analogSamples); -} - -#ifdef HDF5C -void MasterAttributes::WriteMoenchHDF5Attributes(H5::H5File *fd, - H5::Group *group) { - MasterAttributes::WriteHDF5Exptime(fd, group); - MasterAttributes::WriteHDF5Period(fd, group); - MasterAttributes::WriteHDF5TenGiga(fd, group); - MasterAttributes::WriteHDF5AdcMask(fd, group); - MasterAttributes::WriteHDF5AnalogSamples(fd, group); -} -#endif - void MasterAttributes::GetCtbBinaryAttributes( rapidjson::PrettyWriter *w) { w->Key("Exptime"); diff --git a/slsReceiverSoftware/src/receiver_defs.h b/slsReceiverSoftware/src/receiver_defs.h index d06b8ae73..2838bfec9 100644 --- a/slsReceiverSoftware/src/receiver_defs.h +++ b/slsReceiverSoftware/src/receiver_defs.h @@ -24,9 +24,9 @@ namespace sls { #define MAX_FRAMES_PER_FILE 20000 #define SHORT_MAX_FRAMES_PER_FILE 100000 -#define MOENCH_MAX_FRAMES_PER_FILE 100000 #define EIGER_MAX_FRAMES_PER_FILE 10000 #define JFRAU_MAX_FRAMES_PER_FILE 10000 +#define MOENCH_MAX_FRAMES_PER_FILE 10000 #define CTB_MAX_FRAMES_PER_FILE 20000 #define MYTHEN3_MAX_FRAMES_PER_FILE 10000 #define GOTTHARD2_MAX_FRAMES_PER_FILE 20000 diff --git a/slsSupportLib/include/sls/sls_detector_defs.h b/slsSupportLib/include/sls/sls_detector_defs.h index 9a145700b..32ed13ad2 100644 --- a/slsSupportLib/include/sls/sls_detector_defs.h +++ b/slsSupportLib/include/sls/sls_detector_defs.h @@ -48,7 +48,7 @@ #define SLS_DETECTOR_HEADER_VERSION 0x2 #define SLS_DETECTOR_JSON_HEADER_VERSION 0x4 -// ctb/ moench 1g udp (read from fifo) +// ctb 1g udp (read from fifo) #define UDP_PACKET_DATA_BYTES (1344) /** maximum trim en */ @@ -404,7 +404,7 @@ typedef struct { enum clockIndex { ADC_CLOCK, DBIT_CLOCK, RUN_CLOCK, SYNC_CLOCK }; /** - * read out mode (ctb, moench) + * read out mode (ctb) */ enum readoutMode { ANALOG_ONLY, DIGITAL_ONLY, ANALOG_AND_DIGITAL }; @@ -632,6 +632,13 @@ struct detParameters { nChipY = 1; nDacs = 8; break; + case slsDetectorDefs::detectorType::MOENCH: + nChanX = 400; + nChanY = 400; + nChipX = 1; + nChipY = 1; + nDacs = 8; + break; case slsDetectorDefs::detectorType::JUNGFRAU: nChanX = 256; nChanY = 256; @@ -646,13 +653,6 @@ struct detParameters { nChipY = 1; nDacs = 24; break; - case slsDetectorDefs::detectorType::MOENCH: - nChanX = 32; - nChanY = 1; - nChipX = 1; - nChipY = 1; - nDacs = 8; - break; case slsDetectorDefs::detectorType::EIGER: nChanX = 256; nChanY = 256; diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 1c18170a6..41b24f868 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -1,9 +1,10 @@ // SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package /** API versions */ -#define RELEASE "7.0.0.rc1" -#define APILIB "7.0.0.rc1 0x221208" -#define APIRECEIVER "7.0.0.rc1 0x221208" +#define RELEASE "developer" +#define APILIB "developer 0x221213" +#define APIRECEIVER "developer 0x221213" + #define APICTB "developer 0x221213" #define APIGOTTHARD "developer 0x221213" #define APIGOTTHARD2 "developer 0x221213"