client:updated users class and release.txt

This commit is contained in:
maliakal_d 2018-08-22 18:08:35 +02:00
parent 7945d15beb
commit 63c130a380
12 changed files with 328 additions and 146 deletions

View File

@ -59,7 +59,7 @@ CONTENTS
- Other New Features - Other New Features
- Resolved Issues - Resolved Issues
- Known Issues - Known Issues
- Future Plans - Neat Release Plans
@ -159,9 +159,7 @@ Changes in User Interface
online flag in shm has not been set. online flag in shm has not been set.
4. With the new shared memory implementation, commands "type" and "replace" 4. Commands "type", "id" and "replace" are removed.
are removed and "add" now only appends detector to the end of the multi
detector list.
Receiver Receiver
@ -172,6 +170,7 @@ Changes in User Interface
sls_receiver_header structure added to sls_receiver_defs.h for image headers sls_receiver_header structure added to sls_receiver_defs.h for image headers
in file writing. in file writing.
#define MAX_NUM_PACKETS 512
typedef std::bitset<MAX_NUM_PACKETS> sls_bitset; typedef std::bitset<MAX_NUM_PACKETS> sls_bitset;
typedef struct { typedef struct {
sls_detector_header detHeader; /**< is the detector header */ sls_detector_header detHeader; /**< is the detector header */
@ -216,68 +215,68 @@ New/Modified Commands
Client Client
------ ------
- add (modified): 1. add (modified):
appends detector to end of multi detector list. appends detector to end of multi detector list.
- replace: 2. replace:
sets hostname/ip address for a single detector. sets hostname/ip address for a single detector.
- user: 3. user:
get user details from shared memory. get user details from shared memory.
- checkdetversion: 4. checkdetversion:
checks client version compatibility with detector server. checks client version compatibility with detector server.
- checkrecversion: 5. checkrecversion:
checks client version compatibility with receiver server. checks client version compatibility with receiver server.
Receiver Receiver
-------- --------
- rx_zmqip: 1. rx_zmqip:
sets/gets the zmq (TCP) ip of the receiver from where data is streamed sets/gets the zmq (TCP) ip of the receiver from where data is streamed
out from. (Eg. to the gui or intermediate process). By default, it is out from. (Eg. to the gui or intermediate process). By default, it is
the same as the zmqip. the same as the zmqip.
- zmqip: 2. zmqip:
sets/gets the zmq (TCP) ip, where client listens to, to reconstuct images. sets/gets the zmq (TCP) ip, where client listens to, to reconstuct images.
(Eg. from receiver or intermediate process). By default, it is the same (Eg. from receiver or intermediate process). By default, it is the same
as rx_zmqip. as rx_zmqip.
- rx_jsonaddheader: 3. rx_jsonaddheader:
sets/gets additional json header to be streamed out with the zmq from sets/gets additional json header to be streamed out with the zmq from
receiver. Default is empty. Eg. p rx_jsonaddheader \"what\":\"nothing\" receiver. Default is empty. Eg. p rx_jsonaddheader \"what\":\"nothing\"
- r_discardpolicy: 4. r_discardpolicy:
sets/gets the frame discard policy in the receiver. sets/gets the frame discard policy in the receiver.
0 - no discard (default), 0 - no discard (default),
1 - discard only empty frames, 1 - discard only empty frames,
2 - discard any partial frame(fastest) 2 - discard any partial frame(fastest)
- r_padding: 5. r_padding:
sets/gets the frame padding in the receiver. sets/gets the frame padding in the receiver.
0 does not pad partial frames(fastest), 0 does not pad partial frames(fastest),
1 (default) pads partial frames. 1 (default) pads partial frames.
One can look at bitmask in the sls_receiver_header to process the unpadded One can look at bitmask in the sls_receiver_header to process the unpadded
partial frames later. partial frames later.
- activate (modified): 6. activate (modified):
Extra option added to pad or unpad images in receivers when deactivated. Extra option added to pad or unpad images in receivers when deactivated.
activate i [padding option], where i is activate/deactivate and padding activate i [padding option], where i is activate/deactivate and padding
option is "padding" (default) or "nopadding". option is "padding" (default) or "nopadding".
- rx_udpsocksize: 7. rx_udpsocksize:
sets/gets the UDP socket buffer size. Already attempts to set by default sets/gets the UDP socket buffer size. Already attempts to set by default
to 100mb, 2gb for Jungfrau. Does not remember custom values in client to 100mb, 2gb for Jungfrau. Does not remember custom values in client
shared memory, so must be initialized each time after setting receiver shared memory, so must be initialized each time after setting receiver
hostname in config file. hostname in config file.
- rx_realudpsocksize: 8. rx_realudpsocksize:
gets the actual UDP socket buffer size. Usually double the set udp socket gets the actual UDP socket buffer size. Usually double the set udp socket
buffer size due to kernel bookkeeping. buffer size due to kernel bookkeeping.
- r_framesperfile: 9. r_framesperfile:
sets/gets the frames per file in receiver. 0 means infinite or all frames sets/gets the frames per file in receiver. 0 means infinite or all frames
in a single file. Default of Eiger changed from 2k to 10k. in a single file. Default of Eiger changed from 2k to 10k.
@ -285,45 +284,45 @@ New/Modified Commands
Eiger Specific Eiger Specific
-------------- --------------
- status trigger: 1. status trigger:
To trigger internally via software, one can use "status trigger". To trigger internally via software, one can use "status trigger".
- subdeadtime: 2. subdeadtime:
sets/gets sub frame dead time in s in 32 bit mode. Subperiod is set in sets/gets sub frame dead time in s in 32 bit mode. Subperiod is set in
the detector by subexptime + subdeadtime. This value is normally a the detector by subexptime + subdeadtime. This value is normally a
constant set by an expert catered to individual detector modules in the constant set by an expert catered to individual detector modules in the
config file. Receiver files writes master file metadata subperiod config file. Receiver files writes master file metadata subperiod
instead of subdeadtime. instead of subdeadtime.
- gappixels: 3. gappixels:
enables/disables gap pixels in system (detector & receiver). 1 sets, enables/disables gap pixels in system (detector & receiver). 1 sets,
0 unsets. In Receiver, 4 bit gap pixels mode is not implemented, but is 0 unsets. In Receiver, 4 bit gap pixels mode is not implemented, but is
implemented in client data call back. Gap pixels are at module level implemented in client data call back. Gap pixels are at module level
and not at multi module level. and not at multi module level.
- measuredperiod: 4. measuredperiod:
gets the measured frame period (time between last frame and the previous gets the measured frame period (time between last frame and the previous
one) in s. Makes sense only for acquisitions of more than 1 frame. one) in s. Makes sense only for acquisitions of more than 1 frame.
- measuredsubperiod: 5. measuredsubperiod:
gets the measured subframe period (time between last subframe and the gets the measured subframe period (time between last subframe and the
previous one) in s in 32 bit mode. previous one) in s in 32 bit mode.
- flags(modified): 6. flags(modified):
extra flags "overflow" (default) and "nooverflow" for sub images in 32 extra flags "overflow" (default) and "nooverflow" for sub images in 32
bit mode. If set to overflow, it will set MSB of pixel data high if bit mode. If set to overflow, it will set MSB of pixel data high if
there was an overflow in any of the sub images 32 bit mode. there was any saturation in any of the sub images 32 bit mode.
Jungfrau Specific Jungfrau Specific
----------------- -----------------
- storagecells: 1. storagecells:
sets/gets number of additional storage cells per acquisition. For very sets/gets number of additional storage cells per acquisition. For very
advanced users only. Range: 0-15. Default: 0. advanced users only. Range: 0-15. Default: 0.
The #images = #frames * #cycles * (#storagecells +1). The #images = #frames * #cycles * (#storagecells +1).
- storage_start: 2. storage_start:
sets/gets the storage cell that stores the first acquisition of the series. sets/gets the storage cell that stores the first acquisition of the series.
For very advanced users only. Range: 0-15. Default: 15(0xf). For very advanced users only. Range: 0-15. Default: 15(0xf).
@ -344,8 +343,30 @@ Other New Features
xcoord and ycoord are given to detector servers (Eiger and Jungfrau) xcoord and ycoord are given to detector servers (Eiger and Jungfrau)
to encode into the udp header. to encode into the udp header.
3. Users API updated to reflect new features. 3. (Eiger) Setting threshold energy changes such as CAL dac is irrelevant
when interpolating between two energies and VRS dac is interpolated, not copied.
4. Users API updated with the following functions:
- setReceiverFramesDiscardPolicy
- setReceiverPartialFramesPadding
- setReceiverFramesPerFile
- sendSoftwareTrigger
- setSubFrameExposureDeadTime
- setSubFrameExposureTime
- enableGapPixels
- getMeasuredPeriod
- getMeasuredSubFramePeriod
- setOverflowMode
- setNumberOfStorageCells
- setStoragecellStart
- setThresholdEnergy (overloaded)
- resetFramesCaughtInReceiver
- setReceiverFifoDepth
- setFlowControl10G
- setTenGigabitEthernet
- getNMods
- setReceiverDataStreamingOutIP
- setClientDataStreamingInIP
SlsReceiver SlsReceiver
----------- -----------
@ -363,24 +384,24 @@ Other New Features
2. Option to maintain aspect ratio 2. Option to maintain aspect ratio
3. Start and Stop separated to prevent multiple click syndrome.
Detector Server
---------------
1. (Jungfrau) To use programfpga command, one must start server with -update
mode and then restart server without -update mode.
2. (Jungfrau) ASIC Timer configured at server start up and changed a few
startup values for firmware v0.7 such as adc phase, ADC_PORT_INVERT_VAL
and ADC offset half speed value.
3. (Jungfrau) Minimum exposure time of 50 us was implemented.
4. (Eiger and Jungfrau) They can be configured to have x and y coord values
of the detector in their udp header.
added few more functions to slssDeectorUsers API
setThresholdEnergy with the more options such as trimbits and settings
resetFramesCaughtInReceiver
setReceiverFifoDepth
setFlowControl10G
setTenGigabitEthernet
getNMods
setSubFrameExposureTime
setSubFrameExposureDeadTime
setReceiverDataStreamingOutIP
setClientDataStreamingInIP
enableGapPixels
setOverflowMode
@ -389,7 +410,19 @@ Resolved Issues
Client Client
------ ------
1. If trimen gives different list from different detectors, it returns a -1. memory leak for multi threading
1. Compiler flag -std=c++98 enforced. Debug flag removed.
2. If trimen gives different list from different detectors, it returns a -1.
3. Version format for each submodule of the package changed to just date YYMMDD.
Users class fixed to give correct version, instead of -1.
4. Getting settings in users class gave -1. Fixed now.
5. (Jungfrau) Programming FPGA now creates the rawbin file from pof in tmp
rather than source file location (for permission issues).
Receiver Receiver
-------- --------
@ -402,6 +435,22 @@ Resolved Issues
3. Global optind variable initialized to instantiate multiple receivers 3. Global optind variable initialized to instantiate multiple receivers
in same process. in same process.
4. Socket buffer size attempts to set for each acquiistion and provide
warning if no capabilities. Warnings can be removed using instruction with
error provided. Default Jungfrau UDP socket buffer size if 2 GB, default is
100 MB.
5. Refactored code a bit for performance and robustness, including removing
many static members, blocking push in buffer between listener and dataprocessor
Detector Server
---------------
1. (Jungfrau) Stop server also mapped during a reset. Reading power status
instead of user input register for power.
2. (Eiger) Bug fix for saving trimbits to file (Advanced users).
Known Issues Known Issues
@ -409,12 +458,22 @@ Known Issues
Receiver Receiver
-------- --------
1. HDF5 compression and filters are not implemented yet. 1. HDF5 compression and filters are not implemented yet.
Detector Server
---------------
Future Plans 1. (Eiger) Registers mapped differently between firmware v20 and v22.
============ So, please ensure correct on-board server before switching between
firmware versions. Else one cannot ping it anymore. Will need to flash firmware
again to recover.
Neat Release Plans
==================
Client Client
------ ------

2
cmk.sh
View File

@ -145,7 +145,7 @@ else
fi fi
fi fi
CMAKE_POST+=" -DCMAKE_BUILD_TYPE=Debug " #CMAKE_POST+=" -DCMAKE_BUILD_TYPE=Debug "
#hdf5 rebuild #hdf5 rebuild
if [ $HDF5 -eq 1 ]; then if [ $HDF5 -eq 1 ]; then

View File

@ -54,7 +54,12 @@ int main(int argc, char **argv) {
/** - slsDetectorUsers Object is instantiated with appropriate ID */ /** - slsDetectorUsers Object is instantiated with appropriate ID */
slsDetectorUsers *pDetector = new slsDetectorUsers (id); int ret = slsReceiverDefs::FAIL;
slsDetectorUsers *pDetector = new slsDetectorUsers (ret, id);
if (ret == slsReceiverDefs::FAIL) {
std::cout << "Error: Could not instantiate slsDetectorUsers" << std::endl;
return EXIT_FAILURE;
}
/** - if specified, load configuration file (necessary at least the first time it is called to properly configure advanced settings in the shared memory) */ /** - if specified, load configuration file (necessary at least the first time it is called to properly configure advanced settings in the shared memory) */

View File

@ -2680,16 +2680,28 @@ int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t, int imod) {
return ret; return ret;
} }
int64_t multiSlsDetector::getTimeLeft(timerIndex index) { int64_t multiSlsDetector::getTimeLeft(timerIndex index, int imod) {
int64_t ret = -100; int64_t ret = -100;
{ // single
int id = -1, im = -1;
if (decodeNMod(imod, id, im) >= 0) {
if (id < 0 || id >= (int)detectors.size())
return -1;
ret = detectors[id]->getTimeLeft(index, im);
if (detectors[id]->getErrorMask())
setErrorMask(getErrorMask() | (1 << id));
return ret;
}
}
if (thisMultiDetector->masterPosition >= 0) if (thisMultiDetector->masterPosition >= 0)
if (detectors[thisMultiDetector->masterPosition]) { if (detectors[thisMultiDetector->masterPosition]) {
ret = detectors[thisMultiDetector->masterPosition]->getTimeLeft(index); ret = detectors[thisMultiDetector->masterPosition]->getTimeLeft(index, imod);
if (detectors[thisMultiDetector->masterPosition]->getErrorMask()) if (detectors[thisMultiDetector->masterPosition]->getErrorMask())
setErrorMask(getErrorMask() | (1 << thisMultiDetector->masterPosition)); setErrorMask(getErrorMask() | (1 << thisMultiDetector->masterPosition));
return ret; return ret;
} }
return callDetectorMember(&slsDetector::getTimeLeft, index); return callDetectorMember(&slsDetector::getTimeLeft, index, imod);
} }
int multiSlsDetector::setSpeed(speedVariable index, int value) { int multiSlsDetector::setSpeed(speedVariable index, int value) {

View File

@ -1048,9 +1048,10 @@ public:
* Set/get timer value left in acquisition (not all implemented for all detectors) * Set/get timer value left in acquisition (not all implemented for all detectors)
* @param index timer index * @param index timer index
* @param t time in ns or number of...(e.g. frames, gates, probes) * @param t time in ns or number of...(e.g. frames, gates, probes)
* @param imod module number
* @returns timer set value in ns or number of...(e.g. frames, gates, probes) * @returns timer set value in ns or number of...(e.g. frames, gates, probes)
*/ */
int64_t getTimeLeft(timerIndex index); int64_t getTimeLeft(timerIndex index, int imod = -1);
/** /**
* Set speed * Set speed

View File

@ -4355,7 +4355,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t, int imod) {
int64_t slsDetector::getTimeLeft(timerIndex index) { int64_t slsDetector::getTimeLeft(timerIndex index, int imod) {
int fnum=F_GET_TIME_LEFT; int fnum=F_GET_TIME_LEFT;

View File

@ -1164,9 +1164,10 @@ public:
* Set/get timer value left in acquisition (not all implemented for all detectors) * Set/get timer value left in acquisition (not all implemented for all detectors)
* @param index timer index * @param index timer index
* @param t time in ns or number of...(e.g. frames, gates, probes) * @param t time in ns or number of...(e.g. frames, gates, probes)
* @param imod module number
* @returns timer set value in ns or number of...(e.g. frames, gates, probes) * @returns timer set value in ns or number of...(e.g. frames, gates, probes)
*/ */
int64_t getTimeLeft(timerIndex index); int64_t getTimeLeft(timerIndex index, int imod = -1);
/** /**
* Set speed * Set speed

View File

@ -894,17 +894,17 @@ virtual int enableDataStreamingFromReceiver(int enable=-1)=0;
\returns TEMPERATURE_FPGA, TEMPERATURE_FPGAEXT, TEMPERATURE_10GE, TEMPERATURE_DCDC, TEMPERATURE_SODL, \returns TEMPERATURE_FPGA, TEMPERATURE_FPGAEXT, TEMPERATURE_10GE, TEMPERATURE_DCDC, TEMPERATURE_SODL,
TEMPERATURE_SODR, TEMPERATURE_FPGA2, TEMPERATURE_FPGA3, -1 when unknown mode TEMPERATURE_SODR, TEMPERATURE_FPGA2, TEMPERATURE_FPGA3, -1 when unknown mode
*/ */
static int getADCIndex(std::string s){ static int getADCIndex(std::string s){ \
if (s=="temp_fpga") return TEMPERATURE_FPGA; if (s=="temp_fpga") return TEMPERATURE_FPGA; \
if (s=="temp_fpgaext") return TEMPERATURE_FPGAEXT; if (s=="temp_fpgaext") return TEMPERATURE_FPGAEXT; \
if (s=="temp_10ge") return TEMPERATURE_10GE; if (s=="temp_10ge") return TEMPERATURE_10GE; \
if (s=="temp_dcdc") return TEMPERATURE_DCDC; if (s=="temp_dcdc") return TEMPERATURE_DCDC; \
if (s=="temp_sodl") return TEMPERATURE_SODL; if (s=="temp_sodl") return TEMPERATURE_SODL; \
if (s=="temp_sodr") return TEMPERATURE_SODR; if (s=="temp_sodr") return TEMPERATURE_SODR; \
if (s=="temp_fpgafl") return TEMPERATURE_FPGA2; if (s=="temp_fpgafl") return TEMPERATURE_FPGA2; \
if (s=="temp_fpgafr") return TEMPERATURE_FPGA3; if (s=="temp_fpgafr") return TEMPERATURE_FPGA3; \
return -1; return -1; \
}; }; \
/** /**
@ -912,19 +912,43 @@ virtual int enableDataStreamingFromReceiver(int enable=-1)=0;
\param s can be vcmp_ll, vcmp_lr, vcmp_rl, vcmp_rr, vthreshold, vrf, vrs, vtr, vcall, vcp \param s can be vcmp_ll, vcmp_lr, vcmp_rl, vcmp_rr, vthreshold, vrf, vrs, vtr, vcall, vcp
\returns E_Vcmp_ll, E_Vcmp_lr, E_Vcmp_rl, E_Vcmp_rr, THRESHOLD, E_Vrf, E_Vrs, E_Vtr, E_cal, E_Vcp , -1 when unknown mode \returns E_Vcmp_ll, E_Vcmp_lr, E_Vcmp_rl, E_Vcmp_rr, THRESHOLD, E_Vrf, E_Vrs, E_Vtr, E_cal, E_Vcp , -1 when unknown mode
*/ */
static int getDACIndex(std::string s){ static int getDACIndex(std::string s){ \
if (s=="vcmp_ll") return E_Vcmp_ll; if (s=="vcmp_ll") return E_Vcmp_ll; \
if (s=="vcmp_lr") return E_Vcmp_lr; if (s=="vcmp_lr") return E_Vcmp_lr; \
if (s=="vcmp_rl") return E_Vcmp_rl; if (s=="vcmp_rl") return E_Vcmp_rl; \
if (s=="vcmp_rr") return E_Vcmp_rr; if (s=="vcmp_rr") return E_Vcmp_rr; \
if (s=="vthreshold") return THRESHOLD; if (s=="vthreshold") return THRESHOLD; \
if (s=="vrf") return E_Vrf; if (s=="vrf") return E_Vrf; \
if (s=="vrs") return E_Vrs; if (s=="vrs") return E_Vrs; \
if (s=="vtr") return E_Vtr; if (s=="vtr") return E_Vtr; \
if (s=="vcall") return E_cal; if (s=="vcall") return E_cal; \
if (s=="vcp") return E_Vcp; if (s=="vcp") return E_Vcp; \
return -1; return -1; \
}; }; \
/**
@short returns receiver frame discard policy from std::string
\param s can be nodiscard, discardempty, discardpartial
\returns NO_DISCARD, DISCARD_EMPTY_FRAMES, DISCARD_PARTIAL_FRAMES, GET_FRAME_DISCARD_POLICY when unknown mode
*/
static frameDiscardPolicy getReceiverFrameDiscardPolicy(std::string s){ \
if (s=="nodiscard") return NO_DISCARD; \
if (s=="discardempty") return DISCARD_EMPTY_FRAMES; \
if (s=="discardpartial") return DISCARD_PARTIAL_FRAMES; \
return GET_FRAME_DISCARD_POLICY; \
}; \
/** returns std::string from frame discard policy
\param f can be NO_DISCARD, DISCARD_EMPTY_FRAMES, DISCARD_PARTIAL_FRAMES
\returns std::string nodiscard, discardempty, discardpartial, unknown
*/
static std::string getReceiverFrameDiscardPolicy(frameDiscardPolicy f){ \
switch (f) { \
case NO_DISCARD: return std::string("nodiscard"); \
case DISCARD_EMPTY_FRAMES: return std::string("discardempty"); \
case DISCARD_PARTIAL_FRAMES: return std::string("discardpartial"); \
default: return std::string("unknown"); \
}}; \
}; };

View File

@ -2249,7 +2249,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) {
++i; ++i;
/*! \page receiver /*! \page receiver
- <b>r_discardpolicy</b> sets/gets the frame discard policy in the receiver. 0 - no discard (default), 1 - discard only empty frames, 2 - discard any partial frame(fastest). \c Returns \c (int) - <b>r_discardpolicy</b> sets/gets the frame discard policy in the receiver. nodiscard (default) - discards nothing, discardempty - discard only empty frames, discardpartial(fastest) - discards all partial frames. \c Returns \c (int)
*/ */
descrToFuncMap[i].m_pFuncName="r_discardpolicy"; //OK descrToFuncMap[i].m_pFuncName="r_discardpolicy"; //OK
descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver;
@ -6383,14 +6383,12 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) {
else if(cmd=="r_discardpolicy") { else if(cmd=="r_discardpolicy") {
if (action==PUT_ACTION){ if (action==PUT_ACTION){
if (sscanf(args[1],"%d",&ival) && (ival >= 0) && (ival < NUM_DISCARD_POLICIES)) { frameDiscardPolicy f = myDet->getReceiverFrameDiscardPolicy(string(args[1]));
myDet->setReceiverFramesDiscardPolicy((frameDiscardPolicy)ival); if (f == GET_FRAME_DISCARD_POLICY)
} else return string("could not scan frames discard policy\n"); return string("could not scan frame discard policy. Options: nodiscard, discardempty, discardpartial\n");
myDet->setReceiverFramesDiscardPolicy(f);
} }
char answer[100]; return myDet->getReceiverFrameDiscardPolicy(myDet->setReceiverFramesDiscardPolicy());
memset(answer, 0, 100);
sprintf(answer,"%d",myDet->setReceiverFramesDiscardPolicy());
return string(answer);
} }
else if(cmd=="r_padding") { else if(cmd=="r_padding") {
@ -6424,7 +6422,7 @@ string slsDetectorCommand::helpReceiver(int narg, char *args[], int action) {
os << "rx_fifodepth [val]\t sets receiver fifo depth to val" << std::endl; os << "rx_fifodepth [val]\t sets receiver fifo depth to val" << std::endl;
os << "r_silent [i]\t sets receiver in silent mode, ie. it will not print anything during real time acquisition. 1 sets, 0 unsets." << std::endl; os << "r_silent [i]\t sets receiver in silent mode, ie. it will not print anything during real time acquisition. 1 sets, 0 unsets." << std::endl;
os << "r_framesperfile s\t sets the number of frames per file in receiver. 0 means infinite or all frames in a single file." << std::endl; os << "r_framesperfile s\t sets the number of frames per file in receiver. 0 means infinite or all frames in a single file." << std::endl;
os << "r_discardpolicy s\t sets the frame discard policy in the receiver. 0 - no discard (default), 1 - discard only empty frames, 2 - discard any partial frame(fastest)." << std::endl; os << "r_discardpolicy s\t sets the frame discard policy in the receiver. nodiscard (default) - discards nothing, discardempty - discard only empty frames, discardpartial(fastest) - discards all partial frames." << std::endl;
os << "r_padding s\t enables/disables partial frames to be padded in the receiver. 0 does not pad partial frames(fastest), 1 (default) pads partial frames." << std::endl; os << "r_padding s\t enables/disables partial frames to be padded in the receiver. 0 does not pad partial frames(fastest), 1 (default) pads partial frames." << std::endl;
} }
if (action==GET_ACTION || action==HELP_ACTION){ if (action==GET_ACTION || action==HELP_ACTION){
@ -6436,7 +6434,7 @@ string slsDetectorCommand::helpReceiver(int narg, char *args[], int action) {
os << "rx_fifodepth \t returns receiver fifo depth" << std::endl; os << "rx_fifodepth \t returns receiver fifo depth" << std::endl;
os << "r_silent \t returns receiver silent mode enable. 1 is silent, 0 not silent." << std::endl; os << "r_silent \t returns receiver silent mode enable. 1 is silent, 0 not silent." << std::endl;
os << "r_framesperfile \t gets the number of frames per file in receiver. 0 means infinite or all frames in a single file." << std::endl; os << "r_framesperfile \t gets the number of frames per file in receiver. 0 means infinite or all frames in a single file." << std::endl;
os << "r_discardpolicy \t gets the frame discard policy in the receiver. 0 - no discard (default), 1 - discard only empty frames, 2 - discard any partial frame(fastest)." << std::endl; os << "r_discardpolicy \t gets the frame discard policy in the receiver. nodiscard (default) - discards nothing, discardempty - discard only empty frames, discardpartial(fastest) - discards all partial frames." << std::endl;
os << "r_padding \t gets partial frames padding enable in the receiver. 0 does not pad partial frames(fastest), 1 (default) pads partial frames." << std::endl; os << "r_padding \t gets partial frames padding enable in the receiver. 0 does not pad partial frames(fastest), 1 (default) pads partial frames." << std::endl;
} }
return os.str(); return os.str();

View File

@ -6,7 +6,7 @@
using namespace std; using namespace std;
slsDetectorUsers::slsDetectorUsers(int id, int& ret) : myDetector(0), myCmd(0){ slsDetectorUsers::slsDetectorUsers(int& ret, int id) : myDetector(0), myCmd(0){
try { try {
myDetector=new multiSlsDetector(id); myDetector=new multiSlsDetector(id);
} catch(...) { } catch(...) {
@ -16,22 +16,18 @@ slsDetectorUsers::slsDetectorUsers(int id, int& ret) : myDetector(0), myCmd(0){
myCmd=new multiSlsDetectorCommand(myDetector); myCmd=new multiSlsDetectorCommand(myDetector);
ret = 0; ret = 0;
}; }
slsDetectorUsers::~slsDetectorUsers() { slsDetectorUsers::~slsDetectorUsers() {
if (myDetector) if (myDetector)
delete myDetector; delete myDetector;
}; }
string slsDetectorUsers::getDetectorDeveloper(){ string slsDetectorUsers::getDetectorDeveloper(){
return myDetector->getDetectorDeveloper(); return myDetector->getDetectorDeveloper();
} }
int slsDetectorUsers::setOnline(int const online){ int slsDetectorUsers::setOnline(int const online){
return myDetector->setOnline(online); return myDetector->setOnline(online);
} }
@ -48,7 +44,6 @@ int slsDetectorUsers::stopMeasurement(){
return myDetector->stopAcquisition(); return myDetector->stopAcquisition();
} }
int slsDetectorUsers::getDetectorStatus(){ int slsDetectorUsers::getDetectorStatus(){
return (int)myDetector->getRunStatus(); return (int)myDetector->getRunStatus();
} }
@ -57,12 +52,10 @@ string slsDetectorUsers::getFilePath(){
return myDetector->getFilePath(); return myDetector->getFilePath();
} }
string slsDetectorUsers::setFilePath(string s){ string slsDetectorUsers::setFilePath(string s){
return myDetector->setFilePath(s); return myDetector->setFilePath(s);
} }
string slsDetectorUsers::getFileName(){ string slsDetectorUsers::getFileName(){
return myDetector->getFileName(); return myDetector->getFileName();
} }
@ -89,7 +82,7 @@ string slsDetectorUsers::setFlatFieldCorrectionDir(string dir){
string slsDetectorUsers::getFlatFieldCorrectionFile(){ string slsDetectorUsers::getFlatFieldCorrectionFile(){
return myDetector->getFlatFieldCorrectionFile(); return myDetector->getFlatFieldCorrectionFile();
}; }
int slsDetectorUsers::setFlatFieldCorrectionFile(string fname){ int slsDetectorUsers::setFlatFieldCorrectionFile(string fname){
return myDetector->setFlatFieldCorrectionFile(fname); return myDetector->setFlatFieldCorrectionFile(fname);
@ -146,7 +139,6 @@ int slsDetectorUsers::setBitDepth(int i){
return myDetector->setDynamicRange(i); return myDetector->setDynamicRange(i);
} }
int slsDetectorUsers::setSettings(int isettings){ int slsDetectorUsers::setSettings(int isettings){
return myDetector->slsDetectorBase::setSettings(isettings); return myDetector->slsDetectorBase::setSettings(isettings);
} }
@ -166,7 +158,7 @@ int slsDetectorUsers::setThresholdEnergy(int e_ev, int tb, int isettings, int id
double slsDetectorUsers::setExposureTime(double t, bool inseconds, int imod){ double slsDetectorUsers::setExposureTime(double t, bool inseconds, int imod){
if(!inseconds) if(!inseconds)
return myDetector->setExposureTime((int64_t)t,imod); return myDetector->setExposureTime((int64_t)t,imod);
else {
// + 0.5 to round for precision lost from converting double to int64_t // + 0.5 to round for precision lost from converting double to int64_t
int64_t tms = (int64_t)(t * (1E+9) + 0.5); int64_t tms = (int64_t)(t * (1E+9) + 0.5);
if (t < 0) tms = -1; if (t < 0) tms = -1;
@ -174,13 +166,12 @@ double slsDetectorUsers::setExposureTime(double t, bool inseconds, int imod){
if (tms < 0) if (tms < 0)
return -1; return -1;
return ((1E-9) * (double)tms); return ((1E-9) * (double)tms);
}
} }
double slsDetectorUsers::setExposurePeriod(double t, bool inseconds, int imod){ double slsDetectorUsers::setExposurePeriod(double t, bool inseconds, int imod){
if(!inseconds) if(!inseconds)
return myDetector->setExposurePeriod((int64_t)t,imod); return myDetector->setExposurePeriod((int64_t)t,imod);
else {
// + 0.5 to round for precision lost from converting double to int64_t // + 0.5 to round for precision lost from converting double to int64_t
int64_t tms = (int64_t)(t * (1E+9) + 0.5); int64_t tms = (int64_t)(t * (1E+9) + 0.5);
if (t < 0) tms = -1; if (t < 0) tms = -1;
@ -188,13 +179,12 @@ double slsDetectorUsers::setExposurePeriod(double t, bool inseconds, int imod){
if (tms < 0) if (tms < 0)
return -1; return -1;
return ((1E-9) * (double)tms); return ((1E-9) * (double)tms);
}
} }
double slsDetectorUsers::setDelayAfterTrigger(double t, bool inseconds, int imod){ double slsDetectorUsers::setDelayAfterTrigger(double t, bool inseconds, int imod){
if(!inseconds) if(!inseconds)
return myDetector->setDelayAfterTrigger((int64_t)t,imod); return myDetector->setDelayAfterTrigger((int64_t)t,imod);
else {
// + 0.5 to round for precision lost from converting double to int64_t // + 0.5 to round for precision lost from converting double to int64_t
int64_t tms = (int64_t)(t * (1E+9) + 0.5); int64_t tms = (int64_t)(t * (1E+9) + 0.5);
if (t < 0) tms = -1; if (t < 0) tms = -1;
@ -202,7 +192,6 @@ double slsDetectorUsers::setDelayAfterTrigger(double t, bool inseconds, int imod
if (tms < 0) if (tms < 0)
return -1; return -1;
return ((1E-9) * (double)tms); return ((1E-9) * (double)tms);
}
} }
int64_t slsDetectorUsers::setNumberOfGates(int64_t t, int imod){ int64_t slsDetectorUsers::setNumberOfGates(int64_t t, int imod){
@ -306,6 +295,44 @@ int slsDetectorUsers::enableGapPixels(int enable) {
return myDetector->enableGapPixels(enable); return myDetector->enableGapPixels(enable);
} }
std::string slsDetectorUsers::setReceiverFramesDiscardPolicy(std::string f) {
return myDetector->getReceiverFrameDiscardPolicy(
myDetector->setReceiverFramesDiscardPolicy(
myDetector->getReceiverFrameDiscardPolicy(f)));
}
int slsDetectorUsers::setReceiverPartialFramesPadding(int f) {
return myDetector->setReceiverPartialFramesPadding(f);
}
int slsDetectorUsers::setReceiverFramesPerFile(int f) {
return myDetector->setReceiverFramesPerFile(f);
}
int slsDetectorUsers::sendSoftwareTrigger() {
return myDetector->sendSoftwareTrigger();
}
double slsDetectorUsers::getMeasuredPeriod(bool inseconds, int imod) {
if(!inseconds)
return myDetector->getTimeLeft(slsReceiverDefs::MEASURED_PERIOD, imod);
int64_t tms = myDetector->getTimeLeft(slsReceiverDefs::MEASURED_PERIOD, imod);
if (tms < 0)
return -1;
return ((1E-9) * (double)tms);
}
double slsDetectorUsers::getMeasuredSubFramePeriod(bool inseconds, int imod) {
if(!inseconds)
return myDetector->getTimeLeft(slsReceiverDefs::MEASURED_SUBPERIOD, imod);
int64_t tms = myDetector->getTimeLeft(slsReceiverDefs::MEASURED_SUBPERIOD, imod);
if (tms < 0)
return -1;
return ((1E-9) * (double)tms);
}
void slsDetectorUsers::registerDataCallback(int( *userCallback)(detectorData*, int, int, void*), void *pArg){ void slsDetectorUsers::registerDataCallback(int( *userCallback)(detectorData*, int, int, void*), void *pArg){
myDetector->registerDataCallback(userCallback,pArg); myDetector->registerDataCallback(userCallback,pArg);
} }
@ -343,8 +370,6 @@ void slsDetectorUsers::registerGetI0Callback( double (*func)(int,void*),void *ar
} }
string slsDetectorUsers::putCommand(int narg, char *args[], int pos){ string slsDetectorUsers::putCommand(int narg, char *args[], int pos){
if(narg < 2) if(narg < 2)
return string("Error: Insufficient Parameters"); return string("Error: Insufficient Parameters");
@ -358,8 +383,6 @@ string slsDetectorUsers::getCommand(int narg, char *args[], int pos){
} }
int slsDetectorUsers::setClockDivider(int value) { int slsDetectorUsers::setClockDivider(int value) {
return myDetector->setClockDivider(value); return myDetector->setClockDivider(value);
} }
@ -408,7 +431,6 @@ int slsDetectorUsers::stopAcquisition() {
return myDetector->stopAcquisition(); return myDetector->stopAcquisition();
} }
int slsDetectorUsers::setReceiverSilentMode(int i) { int slsDetectorUsers::setReceiverSilentMode(int i) {
return myDetector->setReceiverSilentMode(i); return myDetector->setReceiverSilentMode(i);
} }
@ -465,3 +487,10 @@ double slsDetectorUsers::setSubFrameExposureDeadTime(double t, bool inseconds, i
} }
} }
int64_t slsDetectorUsers::setNumberOfStorageCells(int64_t t, int imod) {
return myDetector->setTimer(slsReceiverDefs::STORAGE_CELL_NUMBER, t, imod);
}
int slsDetectorUsers::setStoragecellStart(int pos) {
return myDetector->setStoragecellStart(pos);
}

View File

@ -88,26 +88,21 @@ class slsDetectorUsers
public: public:
/** @short default constructor /** @short default constructor
* @param id multi detector id
* @param ret address of return value. It will be set to 0 for success, else 1 for failure * @param ret address of return value. It will be set to 0 for success, else 1 for failure
* @param id multi detector id
* in creating multidetector object * in creating multidetector object
*/ */
slsDetectorUsers(int id=0, int& ret); slsDetectorUsers(int& ret, int id=0);
/** @short virtual destructor */ /** @short virtual destructor */
virtual ~slsDetectorUsers(); virtual ~slsDetectorUsers();
/** /**
@short useful to define subset of working functions @short useful to define subset of working functions
\returns "PSI" or "Dectris" \returns "PSI" or "Dectris"
*/ */
std::string getDetectorDeveloper(); std::string getDetectorDeveloper();
/** @short sets the onlineFlag /** @short sets the onlineFlag
\param online can be: -1 returns wether the detector is in online (1) or offline (0) state; 0 detector in offline state; 1 detector in online state \param online can be: -1 returns wether the detector is in online (1) or offline (0) state; 0 detector in offline state; 1 detector in online state
\returns 0 (offline) or 1 (online) \returns 0 (offline) or 1 (online)
@ -377,7 +372,6 @@ class slsDetectorUsers
*/ */
int64_t setNumberOfCycles(int64_t t=-1, int imod = -1); int64_t setNumberOfCycles(int64_t t=-1, int imod = -1);
/** /**
@short set/get the external communication mode @short set/get the external communication mode
\param pol value to be set \sa getTimingMode \param pol value to be set \sa getTimingMode
@ -556,11 +550,54 @@ class slsDetectorUsers
*/ */
int enableGapPixels(int enable=-1); int enableGapPixels(int enable=-1);
/**
* Sets the frames discard policy in receiver
* frame discard policy options:
* @param f nodiscard (default),discardempty, discardpartial (fastest), get to get the value
* @returns f nodiscard (default),discardempty, discardpartial (fastest)
*/
std::string setReceiverFramesDiscardPolicy(std::string f="get");
/**
* Sets the frame padding in receiver
* @param f 0 does not partial frames, 1 pads partial frames (-1 gets)
* @returns partial frames padding enable
*/
int setReceiverPartialFramesPadding(int f = -1);
/**
* Sets the frames per file in receiver
* @param f frames per file, 0 is infinite ie. every frame in same file (-1 gets)
* @returns frames per file
*/
int setReceiverFramesPerFile(int f = -1);
/**
* Sends a software internal trigger (EIGER only)
* @returns 0 for success, 1 for fail
*/
int sendSoftwareTrigger();
/**
* get measured period between previous two frames(EIGER only)
* @param inseconds true if the value is in s, else ns
* @param imod module number (-1 for all)
* @returns measured period
*/
double getMeasuredPeriod(bool inseconds=false, int imod = -1);
/**
* get measured sub period between previous two sub frames in 32 bit mode (EIGER only)
* @param inseconds true if the value is in s, else ns
* @param imod module number (-1 for all)
* @returns measured sub period
*/
double getMeasuredSubFramePeriod(bool inseconds=false, int imod = -1);
/** /**
@short register calbback for accessing detector final data @short register calbback for accessing detector final data
\param func function to be called at the end of the acquisition. gets detector status and progress index as arguments \param func function to be called at the end of the acquisition. gets detector status and progress index as arguments
*/ */
void registerAcquisitionFinishedCallback(int( *func)(double,int, void*), void *pArg); void registerAcquisitionFinishedCallback(int( *func)(double,int, void*), void *pArg);
/** /**
@ -757,6 +794,21 @@ class slsDetectorUsers
*/ */
double setSubFrameExposureDeadTime(double t=-1, bool inseconds=false, int imod = -1); double setSubFrameExposureDeadTime(double t=-1, bool inseconds=false, int imod = -1);
/**
* set/get number of additional storage cells (Jungfrau)
* @param t number of additional storage cells. Default is 0. (-1 gets)
* @param imod module number (-1 for all)
* @returns number of additional storage cells
*/
int64_t setNumberOfStorageCells(int64_t t=-1, int imod = -1);
/**
* Set storage cell that stores first acquisition of the series (Jungfrau)
* @param value storage cell index. Value can be 0 to 15. Default is 15. (-1 gets)
* @returns the storage cell that stores the first acquisition of the series
*/
int setStoragecellStart(int pos=-1);
/************************************************************************ /************************************************************************
STATIC FUNCTIONS STATIC FUNCTIONS

View File

@ -291,9 +291,10 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing {
/** /**
get current timer value get current timer value
\param index timer index \param index timer index
\param imod module number
\returns elapsed time value in ns or number of...(e.g. frames, gates, probes) \returns elapsed time value in ns or number of...(e.g. frames, gates, probes)
*/ */
virtual int64_t getTimeLeft(timerIndex index)=0; virtual int64_t getTimeLeft(timerIndex index, int imod = -1)=0;
/** /**
* set storage cell that stores first acquisition of the series (Jungfrau only) * set storage cell that stores first acquisition of the series (Jungfrau only)