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
This commit is contained in:
Dhanya Thattil
2022-12-15 09:16:51 +01:00
committed by GitHub
parent 7ab3b25f87
commit 39b1f5bbf2
58 changed files with 4309 additions and 5499 deletions

View File

@ -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) {

View File

@ -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<int>,
"[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<int>,
"[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<int>,
"[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<int>,
"[0, 1]\n\t[Jungfrau] Enables or disables "
"synchronization between modules.");
INTEGER_COMMAND_SET_NOID_GET_ID(
sync, getSynchronization, setSynchronization, StringTo<int>,
"[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<slsDetectorDefs::timingMode>,
"[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<int>,
"[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<int>,
"[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<int>,
"[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<int>,
"[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<int>,
@ -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<int>,
"[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<int>,
"[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<int>,
"\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<int>,
"[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<int>,
"[0, 1]\n\t[Eiger][Ctb][Moench][Mythen3] 10GbE Enable.");
INTEGER_COMMAND_VEC_ID(tengiga, getTenGiga, setTenGiga, StringTo<int>,
"[0, 1]\n\t[Eiger][Ctb][Mythen3] 10GbE Enable.");
INTEGER_COMMAND_VEC_ID(flowcontrol10g, getTenGigaFlowControl,
setTenGigaFlowControl, StringTo<int>,
"[0, 1]\n\t[Eiger][Jungfrau] 10GbE Flow Control.");
INTEGER_COMMAND_VEC_ID(
flowcontrol10g, getTenGigaFlowControl, setTenGigaFlowControl,
StringTo<int>,
"[0, 1]\n\t[Eiger][Jungfrau][Moench] 10GbE Flow Control.");
INTEGER_COMMAND_VEC_ID(
txdelay_frame, getTransmissionDelayFrame, setTransmissionDelayFrame,
StringTo<int>,
"[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<int>,
"[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<int>,
"[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<int>,
"[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<int>,
"[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<int>,
"[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<int>,
"[0-12]\n\t[Jungfrau] Set Filter Cell. Only for "
"chipv1.1. Advanced user Command");
INTEGER_COMMAND_VEC_ID(
filtercells, getNumberOfFilterCells, setNumberOfFilterCells,
StringTo<int>,
"[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<int>,
"[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<int>,
"[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<int>,
"[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<int>,
"[n_value]\n\t[Ctb][Moench] Pipeline for ADC clock.");
INTEGER_COMMAND_VEC_ID(adcpipeline, getADCPipeline, setADCPipeline,
StringTo<int>,
"[n_value]\n\t[Ctb] Pipeline for ADC clock.");
INTEGER_IND_COMMAND(v_limit, getVoltage, setVoltage, StringTo<int>,
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<uint32_t>,
"[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<uint32_t>,
"[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<uint64_t>,
"[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<uint64_t>,
"[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<uint64_t>,
"[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<uint32_t>,
"[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.");
};

View File

@ -183,17 +183,12 @@ std::vector<defs::detectorSettings> Detector::getSettingsList() const {
defs::HIGHGAIN, defs::DYNAMICGAIN, defs::LOWGAIN, defs::MEDIUMGAIN,
defs::VERYHIGHGAIN};
case defs::JUNGFRAU:
case defs::MOENCH:
return std::vector<defs::detectorSettings>{defs::GAIN0,
defs::HIGHGAIN0};
case defs::GOTTHARD2:
return std::vector<defs::detectorSettings>{
defs::DYNAMICGAIN, defs::FIXGAIN1, defs::FIXGAIN2};
case defs::MOENCH:
return std::vector<defs::detectorSettings>{
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::detectorSettings>{defs::STANDARD, defs::FAST,
defs::HIGHGAIN};
@ -482,6 +477,7 @@ std::vector<defs::speedLevel> Detector::getReadoutSpeedList() const {
switch (getDetectorType().squash()) {
case defs::EIGER:
case defs::JUNGFRAU:
case defs::MOENCH:
return std::vector<defs::speedLevel>{defs::FULL_SPEED, defs::HALF_SPEED,
defs::QUARTER_SPEED};
case defs::GOTTHARD2:
@ -604,6 +600,7 @@ std::vector<defs::dacIndex> Detector::getTemperatureList() const {
case defs::CHIPTESTBOARD:
return std::vector<defs::dacIndex>{defs::SLOW_ADC_TEMP};
case defs::JUNGFRAU:
case defs::MOENCH:
case defs::GOTTHARD:
return std::vector<defs::dacIndex>{defs::TEMPERATURE_ADC,
defs::TEMPERATURE_FPGA};
@ -642,6 +639,7 @@ Result<int> 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<defs::dacIndex> 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::dacIndex>{
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<defs::dacIndex> 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::dacIndex>{
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<defs::dacIndex>(i));
@ -919,7 +914,8 @@ Result<int> 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<double> Detector::getChipVersion(Positions pos) const {
return pimpl->Parallel(&Module::getChipVersion, pos);
}
@ -1672,6 +1668,7 @@ void Detector::setStorageCellDelay(ns value, Positions pos) {
std::vector<defs::gainMode> Detector::getGainModeList() const {
switch (getDetectorType().squash()) {
case defs::JUNGFRAU:
case defs::MOENCH:
return std::vector<defs::gainMode>{
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<int> 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<std::map<std::string, std::string>>
Detector::getAdditionalJsonHeader(Positions pos) const {
return pimpl->Parallel(&Module::getAdditionalJsonHeader, pos);

View File

@ -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<char> 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) {

View File

@ -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

View File

@ -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

View File

@ -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<int, 2> 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<int>(value), nullptr);
}
// Jungfrau Specific
// Jungfrau/Moench Specific
double Module::getChipVersion() const {
return (sendToDetector<int>(F_GET_CHIP_VERSION)) / 10.00;
}
@ -2303,7 +2304,7 @@ void Module::setDigitalPulsing(const bool enable) {
sendToDetector(F_SET_DIGITAL_PULSING, static_cast<int>(enable), nullptr);
}
// CTB / Moench Specific
// CTB Specific
int Module::getNumberOfAnalogSamples() const {
return sendToDetector<int>(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<std::string, std::string> 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<char> 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<char> 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<char> buffer,
void Module::updateKernel(std::vector<char> buffer) {
switch (shm()->detType) {
case JUNGFRAU:
case CHIPTESTBOARD:
case MOENCH:
case CHIPTESTBOARD:
sendProgram(true, buffer, F_UPDATE_KERNEL, "Update Kernel");
break;
case MYTHEN3:

View File

@ -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;