From 25ece55d7fec6c5a42154903b3e948efc3b2932d Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 10:09:27 +0200 Subject: [PATCH 01/45] more changes to client docu. more coming up --- .../slsDetector/slsDetectorCommand.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 9d4e1820c..68ef1892b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1460,49 +1460,49 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* read only timers */ /*! \page config - - exptimel [i] gets exposure time left. Used in MYTHEN, GOTTHARD only. + - exptimel [i] gets exposure time left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="exptimel"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - periodl [i] gets frame period left. Used in MYTHEN, GOTTHARD only. + - periodl [i] gets frame period left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="periodl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - delayl [i] gets delay left. Used in MYTHEN, GOTTHARD only. + - delayl [i] gets delay left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="delayl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - gatesl [i] gets number of gates left. Used in MYTHEN, GOTTHARD only. + - gatesl [i] gets number of gates left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="gatesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - framesl [i] gets number of frames left. Used in MYTHEN, GOTTHARD only. + - framesl [i] gets number of frames left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="framesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - cyclesl [i] gets number of cylces left. Used in MYTHEN, GOTTHARD only. + - cyclesl [i] gets number of cylces left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="cyclesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - probesl [i] gets number of probes left. Used in MYTHEN, GOTTHARD only. + - probesl [i] gets number of probes left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="probesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; @@ -1512,6 +1512,9 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; // i++; + /*! \page config + - now [i] ??? Only get! + */ descrToFuncMap[i].m_pFuncName="now"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; From 413a944e70e94b82e0f2f6051198fb1a3e24ff8f Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 10:11:39 +0200 Subject: [PATCH 02/45] fixed problem with datastream help --- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 68ef1892b..aa900d25e 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -2054,7 +2054,7 @@ string slsDetectorCommand::cmdDataStream(int narg, char *args[], int action) { myDet->setReceiverOnline(ONLINE_FLAG); if (action==HELP_ACTION) - return helpStatus(narg,args,HELP_ACTION); + return helpDataStream(narg,args,HELP_ACTION); if (action==PUT_ACTION) { if (!sscanf(args[1],"%d",&ival)) From 03cc80dc3c54e9d5ce3de00a7d6c006e842c5f15 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 10:36:25 +0200 Subject: [PATCH 03/45] more changes to client docu. more coming up --- .../slsDetector/slsDetectorCommand.cpp | 82 +++++++++++++++---- 1 file changed, 67 insertions(+), 15 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index aa900d25e..a91b6d270 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -464,7 +464,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /*! \page output - - fileformat gets the file format for data (no put?) What are the possible return values? + - fileformat sets/gets the file format for data in receiver. Options: [ascii, binary, hdf5]. Ascii is not implemented in Receiver. */ descrToFuncMap[i].m_pFuncName="fileformat"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; @@ -1460,49 +1460,49 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* read only timers */ /*! \page config - - exptimel [i] gets exposure time left. Used in MYTHEN, GOTTHARD only. Only get! + - exptimel gets exposure time left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="exptimel"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - periodl [i] gets frame period left. Used in MYTHEN, GOTTHARD only. Only get! + - periodl gets frame period left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="periodl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - delayl [i] gets delay left. Used in MYTHEN, GOTTHARD only. Only get! + - delayl gets delay left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="delayl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - gatesl [i] gets number of gates left. Used in MYTHEN, GOTTHARD only. Only get! + - gatesl gets number of gates left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="gatesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - framesl [i] gets number of frames left. Used in MYTHEN, GOTTHARD only. Only get! + - framesl gets number of frames left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="framesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - cyclesl [i] gets number of cylces left. Used in MYTHEN, GOTTHARD only. Only get! + - cyclesl gets number of cylces left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="cyclesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - probesl [i] gets number of probes left. Used in MYTHEN, GOTTHARD only. Only get! + - probesl gets number of probes left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="probesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; @@ -1513,68 +1513,107 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { // i++; /*! \page config - - now [i] ??? Only get! + - now ??? Only get! */ descrToFuncMap[i].m_pFuncName="now"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; + /*! \page config + - timestamp ??? Only get! + */ descrToFuncMap[i].m_pFuncName="timestamp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; + /*! \page config + - nframes ??? Only get! + */ descrToFuncMap[i].m_pFuncName="nframes"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /* speed */ - + /*! \page config + - clkdivider [i] sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. MYTHEN[???] + */ descrToFuncMap[i].m_pFuncName="clkdivider"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; + /*! \page config + - clkdivider [i] sets/gets length of set/reset signals (in clock cycles). Used in MYTHEN only + */ descrToFuncMap[i].m_pFuncName="setlength"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; + /*! \page config + - clkdivider [i] sets/gets waitstates of the bus interface (in clock cycles). Used in MYTHEN only + */ descrToFuncMap[i].m_pFuncName="waitstates"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; + /*! \page config + - clkdivider [i] sets/gets clock divider in tot mode. Used in MYTHEN only + */ descrToFuncMap[i].m_pFuncName="totdivider"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; + /*! \page config + - clkdivider [i] sets/gets duty cycle of the tot clock. Used in MYTHEN only + */ descrToFuncMap[i].m_pFuncName="totdutycycle"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; + /*! \page config + - phasestep [i] ??? + */ descrToFuncMap[i].m_pFuncName="phasestep"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; + /*! \page config + - oversampling [i] ??? + */ descrToFuncMap[i].m_pFuncName="oversampling"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; + /*! \page config + - adcclk [i] ??? + */ descrToFuncMap[i].m_pFuncName="adcclk"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; + /*! \page config + - adcphase [i] ??? Used in MYTHEN, JUNGFRAU only. + */ descrToFuncMap[i].m_pFuncName="adcphase"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; - + /*! \page config + - adcpipeline [i] ??? + */ descrToFuncMap[i].m_pFuncName="adcpipeline"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; - + /*! \page config + - dbitclk [i] ??? + */ descrToFuncMap[i].m_pFuncName="dbitclk"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; + /*! \page config + - dbitphase [i] ??? + */ descrToFuncMap[i].m_pFuncName="dbitphase"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; @@ -1585,20 +1624,33 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; - /* settings dump/retrieve */ + + /*! \page config + - config [fname] sets/saves detector/receiver to configuration contained in fname. Same as executing sls_detector_put for every line. Normally a one time operation. + */ descrToFuncMap[i].m_pFuncName="config"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; i++; + /* settings dump/retrieve */ + /*! \page config + - rx_printconfig prints the receiver configuration. Only get!" + */ descrToFuncMap[i].m_pFuncName="rx_printconfig"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; i++; + /*! \page config + - parameters [fname] sets/saves detector parameters contained in fname. Normally once per different measurement." + */ descrToFuncMap[i].m_pFuncName="parameters"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; i++; + /*! \page config + - setup [fname] sets/saves detector complete setup contained in fname (extensions automatically generated), including trimfiles, ff coefficients etc." + */ descrToFuncMap[i].m_pFuncName="setup"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; i++; @@ -2577,7 +2629,7 @@ string slsDetectorCommand::helpFileName(int narg, char *args[], int action){ } if (action==PUT_ACTION || action==HELP_ACTION){ os << string("fname s \t sets the filename for the data (index and extension will be automatically appended)\n"); - os << string("fname s \t sets the file format for the data (binary, ascii, hdf5)\n"); + os << string("fileformat s \t sets the file format for the data (binary, ascii, hdf5)\n"); } return os.str(); } @@ -5423,7 +5475,7 @@ string slsDetectorCommand::helpConfiguration(int narg, char *args[], int action) } if (action==GET_ACTION || action==HELP_ACTION) { - + os << "rx_printconfig \t prints the receiver configuration" << std::endl; os << "config fname \t saves the detector to the configuration to fname" << std::endl; os << "parameters fname \t saves the detector parameters to fname" << std::endl; os << "setup fname \t saves the detector complete detector setup to fname (extensions automatically generated), including trimfiles, ff coefficients etc." << std::endl; From c21f7f371a81d801af6c7940137775b59163d7dc Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 10:42:27 +0200 Subject: [PATCH 04/45] more changes to client docu. more coming up --- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index a91b6d270..ddabd858c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1811,14 +1811,23 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* pulse */ + /*! \page config + - pulse [n] [x] [y] pulses pixel at coordinates (x,y) n number of times. Used in EIGER only. Only put!" + */ descrToFuncMap[i].m_pFuncName="pulse"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; i++; + /*! \page config + - pulsenmove [n] [x] [y] pulses pixel n number of times and moves relatively by x value (x axis) and y value(y axis). Used in EIGER only. Only put!" + */ descrToFuncMap[i].m_pFuncName="pulsenmove"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; i++; + /*! \page config + - pulsechip [n]pulses chip n number of times, while n=-1 will reset it to normal mode. Used in EIGER only. Only put!" + */ descrToFuncMap[i].m_pFuncName="pulsechip"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; i++; From 5de120f7e7bf0d495a588b2f179e01f29071905f Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 11:03:22 +0200 Subject: [PATCH 05/45] more changes to client docu. more coming up. removed slsDetectorClientDocs from here --- slsDetectorSoftware/.gitignore | 3 +- .../slsDetector/slsDetectorCommand.cpp | 46 +- .../html/acquisition.html | 85 -- .../slsDetectorClientDocs/html/actions.html | 136 ---- .../slsDetectorClientDocs/html/advanced.html | 61 -- .../slsDetectorClientDocs/html/config.html | 215 ------ .../slsDetectorClientDocs/html/data.html | 106 --- .../slsDetectorClientDocs/html/doxygen.css | 498 ------------ .../slsDetectorClientDocs/html/doxygen.png | Bin 1281 -> 0 bytes .../slsDetectorClientDocs/html/index.html | 88 --- .../slsDetectorClientDocs/html/installdox | 117 --- .../slsDetectorClientDocs/html/network.html | 112 --- .../slsDetectorClientDocs/html/output.html | 82 -- .../slsDetectorClientDocs/html/pages.html | 80 -- .../slsDetectorClientDocs/html/receiver.html | 61 -- .../html/search/close.png | Bin 273 -> 0 bytes .../html/search/nomatches.html | 12 - .../html/search/search.css | 198 ----- .../html/search/search.js | 724 ------------------ .../html/search/search.png | Bin 527 -> 0 bytes .../slsDetectorClientDocs/html/settings.html | 95 --- .../slsDetectorClientDocs/html/tab_b.gif | Bin 35 -> 0 bytes .../slsDetectorClientDocs/html/tab_l.gif | Bin 706 -> 0 bytes .../slsDetectorClientDocs/html/tab_r.gif | Bin 2585 -> 0 bytes .../slsDetectorClientDocs/html/tabs.css | 105 --- .../slsDetectorClientDocs/html/test.html | 100 --- .../slsDetectorClientDocs/latex/Makefile | 19 - .../latex/acquisition.tex | 41 - .../slsDetectorClientDocs/latex/actions.tex | 126 --- .../slsDetectorClientDocs/latex/advanced.tex | 1 - .../slsDetectorClientDocs/latex/config.tex | 257 ------- .../slsDetectorClientDocs/latex/data.tex | 76 -- .../slsDetectorClientDocs/latex/doxygen.sty | 348 --------- .../slsDetectorClientDocs/latex/index.tex | 44 -- .../slsDetectorClientDocs/latex/network.tex | 84 -- .../slsDetectorClientDocs/latex/output.tex | 36 - .../slsDetectorClientDocs/latex/receiver.tex | 1 - .../slsDetectorClientDocs/latex/refman.tex | 93 --- .../slsDetectorClientDocs/latex/settings.tex | 57 -- .../slsDetectorClientDocs/latex/test.tex | 64 -- 40 files changed, 42 insertions(+), 4129 deletions(-) delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/acquisition.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/actions.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/advanced.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/config.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/data.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/doxygen.css delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/doxygen.png delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/index.html delete mode 100755 slsDetectorSoftware/slsDetectorClientDocs/html/installdox delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/network.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/output.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/pages.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/receiver.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/search/close.png delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/search/nomatches.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/search/search.css delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/search/search.js delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/search/search.png delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/settings.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/tab_b.gif delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/tab_l.gif delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/tab_r.gif delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/tabs.css delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/html/test.html delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/Makefile delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/acquisition.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/actions.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/advanced.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/config.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/data.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/doxygen.sty delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/index.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/network.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/output.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/receiver.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/refman.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/settings.tex delete mode 100644 slsDetectorSoftware/slsDetectorClientDocs/latex/test.tex diff --git a/slsDetectorSoftware/.gitignore b/slsDetectorSoftware/.gitignore index 752a00776..6a4d1707d 100644 --- a/slsDetectorSoftware/.gitignore +++ b/slsDetectorSoftware/.gitignore @@ -1,3 +1,4 @@ *.o *~ -#*# \ No newline at end of file +#*# +slsDetectorClientDocs/ diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index ddabd858c..4bfdcc268 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1635,21 +1635,21 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* settings dump/retrieve */ /*! \page config - - rx_printconfig prints the receiver configuration. Only get!" + - rx_printconfig prints the receiver configuration. Only get! */ descrToFuncMap[i].m_pFuncName="rx_printconfig"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; i++; /*! \page config - - parameters [fname] sets/saves detector parameters contained in fname. Normally once per different measurement." + - parameters [fname] sets/saves detector parameters contained in fname. Normally once per different measurement. */ descrToFuncMap[i].m_pFuncName="parameters"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; i++; /*! \page config - - setup [fname] sets/saves detector complete setup contained in fname (extensions automatically generated), including trimfiles, ff coefficients etc." + - setup [fname] sets/saves detector complete setup contained in fname (extensions automatically generated), including trimfiles, ff coefficients etc. */ descrToFuncMap[i].m_pFuncName="setup"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; @@ -1659,52 +1659,86 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* receiver functions */ /*! \page receiver Receiver commands - Commands to configure the receiver + Commands to configure the receiver. Not used in MYTHEN. + */ + + /*! \page receiver + - receiver [s] starts/stops the receiver to listen to detector packets. Gets status of receiver. Options: [start, stop]. */ descrToFuncMap[i].m_pFuncName="receiver"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; + /*! \page receiver + - r_online [i] sets/gets the receiver in online/offline mode. 1 is online, 0 is offline. Get is from shared memory. + */ descrToFuncMap[i].m_pFuncName="r_online"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; i++; - descrToFuncMap[i].m_pFuncName="r_checkonline"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; + /*! \page receiver + - r_checkonline Checks the receiver if it is online/offline mode. Prints either 'All receiver online', '[List of all receiver hostname in offline mode] :Not all receiver online'. Only get! i++; + /*! \page receiver + - framescaught gets the number of frames caught by receiver. Average of all for multi-detector command. Only get! + */ descrToFuncMap[i].m_pFuncName="framescaught"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; + /*! \page receiver + - resetframescaught [i] resets the number of frames caught to 0. i can be any number. Use this if using status start, instead of acquire (this command is included). Only put! + */ descrToFuncMap[i].m_pFuncName="resetframescaught"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; + /*! \page receiver + - frameindex [i] gets the current frame index of receiver. Average of all for multi-detector command. Only get! + */ descrToFuncMap[i].m_pFuncName="frameindex"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; + /*! \page receiver + - r_lock [i] locks/unlocks the receiver to communicate with only this client. 1 locks, 0 unlocks. + */ descrToFuncMap[i].m_pFuncName="r_lock"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLock; i++; + /*! \page receiver + - r_lastclient gets the last client communicating with the receiver. Only get! + */ descrToFuncMap[i].m_pFuncName="r_lastclient"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLastClient; i++; + /*! \page receiver + - r_readfreq [i] sets/gets the stream frequency of data from receiver to client. i > 0 is the nth frame being streamed. 0 sets frequency to a default timer (200ms). + */ descrToFuncMap[i].m_pFuncName="r_readfreq"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; + /*! \page test + - r_compression [i] sets/gets compression in receiver. 1 sets, 0 unsets. Not implemented. + */ descrToFuncMap[i].m_pFuncName="r_compression"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; + /*! \page config + - tengiga [i] enables/disables 10GbE in system (detector & receiver). 1 enabled 10GbE, 0 enables 1GbE. Used in EIGER only. + */ descrToFuncMap[i].m_pFuncName="tengiga"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; + /*! \page receiver + - rx_fifodepth [i] sets/gets receiver fifo (between Listener and Writer Threads) depth to i number of frames. Can improve listener packet loss, not if limited by writing. + */ descrToFuncMap[i].m_pFuncName="rx_fifodepth"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/acquisition.html b/slsDetectorSoftware/slsDetectorClientDocs/html/acquisition.html deleted file mode 100644 index a96418f67..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/acquisition.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - -Acquition commands - - - - - - - - - -
- - -

Acquition commands

Commands to control the acquisition

-
    -
  • acquire blocking acquisition (like calling sls_detector_acquire). Starts receiver and detector, writes and processes the data, stops detector. Only get!
  • -
-
    -
  • data gets all data from the detector (if any) processes them and writes them to file according to the preferences already setup (MYTHEN only). Only get!
  • -
-
    -
  • frame gets a single frame from the detector (if any) processes it and writes it to file according to the preferences already setup (MYTHEN only). Only get!
  • -
-
    -
  • status returns the detector status (string)- can be: running, error, transmitting, finished, waiting or idle; put can be start or stop
  • -
-
    -
  • busy returns 1 if the acquisition is active, 0 otherwise. Works when the acquisition is started in non-blocking mode. Only get!
  • -
-
    -
  • readctr Reads the counters from the detector memory (analog detector returning values translated into number of photons - only GOTTHARD). Cannot put.
  • -
-
    -
  • resetctr i Resets counter in detector, restarts acquisition if i=1(analog detector returning values translated into number of photons - only GOTTHARD). Cannot put.
  • -
-
    -
  • resmat i sets/resets counter bit in detector.gets the counter bit in detector ????
  • -
-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/actions.html b/slsDetectorSoftware/slsDetectorClientDocs/html/actions.html deleted file mode 100644 index 2beec987a..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/actions.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - -Actions - - - - - - - - - -
- - -

Actions

Commands to define scripts to be executed during the acquisition flow

-
    -
  • positions [n [p0..pn-1]] sets/gets number of angular position and positions to be acquired.
  • -
-
    -
  • startscript [s] sets/gets the script to be executed at the beginning of the acquisition. none unsets.
  • -
-
    -
  • startscriptpar [s] sets/gets a string to be passed as a parameter to the startscript
  • -
-
    -
  • stopscript [s] sets/gets the script to be executed at the end of the acquisition. none unsets.
  • -
-
    -
  • stopscriptpar [s] sets/gets a string to be passed as a parameter to the stopscript
  • -
-
    -
  • scriptbefore [s] sets/gets the script to be executed before starting the detector every time in the acquisition. none unsets.
  • -
-
    -
  • scriptbeforepar [s] sets/gets a string to be passed as a parameter to the scriptbefore
  • -
-
    -
  • scriptafter [s] sets/gets the script to be executed after the detector has finished every time in the acquisition. none unsets.
  • -
-
    -
  • scriptafterpar [s] sets/gets a string to be passed as a parameter to the scriptafter
  • -
-
    -
  • headerafter [s] sets/gets the script to be executed for logging the detector parameters. none unsets.
  • -
-
    -
  • headerbefore [s] sets/gets the script to be executed for logging the detector parameters. none unsets.
  • -
-
    -
  • headerbeforepar [s] sets/gets a string to be passed as a parameter to the headerbefore script
  • -
-
    -
  • headerafterpar [s] sets/gets a string to be passed as a parameter to the headerafter script
  • -
-
    -
  • enacallog [i] enables/disables logging of the parameters necessary for the energy calibration. 1 sets, 0 unsets.
  • -
-
    -
  • angcallog [i] enables/disables logging of the parameters necessary for the angular calibration. 1 sets, 0 unsets.
  • -
-
    -
  • scan0script [s] sets/gets the script to be executed for the scan 0 level. none unsets.
  • -
-
    -
  • scan0par [s] sets/gets a string to be passed as a parameter to the scan0script
  • -
-
    -
  • scan0prec [i] sets/gets number of digits to be used for the scan0 variable in the file name.
  • -
-
    -
  • scan0steps [i [s0..sn-1]] sets/gets number of steps (int) of the scan0 level and their values (float).
  • -
-
    -
  • scan0range [smin smax sstep] sets scan0 min, max and step, returns the number of steps and their values as scan0steps.
  • -
-
    -
  • scan1script [s] sets/gets the script to be executed for the scan1 level. none unsets.
  • -
-
    -
  • scan1par [s] sets/gets a string to be passed as a parameter to the scan1script
  • -
-
    -
  • scan1prec [i] sets/gets number of digits to be used for the scan1 variable in the file name.
  • -
-
    -
  • scan1steps [i [s0..sn-1]] sets/gets number of steps (int) of the scan1 level and their values (float).
  • -
-
    -
  • scan1range [smin smax sstep] sets scan1 min, max and step, returns the number of steps and their values as scan1steps.
  • -
-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/advanced.html b/slsDetectorSoftware/slsDetectorClientDocs/html/advanced.html deleted file mode 100644 index b24667eb2..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/advanced.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - -Advanced Usage - - - - - - - - - -
- - -

Advanced Usage

This page is for advanced users. Make sure you have first read the introduction.

-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/config.html b/slsDetectorSoftware/slsDetectorClientDocs/html/config.html deleted file mode 100644 index f56fa32ce..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/config.html +++ /dev/null @@ -1,215 +0,0 @@ - - - - - -Configuration commands - - - - - - - - - -
- - -

Configuration commands

Commands to configure the detector. these commands are often left to the configuration file.

-
    -
  • datastream enables/disables the 0MQ data stream (0MQ threads created) from receiver to client.
  • -
-
    -
  • free Free shared memory on the control PC
  • -
-
    -
  • add Adds a detector at the end of the multi-detector structure. put argument is the hostname or IP adress. Returns the chained list of detector hostnames.
  • -
-
    -
  • remove i Removes controller i from the multi-detector structure. Can be used for partial readout of the detector.
  • -
-
    -
  • type Sets/gets detector type (string).
  • -
-
    -
  • hostname put adds the hostname (ot IP adress) at the end of the multi-detector structure. If used for a single controlled (i:) replaces the current hostname. Returns the list of the hostnames of the multi-detector structure.
  • -
-
    -
  • id[:i] Returns the id of the detector structure. i is the detector position in a multi detector system. If used a put, configures the id of the detector structure. i is the detector position in a multi detector system and l is the id of the detector to be added.
  • -
-
    -
  • master i put sets the position of the master of the acquisition (-1 if none). Returns the position of the master of the detector structure (-1 if none).
  • -
-
    -
  • sync Sets/gets the synchronization mode of the detectors in the multi-detector structure. Can be: none, gating, trigger, complementary. Mainly used by MYTHEN/GOTTHARD.
  • -
-
    -
  • online [i] sets the detector in online (1) or offline (0) mode
  • -
-
    -
  • checkonline returns the hostnames of all detectors without connecting to them
  • -
-
    -
  • activate Activates/Deactivates the detector. Deactivated detector does not send data. Used for EIGER only.
  • -
-
    -
  • lock [i] Locks/Unlocks the detector to communicate with this client. 1 locks, 0 unlocks.
  • -
-
    -
  • nmod [i] sets/gets the number of modules of the detector. Used for MYTHEN only.
  • -
-
    -
  • maxmod Gets the maximum number of modules of the detector. Used for MYTHEN only. Cannot put!
  • -
-
    -
  • dr [i] sets/gets the dynamic range of detector. Mythen [4,8,16,24]. Eiger [4,8,16,32]. Others cannot put!
  • -
-
    -
  • roi [i] [xmin] [xmax] [ymin] [ymax] sets region of interest of the detector, where i is number of rois;i=0 to clear rois. Used for GOTTHARD only.
  • -
-
    -
  • detsizechan [xmax] [ymax] sets the maximum number of channels in each dimension for complete detector set; -1 is no limit. Use for multi-detector system as first command in config file.
  • -
-
    -
  • roimask [i] ??
  • -
-
    -
  • flippeddatax [i] enables/disables data being flipped across x axis. 1 enables, 0 disables. Used for EIGER only. 1 for bottom half-module, 0 for top-half module.
  • -
-
    -
  • flags [flag] sets/gets the readout flags to mode. Options: none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, unknown. Used for MYTHEN and EIGER only.
  • -
-
    -
  • extsig:[i] [flag] sets/gets the mode of the external signal i. Options: off, gate_in_active_high, gate_in_active_low, trigger_in_rising_edge, trigger_in_falling_edge, ro_trigger_in_rising_edge, ro_trigger_in_falling_edge, gate_out_active_high, gate_out_active_low, trigger_out_rising_edge, trigger_out_falling_edge, ro_trigger_out_rising_edge, ro_trigger_out_falling_edge.
    - Used in MYTHEN, GOTTHARD, PROPIX only.
  • -
-
    -
  • programfpga [file] programs the FPGA with file f (with .pof extension). Used for JUNGFRAU, MOENCH only. Only put!
  • -
-
    -
  • resetfpga [f] resets FPGA, where f can be any value. Used for JUNGFRAU only. Only put!
  • -
-
    -
  • powerchip [i] Powers on/off the chip. 1 powers on, 0 powers off. Can also get the power status. Used for JUNGFRAU only.
  • -
-
    -
  • led [i] sets/gets the led status. 1 on, 0 off. Used for MOENCH only ??
  • -
-
    -
  • moduleversion:[i] Gets the firmware version of module i. Used for MYTHEN only. Only get!
  • -
-
    -
  • detectornumber Gets the serial number or MAC of detector. Only get!
  • -
-
    -
  • modulenumber:[i] Gets the serial number of module i. Used for MYTHEN only. Only get!
  • -
-
    -
  • detectorversion Gets the firmware version of detector. Only get!
  • -
-
    -
  • softwareversion Gets the software version of detector server. Only get!
  • -
-
    -
  • thisversion Gets the software version of this client software. Only get!
  • -
-
    -
  • receiverversion Gets the software version of receiver. Only get!
  • -
-
    -
  • timing [mode] sets/gets synchronization mode of the detector. Mode: auto, trigger, ro_trigger, gating, triggered_gating
  • -
-
    -
  • exptime [i] sets/gets exposure time in s
  • -
-
    -
  • subexptime [i] sets/gets sub exposure time in s. Used in EIGER only in 32 bit mode.
  • -
-
    -
  • period [i] sets/gets frame period in s.
  • -
-
    -
  • delay [i] sets/gets delay in s. Used in MYTHEN, GOTTHARD only
  • -
-
    -
  • gates [i] sets/gets number of gates. Used in MYTHEN, GOTTHARD, EIGER only
  • -
-
    -
  • gates [i] sets/gets number of frames. If timing is not auto, then it is the number of frames per cycle/trigger.
  • -
-
    -
  • cycles [i] sets/gets number of triggers. Timing mode should be set appropriately.
  • -
-
    -
  • probes [i] sets/gets number of probes to accumulate. When setting, max 3! cycles should be set to 1, frames to the number of pump-probe events. Used in MYTHEN only
  • -
-
    -
  • measurements [i] sets/gets number of measurements.
  • -
-
    -
  • samples [i] sets/gets number of samples expected from the jctb. Used in CHIP TEST BOARD only.
  • -
-
    -
  • exptimel [i] gets exposure time left. Used in MYTHEN, GOTTHARD only.
  • -
-
    -
  • periodl [i] gets frame period left. Used in MYTHEN, GOTTHARD only.
  • -
-
    -
  • delayl [i] gets delay left. Used in MYTHEN, GOTTHARD only.
  • -
-
    -
  • gatesl [i] gets number of gates left. Used in MYTHEN, GOTTHARD only.
  • -
-
    -
  • framesl [i] gets number of frames left. Used in MYTHEN, GOTTHARD only.
  • -
-
    -
  • cyclesl [i] gets number of cylces left. Used in MYTHEN, GOTTHARD only.
  • -
-
    -
  • probesl [i] gets number of probes left. Used in MYTHEN, GOTTHARD only.
  • -
-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/data.html b/slsDetectorSoftware/slsDetectorClientDocs/html/data.html deleted file mode 100644 index ce4399606..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/data.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - -Data processing commands - - - - - - - - - -
- - -

Data processing commands

Commands to setup the data processing (mainly MYTHEN related)

-
    -
  • flatfield [fn] put sets flatfield file to fn (relative to ffdir). returns the flatfield file name relative to ffdir (string). If
  • -
-
    -
  • ffdir [d] Sets/gets the directory in which the flat field file is located.
  • -
-
    -
  • ratecorr [ns] Returns the dead time used for rate correections in ns (int). put sets the deadtime correction constant in ns, -1 will set it to default tau of settings (0 unset).
  • -
-
    -
  • badchannels [fn] put sets the badchannels file to fn . returns the bad channels file name. If
  • -
-
    -
  • angconv [fn] put sets the angular conversion file to fn . returns the angular conversion file name. If
  • -
-
    -
  • globaloff [f] Sets/gets the beamline angular global offset (float).
  • -
-
    -
  • fineoff [f] Sets/gets the angular fine offset of the measurement (float).
  • -
-
    -
  • binsize [f] Sets/gets the bin size used for the angular conversion (float).
  • -
-
    -
  • angdir [i] Sets/gets the angular direction. 1 means increasing channels number as increasing angle, -1 increasing channel number decreasing angle.
  • -
-
    -
  • moveflag [i] Sets/gets the flag for physically moving the detector during the acquisition of several positions. 1 sets (moves), 0 unsets.
  • -
-
    -
  • samplex [f] Sets/gets the sample displacement in th direction parallel to the beam in um. Unused!
  • -
-
    -
  • sampley [f] Sets/gets the sample displacement in th direction orthogonal to the beam in um. Unused!
  • -
-
    -
  • threaded [i] Sets/gets the data processing threaded flag. 1 is threaded, 0 unthreaded.
  • -
-
    -
  • darkimage fn Loads the dark image to the detector from file fn (pedestal image). Cannot get.
  • -
-
    -
  • gainimage fn Loads the gain image to the detector from file fn (gain map for translation into number of photons of an analog detector). Cannot get.
  • -
-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/doxygen.css b/slsDetectorSoftware/slsDetectorClientDocs/html/doxygen.css deleted file mode 100644 index 9ca3cafbc..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/doxygen.css +++ /dev/null @@ -1,498 +0,0 @@ -/* The standard CSS for doxygen */ - -body, table, div, p, dl { - font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; - font-size: 12px; -} - -/* @group Heading Levels */ - -h1 { - text-align: center; - font-size: 150%; -} - -h2 { - font-size: 120%; -} - -h3 { - font-size: 100%; -} - -dt { - font-weight: bold; -} - -div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; -} - -p.startli, p.startdd { - margin-top: 2px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - padding: 2px; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a { - color: #153788; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #1b77c5; -} - -a:hover { - text-decoration: underline; -} - -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #6666cc; - color: #ffffff; - border: 1px double #9295C2; -} - -.contents a.qindexHL:visited { - color: #ffffff; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code { -} - -a.codeRef { -} - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -.fragment { - font-family: monospace, fixed; - font-size: 105%; -} - -pre.fragment { - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - padding: 4px 6px; - margin: 4px 8px 4px 2px; -} - -div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - background: white; - color: black; - margin-right: 20px; - margin-left: 20px; -} - -td.indexkey { - background-color: #e8eef2; - font-weight: bold; - border: 1px solid #CCCCCC; - margin: 2px 0px 2px 0; - padding: 2px 10px; -} - -td.indexvalue { - background-color: #e8eef2; - border: 1px solid #CCCCCC; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #f0f0f0; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -img.footer { - border: 0px; - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -span.vhdldigit { - color: #ff00ff -} - -span.vhdlchar { - color: #000000 -} - -span.vhdlkeyword { - color: #700070 -} - -span.vhdllogic { - color: #ff0000 -} - -/* @end */ - -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #84b0c7; -} - -th.dirtab { - background: #e8eef2; - font-weight: bold; -} - -hr { - height: 0; - border: none; - border-top: 1px solid #666; -} - -/* @group Member Descriptions */ - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #FAFAFA; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #ccc; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memTemplParams { - color: #606060; - white-space: nowrap; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtemplate { - font-size: 80%; - color: #606060; - font-weight: normal; - margin-left: 3px; -} - -.memnav { - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.memitem { - padding: 0; - margin-bottom: 10px; -} - -.memname { - white-space: nowrap; - font-weight: bold; -} - -.memproto, .memdoc { - border: 1px solid #84b0c7; -} - -.memproto { - padding: 0; - background-color: #d5e1e8; - font-weight: bold; - -webkit-border-top-left-radius: 8px; - -webkit-border-top-right-radius: 8px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -moz-border-radius-topleft: 8px; - -moz-border-radius-topright: 8px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -} - -.memdoc { - padding: 2px 5px; - background-color: #eef3f5; - border-top-width: 0; - -webkit-border-bottom-left-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -moz-border-radius-bottomleft: 8px; - -moz-border-radius-bottomright: 8px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #602020; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} - -/* @end */ - -/* @group Directory (tree) */ - -/* for the tree view */ - -.ftvtree { - font-family: sans-serif; - margin: 0.5em; -} - -/* these are for tree view when used as main index */ - -.directory { - font-size: 9pt; - font-weight: bold; -} - -.directory h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -/* -The following two styles can be used to replace the root node title -with an image of your choice. Simply uncomment the next two styles, -specify the name of your image and be sure to set 'height' to the -proper pixel height of your image. -*/ - -/* -.directory h3.swap { - height: 61px; - background-repeat: no-repeat; - background-image: url("yourimage.gif"); -} -.directory h3.swap span { - display: none; -} -*/ - -.directory > h3 { - margin-top: 0; -} - -.directory p { - margin: 0px; - white-space: nowrap; -} - -.directory div { - display: none; - margin: 0px; -} - -.directory img { - vertical-align: -30%; -} - -/* these are for tree view when not used as main index */ - -.directory-alt { - font-size: 100%; - font-weight: bold; -} - -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; -} - -.directory-alt > h3 { - margin-top: 0; -} - -.directory-alt p { - margin: 0px; - white-space: nowrap; -} - -.directory-alt div { - display: none; - margin: 0px; -} - -.directory-alt img { - vertical-align: -30%; -} - -/* @end */ - -address { - font-style: normal; - color: #333; -} diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/doxygen.png b/slsDetectorSoftware/slsDetectorClientDocs/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281 zcmaJ>ZA?>F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tPF5Qt@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`J`5fAJ*eJbB;uNuKA& zdERDo*{Y<(If(#(B$Lr#;nB(8Y#ia=ZCeW?JfPLuQY`=@cW$k}Rivq|vbxGrRq1Tl9;+(gNt?}UtVKM2`T5t1jLzuL@0UIs`S#vlhl4)^ zLgSYrPj@$+`|j?eSbXTmiHGkWxV8V}BzNR?pl9k_s4pDu9vd5a_UzZEPk)}Ad{AV_ zzddrjrh4=Imr`E06;LY{)YYt?o}L~H@7C}F^WB!Ra=v`Q0bj{>5&$66CWF>mf6vjP z2N>RRY6ZYa=K`76>+|_)Xdwko+7wv}7cN|btOhWb(*{sta~6b?S8Omrxw}!4`NhGr zZVpNqpu1@BE`QGWNTpEpcJVW5izu~2B^GlM?1(OPg)zwW;QcP@Ltcclm>XbJL9C|j z=9!2?ua=uIlf0%AndzHsRC}IyTL$EhAee(fdKB`?27KeS^2M8M_7b~PiCFO&r5LC7 z7gl1*a<8;SjNaw#h=843_AV9iZbWQOAp5YOC^&_F*9K0> zB|6%IDb?aM#3viTxkLU4aXg&@+CkNTOnQ1iMP*^?b|^lJy$4C)Zk4isV!|RZ*XhXh zw8q3$=*0LeGC!XI_Wc?dkT~3+*Gu%%yIqP+Wr3H$=&ROMQU6q}Ag^P~>c5vAEO;a- z_dK-3PPeKar%)6$j~vI2#*-YH!1h6HYVtwCX5_wM`iF#UKz&&@9Oo5w3%XGYrX zW>dY~)SG-((Yim%`InwgTvyRC?e=Wh^8KCao!R6Eg&TpVWUY1sN~4G}V?nFnEGo-; zHZ_$eW9-GnC%^WS9b z@p;-$oH#MtC0v>Q$HX%4^JdFdO$0cbv-W)Q TtK}Eh@>>I#ipmV1>S*>q-hkC} diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/index.html b/slsDetectorSoftware/slsDetectorClientDocs/html/index.html deleted file mode 100644 index 121676d5d..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/index.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - -Introduction - - - - - - - - - -
-

Introduction

This program is intended to control the SLS detectors via command line interface. This is the only way to access all possible functionality of the detectors, however it is often recommendable to avoid changing the most advanced settings, rather leaving the task to configuration files, as when using the GUI or the API provided.

-

The command line interface consists in four main functions:

-
    -
  • sls_detector_acquire to acquire data from the detector
  • -
  • sls_detector_put to set detector parameters
  • -
  • sls_detector_get to retrieve detector parameters
  • -
  • sls_detector_help to get help concerning the text commands Additionally the program slsReceiver should be started on the machine expected to receive the data from the detector.
  • -
-

If you need control a single detector, the use of the command line interface does not need any additional arguments.

-

For commands addressing a single controller of your detector, the command cmd should be called with the index i of the controller:

-

sls_detector_clnt i:cmd

-

where sls_detector_clnt is the text client (put, get, acquire, help).

-

In case more than one detector is configured on the control PC, the command cmd should be called with their respective index j:

-

sls_detector_clnt j-cmd

-

where sls_detector_clnt is the text client (put, get, acquire, help).

-

To address a specific controller i of detector j use:

-

sls_detector_clnt j-i:cmd

-

For additional questions concerning the indexing of the detector, please refer to the SLS Detectors FAQ documentation.

-

The commands are sudivided into different pages depending on their functionalities:

-
    -
  • Acquition commands Acquisition: commands to start/stop the acquisition and retrieve data
  • -
  • Configuration commands Configuration: commands to configure the detector
  • -
  • Data postprocessing: commands to process the data - mainly for MYTHEN except for rate corrections.
  • -
  • Settings: commands to define detector settings/threshold.
  • -
  • Output: commands to define output file destination and format
  • -
  • Actions: commands to define scripts to be executed during the acquisition flow
  • -
  • Network: commands to setup the network between client, detector and receiver
  • -
  • Receiver: commands to configure the receiver
  • -
  • Developer Developer: commands to be used only for software debugging. Avoid using them!
  • -
-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/installdox b/slsDetectorSoftware/slsDetectorClientDocs/html/installdox deleted file mode 100755 index 9b89fe025..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/installdox +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/perl - -%subst = ( ); -$quiet = 0; - -if (open(F,"search.cfg")) -{ - $_= ; s/[ \t\n]*$//g ; $subst{"_doc"} = $_; - $_= ; s/[ \t\n]*$//g ; $subst{"_cgi"} = $_; -} - -while ( @ARGV ) { - $_ = shift @ARGV; - if ( s/^-// ) { - if ( /^l(.*)/ ) { - $v = ($1 eq "") ? shift @ARGV : $1; - ($v =~ /\/$/) || ($v .= "/"); - $_ = $v; - if ( /(.+)\@(.+)/ ) { - if ( exists $subst{$1} ) { - $subst{$1} = $2; - } else { - print STDERR "Unknown tag file $1 given with option -l\n"; - &usage(); - } - } else { - print STDERR "Argument $_ is invalid for option -l\n"; - &usage(); - } - } - elsif ( /^q/ ) { - $quiet = 1; - } - elsif ( /^\?|^h/ ) { - &usage(); - } - else { - print STDERR "Illegal option -$_\n"; - &usage(); - } - } - else { - push (@files, $_ ); - } -} - -foreach $sub (keys %subst) -{ - if ( $subst{$sub} eq "" ) - { - print STDERR "No substitute given for tag file `$sub'\n"; - &usage(); - } - elsif ( ! $quiet && $sub ne "_doc" && $sub ne "_cgi" ) - { - print "Substituting $subst{$sub} for each occurence of tag file $sub\n"; - } -} - -if ( ! @files ) { - if (opendir(D,".")) { - foreach $file ( readdir(D) ) { - $match = ".html"; - next if ( $file =~ /^\.\.?$/ ); - ($file =~ /$match/) && (push @files, $file); - ($file =~ "tree.js") && (push @files, $file); - } - closedir(D); - } -} - -if ( ! @files ) { - print STDERR "Warning: No input files given and none found!\n"; -} - -foreach $f (@files) -{ - if ( ! $quiet ) { - print "Editing: $f...\n"; - } - $oldf = $f; - $f .= ".bak"; - unless (rename $oldf,$f) { - print STDERR "Error: cannot rename file $oldf\n"; - exit 1; - } - if (open(F,"<$f")) { - unless (open(G,">$oldf")) { - print STDERR "Error: opening file $oldf for writing\n"; - exit 1; - } - if ($oldf ne "tree.js") { - while () { - s/doxygen\=\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\" (href|src)=\"\2/doxygen\=\"$1:$subst{$1}\" \3=\"$subst{$1}/g; - print G "$_"; - } - } - else { - while () { - s/\"([^ \"\:\t\>\<]*)\:([^ \"\t\>\<]*)\", \"\2/\"$1:$subst{$1}\" ,\"$subst{$1}/g; - print G "$_"; - } - } - } - else { - print STDERR "Warning file $f does not exist\n"; - } - unlink $f; -} - -sub usage { - print STDERR "Usage: installdox [options] [html-file [html-file ...]]\n"; - print STDERR "Options:\n"; - print STDERR " -l tagfile\@linkName tag file + URL or directory \n"; - print STDERR " -q Quiet mode\n\n"; - exit 1; -} diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/network.html b/slsDetectorSoftware/slsDetectorClientDocs/html/network.html deleted file mode 100644 index d562e9976..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/network.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - -Network - - - - - - - - - -
- - -

Network

Commands to setup the network between client, detector and receiver

-
    -
  • rx_hostname [s] sets/gets the receiver hostname or IP address, configures detector mac with all network parameters and updates receiver with acquisition parameters. Normally used for single detectors (Can be multi-detector). none disables. If used, use as last network command in configuring detector MAC.
  • -
-
    -
  • rx_udpip [ip] sets/gets the ip address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). Used if different from eth0.
  • -
-
    -
  • rx_udpmac [mac] sets/gets the mac address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector).
  • -
-
    -
  • rx_udpport [port] sets/gets the port of the receiver UDP interface where the data from the detector will be streamed to. Use single-detector command.
  • -
-
    -
  • rx_udpport2 [port] sets/gets the second port of the receiver UDP interface where the data from the second half of the detector will be streamed to. Use single-detector command. Used for EIGER only.
  • -
-
    -
  • detectormac [mac] sets/gets the mac address of the detector UDP interface from where the detector will stream data. Use single-detector command. Normally unused.
  • -
-
    -
  • detectorip [ip] sets/gets the ip address of the detector UDP interface from where the detector will stream data. Use single-detector command. Keep in same subnet as rx_udpip (if rx_udpip specified).
  • -
-
    -
  • txndelay_left [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's left UDP port. Use single-detector command. Used for EIGER only.
  • -
-
    -
  • txndelay_right [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's right UDP port. Use single-detector command. Used for EIGER only.
  • -
-
    -
  • txndelay_frame [delay] sets/gets the transmission frame period of entire frame being streamed out from the detector for both ports. Use single-detector command. Used for EIGER only.
  • -
-
    -
  • flowcontrol_10g [delay] Enables/disables 10 GbE flow control. 1 enables, 0 disables. Used for EIGER only.
  • -
-
    -
  • zmqport [port] sets/gets the 0MQ (TCP) port of the receiver from where data is streamed to the client. Use single-detector command to set individually or multi-detector command to calculate based on port for the rest.
  • -
-
    -
  • configuremac [i] configures the MAC of the detector with these parameters: detectorip, detectormac, rx_udpip, rx_udpmac, rx_udpport, rx_udpport2 (if applicable). Only put!
  • -
-
    -
  • rx_tcpport [port] sets/gets the port of the client-receiver TCP interface. Use single-detector command. Is different for each detector if same rx_hostname used. Must be first command to communicate with receiver.
  • -
-
    -
  • port [port] sets/gets the port of the client-detector control server TCP interface. Use single-detector command. Default value is 1952 for all detectors. Normally not changed.
  • -
-
    -
  • stopport [port] sets/gets the port of the client-detector stop server TCP interface. Use single-detector command. Default value is 1953 for all detectors. Normally not changed.
  • -
-
    -
  • lastclient Gets the last client communicating with the detector. Cannot put!
  • -
-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/output.html b/slsDetectorSoftware/slsDetectorClientDocs/html/output.html deleted file mode 100644 index ca4889fa8..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/output.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - -Output settings - - - - - - - - - -
- - -

Output settings

Commands to setup the file destination and format

-
    -
  • outdir [dir] Sets/gets the file output directory (string)
  • -
-
    -
  • fname [fn] Sets/gets the root of the output file name (string)
  • -
-
    -
  • index [i] Sets/gets the current file index (int)
  • -
-
    -
  • enablefwrite [i] Enables/disables file writing. 1 enables, 0 disables.
  • -
-
    -
  • overwrite [i] enables(1) /disables(0) file overwriting
  • -
-
    -
  • currentfname gets the filename for the data without index and extension
  • -
-
    -
  • fileformat gets the file format for data (no put?) What are the possible return values?
  • -
-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/pages.html b/slsDetectorSoftware/slsDetectorClientDocs/html/pages.html deleted file mode 100644 index 85eec37c6..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/pages.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - -Page Index - - - - - - - - - -
-

Related Pages

Here is a list of all related documentation pages: -
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/receiver.html b/slsDetectorSoftware/slsDetectorClientDocs/html/receiver.html deleted file mode 100644 index e250a4b24..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/receiver.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - -Receiver commands - - - - - - - - - -
- - -

Receiver commands

Commands to configure the receiver

-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/search/close.png b/slsDetectorSoftware/slsDetectorClientDocs/html/search/close.png deleted file mode 100644 index 9342d3dfeea7b7c4ee610987e717804b5a42ceb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/search/nomatches.html b/slsDetectorSoftware/slsDetectorClientDocs/html/search/nomatches.html deleted file mode 100644 index b1ded27e9..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/search/nomatches.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - -
-
No Matches
-
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/search/search.css b/slsDetectorSoftware/slsDetectorClientDocs/html/search/search.css deleted file mode 100644 index d263b9724..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/search/search.css +++ /dev/null @@ -1,198 +0,0 @@ -/*---------------- Search Box */ - -#MSearchBox { - padding: 0px; - margin: 0px; - border: none; - border: 1px solid #84B0C7; - white-space: nowrap; - -moz-border-radius: 8px; - -webkit-border-top-left-radius: 8px; - -webkit-border-top-right-radius: 8px; - -webkit-border-bottom-left-radius: 8px; - -webkit-border-bottom-right-radius: 8px; -} -#MSearchField { - font: 9pt Arial, Verdana, sans-serif; - color: #999999; - background-color: #FFFFFF; - font-style: normal; - cursor: text; - padding: 1px 1px; - margin: 0px 6px 0px 0px; - border: none; - outline: none; - vertical-align: middle; -} -.MSearchBoxActive #MSearchField { - color: #000000; -} -#MSearchSelect { - float : none; - display : inline; - background : none; - font: 9pt Verdana, sans-serif; - border: none; - margin: 0px 0px 0px 6px; - vertical-align: middle; - padding: 0px 0px; -} - -#MSearchClose { - float : none; - display : none; - background : none; - border: none; - margin: 0px 4px 0px 0px; - padding: 0px 0px; - outline: none; -} - -#MSearchCloseImg { - vertical-align: middle; -} - -.MSearchBoxLeft { - display: block; - text-align: left; - float: left; - margin-left: 6px; -} -.MSearchBoxRight { - display: block; - float: right; - text-align: right; - margin-right: 6px; -} -.MSearchBoxSpacer { - font-size: 0px; - clear: both; -} -.MSearchBoxRow { - font-size: 0px; - clear: both; -} - -/*---------------- Search filter selection */ - -#MSearchSelectWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #A0A0A0; - background-color: #FAFAFA; - z-index: 1; - padding-top: 4px; - padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - } -.SelectItem { - font: 8pt Arial, Verdana, sans-serif; - padding-left: 2px; - padding-right: 12px; - border: 0px; -} -span.SelectionMark { - margin-right: 4px; - font-family: monospace; - outline-style: none; - text-decoration: none; -} -a.SelectItem { - display: block; - outline-style: none; - color: #000000; - text-decoration: none; - padding-left: 6px; - padding-right: 12px; -} -a.SelectItem:focus, -a.SelectItem:active { - color: #000000; - outline-style: none; - text-decoration: none; -} -a.SelectItem:hover { - color: #FFFFFF; - background-color: #2A50E4; - outline-style: none; - text-decoration: none; - cursor: pointer; - display: block; -} - -/*---------------- Search results window */ - -iframe#MSearchResults { - width: 60ex; - height: 15em; - } -#MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #000000; - background-color: #EEF3F5; - } - -/* ----------------------------------- */ - - -#SRIndex { - clear:both; - padding-bottom: 15px; -} - -.SREntry { - font-size: 10pt; - padding-left: 1ex; -} -.SRPage .SREntry { - font-size: 8pt; - padding: 1px 5px; -} -body.SRPage { - margin: 5px 2px; -} - -.SRChildren { - padding-left: 3ex; padding-bottom: .5em -} -.SRPage .SRChildren { - display: none; -} -.SRSymbol { - font-weight: bold; color: #153788; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRScope { - display: block; - color: #153788; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRSymbol:focus, a.SRSymbol:active, -a.SRScope:focus, a.SRScope:active { - text-decoration: underline; -} - -.SRPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; -} - -.SRResult { - display: none; -} - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/search/search.js b/slsDetectorSoftware/slsDetectorClientDocs/html/search/search.js deleted file mode 100644 index 474cc1a80..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/search/search.js +++ /dev/null @@ -1,724 +0,0 @@ -// Search script generated by doxygen -// Copyright (C) 2009 by Dimitri van Heesch. - -// The code in this file is loosly based on main.js, part of Natural Docs, -// which is Copyright (C) 2003-2008 Greg Valure -// Natural Docs is licensed under the GPL. - -var indexSectionsWithContent = -{ -}; - -var indexSectionNames = -{ -}; - -function convertToId(search) -{ - var result = ''; - for (i=0;i do a search - { - this.Search(); - } - } - - this.OnSearchSelectKey = function(evt) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) // Up - { - this.searchIndex--; - this.OnSelectItem(this.searchIndex); - } - else if (e.keyCode==13 || e.keyCode==27) - { - this.OnSelectItem(this.searchIndex); - this.CloseSelectionWindow(); - this.DOMSearchField().focus(); - } - return false; - } - - // --------- Actions - - // Closes the results window. - this.CloseResultsWindow = function() - { - this.DOMPopupSearchResultsWindow().style.display = 'none'; - this.DOMSearchClose().style.display = 'none'; - this.Activate(false); - } - - this.CloseSelectionWindow = function() - { - this.DOMSearchSelectWindow().style.display = 'none'; - } - - // Performs a search. - this.Search = function() - { - this.keyTimeout = 0; - - // strip leading whitespace - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - - var code = searchValue.toLowerCase().charCodeAt(0); - var hexCode; - if (code<16) - { - hexCode="0"+code.toString(16); - } - else - { - hexCode=code.toString(16); - } - - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; - - if (indexSectionsWithContent[this.searchIndex].charAt(code-32) == '1') - { - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; - } - else // nothing available for this search term - { - resultsPage = this.resultsPath + '/nomatches.html'; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; - } - - window.frames.MSearchResults.location.href = resultsPageWithSearch; - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - - if (domPopupSearchResultsWindow.style.display!='block') - { - var domSearchBox = this.DOMSearchBox(); - this.DOMSearchClose().style.display = 'inline'; - if (this.insideFrame) - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - domPopupSearchResultsWindow.style.position = 'relative'; - domPopupSearchResultsWindow.style.display = 'block'; - var width = document.body.clientWidth - 8; // the -8 is for IE :-( - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResults.style.width = width + 'px'; - } - else - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - var left = getXPos(domSearchBox) + domSearchBox.offsetWidth; - var top = getYPos(domSearchBox) + domSearchBox.offsetHeight + 1; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - } - } - - this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; - } - - // -------- Activation Functions - - // Activates or deactivates the search panel, resetting things to - // their default values if necessary. - this.Activate = function(isActive) - { - if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) - { - this.DOMSearchBox().className = 'MSearchBoxActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == this.searchLabel) // clear "Search" term upon entry - { - searchField.value = ''; - this.searchActive = true; - } - } - else if (!isActive) // directly remove the panel - { - this.DOMSearchBox().className = 'MSearchBoxInactive'; - this.DOMSearchField().value = this.searchLabel; - this.searchActive = false; - this.lastSearchValue = '' - this.lastResultsPage = ''; - } - } -} - -// ----------------------------------------------------------------------- - -// The class that handles everything on the search results page. -function SearchResults(name) -{ - // The number of matches from the last run of . - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) - { - var parentElement = document.getElementById(id); - var element = parentElement.firstChild; - - while (element && element!=parentElement) - { - if (element.nodeName == 'DIV' && element.className == 'SRChildren') - { - return element; - } - - if (element.nodeName == 'DIV' && element.hasChildNodes()) - { - element = element.firstChild; - } - else if (element.nextSibling) - { - element = element.nextSibling; - } - else - { - do - { - element = element.parentNode; - } - while (element && element!=parentElement && !element.nextSibling); - - if (element && element!=parentElement) - { - element = element.nextSibling; - } - } - } - } - - this.Toggle = function(id) - { - var element = this.FindChildElement(id); - if (element) - { - if (element.style.display == 'block') - { - element.style.display = 'none'; - } - else - { - element.style.display = 'block'; - } - } - } - - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) - { - if (!search) // get search word from URL - { - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) - { - row.style.display = 'block'; - matches++; - } - else - { - row.style.display = 'none'; - } - } - i++; - } - document.getElementById("Searching").style.display='none'; - if (matches == 0) // no results - { - document.getElementById("NoMatches").style.display='block'; - } - else // at least one result - { - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; - } - - // return the first item with index index or higher that is visible - this.NavNext = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index++; - } - return focusItem; - } - - this.NavPrev = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index--; - } - return focusItem; - } - - this.ProcessKeys = function(e) - { - if (e.type == "keydown") - { - this.repeatOn = false; - this.lastKey = e.keyCode; - } - else if (e.type == "keypress") - { - if (!this.repeatOn) - { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } - } - else if (e.type == "keyup") - { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; - } - - this.Nav = function(evt,itemIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - var newIndex = itemIndex-1; - var focusItem = this.NavPrev(newIndex); - if (focusItem) - { - var child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') // children visible - { - var n=0; - var tmpElem; - while (1) // search for last child - { - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) - { - focusItem = tmpElem; - } - else // found it! - { - break; - } - n++; - } - } - } - if (focusItem) - { - focusItem.focus(); - } - else // return focus to search field - { - parent.document.getElementById("MSearchField").focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = itemIndex+1; - var focusItem; - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') // children visible - { - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); - } - else if (this.lastKey==39) // Right - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } - else if (this.lastKey==37) // Left - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } - - this.NavChild = function(evt,itemIndex,childIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - if (childIndex>0) - { - var newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } - else // already at first child, jump to parent - { - document.getElementById('Item'+itemIndex).focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = childIndex+1; - var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) // last child, jump to parent next parent - { - elem = this.NavNext(itemIndex+1); - } - if (elem) - { - elem.focus(); - } - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } -} diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/search/search.png b/slsDetectorSoftware/slsDetectorClientDocs/html/search/search.png deleted file mode 100644 index 9dd2396db13f27c7b5e1844540d12e0e54977189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 527 zcmV+q0`UEbP)`f0005jNkl4#8 zyRJb|5QfiY3nD}#O1IDv32{lhg2F4H)+uxzLhBJkK|@6+NC=S-QMwdDA(0T5^Rb+r z6PJ@S#oDuG{{Np@Gh4b|uU~h&TrSex#PvU?tS~#BPQTxuPNziNZnxj>4~N5lOGu~F ziF(y)wOlTr&u8jGP^naEwK|bV#N%`jJS4I$EukQckB6(ORuWistd(@>L9MGMR8v)@U^9^?IF7hr?B*-qJ)+ z1|i-_O<8`-j|U?Gf)q9yjf%zMZ<*i*e;r)?T0%FY-erEE4^ zE|)WzOa!sPV4yI$s`L3g9J}3aHk&~s1mENFu%YdCOBdtuI2a5v5ztnv^``M-l6VPq z_WS+ea1aGG8V!n@&8AQ&tk-LY!;#HqS-}tM@x8SzUWE##TnVDJSS;Y9lF4KOfxt6a za0LG;M+*LYKA+8Iu~>{>;0g9<8{AVu2oXOXkIav?zy4Z%002ovPDHLkV1iB-@74eS diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/settings.html b/slsDetectorSoftware/slsDetectorClientDocs/html/settings.html deleted file mode 100644 index c3c418784..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/settings.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - -Detector settings commands - - - - - - - - - -
- - -

Detector settings commands

Commands to setup the settings of the detector

-
    -
  • settingsdir [dir] Sets/gets the directory where the settings files are located (string)
  • -
-
    -
  • trimdir [dir] obsolete settingsdir
  • -
-
    -
  • caldir [dir] Sets/gets the directory where the calibration files are located (string)
  • -
-
    -
  • trimen [n e0 e1...e(n-1)] Sets/gets the number of energies n at which the detector has default trim file and their values in eV (int)
  • -
-
    -
  • settings [s] sets/gets the settings of the detector. Options: standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain, lownoise, dynamichg0, fixgain1, fixgain2, forceswitchg1, forceswitchg2.
    - In Eiger, only sets in client shared memory. Use threshold or thresholdnotb to pass to detector. Gets from detector.
  • -
-
    -
  • threshold [eV] [sett] sets/gets the detector threshold in eV. sett is optional and if provided also sets the settings. Use this for Eiger instead of settings.
  • -
-
    -
  • thresholdnotb [eV] [sett] sets/gets the detector threshold in eV without loading trimbits. sett is optional and if provided also sets the settings. Use this for Eiger instead of settings.
  • -
-
    -
  • trimbits [fname] loads/stores the trimbits to/from the detector. If no extension is specified, the serial number of each module will be attached.
  • -
-
    -
  • trim:[mode] [fname] trims the detector according to mode and saves resulting trimbits to file. Mode: noise, beam, improve, fix. Used in MYTHEN only. Only put!
  • -
-
    -
  • trimval [i] sets all trimbits to i. Used in EIGER only.
  • -
-
    -
  • pedestal [i] starts acquisition for i frames, calculates pedestal and writes back to fpga. Used in GOTTHARD only. Only put!
  • -
-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/tab_b.gif b/slsDetectorSoftware/slsDetectorClientDocs/html/tab_b.gif deleted file mode 100644 index 0d623483ffdf5f9f96900108042a7ab0643fe2a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35 ncmZ?wbhEHbWMp7uXkcJy*>IeJfk6j|fqX^=1|}vKMh0sDa2W*H diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/tab_l.gif b/slsDetectorSoftware/slsDetectorClientDocs/html/tab_l.gif deleted file mode 100644 index 9b1e6337c9299a700401a2a78a2c6ffced475216..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmZ?wbhEHbZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET99@1@a36+kb~?0UJ*yc&I3X_m z!ND^5$O7$#8OFRuDhG}!?8z?cdZK&!`PWjdR;Aj^wZ` zeK{IEYHBJ)6K8VIp1`BVt++swf6j+=L{p1*nO(VhE`pFexG@5$|>uaCcd z`0m=9m+yak{QmXN#Sc$^{$X9h9&q2jiKAI|&T)a;PPx2K9p`YIdw8HtR5k2Q$2-O2 z*;3y{MQ-RnJTgJfI&R5|O)AHxDf_00XbPvDZPy4t=hHd)nfLPvms&O`Ok(sD()5v$ z5U@&h;a=#xbxVbo2~X&Xj0Ie(f{v>vERH+qC+nTG=B8Nca=wU-O$?1&vUgV~9=!H; zx>3p9Yn%*<>t~sk+&0xfyS8RsPfYBd<~wWK%j-LmpU>O7yX^h#UCp1x-p#i7@bE;py8XI6 zmY<)m>~)W~yIWcMVoiPg{duuf<*)9qZ9l$m*Ph&W&$jlv*Vpa+{pH@n=IQ$L?0$ax ec60Ul|8o2P|NVbd{6P)#weSbE3}s?04AuZvx_~SI diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/tab_r.gif b/slsDetectorSoftware/slsDetectorClientDocs/html/tab_r.gif deleted file mode 100644 index ce9dd9f533cb5486d6941844f442b59d4a9e9175..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2585 zcmbV}`9Bkk1ILFF--w5zJc=ZZT(zjE=;2|_S)Qm~rCWz1Pc)KPl;jv%A#&v2*x}yc zmf2~Jm~&=xjJY?PqwIN}f8qQ2{r$uH{c*nJbmr{cR5??*egHrs-B=MzCF`3%e{FAW z{oL5xTHn~5TM{jaB;@|_Ue5F&Zb@p(kMyG{*;gWDg zyeL|eZf7Qd8=#bXzSiR{yzRgLSj-fJS8>lBjVHN z^o-0eS=nE6a`W;LChBs=`+QAJP~{b93>H^eRb5kCSC1zUNezun%`L5M?RDzv#%jk7 zYVRX=vATPD`+oEfum^{RM@GjuP?-r=yh0!p;Vx^T9G7~`7%5ydH%70=jyJ;;`d;hv92x3R=z{xp+Lg2!*@OK*K15-t&okoPtSED)h&$RLxdbA zseWm^C3d%-yRNi-ryk^!ek+C`n&~cd$#ZWct_cUL{l~i+Nzx^5d!n94(>bW-iL~Rl z&8r)?q|1DIo=0=judQ{FaGcfLERz8gfn3-Qt<2lksh{mzpT}DXxUuR^z=^key&q4! z+wWI45vL0k$R^(F#{qfqhUsN@WA+w-V?LPH33!Q?WFSB3)WBojE@hK41Nb?KfS+Qo zXgrzfsP$wr4Qzy*{OD>uJBjdgGM@VMml5)2f~_}lD*YyOb}Hjeobhz#4c`w(l^>KK zr?Ud;W~Z}*w;%hZ|2^p^+f06gJDJQD zeIhGADbDmm&6arh(q>EZ<7mjzg7l|z$hRL8=1>)Nv=S7CY$B}iYJ&*T_-T_OG*L1q ztZ3Lana33?y3AKnyq^YCF|4x%Rb5WU&2qcl{TFKey%QJeMxn^SdT!hZ5+0i1zeusiYVp-phBl7b5+Px-X&LhByq z0F&<;K0l2+v>qiHlXb#$jXMv$uK-dEGE9L~qtdU(XeRXmvu*K2Q&6!fD**JxYP4b4BR7FdJ$Qx9G9`J%-_X!a#LGpp3g9)VWytGCa;7`S1_e8F~!R+aSJ zOF17p2`H?2kPs8Q`_;U}+D%3p zs2-0BTqFwpUoBk`?P;iPQ(IbEA|JmMx!P&YYG|R@S=5Mnw;-?A6rEEVyV%d7{iU4a zNk`i!%F(Ykpm`}#oH;BjY->@b8vQedv;pza2FL&*6ufjd+*3Ute&>kes~TU?^KkojsTh(o~(3tk1Y6>4(yn( z#U*ID9@eg-beKo1B;HXe+}{Z%n@7m0+yxivuqk9~;!1LGQlah)xYK4>wgL}l6dsaN zIxlRlq`*`j9PG4*0hD6YV_b_2w5b#)o7J?`q#{GjvvKlD`T*dWcZx<-s(ZvLB44E# z=!|sw!?)@%y$oRNL#25WS3lzdii}TuQ3?CLnvQ1_n};2sT_;Y;#d3=+-(O% zMN$>O!3;ke(UuLR%h_&)N zs^!-@A>QR}4yB1bPp`9S19ikTbZ~O{&FF-yHK{En;mmShDUIEw03`j(DBIsM}Rjki2J#SQa3gFZTKBPDeIiLt9Z z%bL3(B@Qw%(B`wSMS~dPh$=R`(}lBoFXKy(s|*{#ru$wjsBc_O#zxNk9w+UUHmx(U zmJ8+M+ndtnZ<7|VU9Mbt61zpo9T&3%Wx&XII=#QJxjR`CZf22ac3d51Z?GD%LEe_&*t46Qf;4`bZ7p2K(Ab5>GfT^}4! zBT&HZD`^PEgWoI&{~o-ID0F?O`75sm(87x%A{(}Ch1)QlzdJ)1B-eqe5a(weg0`4lQIf1evjvbBY50DVbzO7CLf|vP z2#0(U-|jZ`H{y5N^o7%iK6H>_HEGN->U6^!)1{XpJV!!4(Ig7wzZQ*9WYF4X1rG0x z=1uA@i`rIAciubDC{;~b(|&|A@xkjRP5aRcvRU9tvIm}jDB6J eQ0-6-y)mpwdT=ayS0tBxKDA*~;EWmo diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/tabs.css b/slsDetectorSoftware/slsDetectorClientDocs/html/tabs.css deleted file mode 100644 index a44416341..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/tabs.css +++ /dev/null @@ -1,105 +0,0 @@ -/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ - -DIV.tabs -{ - float : left; - width : 100%; - background : url("tab_b.gif") repeat-x bottom; - margin-bottom : 4px; -} - -DIV.tabs UL -{ - margin : 0px; - padding-left : 10px; - list-style : none; -} - -DIV.tabs LI, DIV.tabs FORM -{ - display : inline; - margin : 0px; - padding : 0px; -} - -DIV.tabs FORM -{ - float : right; -} - -DIV.tabs A -{ - float : left; - background : url("tab_r.gif") no-repeat right top; - border-bottom : 1px solid #84B0C7; - font-size : 80%; - font-weight : bold; - text-decoration : none; -} - -DIV.tabs A:hover -{ - background-position: 100% -150px; -} - -DIV.tabs A:link, DIV.tabs A:visited, -DIV.tabs A:active, DIV.tabs A:hover -{ - color: #1A419D; -} - -DIV.tabs SPAN -{ - float : left; - display : block; - background : url("tab_l.gif") no-repeat left top; - padding : 5px 9px; - white-space : nowrap; -} - -DIV.tabs #MSearchBox -{ - float : right; - display : inline; - font-size : 1em; -} - -DIV.tabs TD -{ - font-size : 80%; - font-weight : bold; - text-decoration : none; -} - - - -/* Commented Backslash Hack hides rule from IE5-Mac \*/ -DIV.tabs SPAN {float : none;} -/* End IE5-Mac hack */ - -DIV.tabs A:hover SPAN -{ - background-position: 0% -150px; -} - -DIV.tabs LI.current A -{ - background-position: 100% -150px; - border-width : 0px; -} - -DIV.tabs LI.current SPAN -{ - background-position: 0% -150px; - padding-bottom : 6px; -} - -DIV.navpath -{ - background : none; - border : none; - border-bottom : 1px solid #84B0C7; - text-align : center; - margin : 2px; - padding : 2px; -} diff --git a/slsDetectorSoftware/slsDetectorClientDocs/html/test.html b/slsDetectorSoftware/slsDetectorClientDocs/html/test.html deleted file mode 100644 index 488afcf72..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/html/test.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - -Developer - - - - - - - - - -
- - -

Developer

Commands to be used only for software debugging. Avoid using them!

-
    -
  • test returns an error
  • -
-
    -
  • help Returns a list of possible commands.
  • -
-
    -
  • exitserver Shuts down all the detector servers. Don't use it!!!!
  • -
-
    -
  • exitreceiver Shuts down all the receivers. Don't use it!!!!
  • -
-
    -
  • flippeddatay [i] enables/disables data being flipped across y axis. 1 enables, 0 disables. Not implemented.
  • -
-
    -
  • digitest [i] will perform test which will plot the unique channel identifier, instead of data. Only get!
  • -
-
    -
  • bustest performs test of the bus interface between FPGA and embedded Linux system. Can last up to a few minutes. Cannot set! Used for Mythen only. Only get!
  • -
-
    -
  • digibittest:[i] performs digital test of the module i. Returns 0 if succeeded, otherwise error mask. Only put!
  • -
-
    -
  • reg [addr] [val] ??? writes to an register addr with value in hexadecimal format.
  • -
-
    -
  • adcreg [addr] [val] ??? writes to an adc register addr with value in hexadecimal format. Only put!
  • -
-
    -
  • setbit ??? Only put!
  • -
-
    -
  • clearbit ??? Only put!
  • -
-
    -
  • getbit ??? Only get!
  • -
-
- -
-
- - -
- -
- -
Generated on 15 Aug 2017 by  - -doxygen 1.6.1
- - diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/Makefile b/slsDetectorSoftware/slsDetectorClientDocs/latex/Makefile deleted file mode 100644 index 8b7c89a1b..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -all: clean refman.pdf - -pdf: refman.pdf - -refman.pdf: refman.tex - pdflatex refman.tex - makeindex refman.idx - pdflatex refman.tex - latex_count=5 ; \ - while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ - do \ - echo "Rerunning latex...." ;\ - pdflatex refman.tex ;\ - latex_count=`expr $$latex_count - 1` ;\ - done - - -clean: - rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/acquisition.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/acquisition.tex deleted file mode 100644 index 29603ddd1..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/acquisition.tex +++ /dev/null @@ -1,41 +0,0 @@ -Commands to control the acquisition - - -\begin{DoxyItemize} -\item {\bfseries acquire} blocking acquisition (like calling sls\_\-detector\_\-acquire). Starts receiver and detector, writes and processes the data, stops detector. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries data} gets all data from the detector (if any) processes them and writes them to file according to the preferences already setup (MYTHEN only). Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries frame} gets a single frame from the detector (if any) processes it and writes it to file according to the preferences already setup (MYTHEN only). Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries status} {\ttfamily returns} the detector status (string)-\/ can be: {\ttfamily running}, {\ttfamily error}, {\ttfamily transmitting}, {\ttfamily finished}, {\ttfamily waiting} or {\ttfamily idle}; {\ttfamily put} can be {\ttfamily start} or {\ttfamily stop} -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries busy} returns {\ttfamily 1} if the acquisition is active, {\ttfamily 0} otherwise. Works when the acquisition is started in non-\/blocking mode. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries readctr } Reads the counters from the detector memory (analog detector returning values translated into number of photons -\/ only GOTTHARD). Cannot put. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries resetctr i } Resets counter in detector, restarts acquisition if i=1(analog detector returning values translated into number of photons -\/ only GOTTHARD). Cannot put. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries resmat i } sets/resets counter bit in detector.gets the counter bit in detector ???? -\end{DoxyItemize} \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/actions.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/actions.tex deleted file mode 100644 index c21066a0d..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/actions.tex +++ /dev/null @@ -1,126 +0,0 @@ -Commands to define scripts to be executed during the acquisition flow - - -\begin{DoxyItemize} -\item {\bfseries positions \mbox{[}n \mbox{[}p0..pn-\/1\mbox{]}\mbox{]}} sets/gets number of angular position and positions to be acquired. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries startscript \mbox{[}s\mbox{]}} sets/gets the script to be executed at the beginning of the acquisition. {\ttfamily none} unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries startscriptpar \mbox{[}s\mbox{]}} sets/gets a string to be passed as a parameter to the startscript -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries stopscript \mbox{[}s\mbox{]}} sets/gets the script to be executed at the end of the acquisition. {\ttfamily none} unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries stopscriptpar \mbox{[}s\mbox{]}} sets/gets a string to be passed as a parameter to the stopscript -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scriptbefore \mbox{[}s\mbox{]}} sets/gets the script to be executed before starting the detector every time in the acquisition. {\ttfamily none} unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scriptbeforepar \mbox{[}s\mbox{]}} sets/gets a string to be passed as a parameter to the scriptbefore -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scriptafter \mbox{[}s\mbox{]}} sets/gets the script to be executed after the detector has finished every time in the acquisition. {\ttfamily none} unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scriptafterpar \mbox{[}s\mbox{]}} sets/gets a string to be passed as a parameter to the scriptafter -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries headerafter \mbox{[}s\mbox{]}} sets/gets the script to be executed for logging the detector parameters. {\ttfamily none} unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries headerbefore \mbox{[}s\mbox{]}} sets/gets the script to be executed for logging the detector parameters. {\ttfamily none} unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries headerbeforepar \mbox{[}s\mbox{]}} sets/gets a string to be passed as a parameter to the headerbefore script -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries headerafterpar \mbox{[}s\mbox{]}} sets/gets a string to be passed as a parameter to the headerafter script -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries enacallog \mbox{[}i\mbox{]}} enables/disables logging of the parameters necessary for the energy calibration. 1 sets, 0 unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries angcallog \mbox{[}i\mbox{]}} enables/disables logging of the parameters necessary for the angular calibration. 1 sets, 0 unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan0script \mbox{[}s\mbox{]}} sets/gets the script to be executed for the scan 0 level. {\ttfamily none} unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan0par \mbox{[}s\mbox{]}} sets/gets a string to be passed as a parameter to the scan0script -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan0prec \mbox{[}i\mbox{]}} sets/gets number of digits to be used for the scan0 variable in the file name. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan0steps \mbox{[}i \mbox{[}s0..sn-\/1\mbox{]}\mbox{]}} sets/gets number of steps (int) of the scan0 level and their values (float). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan0range \mbox{[}smin smax sstep\mbox{]}} sets scan0 min, max and step, returns the number of steps and their values as scan0steps. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan1script \mbox{[}s\mbox{]}} sets/gets the script to be executed for the scan1 level. {\ttfamily none} unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan1par \mbox{[}s\mbox{]}} sets/gets a string to be passed as a parameter to the scan1script -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan1prec \mbox{[}i\mbox{]}} sets/gets number of digits to be used for the scan1 variable in the file name. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan1steps \mbox{[}i \mbox{[}s0..sn-\/1\mbox{]}\mbox{]}} sets/gets number of steps (int) of the scan1 level and their values (float). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries scan1range \mbox{[}smin smax sstep\mbox{]}} sets scan1 min, max and step, returns the number of steps and their values as scan1steps. -\end{DoxyItemize} \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/advanced.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/advanced.tex deleted file mode 100644 index 72d2fa6d2..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/advanced.tex +++ /dev/null @@ -1 +0,0 @@ -This page is for advanced users. Make sure you have first read the introduction. \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/config.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/config.tex deleted file mode 100644 index 4fae3e75f..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/config.tex +++ /dev/null @@ -1,257 +0,0 @@ -Commands to configure the detector. these commands are often left to the configuration file. - - -\begin{DoxyItemize} -\item {\bfseries datastream} enables/disables the 0MQ data stream (0MQ threads created) from receiver to client. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries free} Free shared memory on the control PC -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries add} Adds a detector at the end of the multi-\/detector structure. {\ttfamily put} argument is the hostname or IP adress. Returns the chained list of detector hostnames. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries remove i} Removes controller {\ttfamily i} from the multi-\/detector structure. Can be used for partial readout of the detector. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries type} Sets/gets detector type (string). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries hostname} {\ttfamily put} adds the hostname (ot IP adress) at the end of the multi-\/detector structure. If used for a single controlled (i:) replaces the current hostname. Returns the list of the hostnames of the multi-\/detector structure. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries id\mbox{[}:i\mbox{]}} Returns the id of the detector structure. i is the detector position in a multi detector system. If used a {\ttfamily put}, configures the id of the detector structure. i is the detector position in a multi detector system and l is the id of the detector to be added. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries master i} {\ttfamily put} sets the position of the master of the acquisition (-\/1 if none). Returns the position of the master of the detector structure (-\/1 if none). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries sync} Sets/gets the synchronization mode of the detectors in the multi-\/detector structure. Can be: {\ttfamily none}, {\ttfamily gating}, {\ttfamily trigger}, {\ttfamily complementary}. Mainly used by MYTHEN/GOTTHARD. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries online \mbox{[}i\mbox{]}} sets the detector in online (1) or offline (0) mode -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries checkonline} returns the hostnames of all detectors without connecting to them -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries activate} Activates/Deactivates the detector. Deactivated detector does not send data. Used for EIGER only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries lock \mbox{[}i\mbox{]}} Locks/Unlocks the detector to communicate with this client. 1 locks, 0 unlocks. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries nmod \mbox{[}i\mbox{]}} sets/gets the number of modules of the detector. Used for MYTHEN only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries maxmod } Gets the maximum number of modules of the detector. Used for MYTHEN only. Cannot put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries dr \mbox{[}i\mbox{]}} sets/gets the dynamic range of detector. Mythen \mbox{[}4,8,16,24\mbox{]}. Eiger \mbox{[}4,8,16,32\mbox{]}. Others cannot put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries roi \mbox{[}i\mbox{]} \mbox{[}xmin\mbox{]} \mbox{[}xmax\mbox{]} \mbox{[}ymin\mbox{]} \mbox{[}ymax\mbox{]} } sets region of interest of the detector, where i is number of rois;i=0 to clear rois. Used for GOTTHARD only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries detsizechan \mbox{[}xmax\mbox{]} \mbox{[}ymax\mbox{]}} sets the maximum number of channels in each dimension for complete detector set; -\/1 is no limit. Use for multi-\/detector system as first command in config file. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries roimask \mbox{[}i\mbox{]}} ?? -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries flippeddatax \mbox{[}i\mbox{]}} enables/disables data being flipped across x axis. 1 enables, 0 disables. Used for EIGER only. 1 for bottom half-\/module, 0 for top-\/half module. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries flags \mbox{[}flag\mbox{]}} sets/gets the readout flags to mode. Options: none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog\_\-digital, unknown. Used for MYTHEN and EIGER only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries extsig:\mbox{[}i\mbox{]} \mbox{[}flag\mbox{]}} sets/gets the mode of the external signal i. Options: {\ttfamily off}, {\ttfamily gate\_\-in\_\-active\_\-high}, {\ttfamily gate\_\-in\_\-active\_\-low}, {\ttfamily trigger\_\-in\_\-rising\_\-edge}, {\ttfamily trigger\_\-in\_\-falling\_\-edge}, {\ttfamily ro\_\-trigger\_\-in\_\-rising\_\-edge}, {\ttfamily ro\_\-trigger\_\-in\_\-falling\_\-edge}, {\ttfamily gate\_\-out\_\-active\_\-high}, {\ttfamily gate\_\-out\_\-active\_\-low}, {\ttfamily trigger\_\-out\_\-rising\_\-edge}, {\ttfamily trigger\_\-out\_\-falling\_\-edge}, {\ttfamily ro\_\-trigger\_\-out\_\-rising\_\-edge}, {\ttfamily ro\_\-trigger\_\-out\_\-falling\_\-edge}. \par - Used in MYTHEN, GOTTHARD, PROPIX only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries programfpga \mbox{[}file\mbox{]}} programs the FPGA with file f (with .pof extension). Used for JUNGFRAU, MOENCH only. Only put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries resetfpga \mbox{[}f\mbox{]}} resets FPGA, where f can be any value. Used for JUNGFRAU only. Only put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries powerchip \mbox{[}i\mbox{]}} Powers on/off the chip. 1 powers on, 0 powers off. Can also get the power status. Used for JUNGFRAU only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries led \mbox{[}i\mbox{]}} sets/gets the led status. 1 on, 0 off. Used for MOENCH only ?? -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries moduleversion:\mbox{[}i\mbox{]}} Gets the firmware version of module i. Used for MYTHEN only. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries detectornumber} Gets the serial number or MAC of detector. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries modulenumber:\mbox{[}i\mbox{]}} Gets the serial number of module i. Used for MYTHEN only. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries detectorversion} Gets the firmware version of detector. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries softwareversion} Gets the software version of detector server. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries thisversion} Gets the software version of this client software. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries receiverversion} Gets the software version of receiver. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries timing \mbox{[}mode\mbox{]}} sets/gets synchronization mode of the detector. Mode: auto, trigger, ro\_\-trigger, gating, triggered\_\-gating -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries exptime \mbox{[}i\mbox{]}} sets/gets exposure time in s -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries subexptime \mbox{[}i\mbox{]}} sets/gets sub exposure time in s. Used in EIGER only in 32 bit mode. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries period \mbox{[}i\mbox{]}} sets/gets frame period in s. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries delay \mbox{[}i\mbox{]}} sets/gets delay in s. Used in MYTHEN, GOTTHARD only -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries gates \mbox{[}i\mbox{]}} sets/gets number of gates. Used in MYTHEN, GOTTHARD, EIGER only -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries gates \mbox{[}i\mbox{]}} sets/gets number of frames. If {\ttfamily timing} is not {\ttfamily auto}, then it is the number of frames per cycle/trigger. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries cycles \mbox{[}i\mbox{]}} sets/gets number of triggers. Timing mode should be set appropriately. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries probes \mbox{[}i\mbox{]}} sets/gets number of probes to accumulate. When setting, max 3! cycles should be set to 1, frames to the number of pump-\/probe events. Used in MYTHEN only -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries measurements \mbox{[}i\mbox{]}} sets/gets number of measurements. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries samples \mbox{[}i\mbox{]}} sets/gets number of samples expected from the jctb. Used in CHIP TEST BOARD only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries exptimel \mbox{[}i\mbox{]}} gets exposure time left. Used in MYTHEN, GOTTHARD only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries periodl \mbox{[}i\mbox{]}} gets frame period left. Used in MYTHEN, GOTTHARD only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries delayl \mbox{[}i\mbox{]}} gets delay left. Used in MYTHEN, GOTTHARD only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries gatesl \mbox{[}i\mbox{]}} gets number of gates left. Used in MYTHEN, GOTTHARD only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries framesl \mbox{[}i\mbox{]}} gets number of frames left. Used in MYTHEN, GOTTHARD only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries cyclesl \mbox{[}i\mbox{]}} gets number of cylces left. Used in MYTHEN, GOTTHARD only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries probesl \mbox{[}i\mbox{]}} gets number of probes left. Used in MYTHEN, GOTTHARD only. -\end{DoxyItemize} \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/data.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/data.tex deleted file mode 100644 index 898020fd0..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/data.tex +++ /dev/null @@ -1,76 +0,0 @@ -Commands to setup the data processing (mainly MYTHEN related) - - -\begin{DoxyItemize} -\item {\bfseries flatfield \mbox{[}fn\mbox{]}} {\ttfamily put} sets flatfield file to {\ttfamily fn} (relative to {\ttfamily ffdir}). returns the flatfield file name relative to {\ttfamily ffdir} (string). If -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries ffdir \mbox{[}d\mbox{]}} Sets/gets the directory in which the flat field file is located. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries ratecorr \mbox{[}ns\mbox{]}} Returns the dead time used for rate correections in ns (int). {\ttfamily put} sets the deadtime correction constant in ns, -\/1 will set it to default tau of settings (0 unset). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries badchannels \mbox{[}fn\mbox{]}} {\ttfamily put} sets the badchannels file to {\ttfamily fn} . returns the bad channels file name. If -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries angconv \mbox{[}fn\mbox{]}} {\ttfamily put} sets the angular conversion file to {\ttfamily fn} . returns the angular conversion file name. If -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries globaloff \mbox{[}f\mbox{]}} Sets/gets the beamline angular global offset (float). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries fineoff \mbox{[}f\mbox{]}} Sets/gets the angular fine offset of the measurement (float). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries binsize \mbox{[}f\mbox{]}} Sets/gets the bin size used for the angular conversion (float). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries angdir \mbox{[}i\mbox{]}} Sets/gets the angular direction. 1 means increasing channels number as increasing angle, -\/1 increasing channel number decreasing angle. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries moveflag \mbox{[}i\mbox{]}} Sets/gets the flag for physically moving the detector during the acquisition of several positions. 1 sets (moves), 0 unsets. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries samplex \mbox{[}f\mbox{]}} Sets/gets the sample displacement in th direction parallel to the beam in um. Unused! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries sampley \mbox{[}f\mbox{]}} Sets/gets the sample displacement in th direction orthogonal to the beam in um. Unused! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries threaded \mbox{[}i\mbox{]}} Sets/gets the data processing threaded flag. 1 is threaded, 0 unthreaded. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries darkimage fn} Loads the dark image to the detector from file fn (pedestal image). Cannot get. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries gainimage fn} Loads the gain image to the detector from file fn (gain map for translation into number of photons of an analog detector). Cannot get. -\end{DoxyItemize} \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/doxygen.sty b/slsDetectorSoftware/slsDetectorClientDocs/latex/doxygen.sty deleted file mode 100644 index b58496031..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/doxygen.sty +++ /dev/null @@ -1,348 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{doxygen} - -% Packages used by this style file -\RequirePackage{alltt} -\RequirePackage{array} -\RequirePackage{calc} -\RequirePackage{color} -\RequirePackage{fancyhdr} -\RequirePackage{verbatim} - -% Setup fancy headings -\pagestyle{fancyplain} -\newcommand{\clearemptydoublepage}{% - \newpage{\pagestyle{empty}\cleardoublepage}% -} -\renewcommand{\sectionmark}[1]{% - \markright{\thesection\ #1}% -} -\lhead[\fancyplain{}{\bfseries\thepage}]{% - \fancyplain{}{\bfseries\rightmark}% -} -\rhead[\fancyplain{}{\bfseries\leftmark}]{% - \fancyplain{}{\bfseries\thepage}% -} -\rfoot[\fancyplain{}{\bfseries\scriptsize% - Generated on Tue Aug 15 18:42:37 2017 by Doxygen }]{} -\lfoot[]{\fancyplain{}{\bfseries\scriptsize% - Generated on Tue Aug 15 18:42:37 2017 by Doxygen }} -\cfoot{} - -%---------- Internal commands used in this style file ---------------- - -% Generic environment used by all paragraph-based environments defined -% below. Note that the command \title{...} needs to be defined inside -% those environments! -\newenvironment{DoxyDesc}[1]{% - \begin{list}{}% - {% - \settowidth{\labelwidth}{40pt}% - \setlength{\leftmargin}{\labelwidth}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{-4pt}% - \renewcommand{\makelabel}{\entrylabel}% - }% - \item[#1:]% -}{% - \end{list}% -} - -%---------- Commands used by doxygen LaTeX output generator ---------- - -% Used by
 ... 
-\newenvironment{DoxyPre}{% - \small% - \begin{alltt}% -}{% - \end{alltt}% - \normalsize% -} - -% Used by @code ... @endcode -\newenvironment{DoxyCode}{% - \footnotesize% - \verbatim% -}{% - \endverbatim% - \normalsize% -} - -% Used by @example, @include, @includelineno and @dontinclude -\newenvironment{DoxyCodeInclude}{% - \DoxyCode% -}{% - \endDoxyCode% -} - -% Used by @verbatim ... @endverbatim -\newenvironment{DoxyVerb}{% - \footnotesize% - \verbatim% -}{% - \endverbatim% - \normalsize% -} - -% Used by @verbinclude -\newenvironment{DoxyVerbInclude}{% - \DoxyVerb% -}{% - \endDoxyVerb% -} - -% Used by numbered lists (using '-#' or
    ...
) -\newenvironment{DoxyEnumerate}{% - \enumerate% -}{% - \endenumerate% -} - -% Used by bullet lists (using '-', @li, @arg, or
    ...
) -\newenvironment{DoxyItemize}{% - \itemize% -}{% - \enditemize% -} - -% Used by description lists (using
...
) -\newenvironment{DoxyDescription}{% - \description% -}{% - \enddescription% -} - -% Used by @image, @dotfile, and @dot ... @enddot -% (only if caption is specified) -\newenvironment{DoxyImage}{% - \begin{figure}[H]% - \begin{center}% -}{% - \end{center}% - \end{figure}% -} - -% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc -% (only if no caption is specified) -\newenvironment{DoxyImageNoCaption}{% -}{% -} - -% Used by @attention -\newenvironment{DoxyAttention}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @author and @authors -\newenvironment{DoxyAuthor}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @date -\newenvironment{DoxyDate}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @invariant -\newenvironment{DoxyInvariant}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @note -\newenvironment{DoxyNote}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @post -\newenvironment{DoxyPostcond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @pre -\newenvironment{DoxyPrecond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @remark -\newenvironment{DoxyRemark}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @return -\newenvironment{DoxyReturn}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @since -\newenvironment{DoxySince}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @see -\newenvironment{DoxySeeAlso}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @version -\newenvironment{DoxyVersion}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @warning -\newenvironment{DoxyWarning}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @internal -\newenvironment{DoxyInternal}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @par and @paragraph -\newenvironment{DoxyParagraph}[1]{% - \begin{list}{}% - {% - \settowidth{\labelwidth}{40pt}% - \setlength{\leftmargin}{\labelwidth}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{-4pt}% - \renewcommand{\makelabel}{\entrylabel}% - }% - \item[#1]% -}{% - \end{list}% -} - -% Used by parameter lists -\newenvironment{DoxyParams}[1]{% - \begin{DoxyDesc}{#1}% - \begin{description}% -}{% - \end{description}% - \end{DoxyDesc}% -} - -% Used by return value lists -\newenvironment{DoxyRetVals}[1]{% - \begin{DoxyDesc}{#1}% - \begin{description}% -}{% - \end{description}% - \end{DoxyDesc}% -} - -% Used by exception lists -\newenvironment{DoxyExceptions}[1]{% - \begin{DoxyDesc}{#1}% - \begin{description}% -}{% - \end{description}% - \end{DoxyDesc}% -} - -% Used by template parameter lists -\newenvironment{DoxyTemplParams}[1]{% - \begin{DoxyDesc}{#1}% - \begin{description}% -}{% - \end{description}% - \end{DoxyDesc}% -} - -\newcommand{\doxyref}[3]{\textbf{#1} (\textnormal{#2}\,\pageref{#3})} -\newenvironment{DoxyCompactList} -{\begin{list}{}{ - \setlength{\leftmargin}{0.5cm} - \setlength{\itemsep}{0pt} - \setlength{\parsep}{0pt} - \setlength{\topsep}{0pt} - \renewcommand{\makelabel}{\hfill}}} -{\end{list}} -\newenvironment{DoxyCompactItemize} -{ - \begin{itemize} - \setlength{\itemsep}{-3pt} - \setlength{\parsep}{0pt} - \setlength{\topsep}{0pt} - \setlength{\partopsep}{0pt} -} -{\end{itemize}} -\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp} -\newlength{\tmplength} -\newenvironment{TabularC}[1] -{ -\setlength{\tmplength} - {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)} - \par\begin{tabular*}{\linewidth} - {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} -} -{\end{tabular*}\par} -\newcommand{\entrylabel}[1]{ - {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\vspace{1.5\baselineskip}}}} -\newenvironment{Desc} -{\begin{list}{} - { - \settowidth{\labelwidth}{40pt} - \setlength{\leftmargin}{\labelwidth} - \setlength{\parsep}{0pt} - \setlength{\itemsep}{-4pt} - \renewcommand{\makelabel}{\entrylabel} - } -} -{\end{list}} -\newenvironment{Indent} - {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} - \item[]\ignorespaces} - {\unskip\end{list}} -\setlength{\parindent}{0cm} -\setlength{\parskip}{0.2cm} -\addtocounter{secnumdepth}{1} -\sloppy -\usepackage[T1]{fontenc} -\makeatletter -\renewcommand{\paragraph}{\@startsection{paragraph}{4}{0ex}% - {-3.25ex plus -1ex minus -0.2ex}% - {1.5ex plus 0.2ex}% - {\normalfont\normalsize\bfseries}} -\makeatother -\stepcounter{secnumdepth} -\stepcounter{tocdepth} -\definecolor{comment}{rgb}{0.5,0.0,0.0} -\definecolor{keyword}{rgb}{0.0,0.5,0.0} -\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} -\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} -\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} -\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} -\definecolor{charliteral}{rgb}{0.0,0.5,0.5} -\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} -\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} -\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} -\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/index.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/index.tex deleted file mode 100644 index 613142828..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/index.tex +++ /dev/null @@ -1,44 +0,0 @@ -This program is intended to control the SLS detectors via command line interface. This is the only way to access all possible functionality of the detectors, however it is often recommendable to avoid changing the most advanced settings, rather leaving the task to configuration files, as when using the GUI or the API provided. - -The command line interface consists in four main functions: - - -\begin{DoxyItemize} -\item {\bfseries sls\_\-detector\_\-acquire} to acquire data from the detector -\item {\bfseries sls\_\-detector\_\-put} to set detector parameters -\item {\bfseries sls\_\-detector\_\-get} to retrieve detector parameters -\item {\bfseries sls\_\-detector\_\-help} to get help concerning the text commands Additionally the program slsReceiver should be started on the machine expected to receive the data from the detector. -\end{DoxyItemize} - -If you need control a single detector, the use of the command line interface does not need any additional arguments. - -For commands addressing a single controller of your detector, the command cmd should be called with the index i of the controller: - -{\bfseries sls\_\-detector\_\-clnt i:cmd} - -where {\bfseries sls\_\-detector\_\-clnt} is the text client (put, get, acquire, help). - -In case more than one detector is configured on the control PC, the command cmd should be called with their respective index j: - -{\bfseries sls\_\-detector\_\-clnt j-\/cmd} - -where {\bfseries sls\_\-detector\_\-clnt} is the text client (put, get, acquire, help). - -To address a specific controller i of detector j use: - -{\bfseries sls\_\-detector\_\-clnt j-\/i:cmd} - -For additional questions concerning the indexing of the detector, please refer to the SLS Detectors FAQ documentation. - -The commands are sudivided into different pages depending on their functionalities: -\begin{DoxyItemize} -\item \hyperlink{acquisition}{Acquition commands} Acquisition: commands to start/stop the acquisition and retrieve data -\item \hyperlink{config}{Configuration commands} Configuration: commands to configure the detector -\item \hyperlink{data}{Data postprocessing}: commands to process the data -\/ mainly for MYTHEN except for rate corrections. -\item \hyperlink{settings}{Settings}: commands to define detector settings/threshold. -\item \hyperlink{output}{Output}: commands to define output file destination and format -\item \hyperlink{actions}{Actions}: commands to define scripts to be executed during the acquisition flow -\item \hyperlink{network}{Network}: commands to setup the network between client, detector and receiver -\item \hyperlink{receiver}{Receiver}: commands to configure the receiver -\item \hyperlink{test}{Developer} Developer: commands to be used only for software debugging. Avoid using them! -\end{DoxyItemize} \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/network.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/network.tex deleted file mode 100644 index 26dd6c0a1..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/network.tex +++ /dev/null @@ -1,84 +0,0 @@ -Commands to setup the network between client, detector and receiver -\begin{DoxyItemize} -\item {\bfseries rx\_\-hostname \mbox{[}s\mbox{]}} sets/gets the receiver hostname or IP address, configures detector mac with all network parameters and updates receiver with acquisition parameters. Normally used for single detectors (Can be multi-\/detector). {\ttfamily none} disables. If used, use as last network command in configuring detector MAC. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries rx\_\-udpip \mbox{[}ip\mbox{]}} sets/gets the ip address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-\/detector). Used if different from eth0. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries rx\_\-udpmac \mbox{[}mac\mbox{]}} sets/gets the mac address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-\/detector). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries rx\_\-udpport \mbox{[}port\mbox{]}} sets/gets the port of the receiver UDP interface where the data from the detector will be streamed to. Use single-\/detector command. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries rx\_\-udpport2 \mbox{[}port\mbox{]}} sets/gets the second port of the receiver UDP interface where the data from the second half of the detector will be streamed to. Use single-\/detector command. Used for EIGER only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries detectormac \mbox{[}mac\mbox{]}} sets/gets the mac address of the detector UDP interface from where the detector will stream data. Use single-\/detector command. Normally unused. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries detectorip \mbox{[}ip\mbox{]}} sets/gets the ip address of the detector UDP interface from where the detector will stream data. Use single-\/detector command. Keep in same subnet as rx\_\-udpip (if rx\_\-udpip specified). -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries txndelay\_\-left \mbox{[}delay\mbox{]}} sets/gets the transmission delay of first packet in an image being streamed out from the detector's left UDP port. Use single-\/detector command. Used for EIGER only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries txndelay\_\-right \mbox{[}delay\mbox{]}} sets/gets the transmission delay of first packet in an image being streamed out from the detector's right UDP port. Use single-\/detector command. Used for EIGER only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries txndelay\_\-frame \mbox{[}delay\mbox{]}} sets/gets the transmission frame period of entire frame being streamed out from the detector for both ports. Use single-\/detector command. Used for EIGER only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries flowcontrol\_\-10g \mbox{[}delay\mbox{]}} Enables/disables 10 GbE flow control. 1 enables, 0 disables. Used for EIGER only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries zmqport \mbox{[}port\mbox{]}} sets/gets the 0MQ (TCP) port of the receiver from where data is streamed to the client. Use single-\/detector command to set individually or multi-\/detector command to calculate based on {\ttfamily port} for the rest. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries configuremac \mbox{[}i\mbox{]}} configures the MAC of the detector with these parameters: detectorip, detectormac, rx\_\-udpip, rx\_\-udpmac, rx\_\-udpport, rx\_\-udpport2 (if applicable). Only put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries rx\_\-tcpport \mbox{[}port\mbox{]}} sets/gets the port of the client-\/receiver TCP interface. Use single-\/detector command. Is different for each detector if same {\ttfamily rx\_\-hostname} used. Must be first command to communicate with receiver. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries port \mbox{[}port\mbox{]}} sets/gets the port of the client-\/detector control server TCP interface. Use single-\/detector command. Default value is 1952 for all detectors. Normally not changed. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries stopport \mbox{[}port\mbox{]}} sets/gets the port of the client-\/detector stop server TCP interface. Use single-\/detector command. Default value is 1953 for all detectors. Normally not changed. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries lastclient } Gets the last client communicating with the detector. Cannot put! -\end{DoxyItemize} \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/output.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/output.tex deleted file mode 100644 index d75abbf68..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/output.tex +++ /dev/null @@ -1,36 +0,0 @@ -Commands to setup the file destination and format - - -\begin{DoxyItemize} -\item {\bfseries outdir \mbox{[}dir\mbox{]}} Sets/gets the file output directory (string) -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries fname \mbox{[}fn\mbox{]}} Sets/gets the root of the output file name (string) -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries index \mbox{[}i\mbox{]}} Sets/gets the current file index (int) -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries enablefwrite \mbox{[}i\mbox{]}} Enables/disables file writing. 1 enables, 0 disables. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries overwrite \mbox{[}i\mbox{]}} enables(1) /disables(0) file overwriting -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries currentfname} gets the filename for the data without index and extension -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries fileformat} gets the file format for data (no put?) What are the possible return values? -\end{DoxyItemize} \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/receiver.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/receiver.tex deleted file mode 100644 index 6767ad068..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/receiver.tex +++ /dev/null @@ -1 +0,0 @@ -Commands to configure the receiver \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/refman.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/refman.tex deleted file mode 100644 index 81bd951fa..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/refman.tex +++ /dev/null @@ -1,93 +0,0 @@ -\documentclass[a4paper]{article} -\usepackage{makeidx} -\usepackage{graphicx} -\usepackage{multicol} -\usepackage{float} -\usepackage{listings} -\usepackage{color} -\usepackage{textcomp} -\usepackage{alltt} -\usepackage{times} -\usepackage{ifpdf} -\ifpdf -\usepackage[pdftex, - pagebackref=true, - colorlinks=true, - linkcolor=blue, - unicode - ]{hyperref} -\else -\usepackage[ps2pdf, - pagebackref=true, - colorlinks=true, - linkcolor=blue, - unicode - ]{hyperref} -\usepackage{pspicture} -\fi -\usepackage[utf8]{inputenc} -\usepackage{doxygen} -\lstset{language=C++,inputencoding=utf8,basicstyle=\footnotesize,breaklines=true,breakatwhitespace=true,tabsize=8,numbers=left } -\makeindex -\setcounter{tocdepth}{3} -\renewcommand{\footrulewidth}{0.4pt} -\begin{document} -\hypersetup{pageanchor=false} -\begin{titlepage} -\vspace*{7cm} -\begin{center} -{\Large Reference Manual}\\ -\vspace*{1cm} -{\large Generated by Doxygen 1.6.1}\\ -\vspace*{0.5cm} -{\small Tue Aug 15 18:42:37 2017}\\ -\end{center} -\end{titlepage} -\pagenumbering{roman} -\tableofcontents -\pagenumbering{arabic} -\hypersetup{pageanchor=true} -\section{Introduction} -\label{index}\hypertarget{index}{}\input{index} -\section{Developer} -\label{test} -\hypertarget{test}{} -\input{test} -\section{Acquition commands} -\label{acquisition} -\hypertarget{acquisition}{} -\input{acquisition} -\section{Configuration commands} -\label{config} -\hypertarget{config}{} -\input{config} -\section{Data processing commands} -\label{data} -\hypertarget{data}{} -\input{data} -\section{Detector settings commands} -\label{settings} -\hypertarget{settings}{} -\input{settings} -\section{Output settings} -\label{output} -\hypertarget{output}{} -\input{output} -\section{Actions} -\label{actions} -\hypertarget{actions}{} -\input{actions} -\section{Network} -\label{network} -\hypertarget{network}{} -\input{network} -\section{Receiver commands} -\label{receiver} -\hypertarget{receiver}{} -\input{receiver} -\section{Advanced Usage} -\label{advanced} -\hypertarget{advanced}{} -\input{advanced} -\printindex -\end{document} diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/settings.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/settings.tex deleted file mode 100644 index 5655ee20c..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/settings.tex +++ /dev/null @@ -1,57 +0,0 @@ -Commands to setup the settings of the detector - - -\begin{DoxyItemize} -\item {\bfseries settingsdir \mbox{[}dir\mbox{]}} Sets/gets the directory where the settings files are located (string) -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries trimdir \mbox{[}dir\mbox{]}} obsolete {\ttfamily settingsdir} -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries caldir \mbox{[}dir\mbox{]}} Sets/gets the directory where the calibration files are located (string) -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries trimen \mbox{[}n e0 e1...e(n-\/1)\mbox{]}} Sets/gets the number of energies n at which the detector has default trim file and their values in eV (int) -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries settings \mbox{[}s\mbox{]}} sets/gets the settings of the detector. Options: {\ttfamily standard}, {\ttfamily fast}, {\ttfamily highgain}, {\ttfamily dynamicgain}, {\ttfamily lowgain}, {\ttfamily mediumgain}, {\ttfamily veryhighgain}, {\ttfamily lownoise}, {\ttfamily dynamichg0}, {\ttfamily fixgain1}, {\ttfamily fixgain2}, {\ttfamily forceswitchg1}, {\ttfamily forceswitchg2}. \par - In Eiger, only sets in client shared memory. Use {\ttfamily threshold} or {\ttfamily thresholdnotb} to pass to detector. Gets from detector. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries threshold \mbox{[}eV\mbox{]} \mbox{[}sett\mbox{]} } sets/gets the detector threshold in eV. sett is optional and if provided also sets the settings. Use this for Eiger instead of {\ttfamily settings}. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries thresholdnotb \mbox{[}eV\mbox{]} \mbox{[}sett\mbox{]} } sets/gets the detector threshold in eV without loading trimbits. sett is optional and if provided also sets the settings. Use this for Eiger instead of {\ttfamily settings}. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries trimbits \mbox{[}fname\mbox{]} } loads/stores the trimbits to/from the detector. If no extension is specified, the serial number of each module will be attached. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries trim:\mbox{[}mode\mbox{]} \mbox{[}fname\mbox{]}} trims the detector according to mode and saves resulting trimbits to file. Mode: noise, beam, improve, fix. Used in MYTHEN only. Only put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries trimval \mbox{[}i\mbox{]}} sets all trimbits to i. Used in EIGER only. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries pedestal \mbox{[}i\mbox{]}} starts acquisition for i frames, calculates pedestal and writes back to fpga. Used in GOTTHARD only. Only put! -\end{DoxyItemize} \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClientDocs/latex/test.tex b/slsDetectorSoftware/slsDetectorClientDocs/latex/test.tex deleted file mode 100644 index 887052aa3..000000000 --- a/slsDetectorSoftware/slsDetectorClientDocs/latex/test.tex +++ /dev/null @@ -1,64 +0,0 @@ -Commands to be used only for software debugging. Avoid using them! -\begin{DoxyItemize} -\item {\bfseries test} returns an error -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries help} Returns a list of possible commands. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries exitserver} Shuts down all the detector servers. Don't use it!!!! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries exitreceiver} Shuts down all the receivers. Don't use it!!!! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries flippeddatay \mbox{[}i\mbox{]}} enables/disables data being flipped across y axis. 1 enables, 0 disables. Not implemented. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries digitest \mbox{[}i\mbox{]}} will perform test which will plot the unique channel identifier, instead of data. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries bustest} performs test of the bus interface between FPGA and embedded Linux system. Can last up to a few minutes. Cannot set! Used for Mythen only. Only get! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries digibittest:\mbox{[}i\mbox{]}} performs digital test of the module i. Returns 0 if succeeded, otherwise error mask. Only put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries reg \mbox{[}addr\mbox{]} \mbox{[}val\mbox{]}} ??? writes to an register {\ttfamily addr} with {\ttfamily value} in hexadecimal format. -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries adcreg \mbox{[}addr\mbox{]} \mbox{[}val\mbox{]}} ??? writes to an adc register {\ttfamily addr} with {\ttfamily value} in hexadecimal format. Only put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries setbit} ??? Only put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries clearbit } ??? Only put! -\end{DoxyItemize} - - -\begin{DoxyItemize} -\item {\bfseries getbit } ??? Only get! -\end{DoxyItemize} \ No newline at end of file From db983c5439114ec59c0e7fcb7dcd863182e53ab3 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 11:10:56 +0200 Subject: [PATCH 06/45] moved the output dir of slsdetectorClientDocs --- slsDetectorSoftware/slsDetectorClient.doxy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorSoftware/slsDetectorClient.doxy b/slsDetectorSoftware/slsDetectorClient.doxy index c63f84d40..2d955c610 100644 --- a/slsDetectorSoftware/slsDetectorClient.doxy +++ b/slsDetectorSoftware/slsDetectorClient.doxy @@ -83,4 +83,4 @@ PREDEFINED = __cplusplus INPUT = slsDetector/slsDetectorCommand.cpp -OUTPUT_DIRECTORY = slsDetectorClientDocs +OUTPUT_DIRECTORY = ../manual/slsDetectorClientDocs From af5f61bd95432e7a6557637bf626ff99bab4e8b4 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 11:13:40 +0200 Subject: [PATCH 07/45] updated command line doc --- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 4bfdcc268..e7faec293 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1678,8 +1678,12 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page receiver - r_checkonline Checks the receiver if it is online/offline mode. Prints either 'All receiver online', '[List of all receiver hostname in offline mode] :Not all receiver online'. Only get! + */ + descrToFuncMap[i].m_pFuncName="r_checkonline"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; i++; + /*! \page receiver - framescaught gets the number of frames caught by receiver. Average of all for multi-detector command. Only get! */ From 2935722b98dfa6eb3be6dfd62b73a8cc31196779 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 11:49:55 +0200 Subject: [PATCH 08/45] updated command line doc --- .../slsDetector/slsDetectorCommand.cpp | 37 ++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index e7faec293..39fe6e083 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -53,7 +53,7 @@ The commands are sudivided into different pages depending on their functionaliti - \ref actions "Actions": commands to define scripts to be executed during the acquisition flow - \ref network "Network": commands to setup the network between client, detector and receiver - \ref receiver "Receiver": commands to configure the receiver - - \ref test Developer: commands to be used only for software debugging. Avoid using them! + - \ref test "Developer": commands to be used only for software debugging. Avoid using them! */ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { @@ -112,10 +112,20 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; - /* Detector structure configuration and debugging commands */ + /*! \page config Configuration commands - Commands to configure the detector. these commands are often left to the configuration file. + Commands to configure the detector. these commands are often left to the configuration file. + - \ref detstructure "Detector Structure": commands to configure detector structure + - \ref detstatus "Detector Status": commands to configure detector status + - \ref versions "Versions": commands to check version of each subsytem + */ + + /* Detector structure configuration and debugging commands */ + + /*! \page config + \section detstructure Detector Structure + commands to configure detector structure */ /*! \page config @@ -421,6 +431,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileIndex; i++; + /*! \page config + \section detstatus Detector Status + commands to configure detector status + */ /*! \page config - online [i] sets the detector in online (1) or offline (0) mode @@ -905,48 +919,53 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* versions/ serial numbers getId */ /*! \page config + \section versions Versions + Commands to check versions of each subsystem + */ + + /*! - moduleversion:[i] Gets the firmware version of module i. Used for MYTHEN only. Only get! */ descrToFuncMap[i].m_pFuncName="moduleversion"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; - /*! \page config + /*! - detectornumber Gets the serial number or MAC of detector. Only get! */ descrToFuncMap[i].m_pFuncName="detectornumber"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; - /*! \page config + /*! - modulenumber:[i] Gets the serial number of module i. Used for MYTHEN only. Only get! */ descrToFuncMap[i].m_pFuncName="modulenumber"; /* find command! */ descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; - /*! \page config + /*! - detectorversion Gets the firmware version of detector. Only get! */ descrToFuncMap[i].m_pFuncName="detectorversion"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; - /*! \page config + /*! - softwareversion Gets the software version of detector server. Only get! */ descrToFuncMap[i].m_pFuncName="softwareversion"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; - /*! \page config + /*! - thisversion Gets the software version of this client software. Only get! */ descrToFuncMap[i].m_pFuncName="thisversion"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; - /*! \page config + /*! - receiverversion Gets the software version of receiver. Only get! */ descrToFuncMap[i].m_pFuncName="receiverversion"; // From f4b01bc18b64f8f2ec9760b6f2cf749a863a5fda Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 16:03:57 +0200 Subject: [PATCH 09/45] rst to sw1 for all --- .../gotthardDetectorServer/firmware_funcs.c | 25 +++++------------- .../gotthardDetectorServer/gitInfo.txt | 8 +++--- .../gotthardDetectorServer/gitInfoGotthard.h | 8 +++--- .../gotthardDetectorServerv3.0.0.4 | Bin 132072 -> 0 bytes .../gotthardDetectorServerv3.0.0.5 | Bin 0 -> 132024 bytes 5 files changed, 15 insertions(+), 26 deletions(-) delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.4 create mode 100755 slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.5 diff --git a/slsDetectorSoftware/gotthardDetectorServer/firmware_funcs.c b/slsDetectorSoftware/gotthardDetectorServer/firmware_funcs.c index 08ba5e901..ee2771699 100755 --- a/slsDetectorSoftware/gotthardDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/gotthardDetectorServer/firmware_funcs.c @@ -244,15 +244,6 @@ u_int32_t bus_r(u_int32_t offset) { void setMasterSlaveConfiguration(){ -/* - int masterflags = NO_MASTER; - int masterdefaultdelay = 62; - int patternphase = 0; - int adcphase = 0; - int slavepatternphase = 0; - int slaveadcphase = 0; - int sw1torstdelay = 2; -*/ // global master default delay picked from config file FILE* fd=fopen(CONFIG_FILE,"r"); if(fd==NULL){ @@ -354,17 +345,15 @@ void setMasterSlaveConfiguration(){ setPhaseShift(slaveadcphase); } + /* Set RST to SW1 delay */ + val=bus_r(MULTI_PURPOSE_REG); + //#ifdef VERBOSE + printf("Value of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); + //#endif + val = (val & (~(RST_TO_SW1_DELAY_MSK))) | ((rsttosw1delay << RST_TO_SW1_DELAY_OFFSET) & (RST_TO_SW1_DELAY_MSK)); + bus_w(MULTI_PURPOSE_REG,val); - if (masterflags == IS_MASTER || masterflags == IS_SLAVE) { - val=bus_r(MULTI_PURPOSE_REG); -//#ifdef VERBOSE - printf("Value of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); -//#endif - val = (val & (~(RST_TO_SW1_DELAY_MSK))) | ((rsttosw1delay << RST_TO_SW1_DELAY_OFFSET) & (RST_TO_SW1_DELAY_MSK)); - bus_w(MULTI_PURPOSE_REG,val); - } - fclose(fd); } diff --git a/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt b/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt index 0b0fd3c25..331da9c31 100644 --- a/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/gotthardDetectorServer URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: a0ae3985068425e7142df8271eac6ce09a238dc9 -Revision: 206 +Repsitory UUID: e4fa807b5d987714a047b9d2cac271c89f6c2fef +Revision: 208 Branch: developer Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1454 -Last Changed Date: 2017-08-04 09:28:44.000000002 +0200 ./firmware_funcs.c +Last Changed Rev: 1487 +Last Changed Date: 2017-08-16 16:01:46.000000002 +0200 ./firmware_funcs.c diff --git a/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h b/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h index b1430c924..f5a2ab5e4 100644 --- a/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h +++ b/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUID "a0ae3985068425e7142df8271eac6ce09a238dc9" -//#define SVNREV 0x1454 +#define SVNREPUUID "e4fa807b5d987714a047b9d2cac271c89f6c2fef" +//#define SVNREV 0x1487 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x1454 -#define SVNDATE 0x20170804 +#define SVNREV 0x1487 +#define SVNDATE 0x20170816 // diff --git a/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.4 b/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.4 deleted file mode 100755 index 4d2a29ceb2d2e0641fe67daf123e9dce86ed5eaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132072 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 j;twt% diff --git a/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.5 b/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv3.0.0.5 new file mode 100755 index 0000000000000000000000000000000000000000..e802907cbf51e4d560a94227f348aa3e23bd752d GIT binary patch literal 132024 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 h3!Dt z4unlMg{|~~em<%Fd{Y>=j!Nx6NB`GWC$RR#<&PoZHbQD`T-gRm^!#!?R8W%(s-21^ zp>~u(ZoC88^A04Ig5f}omN{^@NN%1+ir$z zfvh}_TIhVGtKE7+w?&UuB%HyH1gAJT4uLX~emF%Z8To&V{6Aj#Ir4We7g=i8KICBY zV4lY1F(ev2~r{wik`^7|T=N~)nP6FUO2BM^HO zv42}OS{Vf#SdHPgpuRj8g9hI@y3$}G@|bx4TS)PSmOs%zZ!6j-LZbn#uNZWzMVi|C z_ae=+u-$H0Q3NO94h3@!^Cdgd7~_`gAZxXVolcl*VDCh=bGybbEt#19IB$^6IscJ~ zgH0QA4AL)(7)~@7@SAXI08S0}e+issEvt6cA#bAD;|>}Nvs>K{NdNt`hqASS_|gxn zo?x3Pg>j-NhW+Pc`x$6YV%O6EoGmez5k|`J{j|4weS_O!Zru@CtvduWcNg+7D3;yI zg1WGQay|uPEOfw*ASlOo-qQ&|+66@EizTX|nWlX~Q$Jg+^@Fly8vSgjqhF(Gr52V4 zx`EC(Rne8Ehfmex{27|kzOd{z-h;aCxxc6m`}>zxJDaq8zs7lO>P2)9gs$@#z3A6V zMYMTLrhR9$$1x17`r1VY&OH7dR&>l&XrCkfC%EjI#gQVHXMTgya=GO(V4q}s)U{@- zGI1GhG4YFmvG4$Hc6cBUb-M(0(|N^rD(98%>vk^c#(6FXOvh)qg<6WvcBR!Zd;PG* z7`5V(Lze)8tq@RjvY|%tGi!(uGZ=gpH1TpSxBT)BTA`o4CRz0=xW0^QZXQi_tw40N(e40fP=FIM! z;nB&!e)0nkK_XlZ?Ca*bLL>3Ls#olP#;^~=z7c}`wb%~30&K>o;#aacVFmhlAC=_- zcc1?Sznh5sG&AJqP||9d7EY&8K8&i-k+9LM8f-!RmFS1E3b?#x!8=JA<|tH#ijf(G z-cAPBAA2crkJAIV$LRr_hrgYuNHZ2nXSBY^`b&(_lGmp&ir!n!>bV}&|IKZG11!$`xzK~{v@+J@2DN6yXuSYC9w_d#2|dT1_4DrI zh(CuRXPgzpzSBJAwWkDi{6*cvqA$#$eg^)t{=Jk^4q_<At;}-+JuqJJqG~S&* zqG$PdeI_of$w%7bTZ}!vWH~dqr32j3!FomM-P9{mO#8Tc1nGx8jh1~ujUakO45N4U zXh`cX`sg6qO2EzLvU0ikiuok*E9^0uTgA`vE~&=78qgsw!-)wx^BKnuLeexkKZ{ib zqkXY%LB6Wb`G`W=N^Y7$gr(I#0zQlpo4zmmTtAUXdI@PPx;87=>}(Vo!p5jp@U!?% z9^A!B!K!??Kgw}t_tGs?|G1Ur&1)7LvgHw!*K>zCmc{Q-SuDi7;OGBXX+svP50KZ)R9FeKBK@WXq)jt!b z^QX`;h>hQV$jAn`q=_be(8Rxr=2N>CVFbPjHX(c$l=jwVUtT04A2)P54>;8e9T~j| zDXBO8{iNPfKF(5NoZQRKc35dwO9RGwAJ(&c3U-xIO`U|w+nUbPmn-!D81>ue2JZ5}HhlHZmS z=sS~~!dxeA8l={V7PXO-%yC1qqKJp4ioigmtHJhPr^DjGYAaFu6%|~CQT9Ooj z-Bu}IZGqd0e3P(<(^+7CCR@6tD_=ICr4_BEKOY`vxzN0g#(dH&;=_BEn{Q>}8Zvq% z*DFY;F!Q7j82MH=BfonW8hN)3@2#KSywEH;ac`wUm{?%_jDx#~&w}7H(l(r4izvc^ z?!s>&Xh9r8yku|)wOQb1qn$X1yhVI-Gv$M^ldXW0BzXD^k`B0$2<_?zm-<)pvv><` zHcP`?oqQtdV#qk&b1Fce1ZFXbZsupBGI3nSNjR^hk2whwFKz?nwyk~&lvD1a5g6yF zRl6qN=q3cZ>4D~2#4DxJtB~OXlvN_#mq7Sn9oWjh{jeS12ir0Cg){v#%ub906|#we?E*R`2AN=x%(oxl1s{-QZp2$UzO_)C<~Gbh>Z zB%Ra)E~1e%rg2dWyw17k!oL|@6l3wkMKR1Ov$=@J5uYT$Cuf~))~X?|z*C%02s2&J zO$|*VN6sfC*9A2+jBd)wwYlvZs`E+Ar1O@8Puv)vE?-1D8->BRLv2wwDj=k4Q7jrn z%`aR;b47m}tdUn+~nsF>_P8Ahw_LI2ycn&yuWEPxHHEzY1IA+n%SfJ!l_yBJiE zK?P-Z7S!MeVI6(&L*(UUP}DmL&__I3P)hIM$O^Z~yBmoUfy>)`(k~`k+8gU2s#FQZTJ1%%I2r zfYkK285GIo^P6ru$#F$R-TVjJMk^8EwX|*4yayu-y1BV69N8ZEFoOFF&k42}eSl;t zVN5dBk362$>PGzkk0FVuKf<|xvnl+`AzjBKo%{D>;?N4}_JyFb`o==Et{Pp4)>9)3 z{p?O~y-%FP`h-79+%j$tr10iQG#OMP|&Rj?mp4tolv)aqxkVOq-B~3D@ zq%37Y85}a3K>?p`xXs{@Y6b;-0hP;b28T>!P;PG=91>$35(bAP+6+s_Z9~G4wmr@1 zMzHjxk@->5P>Jvl0=fhvgy%18=Y+K%aTY@LwjrDU>T`1152;!Eq5qa?^He)Z_M`t6 zL2^->l3gF`%tQU4OKu;|Lz`ht@Pw%ss(-%=^;Y-Y1xiC#06o>e-sR8eWn|+goxtG8 z`RFn89~_9*+IELw!A}n6lFeq)Y7N`(ZveSn!}M)H=3*od)};y`p<&5~ZI(n&$TMyXKqN2{=x}5wY z>oOB%&3uUL9iQL!ueVD%tBa+Zx-=mFhKIHy|1G!m-Yz=^_S7z~4(zU7XuTnO?P)d2 zTK&)_l(q0SyosPD(T_GhgndL09YlX=n|)CBvGacPwg`5mAf|=Iyf~Y5CE5XQWoP(Y zuwq%gfoeL>N2lV2UkT*YYi2tDNB2Bhy-k@|4`SieDJ<5BSnTrSdzcWj5iu9c7Le{V zXfyi}vj10v&0VZaTGJTDEdg3tQ`bN@SOeSeY}z|+MVgHWfm2VKU5=1A`tM-iv>&1S z*HBJZ%r>M&!Na%-{^3Iiy& zbIrIciS`rt1nlq;w$sjW1IyfAZJk{S7_6;r=RNezl3dC2N{OBmoiJF0yGV_bP3y3x zGD@AI*kIkYG3&1Og*Et7?Rq-eA(dUq8sy0#O9J}d)`8gX1bJRUlC-KUtq%R1&YbO* zn{dNP9MbtT?66PPTZ#(sJJvP=HaVkyxRdNNX^!MH>Nx_fG2&rCeX>pu!~HvTbk2yU zqMhz~OrMvC{0lHU<`=?O*GIlf2pZ9v_g~2M-T0FguD>`Lx=ahy>H>Hk|$? z4Uew_lWm|svkmx7T1+E&yYb1Gr|`{mS`TSX%vT9?DlmKIj#C8H4si zIu=4Y^3^y&jom;Y_kz;8HH2PfGHYEUB)aR$8(k2s0|ymI4Vn&S#y(eGwccKC8TN!E*C%Oc+~=5uMjcR!`Lv6`>(GxCkre7|OK zG+yYdifcf>H4onc*-*&pIYfh;fwh=c=ff#}bwK~O*&$`$-pgSJ+R1)-F|f;ro1}C+TnLA|S;8f_ zVUqT;J8s~X#gS<7Px~j?{KJ;%0s0K_eZ+{+B*|h#di2{2(rhQ`x;``J5sNbB5#prg zn~j;n8%RlVpnFcb4Hj9NebElB1m;*Fd9v41bOFxgQp?Rm%gxNRTv{FR3CaAQgTG&8 zUq8dw1D{gZSbQzR8qIE;@rJE}#h!_;dNxXo#8;5To{TS z*1G?C!jVpgxPcR#>bSn^C~nr(N2A`9W`I4nx1QWz*O`dIq^lE!2QqkV#|C5y*P&vj zp6UaAeUFgt`Qbc+zWsZp@9XnOe=_(=wB^oh5@?%&uz#3K%I#HsukQm+!(SyQQo~A|;YjEmY@M(f zF+?w2OIpexb$XF(d)ktM))~Vt2UxK%`=vF_?3IZm@JK$=23*I2f_0h|`nF=4v-HHF zBNzne zf?D}Y(vQ!F_0yr9d)eGc=UxT{;xg_-o5OG9cc2Uk9fnX5q52sJ9y$=Adg^Tqj$X)c zqfGas=38O={Sv9?#ButQZb{{w}0w(ExNk| zyKwj}DfBsRHz8eI(RA?}Y(`JJ#%4(UZJ_eDM``brZLYzSPMcmwoommunRRlSuaa%V z$p2hZo_mnzo<}Q?=iZx)Qu}tv^LRh=9GKf%%)Ph3kC}#l3i5da`P6AOIogloIU7_t zjBk=VM4>BG`tbZS|8B8{W0h`3c}EU`Lh_&QDmtPK0m~8h$4Ix)Mm~gh?*eqQ13$ zeZMX4lDyX7X|kLrz+1*@6tDHQr~}z4y2_a=5K{!rSpr_tyBzuw25s<(zPB<}pJZIg zp)TvkEYM7Ns=m*WK!N+(et)UR-wV zX^t?REWs^}CDK;2UIHq#3aWSl@%bfwJM$zt0NO{8{~5U*7)3uzH$t z5p3r`XQ8|9D6Ki~4&>c|9QMwlU2ynfzBgwj<<@#p9F&EJ5U?l$?&A4?!QzYgeml$H zzk7=K{J3k|H6X^0-mlYj9{eLMXJK`_RGGYHn+M*dUh5Fb;Tt7qYbSmfgjj8=BgOLy$`yo>61epOEYjg`tc#E(P# zYlx?}^_*I)1GnT%aaue^4q*-A)C|Pq8ibz5HVvYG24YuE9xWQgaWCFe*iHH*)~O}J zHwkIW*R5~^#=aI%Vj}v`!~of&`d$-bz3}7LgI+|6qdTn=ij!Q@t3VUlx> z>D))SP@ma!UBB9tiQ_Fn=RRnTlY*2at=-^12kPlq`xe^b`q_rme+uOhZ+AbByo}jw z&D6-9=a7x?hvqqJukHhl9B&8gF=)Z{PA-Stz@huu$$5yO*@-?%oXsFLjiHBnx=>Ho z+C22LFYAnYp3!SP|GVyo=5s%$o~LN_Z23#~_51)MeE0Qy6EWs`zRDo=dOpDVm035N zi8{_)`#IXO(NxE6ng-E*Th^nFgqL6|{{j9smz1mNw9K%gE%DkZ`Xur9dw-=oX|2`Z zlCGnBH83Nnfq>#SI?x;8lm}m%y{K=`96mM^m(d2aIYssw)k4r@;o7~R$=6<^-ADII zlh3?5P3S$#-uirRG#NRA^Y^oi7TK$fU1{-dA5M#|t8uUO(W#KBDSLB>&$^SQzU)U` z{cFiO&&lIn^O5b(Hd+c1T4*jIuSRm*!`L`9riHN_AE=Ex#9l=ukEkxgYhM;?qxFOhj?urt4()nUJn%LyhdwY z&;{7&vn&&u;Xu%Uum8s|o{)ANHqoI2bm(Ao7YjiA0Lvu*!oQx5D)e(cfY(w$+;l zPWj1fP6@h$ZxpbEQ-6Eq6X=1kugcu!Bj}30qMEL7FjaI3=R zcavz%M6@5H4Zrz-*0vy{=a4Mu#4hu1OXG6+6?SJOpe=A5Y9MYrq}#{oeb?q0dYtiE zrBNEKvuPz`{cJF9Z5aG6tZ?+r@EI8R`E!-Z#C2Ht$86ECTHSD^%b+7}g@oM;)PhrM zu8d=^a)Z7ai&x&+op;d7X{R#1)<*r$Xp<665Au1vn6Hxlo~rjm=i&^t9W=1xW(i)i zk=V~Es2}|j_5eXpe2+JPHnjJa<4kuyTIW;&K9ACYvuQ6O-w{sjS~s0aC2NXX@d8sg z_4S&HGLi&CC7hj|E>%c@GVFXGV8@;S<`dNZH_-hd3jq(Oeo=E0;PD3MaOz`4Wkh+r zQAEpl4iu&vd)aT4iUyWT=wA$beME^e;X^D)|pX0LJiYUf+n5%~bq34FFE zf$4P`Zn5hLw>7{GPJN;V@30_-*6f}|7@Ybr!hXS^McDKzvD>!{Z(xW;w@H<3g<;`( z)N8%IHsn@5MLIZjY|U)6=YII$)X_E9!gm-xIQ6ueTKEc(5>6daGYvi)d~oWJnoHpu z3?H1@zvd$NM!*NB7S_1n8wDSnD%6aHZw!2JYUlLP@VVfFQx8q26{btzgHyknJ_5d} z@WHA3rqfRMTKM49zf7l{nAgDvr~Y|5ap4^J;MD(`o~n<8f9jazbj%fA-54doLC}g+~eS@sb89(Dj==#>L2PUw8(_`XyzFrDG zx07{dNp&RHUH_GXIv$)mcposh!{|TR`Az>9^CN2MeO?Nr=4QUv@sj9mBxnhE-)O?t zNC>ZOgkW6?k$j3pi_2V_XdO$mmD|Je>f%25FWKtt$1n!cEmNS4N31Zu(bFFDRk^W_ z&?Rh|`{KMA;uEP*a&D^iuPnXP40)%e=ik&*>E0&nfJwtbhS$<5A5+{kio^ScaP(@r zxXy^@co?v_w`ZjhOF8?lpcJW40vP<7VPMC*emVyH8!!F_uEfi|RgX6BytugR?Z1WMT78DvM+_jVothT!}@m za7x$q?0I5yTIr-Az3qs% zZ;JN}0z@(G*wSx65-<`7u;!nBZCBggf6k&6R9$PLeMfYMF`os{m>!pDtAP(YiT2)LD!{qZ4hs8L#7!qwOKKhrkF`tF?Dlr=8WllX>~#-#-JI^1G<)bdImDL zTzgiGx!itPF?A-4PMpwdakQl*WYpnMR`}5tKVCYLoIF0Qs+rgfw$OPwKM_9^L8cpT zjO%Yi(SE6;E%9Is|NX%@{(B&|jOfkbUF@zn~6ijVqHN}-|N@T@-e_W?HVR>o>OWY7^ z%Aq3zMVLY_HN}0Ni3|TgzxfD|B*BwiT6bqwOr?qHa#l>87DKdX$;4zhk*#}lhKaAj zY(yk(OJs3a0I47o@#aY`hpo(tG2?J|R*a4Vwf!xbnCw1uy(t`Ha4Y9}_WoE+607ua z?8>HnNRuHi;na!KNS__d7CR}YYzm*B$t{N6DQ96nD816K^;+sv3E7YOmV~lf^^{Bs zf|Z=Dc$b3sHLaFpV!~vLzmA_p)a6}I{dlN0UO=C3Lq84))OR;Y)Q>kg@ZZ15iU0AS zhrWY8{HGS+z1-ZtKRgBwh=2pya;g7LR*aeYk*pXq^?#QY(`4eB|Hz67nPLK2G22Zs zD>E_FgA94tXbLacWQ5PpglG3}1LE2Y1oavtygCz}+rO)_V$A*frgLmJs2Uq(dn{VA2TfKxj! zr*@;}a{G)~?f3TDZQ55L#jpZNW3 z`$Xt<#LH7>5l4ktPuU&9uSvc{GHJL>vSfJqcbOOgyd1=;bfWDQ2YN$}gnA+aM=f=> zv`OnhC9{ZwF)si$bLHYanKZlym1Ih7$izq}^+s0eGKbex>*<@^Sv9yilfutxJs!|h z>)qE--|@(C^x)~6JXvWj$fO}y$yt^u-WdN=xycmjk`T`&+r?Oo0~PB$k&>QI^Mx;2g@k0^861 z1a^-rPCnd6R@d10sGr! zw1znbJ=4gA^2jZPxOSkUO&h~2J=O|+Jg@YWU>>Z$??a^|V9EGuP!i{Sp+T@6W0$aZ zXz6W8jLp#rFJj(|9nN$Jj=oXWx(P3OFzeF8JVDehJmJON_>F5A&jiMBYUgCq22MC8 zycj@iZhgLFvELxJB!qlJytYB4g;W2B#U>Ct9kHIA*bi9jZp2EIwiP%L6n^7`2k`Mz ziS!#XaPlY}=>#RwisUa3wN_+9i0d#PnG*(OcLy;lS`&k49!vRfJvcWXJ(Tj%zj-Uh znPrM-i?(C=#8^JNL$Pk~(L*U8{hQ~*XY|wxF)g12%ZHC(x%lXzl#l*x<|=A0;;IC= zDu{Ij;wtvKFq_k1pA_1+;|Up><6`UrI0oM_=DS0lf*wb`j^4_Q1eJs)UFc~}hl8*MHi_RsL*OOxcX>JO@dEd{ z)Q^-qMp*}sv;1+NZxXMU(f7g=xn*%~|5wY>ZCHK7=yX6Z zI?*9}u@}7t_DAPK?jk4NSFWWo9czwutlWV5gP$B90!>~q`~CnQm%tSF(kny3)8&9I zXRyyB*6{rXzKMvN$l^A<5(K}Ke3!xRZ#tE7S~WF7+VI zT^ONH0la>*tShuy916M5wex|n=8~NqV-vLIX3xM1nhV6RraS>Sx5vsIt`Hw9PLpUv zrqhmk$}qFgcTKsKtw)F1IBb-Q6%KK4sXn$e^dU{?4DEI1>WZe@hqnpdlOoc(;gPcW z|2MvAPo+Cb?_?zFy>Jb1{^)2Wj5`#HP<9c@wxVq7|AlXda)l7XT@rMkL;@}eCqzA7 z3FZ4y{)E5(4ZUf?7k^7j>&D}M+5GYUzlJ!xp0-cD-nPcNhPJTRhhKjiUcIT9a>*03 zns1i^@u==|fPQq^M8dt#Mwnj5#$H+3u?nlpwkq!;V4a&wWO zTu_t@S1Hdl)mr(Gcm9qm|X5Q^o6zAwj)NAe+CSKH6&zV_cL! z-k>Z9RvWtL1>+N}5y!0gitxZcHX zN@e$Q72=E}z4so0#R7K^g}l{e$_^{ugc;*%r5@PVK0dTGl)_5M9H9|@$l6k#t_ygyk&O?D=ZW?@=X_HPG^0d7w6gDEY#kI9|OAxjfzGeOQMgpm+Fv( zZytRSGB+eujGX^v^yrHv0S9o}@=c43odS!RImh8o~tBF0H)nBR6Wmbb0S#HJ0iE&s;c^?h zlzT^}+*^KRxifkwcPU-~@2z`7UY?Mi&os1VKHys>~r{jI%ajbrx?f9Z1VqElW+I_nm292c5p|oQsp# z^#|q38FV6>sC^K+H_t;*k5y`1pq0Vr)u*uW`L)g@TUAE6csH2lx449Hi~PL*cluN;?8!7IF>Y`iD|+;610fJ!123;1a8d*ZcLW#y}cwraB20d z3{-)gLnW~5W0xSJXS$UJlntl4D~C`U;BD8WJQnyCNJ;GO>WBNBDPQb90^H^&4?=R> zTB%z}xNU}8OlX(M2Y`W7XJsI;pNiQA^t0Anj&z3T1d|ml{3f2W4`smR~{p zN~+O7)W`)p&Pk>k5u9El)$?$`8uWc!7n^@e52G@6$NmpW%3#2f3Of!O9t~kh{8aMq_9) z{zpO{{7;4OI`<4|ogdPh7 zeAZ8~0%9j4b~20Y{5`E3(ag+%_~!R!hz|ISIOX>=Gc(Hi46#O8AHrwEz5n}iuRCh> zx^e$IdUdS_d(?PY28^7Qers0x-?6fcvY$b$f%!)GjJU^sZ~wuvR%Dg6JgcllIc43J zRn|>eW!><5=?BZ2mQ~iJS!G?6Q`Y%eWjV9TI_vl150*77t1Kz2ENf0#maMXlzGSB1 zw=W4lSeAkmMtgq_pV5{dy+piWw8{I3HQH-OR#~sVgxN_B-@Tj#-;xFY9Lw7%>(_`i z@OT_PBks|c96wl(d$Q6m&PsnrPCe!#)~JUUKBJD;yhO7Y>OV&L)meE@&dR$oC-3oD zc~@lReKu;TPSIL2m5eB|FN_QhKHH z>%R2Aq|gkPcu~MEYO*Z?5fy**DkrV(dGtX@N<3=ClMbORM{j1Z2|b^qZG44zxPuuy)sXTJ3*K zm(~rC&)Z8qa-CcO&2={Br+U3;?w75xX{*1`Z6;yV(rro!Xlxfjrt7+zc_o)L8|W6+ za{-^b?n;^#;xv7PR`cR0kMspv>*S-!>eVe8>M%caQ%r_%7MQp3x07H z{2hR|=fK~X1%G`O{MCTRu6}DaMpLs={30vGg)Ok2nxzJ6Fb)u!M1$`q@EPt_FN>4g>lmR?A8fz29vA?e4uzSvbKGKRmm-b;vob^fRM z`q_3^PS7(NaD$w=XG}NElf0Rp5y8rd*o@H zjj7}O{B13=hjfN%CPcUV#-cHd8hlN;6Sk-)e+!Ef^pJ+9$hS7j_bd1e$d$h(nM=1G ztpxl^2EX*T#7l<%&a4!-!e_+I$%^~sZ*|IGZ25t;IvuiW3zFo~=dj8D11AoSk(DJ9^tZ;*Iea*%fbXUYSn*>R^IpwUo&@kGyuujO+YN;ct+7qF(pr2aOv@wTTZ?5{5* zfeqQgvZX%7#Q~q4*Dj>n#nQc%$!ib7_OP%>m%I%4ExqKmF_Tvkc_mq1YkSFSWlmn) z4o^C0!P7Wt_%z9nJ72(wQ26Z3cPo5G+#D@$zHa|TW_6Zqfclx11a6$usWk@qjA8jq z%E3y9a09~4AbysCcoKT#x5%4Q+{okf3IYk^no(-ijQ^SSM8!0!Qkb~_t!f6C-F4|&aFdF{yL#p|fkmdbg> zlo#Fo6+`{Gz5Lw+{P%xO@ZaOu-4Kr6i&o=Y!ma3!BYhm>MjU6a=zfvC&nMuEMcs}t zEKZU{a!t4GLVm%vD?v-6H5b~8qhQ`=oTWX@-V?M~(NheafU|nT@^I%0cfOOK2Bh8^ zWBuceQZ7YxSzi($t9=Vv&0L3Z&%2f7pw{xId7Z}O_(we-Mw^pHNwV0NlX?iC&AAmD z6a|0M`Dh1LFsaA#Hly{E609*&n{&zzK7bdRP`)1=iFZ!M5&dp;Y{y<{e#W@Mu4`c& zzdg@o`#*-C&tG`_2RZ&7Iq%s%E(iWs zIsO&TaTywuta#;v_oO8DtKI92|H*&cjYOh^;6s`g<>5gd z9^^3{c}$ObkO#%&;^WW4=Lrp;IG|}q4@sh>prW}=c0Zf#e;0mp8*YEr+y+x}+F&c7 z_k#!bKYd6hF1#Kk3OL0~dw2647H=pTWce!!-eN@-hTcoS{Ipyb#kP4>l{529PI?Gb0g<~yHNTi@L!_&Z_V-7!*7Pa_Sv!= zIaC7(b040P+)F1s8w4%&y-Tg2#!QqyQ!D@MX9;UxP8p7zJnYZ9Lev^*b?&n< zaA-I>6C4@_heE1>Lr2+-S_`(5!4*8N=_>w(xAwjIhco|iLgB}Et=QxFd|VH zMjmP&_aGS1*lN=D*4U&0)JW1aff%c3RM6O%HV^QoEyEa##;8qgih0L03F9a+Y1)uy z@j3tBI%ft3f@$vk-|zB$!^}BnKi1l7?e*Gg@6&{JU6OR59Rv8l(-$e8MnYn*rIXDZMcqpUbchm2rZXTD=`Npv`jZ6)Zo$bGTfXpp2szT%HdGpIoT5=H($>G1Mr5l-IEJKA1fIqLc>bL<8Vb)) zY2*pRqj6`?fHaC8#RsulN|ROED9^_zM^j5cUs=T=zZC+g75FaI}c{zpt z8(G_cCz8+JLtQxY}RsJ5yfm$MtG2q-_N}=L&cp zkiI3w{uRnXUwz5QHP`yrqUKt)=3USm*xBZke9yJZHZNw_EN+_gEjnR2G zvL386Hu~s}P(&+^`&7-Pal7;p<{5ClXUnwKGnfTWGwuF3%z{4H1FXHjWqCW@Yg1!U zlvnd`-_Y6jeydjJ%qfaiQAQ=s1piXI_v}Z+mp4h;)eRrh8AYSdlASRfd)y-2LO@m_& z>%o(Sh$b|LY9nI|RqEiHzY@^`(gVZG6OFn+qml1Nw?ou&Y{mQMw$eI_My(%YcA-_W zlr>CzVOv?VE}l#6LmVOf`iN{FY6YkpF;69`F$h{0(sCc%INzcVRLjFi=50NLye2L< zJ(KtpHr$ht@c8~!_UCjmC_jC=MQsVQh-S?wtX3^YCV^J!hnOp#Z_s>N%TSt6!F4pJOhmSsM)P0y zdoWV8hCY<$^&c+BeX=u2i@qG@gvnvpKKyWKd%BiT@VC!t9C3p?6g0Kb*i#-R&C`-L zvT>LDe*n&0it)oIcuNMYK-Yp>TJTKq&m6)r%T-Rvs#ow$GKV}X@TQv0)Sj6F70EbcQ@YcJ0BoSIrOUH-T{HGZQrKZxTfX6gpNbmP=v*EYNGj_y62GwEW4f*yXbgyL`5t240U&4h0*Y)wsxc1N`l0 zNzxJ*k!>>NxgM2^7DaK>_j_NF$5xuy-Z+O}z2Lw1Hnzj2eJxn_H6gkMfzBu=1@2*21S z_kf@Na!rJ5JSx|aUlryWj(iniz*p&muhQ2?Qc7sSez6v^U{77CjlAdNP#?jym1d+J zW2wc=G-)t)Ycyn^!>)<;E8;+{Xlk1W+R)bQwKmRfiL^mFlG=!_^T`(K_geT8usSqL zACbzT9?-EZLp`QfaUJa;y}X6&;%LbBp+vNm@56QU^Y#IlC<}qCVr}I|gLpeiN5>d8 z;X3;Hqbkf!^cjuGT9nG)G#EFy57*Jpe>%|TCX55^yIAg@I6eh<>%4rCCLc-ecY$6E z^kVAHoKWy)v=e^s&A%Y*oi$=6w;=xux)WZNwpXT){3-jT zVhgyE-mcT-o5BvdhnFFLEw4q75BY0ft5R+-YH;9+9?Xy)ymO6Ok;MO5E3M&H+R#>; zU-QtO05xiXe{C55cOM^m{o1hWKR;fJ+JhsI{C_k8x&JF8AYEhx9>WMc79N2Gz&QHa zJM6k(*a-aU@&6kh*gxrig9o;STN%y+yD$Q~!Xxm`X87Sz*GGq4|7r739vJn1Gy>WG zD~)9XzAj?b@cQ6%@HXp#_An!Om+wMV7&IUXmN{wOzgodHHtQ6q3Vf{ zMH7izd{bvUr|OIz)bCMs#w!ztO3%d2Bk2mu00d+q4%Zd^n}))R)s(QliPjY-H$|`* zNmsn7*7xvz?j@A{M2VfdWS3HE$(Yj(auA_Cu zJu1w@b;X@16-~{>xQ?b~#Xz5fx}sYeSyx2EIs@%+t?=#C9fG0Yb;GW&#&vZ0$$+lb zUyq##n)bMR)BmRAaJ1?Jj@FU1$4=LGmmC*wr9RxsaLEyk;hyH9)O{Y;(a)c5)+9$Q zvS03nAIM{u#!y;pMveR^y}l0D(X{$SbA)Hb*vwSy$iet~TD5sM1rT0r-f^cQIf`fx zb?^zMxF~{gE$mlXb=J-i&OJ_k^d(qvqP1A_@g5)f&fQ_(IjdFkog+3mW>tHinp3D# zy~7h9lC3=Jvu@}}qOs=392r@E)`!tTwB5d7&C=|T#0sZ&&(EnFH zqj!_1Orv#CtW&F3iPNv${9%Xll!%XlxIr(Diiw#i@X-{cdT z9z>?igTC=gAH>!8rJMdo_o!wBgY-Zp$6F60?-nu>=au&P8J%~7+!ebTgrjqKz{w_x zmeJF6I*X=-O6WWknF{Zq)gfx_q1DfP$nrkQ@bqZaz`Hjzv5 z)Lm2n{A~EpX<5imFQRjUwL2cf zs&I=qn|*v3{^FL%U5~o^5m_A^oo5rdixY$R2(Cv5?&6do>@V(ohWd&0NwI817TdvOCq4)q(waG_yeSSlV-p?783x zJ!O|_zn5EyN|E@6_HIAQ1tYmaI8xon8N9#ZdJwy!7G6XPqc_BX~1u9 z3oC9ILwtfsmqyxMqPE*#!38G*n*Uk5#M4&nLMN$0{EM^ejI=M7#+%|Y=kTVXf77x$ zUKGbf9S@zif85S9Deyd}!+D_5V?;SOTD&vgBL(u#>pUqa{b&1NDLUyPJ-k02v9eAV z&OqqL83;5^S`0Dk@fBfMDIcz_Gh!PEIH=1kt!Qnd(+8?rI$LohzRuf)=Y7Aj;X`{e z3j$x__m}v+&plZ0u$xYs>z~p%U}p$Tbm!A4o?&--rzoIn3!+h4jIL3Q^!8T@>sl~3 zDL+)}i{{v1PhB1R+%4GE(3^xnEr&E@9)^#rLz-nU$Yj<}PcP#9{ z9$Q#eeg3ls?p=y(@iy{h?HXV0=17iv@o=##pB? ze>T2pE_L}U0aavVHK?LSHwvmobz~9&IYm%C;W)hB>PAF~?hJjdgrC>*Oo)CCxgPxK zSnZq#!Iutb-;XD#qRS*UMPK2R3pW?MHC%`JvQg(iJYmocEW5G7@a-eil+=yWBjZH; z4^AJ_^Vvk|*(nXhhzm{_OZPwP=;=6&o~5zW7uM*vV~u`$J6g#ekM}}%W?}v&j#baj zKr~qPY3F79Zgezm<5KYM17~+7~Nw+Q{)7I?oOQQgFhxd2yXzg^3ZM7?+PS) z=y>ZOT(P1Q_@|zr@Bj*r3dNt(3D-7^abzz1ZA>G^U=8!&e?3$1|322Jo@l9^eeyJ4N-ML_4%PX4w=udx#_qadsp}xee04zXiK|TeQ9~BfQ;s9^pokFcE3< zO$l=-vjzP)z2U z&*o#=_p-lh-!qPBQsYTE6#N}lRGYBlFCs~{;9li+lHYi?y%C&ViwG~Rlie6KXKPhS z5*ej^ZUuAJjWs2jlN#PaQ$6F<80}ibp^+8DKaom&vpCa(d$iI>yO8Im5>CscT431qc7IDK zxaJ*-5Z$ca`2&8_njk%$b!@Pop%^Ey{R5ITp=mkJlgaUnJO+4YWfTtm6~a0mwnX&3 zgr;bJwKmG5zNSY3+)5PZD6n?^E0tjT^zG$%wtRqB35o`O8=ehf{|K!i20zZ|30oqA z=TEMLRnvt?J~*iQsQ*8qWr=d+o6@NrT(D;hy@|97JB5z=+WkgoM=h&sXsN%9p&8!? z?mHfqMCX!f?H{Ka@y_Sd)$NF~4=w+@Zsm0gs|)>FAr^r z&UqYcIWerOwLZ1Bew(_YwH@>~pv^Aq#B9ab7@%#tvGxXki*La5!4|YLI8;fZz8@5) zh2otZ5u48i+m;KKkCE6!;7YYR)JO=8)9f*HUQj=z^2{;O=LqqFc17>CgdDQty*Vj8 zm{XdD>~F2(--OmA`;gx8K>pBl?)ne^6uObMz%uF^uz`}AM$V$Sq4&?B8&3Q=bf%ns zQ5Meh-k0&F&6n|}%|GLPrufGF{>o{%lU*_m*DI9icyh6dT z5w!Ogw1;n$p!SZa?Hy6uL&*_xb(E^C-d9lfm5`|B>(JFST(y4(thxb3w+cmf7>d85 zrN5$nH=w|GZ?_7?UsWjnszQO17s)lcq4!m^_o~|7tKs&JqP?SN?^U#iZb^FB)oW`AMq>TR_0cIfDL z!0H&FIHp2zEDXgvXz3l)KL#l9-Fr-h;vE%=cT^})@}gM%4ek9+ZSQa4_TEK%@1niG zp*?)}{!MM~UA4V;)%H;GB3QkLy6+8O^&VPzFBItHA=^pT(;hckxhH+t7WPBFTo0*2 zx|JWkFQ*Gu0?Cdx%wJkPMaH1F$In&ZodRlp4EB$_p=s6=Z))G2;S7exH#JTBc?Qm@ z*ovI8ErXi&6z)B{RnxTGHc8dE=e9Cfn4G^!viNT3eLp1Ql+%cv%ni}GyJ84FG9%<2kT}L9koTKLi zcC;hw#QUM}8`ahse4OuSN96r#fsVm${3@O>@c1Sf*~_J!|ITqC-kJJ10;sAIbh za`*)&2P$xW9oCZT_#Z&O2XOaMQ=>o7(XH;GPwxy2xy++rNJv+KD}%j zN=h9vAph|>4=lNE^wOuO2<#hq?a4W3V&YU}y9|9yWsiT3|(L9?`|^ zjsK~1zL@>;KBWEosrWdLgeN{YW#vr%L+OIZ_t0yVKpFSw-&7?2e-tfAUZN@F>n<9nd_({nM;g)lye| z;jXZM8u4Gr8Xc7S(a{}>BK*`99q;<~vK1}`nvFyLETpghd-yN;U6B8pkC)Iy+DAaN zJE9RNek8%`>+9@;R2PshNxlO~ZtdC=_I};ir6sJBz`atGA0xpYe>GL(>A^k(+&z#Q zk?-Wcb*BDHmA$`z9J+IpCSzT%YTp^JY2U^Z+V`6^W;K#6|G-7RWgrJXhg0ic%V0B@R3J zoj8ojuXQBJpE*1cWBNx7Hucg`@*U3AJhjA^JXP0W02yGRUu_2coY@6KoV~ zRZXDX*Z4T13%)0Ez69TRz+-t^z}t}qTLKgwczEg^txj@N^z($KoPe@JkIxq!weXmy zw9}b9kuw&(Vsu&33S*>5Pp`i9jhEd$(~1-lV-_ zye|nhn3iv>V>ayP!29};2i()y0}bU6zO5YILxETYl_iU6a8;0ticx&@)<|=E)QEGN z8#1@Q9@7G;(BdckwefN{{;$8hQPpCt$aSvcjbl8x_lwIF{BO9tr(-WP+Oa{6HgLWv z6Qn@G1gzE>#|M6IK_1)Hc{RJ7o3OktMRUp)$034 z!oSq=eU*LwtE3KO)Mu!DXywZ;+Wsk&PyI&wu8X$cgYvXiL~?0xt%&wG4?xu9uA<1| zuf`8Pr}v*ko_i5f^R!+3nGk*xDaRe2SD$M+pywXMf1AGkVE>v2t$AXMTz~NNTGK&; zS${C4zW(6dtMzuLU^>Vd^#_Go!+|lzM49L9;sb^E8@Bi8B|gV?P~hrv_t|w8f#Ve_ z6}h4|O$YVHOAd@N`vI!X4MY`U>$ zDszyvKFU_B>{A3wf;n5^Ehgr1V+TT-NNo+g15)zmA z?~W;-fRR{J=aN6lNs*0g4ra-Tq%5ZWYD&6^LEEuBwzjCY&{C$eS)4A>x^`cgUb#%N z!PH+1Jf_>$I!{+-0}q>uhiFMr@zAq*!|>2~MLF00m}9&35iyUMY!5jN;AI2mH}S#_ z#FR{SvxBS)E+{9t7`1+#tuowt?7tZ$o!2GLu)pnidhV&5`d8LG(BRo^<9y(# z{W2%<%q4fhE*Ls4=a*^Yl7?~7O5QL~=aab~^{*I@ zoCIFP2~F-B!3QyAKVbK=KL47+P|hFxu`0I56SEM(BicTa*bYo3L;xc^U~`r-0bHQB znZN}G=ecUZ(=b;neQ==OkJNhguW$#x@Nt~R4LY0Ic`wWIoT;|hRy!N!5+~%8ANO_V ze3Sz&e5AfGou#oC-ACOA+&5w0((1ZwPs9FBDaK}W@=7iIe!Q`^PVc$jTH!SF<>FYT zSM&k%>Jqj9F1YUW~=-3oecbL-0{$fEpyMjpGF)fFAj z+2}6zG+1{ejb&%6^~#P6o$a2qGu2t1yED(BW_iYW^xTu7&3hY%zFxUz2j2aI`9A@( z-(a8Zu-R6svtMuf%=z7Bzs}3qpB!bV!Fa5iD1V%@-ERbC`x0o@(yuKE+rgb0H_t4y zVU{oU#M+GLX`+WWH-%^U+iH2@i8X3@ZH`m<2c4@xqes-;R|Z>S7^=Zw@aVUWf>x?@puAo!KO2(naLzYJEx|h%80*xNHApU51~8!+8#8Ri z-Z|nt-mKoW4J#{T#;`hYd?{=6*1uxv+7E0X@5@B_R$!9Hn%#7@#ogn7!=J})VjI;t z--l9v%DID;xz`k?%i3)HREW&-$1(Oa%X^|``P_@n^4A9H)vEPqMg*f~gxPsB6EPegsLt|Lp1Pt_ zIoZV7q;$ZTMVo^J@~DD67$_4lruJG6bS)n~K>AaH~<}?m}l% zcz!P(D4C*`Y)8qFD0&NhF?$-JO(nT7SB1WOks?!$$dXGDSZE_1`rL5Q;;c%U82_%8&sm|2qU0Y_K zZ)8_vrav| zeX?BtO2ryP54k1mH>G&KCaq|^94}|FcS=%=P8Ax;^iw%Gt!NSdr1-p7ADb?k?Qc4= z$~gPy&NJ0|`?gW@*;8ye^Lu~d9b*&qoPMA8N;aMO^Jk8wxaED^s#3H4a)*WFNIbXb zQb})*Nw8NfVON%%tL9_7Q|@GYy>(2s&13VtRKITS-u%1AE@sbpr`y_@sQ;0d?(LGP zRkQtXX{sF&&$E5iXOskMc}g1Vx_y<~qQqM5qn`5Gs?IButiMa)D)jvE6e-~51TW13 z9m^`ySM&P0ZchJpxk)i7Hf4okDY;x>{01=|@4b#!p&!Lw^w_EvVa>{)|FA=5qgegH zzr*hPv@W|GzgAs>Q5{#p$G$5PcJbW4(oLn%E$nP1jc?1G4@z2!#4`1&w*KI+9~Mip z$|`gFXP+(FSY}dZwv9c3Sx#g5CdRVL2_0@R@+-xB<}1+2FIJ4P8phVJ>oCGr=xW|_ zCu{dKvw5D~kahb!+SoQbW2>m1i7!gwmHLCBRTiuobk64SCiXLc_RQK*>~OiQ>JgF) z7CV2FC^CP6L4K)XlC{xsL6NP~QcM+-_^(B6gqE}W-DZpsuh&=SGfrRZ&M)JXI_Yk< zLUAw}C0o^%teG+Xj^srcnIET7?|OcbC^P@;xT+s!5=VRluGHHPII`JV&pdENz4Z=H z1m<67KER4u0!saH>^yc2zV97%H(I<5?Tim_{PfI6bB*@R>S&nxu_+H=G^|r;G;SS5 z6g{9)v^z}E2ULpAXQB%6Q-HYCT?2?8@y=tp;2Vt(cgY#Vi5YX|`e%<~wkkd|7X7}I zqPKrf#F}K~wgRHyAy6g1ngjz*tXI!sEs%9%!`D}%6pN+dqMGK_V8n2(7{^MLbQ_dMX-m+=6b z&r(qT0mo=yNm$Qgk7f{rQ~9??&&ed7smy@gmua+LmmHx(np2}g$cee;`3*4O^gr_K z^Z4_7ofx&*u}Y${EW>EecC@ouEDr4-aA;%mOxiAa9y4JE{Rc1-yzzkRDpu~c>hE{! z^xrR=>pqMbW>Y*Fix}ZU^qn_QavrnlSGmjG*Ock>`DJcMxH&5AvmH;NAEJ<7#e=ZO z1k{%TKaFz~hX!$+<80*;7Ql?VkE6DY%ES!fqYVDkXo4)lQ$hyu;}^+`nH!w;oOho0 zivcK>1B&|r#q|SF%+65fHor`KioH+}JGHAqZ@tfPTCrI-t5kS0JXbEpdp_{NJWr=O zONs9$55TSQ((VjxR<9X1i`B7HMJa{(Wpzv}+?ZeDT+YT7Zq4^N+_(=}v#OzNmu!aQ z5iys?)Zz2+;j#!;J11+Sa0%%4f_D;lohWykcc0gvpW}Sa>t@q!%T-Cb&$~;WuF~lj zlSvN5@xMwQ9GyDsR6dqLbC77Yax#t8Ka%IO8bG(rGsClaV8&|jH)bZVKV%ZU0l&MM zEmrAR>b^o9!8*_}8`Sz{7ze4t$&8y=^*ZS+G(=u1<8mCyuh+(tzT z=+B8>i{g@h>NnIRN~8%(`K!g91@#BV)_zo&UoHi7=O`BIELx5dr8oCiPTxU&?k}x> z#a4S7+OYoMytUNt6eh_A`(=)J^n8cYV(%VHn(P+?{hmp=9=)!0o7G<5_Ue>z5DrW}bYj+f7m560` zg!PU&tar$|{QdxJIQPSnWjT~-Rm`Bmi}=3NZ&XamB{g?vQa{ET>gms!Tk;LgZTY_% z8_SvtUO3qkn##sXYklM$E{C16!G9U!?Wa=t*xf0D{n=E}u6HDk*C=Q#p>}?gdAjlf zeD-+Gq-ghbC4|e?OdWgNKY;}@ljKG6bv8%d#8KDrm!)t=xUMH)ot;}YS#E=8HWPE; z#yYZEYYV&lHx_;Ezlr@R=cs?5Zw4q)67!bt5P4dM_W>HZ(;U-^chl7s@?{pA%?Yb3 z?15Us9;oq%rI5-J9j}gg!}k)^J`%aJGG+&Azmvn4nc#!|3_j=u_@Jp{jYmv{pQ9F8 zr{?k%CoY5nISns2q)-$C<|eK{Ot@Ca(?cx6L)H+ABk@pZha*J#R|c=Oc@!$JXN~ACKVd z2F7&n(wI5$95qbiodMrmM4ydE^jrXt=xt_)1s3e->VRMHMC0tY4ab>_ArDl;**1W) z$$=<^^8!51nz@LC7TsU|S?xND}fzh7LDks}D^6-=TI#^?~Yn4Lcu)8yK7>#{4Zqez<^lJ}(v5cv^Qfo{^0pqUD>&! zQ8QZn&->rXX!EsM-Hxw(yM0SMPoW>;kq*xt>|FJFtJ48*)RDwb7B_iyY+B|h_L0(6 zeI=Xkt#{9HmzJ+~ADx`6-n(ACSLA-H{C>ASV-kNV`Cqzx>+dwV81?k3)xeL`){H%w`QLXW^=fCI@Ab@nMQ@!cl11kYYpHA5TDOHU zvX2;7t<&eZ1Lb5OEM6aQulG!2o%v&(G>&$4#=kll=Yx6b@azue@(7-d-gDJD z_I$=?K5NleJ{m8&{~{pNvH!{>%eemF$0|Jv!t^lKv`r>G5eGftgda)zUZ=mRtORy} zgYAXve?HT$N|O_ze@#~4uVClJZt_(~hN%*a+obv;(@O8gIjc6+N6CUzK3(c!n@Ua> zj)O(}YK~@u&W05&QFPCKiIY=i<&w0X&u-3*kvaQBM+`r~G1_{W<5#@Jd95woaV<`j z*khd_WP>7D#|-C}EnrT_MT1^%{~$RNzc@X$^IjTfPju+)pQIs97%rJ@Kbg!cr!&25 zlI=|L0`^<$yJ_?c@*UDuYv;ex`YK<`q;}}nEAYwwXEBAx)|HUvwnBr$6URHQ>R++eo!QNCeg0hg zIL90|1#mVwXV~8uJA=LH=Yj$LHD4BcuKJ{s32mMj?-x0I`%dH%W9mf1rWTf!f;$kw!W8g88rK9w@HPd1DZWe(xBFKdqCCgjg}_p zcG0p6nv`rT8$U*T0=nHH`AsZ_Zt*b&G?!PnWu6RWlnxS=b`;(ZcQOp5FSaF7c6MlpCQ2m zDQwukO&TR*joI_i{!AT?hLjO^RimNO)QYVoi0_c})p>$Bs|&gBJ+yzE?xFpcLp!ah zqng>CV$^$57m2MLDy9gk#UoBVmGcw!Rn7|b(Eb;6bwv|oo#!X){=yYZn3}^H_V1M* z+HZp1yI+?FsZXs8Z=nP+aINQu_Fu+v@Y!6xEk?v73rsEQ>+Rp}zc3evH$q z6yp503$QidQP*3SHk8K~Y8t9|L3Zrc5j4~xXsAQbP={t)RSi{at#vla6Tt^$Q++co zuvoRyLY4283|eUmm=+y~w$ehCEWmLW$d<#bj`*os%Wq`PVa@3C@%&#ozxJ7@UWJ(a zKQlW|o(p~DOO$(jCiM<)PZD{Y1S#0ZilY7fRL$}_RQh{ZT_tkf)T`OGu-iUO)5;Oo_>%S!Q*l0oqN(g$gF?G+=ZEnX&z(Y7QN=1m_aj#ED-~)U-rG` zTbQBg=TB9AP*hugu;r0P`5tJxSz%4*c936tld7xA!n%t5M_rVzn(6kby2@N~i6TbX z1NELM&{gReVXF$YCzEt@DZATy71l2b-DOz0Smi!7neIA(!`;x?h3?ViYusrW8paDU z8|AgoS!6>*be0CAu4ba@v5?M6i_%%;?uPPY)(M@}2KjbUjjgRzbrt#76jzf=De^;+ zv%$z(T9Iz5Z~Kbv7R1pe$?t%xD%MamZFi{wyk%AO9M%mHR~yF%#T>@nB*>-wZ`26e zc*y$q9JAOo$b^11#`c?0^AKNaV|TNk4~wyRqGD_l)EL|KW^NI7mDnAKv8k~iHOlsG ziq=9l8)Lh1Aj-CC>^8(o+7La6MA?>vqipZ0Q8v*WiLzBhMcEu`l#OCYU206`AKx*` z_IOm3?M2Th#w$NTw8C6Uk+yZ;5@`#BBW-o1$A(1O-j9m3Jy|qToNZ?~&h|b=bcs`o zgw=`j5ebWt4_3%l``A0#^%!N%zg@w6o{a+@ycTC`8HlsZ|JFF$!)p91Ejd-y0d~GH zs+V;Rvd(TuF;~d^*)YeG2Tc)4isa0Pe9|I0tECk~;%yrdZ@V4V#vGpjjk@h0J70~u-8X6l+c*#*k=4k{ z7N-{ZkWy+{M*%l=Uxm&3AEVAHW2^^N3cnVnaDxi2JTf&hymVEa&B5xfTM6ahrqSxdw<|EVV z!;A*Rs3`LGpc=6v%;&R)aNB0mblMVmz8bM98Hi<#6nmQy6?-chC^>&f>@6EHn*x;s+>Qt) zk=WaOb}8Ua$!G+IV}Rj*I5Y~yIVK|39UXgOM&340*5=Tqh}Z4)*3z0qnCJcZxz0a8mdxc z=v?I+bEUvoquy$Dl06Z+&+H+;gPz1NDR7lh@Sas#3q&hr{U+fm8&b|}52RA5+FU9( z(=7%5aaQlCbH|r`ks0Z`sdVJNW1PA0!>o&>z&IoFX{@}%U>}W~;YhCrd%T1Cjlb2x%;Io|(g1em#?NkqsQd zmmk z5ElD@#j8<}B(t1h&tJ?`Oq4qi4`>o##}I!k_{I1zcbqO9Wwm0}0vNG46-V+wXXPfy z>4EEvvDVQ}FZ8_N72p+O*XCTi;dJHcqO)_zW^bOmcW!ho+CMKFTMJCqbd{#3F#1W> z8&t?$Dko7tyF7M-Q9rdf$379cchn-S_53>b{vmCdl?%mo19Ah3#|Qp$cD<)x83W!9 ztrEP3>P+^SJKMd=zQvthzQKK&d6hkxjW*}l-$~Xp7cxVlVIumNJPGVS-1Y7$EV=A9 zc!Pfo`?-7>oq#Y6H2OUt>GRjw|0-TCXEKZZQU}?@ck6hj1Ls~3K61&Ez)z*tOB^}K zq~O7;qVJDvwCSk7a0OXd54-O$vMuZC&RaA9(p} zqvxFB@WQXHuR}}_c?4yWJcbdLw*tp_tQzkGhACL_PY?X3alUspa%nEq)wuOF2`rQ8 ztB;v~=^n?{x$EsUicqZcuf{(Orw7QPZi zz zXN-z`!-DtP4OT_ef9BWeJ8}=tm6=AbiD@@wUXFO#>hOHL5%kzwPU`_0MfRzEAIh{t z4<<#~Ft@V%OJ7r;`4BNDnrYU|Zg^-%!&EfGx1y*qWfSH@)(p=jyi};gyL^#Ps5cx) zK`x>GAYVH)mr&r|%}J7Z?*oPVbFm_^rhir>(@=kK%xcOM6g-03!+$TgP~a%5P(X0d zt>zOxH!Po!r2iPUvbD(?FD4-8W}`Jm6p@{$#li$mP^B<355wPrnrlO~^tNQo;BRK8 zEpXcgat%o`Q@)|jD{!hVK`qKmjAZnE9F~Euz%*S8WDib`=(8Z-hznYDg4~fCLI$vw zDMK<(lb5V!XvxpHZ?fsSa zF=nZ0vs6<%Ie||)s4Z$mkKfcn16siQQE-1nA+?A1q;ydG9%OHO_Tqe(Dq-Dhl(I0Z zV#jwCdP~RoVth$m1z+acV6vMWGg)o5RjE=TS)Oln?rPzJcgEkxhW4uUNPS{7mKNZInHJR;N+sD|P%vaWm{zXH7F_H#=_(%CNe-O)mDs?PgHw-tR~$6F3yP@wP0MWw$v!@VdF+Rkke5iBP3p zimx);tr$zfo5oYaTa!S~gmE@-bQ%&t!Gm^P9py}DT3E#eZH5SMlH8fzUe4-qH>A#W za4g1ZdV2yZVs%xYwVkfyf@T#bjh7GQ(i(|Z;6~BmC77f+B5^% zm!aU*7f6nJ zyCq#svtL1*wXuTi@#ol$@MskOE@>v~s^)?>Cvx^JLbGoUd*rsnlNUk{`fW9~ybbE_ zm43wLg4+`nKXim+Id-)iIY(zp{OR0kX=Y&RUJE{hQh-J;nYmS2FiZ*rwRW7q6pMt2nEqpv|A2_h9cyL9D)JN%$1o zJ?dOYkpB)2i-F!t58TChn#aiJxAXj1aXcs`@J7ew&~(XCdZ2>C`CD{l6hN^tD#dc` z!n)U-;`*BWZf7n=CpGqnWLBC^>aeanKCqBW;Q6XXOCzr5SAg0Mb3t5Ht~~)3ha1>G zY^S{c=ixPQlDL6WHn!z5_aZL%Cbxzn;Yve+xrDEZuUb)ZYg?#V$G?=^pF18qV}ue0 zJHX;JA!CUPRwr=w4n*D>iYz7fm&ZwFcAdSUfWbqI0}Q{%?hD(wd2O}!XHp-|M^CkS zMKGtVr#>g3t?ZHurGG6?QR2`OKTj$;RQ^_Z+J;c@H|JdPyp{||vY*-9MOkIyhKzL^ zaTZx3VCQgd6~h@~8`}_%BK`q%try%Kksx(g?wJ2);okhfEZ z&wkam?g_zph_eq@Q@FdMj)HreriO+}oNERjaA zFla>3dsoZk4ZGS;wY%DDpj+~G{%|*q1@+7Y4_hWbJH!4_a-^NoCL87@>2sr#bh(Y= zI4bdVGK~U3|B{hx1OxX}i>tK(J84YLiS1N!gFq!*txvV^-Ze%6>j+fN!cAo3!&>UU zXHW1BYLy3<8l0g@3oMIR=D?jfm~j`^Qxp%^@`H_>Bu`^9JOAvoe5;BJ&)+}S#muor z2TT%0lt`9XN~&2$Zzyyp_Zu5GbwY}qzY@*E=Uo9ZyigJbuO6J+Yusp|6{#&O}|g+ zd?(Byot$-IFSgJ0FEcwP1z4zaK@PJ@v#O|E{lS#l&IJWb=fPT<^vG>O?}d=N%DQy= z$v=jU^8IPkPIiT|Rr$olPdl*(yS1|b%f~*Eot-1FFWShmX%cQuzdLS|qaaYT(}vH3 z3)Y_ug^HC}oGLjXP|n3l(@}F0WKB6&QITbt21z96XBA|b7spv0^I@a>vBE6Pf@b@k zVvwH6y-mqF;R`{7iiX8Tsq^HQ7skl+6mrFAk=EXpaAJQ5zvFc!qgVhE{1SmO?`E>E z+P>f30iC!=n0}%wB*~NF98RVA4vcRW`nNdvf~?*>A^XzN3NP_kgET8fiOZK1W}eA9 zs$KFl^jc@`Ya7&6Vq0LDTkUXm0&IObNCVzWAwW>~3^;8wsq2XBp8 zRiQMCe1gNJn62~Brp<0~%ntk*QtZbalWS&5I<#S`$(2f3g3awj8*^t%D{G2vV?Yz4 zUk;P1`r1DB;Z00aIDA<9itPza-WD$SBY4?u;vf$^Aw7tCPdYc@{}Vzn|FLh3qogU% zZbN_fpuc-M42y5W`uo*2sS@q6_k}D6cs=p#@69e*dln}d7JHgIdRK%vWl~^8sH6Ap z(Da+BR&31-HeXroi9_t;3T2!%L4nU~uJ>e}=nM(i5r^o7OycPH@O*@rm? zT4L2sn>(B0YSk959ifGX)E2JwO8lh`vdHIPc2Uc#mLmLLh>$Y(o6J|v;RFgQ`HzRpcm?cdU&pN zVs8>>!I@~Bva7wOZCBf;s_eCJ&$SaoRF;=tGLp~Ofb-lMT1p)hjpX?lhwWq%H-4$@ z!zAwbGFUmi4z2-~_@sb`%WpYdl(1mrGWl($nhfcw+ZwlLE3r#?-sR-2)RM&^*i%Iz zHpMwjvBS#Yj69FkcxwXIAYt%ePEV`id7C3g?QuVPEN?ioV1O|5+X0-Br?+`(nv1 z^h%tyHCd;4n!RW#**(Y|U?>@cEx)i0Y=h4?==pR*rKu4(RROUkdS;3{-xrJZzxz9eb3SSGde%I$3}dwSZbT#aan zEfa4FbnlG8=MMH#)s2BuJGmOuR5QLku~x_0+Zs=v3awty*n27G&NWFd`#xV*56PSb z`00H6nb(`Q3H&%QR&JC(U*=g)+_u1WHhD~5 z4&&#Tadt*=^JmNQ*9*8mANN!8vcvahtW74ku;J^iS}U>|JEAc$n&y&tyOK$6@yndE~NY{XzbmG)+?N zJ{L{})S?s9zjJiLj+h4*?9lx?3y)%YJa_(C>SMh8-;05Kwa0|LaAd)W`fuxpth%p; z#aj^9+KwzX=fu`it#wwjkRbmwcl4%7FHC{FpjgT;0r?fG?LE|EuB}c+w1naf(O&29 zR?Oj6mY|i9qc9W`_!79saFM9SCmrMs)rO-Q!@VK$gvcWzUuPhmX1@{hE)wVBVsC)X zC4V`G{EToruXl{(ClxoDYVHrP+J*8c30BQ|RuT`7m*k~gngI{TK02$fqdf&Elo- zA7>ydK`$AV85jc-KBMIO*xCUViY;i+$n^x!WapJhtXLIdc z$)Vuq7m`qq{I@vxJfYyEaBDp7?rMP#h}K*i%!(GtBnyW4$$&W7G|VI&vgurM3d*Lp zwh)Iq5@gRt*QW6=#7KFd=$fP~L|Y|jI-4_Ia&6*ri;>N46v=Pug?GYiMp!1U&3Z&L zv>u3hWFt*PmKa3=!#t06SL7yR=3Eno)~tGa2{z6?#i2&j>{mEHYT4DI=>{?D$cZ$ z=3J2*k%(j~(Hc2mVhp&QhF|$ro0%np1IX{q;^C#i2O%D$HSK?><8&`%&J^r?q7l|$ z{sY<_Cm?rOv>@8oUl|8DfA+b>7UTGr+XVlNB-%_X-Ch29jEb#T;6kKi)R$W9PFq{j z;;T35I5|a5l&8muqHgNGvM-7_!zkfs-sxqj%BGS;S@$^3-w+IkIZ^kh?s46tIrfdR zN%#@gW^!=u*Y+NRl(JE`iLUX7cDg;((yZJuN@Iy0>+DDK>JMhG)*nbPjz5r)mn2hb z`bRyyUJ$q>MrgtGrQ?_G zTeg2$ZGhvf8xuEf?}_28dgGCV8?7*+-G**&wm~l>ZhQdyP!hb7%130^3JklNIL}6$ z>y-TYGOKJ`n!i!l%;j?Svsm3GYGK`uovF6U1zsv|tJ2B&8(~YTWzGzgp>+{zjc2Lw z>aDQ;IMB~pm4cagI(cT`!iC&GZEb>V34|^f@C#)dvpgc6o=q!YjaUl}RD+`&3D}Nc zl^ft?!%xQ*)+^L&efV0a;?-*duHR2a=_-OzTic;`VL@szczpt=TrcHgPeOksZ%JZl zfGJTX8!J<^RZUl6x)CtV1SE;F88BJ!Yn((-F;5nrCnFDmpgInyM&b9z)r}|5hiE?7 zsu~gVpG@qX@5I=_hKIijJ*@RldSB zGcd2qf)B}^c=l)o7fgum3GL?u9_rHLL%nmyXD5p6A0{bq57rS9FJKLp-RB+zh}^V|pHRwsRBZa>R;tCCBl6wmFL}_qo>9`fA!5 zeY@IPe5cwvu(xPeufY9sX%TkUFRtDMIdpA;PFbQLZhS$b1xc;&AKEq^#3&a=dLhan z9|QmE4(_X~JD6RcU1mIJb%$&GH_Fr6iILOE`l*6_8lqlBaz`)teVM+-fXoE1l8(~{ z>TWMorq~i3d~>&3=RtlP$J?$D_{|2ydTmQDt65^bREU9ZcqjalG{Jz#H11*NfOTp7 zW`hE_F@xVrUJ#q$EJ8jQS+1dA-FY5fRw%gkGeMRRIj5Csy`)JiXLbwr zhhW7Re+@nRYhnG0-mgP5+45?gvQnuArBQS=q+3djIi*SXita zb|0F%c2U~q8**zaEc{O_W27H@CW4zHHLn_>=ESI)nVaLPrg~iRgy!hB#pGf|ETp#0 zjIUa|D06e3CqZ_}cUHt!jg3v%9J}=Kv~qdDvfnJA6)q$2+i`x{4jy~=pzr$xxkrhS z`nTJ0f6aMX6*`4`+URK`r^P8E>%h}>(QEZMuN9?7&NXlat{GO=|1D+RD9f?IEPzn( zi4jUuZUW7FS74^@T&useg_G3010(VdLcw34MoaEF>m*Mt zn0dF0`zm=`rGQwO-yJxD)t$%+-w_|#aff|H;5ZK7I3E$#cBBl4vNn`m$XV<+fWIE^ zvfJ5Gg z{wKoo=22vAs3_%>Z%IlP*qhSZ^GHo(%6QK zmZ$Sua3y-$%o5@h7_Y-Pd2ZkrPTh-l%t0@)_)KcbVYZ@p^qrxLmzOjZ-?A9-1Py|u zrsmwU)mL~9m&Q~*RGMjvb7p$6+GR`gWMQr2ue%BjpBRvOp_ldR*(KO1;%)%-UaHpmkHqOSwWiS#5_$9SWX1L-Ra7G=ZhVE9|Lq z*~Sh~D!Rwz9vXw+sbhdOw-H7lBRrP~=a-0<|(p@a6Da~v4@V0Rd$Xmyls-DW6l3!R;Me1#pHU1*K*{L@v z27RTFo>zN0mTXYh%na&G_`4e8R>PVbu(K;<{qB)H00Ygmu|=z4+iBZC29?Bgr}|&gUg=;FW5;Q(1%!5Es|ww<-dD zS>w9>I;8=>jB!2KPk0jYqZadRpO4C&i9PD0QeVe5D7517d2D~>4Dj?N4xQT0$FVxK zm0o;P8^>e&TQoTqz2-i2#l4EtR@{4Z8Z3unHAoJ`A|JG^2vPVzwH|FL`Yh~<@57FD zg5-B$NZP}YJQJ&(ZAexx;b_6Uh(sMu;pEi82*#;SElz^7uyH>kwNG_Y)Swa4xUtJi zRC1C}uX({#p0ZVthZLkZhXauo2lBl1PDpV`g;g-jwOr_O*~QMZPhrQGT9g9ht;AQQ zS7D^Z1o?Dkd{zCy92>h# z*y(^1NQ2j@xj*C~Qa>{&i;Qx}kaNb=_dZNaqFk~M!)M8jPm1J_Q3l!Gxd+`d+1LIq zST0;}`9MqAfh(c6uJr5h;qWbv2JG{gKS8W@0!#`)Ks7= z_*M95qg)VpKGTK|JV$jWt=1Q{MfREj8onU#7$ADAtA7X8)u8LZ?{xU6ljMAiCXbJO z>B8Hx*DYz1*>yY4Eh|Q(dFO38>q5bfP#p9Y=SPoz9$7YXkS*fCx%E8m@czAajVz7oO~_I<;T*WWc$4&7jArao zlHncJGifGpSgc&ZefJs#0hh~$5BzXYKsy6@aFhn`*@211KXKrmJXXPlf-5e#0(-d@ zjJ{^;^e=81W=VzqelZ(u-jE!^Q1IgsN=EqK#o`nbGs}ba-{~~ie`*b3-52obwfKa^2^~!c3&g3v)=KnBGkUAC*%}osj=a0}r1ed!wvPh%*%Ne0G7#rS^LHVK$XZx!w zfyC>}O;gkeR~AcwMc5IdtUAgU_*WZcdxe4@{exzhX1jf2Iu9L;nW5&SPG>W)&%|QS z5ZBt1&7&-Hn9_oG`+Q7qk`&}ab4zdjJhS!b<4+^*Rv>M#<>lB#WL0I^HkgYQQ7p1sL&4{8mw8->B)apjf^S@` zjK)}hjVRca(50c^XaD5v6GR68`Fiv9-WkPIf~?O&D3L1O>&f;$JlEBV{Q~U{iDHsE zo)`6~_Xg^b*KSoaJw~hWJ_9T4j?kcg9mzeJw0=^)9sa_PJ{IJBNGDh`7#r7y{>n*` zsOS+5Np&XXCpZ?jQtZ&+uwm!3H=oC8PXauAlC>*hIh=A3sC2E*F4@&G5&1Ec9RulR zn7DpQ0beq41L@#Xh?quMG^*rGkn8P<;=KGs2WE&);1ik*j#;^830Hc7Kb*s3{B+7F zX9@ovOz6*dQL>{LS}$MdhDL&bSqm^P*&I+FX4($0d<9S z-ZozCBY~bEUn+8{FUeRFckK?BOmWH8h$26cTW^m6@8Qf&b?3;2+(UD5ezV^o=@gus zg7~Z*dlW-K*D1UQvy%MAJ5Pyn%+g#Y@g@h(z^M8RCkAC;A4H!0Qk+IfC6rTHSUsm- zv8R5-F1RI`R#8I1l2i8=_u;G-?JD%)p<+5`FcduV;ml&QS|S%UVcMEZM zv;$EO!)W#|#F$!(LP6nOdL9bi^L{NNfi-H2m&1EHdxw9ZW+?arJheE|SWU&*o2bug z{vUg910Pj&_5ZF(PRJw#2oPn!6b=+HATL9tG(_OZ8;~G`5W|vIB8bS}QcNiVB6Gj{oSD1;+TQ2h`?>e? z`QPC2H~XCZvew#b@4fckYoEjX_q)K2#y9j--rm!PPJUez?kl|;<#dmT*(#2n4Ot>+ zXpyKd9bjeE)xw>XJ;Cr=-5FjN-(af>XTQT%6`$6>VY#T6i)9F6yM0O@)~#PDwJz$9H4-T^V7D#S>+q(#byj;By=2&Jl& zUmGb)KBb?Fj3wm!;gV-sJ|EaVKL76M39PZke*TF!)SY0D{o)g^HEdT8Rd1>`ts!9%b^NYnH@O>c zunBZ29o~tK_GNKG#j@k|5cBy_Z(LY;*DIbFG`BOp7P&ZBbTIBGW?p6I9`EcdH+bor3C!cm!D%Qvnjv3@Zvx|_#>SJUH}>kFTE;DHjN-Xw9&!>)ds zS{+v&2v_g=lfxErxy#t-<%J2nTWN;f>elob_O{M6W98E#v!fMdio$koJAO_tgbn&p zyge}Fo;z&m>bp~SLtm(mO3n5rarK_+{|~EouX`#S@=V)kd?V||+E3;6YN!$Q^`h{) zxOHlUkxhl9T6`@g*xw4%@enPNpWF4iEE!%+g8u2i)*;6 zO1RSNit5zejoxW9Ecjo=Gox4GC*SOr1IK^Lyq;=?xdSYdwdTN%fo?7s+RJ2At zQBbpam&@H;dqK3^ddlk@IVoLzn`?=+y)TbgLZRuc^NC69i|p8tuss~M3!Ttx_t_tG z1nR#|oa@L#`nx=}XTR~@iLXlctYAh}`jW#HuInEC88g)BaC>Kry?fZ#JtXX6myGD& zuugr=vxfgG>aKaBo+zx@0)71(D!fl+s`}p2gEMH=Y;Y%!*c6UW8er$}Ue*Rt2_b9GwobLAe@U0I!@WWvYky>k-)MV(%86z-ZfxFEjnJQHzeNjS^Vz6BJRCrS1>WqZCJ(BfmJ|jf0X4_>A7))f!!U1`5I^%;*`Z zdPF-TyKR;F2HKC^Ha*lG`^CrJr)E_=8%`_NbTv;+96Fp{H1_k4Y3&!g;HAm;^43u@ zy-rqK!$48r!?DIm@?8-R+4FMM-1rxi)YhiBQJf6lk+5pqOe=gevS**gF2w^D^+lZ> z?D2kU3#cvL84%{R)nuuBEY{C$may;$lg6(ivv+jE*VFt`+expojGz9tK`+Orr$dCv z9sVhH2YJqArQn3EBJ6NPo2+B{N@D!QX66z^%;nyg8G-r;ddziMc+23u7LU9`t?gJ3 zDcXr&R#xrj2fg|;Mv7>SxPD%Gz{}TN6jwK-h_8P9D)ME0BYFHN!ej4{<;o4AFYu>R z=PR`tLB!QaRn$rXD~wt@-@}CuRMgWw8)nhl2HJwN0tt8Eq*vUHn9K#rpWYJ3c#`@x znv$;KJxIKJBI?dQd!wEEZdP4p+X|@Tt`QTWUp`}D73Dz*VF9*d2WtPkH|rd!VGLS?76$!g!k zoi$o<7iMtxB%X!meRWwP!O42KWa-bSZ{qDhx2#6%Y~Lio#nO*b+OW1Fr)ScKx5f9(4jHgq^&3J-sE<>z-uIF^V>cEM_K=#$fHXIBKZurx|`*;gLz}B|*!*Sv3DsuOy1-v;iD`4xSr!9>1afvaZ zU-d{%?1^@TM8<8Z2&;{_m=kz5T;jH+(k}$O8Jv~UP>%IgUR6n|kf-q+!;YxP@^bLe>%WN@%bJp z4U3>@Q5AEXt=6YILKE-QC$93(Q97aFTB`SW(9@>!Rxf-b9uHl^1=lB+pk&E+xqBy7cZNio;H0qOy4@+ zo@}(5o!l$s+c+IpRlk+faaCQTD>Gxh_`s_?-IK%mv1fgVJ?leN%FpNB8_MqO_q1)5 z#mYM%xU=a7enrrDsA>xP9q;y3{g2Ro7gR4llY}PL|0wwdt26nv{hNOILO@ny&2C+# zdf|p`RRw*(m7G_5s?$Qjw%OQmnyr6B2KGvKlQ#`4iL#G& zYI-p1zEiR)9X95-9qA{P-I?aC$SO>1V^uUrz*CtT@2QRb;)qw*D;)YWik@W3Q>9<) z5k{|ic5sGWeT_9V-8ctH{`A%B)fk-S?T{6qhdEW6K{xy()dQ;%R;hkkPqwn=U=3)v zE8f05*B_{t4p8$3bwbK}y5E&6^hZCcX7tB0 zun6}|I77@O@0Wb>L!F{i5(C15ZJSO7>4EFoQZFKS7f2jb zhO?F#ZLFs9ZP(Mk|LPmxIVW@NG7JBpZuYb^H9~jKT9_E3U(K^b;{~Kzls#SlHZPDe zhd}qGE`fOYv0k<>4o?)`wYYS}w4{a`i$^zDmb{gu;lmV!6%}p|aldvdD!i|*&Ly;& z{#K%%7C*g!o;Wgc<(WYGBaJtT*qnWk)k>sihQpmdGQt*L*y_B4a5z+i*iPq(EJ(EK z*F529YapqE^=|gg_=E-Gv2L#Cnf_!&L8+WQrVLJ$DIE;el|^95va?e>Fesc^UyMCK z?cSg6iE(#^Z51GWe0 z=|#3_QBMTv#vZ}?*}gYCDDM{j$enk=>PnUg_I7ZTjF-&SE~dA=X2ZYTetEFTfr_uJ zi4us#Q)h>f%1^7hKZCK+`r-6jZ-_H$_&OMDxKKD zL9BGy)R`Z@ewkw--_^~l-1qU4@aQX9@fpna;cI!^s#$#HKEukpZ2Wdt%XlhId`4*2 zs#)QyR`4|tR&|^9s9MJJ=eKIs^0JzOQ%`wfj&=lq}Hv5iky_koE@LQdtD`1W` zZdIjW+h6T6oq3p*o`|(nTVQ^W-Zo#I^lazW?D}}>EwZ!ShKFJ2Y@-z;^CC@v8dAj(^l- z81Ly}pH>UEceR%%TC&oNH~!pf|FNE*cq;D7j<~E1)C}JKv+v=HyX5o% z;$zh;3FkdR67X$~B`p!t+!h+jsGU$T*2tsXzK)MBoAm17`|U9=STk&_iT(LxcyuSn zcf7~E(-Xfj-da~%9moE3z!Ue|lku($j-1dS6gp7w&M|%k1pD89As^OXrL=>6%1K!2a~X_IsP&M5KCEbHC8a z3H?#PJjKsXoo@hfq1C5iD1VsQCS_Fz;G|mA05&yBBh~sTnHSgwMcVKvEzrs z@ds8hD{{T3XC3#i#d=TgJE+zb!`xXTUx01V0x=2tiSgVB=T*4;}Fjkda%WUkLtJ;q&z z7jy69%DTgk>wWbNqJH>>Xpvp*-`;-@`>1i8SdOdRLhOrq60K!k+4+XPlu#Gmw3*DF zHoZq0w5N@m$-DKROnbT_!D4;C$6e9CQ~5`ao?&3vo-WVmzs#Qy(kAlCrgHYVw`5-1 z{pk)QWb2c3b<=2jeA?A*#tM8SU*@9RL`HN;?8)e^=D11G8$UNrrZb*fjae?Uh^!#} z8e?Q=merk%cjz?wQoSL=VxE?|!fC1LX(8_WpS~;l&pV!_4sFR_cR3t)WmCM>n%2x+5N+ns!aQ61>Nsez*<&umvC6aSglJ>)yrQd3LlVtbL?a zXFkB4dgG4rnc7ZhdwmeUYWY=L-*MIK=p7*)!|8c!tZ9Ee_zA1yV$GEtJ9|%l4>Q{d z-Izz3?;h~)(?&IX%5Exa5luU_=TF?aQ>@-`q;@PjauWC21olM@UjWtK{${*iA{b8v z^NlaV|IIZstd>`{ymFYeol&g6Z>gHZR|qEAe~Fz@lz5Fd4g^N@f3=U^+A8{%aij;s zAeNGvX(o4#*v#mzR_aEnx%S4*oWkn&q_T@boNBer8r|=yUuCX6i@o$@IA<0D^cy)r zw^=)A-W^o@DF2zoo1&r{b~f(3v%Ttv97v=lOT9~J9OLQj-fUyO&Ej@zgNj=G{Ed?o zzc{6KV%p=`tn90|urHGtEAOzGA+-m(jc_~8KXTR^d(hlhRJ)4m>^SO zk2bwrLZWS19Sv(VFoL)0>B<+Lw>3qs+87A`lb#QMJ|KO`qz8y7%<+ z-j_G_do@0-pvC!1f1D_0YHGjs8FFg9U)xEyvzn~-jsNmjWif7UI-{awFYstu0jAyh zjuy_2xzgpvnzW7mR?Xfhr|+;V!3I%l@69pugSw*ef;V)JtV}FH)@^+D=}0}qIUL*c zn=WcB44)c;by`t58mn}SvP!1~VU@PQD$PtJ^~zwZ(I~9ZpJR<)=`ksK`5FA{J*IVL zLz*jD*;Do?Z`RBUH^QcU8jm%gPTZLG>nB~}v8t8Lqa@dww$K)|jn*YBffERdzJL1Y zQ`U1uC7%DL)jUmk{wu3_2K04W84G=O=sT3SEiHU{{8VK%U+R%yUj?0~^150hS)=WW zufVyyRh&TVYKHP+LxBlXVAV$;_JgkA5# zsd(o&esP9_xA0vyJo{B&@~zRAjH4Iqg*RMRY*l4lew5j(p#n*&6~aV3?NX@e$IeEb z>B%nUNpIAdUdC>wIz47#o`1hR37-dLWj>V|pas{&~~p>^c?bVeV{yC-_cr8A8xyA$iw?8CM~HCPhCtI;r&{fP0kaI=7)n>-Ej#*M~nXZ1TnEzcbG3t31ePHWvO{|}y z-m$LU$-RIt1<3vdn?zzZh2q;<$veB(XYhu&;H&Ce6p!##GTY$<^>)IJoK$VkDLbpt z!>HNPNZvn@VArhQbeUwIlsG-nf;P2bpJ@PZc$R>_4erC61HbIzPyJb!blxQ?VW+zA z&4jFz#(5z%7q?@XW-n3iVm>y-d`o9QMhE9#dFy8AFKrXQOjWce^Y;4gOTBq*Iftt^ zR9t^IjdRx$7}8U{!&!P}G2U4YCl84Tu*W5Kws%dnwi{-=Me!kdDlL?THbA zeBmrKYwKVY`fU$NsQlwNMY*E;&w~TAuH;nn|9-@IcJRcUovd?Q%$lA)(taiD&2g3x z8}9?QSbNzz^Zu4~asS8-N4^(xIH40THg3UG-h;*47R{31%8;yI4raB$$(ujp9*GO3 z9`26|o;ux#wGO#|HaNf@m^FWJN`uZ>XnkiW>yYp8c7Q-x$lSjm`W;WUoL{++lT=DZ zzO@0K8WKa7j6cHO(_y2TL;8K4j5}{9wTk7B-GpBLngX}^F|a7#QQ|7eFUT#GK2DJw zPnp}P7kWx{rz^+fbm_)(-Hbr`J|%h|r{0&ZA}4wZON%{jeX^@~o~t-?Vv(z`pfFF* z@!c*lZtI>xy~tBsN}|vfd3%Vgmy~*nbTeA4URF4#&@;R5mIf-BIjv^i**Z zC#TtUo)i&}-xIUZD7~OW3DfN^*O8_XXJSJ9C7<321Y43&~nM`>9}u`6$6 zAA1a8l>jx$Eyx>GT3#wrO!%%D_YRpGI?Yk6lq^PzsRicI1^vLCMd|Am#A8#O;{p;wQ3fzHgM@+&D^d9EGsl zl!q#2p2J<{(hdGv5MUN-w5{9aQRFCvjzY7Q{fkV@@|><*N140S>2f=$%a-XC%?@Xd zk(c^yFmh7_<6etM#U-Vso|5@PeA$_DzKKtofn%-u>LJ5p`=F(qp^Bg6zx5N}Ez$e; z@2}J9Y5Tg-8O7=ag*l#L8gHrY<63vS3iC?yRaBLYD2b{cD>{f=YHwbB`K_+$zDqs( zp=%+})t_qb0bI=KMB@tLYQq)GW#!^6EJpik3x;v2zyGsorgp@Km8-H7^mP^)#C$T* zXs@bg)eYekT7rxdr7eXOr+eb9(mF&5q)hXY-3ag?UYn<1;cwPe{w4=3_%tUb?ev?%V~c z%8cG$Z;D+`9nq8>PD2Td9_!ytOCRWjO(Lp`HMAbO;4IKVZsA?`slGKlQTxA>l5$q$w=X^*Yx-au_06ngIG}k zHJe+I%TQ3RGa#5llnRs-ETpS3+Uywh+!)oAT~gq0z%D0)kJ0DE=aiN?)R;+^sONeZ zpN*cG{>Sb1bqu%0GiuK0$Zm}-GT&8D?9>aKjvQaVZjvG?g>>@;PJN!oUFyhl$uuLL z+4ZX&ecg;K?L&Lzs^ePi!}UJgx5uQ`Fz&Qb)1ThWLSjGr@roQRp(C^(R_$JdbG`d|y2C z{#-LXCYu_mRf+xvsH#P^)ogBK7?u{ybs2Q0bWd$V#r3Dy_C1p97jwQKeZa2-Lps=7MAInTcWrp00R)wu;)SF{op3!1* z@*RbRF1OyNAgWKn0OP-Y6jY!`IXz|BZr4b?Pp%%-C%0d}5HYnKB`|CDrUap4kYA!w zt9mqsK9^HhC1o$*ZmuF&>9ohNu8WE>bv>vL1BTOJfXBwz)okSX%ud64Wqin|Z2oiT z6DE#MO-!cYmomJ1u;)jYlLP8F)>B%V@1O;n69_tF{!stsq+=&$WF*I@Cp9J3=NB+0 zBU)u|m*_>NnP28stp=Mk!K1QEht?8g9E)vh*Z?Vo6i8(*RHY{Q=%6ffsG%{Gs9r+V zWuXEC8SZ4XnyBcmau-9PN{ZU*xn+epMg<~lCj-EgLNvmYS4dCj)W`T9!U+?K5|zfB z^9;Hv?9W@ZJr&F7;!2o;xRj<$R=R=8sgBi8uC6916p_8aw2j9&Fr10dEPwyhLs99Q zd63@ZVSceGa(ZvG6fvh1Xj)luVY7Hk7Zkb3(`a*OpI%rtHyar%Q_bT<%x1eb^Sll1 zh(yWHOs}*xk5+CZ^ygGSVRS!*s(uU|H{<3})?7!qKh{mcCW2 zN>0qzOty&XEGTi%_{eUGZ+_e|GTp1M0CRBSZGBRm#=Dxhc5&_HI>_}Qmr0+hE0-E) z{Wg$M-n8Z#^xs!=w{kt#P=r|3&Pit6%EodtdUam|@bgVS?@w#w>94`2yGHU*WMXQi zKXS{0RKn)^NQzJ7hM#Xjj2li@xlyyc62~_VPc_HkLD>CjR94nM9RnkPeZX-0fFVP; zqPc#;6=NR|%`1lFmN8q;cI3>_X^sV@I;$bNvNEz=YJ~#TSzt69@r};9G6<-cCM_c1 zmk+m_q+?V_))c%HxQ20!;7Z_1=1S$t;L7A`AwQ-Wp)%IrFFS83$5$OKb<)>sBPTN- zrR&Z2nx}D1V;tn0?d&$sm|cDEGow#b^>dqasz4*5Pj7t= zM5~A_&1V3}_b}!wb1l!;TdVxdI7;&08z)hm*RWf6Rs>PiaNm`Yq+5+>z7UlTvv`BzZjB&sm=arSkm=iiV zBR*rwWZ$yL57`ucYh!eJ`owg9;D?blFGjE*j$=GcA03~hPl!)UPDvfDCrp|A!1t&5 zLA%GFEGa%CUQbEY)$H1T?^dKvZoPTS9c66Ya`Uz~{=NMC-3>~j3|(dA-Zr;eZmPsw7rp2dZU^L$P;Fdf8UVc6!^p@1O-XK5K@O+G!Jv;mjMF(zoU#-KjmiT|4{fU5D z+Mm9*sG2!rwlU@Lw;5OIU`0{0eNa^F$);Ct*;5#8$w=uN75wYRs-rPF50$I0eZl(e z`YooRMxMsh!?amLrFsryC)WY4V_avsE^&oppqn%++L~$hhYU-+MS1zGt`>7G;#$VF zl50KJi(Iu_d$_8(n&seJ!0K8-j$W)x8-qW^N2|Ln`io}Utf_DJ^P`Nk*2zj-ZtP>1 zvPzoMk-H)1Vh?6I8FEUWm=fAF4icbykCi@7X7c8L2F=RijWt$S zZz@a8vvkTDz+Qr}c$?2Et1-edZgRhbm2hkePa$&_#klXT%5;pUILD=z6`?)LNOtA{t)=Xz9;vXWIMKTu8)m1C5Xp@vt_d~<`vS7Uzt_ief;ThADK zo9mtZ1{Tx&dopR}k0xRfy}@UqF;<#ucx9MV^#8{FKCICB*XhhPzcOPM$MaUBu-Z&9 z3o)iiE!v;4hvT2IwH#0tt<43pt88un{N(@cL zcN0nGx_{I5N}m#QHJyavhHYus#5t%e^8nv04?SqoBRyBmY*aZeV_wU=$gS2`3+anh z*Avyx=rXaJ%SwCtberj#{~?P4%78R=p8F2ws6`}dc^@lV&Ch-Nd}fRRN?!`eUrof= z1S>0{H}KIhUkS?;yvvd2C@6%sY=<*f(Wp{6veA5FSwzeY748?Xqp6-3sL2I5SM4By zY(<&qDOJo9MO+ipQYU6io`MIqj82`HFlEeSg%d_kFv645i8DGaePRZ4GXL0Q$cFm? z%S0Z#={oic^WFi_>3ep`ckkx7{%|<)25@!1DKG!?|1V(izo4z+Up)VJc!>RhJd%Il znacaDPsUUEeb@rWYs{{G@VT)#SAy<*Zysu9_e0Os?2hLZT&kU_y`Uhj8_Gd|ztpDH zm?p}ZRF!zj)X>XR&X~p(Gbdx;vnAmsVXCWDeGOaLsx6Xl%lyoh?0=n?T6ViRqvm`R zgX;0W%EuqCH9bRa`h!Hd>6Tg=XnoJFcBXE=XE*MdyB+-Bx9_3ise4AS^*uAx`d(9V z^}|f-i_kKj?{}**Skf^5TE z(y3qOpVG57Txw5J?K2w9E7sgKVa=ow9`4rnx^mp(sVxd`|SQnm}SU8VEY!jIjs z7>3>3Q~a`5B36H}z&(G(w77RuL?a%LTgLR?GgA5TXnoIoqV9#VBUylx39I*|<}&93 zv)K(AWayb$vYCBT9xV#<-)l*#?;bkfOAYwrwWQR%ry?~+Y>ubWn)h#Wuc>XcEW{U& zL^tQx>Xt!^e?Q4^ID&h_ST_Y=jO>$@rxN#L{foa;qv}4@Rz)`JcLWWE0$c9ss^xU? zr)`lG3&Uyd9ASX8E?e#38+(cV)mYVSn)=YpMzcQLd{2p~1;Z+>S-#TO78LxO#5bjF zk+c=@x(t23>7H4hk;nglT0gHQ4NcX@mS78UONKFG84f*zd`ry(%dexUyjCtP(k4>Rpn=Mz)f}LXFiF&$CSc}v?(Rkf63+T8?moG zbuu&aYSt{jc)pMJ+oic(Tt%IlYr>#j0$0TSfo5`BZtzSXt)Y2F zerAR$zvg>pDXs6B4OQJ!b)r-F1PE=GMC(fS^OIYY$6h!Qv7nmbLV&L~k8A%=^j-;=BL z-b4$5-Yzahs-em7Xt^nCX9lf4KvEtGCoCTQTEo;+= zcJuubU*f4I#cXl8a62$|Nbhy(c6{FMHT2M2&tN}M?Paq7)?_K&MDSd*T*H1+`s<^K z{rKjLO*bkdTcPh!yFAWKh5_Sbkkp(fAJUmfANp=fB&!kslLenr)+%x-#s!=bg`FWT1Fca+%%mD_zcAz{L!_~|*m^p(lYzgiV-mz0>+zh3# zsC>Go40Rgg8l5-R5uZ5OnAVDZkA2{e?@nP}8$=E&oiXLmgj|Cq*eVu_MGN46{P{O| zjP)4ZPwoGYtt7xHhSvY|K%K)t>R;>ow-04m>a`#Gcg%Y0zt-{pVr~BSj`iRB*D{Br z*5-fvtpDCWe|k~V)&H&kD!fa)mEMQFOTEAFF7rO(UGDv*cZK)Ay^nf-<$cWixOb&@ zm3OuG3GW*3lis!7r@ZUDPkYyUpYd++KI?tX`)lt;@AKYG-WR+tdVk}6$@^RHX79`1 zE#BXGtGusxtG!#jHQraf+q|!Nw|igrzTy47x7NGETj$;B-R1p*cenRVZ@u>|?;h{l z-o4&;y!*WGdiQ((=sn>5llP$a&))aE?|Tn<4||VzKk$C&{fqag_apBy@5kQb-cP(I zyq|hcdjIM@~crSVX z>Amdz#(Twk)qBnRt@pb3JFi+3Q>zsLMo$vN`b9APN(k#_ZSk3IC+(#J%i*Kb066jt}&GGD1emDESYG6Nh9=jyT1|hyC&-UkYTl%n`TDl|u0d?_}g$M2VD2 znaq>_EDy0xxI`-DVOc7_kY)0SESF!(3i)q& zRDLCo$>Xw8R>^94Le|KWvR0mwb@H^VmuF;yJS)%1uVte=FPr2Ac~O2NFUfCZv%D-@ zaz@~vE#@8pJfrJyiZQc}lAp`%bz z<5Q`#0lxmAcbxg-0TY+MZQ#<6o{E=>Q$Jnsc6?%&!l2h*uYF?7Kd=7Bmw^*wCPe?p zel>Z1W#))COCI`k;vHqm*6q(&%{VCGEfypu7kHYGI= zGO28p@4w0B>>j+**kJ_b`3$O z0{v7b7<+a;>iv#(xJ;^JS&AE2F&D@2d|n`9l;~XL?0G36`DPQv>=+F6<=`$ToO6>* z2trf~X{RWc)@I@R^TC12ke8_aUJiY6R!kkAQn2wntZklYKt6jtDKD0K{Q{g6t~-zr~D*ct~rK3-#}y2-pJ=> zS`^zQl2GiK1I0xJMJ}~5;3~#>(v6p%PY=)=W8L2~*TFVja|A@pAs%B{hhNMr&+nwm3>4Nq(g_o}fvzoF;+0@eOyI zyAKQIW_#SYX_%ZTA^Dtq4HjG_hQp`Y#g`Pcs7s`Plm5FzY@C2)#MmgX8#SnyrKsD2wVL1A@%8QiX)l!VA z2Q#+Xd@~zq31=YbHrN7S;;J%4o7F}`A?y8~;yIFr1E}%^P>q^_t0Obv1a)LB zUwIkQEu(Xpn>#2?P1abh;(Q>CGUZlB2Mk3_Rj2k8Yj`bF zX{vZX<3_*LT!pGTVUyhO5_8ek6xaS9(U_0tK@;7nsZGWy1G=n2!=apQ6o+zlHV!s0 zcElTx)f$h3ZThBBqjjV~#6}k84nBoD2B|jD6kXy?NvK?y@vAncNK_0P9bu~?3m6N0 zUA^+-q1aZB7x=nX_kt$nqZ?O;^VESN_%u!oDt9NdGS(o?k=i#Lp@F8W zHw!<;k%H!Nvq_1}EofEah93AbYkF+7qo#ha)$Nk9BIT>2Xg4V{GEoVdpR_g}n(sGd zl#BNo18?h8@#dJ1lg+IU)p>&=UkjiS8OA}A9}=~Uto-%qV3^KRE*?gogOd42=~S}; zt2XN7__(wPmvMT6MsHXE{@YH*LcC&Hx{V-uvnQSG$t`7-ky>{cek3hiOAKETmg!sg zn$Y(e^t(_Fdb;eg+*~@@5@Wn<(K*ohDk)+BL$=NQD1Sy{C$;5GpF@o# zd+6qy1kBk1ny7JzAfE>Jm8JNTSXM8q#R3YP};mKztG4{v9)lU{yl}`q1SjL|^ z6x)j>vG!b}_^lQv)N|_&izIU`=kotn*z&J+sQF3D`zk-(cVqf)i%fr$OJR#km2>l= zNXtCJ38=7_1W z*?wygDQ4JS|A<85AO&QIt58LmT}*eCd&II2u54ApkF z$Vror*1Tr=BtSgH$57&~vsvUrgO3QxjC?%!g*LxxE>&1F5}8RncMtX;_?^_=`bfYs z3ps^9uDuXwJYU4~b39jl!OhQg?rq?C7L9l#zZ2SrQBK6;K`&^J1TG8s1&@q8XqF;9 zEv(_FI2v)n9uIsW;1P9O=Q_oYM|lqWNcE^$1V2F?Pr!6L8}tOS>Vs8QlN@Fj2ySPSj~4}kA!l0@w#g%YOR zM9NL-Mz}j+%1@;HB$jlNqQL}k3^*0c1ZRVV;9{^6Tn(-TDJO|?lIpm-(bcY^ugLU1|wsAlP( zA(sBx;B2r+v)tnr%RM~5=TUH_W*JZ;mI359U>|r;vkaUimVr*N5?roX1`id>-~^C- z22Tfb!BWj)PZNuMDtJvSL#&!*NH|FOvCwm$XqNlfE4r^e2>tivg1o5lKGNOy8F(JN z0z&tQ1hI@r1GB-|;A7xA%`$SPSVrc9rC>R@5!?)31TSlrvE(f*J^OQ`nq#%bB_)IwfUI58wT#Q)8jQ}Zc9DGk;(`!N}us0Z`S!N*5 z8S}u!;8M*}xIrw1Tfl7~a`P+|i)S^s9^6QMR8t?@LFCd8x%3+Z4g-t8#o&uz74?B! z`p*K%um6kG2YlXB2_6GaQ6Jl>k9z7MiFz0hmV=9s{|Mwi4qOSsm;DBE*N{K)h7d3I zvRGoTBj3KrcMu3)_rdpl$l<=V;90N{Irl=&{lRe{^*RE1jJSk+ZOB&#Q^9nQaz?Jv zEThoBQOU?947qdz$AHi=1AUrNtXY00V)+^T7E(`zFCh=;^dy1kq31CWc@zcE!JMNj z`U>m|_6L=(&`?b*>0~e!q-|Je8v$*wWI_qAAp97(7u*jX2T$_68_&Cg(cm!93Fd>_ zz&H4!A#Fd9wyzDM=c7;2V!=^hDwqytgSp^5a3M%{uB`+&gH<4XBwKGXFG*xxGT{@1 zPl3>{L4QyHR%;uOp*zS1&Q?||xCpEO=?jDC3xoE72Q+Czyf(xeFpAMTfv`@vwNEr1LhFrstYgj$FSCe)zBJDZ2=TQCG&Iu4lk=;C0?4D?PvCI zP?J97+lPGn>;mgS^rsK{(>E8Do~_B<#J`*Pv~TG@QR9Qo@nT~7e4QW&wI(|Uh=t@`n;F=y!Rz=izfFS61nd~O-9sW z;q4-PlJIAQ_Ypn-o(C^z5_b@b@etw5gs*8ba+%1;6`G7gFG^z+J1u1_N<^Kou z@*mVo9Q6@LeZ-Z5<=~6pX0Qg_u1WF{PGKJ<483vC8-FKn+UW)k0;9n(;5ZPz-9OaIq-20*P ze&`(knaFtbdBR3c{L@ZS;X4(+Ck_*t7^_KIBX1zNtVz1y&7^5Ec{MvZYcXdk7?16xEMsMcf#bk2azpM5CuvtycMy@zFZL=(q2c7;+w7)uc2M4^th4|5Es$PrmcXcfkeT^WUh+ z!YGl212p;1g(CmCSd&HBoPNyJ6hZnpEr)sW_m?lH(#vP9h)VI~MsS zhf^;RnxtIjbpJKv(;N9jA&*kzQLf1(rlWW1=-rgvoY>l<$@CLgnWx~pKYS0; zWL77US$D$c75KcaNjCXqlV8prPLu7^#QB(rbG0V9=vOZKH9HMCWFQChXbyT*cm)2B zYEpERx2qk8-wp7)5&n?-LgfCRb?~diZ-zlZR489!iJL_VC#W zKHI=&s3w)Ycw<&y_#6bE(cpM64O|JX0cl^!w67G}O$zNMr4n2Q?gH!4pUvn`75cLj z{aKEDXg}j=KNIGmKMT*QFZ!)gljS=qvGmM*Ii+67EkpneceR z$mv1k^s_?3#e|Cq&m+8s@H)cOIq)m+ z8h8W!g6~}T&V`>`_{k%F9`OsvuYmmWJ|ldVa0TI|n&d}`&6 zdyuzh3s{Z5cSGO1g9AW2_!zialb?4I`T3n7^87jS#CJ=6PJR!ehYz8L6-go$$=pY8 zevaN0Cv!?^JcwQwqt_**FCl#ie3rmxX@A<&AkYcsgUGKG`IW+VDSVefR~dAb*}}eMSO~5F9|K9p*J`Da`fQ{=8;RFQyhh?R60ebXjl^ptUL)}?&t#P=3tSF9 z3hoB?fY-nqntZcP)cpbS2^63ut zLO$)0PbcK_74o^L$$IKxJ@v4j@Or|}6pK7F4?GT@)C7^s2K0Uddb9yO+CaPw#CsNf zeHMLv_7ZqSljq3)Ir4vQEx2BjUn8eqBd1>%g2kF_oX*PDOii}z7TK}~guX4%_q&-Q zzsmxTfhRP1eX7XonILj_9XY&y5xk^HE%j4N{nS1NuGVBnsK}1?n$%VE7Qk)bLGX|! zJ5TX0^fTZM-ZT-Q$y)BO<^EdkujT$)=v@oFPgzBt3IiiS9e$JHcRc(+&$EgifgTNn z@87|975r4e&+G8_I{dxSP2`R4&{G3F+o5MD^u$2NW$3u3$*w5MA3*-d_bKGNj{03k z{jM7U#)0MFB9Q#nk>7gcvmW`ZN3YhSSL<`Z*~sr4^81Q#72z7N4%`jB)cZ5k`!liN zC~yt94n)4sAm0s?zk%{M(2h6Ij_W!>*PS5c*HL~Q^-@Q@)Inbz^gYv^biKd+<1K@k$N$@l98hAsKnt38M z3&GXkTJQ*X6uba7YVv9v9~4glsn=Jj*H@Q<%fannttPMKi@fFr*MS?r6W}TE3V2!a4|?dZl@l%Q%~Eer|s0^cIxqUEBX=!_6DQCXmFS& zzh5l!`$`c0eh+`O5$KT(w1Y#z@nD)Je<&6CLpk^&xLK1o$>&Y-dFv~Yw=RO$dE1F- zvS$Ej2dUpZ)bE~5a28kumTK~Ly~x{pLFD%~^4kYp`=INO)WaXChXXJ1R+cT`KJWmD z91b9d1LXfF^8eEyFj|v?)b~N^``|_Jk|uvfzJEr(?oE0w znEF04ROCnum;p}L}IeEJO-YipW^;=+<$H+n1wue zzK`eo_Jaq(8zS!pXtF<5WPdv8ko&X9{aMO+mU5os{&U>lS4;d|;5qOs;v=X1$m!Py zX}5>K&;6>ooZ-`te)z%0E>3~SV>|NrJ#za!a;w$QcPsk50=<3=Tn|169su71 zk>gv)@i6srgnBvB9qfgE^hZAifzWjfx?VxgUWozGi&xN#S5ARv;CDRyrh(K~HTAWX z`rJx=Ze0nkfqonGM}pJAnc#L1qF(I(RhNT{z%$@E=tzT(3=sX=ihgbV3cLs%OQB;q z2p=`@@oFmcq(cvMyapZHqo8L12;JMEd;4hLozD2u8yo~igYa1gpLJQF6C|HH^4a+!4{E;eR*$zd4hB zJqvskTnTOltH5L63E~wJuNXwmyOHzmYv2u@$MHOgF!6R1?@j9KP3r5-U0^-(fu4Hk zsV9Ct@%L6Ek8R*?a1Zj}`8zy6d zz((@1lh05P`u9TrUg+No{f8eTztte+9j3gG>fnDjNWLGD?_ToROFnxSffdA~z7A7g zA06QNd))tu`xl|l34Qq>@_q+-@3Ya*MuMqeIyetp2(AU!gUi4bn!F3$??U&x@ck}) z@1I4#oXvPgeg2X9JV5;(pneZjfJ;HjJ3x5{Pcg2YVZ1xYcz1~KFv78nbCmOE%6Wem z<6Ax9D}=9W^4=hk_oBgUFc+lW-lN{$UrxM7(KDVO;`t%?I0PSuR)cFnawG19LFk@ttl`@?E*8~LmxpEck{@I|l&+)jRn$WQ4- zIQ0^NzVAmr4uZ$P6X*%@{1|zDybjzzKaos7F&y`ULxK>;vE7{f}b%j zy28BZI`g7j=0&qX3;!YD{%`*R08+k_@}0=ViChvB;A4ztnZrKi9LjSe zS9h#t>32>n{k{UBqaXMCBlrG&*)Q$Jerc3u8UL7A##3(tyAvKjcs1eY2=^jvC%l&M zCid6a*BlxSE&|c#ZnT?jw3}|*!CKZAMzOw-z`8?3Lg$){||lCr7d_Ogo%N zJDi7p&O<-fEXS+nQS85B?7w;7dGLZJG&yNjn`G2l3GA-EXa4ekLi zfmg5_DgPzPe;GZ089o0U`TdUks^|}@=nuB-6WMlv`6~InL4I#Q#~aYGBa->54vq)Y z7>7?X4u8ft+@5i`6Z2Qv`!3r1t~fA>@#6sF$9wdnwCDY_=TD&b6X-orN_#E`SAdUc z@+s~AQ`-NhN5G@Bd)nzq+UaSXb(Y@XbZ{o<28+POU?uGtxqX4$zNiCt)2^Z89CUou zn{DAJ@EUkSlfNC}3y2?Ta^WSB3tKe#`(}~9S7~x-4R4ZMr^!EOi~O^Y^^snzkMso- zz%gJUSWJCQrM@z$r)|{J8{lpbdCuehJnnDi{$}oX8$tcXfu!q3x?V}_^CfFCupTeN zz2I5!Jo%j>zcZQ)rk>b;m%$a_QugbJA5Hw|OmG$mztQj;y%1c?ejW7P3w`%(V1I5S z`*3a8hYJOlg3DRI&SL%A$-4C$tXtQC@SP9e^YWq7t#KNSbySUY(_^fgo?w3wx!;Z4 z@6G_Hv%iSm;m0BOYyw}RQzC(da@!JaOSmoR+LEqs9s85JLHOtkAN@A+-OCpV?BOZrvo750g*v+oPNq0rmCkvF7WW$Os3x)58{Vl#}8oy{n`lPjf}=GVHimIk$W^t?jW(`Mw1Rdm%)YLLU1wZ@MoaC zT1L?BN6@c~pkEn5zcTVg(p7=m!CK7{ML*Opfb!de^h5pJU?~V4{Z^76^bV%~8Jq^r zBwxz6)BlXX4`M_HI19`rKl;0o^mikRz(vHTUmV@;qfK=?SMmPs)4Xd9acEhLT?#I33K=EEB9^nQ$kl zg9GqWf{%&tF_C_LBK`ct1Q7ZBbe>p#x&prt>SYG}&3sfWGm+ne(DUGG&5|=rEIG){ zNx9BU%~CK^ECu=W>yh;9^w$Y*h$VsgoYP47x@MVIh&u@FQqV6!zXW{}^hwZfLBHiF zcv7>ZcIWDa&s1M7>YM#e3;UgxiO6?i1^5!U1*`_Qk&bpGv?FnYD*xjk{o=s)XzxeZ zkEh)aq1_L;1YV&%52HQDg4b!!Lc6{b?50T`{bwHiXIK_~4^EJDVWjK3n)b97+z8Un zx<%2y3;?0O8}ttd#Sfr8<&obY@{4|s{5OF$;C7Jq8clnRrhP`!KJOhwdC_1Tm;{ak zQ^8ztwkAVqpF?S%KY@*(XkdG=lP39vBKhz)AcFF2lvf3RHQ)*G6iB*(q>Da6IY-H_ zi2O=P-;MO$@fU!Pk?;|{jOQ!BlOS@scMCa-}BNjelb+9)GAF=Qe`xv+yg#K9Q zk0pQn&7=eLbWrqchmKmxkE8q~@H6l%bgUHl=^Dx(MfnNfVz3fC1D>N?_!tf!!>hq< z_^DjRPvsi;+4%z42tUXp0(nFvfyv-ZFbhPU5y&%Q4Y&^60#<{2!TsQI@Fa-7 zMO@b8j!2O^bn0ss^_2}i2X3Oi`cq$nz=Pl+>TMzQwwQWKr=F&Q=wr-U5Po9dXE^DH zlYaPl@B;cU9le+dBJWt_ZG}%Od|ETW=^*)8$u9)G2}N&0Ngqo3?q?X^&N03bUnhPD zat=Yxq2WA-=}`Czg|Cog?vE$jjc|96`U<7KLW;OwO1L-SDDV<^h5PHczkx9MhLUgF zUW}7{={LYUg#$o4I2FvKy_VBn7lE|XeA;O~eB{GN{t56Deh0{X5^|rE3Z}Ck3m*&M zq{)+EB2R{c==GE6^^>{a zY;Y~O9;EyyDgVjOz_Z{D_EiGdUxEL%@V_<&904NVwa9mEDOe67ueHeQW$N=~>hopj zdl~v(c7pjJbZ>#~Es>xOQvMdo-*yx`_Bi$_{OyFlo!MY6_9^#waeo)}yo-ANLp19y z!$8`>A7}?_>fmQL^eu+YO7cMt+mOSy%iuNa;bQFJdEleqO6*~9hr*Y@Eu=p}`lF<; zCjB<(YXhC3An{%%-pk1UW#qpFec6J(RDo3rDX)t1UZdV$qu$q?A)j;PL-N?ij#$ zJ8&iUiPw*Dz8`kR2-1%z#eQM@9~lN#g3EZmmgnnvzL@8g;C1c?Fn)uH!h8)oC9xOw z0(R1bVT{ce7?-gtCe#t$%{Uy!I2;aM18-=SvDjl{H*1#UapytCArz!F zg#G-;&rk3bF6tXqhjevFZ^KR;#WDR7{BeRmPF%&LeopmSrasGzUuOKWIQHT&j^YGf zMm}A}r_1?%Io~hu!XEvboAhtGul%VTt9;+s;`_!{pXd91o*zK>?>}GleL=ndN4&kuaRp6}O}V!7YnQ+|J6bANEIsB=XRUxT@SUchuRcA zbH7PjdPosPq-H4wdpGNsKDxRo#q6r+f&vyIlM82$RME7I!B#zG*?FR%GUSd2ATizl%a&tf0iC*MB#S8xh% z;T?R0Pw+Lq@ox;${Tl=I`f4q%$IY0HUtlg4V=2~R48`-6c)sex^LPn=#VNdocknJg z!Ke5J-|4?xuK#icuE&j-joUC6_h2cOV+)Uf36}XNHW^qoxp1S#-6YS&Xef+#nJp076kDvDOlm7j{ z_mrTp+4Gkc9L7-;SE0DRF4EsujBVJ7zv6HD{Wkd6zX?0B8`XEe`tE;(PxJw9(+9X6 z8}K-~9{$($P$bSGaTbZINL)ov@ww+d*`E7sL%#op@4s=5Z=B=6OMR!W{hk)@LGd2+ z`a!QByo>koJuc}Vl!sz@D1L@7^bKy+H<*Lf7{RmHr;l*AKEiwyZ;5zIhVT+D;A4G) zC-n)o;uNayw~P2zAK@x}gsaiGQscf0>mOW+;`~mW-wk3yKj9kvgzHe9%hb8-0WRn- zEYM%LA6u{u`N(s@pj^D=;;r~hzv$;EzZLRZ;rgyv3Her&y*>u@VzFjJNO(%6qlE zA6ln>aRZ9yka!MR=a6*{jo}2!&msA#k+&Lot4ZQ4zQ#BD8qGg!{^3$A$8L<{HN1}M zby&S3;*W?wasW%P2hZYVyo%O~SnqFq_cy+)m4{k+sIA0myotBbd1{^K`w92m%Q%NO zkuSgJ%kRDaz4xOl-48R|M+@B#i?9l7um#(&56`1@>#Q47znJ>P_$J0TG5(10M=XWU z^gHs$5&k%mjoZ+;BgP$hhaW;g{pY?SZ$|Z~SC9G#Mp1q1)wf>W>*d{l!V>%t!p)eC z4{#wAG{{eb{4`W!1kYk0-od+Qp9cFJRrjOnezXiL@e=-u>U~tb8&~V2T#I+{zCKCg zj~Rc=e#h*0tR1`X6)x(V6xVTa9e3{I&V9TFYcYyK>qIlTpE zaSos3OV9Tcnop zN7V64bu5sF0(sbHokHvE-{L;K)qPgJJ=X~i=D3gUaQ`fH|15IfyXC$o?`6(k=KK}g z+>f@qzu2eBK5P)wgwT42t#_CY5A$I}-6HB%E3R5`#rQDBhex_y2XQ`q#HUaA?+O1s z<&*7vvJ?5Ei9ed+*vlWI{4vH4Z~5W9=eX*7GLs*6@xyNQ{at;ps2~5G;=i`v)aiHi z=u?mL@_tF)`M#r6e#=8a=URDOFJG(VYqk9Fdl$c-lb3Vy(qn#)`R7*pIm724ujhJw zuR85jr@gQ7jr`5~eRST2uM^0-6< zH=N@Z@>dUkow5EI>z|RAGxBmq+-JmnCW*7^I;F1HaOu;dOxKBdzApuy2M7E3w2Yag4@wvJ?-+t#S%JunWkNWRd{{!mpya%1Pc)j{>#5;J`=L@fwc>UW8{BY6d zh=k7(!#+2t|99$Nc9lPpJ{PzT{Kb8s+`i@Zt&qLFA#32-KM7)t&jNxsZ=eOLX5dDHI^xll+qG)}Itd{!j9MQv6BrC)GQt-pS|q z65rrEaeUNQo30<$c`iE7#Q_||hxiEJ;Ro?mimw{muoGY78}Y3Y-)eLnC0s{|IQF9X z3G)-?C(Qq)QNLd^_TzxQzp%c)m6(NFuoJs+7)S9HF3Q_VdCR~uti%><^PI=^HSGEt zuEAQ*jmA7Tn!wvQFMr}47w@<_k1u(Sl;Jtj8noYp{U-9U01se^{Oy*%e5}R@%G0Dg zO_?`k-jsP$=1mzlW!#kWOgYa~1f%lFCrLg@wqm>IUV-OcA>^m&Y;@jf=bbig+PLZC zcoN&O%ikLh`g`L9CUF*T;4PGgYw|D?@|-S=8*mfm;0|=28RwZXe#ZD2anFc*hCgRs z<6C_1x!y+4^*+PxxD$)87+vSHuJc*vnRT9jTmRqIPdR_e`BSTLEqXom>2-NX$wR6b zOEHS|D2|jkQv8$RpVR_AM(0R5#~;@F!+L+L#r3Fef2i9(KIgy9XrF)B=fZW@)eU`` z&-7`&z(suP?~|AN`{Whgf9QR_`o+0_aqeF}@<}?sxK4%|@FcdP0EV9N!+m~ui0|+N zKk(}~zm9LhOx%IHkRQhR;Xmg+*SmlT9L6{J4wr&pDF_8inV5yfFB!j7jge4VbSOxR zj)v3P`e}d$DM7>Z>Gj*xOJg)am+2}cX_n^bW;pG14(*^_w43t7X`N+MNfD~2W@@8u zs-`G4QVVs4(|YFV9zCE1dQ2&L7EX&BAGc22oVc~(=EbcSH#ct0xPAIEXbr8S4YY|e zDT~VJ(-`aYS*OoBeb(u-PM`UG*6Op?KtIL9X%_-akkjH)70)F(c-W zm^)(LXn@9!7&~I@i1kLSF=G9Z6j^KJrg7F7-9TBin{sFe?V=3YL|bVMt)ooZLSb4N zPMi58<7T`+*X=j+W*R=Jgtu=js t%BYg6DMBUI&8J36kacDj!)dd|&+Z^&W_xLZ>^1AXe`Qb(S>s>b{{;eNRG0t& literal 0 HcmV?d00001 From 57537a350fe915ac45c45d64b70ba148c70cf19d Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 17:12:23 +0200 Subject: [PATCH 10/45] updating cmd line help; other detectors other than eiger will complain cannot set timer 14 (subexptime) when setting receiver --- .../slsDetector/slsDetector.cpp | 3 +- .../slsDetector/slsDetectorCommand.cpp | 134 ++++++++++-------- 2 files changed, 75 insertions(+), 62 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 927339e57..6d63bcb77 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -6089,7 +6089,8 @@ string slsDetector::setReceiver(string receiverIP){ setTimer(FRAME_PERIOD,thisDetector->timerValue[FRAME_PERIOD]); setTimer(FRAME_NUMBER,thisDetector->timerValue[FRAME_NUMBER]); setTimer(ACQUISITION_TIME,thisDetector->timerValue[ACQUISITION_TIME]); - setTimer(SUBFRAME_ACQUISITION_TIME,thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]); + if(thisDetector->myDetectorType == EIGER) + setTimer(SUBFRAME_ACQUISITION_TIME,thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]); setDynamicRange(thisDetector->dynamicRange); if(thisDetector->myDetectorType == EIGER){ setFlippedData(X,-1); diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 39fe6e083..250f7477e 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -72,6 +72,31 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncName="test"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdUnderDevelopment; i++; + + /*! \page test + - help Returns a list of possible commands. + */ + descrToFuncMap[i].m_pFuncName="help";//OK + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdHelp; + i++; + + /*! \page test + - exitserver Shuts down all the detector servers. Don't use it!!!! + */ + descrToFuncMap[i].m_pFuncName="exitserver";//OK + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdExitServer; + i++; + + /*! \page test + - exitreceiver Shuts down all the receivers. Don't use it!!!! + */ + descrToFuncMap[i].m_pFuncName="exitreceiver";//OK + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdExitServer; + i++; + + + + /* Acquisition and status commands */ /*! \page acquisition Acquition commands Commands to control the acquisition @@ -111,6 +136,27 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdStatus; i++; + /*! \page acquisition + - readctr Reads the counters from the detector memory (analog detector returning values translated into number of photons - only GOTTHARD). Cannot put. + */ + descrToFuncMap[i].m_pFuncName="readctr"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdCounter; + i++; + + /*! \page acquisition + - resetctr i Resets counter in detector, restarts acquisition if i=1(analog detector returning values translated into number of photons - only GOTTHARD). Cannot put. + */ + descrToFuncMap[i].m_pFuncName="resetctr"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdCounter; + i++; + + /*! \page acquisition + - resmat i sets/resets counter bit in detector.gets the counter bit in detector ???? + */ + descrToFuncMap[i].m_pFuncName="resmat"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdCounter; + i++; + @@ -199,26 +245,33 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSync; i++; - /*! \page test - - help Returns a list of possible commands. + /*! \page config + \section detstatus Detector Status + commands to configure detector status */ - descrToFuncMap[i].m_pFuncName="help";//OK - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdHelp; + + /*! \page config + - online [i] sets the detector in online (1) or offline (0) mode + */ + descrToFuncMap[i].m_pFuncName="online"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; i++; - /*! \page test - - exitserver Shuts down all the detector servers. Don't use it!!!! + /*! \page config + - checkonline returns the hostnames of all detectors without connecting to them */ - descrToFuncMap[i].m_pFuncName="exitserver";//OK - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdExitServer; + descrToFuncMap[i].m_pFuncName="checkonline"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; + i++; + /*! \page config + - activate Activates/Deactivates the detector. Deactivated detector does not send data. Used for EIGER only. + */ + descrToFuncMap[i].m_pFuncName="activate"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; i++; - /*! \page test - - exitreceiver Shuts down all the receivers. Don't use it!!!! - */ - descrToFuncMap[i].m_pFuncName="exitreceiver";//OK - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdExitServer; - i++; + + /* data processing commands */ @@ -346,26 +399,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdImage; i++; - /*! \page acquisition - - readctr Reads the counters from the detector memory (analog detector returning values translated into number of photons - only GOTTHARD). Cannot put. - */ - descrToFuncMap[i].m_pFuncName="readctr"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdCounter; - i++; - /*! \page acquisition - - resetctr i Resets counter in detector, restarts acquisition if i=1(analog detector returning values translated into number of photons - only GOTTHARD). Cannot put. - */ - descrToFuncMap[i].m_pFuncName="resetctr"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdCounter; - i++; - /*! \page acquisition - - resmat i sets/resets counter bit in detector.gets the counter bit in detector ???? - */ - descrToFuncMap[i].m_pFuncName="resmat"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdCounter; - i++; + + /* trim/cal directories */ @@ -431,31 +468,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileIndex; i++; - /*! \page config - \section detstatus Detector Status - commands to configure detector status - */ - - /*! \page config - - online [i] sets the detector in online (1) or offline (0) mode - */ - descrToFuncMap[i].m_pFuncName="online"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; - i++; - - /*! \page config - - checkonline returns the hostnames of all detectors without connecting to them - */ - descrToFuncMap[i].m_pFuncName="checkonline"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; - i++; - /*! \page config - - activate Activates/Deactivates the detector. Deactivated detector does not send data. Used for EIGER only. - */ - descrToFuncMap[i].m_pFuncName="activate"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; - i++; - /*! \page output - enablefwrite [i] Enables/disables file writing. 1 enables, 0 disables. */ @@ -484,6 +496,8 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; i++; + + /* Acquisition actions */ /*! \page actions Actions @@ -595,10 +609,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - - - - /*! \page actions - scan0script [s] sets/gets the script to be executed for the scan 0 level. \c none unsets. */ @@ -671,6 +681,8 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; + + /* communication configuration */ /*! \page network Network From ae49c04dcd0addb1708143b4b5a2f2d7d9641266 Mon Sep 17 00:00:00 2001 From: Anna Bergamaschi Date: Wed, 16 Aug 2017 17:29:04 +0200 Subject: [PATCH 11/45] added documentation to slsDetectorCommand.cpp --- .../slsDetector/slsDetectorCommand.cpp | 270 +++++++++++++++++- 1 file changed, 268 insertions(+), 2 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 9d4e1820c..be29a55b4 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -53,7 +53,9 @@ The commands are sudivided into different pages depending on their functionaliti - \ref actions "Actions": commands to define scripts to be executed during the acquisition flow - \ref network "Network": commands to setup the network between client, detector and receiver - \ref receiver "Receiver": commands to configure the receiver + - \ref ctb Chiptestboard: commands specific for the new chiptest board as pattern generator - \ref test Developer: commands to be used only for software debugging. Avoid using them! + */ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { @@ -1077,83 +1079,142 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* pots */ - + /*! \page settings + - vthreshold [i] [mv] Sets/gets detector threshold voltage for single photon counters. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vthreshold"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcalibration [i] [mv] Sets/gets the voltage of the calibration pulses. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcalibration"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vtrimbit [i] [mv] Sets/gets the voltage to set the width of the trimbits. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vtrimbit"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vpreamp [i] [mv] Sets/gets the voltage to define the preamplifier feedback resistance. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vpreamp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vhaper1 [i] [mv] Sets/gets the voltage to define the feedback resistance of the first shaper. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vshaper1"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vshaper2 [i] [mv] Sets/gets the voltage to define the feedback resistance of the second shaper. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vshaper2"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vhighvoltage [i] Sets/gets the high voltage to the sensor in V (int). + */ descrToFuncMap[i].m_pFuncName="vhighvoltage"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vapower [i] Sets/gets the analog power supply for the old chiptest board in DAC units (int) + */ descrToFuncMap[i].m_pFuncName="vapower"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vddpower [i] Sets/gets the digital power supply for the old chiptest board in DAC units (int) + */ descrToFuncMap[i].m_pFuncName="vddpower"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vshpower [i] Sets/gets the comparator power supply for the old chiptest board in DAC units (int) + */ descrToFuncMap[i].m_pFuncName="vshpower"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - viopower [i] Sets/gets the power supply of the FPGA I/Os for the old chiptest board in DAC units (int) + */ descrToFuncMap[i].m_pFuncName="viopower"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vrefds [i] [mv] Sets/gets vrefds. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vref_ds"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcascn_pb [i] [mv] Sets/gets vcascn_pb. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcascn_pb"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcasc_pb [i] [mv] Sets/gets vcasc_pb. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcascp_pb"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vout_cm [i] [mv] Sets/gets vout_cm. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vout_cm"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcasc_out [i] [mv] Sets/gets vcasc_out. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcasc_out"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vin_com [i] [mv] Sets/gets vin_com. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vin_cm"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vref_comp [i] [mv] Sets/gets vref_comp. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vref_comp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - ib_test_c [i] [mv] Sets/gets ib_test_c. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="ib_test_c"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - dac[0..7] [i] [mv] Sets/gets dac[0..7] for MOENCH02. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="dac0"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; @@ -1186,194 +1247,333 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vsvp [i] [mv] Sets/gets vsvp. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vsvp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vsvn [i] [mv] Sets/gets vsvn. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vsvn"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vtr [i] [mv] Sets/gets vtr. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vtr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vrf [i] [mv] Sets/gets vrf. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vrf"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vrs [i] [mv] Sets/gets vrs. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vrs"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vtgstv [i] [mv] Sets/gets vtgstv. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vtgstv"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcmp_ll [i] [mv] Sets/gets vcmp_ll. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcmp_ll"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcmp_lr [i] [mv] Sets/gets vcmp_lr. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcmp_lr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcal_l [i] [mv] Sets/gets vcal_l. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcall"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcomp_rl [i] [mv] Sets/gets vcomp_rl. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcmp_rl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcomp_rr [i] [mv] Sets/gets vcomp_rr. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcmp_rr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - rxb_rb [i] [mv] Sets/gets rxb_rb. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="rxb_rb"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - rxb_lb [i] [mv] Sets/gets rxb_lb. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="rxb_lb"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcp [i] [mv] Sets/gets vcp. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vcn [i] [mv] Sets/gets vcn. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vcn"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - vis [i] [mv] Sets/gets vis. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="vis"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - iodelay [i] [mv] Sets/gets iodelay. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="iodelay"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - dac:j [i] [mv] Sets/gets value for DAC number j for the new chiptestboard. Normally in DAC units unless \c mv is specified at the end of the command line (int) + */ descrToFuncMap[i].m_pFuncName="dac"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - adcvpp [i] Sets/gets the Vpp of the ADC 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V (int) + */ descrToFuncMap[i].m_pFuncName="adcvpp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - v_a [i] mv Sets/gets value for Va on the new chiptest board. Must be in mV (int) + */ descrToFuncMap[i].m_pFuncName="v_a"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - v_b [i] mv Sets/gets value for Vb on the new chiptest board. Must be in mV (int) + */ descrToFuncMap[i].m_pFuncName="v_b"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - v_c [i] mv Sets/gets value for Vc on the new chiptest board. Must be in mV (int) + */ descrToFuncMap[i].m_pFuncName="v_c"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - v_d [i] mv Sets/gets value for Vd on the new chiptest board. Must be in mV (int) + */ descrToFuncMap[i].m_pFuncName="v_d"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - v_io [i] mv Sets/gets value for Vio on the new chiptest board. Must be in mV (int) + */ descrToFuncMap[i].m_pFuncName="v_io"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; - descrToFuncMap[i].m_pFuncName="v_chip"; // + descr + /*! \page settings + - v_chip [i] mv Sets/gets value for Vchip on the new chiptest board. Must be in mV (int). Normally don't use it! + */ + ToFuncMap[i].m_pFuncName="v_chip"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; + /*! \page settings + - v_limit [i] mv Sets/gets a soft limit for the power supplies and the DACs on the new chiptest board. Must be in mV (int) + */ descrToFuncMap[i].m_pFuncName="v_limit"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /* r/w timers */ + /*! \page settings + - temp_adc Gets the ADC temperature (int) + */ descrToFuncMap[i].m_pFuncName="temp_adc"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - temp_fpga Gets the FPGA temperature (int) + */ descrToFuncMap[i].m_pFuncName="temp_fpga"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - temp_fpgaext Gets the external FPGA temperature (int) + */ descrToFuncMap[i].m_pFuncName="temp_fpgaext"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - temp_10ge Gets the 10Gbe temperature (int) + */ descrToFuncMap[i].m_pFuncName="temp_10ge"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - temp_dcdc Gets the temperature of the DC/DC converter(int) + */ descrToFuncMap[i].m_pFuncName="temp_dcdc"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - temp_sodl Gets the temperature of the left so-dimm memory (int) + */ descrToFuncMap[i].m_pFuncName="temp_sodl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - temp_sodr Gets the temperature of the right so-dimm memory (int) + */ descrToFuncMap[i].m_pFuncName="temp_sodr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - adc:j Gets the values of the slow ADC number j for the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="adc"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - temp_fpgal Gets the temperature of the left frontend FPGA (int) + */ descrToFuncMap[i].m_pFuncName="temp_fpgafl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - temp_fpgar Gets the temperature of the right frontend FPGA (int) + */ descrToFuncMap[i].m_pFuncName="temp_fpgafr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - i_a Gets the current of the power supply a on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="i_a"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - i_b Gets the current of the power supply b on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="i_b"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - i_c Gets the current of the power supply c on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="i_c"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - i_d Gets the current of the power supply d on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="i_d"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - i_io Gets the current of the power supply io on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="i_io"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - vm_a Gets the measured voltage of the power supply a on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="vm_a"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - vm_b Gets the measured voltage of the power supply b on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="vm_b"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - vm_c Gets the measured voltage of the power supply c on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="vm_c"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - vm_d Gets the measured voltage of the power supply d on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="vm_d"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; + /*! \page settings + - vm_io Gets the measured voltage of the power supply io on the new chiptest board (int) + */ descrToFuncMap[i].m_pFuncName="vm_io"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; @@ -1657,98 +1857,164 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* pattern generator */ + /*! \page ctb Chiptest board + Commands specific for the new chiptest board as pattern generator + */ + + /*! \page ctb + - adcinvert [mask] Sets/gets ADC inversion mask (8 digits hex format) + */ descrToFuncMap[i].m_pFuncName="adcinvert"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - adcdisable [mask] Sets/gets ADC disable mask (8 digits hex format) + */ descrToFuncMap[i].m_pFuncName="adcdisable"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - pattern fn loads binary pattern file fn + */ descrToFuncMap[i].m_pFuncName="pattern"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patword addr [word] sets/gets 64 bit word at address addr of pattern memory. Both address and word in hex format. Advanced! + */ descrToFuncMap[i].m_pFuncName="patword"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patioctrl [word] sets/gets 64 bit mask defining input (0) and output (1) signals. hex format. + */ descrToFuncMap[i].m_pFuncName="patioctrl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + + /*! \page ctb + - patclkctrl [word] sets/gets 64 bit mask defining if output signal is a clock and runs. hex format. Unused at the moment. + */ descrToFuncMap[i].m_pFuncName="patclkctrl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patlimits [addr1 addr2] sets/gets the start and stop limits of the pattern to be executed. hex format. Advanced! + */ descrToFuncMap[i].m_pFuncName="patlimits"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patloop0 [addr1 addr2] sets/gets the start and stop limits of the level 0 loop. hex format. Advanced! + */ descrToFuncMap[i].m_pFuncName="patloop0"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patnloop0 [n] sets/gets the number of cyclesof the level 0 loop (int). + */ descrToFuncMap[i].m_pFuncName="patnloop0"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patwait0 [addr] sets/gets the address of the level 0 wait point. hex format. Advanced! + */ descrToFuncMap[i].m_pFuncName="patwait0"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patwaittime0 [n] sets/gets the duration of the witing of the 0 waiting point in clock cycles (int). + */ descrToFuncMap[i].m_pFuncName="patwaittime0"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patloop1 [addr1 addr2] sets/gets the start and stop limits of the level 1 loop. hex format. Advanced! + */ descrToFuncMap[i].m_pFuncName="patloop1"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patnloop1 [n] sets/gets the number of cyclesof the level 1 loop (int). + */ descrToFuncMap[i].m_pFuncName="patnloop1"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patwait1 [addr] sets/gets the address of the level 1 wait point. hex format. Advanced! + */ descrToFuncMap[i].m_pFuncName="patwait1"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patwaittime1 [n] sets/gets the duration of the witing of the 1 waiting point in clock cycles (int). + */ descrToFuncMap[i].m_pFuncName="patwaittime1"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patloop2 [addr1 addr2] sets/gets the start and stop limits of the level 2 loop. hex format. Advanced! + */ descrToFuncMap[i].m_pFuncName="patloop2"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patnloop2 [n] sets/gets the number of cyclesof the level 2 loop (int). + */ descrToFuncMap[i].m_pFuncName="patnloop2"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - patwait2 [addr] sets/gets the address of the level 2 wait point. hex format. Advanced! + */ descrToFuncMap[i].m_pFuncName="patwait2"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + + /*! \page ctb + - patwaittime2 [n] sets/gets the duration of the waiting of the 2 waiting point in clock cycles (int). + */ descrToFuncMap[i].m_pFuncName="patwaittime2"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; + /*! \page ctb + - dut_clk [i] sets/gets the signal to be used as a clock for the digital data coming from the device under test. Advanced! + */ descrToFuncMap[i].m_pFuncName="dut_clk"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; From ae7255953dc81eca385668ec7a3975bbf548fe11 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 18:37:10 +0200 Subject: [PATCH 12/45] compile error bug fix --- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 4f6ca0e33..3ea98cde3 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1450,11 +1450,11 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; - descr + /*! \page settings - v_chip [i] mv Sets/gets value for Vchip on the new chiptest board. Must be in mV (int). Normally don't use it! */ - ToFuncMap[i].m_pFuncName="v_chip"; // + descrToFuncMap[i].m_pFuncName="v_chip"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; From ac6720e27db0361bafdc1517656c45e81681bb73 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 18:46:10 +0200 Subject: [PATCH 13/45] appears double in the intro list --- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 3ea98cde3..6d12b8c05 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -45,16 +45,16 @@ To address a specific controller i of detector j use: For additional questions concerning the indexing of the detector, please refer to the SLS Detectors FAQ documentation. The commands are sudivided into different pages depending on their functionalities: - - \ref acquisition Acquisition: commands to start/stop the acquisition and retrieve data - - \ref config Configuration: commands to configure the detector + - \ref acquisition "Acquisition": commands to start/stop the acquisition and retrieve data + - \ref config "Configuration": commands to configure the detector - \ref data "Data postprocessing": commands to process the data - mainly for MYTHEN except for rate corrections. - \ref settings "Settings": commands to define detector settings/threshold. - \ref output "Output": commands to define output file destination and format - \ref actions "Actions": commands to define scripts to be executed during the acquisition flow - \ref network "Network": commands to setup the network between client, detector and receiver - \ref receiver "Receiver": commands to configure the receiver - - \ref ctb Chiptestboard: commands specific for the new chiptest board as pattern generator - - \ref test Developer: commands to be used only for software debugging. Avoid using them! + - \ref ctb "Chiptest board": commands specific for the new chiptest board as pattern generator + - \ref test "Developer": commands to be used only for software debugging. Avoid using them! */ From 16fc44b3ab9684672688929b11ae79b010cfda2d Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 16 Aug 2017 19:05:17 +0200 Subject: [PATCH 14/45] update client command doc --- .../eigerDetectorServer/9mhvserial_bf.c | 1 + .../eigerDetectorServer/FebControl.c | 6 +- .../slsDetector/slsDetectorCommand.cpp | 132 ++++++++---------- 3 files changed, 64 insertions(+), 75 deletions(-) diff --git a/slsDetectorSoftware/eigerDetectorServer/9mhvserial_bf.c b/slsDetectorSoftware/eigerDetectorServer/9mhvserial_bf.c index 9cf2290ba..41f1760f2 100644 --- a/slsDetectorSoftware/eigerDetectorServer/9mhvserial_bf.c +++ b/slsDetectorSoftware/eigerDetectorServer/9mhvserial_bf.c @@ -131,6 +131,7 @@ int main(int argc, char* argv[]) { buffer[BUFFERSIZE-1] = '\n'; cprintf(GREEN,"Ready...\n"); + /* int once = 1; while(strcmp(buffer,"start")){ diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index 76028a105..807bc3977 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -259,8 +259,8 @@ int Feb_Control_OpenSerialCommunication(){ return 0; } - /* - //send start + + //send the first message (which will be garbled up) char buffer[SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE]; memset(buffer,0,SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE); buffer[SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE-1] = '\n'; @@ -270,7 +270,7 @@ int Feb_Control_OpenSerialCommunication(){ cprintf(RED,"\nWarning: Error writing to i2c bus\n"); return 0; } -*/ + return 1; } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 6d12b8c05..bc05fdd3c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -166,6 +166,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { Commands to configure the detector. these commands are often left to the configuration file. - \ref detstructure "Detector Structure": commands to configure detector structure - \ref detstatus "Detector Status": commands to configure detector status + - \ref detsize "Detector Data Size": commands to configure detector data size - \ref versions "Versions": commands to check version of each subsytem */ @@ -186,16 +187,13 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page config - \b free Free shared memory on the control PC */ - descrToFuncMap[i].m_pFuncName="free";//OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFree; i++; - /*! \page config - \b add Adds a detector at the end of the multi-detector structure. \c put argument is the hostname or IP adress. Returns the chained list of detector hostnames. */ - descrToFuncMap[i].m_pFuncName="add";//OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdd; i++; @@ -203,16 +201,13 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page config - remove i Removes controller \c i from the multi-detector structure. Can be used for partial readout of the detector. */ - descrToFuncMap[i].m_pFuncName="remove";//OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRemove; i++; - /*! \page config - type Sets/gets detector type (string). */ - descrToFuncMap[i].m_pFuncName="type"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdHostname; i++; @@ -220,7 +215,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page config - hostname \c put adds the hostname (ot IP adress) at the end of the multi-detector structure. If used for a single controlled (i:) replaces the current hostname. Returns the list of the hostnames of the multi-detector structure. */ - descrToFuncMap[i].m_pFuncName="hostname"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdHostname; i++; @@ -228,7 +222,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page config - id[:i] Returns the id of the detector structure. i is the detector position in a multi detector system. If used a \c put, configures the id of the detector structure. i is the detector position in a multi detector system and l is the id of the detector to be added. */ - descrToFuncMap[i].m_pFuncName="id"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdId; i++; @@ -273,6 +266,62 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; + /* detector and data size */ + + /*! \page config + \section detsize Detector Data Size + commands to configure detector data size + */ + + /*! \page config + - nmod [i] sets/gets the number of modules of the detector. Used for MYTHEN only. + */ + descrToFuncMap[i].m_pFuncName="nmod"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; + i++; + + /*! \page config + - maxmod Gets the maximum number of modules of the detector. Used for MYTHEN only. Cannot put! + */ + descrToFuncMap[i].m_pFuncName="maxmod"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; + i++; + + /*! \page config + - dr [i] sets/gets the dynamic range of detector. Mythen [4,8,16,24]. Eiger [4,8,16,32]. Others cannot put! + */ + descrToFuncMap[i].m_pFuncName="dr"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; + i++; + + /*! \page config + - roi [i] [xmin] [xmax] [ymin] [ymax] sets region of interest of the detector, where i is number of rois;i=0 to clear rois. Used for GOTTHARD only. + */ + descrToFuncMap[i].m_pFuncName="roi"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; + i++; + + /*! \page config + - detsizechan [xmax] [ymax] sets the maximum number of channels in each dimension for complete detector set; -1 is no limit. Use for multi-detector system as first command in config file. + */ + descrToFuncMap[i].m_pFuncName="detsizechan"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; + i++; + + /*! \page config + - roimask [i] ?? + */ + descrToFuncMap[i].m_pFuncName="roimask"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; + i++; + + /*! \page config + - flippeddatax [i] enables/disables data being flipped across x axis. 1 enables, 0 disables. Used for EIGER only. 1 for bottom half-module, 0 for top-half module. + */ + descrToFuncMap[i].m_pFuncName="flippeddatax"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; + i++; + @@ -298,27 +347,21 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page data - ratecorr [ns] Returns the dead time used for rate correections in ns (int). \c put sets the deadtime correction constant in ns, -1 will set it to default tau of settings (0 unset). - */ descrToFuncMap[i].m_pFuncName="ratecorr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRateCorr; i++; - /*! \page data - badchannels [fn] \c put sets the badchannels file to \c fn . \get returns the bad channels file name. If \fn is specified, it writes the badchannels to \c fn. \c none disables badchannel corrections. - */ descrToFuncMap[i].m_pFuncName="badchannels"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdBadChannels; i++; - /*! \page data - angconv [fn] \c put sets the angular conversion file to \c fn . \get returns the angular conversion file name. If \fn is specified, it writes the angular conversion factors to \c fn. \c none disables angular corrections. - */ - descrToFuncMap[i].m_pFuncName="angconv"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAngConv; i++; @@ -326,7 +369,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page data - globaloff [f] Sets/gets the beamline angular global offset (float). */ - descrToFuncMap[i].m_pFuncName="globaloff"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAngConv; i++; @@ -335,7 +377,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { - fineoff [f] Sets/gets the angular fine offset of the measurement (float). */ //2017/08/15 - descrToFuncMap[i].m_pFuncName="fineoff"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAngConv; i++; @@ -343,7 +384,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page data - binsize [f] Sets/gets the bin size used for the angular conversion (float). */ - descrToFuncMap[i].m_pFuncName="binsize" ;// descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAngConv; i++; @@ -351,12 +391,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page data - angdir [i] Sets/gets the angular direction. 1 means increasing channels number as increasing angle, -1 increasing channel number decreasing angle. */ - descrToFuncMap[i].m_pFuncName="angdir" ;// descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAngConv; i++; - /*! \page data - moveflag [i] Sets/gets the flag for physically moving the detector during the acquisition of several positions. 1 sets (moves), 0 unsets. */ @@ -371,7 +409,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAngConv; i++; - /*! \page data - sampley [f] Sets/gets the sample displacement in th direction orthogonal to the beam in um. Unused! */ @@ -379,7 +416,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAngConv; i++; - /*! \page data - threaded [i] Sets/gets the data processing threaded flag. 1 is threaded, 0 unthreaded. */ @@ -442,8 +478,8 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; - /* file name */ + /* file name */ /*! \page output Output settings Commands to setup the file destination and format @@ -500,6 +536,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { + /* Acquisition actions */ /*! \page actions Actions @@ -685,6 +722,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { + /* communication configuration */ /*! \page network Network @@ -814,56 +852,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; - /* detector and data size */ - - /*! \page config - - nmod [i] sets/gets the number of modules of the detector. Used for MYTHEN only. - */ - descrToFuncMap[i].m_pFuncName="nmod"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; - i++; - - /*! \page config - - maxmod Gets the maximum number of modules of the detector. Used for MYTHEN only. Cannot put! - */ - descrToFuncMap[i].m_pFuncName="maxmod"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; - i++; - - /*! \page config - - dr [i] sets/gets the dynamic range of detector. Mythen [4,8,16,24]. Eiger [4,8,16,32]. Others cannot put! - */ - descrToFuncMap[i].m_pFuncName="dr"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; - i++; - - /*! \page config - - roi [i] [xmin] [xmax] [ymin] [ymax] sets region of interest of the detector, where i is number of rois;i=0 to clear rois. Used for GOTTHARD only. - */ - descrToFuncMap[i].m_pFuncName="roi"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; - i++; - - /*! \page config - - detsizechan [xmax] [ymax] sets the maximum number of channels in each dimension for complete detector set; -1 is no limit. Use for multi-detector system as first command in config file. - */ - descrToFuncMap[i].m_pFuncName="detsizechan"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; - i++; - - /*! \page config - - roimask [i] ?? - */ - descrToFuncMap[i].m_pFuncName="roimask"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; - i++; - - /*! \page config - - flippeddatax [i] enables/disables data being flipped across x axis. 1 enables, 0 disables. Used for EIGER only. 1 for bottom half-module, 0 for top-half module. - */ - descrToFuncMap[i].m_pFuncName="flippeddatax"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; - i++; /*! \page test - flippeddatay [i] enables/disables data being flipped across y axis. 1 enables, 0 disables. Not implemented. From d63933b2de2ca89d39d2534619c715ec034c1be6 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 11:09:26 +0200 Subject: [PATCH 15/45] fixed 9m hv --- .../eigerDetectorServer/9mhvserial_bf.c | 42 +++++++----------- .../eigerDetectorServer/FebControl.c | 24 ++++++---- ....0.16.6 => eigerDetectorServerv3.0.0.16.7} | Bin 288747 -> 288747 bytes .../bin/hv9m_blackfin_serverv3.0.0.1 | Bin 0 -> 30728 bytes .../eigerDetectorServer/gitInfo.txt | 8 ++-- .../eigerDetectorServer/gitInfoEiger.h | 8 ++-- 6 files changed, 40 insertions(+), 42 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv3.0.0.16.6 => eigerDetectorServerv3.0.0.16.7} (73%) create mode 100755 slsDetectorSoftware/eigerDetectorServer/bin/hv9m_blackfin_serverv3.0.0.1 diff --git a/slsDetectorSoftware/eigerDetectorServer/9mhvserial_bf.c b/slsDetectorSoftware/eigerDetectorServer/9mhvserial_bf.c index 41f1760f2..0746c4ac1 100644 --- a/slsDetectorSoftware/eigerDetectorServer/9mhvserial_bf.c +++ b/slsDetectorSoftware/eigerDetectorServer/9mhvserial_bf.c @@ -95,6 +95,7 @@ int main(int argc, char* argv[]) { cprintf(RED,"Warning: Unable to open port %s\n", PORTNAME); return -1; } + cprintf(GREEN,"opened port at %s\n",PORTNAME); struct termios serial_conf; // reset structure @@ -132,33 +133,21 @@ int main(int argc, char* argv[]) { cprintf(GREEN,"Ready...\n"); - /* - int once = 1; - while(strcmp(buffer,"start")){ - if(once){ - once=0; - cprintf(MAGENTA,"in the loop, checking\n"); - } - memset(buffer,0,BUFFERSIZE); - n = read(fd,buffer,BUFFERSIZE); - //#ifdef VERBOSE - cprintf(BLUE,"Received %d Bytes\n", n); - //#endif - cprintf(BLUE,"Got message: %s\n",buffer); - } - cprintf(GREEN,"started\n"); - */ - - while(ret != GOODBYE){ memset(buffer,0,BUFFERSIZE); n = read(fd,buffer,BUFFERSIZE); #ifdef VERBOSE cprintf(BLUE,"Received %d Bytes\n", n); #endif - cprintf(BLUE,"Got message: %s\n",buffer); + cprintf(BLUE,"Got message: '%s'\n",buffer); switch(buffer[0]){ + case '\0': + cprintf(GREEN,"Got Start (Detector restart)\n"); + break; + case 's': + cprintf(GREEN,"Got Start \n"); + break; case 'p': if (!sscanf(&buffer[1],"%d",&ival)){ cprintf(RED,"Warning: cannot scan voltage value\n"); @@ -171,10 +160,10 @@ int main(int argc, char* argv[]) { strcpy(buffer,"fail "); else strcpy(buffer,"success "); - cprintf(GREEN,"%s\n",buffer); + cprintf(GREEN,"Sending: '%s'\n",buffer); n = write(fd, buffer, BUFFERSIZE); #ifdef VERBOSE - cprintf(BLUE,"Sent %d Bytes\n", n); + cprintf(GREEN,"Sent %d Bytes\n", n); #endif break; @@ -188,20 +177,21 @@ int main(int argc, char* argv[]) { else strcpy(buffer,"success "); n = write(fd, buffer, BUFFERSIZE); + cprintf(GREEN,"Sending: '%s'\n",buffer); #ifdef VERBOSE - cprintf(BLUE,"Sent %d Bytes\n", n); + cprintf(GREEN,"Sent %d Bytes\n", n); #endif //value memset(buffer,0,BUFFERSIZE); buffer[BUFFERSIZE-1] = '\n'; if(ival >= 0){ - cprintf(GREEN,"%d\n",ival); + cprintf(GREEN,"Sending: '%d'\n",ival); sprintf(buffer,"%d ",ival); n = write(fd, buffer, BUFFERSIZE); #ifdef VERBOSE - cprintf(BLUE,"Sent %d Bytes\n", n); + cprintf(GREEN,"Sent %d Bytes\n", n); #endif - }else cprintf(GREEN,"%s\n",buffer); + }else cprintf(RED,"%s\n",buffer); break; case 'e': @@ -209,7 +199,7 @@ int main(int argc, char* argv[]) { ret = GOODBYE; break; default: - printf("Unknown Command. buffer:[%s]\n",buffer); + cprintf(RED,"Unknown Command. buffer:'%s'\n",buffer); break; } } diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index 807bc3977..d7996ea6a 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -224,7 +224,7 @@ int Feb_Control_Init(int master, int top, int normal, int module_num){ int Feb_Control_OpenSerialCommunication(){ - cprintf(BG_BLUE,"opening serial communication of hv\n"); + cprintf(GREEN,"opening serial communication of hv\n"); //if(Feb_Control_hv_fd != -1) close(Feb_Control_hv_fd); Feb_Control_hv_fd = open(SPECIAL9M_HIGHVOLTAGE_PORT, O_RDWR | O_NOCTTY | O_SYNC); @@ -232,7 +232,7 @@ int Feb_Control_OpenSerialCommunication(){ cprintf(RED,"Warning: Unable to open port %s to set up high voltage serial communciation to the blackfin\n", SPECIAL9M_HIGHVOLTAGE_PORT); return 0; } - + cprintf(GREEN,"Serial Port opened at %s\n",SPECIAL9M_HIGHVOLTAGE_PORT); struct termios serial_conf; // reset structure memset (&serial_conf, 0, sizeof(serial_conf)); @@ -265,12 +265,15 @@ int Feb_Control_OpenSerialCommunication(){ memset(buffer,0,SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE); buffer[SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE-1] = '\n'; strcpy(buffer,"start"); + cprintf(GREEN,"sending start: '%s'\n",buffer); int n = write(Feb_Control_hv_fd, buffer, SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE); if (n < 0) { cprintf(RED,"\nWarning: Error writing to i2c bus\n"); return 0; } - +#ifdef VERBOSE + cprintf(GREEN,"Sent: %d bytes\n",n); +#endif return 1; } @@ -629,13 +632,14 @@ int Feb_Control_SendHighVoltage(int dacvalue){ buffer[SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE-1]='\n'; int n; sprintf(buffer,"p%d",dacvalue); + cprintf(GREEN,"Sending HV: '%s'\n",buffer); n = write(Feb_Control_hv_fd, buffer, SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE); if (n < 0) { cprintf(RED,"\nWarning: Error writing to i2c bus\n"); return 0; } #ifdef VERBOSEI - cprintf(BLUE,"Sent %d Bytes\n", n); + cprintf(GREEN,"Sent %d Bytes\n", n); #endif //ok/fail memset(buffer,0,SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE); @@ -646,8 +650,9 @@ int Feb_Control_SendHighVoltage(int dacvalue){ return 0; } #ifdef VERBOSEI - cprintf(BLUE,"Received %d Bytes\n", n); + cprintf(GREEN,"Received %d Bytes\n", n); #endif + cprintf(GREEN,"Received HV: '%s'\n",buffer); fflush(stdout); /*Feb_Control_CloseSerialCommunication();*/ if(buffer[0] != 's'){ @@ -715,13 +720,14 @@ int Feb_Control_ReceiveHighVoltage(unsigned int* value){ //request strcpy(buffer,"g "); + cprintf(GREEN,"\nSending HV: '%s'\n",buffer); n = write(Feb_Control_hv_fd, buffer, SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE); if (n < 0) { cprintf(RED,"\nWarning: Error writing to i2c bus\n"); return 0; } #ifdef VERBOSEI - cprintf(BLUE,"Sent %d Bytes\n", n); + cprintf(GREEN,"Sent %d Bytes\n", n); #endif //ok/fail @@ -733,8 +739,9 @@ int Feb_Control_ReceiveHighVoltage(unsigned int* value){ return 0; } #ifdef VERBOSEI - cprintf(BLUE,"Received %d Bytes\n", n); + cprintf(GREEN,"Received %d Bytes\n", n); #endif + cprintf(GREEN,"Received HV: '%s'\n",buffer); if(buffer[0] != 's'){ cprintf(RED,"\nWarning: failed to read high voltage\n"); return 0; @@ -748,8 +755,9 @@ int Feb_Control_ReceiveHighVoltage(unsigned int* value){ return 0; } #ifdef VERBOSEI - cprintf(BLUE,"Received %d Bytes\n", n); + cprintf(GREEN,"Received %d Bytes\n", n); #endif + cprintf(GREEN,"Received HV: '%s'\n",buffer); /*Feb_Control_OpenSerialCommunication();*/ if (!sscanf(buffer,"%d",value)){ cprintf(RED,"\nWarning: failed to scan high voltage read\n"); diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.6 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.7 similarity index 73% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.6 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.7 index 1d201568e1eb80d8f4e173f60f337dd8bab1be85..7aa847bf13c28d25fc7a00ad29fb19f728e9e407 100755 GIT binary patch delta 24371 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 z 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 delta 23962 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 diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/hv9m_blackfin_serverv3.0.0.1 b/slsDetectorSoftware/eigerDetectorServer/bin/hv9m_blackfin_serverv3.0.0.1 new file mode 100755 index 0000000000000000000000000000000000000000..4ab730239ac45ed9b96f3694159863131b64c287 GIT binary patch literal 30728 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 literal 0 HcmV?d00001 diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt index 5314965df..1c9d5a4d6 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 2dfbd9016b501eca6ee2c00a08e49a3f7e7990d8 -Revision: 296 +Repsitory UUID: 177efa2636a7cee812707537ad90489a61832942 +Revision: 299 Branch: 3.0-rc Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1457 -Last Changed Date: 2017-08-08 15:23:10.000000002 +0200 ./Makefile +Last Changed Rev: 1480 +Last Changed Date: 2017-08-17 09:06:21.000000002 +0200 ./Makefile diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h index c01ec39e8..dec316953 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUID "2dfbd9016b501eca6ee2c00a08e49a3f7e7990d8" -//#define SVNREV 0x1457 +#define SVNREPUUID "177efa2636a7cee812707537ad90489a61832942" +//#define SVNREV 0x1480 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x1457 -#define SVNDATE 0x20170808 +#define SVNREV 0x1480 +#define SVNDATE 0x20170817 // From 722fb5801082cc60d7b84bb7edb168afdd5e73b0 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 12:04:54 +0200 Subject: [PATCH 16/45] bugfix:trimval gave first pixel value and not -1 if all are different --- ....0.16.7 => eigerDetectorServerv3.0.0.16.8} | Bin 288747 -> 288747 bytes .../slsDetectorFunctionList.c | 23 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv3.0.0.16.7 => eigerDetectorServerv3.0.0.16.8} (71%) diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.7 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.8 similarity index 71% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.7 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.8 index 7aa847bf13c28d25fc7a00ad29fb19f728e9e407..b485fa5dd08202b72c4c10ba4d295ded9b6198ff 100755 GIT binary patch delta 25604 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 delta 25433 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 KjMX0;{=WcaVts!A diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 9ab1467ab..515aa3a61 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -299,6 +299,12 @@ void allocateDetectorStructureMemory(){ (detectorModules)->offset=0; (detectorModules)->reg=0; thisSettings = UNINITIALIZED; + + // if trimval requested, should return -1 to acknowledge unknown + int ichan=0; + for (ichan=0; ichan<(detectorModules->nchan); ichan++) { + *((detectorModules->chanregs)+ichan) = -1; + } } @@ -554,7 +560,7 @@ int setModule(sls_detector_module myMod, int delay){ if(myMod.nchan==0 && myMod.nchip == 0) cprintf(BLUE,"Setting module without trimbits\n"); else{ - cprintf(GREEN,"Setting module with trimbits\n"); + printf("Setting module with trimbits\n"); //includ gap pixels unsigned int tt[263680]; int iy,ichip,ix,ip=0,ich=0; @@ -1063,11 +1069,24 @@ int setAllTrimbits(int val){ } } } + cprintf(GREEN, "All trimbits have been set to %d\n", val); return OK; } int getAllTrimbits(){ - return *((detectorModules->chanregs)); + int ichan=0; + int value = *((detectorModules->chanregs)); + if (detectorModules){ + for (ichan=0; ichan<(detectorModules->nchan); ichan++) { + if(*((detectorModules->chanregs)+ichan) != value) { + value= -1; + break; + } + + } + } + printf("Value of all Trimbits: %d\n", value); + return value; } int getBebFPGATemp(){ From 5ef00125180d1d68070e2edfcf224379511d8bf9 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 13:55:44 +0200 Subject: [PATCH 17/45] command line docu update. more coming --- .../slsDetector/slsDetectorCommand.cpp | 1590 +++++++++-------- 1 file changed, 803 insertions(+), 787 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index bc05fdd3c..96fc6b284 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -96,6 +96,72 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdExitServer; i++; + /*! \page test + - flippeddatay [i] enables/disables data being flipped across y axis. 1 enables, 0 disables. Not implemented. + */ + descrToFuncMap[i].m_pFuncName="flippeddatay"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; + i++; + + /* digital test and debugging */ + + /*! \page test + - digitest [i] will perform test which will plot the unique channel identifier, instead of data. Only get! + */ + descrToFuncMap[i].m_pFuncName="digitest"; // /* find command! */ + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDigiTest; + i++; + + /*! \page test + - bustest performs test of the bus interface between FPGA and embedded Linux system. Can last up to a few minutes. Cannot set! Used for Mythen only. Only get! + */ + descrToFuncMap[i].m_pFuncName="bustest"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDigiTest; + i++; + + /*! \page test + - digibittest:[i] performs digital test of the module i. Returns 0 if succeeded, otherwise error mask. Only put! + */ + descrToFuncMap[i].m_pFuncName="digibittest"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDigiTest; + i++; + + /*! \page test + - reg [addr] [val] ??? writes to an register \c addr with \c value in hexadecimal format. + */ + descrToFuncMap[i].m_pFuncName="reg"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; + i++; + + /*! \page test + - adcreg [addr] [val] ??? writes to an adc register \c addr with \c value in hexadecimal format. Only put! + */ + descrToFuncMap[i].m_pFuncName="adcreg"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; + i++; + + /*! \page test + - setbit ??? Only put! + */ + descrToFuncMap[i].m_pFuncName="setbit"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; + i++; + + /*! \page test + - clearbit ??? Only put! + */ + descrToFuncMap[i].m_pFuncName="clearbit"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; + i++; + + /*! \page test + - getbit ??? Only get! + */ + descrToFuncMap[i].m_pFuncName="getbit"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; + i++; + + @@ -164,17 +230,23 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page config Configuration commands Commands to configure the detector. these commands are often left to the configuration file. - - \ref detstructure "Detector Structure": commands to configure detector structure - - \ref detstatus "Detector Status": commands to configure detector status - - \ref detsize "Detector Data Size": commands to configure detector data size - - \ref versions "Versions": commands to check version of each subsytem + - \ref configstructure "Data Structure": commands to configure detector data structure + - \ref configstatus "Status": commands to configure detector status + - \ref configsize "Data Size": commands to configure detector data size + - \ref configflags "Flags": commands to configure detector flags + - \ref configfpga "FPGA": commands to configure FPGA of the detector + - \ref configchip "Chip": commands to configure chip of the detector + - \ref configversions "Versions": commands to check version of each subsytem + - \ref configtimers "Timers": commands to configure the timers of the detector + - \ref configrotimers "RO Timers": commands to configure the read only timers of the detector + - \ref configspeed "Speed": commands to configure speed of detector + - \ref configsettings "Detector Parameters": commands to configure/retrieve configuration of detector */ /* Detector structure configuration and debugging commands */ - /*! \page config - \section detstructure Detector Structure - commands to configure detector structure + \section configstructure Data Structure + commands to configure detector data structure */ /*! \page config @@ -241,7 +313,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /*! \page config - \section detstatus Detector Status + \section configstatus Status commands to configure detector status */ @@ -267,9 +339,8 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* detector and data size */ - /*! \page config - \section detsize Detector Data Size + \section configsize Data Size commands to configure detector data size */ @@ -324,6 +395,447 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { + /* flags */ + /*! \page config + \section configflags Flags + commands to configure detector flags + */ + + /*! \page config + - flags [flag] sets/gets the readout flags to mode. Options: none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, unknown. Used for MYTHEN and EIGER only. + */ + descrToFuncMap[i].m_pFuncName="flags"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; + i++; + + /*! \page config + - extsig:[i] [flag] sets/gets the mode of the external signal i. Options: \c off, \c gate_in_active_high, \c gate_in_active_low, \c trigger_in_rising_edge, \c trigger_in_falling_edge, + \c ro_trigger_in_rising_edge, \c ro_trigger_in_falling_edge, \c gate_out_active_high, \c gate_out_active_low, \c trigger_out_rising_edge, \c trigger_out_falling_edge, \c ro_trigger_out_rising_edge, + \c ro_trigger_out_falling_edge. \n Used in MYTHEN, GOTTHARD, PROPIX only. + */ + descrToFuncMap[i].m_pFuncName="extsig"; /* find command! */ + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; + i++; + + + /* fpga */ + /*! \page config + \section configfpga FPGA + commands to configure FPGA of the detector + */ + + /*! \page config + - programfpga [file] programs the FPGA with file f (with .pof extension). Used for JUNGFRAU, MOENCH only. Only put! + */ + descrToFuncMap[i].m_pFuncName="programfpga"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; + i++; + + /*! \page config + - resetfpga [f] resets FPGA, where f can be any value. Used for JUNGFRAU only. Only put! + */ + descrToFuncMap[i].m_pFuncName="resetfpga"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; + i++; + + + /* chip */ + /*! \page config + \section configchip Chip + commands to configure chip of the detector + */ + + /*! \page config + - powerchip [i] Powers on/off the chip. 1 powers on, 0 powers off. Can also get the power status. Used for JUNGFRAU only. + */ + descrToFuncMap[i].m_pFuncName="powerchip"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; + i++; + + /*! \page config + - led [i] sets/gets the led status. 1 on, 0 off. Used for MOENCH only ?? + */ + descrToFuncMap[i].m_pFuncName="led"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; + i++; + + /*! \page config + - pulse [n] [x] [y] pulses pixel at coordinates (x,y) n number of times. Used in EIGER only. Only put!" + */ + descrToFuncMap[i].m_pFuncName="pulse"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; + i++; + + /*! \page config + - pulsenmove [n] [x] [y] pulses pixel n number of times and moves relatively by x value (x axis) and y value(y axis). Used in EIGER only. Only put!" + */ + descrToFuncMap[i].m_pFuncName="pulsenmove"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; + i++; + + /*! \page config + - pulsechip [n]pulses chip n number of times, while n=-1 will reset it to normal mode. Used in EIGER only. Only put!" + */ + descrToFuncMap[i].m_pFuncName="pulsechip"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; + i++; + + + + + /* versions/ serial numbers getId */ + /*! \page config + \section configversions Versions + Commands to check versions of each subsystem + */ + + /*! \page config + - moduleversion:[i] Gets the firmware version of module i. Used for MYTHEN only. Only get! + */ + descrToFuncMap[i].m_pFuncName="moduleversion"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; + i++; + + /*! \page config + - detectornumber Gets the serial number or MAC of detector. Only get! + */ + descrToFuncMap[i].m_pFuncName="detectornumber"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; + i++; + + /*! \page config + - modulenumber:[i] Gets the serial number of module i. Used for MYTHEN only. Only get! + */ + descrToFuncMap[i].m_pFuncName="modulenumber"; /* find command! */ + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; + i++; + + /*! \page config + - detectorversion Gets the firmware version of detector. Only get! + */ + descrToFuncMap[i].m_pFuncName="detectorversion"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; + i++; + + /*! \page config + - softwareversion Gets the software version of detector server. Only get! + */ + descrToFuncMap[i].m_pFuncName="softwareversion"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; + i++; + + /*! \page config + - thisversion Gets the software version of this client software. Only get! + */ + descrToFuncMap[i].m_pFuncName="thisversion"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; + i++; + + /*! \page config + - receiverversion Gets the software version of receiver. Only get! + */ + descrToFuncMap[i].m_pFuncName="receiverversion"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; + i++; + + /* r/w timers */ + /*! \page config + \section configtimers Timers + commands to configure the timers of the detector + */ + + /*! \page config + - timing [mode] sets/gets synchronization mode of the detector. Mode: auto, trigger, ro_trigger, gating, triggered_gating + */ + descrToFuncMap[i].m_pFuncName="timing"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTiming; + i++; + + /*! \page config + - exptime [i] sets/gets exposure time in s + */ + descrToFuncMap[i].m_pFuncName="exptime"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /*! \page config + - subexptime [i] sets/gets sub exposure time in s. Used in EIGER only in 32 bit mode. + */ + descrToFuncMap[i].m_pFuncName="subexptime"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /*! \page config + - period [i] sets/gets frame period in s. + */ + descrToFuncMap[i].m_pFuncName="period"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /*! \page config + - delay [i] sets/gets delay in s. Used in MYTHEN, GOTTHARD only + */ + descrToFuncMap[i].m_pFuncName="delay"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /*! \page config + - gates [i] sets/gets number of gates. Used in MYTHEN, GOTTHARD, EIGER only + */ + descrToFuncMap[i].m_pFuncName="gates"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /*! \page config + - gates [i] sets/gets number of frames. If \c timing is not \c auto, then it is the number of frames per cycle/trigger. + */ + descrToFuncMap[i].m_pFuncName="frames"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /*! \page config + - cycles [i] sets/gets number of triggers. Timing mode should be set appropriately. + */ + descrToFuncMap[i].m_pFuncName="cycles"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /*! \page config + - probes [i] sets/gets number of probes to accumulate. When setting, max 3! cycles should be set to 1, frames to the number of pump-probe events. Used in MYTHEN only + */ + descrToFuncMap[i].m_pFuncName="probes"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /*! \page config + - measurements [i] sets/gets number of measurements. + */ + descrToFuncMap[i].m_pFuncName="measurements"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /*! \page config + - samples [i] sets/gets number of samples expected from the jctb. Used in CHIP TEST BOARD only. + */ + descrToFuncMap[i].m_pFuncName="samples"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + i++; + + /* read only timers */ + /*! \page config + \section configrotimers RO Timers + commands to configure the read only timers of the detector + */ + + /*! \page config + - exptimel gets exposure time left. Used in MYTHEN, GOTTHARD only. Only get! + */ + descrToFuncMap[i].m_pFuncName="exptimel"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + /*! \page config + - periodl gets frame period left. Used in MYTHEN, GOTTHARD only. Only get! + */ + descrToFuncMap[i].m_pFuncName="periodl"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + /*! \page config + - delayl gets delay left. Used in MYTHEN, GOTTHARD only. Only get! + */ + descrToFuncMap[i].m_pFuncName="delayl"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + /*! \page config + - gatesl gets number of gates left. Used in MYTHEN, GOTTHARD only. Only get! + */ + descrToFuncMap[i].m_pFuncName="gatesl"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + /*! \page config + - framesl gets number of frames left. Used in MYTHEN, GOTTHARD only. Only get! + */ + descrToFuncMap[i].m_pFuncName="framesl"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + /*! \page config + - cyclesl gets number of cylces left. Used in MYTHEN, GOTTHARD only. Only get! + */ + descrToFuncMap[i].m_pFuncName="cyclesl"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + /*! \page config + - probesl gets number of probes left. Used in MYTHEN, GOTTHARD only. Only get! + */ + descrToFuncMap[i].m_pFuncName="probesl"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + // descrToFuncMap[i].m_pFuncName="progress"; + // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + // i++; + + /*! \page config + - now ??? Only get! + */ + descrToFuncMap[i].m_pFuncName="now"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + /*! \page config + - timestamp ??? Only get! + */ + descrToFuncMap[i].m_pFuncName="timestamp"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + /*! \page config + - nframes ??? Only get! + */ + descrToFuncMap[i].m_pFuncName="nframes"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + i++; + + /* speed */ + /*! \page config + \section configspeed Speed + commands to configure speed of detector + */ + + /*! \page config + - clkdivider [i] sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. MYTHEN[???] + */ + descrToFuncMap[i].m_pFuncName="clkdivider"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - clkdivider [i] sets/gets length of set/reset signals (in clock cycles). Used in MYTHEN only + */ + descrToFuncMap[i].m_pFuncName="setlength"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - clkdivider [i] sets/gets waitstates of the bus interface (in clock cycles). Used in MYTHEN only + */ + descrToFuncMap[i].m_pFuncName="waitstates"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - clkdivider [i] sets/gets clock divider in tot mode. Used in MYTHEN only + */ + descrToFuncMap[i].m_pFuncName="totdivider"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - clkdivider [i] sets/gets duty cycle of the tot clock. Used in MYTHEN only + */ + descrToFuncMap[i].m_pFuncName="totdutycycle"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - phasestep [i] ??? + */ + descrToFuncMap[i].m_pFuncName="phasestep"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - oversampling [i] ??? + */ + descrToFuncMap[i].m_pFuncName="oversampling"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - adcclk [i] ??? + */ + descrToFuncMap[i].m_pFuncName="adcclk"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - adcphase [i] ??? Used in MYTHEN, JUNGFRAU only. + */ + descrToFuncMap[i].m_pFuncName="adcphase"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - adcpipeline [i] ??? + */ + descrToFuncMap[i].m_pFuncName="adcpipeline"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - dbitclk [i] ??? + */ + descrToFuncMap[i].m_pFuncName="dbitclk"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - dbitphase [i] ??? + */ + descrToFuncMap[i].m_pFuncName="dbitphase"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + /*! \page config + - dbitpipeline [i] ??? + */ + descrToFuncMap[i].m_pFuncName="dbitpipeline"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + i++; + + + /* settings dump/retrieve */ + /*! \page config + \section configsettings Detector Parameters + commands to configure/retrieve configuration of detector + */ + + /*! \page config + - config [fname] sets/saves detector/receiver to configuration contained in fname. Same as executing sls_detector_put for every line. Normally a one time operation. + */ + descrToFuncMap[i].m_pFuncName="config"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; + i++; + + /* settings dump/retrieve */ + /*! \page config + - rx_printconfig prints the receiver configuration. Only get! + */ + descrToFuncMap[i].m_pFuncName="rx_printconfig"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; + i++; + + /*! \page config + - parameters [fname] sets/saves detector parameters contained in fname. Normally once per different measurement. + */ + descrToFuncMap[i].m_pFuncName="parameters"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; + i++; + + /*! \page config + - setup [fname] sets/saves detector complete setup contained in fname (extensions automatically generated), including trimfiles, ff coefficients etc. + */ + descrToFuncMap[i].m_pFuncName="setup"; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; + i++; + + + /* data processing commands */ @@ -389,7 +901,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /*! \page data - - angdir [i] Sets/gets the angular direction. 1 means increasing channels number as increasing angle, -1 increasing channel number decreasing angle. + - angdir [i] Sets/gets the angular direction. 1 means increasing channels number as increasing angle, -1 increasing channel number decreasing angle. */ descrToFuncMap[i].m_pFuncName="angdir" ;// descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAngConv; @@ -444,8 +956,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* trim/cal directories */ - - /*! \page settings Detector settings commands Commands to setup the settings of the detector */ @@ -477,571 +987,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTrimEn; i++; - - - /* file name */ - - /*! \page output Output settings - Commands to setup the file destination and format - */ - - /*! \page output - - outdir [dir] Sets/gets the file output directory (string) - */ - descrToFuncMap[i].m_pFuncName="outdir"; //OK - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOutDir; - i++; - - /*! \page output - - fname [fn] Sets/gets the root of the output file name (string) - */ - descrToFuncMap[i].m_pFuncName="fname"; //OK - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; - i++; - - /*! \page output - - index [i] Sets/gets the current file index (int) - */ - descrToFuncMap[i].m_pFuncName="index"; //OK - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileIndex; - i++; - - /*! \page output - - enablefwrite [i] Enables/disables file writing. 1 enables, 0 disables. - */ - descrToFuncMap[i].m_pFuncName="enablefwrite"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdEnablefwrite; - i++; - - /*! \page output - - overwrite [i] enables(1) /disables(0) file overwriting - */ - descrToFuncMap[i].m_pFuncName="overwrite"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOverwrite; - i++; - - /*! \page output - - currentfname gets the filename for the data without index and extension - */ - descrToFuncMap[i].m_pFuncName="currentfname"; //OK - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; - i++; - - /*! \page output - - fileformat sets/gets the file format for data in receiver. Options: [ascii, binary, hdf5]. Ascii is not implemented in Receiver. - */ - descrToFuncMap[i].m_pFuncName="fileformat"; //OK - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; - i++; - - - - - /* Acquisition actions */ - - /*! \page actions Actions - Commands to define scripts to be executed during the acquisition flow - */ - - /*! \page actions - - positions [n [p0..pn-1]] sets/gets number of angular position and positions to be acquired. - */ - descrToFuncMap[i].m_pFuncName="positions"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPositions; - i++; - - /*! \page actions - - startscript [s] sets/gets the script to be executed at the beginning of the acquisition. \c none unsets. - */ - descrToFuncMap[i].m_pFuncName="startscript"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - startscriptpar [s] sets/gets a string to be passed as a parameter to the startscript - */ - descrToFuncMap[i].m_pFuncName="startscriptpar"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - stopscript [s] sets/gets the script to be executed at the end of the acquisition. \c none unsets. - */ - descrToFuncMap[i].m_pFuncName="stopscript"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - stopscriptpar [s] sets/gets a string to be passed as a parameter to the stopscript - */ - descrToFuncMap[i].m_pFuncName="stopscriptpar"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - scriptbefore [s] sets/gets the script to be executed before starting the detector every time in the acquisition. \c none unsets. - */ - descrToFuncMap[i].m_pFuncName="scriptbefore"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - scriptbeforepar [s] sets/gets a string to be passed as a parameter to the scriptbefore - */ - descrToFuncMap[i].m_pFuncName="scriptbeforepar"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - scriptafter [s] sets/gets the script to be executed after the detector has finished every time in the acquisition. \c none unsets. - */ - descrToFuncMap[i].m_pFuncName="scriptafter"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - scriptafterpar [s] sets/gets a string to be passed as a parameter to the scriptafter - */ - descrToFuncMap[i].m_pFuncName="scriptafterpar"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - headerafter [s] sets/gets the script to be executed for logging the detector parameters. \c none unsets. - */ - descrToFuncMap[i].m_pFuncName="headerafter"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - headerbefore [s] sets/gets the script to be executed for logging the detector parameters. \c none unsets. - */ - descrToFuncMap[i].m_pFuncName="headerbefore"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - headerbeforepar [s] sets/gets a string to be passed as a parameter to the headerbefore script - */ - descrToFuncMap[i].m_pFuncName="headerbeforepar"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - headerafterpar [s] sets/gets a string to be passed as a parameter to the headerafter script - */ - descrToFuncMap[i].m_pFuncName="headerafterpar"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - enacallog [i] enables/disables logging of the parameters necessary for the energy calibration. 1 sets, 0 unsets. - */ - descrToFuncMap[i].m_pFuncName="encallog"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - angcallog [i] enables/disables logging of the parameters necessary for the angular calibration. 1 sets, 0 unsets. - */ - descrToFuncMap[i].m_pFuncName="angcallog"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; - i++; - - /*! \page actions - - scan0script [s] sets/gets the script to be executed for the scan 0 level. \c none unsets. - */ - descrToFuncMap[i].m_pFuncName="scan0script"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - /*! \page actions - - scan0par [s] sets/gets a string to be passed as a parameter to the scan0script - */ - descrToFuncMap[i].m_pFuncName="scan0par"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - /*! \page actions - - scan0prec [i] sets/gets number of digits to be used for the scan0 variable in the file name. - */ - descrToFuncMap[i].m_pFuncName="scan0prec"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - /*! \page actions - - scan0steps [i [s0..sn-1]] sets/gets number of steps (int) of the scan0 level and their values (float). - */ - descrToFuncMap[i].m_pFuncName="scan0steps"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - - /*! \page actions - - scan0range [smin smax sstep] sets scan0 min, max and step, returns the number of steps and their values as scan0steps. - */ - descrToFuncMap[i].m_pFuncName="scan0range"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - /*! \page actions - - scan1script [s] sets/gets the script to be executed for the scan1 level. \c none unsets. - */ - descrToFuncMap[i].m_pFuncName="scan1script"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - /*! \page actions - - scan1par [s] sets/gets a string to be passed as a parameter to the scan1script - */ - descrToFuncMap[i].m_pFuncName="scan1par"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - /*! \page actions - - scan1prec [i] sets/gets number of digits to be used for the scan1 variable in the file name. - */ - descrToFuncMap[i].m_pFuncName="scan1prec"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - /*! \page actions - - scan1steps [i [s0..sn-1]] sets/gets number of steps (int) of the scan1 level and their values (float). - */ - descrToFuncMap[i].m_pFuncName="scan1steps"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - /*! \page actions - - scan1range [smin smax sstep] sets scan1 min, max and step, returns the number of steps and their values as scan1steps. - */ - descrToFuncMap[i].m_pFuncName="scan1range"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; - i++; - - - - - - /* communication configuration */ - - /*! \page network Network - Commands to setup the network between client, detector and receiver - - rx_hostname [s] sets/gets the receiver hostname or IP address, configures detector mac with all network parameters and updates receiver with acquisition parameters. Normally used for single detectors (Can be multi-detector). \c none disables. If used, use as last network command in configuring detector MAC. - */ - descrToFuncMap[i].m_pFuncName="rx_hostname"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - /*! \page network - - rx_udpip [ip] sets/gets the ip address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). Used if different from eth0. - */ - descrToFuncMap[i].m_pFuncName="rx_udpip"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - rx_udpmac [mac] sets/gets the mac address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). - */ - descrToFuncMap[i].m_pFuncName="rx_udpmac"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - rx_udpport [port] sets/gets the port of the receiver UDP interface where the data from the detector will be streamed to. Use single-detector command. - */ - descrToFuncMap[i].m_pFuncName="rx_udpport"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - rx_udpport2 [port] sets/gets the second port of the receiver UDP interface where the data from the second half of the detector will be streamed to. Use single-detector command. Used for EIGER only. - */ - descrToFuncMap[i].m_pFuncName="rx_udpport2"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - detectormac [mac] sets/gets the mac address of the detector UDP interface from where the detector will stream data. Use single-detector command. Normally unused. - */ - descrToFuncMap[i].m_pFuncName="detectormac"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - detectorip [ip] sets/gets the ip address of the detector UDP interface from where the detector will stream data. Use single-detector command. Keep in same subnet as rx_udpip (if rx_udpip specified). - */ - descrToFuncMap[i].m_pFuncName="detectorip"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - txndelay_left [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's left UDP port. Use single-detector command. Used for EIGER only. - */ - descrToFuncMap[i].m_pFuncName="txndelay_left"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - txndelay_right [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's right UDP port. Use single-detector command. Used for EIGER only. - */ - descrToFuncMap[i].m_pFuncName="txndelay_right"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - txndelay_frame [delay] sets/gets the transmission frame period of entire frame being streamed out from the detector for both ports. Use single-detector command. Used for EIGER only. - */ - descrToFuncMap[i].m_pFuncName="txndelay_frame"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - flowcontrol_10g [delay] Enables/disables 10 GbE flow control. 1 enables, 0 disables. Used for EIGER only. - */ - descrToFuncMap[i].m_pFuncName="flowcontrol_10g"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - zmqport [port] sets/gets the 0MQ (TCP) port of the receiver from where data is streamed to the client. Use single-detector command to set individually or multi-detector command to calculate based on \c port for the rest. - */ - descrToFuncMap[i].m_pFuncName="zmqport"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; - i++; - - /*! \page network - - configuremac [i] configures the MAC of the detector with these parameters: detectorip, detectormac, rx_udpip, rx_udpmac, rx_udpport, rx_udpport2 (if applicable). Only put! - */ - descrToFuncMap[i].m_pFuncName="configuremac"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfigureMac; - i++; - - /*! \page network - - rx_tcpport [port] sets/gets the port of the client-receiver TCP interface. Use single-detector command. Is different for each detector if same \c rx_hostname used. Must be first command to communicate with receiver. - */ - descrToFuncMap[i].m_pFuncName="rx_tcpport"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPort; - i++; - - /*! \page network - - port [port] sets/gets the port of the client-detector control server TCP interface. Use single-detector command. Default value is 1952 for all detectors. Normally not changed. - */ - descrToFuncMap[i].m_pFuncName="port"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPort; - i++; - - /*! \page network - - stopport [port] sets/gets the port of the client-detector stop server TCP interface. Use single-detector command. Default value is 1953 for all detectors. Normally not changed. - */ - descrToFuncMap[i].m_pFuncName="stopport"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPort; - i++; - - /*! \page config - - lock [i] Locks/Unlocks the detector to communicate with this client. 1 locks, 0 unlocks. - */ - descrToFuncMap[i].m_pFuncName="lock"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLock; - i++; - - /*! \page network - - lastclient Gets the last client communicating with the detector. Cannot put! - */ - descrToFuncMap[i].m_pFuncName="lastclient"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLastClient; - i++; - - - - /*! \page test - - flippeddatay [i] enables/disables data being flipped across y axis. 1 enables, 0 disables. Not implemented. - */ - descrToFuncMap[i].m_pFuncName="flippeddatay"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; - i++; - - /* flags */ - - /*! \page config - - flags [flag] sets/gets the readout flags to mode. Options: none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, unknown. Used for MYTHEN and EIGER only. - */ - descrToFuncMap[i].m_pFuncName="flags"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; - i++; - - /*! \page config - - extsig:[i] [flag] sets/gets the mode of the external signal i. Options: \c off, \c gate_in_active_high, \c gate_in_active_low, \c trigger_in_rising_edge, \c trigger_in_falling_edge, - \c ro_trigger_in_rising_edge, \c ro_trigger_in_falling_edge, \c gate_out_active_high, \c gate_out_active_low, \c trigger_out_rising_edge, \c trigger_out_falling_edge, \c ro_trigger_out_rising_edge, - \c ro_trigger_out_falling_edge. \n Used in MYTHEN, GOTTHARD, PROPIX only. - */ - descrToFuncMap[i].m_pFuncName="extsig"; /* find command! */ - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; - i++; - - - /* fpga */ - - /*! \page config - - programfpga [file] programs the FPGA with file f (with .pof extension). Used for JUNGFRAU, MOENCH only. Only put! - */ - descrToFuncMap[i].m_pFuncName="programfpga"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; - i++; - - /*! \page config - - resetfpga [f] resets FPGA, where f can be any value. Used for JUNGFRAU only. Only put! - */ - descrToFuncMap[i].m_pFuncName="resetfpga"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; - i++; - - - /* chip */ - - /*! \page config - - powerchip [i] Powers on/off the chip. 1 powers on, 0 powers off. Can also get the power status. Used for JUNGFRAU only. - */ - descrToFuncMap[i].m_pFuncName="powerchip"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; - i++; - - - - /* chip */ - - /*! \page config - - led [i] sets/gets the led status. 1 on, 0 off. Used for MOENCH only ?? - */ - descrToFuncMap[i].m_pFuncName="led"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; - i++; - - - - /* versions/ serial numbers getId */ - - /*! \page config - \section versions Versions - Commands to check versions of each subsystem - */ - - /*! - - moduleversion:[i] Gets the firmware version of module i. Used for MYTHEN only. Only get! - */ - descrToFuncMap[i].m_pFuncName="moduleversion"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; - i++; - - /*! - - detectornumber Gets the serial number or MAC of detector. Only get! - */ - descrToFuncMap[i].m_pFuncName="detectornumber"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; - i++; - - /*! - - modulenumber:[i] Gets the serial number of module i. Used for MYTHEN only. Only get! - */ - descrToFuncMap[i].m_pFuncName="modulenumber"; /* find command! */ - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; - i++; - - /*! - - detectorversion Gets the firmware version of detector. Only get! - */ - descrToFuncMap[i].m_pFuncName="detectorversion"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; - i++; - - /*! - - softwareversion Gets the software version of detector server. Only get! - */ - descrToFuncMap[i].m_pFuncName="softwareversion"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; - i++; - - /*! - - thisversion Gets the software version of this client software. Only get! - */ - descrToFuncMap[i].m_pFuncName="thisversion"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; - i++; - - /*! - - receiverversion Gets the software version of receiver. Only get! - */ - descrToFuncMap[i].m_pFuncName="receiverversion"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; - i++; - - - /* digital test and debugging */ - - /*! \page test - - digitest [i] will perform test which will plot the unique channel identifier, instead of data. Only get! - */ - descrToFuncMap[i].m_pFuncName="digitest"; // /* find command! */ - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDigiTest; - i++; - - /*! \page test - - bustest performs test of the bus interface between FPGA and embedded Linux system. Can last up to a few minutes. Cannot set! Used for Mythen only. Only get! - */ - descrToFuncMap[i].m_pFuncName="bustest"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDigiTest; - i++; - - /*! \page test - - digibittest:[i] performs digital test of the module i. Returns 0 if succeeded, otherwise error mask. Only put! - */ - descrToFuncMap[i].m_pFuncName="digibittest"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDigiTest; - i++; - - /*! \page test - - reg [addr] [val] ??? writes to an register \c addr with \c value in hexadecimal format. - */ - descrToFuncMap[i].m_pFuncName="reg"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; - i++; - - /*! \page test - - adcreg [addr] [val] ??? writes to an adc register \c addr with \c value in hexadecimal format. Only put! - */ - descrToFuncMap[i].m_pFuncName="adcreg"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; - i++; - - /*! \page test - - setbit ??? Only put! - */ - descrToFuncMap[i].m_pFuncName="setbit"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; - i++; - - /*! \page test - - clearbit ??? Only put! - */ - descrToFuncMap[i].m_pFuncName="clearbit"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; - i++; - - /*! \page test - - getbit ??? Only get! - */ - descrToFuncMap[i].m_pFuncName="getbit"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; - i++; - - - - - - - - - - /* settings, threshold */ /*! \page settings @@ -1597,283 +1542,394 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; - /* r/w timers */ - /*! \page config - - timing [mode] sets/gets synchronization mode of the detector. Mode: auto, trigger, ro_trigger, gating, triggered_gating + + + /* file name */ + + /*! \page output Output settings + Commands to setup the file destination and format */ - descrToFuncMap[i].m_pFuncName="timing"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTiming; - i++; - /*! \page config - - exptime [i] sets/gets exposure time in s + /*! \page output + - outdir [dir] Sets/gets the file output directory (string) */ - descrToFuncMap[i].m_pFuncName="exptime"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + descrToFuncMap[i].m_pFuncName="outdir"; //OK + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOutDir; i++; - /*! \page config - - subexptime [i] sets/gets sub exposure time in s. Used in EIGER only in 32 bit mode. + /*! \page output + - fname [fn] Sets/gets the root of the output file name (string) */ - descrToFuncMap[i].m_pFuncName="subexptime"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + descrToFuncMap[i].m_pFuncName="fname"; //OK + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; i++; - /*! \page config - - period [i] sets/gets frame period in s. + /*! \page output + - index [i] Sets/gets the current file index (int) */ - descrToFuncMap[i].m_pFuncName="period"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + descrToFuncMap[i].m_pFuncName="index"; //OK + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileIndex; i++; - /*! \page config - - delay [i] sets/gets delay in s. Used in MYTHEN, GOTTHARD only + /*! \page output + - enablefwrite [i] Enables/disables file writing. 1 enables, 0 disables. */ - descrToFuncMap[i].m_pFuncName="delay"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + descrToFuncMap[i].m_pFuncName="enablefwrite"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdEnablefwrite; i++; - /*! \page config - - gates [i] sets/gets number of gates. Used in MYTHEN, GOTTHARD, EIGER only + /*! \page output + - overwrite [i] enables(1) /disables(0) file overwriting */ - descrToFuncMap[i].m_pFuncName="gates"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + descrToFuncMap[i].m_pFuncName="overwrite"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOverwrite; i++; - /*! \page config - - gates [i] sets/gets number of frames. If \c timing is not \c auto, then it is the number of frames per cycle/trigger. + /*! \page output + - currentfname gets the filename for the data without index and extension */ - descrToFuncMap[i].m_pFuncName="frames"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + descrToFuncMap[i].m_pFuncName="currentfname"; //OK + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; i++; - /*! \page config - - cycles [i] sets/gets number of triggers. Timing mode should be set appropriately. + /*! \page output + - fileformat sets/gets the file format for data in receiver. Options: [ascii, binary, hdf5]. Ascii is not implemented in Receiver. */ - descrToFuncMap[i].m_pFuncName="cycles"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + descrToFuncMap[i].m_pFuncName="fileformat"; //OK + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; i++; - /*! \page config - - probes [i] sets/gets number of probes to accumulate. When setting, max 3! cycles should be set to 1, frames to the number of pump-probe events. Used in MYTHEN only + + + + /* Acquisition actions */ + + /*! \page actions Actions + Commands to define scripts to be executed during the acquisition flow */ - descrToFuncMap[i].m_pFuncName="probes"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; - i++; - /*! \page config - - measurements [i] sets/gets number of measurements. + /*! \page actions + - positions [n [p0..pn-1]] sets/gets number of angular position and positions to be acquired. */ - descrToFuncMap[i].m_pFuncName="measurements"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + descrToFuncMap[i].m_pFuncName="positions"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPositions; i++; - /*! \page config - - samples [i] sets/gets number of samples expected from the jctb. Used in CHIP TEST BOARD only. + /*! \page actions + - startscript [s] sets/gets the script to be executed at the beginning of the acquisition. \c none unsets. */ - descrToFuncMap[i].m_pFuncName="samples"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; + descrToFuncMap[i].m_pFuncName="startscript"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /* read only timers */ - - /*! \page config - - exptimel gets exposure time left. Used in MYTHEN, GOTTHARD only. Only get! + /*! \page actions + - startscriptpar [s] sets/gets a string to be passed as a parameter to the startscript */ - descrToFuncMap[i].m_pFuncName="exptimel"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="startscriptpar"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - periodl gets frame period left. Used in MYTHEN, GOTTHARD only. Only get! + /*! \page actions + - stopscript [s] sets/gets the script to be executed at the end of the acquisition. \c none unsets. */ - descrToFuncMap[i].m_pFuncName="periodl"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="stopscript"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - delayl gets delay left. Used in MYTHEN, GOTTHARD only. Only get! + /*! \page actions + - stopscriptpar [s] sets/gets a string to be passed as a parameter to the stopscript */ - descrToFuncMap[i].m_pFuncName="delayl"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="stopscriptpar"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - gatesl gets number of gates left. Used in MYTHEN, GOTTHARD only. Only get! + /*! \page actions + - scriptbefore [s] sets/gets the script to be executed before starting the detector every time in the acquisition. \c none unsets. */ - descrToFuncMap[i].m_pFuncName="gatesl"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="scriptbefore"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - framesl gets number of frames left. Used in MYTHEN, GOTTHARD only. Only get! + /*! \page actions + - scriptbeforepar [s] sets/gets a string to be passed as a parameter to the scriptbefore */ - descrToFuncMap[i].m_pFuncName="framesl"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="scriptbeforepar"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - cyclesl gets number of cylces left. Used in MYTHEN, GOTTHARD only. Only get! + /*! \page actions + - scriptafter [s] sets/gets the script to be executed after the detector has finished every time in the acquisition. \c none unsets. */ - descrToFuncMap[i].m_pFuncName="cyclesl"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="scriptafter"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - probesl gets number of probes left. Used in MYTHEN, GOTTHARD only. Only get! + /*! \page actions + - scriptafterpar [s] sets/gets a string to be passed as a parameter to the scriptafter */ - descrToFuncMap[i].m_pFuncName="probesl"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="scriptafterpar"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - // descrToFuncMap[i].m_pFuncName="progress"; - // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; - // i++; - - /*! \page config - - now ??? Only get! + /*! \page actions + - headerafter [s] sets/gets the script to be executed for logging the detector parameters. \c none unsets. */ - descrToFuncMap[i].m_pFuncName="now"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="headerafter"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - timestamp ??? Only get! + /*! \page actions + - headerbefore [s] sets/gets the script to be executed for logging the detector parameters. \c none unsets. */ - descrToFuncMap[i].m_pFuncName="timestamp"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="headerbefore"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - nframes ??? Only get! + /*! \page actions + - headerbeforepar [s] sets/gets a string to be passed as a parameter to the headerbefore script */ - descrToFuncMap[i].m_pFuncName="nframes"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; + descrToFuncMap[i].m_pFuncName="headerbeforepar"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /* speed */ - /*! \page config - - clkdivider [i] sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. MYTHEN[???] + /*! \page actions + - headerafterpar [s] sets/gets a string to be passed as a parameter to the headerafter script */ - descrToFuncMap[i].m_pFuncName="clkdivider"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="headerafterpar"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - clkdivider [i] sets/gets length of set/reset signals (in clock cycles). Used in MYTHEN only + /*! \page actions + - enacallog [i] enables/disables logging of the parameters necessary for the energy calibration. 1 sets, 0 unsets. */ - descrToFuncMap[i].m_pFuncName="setlength"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="encallog"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - clkdivider [i] sets/gets waitstates of the bus interface (in clock cycles). Used in MYTHEN only + /*! \page actions + - angcallog [i] enables/disables logging of the parameters necessary for the angular calibration. 1 sets, 0 unsets. */ - descrToFuncMap[i].m_pFuncName="waitstates"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="angcallog"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; - /*! \page config - - clkdivider [i] sets/gets clock divider in tot mode. Used in MYTHEN only + /*! \page actions + - scan0script [s] sets/gets the script to be executed for the scan 0 level. \c none unsets. */ - descrToFuncMap[i].m_pFuncName="totdivider"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="scan0script"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - /*! \page config - - clkdivider [i] sets/gets duty cycle of the tot clock. Used in MYTHEN only + /*! \page actions + - scan0par [s] sets/gets a string to be passed as a parameter to the scan0script */ - descrToFuncMap[i].m_pFuncName="totdutycycle"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="scan0par"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - /*! \page config - - phasestep [i] ??? + /*! \page actions + - scan0prec [i] sets/gets number of digits to be used for the scan0 variable in the file name. */ - descrToFuncMap[i].m_pFuncName="phasestep"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="scan0prec"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - /*! \page config - - oversampling [i] ??? + /*! \page actions + - scan0steps [i [s0..sn-1]] sets/gets number of steps (int) of the scan0 level and their values (float). */ - descrToFuncMap[i].m_pFuncName="oversampling"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="scan0steps"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - /*! \page config - - adcclk [i] ??? + + /*! \page actions + - scan0range [smin smax sstep] sets scan0 min, max and step, returns the number of steps and their values as scan0steps. */ - descrToFuncMap[i].m_pFuncName="adcclk"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="scan0range"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - /*! \page config - - adcphase [i] ??? Used in MYTHEN, JUNGFRAU only. + /*! \page actions + - scan1script [s] sets/gets the script to be executed for the scan1 level. \c none unsets. */ - descrToFuncMap[i].m_pFuncName="adcphase"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="scan1script"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - /*! \page config - - adcpipeline [i] ??? + /*! \page actions + - scan1par [s] sets/gets a string to be passed as a parameter to the scan1script */ - descrToFuncMap[i].m_pFuncName="adcpipeline"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="scan1par"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - /*! \page config - - dbitclk [i] ??? + /*! \page actions + - scan1prec [i] sets/gets number of digits to be used for the scan1 variable in the file name. */ - descrToFuncMap[i].m_pFuncName="dbitclk"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="scan1prec"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - /*! \page config - - dbitphase [i] ??? + /*! \page actions + - scan1steps [i [s0..sn-1]] sets/gets number of steps (int) of the scan1 level and their values (float). */ - descrToFuncMap[i].m_pFuncName="dbitphase"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; + descrToFuncMap[i].m_pFuncName="scan1steps"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - - descrToFuncMap[i].m_pFuncName="dbitpipeline"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; - i++; - - - /* settings dump/retrieve */ - - /*! \page config - - config [fname] sets/saves detector/receiver to configuration contained in fname. Same as executing sls_detector_put for every line. Normally a one time operation. + /*! \page actions + - scan1range [smin smax sstep] sets scan1 min, max and step, returns the number of steps and their values as scan1steps. */ - descrToFuncMap[i].m_pFuncName="config"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; + descrToFuncMap[i].m_pFuncName="scan1range"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScans; i++; - /* settings dump/retrieve */ - /*! \page config - - rx_printconfig prints the receiver configuration. Only get! + + + + + /* communication configuration */ + + /*! \page network Network + Commands to setup the network between client, detector and receiver + - rx_hostname [s] sets/gets the receiver hostname or IP address, configures detector mac with all network parameters and updates receiver with acquisition parameters. Normally used for single detectors (Can be multi-detector). \c none disables. If used, use as last network command in configuring detector MAC. */ - descrToFuncMap[i].m_pFuncName="rx_printconfig"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; + descrToFuncMap[i].m_pFuncName="rx_hostname"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + /*! \page network + - rx_udpip [ip] sets/gets the ip address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). Used if different from eth0. + */ + descrToFuncMap[i].m_pFuncName="rx_udpip"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; - /*! \page config - - parameters [fname] sets/saves detector parameters contained in fname. Normally once per different measurement. + /*! \page network + - rx_udpmac [mac] sets/gets the mac address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). */ - descrToFuncMap[i].m_pFuncName="parameters"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; + descrToFuncMap[i].m_pFuncName="rx_udpmac"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; - /*! \page config - - setup [fname] sets/saves detector complete setup contained in fname (extensions automatically generated), including trimfiles, ff coefficients etc. + /*! \page network + - rx_udpport [port] sets/gets the port of the receiver UDP interface where the data from the detector will be streamed to. Use single-detector command. */ - descrToFuncMap[i].m_pFuncName="setup"; - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; + descrToFuncMap[i].m_pFuncName="rx_udpport"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; + /*! \page network + - rx_udpport2 [port] sets/gets the second port of the receiver UDP interface where the data from the second half of the detector will be streamed to. Use single-detector command. Used for EIGER only. + */ + descrToFuncMap[i].m_pFuncName="rx_udpport2"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + /*! \page network + - detectormac [mac] sets/gets the mac address of the detector UDP interface from where the detector will stream data. Use single-detector command. Normally unused. + */ + descrToFuncMap[i].m_pFuncName="detectormac"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + /*! \page network + - detectorip [ip] sets/gets the ip address of the detector UDP interface from where the detector will stream data. Use single-detector command. Keep in same subnet as rx_udpip (if rx_udpip specified). + */ + descrToFuncMap[i].m_pFuncName="detectorip"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + /*! \page network + - txndelay_left [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's left UDP port. Use single-detector command. Used for EIGER only. + */ + descrToFuncMap[i].m_pFuncName="txndelay_left"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + /*! \page network + - txndelay_right [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's right UDP port. Use single-detector command. Used for EIGER only. + */ + descrToFuncMap[i].m_pFuncName="txndelay_right"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + /*! \page network + - txndelay_frame [delay] sets/gets the transmission frame period of entire frame being streamed out from the detector for both ports. Use single-detector command. Used for EIGER only. + */ + descrToFuncMap[i].m_pFuncName="txndelay_frame"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + /*! \page network + - flowcontrol_10g [delay] Enables/disables 10 GbE flow control. 1 enables, 0 disables. Used for EIGER only. + */ + descrToFuncMap[i].m_pFuncName="flowcontrol_10g"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + /*! \page network + - zmqport [port] sets/gets the 0MQ (TCP) port of the receiver from where data is streamed to the client. Use single-detector command to set individually or multi-detector command to calculate based on \c port for the rest. + */ + descrToFuncMap[i].m_pFuncName="zmqport"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + /*! \page network + - configuremac [i] configures the MAC of the detector with these parameters: detectorip, detectormac, rx_udpip, rx_udpmac, rx_udpport, rx_udpport2 (if applicable). Only put! + */ + descrToFuncMap[i].m_pFuncName="configuremac"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfigureMac; + i++; + + /*! \page network + - rx_tcpport [port] sets/gets the port of the client-receiver TCP interface. Use single-detector command. Is different for each detector if same \c rx_hostname used. Must be first command to communicate with receiver. + */ + descrToFuncMap[i].m_pFuncName="rx_tcpport"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPort; + i++; + + /*! \page network + - port [port] sets/gets the port of the client-detector control server TCP interface. Use single-detector command. Default value is 1952 for all detectors. Normally not changed. + */ + descrToFuncMap[i].m_pFuncName="port"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPort; + i++; + + /*! \page network + - stopport [port] sets/gets the port of the client-detector stop server TCP interface. Use single-detector command. Default value is 1953 for all detectors. Normally not changed. + */ + descrToFuncMap[i].m_pFuncName="stopport"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPort; + i++; + + + /*! \page network + - lock [i] Locks/Unlocks the detector to communicate with this client. 1 locks, 0 unlocks. + */ + descrToFuncMap[i].m_pFuncName="lock"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLock; + i++; + + /*! \page network + - lastclient Gets the last client communicating with the detector. Cannot put! + */ + descrToFuncMap[i].m_pFuncName="lastclient"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLastClient; + i++; + + + + + + + + + + + + + /* receiver functions */ @@ -1966,9 +2022,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; - /* pattern generator */ + /* pattern generator */ + /*! \page ctb Chiptest board Commands specific for the new chiptest board as pattern generator */ @@ -1994,7 +2051,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patword addr [word] sets/gets 64 bit word at address addr of pattern memory. Both address and word in hex format. Advanced! */ @@ -2002,7 +2058,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patioctrl [word] sets/gets 64 bit mask defining input (0) and output (1) signals. hex format. */ @@ -2010,8 +2065,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - - /*! \page ctb - patclkctrl [word] sets/gets 64 bit mask defining if output signal is a clock and runs. hex format. Unused at the moment. */ @@ -2019,7 +2072,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patlimits [addr1 addr2] sets/gets the start and stop limits of the pattern to be executed. hex format. Advanced! */ @@ -2034,7 +2086,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patnloop0 [n] sets/gets the number of cyclesof the level 0 loop (int). */ @@ -2042,7 +2093,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patwait0 [addr] sets/gets the address of the level 0 wait point. hex format. Advanced! */ @@ -2050,7 +2100,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patwaittime0 [n] sets/gets the duration of the witing of the 0 waiting point in clock cycles (int). */ @@ -2058,7 +2107,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patloop1 [addr1 addr2] sets/gets the start and stop limits of the level 1 loop. hex format. Advanced! */ @@ -2066,7 +2114,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patnloop1 [n] sets/gets the number of cyclesof the level 1 loop (int). */ @@ -2074,7 +2121,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patwait1 [addr] sets/gets the address of the level 1 wait point. hex format. Advanced! */ @@ -2082,7 +2128,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patwaittime1 [n] sets/gets the duration of the witing of the 1 waiting point in clock cycles (int). */ @@ -2090,7 +2135,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patloop2 [addr1 addr2] sets/gets the start and stop limits of the level 2 loop. hex format. Advanced! */ @@ -2098,7 +2142,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patnloop2 [n] sets/gets the number of cyclesof the level 2 loop (int). */ @@ -2106,7 +2149,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - patwait2 [addr] sets/gets the address of the level 2 wait point. hex format. Advanced! */ @@ -2114,8 +2156,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - - /*! \page ctb - patwaittime2 [n] sets/gets the duration of the waiting of the 2 waiting point in clock cycles (int). */ @@ -2123,7 +2163,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPattern; i++; - /*! \page ctb - dut_clk [i] sets/gets the signal to be used as a clock for the digital data coming from the device under test. Advanced! */ @@ -2132,29 +2171,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; - /* pulse */ - - /*! \page config - - pulse [n] [x] [y] pulses pixel at coordinates (x,y) n number of times. Used in EIGER only. Only put!" - */ - descrToFuncMap[i].m_pFuncName="pulse"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; - i++; - - /*! \page config - - pulsenmove [n] [x] [y] pulses pixel n number of times and moves relatively by x value (x axis) and y value(y axis). Used in EIGER only. Only put!" - */ - descrToFuncMap[i].m_pFuncName="pulsenmove"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; - i++; - - /*! \page config - - pulsechip [n]pulses chip n number of times, while n=-1 will reset it to normal mode. Used in EIGER only. Only put!" - */ - descrToFuncMap[i].m_pFuncName="pulsechip"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; - i++; - numberOfCommands=i; From c6549694a85954dc9af2ec59083e488974952235 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 14:16:54 +0200 Subject: [PATCH 18/45] command line docu. more coming up --- .../slsDetector/slsDetectorCommand.cpp | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 96fc6b284..497c50610 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -954,12 +954,21 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { - /* trim/cal directories */ + /*! \page settings Detector settings commands Commands to setup the settings of the detector + - \ref settingsdir "Settings, trim & cal Directories": commands to setup settings/trim/cal directories + - \ref settingssett "Settings and Threshold": commands to configure settings and threshold of detector + - \ref settingsdacs "DACs": commands to configure DACs of detector + - \ref settingsadcs "ADCs": commands to readout ADCs of detector */ + /* trim/cal directories */ + /*! \page settings + \section settingsdir Settings, trim & cal Directories + commands to setup settings/trim/cal directories + */ /*! \page settings - settingsdir [dir] Sets/gets the directory where the settings files are located (string) */ @@ -988,6 +997,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /* settings, threshold */ + /*! \page settings + \section settingssett Settings and Threshold + commands to configure settings and threshold of detector + */ /*! \page settings - settings [s] sets/gets the settings of the detector. Options: \c standard, \c fast, \c highgain, \c dynamicgain, \c lowgain, \c mediumgain, \c veryhighgain, @@ -1043,6 +1056,11 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* pots */ + /*! \page settings + \section settingsdacs DACs + commands to configure DACs of detector + */ + /*! \page settings - vthreshold [i] [mv] Sets/gets detector threshold voltage for single photon counters. Normally in DAC units unless \c mv is specified at the end of the command line (int) */ @@ -1399,6 +1417,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /* r/w timers */ + /*! \page settings + \section settingsadcs ADCs + commands to readout ADCs of detector + */ /*! \page settings - temp_adc Gets the ADC temperature (int) From e333eb15cda616bbcc36d6a68e955a2d4e66f9df Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 14:32:43 +0200 Subject: [PATCH 19/45] command line docu. more coming up --- .../slsDetector/slsDetectorCommand.cpp | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 497c50610..fabe45b15 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -161,7 +161,12 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRegister; i++; - + /*! \page test + - r_compression [i] sets/gets compression in receiver. 1 sets, 0 unsets. Not implemented. + */ + descrToFuncMap[i].m_pFuncName="r_compression"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; + i++; @@ -393,6 +398,12 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; i++; + /*! \page config + - tengiga [i] enables/disables 10GbE in system (detector & receiver). 1 enabled 10GbE, 0 enables 1GbE. Used in EIGER only. + */ + descrToFuncMap[i].m_pFuncName="tengiga"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; + i++; /* flags */ @@ -2023,20 +2034,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; - /*! \page test - - r_compression [i] sets/gets compression in receiver. 1 sets, 0 unsets. Not implemented. - */ - descrToFuncMap[i].m_pFuncName="r_compression"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; - i++; - - /*! \page config - - tengiga [i] enables/disables 10GbE in system (detector & receiver). 1 enabled 10GbE, 0 enables 1GbE. Used in EIGER only. - */ - descrToFuncMap[i].m_pFuncName="tengiga"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; - i++; - /*! \page receiver - rx_fifodepth [i] sets/gets receiver fifo (between Listener and Writer Threads) depth to i number of frames. Can improve listener packet loss, not if limited by writing. */ From 827ce17fac3d773f96ad20a8ad9092c5ce417a52 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 16:25:01 +0200 Subject: [PATCH 20/45] command line docu. more coming up --- .../slsDetector/slsDetectorCommand.cpp | 173 +++++++++--------- 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index fabe45b15..0580e1226 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -176,11 +176,26 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page acquisition - \b acquire blocking acquisition (like calling sls_detector_acquire). Starts receiver and detector, writes and processes the data, stops detector. Only get! + \c Returns (string)\c "acquire unsuccessful" if fails, else "" for MYTHEN, \c "Acquired (int)" for others, where int is number of frames caught. */ descrToFuncMap[i].m_pFuncName="acquire"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAcquire; i++; + /*! \page acquisition + - \b busy returns \c 1 if the acquisition is active, \c 0 otherwise. Works when the acquisition is started in blocking mode. Only get! \c Returns \c (int) + */ + descrToFuncMap[i].m_pFuncName="busy"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdStatus; + i++; + + /*! \page acquisition + - status [s] starts or stops acquisition in detector in non blocking mode. \c s: [\c start, \c stop]. \c Returns the detector status: [\c running, \c error, \c transmitting, \c finished, \c waiting, \c idle]. \c Returns \c (string) + */ + descrToFuncMap[i].m_pFuncName="status"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdStatus; + i++; + /*! \page acquisition - \b data gets all data from the detector (if any) processes them and writes them to file according to the preferences already setup (MYTHEN only). Only get! */ @@ -195,20 +210,6 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFrame; i++; - /*! \page acquisition - - \b status \c returns the detector status (string)- can be: \c running, \c error, \c transmitting, \c finished, \c waiting or \c idle; \c put can be \c start or \c stop - */ - descrToFuncMap[i].m_pFuncName="status"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdStatus; - i++; - - /*! \page acquisition - - \b busy returns \c 1 if the acquisition is active, \c 0 otherwise. Works when the acquisition is started in non-blocking mode. Only get! - */ - descrToFuncMap[i].m_pFuncName="busy"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdStatus; - i++; - /*! \page acquisition - readctr Reads the counters from the detector memory (analog detector returning values translated into number of photons - only GOTTHARD). Cannot put. */ @@ -255,7 +256,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - \b datastream enables/disables the 0MQ data stream (0MQ threads created) from receiver to client. + - datastream enables/disables the 0MQ data stream (0MQ threads created) from receiver to client. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="datastream"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDataStream; @@ -283,14 +284,14 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /*! \page config - - type Sets/gets detector type (string). + - type Sets/gets detector type. \c Returns \c (string). Normally not used. Using hostname is enough. */ descrToFuncMap[i].m_pFuncName="type"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdHostname; i++; /*! \page config - - hostname \c put adds the hostname (ot IP adress) at the end of the multi-detector structure. If used for a single controlled (i:) replaces the current hostname. Returns the list of the hostnames of the multi-detector structure. + - hostname \c put adds the hostname (ot IP adress) at the end of the multi-detector structure. If used for a single controlled (i:) replaces the current hostname. Returns the list of the hostnames of the multi-detector structure. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="hostname"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdHostname; @@ -323,20 +324,20 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - online [i] sets the detector in online (1) or offline (0) mode + - online [i] sets the detector in online (1) or offline (0) mode. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="online"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; i++; /*! \page config - - checkonline returns the hostnames of all detectors without connecting to them + - checkonline returns the hostnames of all detectors without connecting to them. \c Returns (string) "All online" or "[list of offline hostnames] : Not online". */ descrToFuncMap[i].m_pFuncName="checkonline"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; i++; /*! \page config - - activate Activates/Deactivates the detector. Deactivated detector does not send data. Used for EIGER only. + - activate Activates/Deactivates the detector. Deactivated detector does not send data. Used for EIGER only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="activate"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; @@ -350,56 +351,56 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - nmod [i] sets/gets the number of modules of the detector. Used for MYTHEN only. + - nmod [i] sets/gets the number of modules of the detector. Used for MYTHEN only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="nmod"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; i++; /*! \page config - - maxmod Gets the maximum number of modules of the detector. Used for MYTHEN only. Cannot put! + - maxmod Gets the maximum number of modules of the detector. Used for MYTHEN only. Cannot put! \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="maxmod"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; i++; /*! \page config - - dr [i] sets/gets the dynamic range of detector. Mythen [4,8,16,24]. Eiger [4,8,16,32]. Others cannot put! + - dr [i] sets/gets the dynamic range of detector. Mythen [4,8,16,24]. Eiger [4,8,16,32]. Others cannot put! \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="dr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; i++; /*! \page config - - roi [i] [xmin] [xmax] [ymin] [ymax] sets region of interest of the detector, where i is number of rois;i=0 to clear rois. Used for GOTTHARD only. + - roi [i] [xmin] [xmax] [ymin] [ymax] sets region of interest of the detector, where i is number of rois;i=0 to clear rois. Used for GOTTHARD only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="roi"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; i++; /*! \page config - - detsizechan [xmax] [ymax] sets the maximum number of channels in each dimension for complete detector set; -1 is no limit. Use for multi-detector system as first command in config file. + - detsizechan [xmax] [ymax] sets the maximum number of channels in each dimension for complete detector set; -1 is no limit. Use for multi-detector system as first command in config file. \c Returns \c ("int int") */ descrToFuncMap[i].m_pFuncName="detsizechan"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; i++; /*! \page config - - roimask [i] ?? + - roimask [i] ?? \c Returns \c (int) in hexadecimal */ descrToFuncMap[i].m_pFuncName="roimask"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; i++; /*! \page config - - flippeddatax [i] enables/disables data being flipped across x axis. 1 enables, 0 disables. Used for EIGER only. 1 for bottom half-module, 0 for top-half module. + - flippeddatax [i] enables/disables data being flipped across x axis. 1 enables, 0 disables. Used for EIGER only. 1 for bottom half-module, 0 for top-half module. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="flippeddatax"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDetectorSize; i++; /*! \page config - - tengiga [i] enables/disables 10GbE in system (detector & receiver). 1 enabled 10GbE, 0 enables 1GbE. Used in EIGER only. + - tengiga [i] enables/disables 10GbE in system (detector & receiver). 1 enabled 10GbE, 0 enables 1GbE. Used in EIGER only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="tengiga"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; @@ -413,7 +414,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - flags [flag] sets/gets the readout flags to mode. Options: none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, unknown. Used for MYTHEN and EIGER only. + - flags [flag] sets/gets the readout flags to mode. Options: none, storeinram, tot, continous, parallel, nonparallel, safe, digital, analog_digital, unknown. Used for MYTHEN and EIGER only. \c Returns \c (string). put takes one string and \c returns concatenation of all active flags separated by spaces. */ descrToFuncMap[i].m_pFuncName="flags"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; @@ -422,7 +423,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page config - extsig:[i] [flag] sets/gets the mode of the external signal i. Options: \c off, \c gate_in_active_high, \c gate_in_active_low, \c trigger_in_rising_edge, \c trigger_in_falling_edge, \c ro_trigger_in_rising_edge, \c ro_trigger_in_falling_edge, \c gate_out_active_high, \c gate_out_active_low, \c trigger_out_rising_edge, \c trigger_out_falling_edge, \c ro_trigger_out_rising_edge, - \c ro_trigger_out_falling_edge. \n Used in MYTHEN, GOTTHARD, PROPIX only. + \c ro_trigger_out_falling_edge. \n Used in MYTHEN, GOTTHARD, PROPIX only. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="extsig"; /* find command! */ descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; @@ -436,14 +437,14 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - programfpga [file] programs the FPGA with file f (with .pof extension). Used for JUNGFRAU, MOENCH only. Only put! + - programfpga [file] programs the FPGA with file f (with .pof extension). Used for JUNGFRAU, MOENCH only. Only put! \c Returns \c ("successful", "unsuccessful") */ descrToFuncMap[i].m_pFuncName="programfpga"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; i++; /*! \page config - - resetfpga [f] resets FPGA, where f can be any value. Used for JUNGFRAU only. Only put! + - resetfpga [f] resets FPGA, where f can be any value. Used for JUNGFRAU only. Only put! \c Returns \c ("successful", "unsuccessful") */ descrToFuncMap[i].m_pFuncName="resetfpga"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; @@ -457,35 +458,35 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - powerchip [i] Powers on/off the chip. 1 powers on, 0 powers off. Can also get the power status. Used for JUNGFRAU only. + - powerchip [i] Powers on/off the chip. 1 powers on, 0 powers off. Can also get the power status. Used for JUNGFRAU only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="powerchip"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; i++; /*! \page config - - led [i] sets/gets the led status. 1 on, 0 off. Used for MOENCH only ?? + - led [i] sets/gets the led status. 1 on, 0 off. Used for MOENCH only ?? \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="led"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; i++; /*! \page config - - pulse [n] [x] [y] pulses pixel at coordinates (x,y) n number of times. Used in EIGER only. Only put!" + - pulse [n] [x] [y] pulses pixel at coordinates (x,y) n number of times. Used in EIGER only. Only put! \c Returns \c ("successful", "unsuccessful") */ descrToFuncMap[i].m_pFuncName="pulse"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; i++; /*! \page config - - pulsenmove [n] [x] [y] pulses pixel n number of times and moves relatively by x value (x axis) and y value(y axis). Used in EIGER only. Only put!" + - pulsenmove [n] [x] [y] pulses pixel n number of times and moves relatively by x value (x axis) and y value(y axis). Used in EIGER only. Only put! \c Returns \c ("successful", "unsuccessful") */ descrToFuncMap[i].m_pFuncName="pulsenmove"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; i++; /*! \page config - - pulsechip [n]pulses chip n number of times, while n=-1 will reset it to normal mode. Used in EIGER only. Only put!" + - pulsechip [n]pulses chip n number of times, while n=-1 will reset it to normal mode. Used in EIGER only. Only put! \c Returns \c ("successful", "unsuccessful") */ descrToFuncMap[i].m_pFuncName="pulsechip"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPulse; @@ -501,49 +502,49 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - moduleversion:[i] Gets the firmware version of module i. Used for MYTHEN only. Only get! + - moduleversion:[i] Gets the firmware version of module i. Used for MYTHEN only. Only get! \c Returns \c (long int) in hexadecimal or "undefined module number" */ descrToFuncMap[i].m_pFuncName="moduleversion"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; /*! \page config - - detectornumber Gets the serial number or MAC of detector. Only get! + - detectornumber Gets the serial number or MAC of detector. Only get! \c Returns \c (long int) in hexadecimal */ descrToFuncMap[i].m_pFuncName="detectornumber"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; /*! \page config - - modulenumber:[i] Gets the serial number of module i. Used for MYTHEN only. Only get! + - modulenumber:[i] Gets the serial number of module i. Used for MYTHEN only. Only get! \c Returns \c (long int) in hexadecimal or "undefined module number" */ descrToFuncMap[i].m_pFuncName="modulenumber"; /* find command! */ descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; /*! \page config - - detectorversion Gets the firmware version of detector. Only get! + - detectorversion Gets the firmware version of detector. Only get! \c Returns \c (long int) in hexadecimal */ descrToFuncMap[i].m_pFuncName="detectorversion"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; /*! \page config - - softwareversion Gets the software version of detector server. Only get! + - softwareversion Gets the software version of detector server. Only get! \c Returns \c (long int) in hexadecimal */ descrToFuncMap[i].m_pFuncName="softwareversion"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; /*! \page config - - thisversion Gets the software version of this client software. Only get! + - thisversion Gets the software version of this client software. Only get! \c Returns \c (long int) in hexadecimal */ descrToFuncMap[i].m_pFuncName="thisversion"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; i++; /*! \page config - - receiverversion Gets the software version of receiver. Only get! + - receiverversion Gets the software version of receiver. Only get! \c Returns \c (long int) in hexadecimal */ descrToFuncMap[i].m_pFuncName="receiverversion"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSN; @@ -556,77 +557,77 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - timing [mode] sets/gets synchronization mode of the detector. Mode: auto, trigger, ro_trigger, gating, triggered_gating + - timing [mode] sets/gets synchronization mode of the detector. Mode: auto, trigger, ro_trigger, gating, triggered_gating \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="timing"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTiming; i++; /*! \page config - - exptime [i] sets/gets exposure time in s + - exptime [i] sets/gets exposure time in s. \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="exptime"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; /*! \page config - - subexptime [i] sets/gets sub exposure time in s. Used in EIGER only in 32 bit mode. + - subexptime [i] sets/gets sub exposure time in s. Used in EIGER only in 32 bit mode. \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="subexptime"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; /*! \page config - - period [i] sets/gets frame period in s. + - period [i] sets/gets frame period in s. \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="period"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; /*! \page config - - delay [i] sets/gets delay in s. Used in MYTHEN, GOTTHARD only + - delay [i] sets/gets delay in s. Used in MYTHEN, GOTTHARD only. \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="delay"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; /*! \page config - - gates [i] sets/gets number of gates. Used in MYTHEN, GOTTHARD, EIGER only + - gates [i] sets/gets number of gates. Used in MYTHEN, GOTTHARD only. \c Returns \c (long long int) */ descrToFuncMap[i].m_pFuncName="gates"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; /*! \page config - - gates [i] sets/gets number of frames. If \c timing is not \c auto, then it is the number of frames per cycle/trigger. + - frames [i] sets/gets number of frames. If \c timing is not \c auto, then it is the number of frames per cycle/trigger. \c Returns \c (long long int) */ descrToFuncMap[i].m_pFuncName="frames"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; /*! \page config - - cycles [i] sets/gets number of triggers. Timing mode should be set appropriately. + - cycles [i] sets/gets number of triggers. Timing mode should be set appropriately. \c Returns \c (long long int) */ descrToFuncMap[i].m_pFuncName="cycles"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; /*! \page config - - probes [i] sets/gets number of probes to accumulate. When setting, max 3! cycles should be set to 1, frames to the number of pump-probe events. Used in MYTHEN only + - probes [i] sets/gets number of probes to accumulate. When setting, max 3! cycles should be set to 1, frames to the number of pump-probe events. Used in MYTHEN only. \c Returns \c (long long int) */ descrToFuncMap[i].m_pFuncName="probes"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; /*! \page config - - measurements [i] sets/gets number of measurements. + - measurements [i] sets/gets number of measurements. \c Returns \c (long long int) */ descrToFuncMap[i].m_pFuncName="measurements"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; /*! \page config - - samples [i] sets/gets number of samples expected from the jctb. Used in CHIP TEST BOARD only. + - samples [i] sets/gets number of samples expected from the jctb. Used in CHIP TEST BOARD only. \c Returns \c (long long int) */ descrToFuncMap[i].m_pFuncName="samples"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; @@ -639,49 +640,49 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - exptimel gets exposure time left. Used in MYTHEN, GOTTHARD only. Only get! + - exptimel gets exposure time left. Used in MYTHEN, GOTTHARD only. Only get! \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="exptimel"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - periodl gets frame period left. Used in MYTHEN, GOTTHARD only. Only get! + - periodl gets frame period left. Used in MYTHEN, GOTTHARD only. Only get! \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="periodl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - delayl gets delay left. Used in MYTHEN, GOTTHARD only. Only get! + - delayl gets delay left. Used in MYTHEN, GOTTHARD only. Only get! \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="delayl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - gatesl gets number of gates left. Used in MYTHEN, GOTTHARD only. Only get! + - gatesl gets number of gates left. Used in MYTHEN, GOTTHARD only. Only get! \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="gatesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - framesl gets number of frames left. Used in MYTHEN, GOTTHARD only. Only get! + - framesl gets number of frames left. Used in MYTHEN, GOTTHARD only. Only get! \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="framesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - cyclesl gets number of cylces left. Used in MYTHEN, GOTTHARD only. Only get! + - cyclesl gets number of cylces left. Used in MYTHEN, GOTTHARD only. Only get! \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="cyclesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; /*! \page config - - probesl gets number of probes left. Used in MYTHEN, GOTTHARD only. Only get! + - probesl gets number of probes left. Used in MYTHEN, GOTTHARD only. Only get! \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="probesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; @@ -719,91 +720,91 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - clkdivider [i] sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. MYTHEN[???] + - clkdivider [i] sets/gets the readout clock divider. EIGER, JUNGFRAU [0(fast speed), 1(half speed), 2(quarter speed)]. MYTHEN[???]. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="clkdivider"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - clkdivider [i] sets/gets length of set/reset signals (in clock cycles). Used in MYTHEN only + - clkdivider [i] sets/gets length of set/reset signals (in clock cycles). Used in MYTHEN only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="setlength"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - clkdivider [i] sets/gets waitstates of the bus interface (in clock cycles). Used in MYTHEN only + - clkdivider [i] sets/gets waitstates of the bus interface (in clock cycles). Used in MYTHEN only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="waitstates"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - clkdivider [i] sets/gets clock divider in tot mode. Used in MYTHEN only + - clkdivider [i] sets/gets clock divider in tot mode. Used in MYTHEN only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="totdivider"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - clkdivider [i] sets/gets duty cycle of the tot clock. Used in MYTHEN only + - clkdivider [i] sets/gets duty cycle of the tot clock. Used in MYTHEN only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="totdutycycle"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - phasestep [i] ??? + - phasestep [i] ???. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="phasestep"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - oversampling [i] ??? + - oversampling [i] ???. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="oversampling"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - adcclk [i] ??? + - adcclk [i] ???. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="adcclk"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - adcphase [i] ??? Used in MYTHEN, JUNGFRAU only. + - adcphase [i] ??? Used in MYTHEN, JUNGFRAU only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="adcphase"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - adcpipeline [i] ??? + - adcpipeline [i] ??? \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="adcpipeline"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - dbitclk [i] ??? + - dbitclk [i] ??? \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="dbitclk"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - dbitphase [i] ??? + - dbitphase [i] ??? \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="dbitphase"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - dbitpipeline [i] ??? + - dbitpipeline [i] ??? \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="dbitpipeline"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; @@ -817,7 +818,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - config [fname] sets/saves detector/receiver to configuration contained in fname. Same as executing sls_detector_put for every line. Normally a one time operation. + - config [fname] sets/saves detector/receiver to configuration contained in fname. Same as executing sls_detector_put for every line. Normally a one time operation. \c Returns \c (string) fname */ descrToFuncMap[i].m_pFuncName="config"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; @@ -825,21 +826,21 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* settings dump/retrieve */ /*! \page config - - rx_printconfig prints the receiver configuration. Only get! + - rx_printconfig prints the receiver configuration. Only get! \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="rx_printconfig"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; i++; /*! \page config - - parameters [fname] sets/saves detector parameters contained in fname. Normally once per different measurement. + - parameters [fname] sets/saves detector parameters contained in fname. Normally once per different measurement. \c Returns \c (string) fname */ descrToFuncMap[i].m_pFuncName="parameters"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; i++; /*! \page config - - setup [fname] sets/saves detector complete setup contained in fname (extensions automatically generated), including trimfiles, ff coefficients etc. + - setup [fname] sets/saves detector complete setup contained in fname (extensions automatically generated), including trimfiles, ff coefficients etc. \c Returns \c (string) fname */ descrToFuncMap[i].m_pFuncName="setup"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfiguration; @@ -5335,9 +5336,6 @@ string slsDetectorCommand::cmdTimer(int narg, char *args[], int action) { myDet->setReceiverOnline(ONLINE_FLAG); ret=myDet->setTimer(index,t); - if ((ret!=-1) && (index==ACQUISITION_TIME || index==SUBFRAME_ACQUISITION_TIME || index==FRAME_PERIOD || index==DELAY_AFTER_TRIGGER)) - rval=(double)ret*1E-9; - else rval=ret; // cout << "here!"<< endl; //set frame index @@ -5348,10 +5346,13 @@ string slsDetectorCommand::cmdTimer(int narg, char *args[], int action) { myDet->setFrameIndex(-1); } - if (index==FRAME_NUMBER || index==GATES_NUMBER || index==PROBES_NUMBER || index==CYCLES_NUMBER || index==MEASUREMENTS_NUMBER) - sprintf(answer,"%d",(int)rval); - else + if ((ret!=-1) && (index==ACQUISITION_TIME || index==SUBFRAME_ACQUISITION_TIME || index==FRAME_PERIOD || index==DELAY_AFTER_TRIGGER)) { + rval=(double)ret*1E-9; sprintf(answer,"%0.9f",rval); + } + else + sprintf(answer,"%lld",(long long int)ret); + return string(answer); @@ -6644,7 +6645,7 @@ string slsDetectorCommand::cmdPulse(int narg, char *args[], int action) { if(retval == OK) return string(" successful"); else - return string(" failed"); + return string(" unsuccessful"); } From 3189bd535982461968a22c7cc8e031e22d26eba9 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 16:46:48 +0200 Subject: [PATCH 21/45] command line docu. more coming up --- .../slsDetector/slsDetectorCommand.cpp | 166 +++++++++--------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 0580e1226..780fd8e4d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -855,7 +855,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { Commands to setup the data processing (mainly MYTHEN related) */ /*! \page data - - flatfield [fn] \c put sets flatfield file to \c fn (relative to \c ffdir). \get returns the flatfield file name relative to \c ffdir (string). If \fn is specified, it writes the flat field correction factors and errors to \c fn. + - flatfield [fn] \c put sets flatfield file to \c fn (relative to \c ffdir). \get returns the flatfield file name relative to \c ffdir (string). If \fn is specified, it writes the flat field correction factors and errors to \c fn. \c Returns \c (string) fn \c none disables flat field corrections. */ descrToFuncMap[i].m_pFuncName="flatfield"; // @@ -863,14 +863,14 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /*! \page data - - ffdir [d] Sets/gets the directory in which the flat field file is located. + - ffdir [d] Sets/gets the directory in which the flat field file is located. \c Returns \c (string) ffdir */ descrToFuncMap[i].m_pFuncName="ffdir"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFlatField; i++; /*! \page data - - ratecorr [ns] Returns the dead time used for rate correections in ns (int). \c put sets the deadtime correction constant in ns, -1 will set it to default tau of settings (0 unset). + - ratecorr [ns] Returns the dead time used for rate correections in ns (int). \c put sets the deadtime correction constant in ns, -1 will set it to default tau of settings (0 unset). \c Returns \c (double with 9 decimal digit precision) */ descrToFuncMap[i].m_pFuncName="ratecorr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdRateCorr; @@ -982,27 +982,27 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { commands to setup settings/trim/cal directories */ /*! \page settings - - settingsdir [dir] Sets/gets the directory where the settings files are located (string) + - settingsdir [dir] Sets/gets the directory where the settings files are located. \c Returns \c (string) dir */ descrToFuncMap[i].m_pFuncName="settingsdir"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettingsDir; i++; /*! \page settings - - trimdir [dir] obsolete \c settingsdir + - trimdir [dir] obsolete \c settingsdir. \c Returns \c (string) dir */ descrToFuncMap[i].m_pFuncName="trimdir"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettingsDir; i++; /*! \page settings - - caldir [dir] Sets/gets the directory where the calibration files are located (string) + - caldir [dir] Sets/gets the directory where the calibration files are located. \c Returns \c (string) dir */ descrToFuncMap[i].m_pFuncName="caldir"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdCalDir; i++; /*! \page settings - - trimen [n e0 e1...e(n-1)] Sets/gets the number of energies n at which the detector has default trim file and their values in eV (int) + - trimen [n e0 e1...e(n-1)] Sets/gets the number of energies n at which the detector has default trim file and their values in eV (int). \c Returns \c (int int...) n e0 e1...e(n-1) */ descrToFuncMap[i].m_pFuncName="trimen"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTrimEn; @@ -1017,49 +1017,49 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page settings - settings [s] sets/gets the settings of the detector. Options: \c standard, \c fast, \c highgain, \c dynamicgain, \c lowgain, \c mediumgain, \c veryhighgain, \c lownoise, \c dynamichg0, \c fixgain1, \c fixgain2, \c forceswitchg1, \c forceswitchg2. - \n In Eiger, only sets in client shared memory. Use \c threshold or \c thresholdnotb to pass to detector. Gets from detector. + \n In Eiger, only sets in client shared memory. Use \c threshold or \c thresholdnotb to pass to detector. Gets from detector. \c Returns \c (string) s */ descrToFuncMap[i].m_pFuncName="settings"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; i++; /*! \page settings - - threshold [eV] [sett] sets/gets the detector threshold in eV. sett is optional and if provided also sets the settings. Use this for Eiger instead of \c settings. + - threshold [eV] [sett] sets/gets the detector threshold in eV. sett is optional and if provided also sets the settings. Use this for Eiger instead of \c settings. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="threshold"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; i++; /*! \page settings - - thresholdnotb [eV] [sett] sets/gets the detector threshold in eV without loading trimbits. sett is optional and if provided also sets the settings. Use this for Eiger instead of \c settings. + - thresholdnotb [eV] [sett] sets/gets the detector threshold in eV without loading trimbits. sett is optional and if provided also sets the settings. Use this for Eiger instead of \c settings. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="thresholdnotb"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; i++; /*! \page settings - - trimbits [fname] loads/stores the trimbits to/from the detector. If no extension is specified, the serial number of each module will be attached. + - trimbits [fname] loads/stores the trimbits to/from the detector. If no extension is specified, the serial number of each module will be attached. \c Returns \c (string) fname */ descrToFuncMap[i].m_pFuncName="trimbits"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; i++; /*! \page settings - - trim:[mode] [fname] trims the detector according to mode and saves resulting trimbits to file. Mode: noise, beam, improve, fix. Used in MYTHEN only. Only put! + - trim:[mode] [fname] trims the detector according to mode and saves resulting trimbits to file. Mode: noise, beam, improve, fix. Used in MYTHEN only. Only put! \c Returns \c ("done") */ descrToFuncMap[i].m_pFuncName="trim"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; i++; /*! \page settings - - trimval [i] sets all trimbits to i. Used in EIGER only. + - trimval [i] sets all trimbits to i. Used in EIGER only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="trimval"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; i++; /*! \page settings - - pedestal [i] starts acquisition for i frames, calculates pedestal and writes back to fpga. Used in GOTTHARD only. Only put! + - pedestal [i] starts acquisition for i frames, calculates pedestal and writes back to fpga. Used in GOTTHARD only. Only put! \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="pedestal"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSettings; @@ -1074,140 +1074,140 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page settings - - vthreshold [i] [mv] Sets/gets detector threshold voltage for single photon counters. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vthreshold [i] [mv] Sets/gets detector threshold voltage for single photon counters. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vthreshold"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcalibration [i] [mv] Sets/gets the voltage of the calibration pulses. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcalibration [i] [mv] Sets/gets the voltage of the calibration pulses. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcalibration"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vtrimbit [i] [mv] Sets/gets the voltage to set the width of the trimbits. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vtrimbit [i] [mv] Sets/gets the voltage to set the width of the trimbits. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vtrimbit"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vpreamp [i] [mv] Sets/gets the voltage to define the preamplifier feedback resistance. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vpreamp [i] [mv] Sets/gets the voltage to define the preamplifier feedback resistance. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vpreamp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vhaper1 [i] [mv] Sets/gets the voltage to define the feedback resistance of the first shaper. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vhaper1 [i] [mv] Sets/gets the voltage to define the feedback resistance of the first shaper. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vshaper1"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vshaper2 [i] [mv] Sets/gets the voltage to define the feedback resistance of the second shaper. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vshaper2 [i] [mv] Sets/gets the voltage to define the feedback resistance of the second shaper. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vshaper2"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vhighvoltage [i] Sets/gets the high voltage to the sensor in V (int). + - vhighvoltage [i] Sets/gets the high voltage to the sensor in V. \c Returns \c (int ["mV"]). */ descrToFuncMap[i].m_pFuncName="vhighvoltage"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vapower [i] Sets/gets the analog power supply for the old chiptest board in DAC units (int) + - vapower [i] Sets/gets the analog power supply for the old chiptest board in DAC units. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vapower"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vddpower [i] Sets/gets the digital power supply for the old chiptest board in DAC units (int) + - vddpower [i] Sets/gets the digital power supply for the old chiptest board in DAC units. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vddpower"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vshpower [i] Sets/gets the comparator power supply for the old chiptest board in DAC units (int) + - vshpower [i] Sets/gets the comparator power supply for the old chiptest board in DAC units. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vshpower"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - viopower [i] Sets/gets the power supply of the FPGA I/Os for the old chiptest board in DAC units (int) + - viopower [i] Sets/gets the power supply of the FPGA I/Os for the old chiptest board in DAC units. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="viopower"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vrefds [i] [mv] Sets/gets vrefds. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vrefds [i] [mv] Sets/gets vrefds. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vref_ds"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcascn_pb [i] [mv] Sets/gets vcascn_pb. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcascn_pb [i] [mv] Sets/gets vcascn_pb. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcascn_pb"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcasc_pb [i] [mv] Sets/gets vcasc_pb. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcasc_pb [i] [mv] Sets/gets vcasc_pb. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcascp_pb"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vout_cm [i] [mv] Sets/gets vout_cm. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vout_cm [i] [mv] Sets/gets vout_cm. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vout_cm"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcasc_out [i] [mv] Sets/gets vcasc_out. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcasc_out [i] [mv] Sets/gets vcasc_out. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcasc_out"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vin_com [i] [mv] Sets/gets vin_com. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vin_com [i] [mv] Sets/gets vin_com. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vin_cm"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vref_comp [i] [mv] Sets/gets vref_comp. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vref_comp [i] [mv] Sets/gets vref_comp. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vref_comp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - ib_test_c [i] [mv] Sets/gets ib_test_c. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - ib_test_c [i] [mv] Sets/gets ib_test_c. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="ib_test_c"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - dac[0..7] [i] [mv] Sets/gets dac[0..7] for MOENCH02. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - dac[0..7] [i] [mv] Sets/gets dac[0..7] for MOENCH02. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="dac0"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; @@ -1242,119 +1242,119 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /*! \page settings - - vsvp [i] [mv] Sets/gets vsvp. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vsvp [i] [mv] Sets/gets vsvp. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vsvp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vsvn [i] [mv] Sets/gets vsvn. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vsvn [i] [mv] Sets/gets vsvn. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vsvn"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vtr [i] [mv] Sets/gets vtr. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vtr [i] [mv] Sets/gets vtr. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vtr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vrf [i] [mv] Sets/gets vrf. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vrf [i] [mv] Sets/gets vrf. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vrf"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vrs [i] [mv] Sets/gets vrs. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vrs [i] [mv] Sets/gets vrs. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vrs"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vtgstv [i] [mv] Sets/gets vtgstv. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vtgstv [i] [mv] Sets/gets vtgstv. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vtgstv"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcmp_ll [i] [mv] Sets/gets vcmp_ll. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcmp_ll [i] [mv] Sets/gets vcmp_ll. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcmp_ll"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcmp_lr [i] [mv] Sets/gets vcmp_lr. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcmp_lr [i] [mv] Sets/gets vcmp_lr. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcmp_lr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcal_l [i] [mv] Sets/gets vcal_l. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcal_l [i] [mv] Sets/gets vcal_l. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcall"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcomp_rl [i] [mv] Sets/gets vcomp_rl. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcomp_rl [i] [mv] Sets/gets vcomp_rl. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcmp_rl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcomp_rr [i] [mv] Sets/gets vcomp_rr. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcomp_rr [i] [mv] Sets/gets vcomp_rr. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcmp_rr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - rxb_rb [i] [mv] Sets/gets rxb_rb. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - rxb_rb [i] [mv] Sets/gets rxb_rb. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="rxb_rb"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - rxb_lb [i] [mv] Sets/gets rxb_lb. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - rxb_lb [i] [mv] Sets/gets rxb_lb. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="rxb_lb"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcp [i] [mv] Sets/gets vcp. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcp [i] [mv] Sets/gets vcp. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vcn [i] [mv] Sets/gets vcn. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vcn [i] [mv] Sets/gets vcn. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vcn"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - vis [i] [mv] Sets/gets vis. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - vis [i] [mv] Sets/gets vis. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="vis"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - iodelay [i] [mv] Sets/gets iodelay. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - iodelay [i] [mv] Sets/gets iodelay. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="iodelay"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; @@ -1362,7 +1362,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page settings - - dac:j [i] [mv] Sets/gets value for DAC number j for the new chiptestboard. Normally in DAC units unless \c mv is specified at the end of the command line (int) + - dac:j [i] [mv] Sets/gets value for DAC number j for the new chiptestboard. Normally in DAC units unless \c mv is specified at the end of the command line. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="dac"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; @@ -1371,7 +1371,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page settings - - adcvpp [i] Sets/gets the Vpp of the ADC 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V (int) + - adcvpp [i] Sets/gets the Vpp of the ADC 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V . \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="adcvpp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; @@ -1379,35 +1379,35 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page settings - - v_a [i] mv Sets/gets value for Va on the new chiptest board. Must be in mV (int) + - v_a [i] mv Sets/gets value for Va on the new chiptest board. Must be in mV. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="v_a"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - v_b [i] mv Sets/gets value for Vb on the new chiptest board. Must be in mV (int) + - v_b [i] mv Sets/gets value for Vb on the new chiptest board. Must be in mV. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="v_b"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - v_c [i] mv Sets/gets value for Vc on the new chiptest board. Must be in mV (int) + - v_c [i] mv Sets/gets value for Vc on the new chiptest board. Must be in mV. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="v_c"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - v_d [i] mv Sets/gets value for Vd on the new chiptest board. Must be in mV (int) + - v_d [i] mv Sets/gets value for Vd on the new chiptest board. Must be in mV. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="v_d"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - v_io [i] mv Sets/gets value for Vio on the new chiptest board. Must be in mV (int) + - v_io [i] mv Sets/gets value for Vio on the new chiptest board. Must be in mV. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="v_io"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; @@ -1415,14 +1415,14 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page settings - - v_chip [i] mv Sets/gets value for Vchip on the new chiptest board. Must be in mV (int). Normally don't use it! + - v_chip [i] mv Sets/gets value for Vchip on the new chiptest board. Must be in mV. \c Returns \c (int ["mV"]). Normally don't use it! */ descrToFuncMap[i].m_pFuncName="v_chip"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; i++; /*! \page settings - - v_limit [i] mv Sets/gets a soft limit for the power supplies and the DACs on the new chiptest board. Must be in mV (int) + - v_limit [i] mv Sets/gets a soft limit for the power supplies and the DACs on the new chiptest board. Must be in mV. \c Returns \c (int ["mV"]) */ descrToFuncMap[i].m_pFuncName="v_limit"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDAC; @@ -1435,49 +1435,49 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page settings - - temp_adc Gets the ADC temperature (int) + - temp_adc Gets the ADC temperature. \c Returns \c EIGER,JUNGFRAU(double"°C") Others \c (int"°C") */ descrToFuncMap[i].m_pFuncName="temp_adc"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - temp_fpga Gets the FPGA temperature (int) + - temp_fpga Gets the FPGA temperature. \c Returns \c EIGER,JUNGFRAU(double"°C") Others \c (int"°C") */ descrToFuncMap[i].m_pFuncName="temp_fpga"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - temp_fpgaext Gets the external FPGA temperature (int) + - temp_fpgaext Gets the external FPGA temperature. Used in EIGER only. \c Returns \c EIGER(double"°C") */ descrToFuncMap[i].m_pFuncName="temp_fpgaext"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - temp_10ge Gets the 10Gbe temperature (int) + - temp_10ge Gets the 10Gbe temperature. Used in EIGER only. \c Returns \c EIGER(double"°C") */ descrToFuncMap[i].m_pFuncName="temp_10ge"; // - descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; + descrToFuncMap[i].m_pFuncPtr. \c Returns \c (int ["mV"])etectorCommand::cmdADC; i++; /*! \page settings - - temp_dcdc Gets the temperature of the DC/DC converter(int) + - temp_dcdc Gets the temperature of the DC/DC converter. Used in EIGER only. \c Returns \c EIGER(double"°C") */ descrToFuncMap[i].m_pFuncName="temp_dcdc"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - temp_sodl Gets the temperature of the left so-dimm memory (int) + - temp_sodl Gets the temperature of the left so-dimm memory . Used in EIGER only. \c Returns \c EIGER(double"°C") */ descrToFuncMap[i].m_pFuncName="temp_sodl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - temp_sodr Gets the temperature of the right so-dimm memory (int) + - temp_sodr Gets the temperature of the right so-dimm memory. Used in EIGER only. \c Returns \c EIGER(double"°C") */ descrToFuncMap[i].m_pFuncName="temp_sodr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; @@ -1485,21 +1485,21 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page settings - - adc:j Gets the values of the slow ADC number j for the new chiptest board (int) + - adc:j Gets the values of the slow ADC number j for the new chiptest board. \c Returns \c (int"°C") */ descrToFuncMap[i].m_pFuncName="adc"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - temp_fpgal Gets the temperature of the left frontend FPGA (int) + - temp_fpgal Gets the temperature of the left frontend FPGA. Used in EIGER only. \c Returns \c EIGER(double"°C") */ descrToFuncMap[i].m_pFuncName="temp_fpgafl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - temp_fpgar Gets the temperature of the right frontend FPGA (int) + - temp_fpgar Gets the temperature of the right frontend FPGA. Used in EIGER only. \c Returns \c EIGER(double"°C") */ descrToFuncMap[i].m_pFuncName="temp_fpgafr"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; @@ -1507,70 +1507,70 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page settings - - i_a Gets the current of the power supply a on the new chiptest board (int) + - i_a Gets the current of the power supply a on the new chiptest board. \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="i_a"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - i_b Gets the current of the power supply b on the new chiptest board (int) + - i_b Gets the current of the power supply b on the new chiptest board \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="i_b"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - i_c Gets the current of the power supply c on the new chiptest board (int) + - i_c Gets the current of the power supply c on the new chiptest board \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="i_c"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - i_d Gets the current of the power supply d on the new chiptest board (int) + - i_d Gets the current of the power supply d on the new chiptest board \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="i_d"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - i_io Gets the current of the power supply io on the new chiptest board (int) + - i_io Gets the current of the power supply io on the new chiptest board \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="i_io"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - vm_a Gets the measured voltage of the power supply a on the new chiptest board (int) + - vm_a Gets the measured voltage of the power supply a on the new chiptest board \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="vm_a"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - vm_b Gets the measured voltage of the power supply b on the new chiptest board (int) + - vm_b Gets the measured voltage of the power supply b on the new chiptest board \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="vm_b"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - vm_c Gets the measured voltage of the power supply c on the new chiptest board (int) + - vm_c Gets the measured voltage of the power supply c on the new chiptest board \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="vm_c"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - vm_d Gets the measured voltage of the power supply d on the new chiptest board (int) + - vm_d Gets the measured voltage of the power supply d on the new chiptest board \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="vm_d"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings - - vm_io Gets the measured voltage of the power supply io on the new chiptest board (int) + - vm_io Gets the measured voltage of the power supply io on the new chiptest board \c Returns \c (int"mV") */ descrToFuncMap[i].m_pFuncName="vm_io"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; @@ -3195,7 +3195,7 @@ string slsDetectorCommand::cmdRateCorr(int narg, char *args[], int action){ if (myDet->getRateCorrection(t)) { sprintf(answer,"%0.9f",t); } else { - sprintf(answer,"%f",0.); + sprintf(answer,"%0.9f",0.); } return string(answer); } @@ -5217,7 +5217,7 @@ string slsDetectorCommand::cmdADC(int narg, char *args[], int action) { sprintf(answer,"%f",myDet->getADC(adc)); #endif //if ((adc == TEMPERATURE_ADC) || (adc == TEMPERATURE_FPGA)) - if (adc<1000) + if (adc<=100) strcat(answer,"°C"); else strcat(answer,"mV"); From ae13fbce721f369d865a687aaf0b8f61481fba5e Mon Sep 17 00:00:00 2001 From: Anna Bergamaschi Date: Thu, 17 Aug 2017 16:57:06 +0200 Subject: [PATCH 22/45] changed some sections in the documentation --- .../slsDetector/slsDetectorCommand.cpp | 96 +++++++++---------- 1 file changed, 43 insertions(+), 53 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index fabe45b15..6ff1131c6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -47,6 +47,7 @@ For additional questions concerning the indexing of the detector, please refer t The commands are sudivided into different pages depending on their functionalities: - \ref acquisition "Acquisition": commands to start/stop the acquisition and retrieve data - \ref config "Configuration": commands to configure the detector + - \ref timing "Timing": commands to configure the detector timing - \ref data "Data postprocessing": commands to process the data - mainly for MYTHEN except for rate corrections. - \ref settings "Settings": commands to define detector settings/threshold. - \ref output "Output": commands to define output file destination and format @@ -239,15 +240,14 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { - \ref configstatus "Status": commands to configure detector status - \ref configsize "Data Size": commands to configure detector data size - \ref configflags "Flags": commands to configure detector flags - - \ref configfpga "FPGA": commands to configure FPGA of the detector - \ref configchip "Chip": commands to configure chip of the detector - \ref configversions "Versions": commands to check version of each subsytem - - \ref configtimers "Timers": commands to configure the timers of the detector - - \ref configrotimers "RO Timers": commands to configure the read only timers of the detector - \ref configspeed "Speed": commands to configure speed of detector - \ref configsettings "Detector Parameters": commands to configure/retrieve configuration of detector */ - + /*! \page timing Timing commands + Commands to setup the timing + */ /* Detector structure configuration and debugging commands */ /*! \page config \section configstructure Data Structure @@ -430,20 +430,17 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /* fpga */ - /*! \page config - \section configfpga FPGA - commands to configure FPGA of the detector - */ - /*! \page config - - programfpga [file] programs the FPGA with file f (with .pof extension). Used for JUNGFRAU, MOENCH only. Only put! + + /*! \page test + - programfpga [file] programs the FPGA with file f (with .pof extension). Used for JUNGFRAU and new chiptestboard only. Only put! */ descrToFuncMap[i].m_pFuncName="programfpga"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; i++; - /*! \page config - - resetfpga [f] resets FPGA, where f can be any value. Used for JUNGFRAU only. Only put! + /*! \page test + - resetfpga [f] resets FPGA, where f can be any value. Used for JUNGFRAU and new chiptestboard only. Only put! */ descrToFuncMap[i].m_pFuncName="resetfpga"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdAdvanced; @@ -550,33 +547,30 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /* r/w timers */ - /*! \page config - \section configtimers Timers - commands to configure the timers of the detector - */ - /*! \page config + + /*! \page timing - timing [mode] sets/gets synchronization mode of the detector. Mode: auto, trigger, ro_trigger, gating, triggered_gating */ descrToFuncMap[i].m_pFuncName="timing"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTiming; i++; - /*! \page config + /*! \page timing - exptime [i] sets/gets exposure time in s */ descrToFuncMap[i].m_pFuncName="exptime"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; - /*! \page config + /*! \page timing - subexptime [i] sets/gets sub exposure time in s. Used in EIGER only in 32 bit mode. */ descrToFuncMap[i].m_pFuncName="subexptime"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; - /*! \page config + /*! \page timing - period [i] sets/gets frame period in s. */ descrToFuncMap[i].m_pFuncName="period"; // @@ -590,42 +584,42 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; - /*! \page config + /*! \page timing - gates [i] sets/gets number of gates. Used in MYTHEN, GOTTHARD, EIGER only */ descrToFuncMap[i].m_pFuncName="gates"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; - /*! \page config + /*! \page timing - gates [i] sets/gets number of frames. If \c timing is not \c auto, then it is the number of frames per cycle/trigger. */ descrToFuncMap[i].m_pFuncName="frames"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; - /*! \page config + /*! \page timing - cycles [i] sets/gets number of triggers. Timing mode should be set appropriately. */ descrToFuncMap[i].m_pFuncName="cycles"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; - /*! \page config + /*! \page timing - probes [i] sets/gets number of probes to accumulate. When setting, max 3! cycles should be set to 1, frames to the number of pump-probe events. Used in MYTHEN only */ descrToFuncMap[i].m_pFuncName="probes"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; - /*! \page config + /*! \page timing - measurements [i] sets/gets number of measurements. */ descrToFuncMap[i].m_pFuncName="measurements"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; - /*! \page config + /*! \page timing - samples [i] sets/gets number of samples expected from the jctb. Used in CHIP TEST BOARD only. */ descrToFuncMap[i].m_pFuncName="samples"; // @@ -633,33 +627,29 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /* read only timers */ - /*! \page config - \section configrotimers RO Timers - commands to configure the read only timers of the detector - */ - /*! \page config + /*! \page timing - exptimel gets exposure time left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="exptimel"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; - /*! \page config + /*! \page timing - periodl gets frame period left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="periodl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; - /*! \page config + /*! \page timing - delayl gets delay left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="delayl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; - /*! \page config + /*! \page timing - gatesl gets number of gates left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="gatesl"; // @@ -673,14 +663,14 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; - /*! \page config + /*! \page timing - cyclesl gets number of cylces left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="cyclesl"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; - /*! \page config + /*! \page timing - probesl gets number of probes left. Used in MYTHEN, GOTTHARD only. Only get! */ descrToFuncMap[i].m_pFuncName="probesl"; // @@ -691,21 +681,21 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; // i++; - /*! \page config - - now ??? Only get! + /*! \page timing + - now Actual time of the detector. Only get! */ descrToFuncMap[i].m_pFuncName="now"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; - /*! \page config - - timestamp ??? Only get! + /*! \page timing + - timestamp Last frame timestamp for MYTHEN. Only get! */ descrToFuncMap[i].m_pFuncName="timestamp"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimeLeft; i++; - /*! \page config + /*! \page timing - nframes ??? Only get! */ descrToFuncMap[i].m_pFuncName="nframes"; // @@ -726,84 +716,84 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /*! \page config - - clkdivider [i] sets/gets length of set/reset signals (in clock cycles). Used in MYTHEN only + - setlength [i] sets/gets length of set/reset signals (in clock cycles). Used in MYTHEN only */ descrToFuncMap[i].m_pFuncName="setlength"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - clkdivider [i] sets/gets waitstates of the bus interface (in clock cycles). Used in MYTHEN only + - waitstates [i] sets/gets waitstates of the bus interface (in clock cycles). Used in MYTHEN only */ descrToFuncMap[i].m_pFuncName="waitstates"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - clkdivider [i] sets/gets clock divider in tot mode. Used in MYTHEN only + - totdivider [i] sets/gets clock divider in tot mode. Used in MYTHEN only */ descrToFuncMap[i].m_pFuncName="totdivider"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - clkdivider [i] sets/gets duty cycle of the tot clock. Used in MYTHEN only + - totdutycycle [i] sets/gets duty cycle of the tot clock. Used in MYTHEN only */ descrToFuncMap[i].m_pFuncName="totdutycycle"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - phasestep [i] ??? + - phasestep [i] Only put for gotthard. Moves the phase of the ADC clock. */ descrToFuncMap[i].m_pFuncName="phasestep"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - oversampling [i] ??? + - oversampling [i] Sets/gets the number of adcsamples per clock. For the new chiptestboard. */ descrToFuncMap[i].m_pFuncName="oversampling"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - adcclk [i] ??? + - adcclk [i] sets/gets the ADC clock frequency in MHz. For the new chiptestboard! */ descrToFuncMap[i].m_pFuncName="adcclk"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - adcphase [i] ??? Used in MYTHEN, JUNGFRAU only. + - adcphase [i] Sets/gets the ADC clock frequency in MHz. For the new chiptestboard! */ descrToFuncMap[i].m_pFuncName="adcphase"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - adcpipeline [i] ??? + - adcpipeline [i] Sets/gets the pipeline of the ADC. For the new chiptestbaord! */ descrToFuncMap[i].m_pFuncName="adcpipeline"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - dbitclk [i] ??? + - dbitclk [i] Sets/gets the clock frequency of the latching of the digital bits in MHz. For the new chiptestboard! */ descrToFuncMap[i].m_pFuncName="dbitclk"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - dbitphase [i] ??? + - dbitphase [i] Sets/gets the phase of the clock for latching of the digital bits. For the new chiptestboard!??? */ descrToFuncMap[i].m_pFuncName="dbitphase"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; i++; /*! \page config - - dbitpipeline [i] ??? + - dbitpipeline [i] Sets/gets the pipeline of the latching of the digital bits. For the new chiptestbaord! */ descrToFuncMap[i].m_pFuncName="dbitpipeline"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdSpeed; From 4adf3e93854e05a4eac2637494b45d03c3aab6f6 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 16:59:07 +0200 Subject: [PATCH 23/45] command line docu. more coming up --- .../slsDetector/slsDetectorCommand.cpp | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 780fd8e4d..1bad177e3 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1586,49 +1586,49 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page output - - outdir [dir] Sets/gets the file output directory (string) + - outdir [dir] Sets/gets the file output directory. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="outdir"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOutDir; i++; /*! \page output - - fname [fn] Sets/gets the root of the output file name (string) + - fname [fn] Sets/gets the root of the output file name \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="fname"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; i++; /*! \page output - - index [i] Sets/gets the current file index (int) + - index [i] Sets/gets the current file index. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="index"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileIndex; i++; /*! \page output - - enablefwrite [i] Enables/disables file writing. 1 enables, 0 disables. + - enablefwrite [i] Enables/disables file writing. 1 enables, 0 disables. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="enablefwrite"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdEnablefwrite; i++; /*! \page output - - overwrite [i] enables(1) /disables(0) file overwriting + - overwrite [i] enables(1) /disables(0) file overwriting. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="overwrite"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOverwrite; i++; /*! \page output - - currentfname gets the filename for the data without index and extension + - currentfname gets the filename for the data without index and extension. MYTHEN only. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="currentfname"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; i++; /*! \page output - - fileformat sets/gets the file format for data in receiver. Options: [ascii, binary, hdf5]. Ascii is not implemented in Receiver. + - fileformat sets/gets the file format for data in receiver. Options: [ascii, binary, hdf5]. Ascii is not implemented in Receiver. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="fileformat"; //OK descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdFileName; @@ -1644,105 +1644,105 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page actions - - positions [n [p0..pn-1]] sets/gets number of angular position and positions to be acquired. + - positions [n [p0..pn-1]] sets/gets number of angular position and positions to be acquired.. \c Returns \c (int int..) n [p0..pn-1] */ descrToFuncMap[i].m_pFuncName="positions"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPositions; i++; /*! \page actions - - startscript [s] sets/gets the script to be executed at the beginning of the acquisition. \c none unsets. + - startscript [s] sets/gets the script to be executed at the beginning of the acquisition. \c none unsets. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="startscript"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - startscriptpar [s] sets/gets a string to be passed as a parameter to the startscript + - startscriptpar [s] sets/gets a string to be passed as a parameter to the startscript. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="startscriptpar"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - stopscript [s] sets/gets the script to be executed at the end of the acquisition. \c none unsets. + - stopscript [s] sets/gets the script to be executed at the end of the acquisition. \c none unsets. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="stopscript"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - stopscriptpar [s] sets/gets a string to be passed as a parameter to the stopscript + - stopscriptpar [s] sets/gets a string to be passed as a parameter to the stopscript. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="stopscriptpar"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - scriptbefore [s] sets/gets the script to be executed before starting the detector every time in the acquisition. \c none unsets. + - scriptbefore [s] sets/gets the script to be executed before starting the detector every time in the acquisition. \c none unsets. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="scriptbefore"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - scriptbeforepar [s] sets/gets a string to be passed as a parameter to the scriptbefore + - scriptbeforepar [s] sets/gets a string to be passed as a parameter to the scriptbefore. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="scriptbeforepar"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - scriptafter [s] sets/gets the script to be executed after the detector has finished every time in the acquisition. \c none unsets. + - scriptafter [s] sets/gets the script to be executed after the detector has finished every time in the acquisition. \c none unsets. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="scriptafter"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - scriptafterpar [s] sets/gets a string to be passed as a parameter to the scriptafter + - scriptafterpar [s] sets/gets a string to be passed as a parameter to the scriptafter. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="scriptafterpar"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - headerafter [s] sets/gets the script to be executed for logging the detector parameters. \c none unsets. + - headerafter [s] sets/gets the script to be executed for logging the detector parameters. \c none unsets. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="headerafter"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - headerbefore [s] sets/gets the script to be executed for logging the detector parameters. \c none unsets. + - headerbefore [s] sets/gets the script to be executed for logging the detector parameters. \c none unsets. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="headerbefore"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - headerbeforepar [s] sets/gets a string to be passed as a parameter to the headerbefore script + - headerbeforepar [s] sets/gets a string to be passed as a parameter to the headerbefore script. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="headerbeforepar"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - headerafterpar [s] sets/gets a string to be passed as a parameter to the headerafter script + - headerafterpar [s] sets/gets a string to be passed as a parameter to the headerafter script. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="headerafterpar"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - enacallog [i] enables/disables logging of the parameters necessary for the energy calibration. 1 sets, 0 unsets. + - enacallog [i] enables/disables logging of the parameters necessary for the energy calibration. 1 sets, 0 unsets. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="encallog"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; i++; /*! \page actions - - angcallog [i] enables/disables logging of the parameters necessary for the angular calibration. 1 sets, 0 unsets. + - angcallog [i] enables/disables logging of the parameters necessary for the angular calibration. 1 sets, 0 unsets. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="angcallog"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdScripts; @@ -1827,111 +1827,111 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page network Network Commands to setup the network between client, detector and receiver - - rx_hostname [s] sets/gets the receiver hostname or IP address, configures detector mac with all network parameters and updates receiver with acquisition parameters. Normally used for single detectors (Can be multi-detector). \c none disables. If used, use as last network command in configuring detector MAC. + - rx_hostname [s] sets/gets the receiver hostname or IP address, configures detector mac with all network parameters and updates receiver with acquisition parameters. Normally used for single detectors (Can be multi-detector). \c none disables. If used, use as last network command in configuring detector MAC. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="rx_hostname"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - rx_udpip [ip] sets/gets the ip address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). Used if different from eth0. + - rx_udpip [ip] sets/gets the ip address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). Used if different from eth0. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="rx_udpip"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - rx_udpmac [mac] sets/gets the mac address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). + - rx_udpmac [mac] sets/gets the mac address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="rx_udpmac"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - rx_udpport [port] sets/gets the port of the receiver UDP interface where the data from the detector will be streamed to. Use single-detector command. + - rx_udpport [port] sets/gets the port of the receiver UDP interface where the data from the detector will be streamed to. Use single-detector command. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="rx_udpport"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - rx_udpport2 [port] sets/gets the second port of the receiver UDP interface where the data from the second half of the detector will be streamed to. Use single-detector command. Used for EIGER only. + - rx_udpport2 [port] sets/gets the second port of the receiver UDP interface where the data from the second half of the detector will be streamed to. Use single-detector command. Used for EIGER only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="rx_udpport2"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - detectormac [mac] sets/gets the mac address of the detector UDP interface from where the detector will stream data. Use single-detector command. Normally unused. + - detectormac [mac] sets/gets the mac address of the detector UDP interface from where the detector will stream data. Use single-detector command. Normally unused. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="detectormac"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - detectorip [ip] sets/gets the ip address of the detector UDP interface from where the detector will stream data. Use single-detector command. Keep in same subnet as rx_udpip (if rx_udpip specified). + - detectorip [ip] sets/gets the ip address of the detector UDP interface from where the detector will stream data. Use single-detector command. Keep in same subnet as rx_udpip (if rx_udpip specified). \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="detectorip"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - txndelay_left [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's left UDP port. Use single-detector command. Used for EIGER only. + - txndelay_left [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's left UDP port. Use single-detector command. Used for EIGER only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="txndelay_left"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - txndelay_right [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's right UDP port. Use single-detector command. Used for EIGER only. + - txndelay_right [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's right UDP port. Use single-detector command. Used for EIGER only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="txndelay_right"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - txndelay_frame [delay] sets/gets the transmission frame period of entire frame being streamed out from the detector for both ports. Use single-detector command. Used for EIGER only. + - txndelay_frame [delay] sets/gets the transmission frame period of entire frame being streamed out from the detector for both ports. Use single-detector command. Used for EIGER only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="txndelay_frame"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - flowcontrol_10g [delay] Enables/disables 10 GbE flow control. 1 enables, 0 disables. Used for EIGER only. + - flowcontrol_10g [delay] Enables/disables 10 GbE flow control. 1 enables, 0 disables. Used for EIGER only. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="flowcontrol_10g"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - zmqport [port] sets/gets the 0MQ (TCP) port of the receiver from where data is streamed to the client. Use single-detector command to set individually or multi-detector command to calculate based on \c port for the rest. + - zmqport [port] sets/gets the 0MQ (TCP) port of the receiver from where data is streamed to the client. Use single-detector command to set individually or multi-detector command to calculate based on \c port for the rest. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="zmqport"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; /*! \page network - - configuremac [i] configures the MAC of the detector with these parameters: detectorip, detectormac, rx_udpip, rx_udpmac, rx_udpport, rx_udpport2 (if applicable). Only put! + - configuremac [i] configures the MAC of the detector with these parameters: detectorip, detectormac, rx_udpip, rx_udpmac, rx_udpport, rx_udpport2 (if applicable). This command is already included in \c rx_hsotname. Only put!. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="configuremac"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfigureMac; i++; /*! \page network - - rx_tcpport [port] sets/gets the port of the client-receiver TCP interface. Use single-detector command. Is different for each detector if same \c rx_hostname used. Must be first command to communicate with receiver. + - rx_tcpport [port] sets/gets the port of the client-receiver TCP interface. Use single-detector command. Is different for each detector if same \c rx_hostname used. Must be first command to communicate with receiver. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="rx_tcpport"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPort; i++; /*! \page network - - port [port] sets/gets the port of the client-detector control server TCP interface. Use single-detector command. Default value is 1952 for all detectors. Normally not changed. + - port [port] sets/gets the port of the client-detector control server TCP interface. Use single-detector command. Default value is 1952 for all detectors. Normally not changed. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="port"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPort; i++; /*! \page network - - stopport [port] sets/gets the port of the client-detector stop server TCP interface. Use single-detector command. Default value is 1953 for all detectors. Normally not changed. + - stopport [port] sets/gets the port of the client-detector stop server TCP interface. Use single-detector command. Default value is 1953 for all detectors. Normally not changed. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="stopport"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdPort; @@ -1939,14 +1939,14 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page network - - lock [i] Locks/Unlocks the detector to communicate with this client. 1 locks, 0 unlocks. + - lock [i] Locks/Unlocks the detector to communicate with this client. 1 locks, 0 unlocks. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="lock"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLock; i++; /*! \page network - - lastclient Gets the last client communicating with the detector. Cannot put! + - lastclient Gets the last client communicating with the detector. Cannot put!. \c Returns \c (string) */ descrToFuncMap[i].m_pFuncName="lastclient"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLastClient; From 7115ac19b6251ede868adff452c462fe9a051e25 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 17:02:42 +0200 Subject: [PATCH 24/45] command line docu. more coming up --- .../slsDetector/slsDetectorCommand.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 1bad177e3..f77dea947 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1972,21 +1972,21 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page receiver - - receiver [s] starts/stops the receiver to listen to detector packets. Gets status of receiver. Options: [start, stop]. + - receiver [s] starts/stops the receiver to listen to detector packets. Options: [ \c start, \c stop]. \c Returns \c (string) status of receiver[ \c idle, \c running]. */ descrToFuncMap[i].m_pFuncName="receiver"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; /*! \page receiver - - r_online [i] sets/gets the receiver in online/offline mode. 1 is online, 0 is offline. Get is from shared memory. + - r_online [i] sets/gets the receiver in online/offline mode. 1 is online, 0 is offline. Get is from shared memory. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="r_online"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; i++; /*! \page receiver - - r_checkonline Checks the receiver if it is online/offline mode. Prints either 'All receiver online', '[List of all receiver hostname in offline mode] :Not all receiver online'. Only get! + - r_checkonline Checks the receiver if it is online/offline mode. Only get! \c Returns (string) "All online" or "[list of offline hostnames] : Not online". */ descrToFuncMap[i].m_pFuncName="r_checkonline"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdOnline; @@ -1994,49 +1994,49 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { /*! \page receiver - - framescaught gets the number of frames caught by receiver. Average of all for multi-detector command. Only get! + - framescaught gets the number of frames caught by receiver. Average of all for multi-detector command. Only get! \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="framescaught"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; /*! \page receiver - - resetframescaught [i] resets the number of frames caught to 0. i can be any number. Use this if using status start, instead of acquire (this command is included). Only put! + - resetframescaught [i] resets the number of frames caught to 0. i can be any number. Use this if using status start, instead of acquire (this command is included). Only put! \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="resetframescaught"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; /*! \page receiver - - frameindex [i] gets the current frame index of receiver. Average of all for multi-detector command. Only get! + - frameindex [i] gets the current frame index of receiver. Average of all for multi-detector command. Only get! \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="frameindex"; descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; /*! \page receiver - - r_lock [i] locks/unlocks the receiver to communicate with only this client. 1 locks, 0 unlocks. + - r_lock [i] locks/unlocks the receiver to communicate with only this client. 1 locks, 0 unlocks. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="r_lock"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLock; i++; /*! \page receiver - - r_lastclient gets the last client communicating with the receiver. Only get! + - r_lastclient gets the last client communicating with the receiver. Only get! \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="r_lastclient"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdLastClient; i++; /*! \page receiver - - r_readfreq [i] sets/gets the stream frequency of data from receiver to client. i > 0 is the nth frame being streamed. 0 sets frequency to a default timer (200ms). + - r_readfreq [i] sets/gets the stream frequency of data from receiver to client. i > 0 is the nth frame being streamed. 0 sets frequency to a default timer (200ms). \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="r_readfreq"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; i++; /*! \page receiver - - rx_fifodepth [i] sets/gets receiver fifo (between Listener and Writer Threads) depth to i number of frames. Can improve listener packet loss, not if limited by writing. + - rx_fifodepth [i] sets/gets receiver fifo (between Listener and Writer Threads) depth to i number of frames. Can improve listener packet loss (loss due to packet processing time in Listener threads), not if limited by writing. \c Returns \c (int) */ descrToFuncMap[i].m_pFuncName="rx_fifodepth"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdReceiver; From 355c0a8c111f9604039054c00f35c693240c2ecd Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 17:04:29 +0200 Subject: [PATCH 25/45] command line docu. more coming up --- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index f77dea947..5f8099096 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1459,7 +1459,7 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { - temp_10ge Gets the 10Gbe temperature. Used in EIGER only. \c Returns \c EIGER(double"°C") */ descrToFuncMap[i].m_pFuncName="temp_10ge"; // - descrToFuncMap[i].m_pFuncPtr. \c Returns \c (int ["mV"])etectorCommand::cmdADC; + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdADC; i++; /*! \page settings From cda7814c219df083e818e6ffa7b084999bc280db Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 17 Aug 2017 17:23:13 +0200 Subject: [PATCH 26/45] timing put for delay and period --- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 088d10feb..d5d551b61 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -573,14 +573,13 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { i++; /*! \page timing - /*! \page config - period [i] sets/gets frame period in s. \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="period"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdTimer; i++; - /*! \page config + /*! \page timing - delay [i] sets/gets delay in s. Used in MYTHEN, GOTTHARD only. \c Returns \c (double with 9 decimal digits) */ descrToFuncMap[i].m_pFuncName="delay"; // From ec4be4f2c095cfc9f6532a981ced9de877696793 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 18 Aug 2017 16:11:49 +0200 Subject: [PATCH 27/45] bugfix: framesl was not conected, exptime default time is 10 us --- ...3.0.0.5 => jungfrauDetectorServerv3.0.0.6} | Bin 105172 -> 105172 bytes .../jungfrauDetectorServer/gitInfo.txt | 10 +++++----- .../jungfrauDetectorServer/gitInfoJungfrau.h | 8 ++++---- .../slsDetectorFunctionList.c | 2 +- .../slsDetectorServer_funcs.c | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) rename slsDetectorSoftware/jungfrauDetectorServer/bin/{jungfrauDetectorServerv3.0.0.5 => jungfrauDetectorServerv3.0.0.6} (78%) diff --git a/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.0.5 b/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.0.6 similarity index 78% rename from slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.0.5 rename to slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv3.0.0.6 index 0e633eb8fcd1e4401a2df0498d5dd25f9fbfc23f..34021f5b7027bcfcec3f1a9a60d9fa9290a31b43 100755 GIT binary patch delta 11007 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 Date: Fri, 18 Aug 2017 18:35:30 +0200 Subject: [PATCH 28/45] updaterev --- slsDetectorSoftware/gitInfo.txt | 8 ++++---- slsDetectorSoftware/slsDetector/gitInfoLib.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index f80b69fa5..ef69e3a61 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 2dfbd9016b501eca6ee2c00a08e49a3f7e7990d8 -Revision: 1452 +Repsitory UUID: aab5292e58e0ebf3a425e13254194f780952155a +Revision: 1491 Branch: 3.0-rc Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1457 -Last Changed Date: 2017-08-09 11:36:51.000000002 +0200 ./multiSlsDetector/multiSlsDetector.cpp +Last Changed Rev: 1496 +Last Changed Date: 2017-08-18 16:08:14.000000002 +0200 ./slsDetector/slsDetector.cpp diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index 1b50b021d..4329057b4 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURLLIB "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUIDLIB "2dfbd9016b501eca6ee2c00a08e49a3f7e7990d8" -//#define SVNREV 0x1457 +#define SVNREPUUIDLIB "aab5292e58e0ebf3a425e13254194f780952155a" +//#define SVNREV 0x1496 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTHLIB "Dhanya_Maliakal" -#define SVNREVLIB 0x1457 -#define SVNDATELIB 0x20170809 +#define SVNREVLIB 0x1496 +#define SVNDATELIB 0x20170818 // From a7dab9a257087309d52d53cd5e1dfff52eecacec Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 22 Aug 2017 19:42:52 +0200 Subject: [PATCH 29/45] updating user documentation. another update required --- slsDetectorSoftware/.gitignore | 1 - slsDetectorSoftware/Makefile | 29 +------ .../include/slsReceiverUsers.h | 2 +- slsDetectorSoftware/slsDetectorClient.doxy | 86 ------------------- slsDetectorSoftware/slsDetectorUsers.doxy | 86 ------------------- 5 files changed, 3 insertions(+), 201 deletions(-) delete mode 100644 slsDetectorSoftware/slsDetectorClient.doxy delete mode 100644 slsDetectorSoftware/slsDetectorUsers.doxy diff --git a/slsDetectorSoftware/.gitignore b/slsDetectorSoftware/.gitignore index 6a4d1707d..fc05915b5 100644 --- a/slsDetectorSoftware/.gitignore +++ b/slsDetectorSoftware/.gitignore @@ -1,4 +1,3 @@ *.o *~ #*# -slsDetectorClientDocs/ diff --git a/slsDetectorSoftware/Makefile b/slsDetectorSoftware/Makefile index 7c8f501ad..850edef3f 100644 --- a/slsDetectorSoftware/Makefile +++ b/slsDetectorSoftware/Makefile @@ -2,7 +2,6 @@ include ../Makefile.include DESTDIR ?= ../bin LIBDIR ?= $(DESTDIR) -DOCDIR ?= docs CFLAGS= -g -DC_ONLY -fPIC @@ -33,34 +32,10 @@ $(info ) OBJS = $(SRC_CLNT:%.cpp=%.o) -.PHONY: all intdoc doc htmldoc package clean +.PHONY: all package clean all: package $(SRC_CLNT) -intdoc: $(SRC_H) $(SRC_CLNT) - doxygen doxy.config - -doc: $(DOCDIR)/pdf/slsDetectorUsersDocs.pdf - -$(DOCDIR)/pdf/slsDetectorUsersDocs.pdf: slsDetectorUsersDocs - cd slsDetectorUsersDocs/latex && make - $(shell test -d $(DOCDIR) || mkdir -p $(DOCDIR)) - $(shell test -d $(DOCDIR)/pdf || mkdir -p $(DOCDIR)/pdf) - cp slsDetectorUsersDocs/latex/refman.pdf $(DOCDIR)/pdf/slsDetectorUsersDocs.pdf - - -htmldoc: $(DOCDIR)/html/slsDetectorUsersDocs - -$(DOCDIR)/html/slsDetectorUsersDocs: slsDetectorUsersDocs - $(shell test -d $(DOCDIR) || mkdir -p $(DOCDIR)) - $(shell test -d $(DOCDIR)/html || mkdir -p $(DOCDIR)/html) - $(shell test -d $(DOCDIR)/html/slsDetectorUsersDocs && rm -r $(DOCDIR)/html/slsDetectorUsersDocs) - cp -r slsDetectorUsersDocs/html $(DOCDIR)/html/slsDetectorUsersDocs - -slsDetectorUsersDocs: slsDetectorUsers.doxy slsDetector/slsDetectorUsers.h slsDetector/slsDetectorUsers.cpp slsDetectorAnalysis/detectorData.h - doxygen slsDetectorUsers.doxy - - mythenVirtualServer: $(SRC_MYTHEN_SVC) cd mythenDetectorServer && make -f Makefile.virtual DESTDIR=$(DESTDIR) @@ -90,7 +65,7 @@ $(DESTDIR)/libSlsDetector.a: $(OBJS) mv libSlsDetector.a $(DESTDIR) clean: - rm -rf $(DESTDIR)/libSlsDetector.a $(DESTDIR)/libSlsDetector.so core docs/* slsDetectorUsersDocs $(OBJS) + rm -rf $(DESTDIR)/libSlsDetector.a $(DESTDIR)/libSlsDetector.so core $(OBJS) cd diff --git a/slsDetectorSoftware/include/slsReceiverUsers.h b/slsDetectorSoftware/include/slsReceiverUsers.h index d73c332c0..c8727f200 120000 --- a/slsDetectorSoftware/include/slsReceiverUsers.h +++ b/slsDetectorSoftware/include/slsReceiverUsers.h @@ -1 +1 @@ -../slsReceiver/slsReceiverUsers.h \ No newline at end of file +../../slsReceiverSoftware/include/slsReceiverUsers.h \ No newline at end of file diff --git a/slsDetectorSoftware/slsDetectorClient.doxy b/slsDetectorSoftware/slsDetectorClient.doxy deleted file mode 100644 index 2d955c610..000000000 --- a/slsDetectorSoftware/slsDetectorClient.doxy +++ /dev/null @@ -1,86 +0,0 @@ -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - - - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = YES - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -INTERNAL_DOCS = NO - -SHOW_INCLUDE_FILES = NO - -SHOW_FILES = NO - -SHOW_NAMESPACES = NO - -COMPACT_LATEX = YES - -PAPER_TYPE = a4 - -PDF_HYPERLINKS = YES - -USE_PDFLATEX = YES - -LATEX_HIDE_INDICES = YES - - -PREDEFINED = __cplusplus - -INPUT = slsDetector/slsDetectorCommand.cpp - -OUTPUT_DIRECTORY = ../manual/slsDetectorClientDocs diff --git a/slsDetectorSoftware/slsDetectorUsers.doxy b/slsDetectorSoftware/slsDetectorUsers.doxy deleted file mode 100644 index 6f3674742..000000000 --- a/slsDetectorSoftware/slsDetectorUsers.doxy +++ /dev/null @@ -1,86 +0,0 @@ -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - - - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = YES - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -INTERNAL_DOCS = NO - -SHOW_INCLUDE_FILES = NO - -SHOW_FILES = NO - -SHOW_NAMESPACES = NO - -COMPACT_LATEX = YES - -PAPER_TYPE = a4 - -PDF_HYPERLINKS = YES - -USE_PDFLATEX = YES - -LATEX_HIDE_INDICES = YES - - -PREDEFINED = __cplusplus - -INPUT = slsDetector/slsDetectorUsers.h slsDetectorAnalysis/detectorData.h - -OUTPUT_DIRECTORY = slsDetectorUsersDocs From 4f28df03ab24a92d7a2ff9b13e82b461a56ab6ca Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 22 Aug 2017 19:43:26 +0200 Subject: [PATCH 30/45] trials --- .../multiSlsDetector/multiSlsDetector.cpp | 18 +++++++++--------- .../slsDetector/slsDetectorCommand.cpp | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index d86ecc319..b577290f1 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3590,10 +3590,10 @@ string multiSlsDetector::setNetworkParameter(networkParameter p, string s){ // disable data streaming before changing zmq port (but only if they were on) /*int prev_streaming = 0;*/ - if (p == RECEIVER_STREAMING_PORT) { + // if (p == RECEIVER_STREAMING_PORT) { /*prev_streaming = getStreamingSocketsCreatedInClient();*/ - enableDataStreamingFromReceiver(0); - } + // enableDataStreamingFromReceiver(0); + // } if (s.find('+')==string::npos) { @@ -5883,8 +5883,8 @@ int multiSlsDetector::getStreamingSocketsCreatedInClient() { int multiSlsDetector::enableDataStreamingFromReceiver(int enable){ - if(enable >= 0){ - /*if(dataSocketsStarted != enable){*/ + /* if(enable >= 0){ + //destroy data threads if(dataSocketsStarted) createReceivingDataSockets(true); @@ -5899,9 +5899,9 @@ int multiSlsDetector::enableDataStreamingFromReceiver(int enable){ return -1; } } - /*}*/ + - } + }*/ @@ -5937,9 +5937,9 @@ int multiSlsDetector::enableDataStreamingFromReceiver(int enable){ } } - if(ret != dataSocketsStarted) + /* if(ret != dataSocketsStarted) ret = -1; - + */ return ret; } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index d5d551b61..280027c46 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -5868,7 +5868,7 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) { if (action==PUT_ACTION) { if(!strcasecmp(args[1],"start")) { //to ensure data streaming enable is the same across client and receiver - if (receivers == ONLINE_FLAG) { + /*if (receivers == ONLINE_FLAG) { //if it was not off if (myDet->enableDataStreamingFromReceiver(-1) != 0){ //switch it off, if error @@ -5876,7 +5876,7 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) { return string("could not disable data streaming in receiver\n"); } } - } + }*/ myDet->startReceiver(); } else if(!strcasecmp(args[1],"stop")){ From b208acf4a03b06889944e3d2d16d1105ac593484 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 23 Aug 2017 09:41:10 +0200 Subject: [PATCH 31/45] moved doxy.config to here --- slsDetectorSoftware/doxy.config | 164 ++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 slsDetectorSoftware/doxy.config diff --git a/slsDetectorSoftware/doxy.config b/slsDetectorSoftware/doxy.config new file mode 100644 index 000000000..9dec99861 --- /dev/null +++ b/slsDetectorSoftware/doxy.config @@ -0,0 +1,164 @@ +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + + + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +INTERNAL_DOCS = NO + +SHOW_INCLUDE_FILES = NO + +SHOW_FILES = NO + +SHOW_NAMESPACES = NO + +COMPACT_LATEX = YES + +PAPER_TYPE = a4 + +PDF_HYPERLINKS = YES + +USE_PDFLATEX = YES + +LATEX_HIDE_INDICES = YES + +PREDEFINED = __cplusplus + +INPUT = commonFiles/communication_funcs.h \ + commonFiles/error_defs.h \ + commonFiles/sls_detector_defs.h \ + commonFiles/sls_detector_funcs.h \ + f90Interface/externPostProcessing.h \ + multiSlsDetector/multiSlsDetectorClient.h \ + multiSlsDetector/multiSlsDetectorCommand.h \ + multiSlsDetector/multiSlsDetector.h \ + slsDetector/slsDetectorActions.h \ + slsDetector/slsDetectorBase.h \ + slsDetector/slsDetectorCommand.h \ + slsDetector/slsDetector.h \ + slsDetector/slsDetectorUsers.h \ + slsDetector/slsDetectorUtils.h \ + slsDetectorAnalysis/angCalLogClass.h \ + slsDetectorAnalysis/angleConversionConstant.h \ + slsDetectorAnalysis/angularCalibration.h \ + slsDetectorAnalysis/angularConversion.h \ + slsDetectorAnalysis/AngularConversion_Standalone.h \ + slsDetectorAnalysis/angularConversionStatic.h \ + slsDetectorAnalysis/badChannelCorrections.h \ + slsDetectorAnalysis/detectorData.h \ + slsDetectorAnalysis/enCalLogClass.h \ + slsDetectorAnalysis/energyCalibration.h \ + slsDetectorAnalysis/energyConversion.h \ + slsDetectorAnalysis/fileIO.h \ + slsDetectorAnalysis/FileIO_Standalone.h \ + slsDetectorAnalysis/fileIOStatic.h \ + slsDetectorAnalysis/movingStat.h \ + slsDetectorAnalysis/postProcessingFileIO_Standalone.h \ + slsDetectorAnalysis/postProcessingFuncs.h \ + slsDetectorAnalysis/postProcessing.h \ + slsDetectorAnalysis/postProcessing_Standalone.h \ + slsDetectorAnalysis/runningStat.h \ + slsDetectorAnalysis/singlePhotonFilter.h \ + slsDetectorAnalysis/single_photon_hit.h \ + slsDetectorAnalysis/TSlsDetectorDict.h \ + slsReceiverInterface/receiverInterface.h \ + threadFiles/CondVar.h \ + threadFiles/Global.h \ + threadFiles/Multi.h \ + threadFiles/Mutex.h \ + threadFiles/Single.h \ + threadFiles/Task.h \ + threadFiles/ThreadPool.h \ + usersFunctions/angleFunction.h \ + usersFunctions/usersFunctions.h \ + ../slsReceiverSoftware/include/ansi.h \ + ../slsReceiverSoftware/include/BinaryFile.h \ + ../slsReceiverSoftware/include/BinaryFileStatic.h \ + ../slsReceiverSoftware/include/circularFifo.h \ + ../slsReceiverSoftware/include/DataProcessor.h \ + ../slsReceiverSoftware/include/DataStreamer.h \ + ../slsReceiverSoftware/include/Fifo.h \ + ../slsReceiverSoftware/include/File.h \ + ../slsReceiverSoftware/include/GeneralData.h \ + ../slsReceiverSoftware/include/genericSocket.h \ + ../slsReceiverSoftware/include/HDF5File.h \ + ../slsReceiverSoftware/include/HDF5FileStatic.h \ + ../slsReceiverSoftware/include/Listener.h \ + ../slsReceiverSoftware/include/logger.h \ + ../slsReceiverSoftware/include/MySocketTCP.h \ + ../slsReceiverSoftware/include/receiver_defs.h \ + ../slsReceiverSoftware/include/RestHelper.h \ + ../slsReceiverSoftware/include/sls_receiver_defs.h \ + ../slsReceiverSoftware/include/sls_receiver_funcs.h \ + ../slsReceiverSoftware/include/slsReceiver.h \ + ../slsReceiverSoftware/include/slsReceiverTCPIPInterface.h \ + ../slsReceiverSoftware/include/slsReceiverUsers.h \ + ../slsReceiverSoftware/include/ThreadObject.h \ + ../slsReceiverSoftware/include/UDPBaseImplementation.h \ + ../slsReceiverSoftware/include/UDPInterface.h \ + ../slsReceiverSoftware/include/UDPRESTImplementation.h \ + ../slsReceiverSoftware/include/UDPStandardImplementation.h \ + ../slsReceiverSoftware/include/utilities.h \ + ../slsReceiverSoftware/include/ZmqSocket.h + + + + +OUTPUT_DIRECTORY = slsDetectorPackageDocs + From f4e2b819d2af85da42f3849bba9ebb0fc9205cb0 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 23 Aug 2017 16:31:32 +0200 Subject: [PATCH 32/45] changes for external gui --- slsDetectorSoftware/slsDetector/slsDetector.cpp | 2 +- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 6d63bcb77..82ce91d8f 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -4540,7 +4540,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ if (connectData() == OK){ ret=thisReceiver->sendIntArray(fnum2,retval,args,mess); disconnectData(); - } + }else cprintf(RED,"could not connect\n"); if((args[1] != retval)|| (ret==FAIL)){ ret = FAIL; cout << "ERROR: " << timername << " in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 280027c46..02c78580c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -2295,7 +2295,9 @@ string slsDetectorCommand::cmdAcquire(int narg, char *args[], int action) { myDet->setOnline(ONLINE_FLAG); - if (myDet->setReceiverOnline(ONLINE_FLAG) == ONLINE_FLAG) { + + myDet->setReceiverOnline(ONLINE_FLAG); + /*if (myDet->setReceiverOnline(ONLINE_FLAG) == ONLINE_FLAG) { // command line: must be off, if receiver on or there was -1, then if (myDet->enableDataStreamingFromReceiver(-1) != 0){ //switch it off, if error @@ -2303,7 +2305,7 @@ string slsDetectorCommand::cmdAcquire(int narg, char *args[], int action) { return string("could not disable data streaming in receiver\n"); } } - } + }*/ if(myDet->acquire() == FAIL) return string("acquire unsuccessful"); From a657bac1b1a570ab0a14618d0be2663a5c794534 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 23 Aug 2017 18:01:02 +0200 Subject: [PATCH 33/45] removed a print --- slsDetectorSoftware/slsDetector/slsDetector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 82ce91d8f..6d63bcb77 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -4540,7 +4540,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ if (connectData() == OK){ ret=thisReceiver->sendIntArray(fnum2,retval,args,mess); disconnectData(); - }else cprintf(RED,"could not connect\n"); + } if((args[1] != retval)|| (ret==FAIL)){ ret = FAIL; cout << "ERROR: " << timername << " in receiver set incorrectly to " << retval << " instead of " << args[1] << endl; From 7ffd9b87b8e8591c1d1d65e49c3e734dcd24359b Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 23 Aug 2017 18:01:34 +0200 Subject: [PATCH 34/45] bug fix:removed 0x prefix for dr --- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index d5d551b61..6d89fc56c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -4329,7 +4329,7 @@ string slsDetectorCommand::cmdDetectorSize(int narg, char *args[], int action) { if (cmd=="roimask") sprintf(ans,"0x%x",ret); else - sprintf(ans,"0x%d",ret); + sprintf(ans,"%d",ret); return string(ans); From bdccddfe974460535599f19a26f92396b966444e Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 23 Aug 2017 18:24:48 +0200 Subject: [PATCH 35/45] in between --- .../multiSlsDetector/multiSlsDetector.cpp | 10 ++++++++++ .../multiSlsDetector/multiSlsDetector.h | 16 ++++++++++++++++ slsDetectorSoftware/slsDetector/slsDetector.cpp | 12 ++++++++++++ slsDetectorSoftware/slsDetector/slsDetector.h | 12 ++++++++++++ 4 files changed, 50 insertions(+) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index b577290f1..a341d2013 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -207,6 +207,7 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) thisMultiDetector->receiver_read_freq = 0; thisMultiDetector->acquiringFlag = false; + thisMultiDetector->externalgui = false; thisMultiDetector->alreadyExisting=1; } @@ -6255,3 +6256,12 @@ void multiSlsDetector::setAcquiringFlag(bool b){ bool multiSlsDetector::getAcquiringFlag(){ return thisMultiDetector->acquiringFlag; } + + +void multiSlsDetector::setExternalGuiFlag(bool b){ + thisMultiDetector->externalgui = b; +} + +bool multiSlsDetector::getExternalGuiFlag(){ + return thisMultiDetector->externalgui; +} diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 3a095a20d..feba8e9ab 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -201,6 +201,9 @@ class multiSlsDetector : public slsDetectorUtils { /** flag for acquiring */ bool acquiringFlag; + /** external gui */ + bool externalgui; + } sharedMultiSlsDetector; @@ -1442,6 +1445,19 @@ class multiSlsDetector : public slsDetectorUtils { */ bool getAcquiringFlag(); + /** + Set external gui flag in shared memory + \param b set external gui flag + */ + void setExternalGuiFlag(bool b=false); + + /** + Get external gui flag from shared memory + \returns external gui flag + */ + void getExternalGuiFlag(); + + private: diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 6d63bcb77..792b86e0a 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -9074,3 +9074,15 @@ void slsDetector::setAcquiringFlag(bool b){ bool slsDetector::getAcquiringFlag(){ return thisDetector->acquiringFlag; } + + +void slsDetector::setExternalGuiFlag(bool b){ + pthread_mutex_lock(&ms); + parentDet->setExternalGuiFlag(b); + pthread_mutex_unlock(&ms); +} + +bool slsDetector::getExternalGuiFlag(){ + return parentDet->getExternalGuiFlag(); +} + diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index d6005448b..a44770a9e 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1884,6 +1884,18 @@ class slsDetector : public slsDetectorUtils, public energyConversion { */ bool getAcquiringFlag(); + /** + Set external gui flag in shared memory + \param b set external gui flag + */ + void setExternalGuiFlag(bool b=false); + + /** + Get external gui flag from shared memory + \returns external gui flag + */ + void getExternalGuiFlag(); + protected: From 6332025bbc000ffa51485e0c49fa3ebe2dfe947e Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 23 Aug 2017 18:26:25 +0200 Subject: [PATCH 36/45] frames caught in 9m was only looking at 1st receiver, now made to average --- .../multiSlsDetector/multiSlsDetector.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index d86ecc319..01c3b74c8 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -5324,16 +5324,6 @@ slsDetectorDefs::runStatus multiSlsDetector::getReceiverStatus(){ int multiSlsDetector::getFramesCaughtByReceiver() { int ret=0,ret1=0; - if(thisMultiDetector->numberOfDetectors>10) { - if (detectors[0]){ - ret =detectors[0]->getFramesCaughtByReceiver(); - if(detectors[0]->getErrorMask()) - setErrorMask(getErrorMask()|(1<<0)); - } - return ret; - } - - for (int i=0; inumberOfDetectors; i++) if (detectors[i]){ ret1+=detectors[i]->getFramesCaughtByReceiver(); From 0bea688a83d5a00127b65449448d1343fcc3b502 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 23 Aug 2017 19:06:40 +0200 Subject: [PATCH 37/45] changes for external gui --- .../multiSlsDetector/multiSlsDetector.cpp | 33 ++++++++++--------- .../multiSlsDetector/multiSlsDetector.h | 2 +- slsDetectorSoftware/slsDetector/slsDetector.h | 2 +- .../slsDetector/slsDetectorCommand.cpp | 33 ++++++++++++------- .../slsDetector/slsDetectorUtils.h | 13 ++++++++ 5 files changed, 54 insertions(+), 29 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 1ae24fde9..3652d3a80 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3590,11 +3590,11 @@ string multiSlsDetector::getNetworkParameter(networkParameter p) { string multiSlsDetector::setNetworkParameter(networkParameter p, string s){ // disable data streaming before changing zmq port (but only if they were on) - /*int prev_streaming = 0;*/ - // if (p == RECEIVER_STREAMING_PORT) { - /*prev_streaming = getStreamingSocketsCreatedInClient();*/ - // enableDataStreamingFromReceiver(0); - // } + int prev_streaming = 0; + if (p == RECEIVER_STREAMING_PORT) { + prev_streaming = getStreamingSocketsCreatedInClient(); + enableDataStreamingFromReceiver(0); + } if (s.find('+')==string::npos) { @@ -3647,11 +3647,11 @@ string multiSlsDetector::setNetworkParameter(networkParameter p, string s){ } } -/* + //enable data streaming if it was on if (p == RECEIVER_STREAMING_PORT && prev_streaming) enableDataStreamingFromReceiver(1); -*/ + return getNetworkParameter(p); } @@ -5874,8 +5874,10 @@ int multiSlsDetector::getStreamingSocketsCreatedInClient() { int multiSlsDetector::enableDataStreamingFromReceiver(int enable){ - /* if(enable >= 0){ - + //create client sockets only if no external gui + if (!thisMultiDetector->externalgui) { + if(enable >= 0){ + //destroy data threads if(dataSocketsStarted) createReceivingDataSockets(true); @@ -5890,10 +5892,8 @@ int multiSlsDetector::enableDataStreamingFromReceiver(int enable){ return -1; } } - - - }*/ - + } + } int ret=-100; @@ -5928,9 +5928,10 @@ int multiSlsDetector::enableDataStreamingFromReceiver(int enable){ } } - /* if(ret != dataSocketsStarted) - ret = -1; - */ + if (!thisMultiDetector->externalgui) { + if (ret != dataSocketsStarted) + ret = -1; + } return ret; } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index feba8e9ab..258bfa933 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1455,7 +1455,7 @@ class multiSlsDetector : public slsDetectorUtils { Get external gui flag from shared memory \returns external gui flag */ - void getExternalGuiFlag(); + bool getExternalGuiFlag(); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index a44770a9e..07a92ab14 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1894,7 +1894,7 @@ class slsDetector : public slsDetectorUtils, public energyConversion { Get external gui flag from shared memory \returns external gui flag */ - void getExternalGuiFlag(); + bool getExternalGuiFlag(); protected: diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 26caf3999..d3c49ff9c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -256,9 +256,9 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { */ /*! \page config - - datastream enables/disables the 0MQ data stream (0MQ threads created) from receiver to client. \c Returns \c (int) + - externalgui sets/gets external gui flag. 1 sets and enables the 0MQ data stream (0MQ threads created) from receiver to client, while 0 unsets and disables. \c Returns \c (int) */ - descrToFuncMap[i].m_pFuncName="datastream"; // + descrToFuncMap[i].m_pFuncName="externalgui"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdDataStream; i++; @@ -2296,8 +2296,9 @@ string slsDetectorCommand::cmdAcquire(int narg, char *args[], int action) { myDet->setOnline(ONLINE_FLAG); - myDet->setReceiverOnline(ONLINE_FLAG); - /*if (myDet->setReceiverOnline(ONLINE_FLAG) == ONLINE_FLAG) { + if (myDet->getExternalGuiFlag()) + myDet->setReceiverOnline(ONLINE_FLAG); + else if (myDet->setReceiverOnline(ONLINE_FLAG) == ONLINE_FLAG) { // command line: must be off, if receiver on or there was -1, then if (myDet->enableDataStreamingFromReceiver(-1) != 0){ //switch it off, if error @@ -2305,7 +2306,7 @@ string slsDetectorCommand::cmdAcquire(int narg, char *args[], int action) { return string("could not disable data streaming in receiver\n"); } } - }*/ + } if(myDet->acquire() == FAIL) return string("acquire unsuccessful"); @@ -2471,10 +2472,20 @@ string slsDetectorCommand::cmdDataStream(int narg, char *args[], int action) { if (action==PUT_ACTION) { if (!sscanf(args[1],"%d",&ival)) - return string ("cannot scan datastream mode"); + return string ("cannot scan externalgui mode"); + bool bval=ival>0?true:false; + bool oldval = myDet->getExternalGuiFlag(); + myDet->setExternalGuiFlag(bval); myDet->enableDataStreamingFromReceiver(ival); } - sprintf(ans,"%d",myDet->enableDataStreamingFromReceiver()); + + int retval = myDet->getExternalGuiFlag(); + //if external gui on and datastreaming off + if (retval && !myDet->enableDataStreamingFromReceiver()) { + retval=-1; + printf("Error: data streaming in receiver is switched off while external gui flag in shared memory is off.\n"); + } + sprintf(ans,"%d",myDet->getExternalGuiFlag()); return string(ans); } @@ -2483,9 +2494,9 @@ string slsDetectorCommand::helpDataStream(int narg, char *args[], int action) { ostringstream os; if (action==GET_ACTION || action==HELP_ACTION) - os << string("datastream \t gets if zmq data stream from receiver is enabled. \n"); + os << string("externalgui \t gets external gui flag. 1/0 means the 0MQ data stream (0MQ threads created) from receiver to client is enabled/disabled. -1 for inconsistency. \n"); if (action==PUT_ACTION || action==HELP_ACTION) - os << string("datastream i\t enables/disables the zmq data stream from receiver. \n"); + os << string("externalgui i\t sets external gui flag. 1/0 means the 0MQ data stream (0MQ threads created) from receiver to client is enabled/disabled. \n"); return os.str(); } @@ -5870,7 +5881,7 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) { if (action==PUT_ACTION) { if(!strcasecmp(args[1],"start")) { //to ensure data streaming enable is the same across client and receiver - /*if (receivers == ONLINE_FLAG) { + if ((!myDet->getExternalGuiFlag()) && (receivers == ONLINE_FLAG)) { //if it was not off if (myDet->enableDataStreamingFromReceiver(-1) != 0){ //switch it off, if error @@ -5878,7 +5889,7 @@ string slsDetectorCommand::cmdReceiver(int narg, char *args[], int action) { return string("could not disable data streaming in receiver\n"); } } - }*/ + } myDet->startReceiver(); } else if(!strcasecmp(args[1],"stop")){ diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index 655c77d78..0eb80899d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -846,6 +846,19 @@ virtual int setReceiverFifoDepth(int i = -1)=0; */ virtual bool getAcquiringFlag() = 0; + /** + Set external gui flag in shared memory + \param b set external gui flag + */ + virtual void setExternalGuiFlag(bool b=false) = 0; + + /** + Get external gui flag from shared memory + \returns external gui flag + */ + virtual bool getExternalGuiFlag() = 0; + + From e5c84fd11ca7717587b4142e72106ac6e46f87af Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 24 Aug 2017 16:03:31 +0200 Subject: [PATCH 38/45] external gui unused variables --- slsDetectorSoftware/gitInfo.txt | 10 +++++----- slsDetectorSoftware/slsDetector/gitInfoLib.h | 8 ++++---- slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp | 4 +--- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index ef69e3a61..c3a0ad181 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: aab5292e58e0ebf3a425e13254194f780952155a -Revision: 1491 -Branch: 3.0-rc +Repsitory UUID: 7eb486427fab1732def525df6fcfad6e34ee4f74 +Revision: 1539 +Branch: 3.0 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1496 -Last Changed Date: 2017-08-18 16:08:14.000000002 +0200 ./slsDetector/slsDetector.cpp +Last Changed Rev: 1544 +Last Changed Date: 2017-08-24 14:09:36.000000002 +0200 ./slsDetector/slsDetectorUtils.h diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index 4329057b4..301f1e34c 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURLLIB "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUIDLIB "aab5292e58e0ebf3a425e13254194f780952155a" -//#define SVNREV 0x1496 +#define SVNREPUUIDLIB "7eb486427fab1732def525df6fcfad6e34ee4f74" +//#define SVNREV 0x1544 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTHLIB "Dhanya_Maliakal" -#define SVNREVLIB 0x1496 -#define SVNDATELIB 0x20170818 +#define SVNREVLIB 0x1544 +#define SVNDATELIB 0x20170824 // diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index d3c49ff9c..3968c7d8b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -2473,9 +2473,7 @@ string slsDetectorCommand::cmdDataStream(int narg, char *args[], int action) { if (action==PUT_ACTION) { if (!sscanf(args[1],"%d",&ival)) return string ("cannot scan externalgui mode"); - bool bval=ival>0?true:false; - bool oldval = myDet->getExternalGuiFlag(); - myDet->setExternalGuiFlag(bval); + myDet->setExternalGuiFlag(ival>0?true:false); myDet->enableDataStreamingFromReceiver(ival); } From 5e11e0a7db8dc94be36e1826d19fb1a68a46d1ad Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 24 Aug 2017 18:39:35 +0200 Subject: [PATCH 39/45] added adc reader standalone --- slsDetectorSoftware/slsADCReader/Makefile | 20 +++ slsDetectorSoftware/slsADCReader/slsADCReader | Bin 0 -> 20662 bytes .../slsADCReader/slsADCReader.cpp | 118 ++++++++++++++++++ .../slsDetector/slsDetectorCommand.cpp | 2 +- 4 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 slsDetectorSoftware/slsADCReader/Makefile create mode 100755 slsDetectorSoftware/slsADCReader/slsADCReader create mode 100644 slsDetectorSoftware/slsADCReader/slsADCReader.cpp diff --git a/slsDetectorSoftware/slsADCReader/Makefile b/slsDetectorSoftware/slsADCReader/Makefile new file mode 100644 index 000000000..a18908a67 --- /dev/null +++ b/slsDetectorSoftware/slsADCReader/Makefile @@ -0,0 +1,20 @@ +CC = g++ +SRC = slsADCReader.cpp +INCLUDES = -I ../../slsReceiverSoftware/include -I ../commonFiles +CFLAGS = -Wall -lm -lstdc++ + + +all: clean slsADCReader + + +slsADCReader: $(SRC) + echo "creating adc reader" + $(CC) -o $@ $^ $(CFLAGS) $(INCLUDES) + + +clean: + echo "cleaning" + rm -rf *.o + + + diff --git a/slsDetectorSoftware/slsADCReader/slsADCReader b/slsDetectorSoftware/slsADCReader/slsADCReader new file mode 100755 index 0000000000000000000000000000000000000000..3117fc8bf9f60a04f2b74f2796f1f22222b9573d GIT binary patch literal 20662 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 literal 0 HcmV?d00001 diff --git a/slsDetectorSoftware/slsADCReader/slsADCReader.cpp b/slsDetectorSoftware/slsADCReader/slsADCReader.cpp new file mode 100644 index 000000000..f27eb3a86 --- /dev/null +++ b/slsDetectorSoftware/slsADCReader/slsADCReader.cpp @@ -0,0 +1,118 @@ +#include "MySocketTCP.h" + +#include "sls_detector_defs.h" +#include "sls_receiver_defs.h" + +#include "sls_detector_funcs.h" + +#include +#include + +#define INVALID -999 + +enum detectorFunctions{ + F_GET_ADC=13 +}; + +void help() { + cerr << "Usage:\n" + "slsAdcReader [hostname] [adcval]" << endl; + exit(EXIT_FAILURE); +} + + +slsDetectorDefs::dacIndex getADCEnum(char* cval){ + int idac; + string cmd; + cmd.assign(cval); + + if (sscanf(cval,"adc:%d",&idac)==1) { + return (slsDetectorDefs::dacIndex)(idac+1000); + } else if (cmd=="temp_adc") + return slsDetectorDefs::TEMPERATURE_ADC; + else if (cmd=="temp_fpga") + return slsDetectorDefs::TEMPERATURE_FPGA; + else if (cmd=="temp_fpgaext") + return slsDetectorDefs::TEMPERATURE_FPGAEXT; + else if (cmd=="temp_10ge") + return slsDetectorDefs::TEMPERATURE_10GE; + else if (cmd=="temp_dcdc") + return slsDetectorDefs::TEMPERATURE_DCDC; + else if (cmd=="temp_sodl") + return slsDetectorDefs::TEMPERATURE_SODL; + else if (cmd=="temp_sodr") + return slsDetectorDefs::TEMPERATURE_SODR; + else if (cmd=="temp_fpgafl") + return slsDetectorDefs::TEMPERATURE_FPGA2; + else if (cmd=="temp_fpgafr") + return slsDetectorDefs::TEMPERATURE_FPGA3; + else if (cmd=="i_a") + return slsDetectorDefs::I_POWER_A; + else if (cmd=="i_b") + return slsDetectorDefs::I_POWER_B; + else if (cmd=="i_c") + return slsDetectorDefs::I_POWER_C; + else if (cmd=="i_d") + return slsDetectorDefs::I_POWER_D; + else if (cmd=="vm_a") + return slsDetectorDefs::V_POWER_A; + else if (cmd=="vm_b") + return slsDetectorDefs::V_POWER_B; + else if (cmd=="vm_c") + return slsDetectorDefs::V_POWER_C; + else if (cmd=="vm_d") + return slsDetectorDefs::V_POWER_D; + else if (cmd=="vm_io") + return slsDetectorDefs::V_POWER_IO; + else if (cmd=="i_io") + return slsDetectorDefs::I_POWER_IO; + else { + cerr << "cannot decode dac " << cmd << endl; + help(); + return slsDetectorDefs::I_POWER_IO; + } +}; + + + +int main(int argc, char* argv[]) +{ + if (argc < 3) + help(); + slsDetectorDefs::dacIndex idx=getADCEnum(argv[2]); + + + char mess[MAX_STR_LENGTH]=""; + detectorFunctions fnum=F_GET_ADC; + int retval=-1; + int ret=slsReceiverDefs::FAIL; + int arg[2]={idx,0}; + + + MySocketTCP* tempSocket=new MySocketTCP(argv[1],1952); + if (tempSocket->getErrorStatus()){ + cerr << "could not create socket with " << argv[1] << endl; + help(); + } + + if (tempSocket->Connect()) { + tempSocket->SendDataOnly(&fnum, sizeof(fnum)); + tempSocket->SendDataOnly(arg,sizeof(arg)); + tempSocket->ReceiveDataOnly(&ret, sizeof(ret)); + if (ret != slsReceiverDefs::FAIL) { + tempSocket->ReceiveDataOnly(&retval, sizeof(retval)); + } else { + tempSocket->ReceiveDataOnly(mess,sizeof(mess)); + printf("Detector returned Error: %s",mess); + } + tempSocket->Disconnect(); + } else + cerr << "could not connect to " << argv[1] << endl; + + if (idx <= 100) { + printf("%.2f°C\n",(double)retval/1000.00); + }else + printf("%dmV\n",retval); + + return EXIT_SUCCESS; +} diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 3968c7d8b..5a16bef22 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -4864,7 +4864,7 @@ string slsDetectorCommand::cmdDAC(int narg, char *args[], int action) { int idac=-1; if (sscanf(args[0],"dac:%d",&idac)==1) { - printf("chiptestboard!\n"); + //printf("chiptestboard!\n"); dac=(dacIndex)idac; } else if (cmd=="adcvpp") From a78bc86bcad714ca43d8aecb832629e5b1a51ac4 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 24 Aug 2017 18:41:30 +0200 Subject: [PATCH 40/45] adc reader standalone for blackfin as well --- slsDetectorSoftware/slsADCReader/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/slsDetectorSoftware/slsADCReader/Makefile b/slsDetectorSoftware/slsADCReader/Makefile index a18908a67..ce48d2874 100644 --- a/slsDetectorSoftware/slsADCReader/Makefile +++ b/slsDetectorSoftware/slsADCReader/Makefile @@ -1,4 +1,5 @@ CC = g++ +#CC = bfin-uclinux- SRC = slsADCReader.cpp INCLUDES = -I ../../slsReceiverSoftware/include -I ../commonFiles CFLAGS = -Wall -lm -lstdc++ From a8b41ca8130ff2aaf6d89de635fa9bf01be64b5d Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 25 Aug 2017 15:46:16 +0200 Subject: [PATCH 41/45] updating user documentation --- slsDetectorSoftware/slsDetector/slsDetectorUsers.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index 7c7ed1a18..a38471f76 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -60,14 +60,15 @@ detectorData is a structure containing the data and additional information which You can find examples of how this classes can be instatiated in mainClient.cpp and mainReceiver.cpp - \authors Anna Bergamaschi, Dhanya Maliakal - @version 0.2 + \authors Anna Bergamaschi, Dhanya Thattil + @version 3.0

Currently supported detectors

\li MYTHEN \li GOTTHARD controls \li GOTTHARD data receiver -

Coming soon

-\li EIGER +\li EIGER +\li JUNGFRAU + */ From 91fece87b2a00a28a828f70d769bfd068688b16e Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 28 Aug 2017 12:05:42 +0200 Subject: [PATCH 42/45] updaterev --- slsDetectorSoftware/gitInfo.txt | 8 ++++---- slsDetectorSoftware/slsDetector/gitInfoLib.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index c3a0ad181..f3623cd3d 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 7eb486427fab1732def525df6fcfad6e34ee4f74 -Revision: 1539 +Repsitory UUID: 5d45181f177b552819bd60947c6cf4f0abae7681 +Revision: 1543 Branch: 3.0 Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1544 -Last Changed Date: 2017-08-24 14:09:36.000000002 +0200 ./slsDetector/slsDetectorUtils.h +Last Changed Rev: 1548 +Last Changed Date: 2017-08-28 12:02:38.000000002 +0200 ./multiSlsDetector/multiSlsDetector.cpp diff --git a/slsDetectorSoftware/slsDetector/gitInfoLib.h b/slsDetectorSoftware/slsDetector/gitInfoLib.h index 301f1e34c..132820c0f 100644 --- a/slsDetectorSoftware/slsDetector/gitInfoLib.h +++ b/slsDetectorSoftware/slsDetector/gitInfoLib.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURLLIB "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUIDLIB "7eb486427fab1732def525df6fcfad6e34ee4f74" -//#define SVNREV 0x1544 +#define SVNREPUUIDLIB "5d45181f177b552819bd60947c6cf4f0abae7681" +//#define SVNREV 0x1548 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTHLIB "Dhanya_Maliakal" -#define SVNREVLIB 0x1544 -#define SVNDATELIB 0x20170824 +#define SVNREVLIB 0x1548 +#define SVNDATELIB 0x20170828 // From 56aa4be358cf3f144753e18601ef82051b5b2109 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 30 Aug 2017 15:29:58 +0200 Subject: [PATCH 43/45] added eiger virtual class. eiger server minor bug fix. 1. copying local trimbits over from module (in effect same thing)2.rate correction table calculated each time and now only when period is different --- .../eigerDetectorServer/FebControl.c | 2 +- .../eigerDetectorServer/Makefile.virtual | 28 +- .../bin/eigerDetectorServerVirtual | Bin 56085 -> 85673 bytes ....0.16.8 => eigerDetectorServerv3.0.0.16.9} | Bin 288747 -> 288747 bytes .../eigerDetectorServer/gitInfo.txt | 10 +- .../eigerDetectorServer/gitInfoEiger.h | 8 +- .../slsDetectorFunctionList.c | 2 +- .../slsDetectorFunctionList_virtual.c | 999 ++++++++++++++++++ .../slsDetectorFunctionList.h | 3 + .../slsDetectorServer_funcs.c | 11 +- 10 files changed, 1038 insertions(+), 25 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv3.0.0.16.8 => eigerDetectorServerv3.0.0.16.9} (76%) create mode 100644 slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList_virtual.c diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index d7996ea6a..300a92bc9 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -1813,7 +1813,7 @@ int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec){ if(Feb_Control_SetRateCorrectionTable(Feb_Control_rate_correction_table)){ Feb_Control_RateTable_Tau_in_nsec = tau_in_Nsec; - Feb_Control_RateTable_Period_in_nsec = period_in_sec; + Feb_Control_RateTable_Period_in_nsec = period_in_sec*1e9; return 1; }else{ Feb_Control_RateTable_Tau_in_nsec = -1; diff --git a/slsDetectorSoftware/eigerDetectorServer/Makefile.virtual b/slsDetectorSoftware/eigerDetectorServer/Makefile.virtual index 9d3bc6223..24f871d3d 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Makefile.virtual +++ b/slsDetectorSoftware/eigerDetectorServer/Makefile.virtual @@ -1,24 +1,26 @@ -CC = gcc -CFLAGS += -Wall -DDACS_INT -DEIGERD -DDACS_INT -DPCCOMPILE -DSLS_DETECTOR_FUNCTION_LIST #-DSTOP_SERVER #-DVERBOSE #-DVIRTUAL -DPCCOMPILE -LDLIBS += -lm -lstdc++ +CC = gcc +CFLAGS += -Wall -DDACS_INT -DEIGERD -DSLS_DETECTOR_FUNCTION_LIST -DDACS_INT -DPCCOMPILE -DSTOP_SERVER #-DVERBOSE +CFLAGS += -DVIRTUAL -DVIRTUAL_9M -DVIRTUAL_MASTER -PROGS = eigerDetectorServerVirtual -DESTDIR ?= bin -INSTMODE = 0777 +LDLIBS += -lm -lstdc++ -pthread -SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c -#SRC_CLNT2 = Eiger.cxx HardwareIO.cxx LocalLinkInterface.cxx Feb.cxx -OBJS = $(SRC_CLNT:.c=.o) -OBJS2 = $(SRC_CLNT2:.cpp=.o) +PROGS = eigerDetectorServerVirtual +DESTDIR ?= bin +INSTMODE = 0777 + +SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList_virtual.c +OBJS = $(SRC_CLNT:.c=.o) all: clean $(PROGS) -boot: $(OBJS) $(OBJS2) +boot: $(OBJS) -$(PROGS): - echo $(OBJS) $(OBJS2) + +$(PROGS): $(OBJS) +# echo $(CFLAGS) +# echo $(OBJS) mkdir -p $(DESTDIR) $(CC) -o $@ $(SRC_CLNT) $(CFLAGS) $(LDLIBS) mv $(PROGS) $(DESTDIR) diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerVirtual b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerVirtual index 7a8d32b6250f04863a9df7d05905785d6811ec11..934f86b7088150e0c2baf294ebbe422515afafe4 100755 GIT binary patch literal 85673 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�h;KkvQ#2 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 N_BeuOB%T%A{{eX|isS$Q literal 56085 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 N>(!%*rPf9K{{Yz;^PB(x diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.8 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.9 similarity index 76% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.8 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv3.0.0.16.9 index b485fa5dd08202b72c4c10ba4d295ded9b6198ff..6cbc0d41ada6b37ae04b8b20e6e790bcfe8d3c00 100755 GIT binary patch delta 18372 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 F{|8DlH>>~v diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt index 1c9d5a4d6..f66bf01f0 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 177efa2636a7cee812707537ad90489a61832942 -Revision: 299 -Branch: 3.0-rc +Repsitory UUID: 3c1eb747d1930d6d38030a5a607f72d3b58a7a21 +Revision: 301 +Branch: virtualclass Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1480 -Last Changed Date: 2017-08-17 09:06:21.000000002 +0200 ./Makefile +Last Changed Rev: 1549 +Last Changed Date: 2017-08-30 15:06:49.000000002 +0200 ./Makefile.virtual diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h index dec316953..9f01077eb 100644 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h +++ b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_detector_software.git" //#define SVNREPPATH "" -#define SVNREPUUID "177efa2636a7cee812707537ad90489a61832942" -//#define SVNREV 0x1480 +#define SVNREPUUID "3c1eb747d1930d6d38030a5a607f72d3b58a7a21" +//#define SVNREV 0x1549 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x1480 -#define SVNDATE 0x20170817 +#define SVNREV 0x1549 +#define SVNDATE 0x20170830 // diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 515aa3a61..44e15b469 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -615,7 +615,7 @@ int getModule(sls_detector_module *myMod){ //copy to local copy as well if (detectorModules) - copyModule(myMod,detectorModules); + copyModule(detectorModules,myMod); else return FAIL; return OK; diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList_virtual.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList_virtual.c new file mode 100644 index 000000000..4646182e7 --- /dev/null +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList_virtual.c @@ -0,0 +1,999 @@ +#ifdef SLS_DETECTOR_FUNCTION_LIST + + +#include +#include +#include //usleep +#include +#include + +#include "slsDetectorFunctionList.h" + + +int default_tau_from_file= -1; + +#define BEB_NUM 34 + +enum detectorSettings thisSettings; +const char* dac_names[16] = {"SvP","Vtr","Vrf","Vrs","SvN","Vtgstv","Vcmp_ll","Vcmp_lr","cal","Vcmp_rl","rxb_rb","rxb_lb","Vcmp_rr","Vcp","Vcn","Vis"}; + +enum{E_PARALLEL, E_NON_PARALLEL, E_SAFE}; + +sls_detector_module *detectorModules=NULL; +int *detectorChips=NULL; +int *detectorChans=NULL; +dacs_t *detectorDacs=NULL; +dacs_t *detectorAdcs=NULL; + +int eiger_highvoltage = 0; +int eiger_theo_highvoltage = 0; +int eiger_iodelay = 0; +int eiger_photonenergy = 0; +int eiger_dynamicrange = 0; +int eiger_readoutmode = 0; +int eiger_storeinmem = 0; +int eiger_readoutspeed = 0; +int eiger_triggermode = 0; +int eiger_extgating = 0; +int eiger_extgatingpolarity = 0; + + +int eiger_nexposures = 1; +int eiger_ncycles = 1; + +//values for virtual server +double eiger_virtual_exptime = 0; +int64_t eiger_virtual_subexptime = 0; +double eiger_virtual_period = 0; +int eiger_virtual_counter_bit=1; +int eiger_virtual_ratecorrection_variable=0; +int64_t eiger_virtual_ratetable_tau_in_ns=-1; +int64_t eiger_virtual_ratetable_period_in_ns=-1; +int eiger_virtual_transmission_delay_left=0; +int eiger_virtual_transmission_delay_right=0; +int eiger_virtual_transmission_delay_frame=0; +int eiger_virtual_transmission_flowcontrol_10g=0; +int eiger_virtual_status=0; +pthread_t eiger_virtual_tid; + +int send_to_ten_gig = 0; +int ndsts_in_use=32; +unsigned int nimages_per_request=1; +int on_dst=0; +int dst_requested[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + + +int default_gain_values[3] = {517000,517000,517000}; +int default_offset_values[3] = {3851000,3851000,3851000}; + + +enum masterFlags masterMode=IS_SLAVE; +int top = 0; +int master = 0; +int normal = 0; + + + + + +/* basic tests */ + +void checkFirmwareCompatibility(){ + cprintf(BLUE,"\n\n" + "********************************************************\n" + "***************** EIGER Virtual Server *****************\n" + "********************************************************\n"); +} + + + + + +/* Ids */ + +int64_t getDetectorId(enum idMode arg){ + return 0; +} + +u_int64_t getFirmwareVersion() { + return 0; +} + + + +u_int32_t getDetectorNumber(){ + return 0; +} + + +u_int64_t getDetectorMAC() { + return 0; +} + + +u_int32_t getDetectorIP(){ + return 0; +} + + + + + +/* initialization */ + +void initControlServer(){ + getModuleConfiguration(); + setupDetector(); + printf("\n"); +} + +void initStopServer(){ + getModuleConfiguration(); + printf("\n"); +} + + +void getModuleConfiguration(){ +#ifdef VIRTUAL_MASTER + master = 1; + top = 1; +#else + master = 0; + top = 1; +#endif +#ifdef VIRTUAL_9M + normal = 0; +#else + normal = 1; +#endif + if(top) printf("*************** TOP ***************\n"); + else printf("*************** BOTTOM ***************\n"); + if(master) printf("*************** MASTER ***************\n"); + else printf("*************** SLAVE ***************\n"); + if(normal) printf("*************** NORMAL ***************\n"); + else printf("*************** SPECIAL ***************\n"); +} + + + +/* set up detector */ + +void allocateDetectorStructureMemory(){ + printf("This Server is for 1 Eiger half module (250k)\n"); + + //Allocation of memory + detectorModules=malloc(sizeof(sls_detector_module)); + detectorChips=malloc(NCHIP*sizeof(int)); + detectorChans=malloc(NCHIP*NCHAN*sizeof(int)); + detectorDacs=malloc(NDAC*sizeof(dacs_t)); + detectorAdcs=malloc(NADC*sizeof(dacs_t)); +#ifdef VERBOSE + printf("modules from 0x%x to 0x%x\n",detectorModules, detectorModules+n); + printf("chips from 0x%x to 0x%x\n",detectorChips, detectorChips+n*NCHIP); + printf("chans from 0x%x to 0x%x\n",detectorChans, detectorChans+n*NCHIP*NCHAN); + printf("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs+n*NDAC); + printf("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs+n*NADC); +#endif + (detectorModules)->dacs=detectorDacs; + (detectorModules)->adcs=detectorAdcs; + (detectorModules)->chipregs=detectorChips; + (detectorModules)->chanregs=detectorChans; + (detectorModules)->ndac=NDAC; + (detectorModules)->nadc=NADC; + (detectorModules)->nchip=NCHIP; + (detectorModules)->nchan=NCHIP*NCHAN; + (detectorModules)->module=0; + (detectorModules)->gain=0; + (detectorModules)->offset=0; + (detectorModules)->reg=0; + thisSettings = UNINITIALIZED; + + // if trimval requested, should return -1 to acknowledge unknown + int ichan=0; + for (ichan=0; ichan<(detectorModules->nchan); ichan++) { + *((detectorModules->chanregs)+ichan) = -1; + } +} + + + +void setupDetector() { + + allocateDetectorStructureMemory(); + //set dacs + printf("Setting Default Dac values\n"); + { + int i = 0; + int retval[2]={-1,-1}; + const int defaultvals[NDAC] = DEFAULT_DAC_VALS; + for(i = 0; i < NDAC; ++i) { + setDAC((enum DACINDEX)i,defaultvals[i],0,0,retval); + if (retval[0] != defaultvals[i]) + cprintf(RED, "Warning: Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval[0]); + } + } + + //setting default measurement parameters + setTimer(FRAME_NUMBER, DEFAULT_NUM_FRAMES); + setTimer(ACQUISITION_TIME, DEFAULT_EXPTIME); + setTimer(SUBFRAME_ACQUISITION_TIME, DEFAULT_SUBFRAME_EXPOSURE_VAL); + setTimer(FRAME_PERIOD, DEFAULT_PERIOD); + setDynamicRange(DEFAULT_DYNAMIC_RANGE); + eiger_photonenergy = DEFAULT_PHOTON_ENERGY; + setReadOutFlags(DEFAULT_READOUT_FLAG); + setSpeed(CLOCK_DIVIDER, DEFAULT_CLK_SPEED);//clk_devider,half speed + setIODelay(DEFAULT_IO_DELAY, DEFAULT_MOD_INDEX); + setTiming(DEFAULT_TIMING_MODE); + //SetPhotonEnergyCalibrationParameters(-5.8381e-5,1.838515,5.09948e-7,-4.32390e-11,1.32527e-15); + setRateCorrection(DEFAULT_RATE_CORRECTION); + int enable[2] = {DEFAULT_EXT_GATING_ENABLE, DEFAULT_EXT_GATING_POLARITY}; + setExternalGating(enable);//disable external gating + setHighVoltage(DEFAULT_HIGH_VOLTAGE); +} + + + + +/* advanced read/write reg */ +uint32_t writeRegister(uint32_t offset, uint32_t data) { + return 0; +} + +uint32_t readRegister(uint32_t offset) { + return 0; +} + + +/* set parameters - nmod, dr, roi */ + +int setNMod(int nm, enum dimension dim){ + return NMOD; +} + + +int getNModBoard(enum dimension arg){ + return NMAXMOD; +} + +int setDynamicRange(int dr){ + if(dr > 0){ + printf(" Setting dynamic range: %d\n",dr); + eiger_dynamicrange = dr; + } + return eiger_dynamicrange; +} + + + + +/* parameters - readout */ + +int setSpeed(enum speedVariable arg, int val){ + + if (arg != CLOCK_DIVIDER) + return -1; + + if(val != -1){ + printf(" Setting Read out Speed: %d\n",val); + eiger_readoutspeed = val; + } + return eiger_readoutspeed; +} + + +enum readOutFlags setReadOutFlags(enum readOutFlags val){ + + enum readOutFlags retval = GET_READOUT_FLAGS; + if(val!=GET_READOUT_FLAGS){ + + + if(val&0xF0000){ + switch(val){ + case PARALLEL: val=E_PARALLEL; printf(" Setting Read out Flag: Parallel\n"); break; + case NONPARALLEL: val=E_NON_PARALLEL; printf(" Setting Read out Flag: Non Parallel\n"); break; + case SAFE: val=E_SAFE; printf(" Setting Read out Flag: Safe\n"); break; + + default: + cprintf(RED,"Cannot set unknown readout flag. 0x%x\n", val); + return -1; + } + printf(" Setting Read out Flag: %d\n",val); + eiger_readoutmode = val; + }else{ + switch(val){ + case STORE_IN_RAM: val=1; printf(" Setting Read out Flag: Store in Ram\n"); break; + case CONTINOUS_RO: val=0; printf(" Setting Read out Flag: Continuous Readout\n"); break; + + default: + cprintf(RED,"Cannot set unknown readout flag. 0x%x\n", val); + return -1; + } + printf(" Setting store in ram variable: %d\n",val); + eiger_storeinmem = val; + + } + } + + switch(eiger_readoutmode){ + case E_PARALLEL: retval=PARALLEL; break; + case E_NON_PARALLEL: retval=NONPARALLEL; break; + case E_SAFE: retval=SAFE; break; + } + + switch(eiger_storeinmem){ + case 0: retval|=CONTINOUS_RO; break; + case 1: retval|=STORE_IN_RAM; break; + } + printf("Read out Flag: 0x%x\n",retval); + return retval; +} + + + + + + + + +/* parameters - timer */ + +int64_t setTimer(enum timerIndex ind, int64_t val){ + + switch(ind){ + case FRAME_NUMBER: + if(val >= 0){ + printf(" Setting number of frames: %d * %d\n",(unsigned int)val,eiger_ncycles); + eiger_nexposures = val; + nimages_per_request = eiger_nexposures * eiger_ncycles; + }return eiger_nexposures; + + case ACQUISITION_TIME: + if(val >= 0){ + printf(" Setting exp time: %fs\n",val/(1E9)); + eiger_virtual_exptime = (val/(1E9)); + } + return eiger_virtual_exptime*1e9; + + case SUBFRAME_ACQUISITION_TIME: + if(val >= 0){ + printf(" Setting sub exp time: %lldns\n",(long long int)val/10); + eiger_virtual_subexptime = (val/(10)); + } + return eiger_virtual_subexptime*10; + + case FRAME_PERIOD: + if(val >= 0){ + printf(" Setting acq period: %fs\n",val/(1E9)); + eiger_virtual_period = (val/(1E9)); + } + return eiger_virtual_period*1e9; + + case CYCLES_NUMBER: + if(val >= 0){ + printf(" Setting number of triggers: %d * %d\n",(unsigned int)val,eiger_nexposures); + eiger_ncycles = (val/(1E9)); + nimages_per_request = eiger_nexposures * eiger_ncycles; + } + return eiger_ncycles; + default: + cprintf(RED,"Warning: Timer Index not implemented for this detector: %d\n", ind); + break; + } + + return -1; +} + + + + + +/* parameters - channel, chip, module, settings */ + + +int setModule(sls_detector_module myMod, int delay){ + int retval[2]; + int i; + + //#ifdef VERBOSE + printf("Setting module with settings %d\n",myMod.reg); + //#endif + + setSettings( (enum detectorSettings)myMod.reg,-1); + + if(setIODelay(delay, -1)!= delay){ + cprintf(RED,"could not set iodelay %d\n",delay); + return FAIL; + } + + //copy module locally + if (detectorModules) + copyModule(detectorModules,&myMod); + + //set dac values + for(i=0;i= 0) + eiger_photonenergy = ev; + return getThresholdEnergy(imod); +} + + + + + +/* parameters - dac, adc, hv */ + +void setDAC(enum DACINDEX ind, int val, int imod, int mV, int retval[]){ + + if(ind == VTHRESHOLD){ + int ret[5]; + setDAC(VCMP_LL,val,imod,mV,retval); + ret[0] = retval[mV]; + setDAC(VCMP_LR,val,imod,mV,retval); + ret[1] = retval[mV]; + setDAC(VCMP_RL,val,imod,mV,retval); + ret[2] = retval[mV]; + setDAC(VCMP_RR,val,imod,mV,retval); + ret[3] = retval[mV]; + setDAC(VCP,val,imod,mV,retval); + ret[4] = retval[mV]; + + + if((ret[0]== ret[1])&& + (ret[1]==ret[2])&& + (ret[2]==ret[3]) && + (ret[3]==ret[4])) + cprintf(GREEN,"vthreshold match\n"); + else{ + retval[0] = -1;retval[1] = -1; + cprintf(RED,"vthreshold mismatch 0:%d 1:%d 2:%d 3:%d\n", + ret[0],ret[1],ret[2],ret[3]); + } + return; + } + char iname[10]; + + if(((int)ind>=0)&&((int)ind= 0) + printf("Setting dac %d: %s to %d ",ind, iname,val); + else + printf("Getting dac %d: %s ",ind, iname); + if(mV) + printf("in mV\n"); + else + printf("in dac units\n"); +#endif + + if (mV){ + retval[0] = (int)(((val-0)/(2048-0))*(4096-1) + 0.5); + retval[1] = val; + }else + retval[0] = val; + + (detectorModules)->dacs[ind] = retval[0]; +} + + + +int getADC(enum ADCINDEX ind, int imod){ + return 0; +} + + +int setHighVoltage(int val){ + if (master) { + // set + if(val!=-1){ + eiger_theo_highvoltage = val; + } + return eiger_theo_highvoltage; + } + + return SLAVE_HIGH_VOLTAGE_READ_VAL; +} + + + + + + + +/* parameters - timing, extsig */ + +enum externalCommunicationMode setTiming( enum externalCommunicationMode arg){ + enum externalCommunicationMode ret=GET_EXTERNAL_COMMUNICATION_MODE; + if(arg != GET_EXTERNAL_COMMUNICATION_MODE){ + switch((int)arg){ + case AUTO_TIMING: ret = 0; break; + case TRIGGER_EXPOSURE: ret = 2; break; + case BURST_TRIGGER: ret = 1; break; + case GATE_FIX_NUMBER: ret = 3; break; + } + printf(" Setting Triggering Mode: %d\n",(int)ret); + eiger_triggermode = ret; + } + + ret = eiger_triggermode; + switch((int)ret){ + case 0: ret = AUTO_TIMING; break; + case 2: ret = TRIGGER_EXPOSURE; break; + case 1: ret = BURST_TRIGGER; break; + case 3: ret = GATE_FIX_NUMBER; break; + default: + printf("Unknown trigger mode found %d\n",ret); + ret = 0; + } + return ret; +} + + + + + + +/* configure mac */ + +int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2, int ival) { + return 0; +} + + + + + + + +/* eiger specific - iodelay, 10g, pulse, rate, temp, activate, delay nw parameter */ + +int setIODelay(int val, int imod){ + if(val!=-1){ + printf(" Setting IO Delay: %d\n",val); + eiger_iodelay = val; + } + return eiger_iodelay; +} + + +int enableTenGigabitEthernet(int val){ + if(val!=-1){ + if(val>0) + send_to_ten_gig = 1; + else + send_to_ten_gig = 0; + //configuremac called from client + } +#ifdef VERBOSE + printf("10Gbe:%d\n",send_to_ten_gig); +#endif + return send_to_ten_gig; +} + + +int setCounterBit(int val){ + if(val!=-1){ + eiger_virtual_counter_bit = val; +#ifdef VERBOSE + printf("Counter Bit:%d\n",val); +#endif + } + return eiger_virtual_counter_bit; +} + + +int pulsePixel(int n, int x, int y){ + return OK; +} + +int pulsePixelNMove(int n, int x, int y){ + return OK; +} + +int pulseChip(int n){ + return OK; +} + +int64_t setRateCorrection(int64_t custom_tau_in_nsec){//in nanosec (will never be -1) + //deactivating rate correction + if(custom_tau_in_nsec==0){ + eiger_virtual_ratecorrection_variable = 0; + return 0; + } + + //when dynamic range changes, use old tau + else if(custom_tau_in_nsec == -1) + custom_tau_in_nsec = eiger_virtual_ratetable_tau_in_ns; + + //get period = subexptime if 32bit , else period = exptime if 16 bit + int64_t actual_period = eiger_virtual_subexptime*10; //already in nsec + if(eiger_dynamicrange == 16) + actual_period = eiger_virtual_exptime; + + int64_t ratetable_period_in_nsec = eiger_virtual_ratetable_period_in_ns; + int64_t tau_in_nsec = eiger_virtual_ratetable_tau_in_ns; + + + + //same setting + if((tau_in_nsec == custom_tau_in_nsec) && (ratetable_period_in_nsec == actual_period)){ + if(eiger_dynamicrange == 32) + printf("Rate Table already created before: Same Tau %lldns, Same subexptime %lldns\n", + (long long int)tau_in_nsec,(long long int)ratetable_period_in_nsec); + else + printf("Rate Table already created before: Same Tau %lldns, Same exptime %lldns\n", + (long long int)tau_in_nsec,(long long int)ratetable_period_in_nsec); + } + //different setting, calculate table + else{ + eiger_virtual_ratetable_tau_in_ns = custom_tau_in_nsec; + double period_in_sec = (double)(eiger_virtual_subexptime*10)/(double)1e9; + if(eiger_dynamicrange == 16) + period_in_sec = eiger_virtual_exptime; + eiger_virtual_ratetable_period_in_ns = period_in_sec*1e9; + } + //activating rate correction + eiger_virtual_ratecorrection_variable = 1; + printf("Rate Correction Value set to %lld ns\n",(long long int)eiger_virtual_ratetable_tau_in_ns); + + return eiger_virtual_ratetable_tau_in_ns; +} + +int getRateCorrectionEnable(){ + return eiger_virtual_ratecorrection_variable; +} + +int getDefaultSettingsTau_in_nsec(){ + return default_tau_from_file; +} + +void setDefaultSettingsTau_in_nsec(int t){ + default_tau_from_file = t; + printf("Default tau set to %d\n",default_tau_from_file); +} + +int64_t getCurrentTau(){ + if(!getRateCorrectionEnable()) + return 0; + else + return eiger_virtual_ratetable_tau_in_ns; +} + +void setExternalGating(int enable[]){ + if(enable>=0){ + eiger_extgating = enable[0]; + eiger_extgatingpolarity = enable[1]; + } + enable[0] = eiger_extgating; + enable[1] = eiger_extgatingpolarity; +} + +int setAllTrimbits(int val){ + int ichan; +#ifdef VERBOSE + printf("Copying register %x value %d\n",destMod->reg,val); +#endif + if (detectorModules){ + for (ichan=0; ichan<(detectorModules->nchan); ichan++) { + *((detectorModules->chanregs)+ichan)=val; + } + } + + cprintf(GREEN, "All trimbits have been set to %d\n", val); + return OK; +} + +int getAllTrimbits(){ + int ichan=0; + int value = *((detectorModules->chanregs)); + if (detectorModules){ + for (ichan=0; ichan<(detectorModules->nchan); ichan++) { + if(*((detectorModules->chanregs)+ichan) != value) { + value= -1; + break; + } + + } + } + printf("Value of all Trimbits: %d\n", value); + return value; +} + +int getBebFPGATemp(){ + return 0; +} + +int activate(int enable){ + return enable; +} + +int setNetworkParameter(enum NETWORKINDEX mode, int value){ + if (value>-1) { + switch(mode){ + case TXN_LEFT: + eiger_virtual_transmission_delay_left = value; + break; + case TXN_RIGHT: + eiger_virtual_transmission_delay_right = value; + break; + case TXN_FRAME: + eiger_virtual_transmission_delay_frame = value; + break; + case FLOWCTRL_10G: + eiger_virtual_transmission_flowcontrol_10g = value; + if(value>0) value = 1; + break; + default: cprintf(BG_RED,"Unrecognized mode in network parameter: %d\n",mode); + return -1; + } + } + switch(mode){ + case TXN_LEFT: + return eiger_virtual_transmission_delay_left; + case TXN_RIGHT: + return eiger_virtual_transmission_delay_right; + case TXN_FRAME: + return eiger_virtual_transmission_delay_frame; + case FLOWCTRL_10G: + return eiger_virtual_transmission_flowcontrol_10g; + default: cprintf(BG_RED,"Unrecognized mode in network parameter: %d\n",mode); + return -1; + } +} + + + + + + + +/* aquisition */ + + +int prepareAcquisition(){ + return OK; +} + + +int startStateMachine(){ + + if(pthread_create(&eiger_virtual_tid, NULL, &start_timer, NULL)) { + cprintf(RED,"Could not start Virtual acquisition thread\n"); + return FAIL; + } + eiger_virtual_status = 1; + cprintf(GREEN,"***Virtual Acquisition started\n"); + return OK; +} + +void* start_timer(void* arg) { + double wait_in_s = nimages_per_request * eiger_virtual_period; + cprintf(GREEN,"going to wait for %f s\n", wait_in_s); + usleep(wait_in_s * 1000 * 1000); + cprintf(GREEN,"Virtual Timer Done***\n"); + + eiger_virtual_status = 0; + return NULL; +} + +int stopStateMachine(){ + cprintf(BG_RED,"Going to stop acquisition\n"); + return OK; +} + + +int startReadOut(){ + printf("Requesting images...\n"); + return OK; +} + + +enum runStatus getRunStatus(){ + if(eiger_virtual_status== 0){ + printf("Status: IDLE\n"); + return IDLE; + }else{ + printf("Status: RUNNING...\n"); + return RUNNING; + } + //}else printf("***** not master*** \n"); + + return IDLE; +} + + + +void readFrame(int *ret, char *mess){ + while(eiger_virtual_status) { + //cprintf(RED,"Waiting for finished flag\n"); + usleep(5000); + } + *ret = (int)FINISHED; + strcpy(mess,"acquisition successfully finished\n"); +} + + + + + + + + +/* common */ + + +int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod){ + + int ichip, idac, ichan, iadc; + int ret=OK; + +#ifdef VERBOSE + printf("Copying module %x to module %x\n",srcMod,destMod); +#endif + + if (srcMod->module>=0) { +#ifdef VERBOSE + printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); +#endif + destMod->module=srcMod->module; + } + if (srcMod->serialnumber>=0){ + + destMod->serialnumber=srcMod->serialnumber; + } + //no trimbit feature + if (destMod->nchip && ((srcMod->nchip)>(destMod->nchip))) { + printf("Number of chip of source is larger than number of chips of destination\n"); + return FAIL; + } + //no trimbit feature + if (destMod->nchan && ((srcMod->nchan)>(destMod->nchan))) { + printf("Number of channels of source is larger than number of channels of destination\n"); + return FAIL; + } + if ((srcMod->ndac)>(destMod->ndac)) { + printf("Number of dacs of source is larger than number of dacs of destination\n"); + return FAIL; + } + if ((srcMod->nadc)>(destMod->nadc)) { + printf("Number of dacs of source is larger than number of dacs of destination\n"); + return FAIL; + } + +#ifdef VERBOSE + printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); + printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); + printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); + printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); + +#endif + destMod->ndac=srcMod->ndac; + destMod->nadc=srcMod->nadc; + destMod->nchip=srcMod->nchip; + destMod->nchan=srcMod->nchan; + if (srcMod->reg>=0) + destMod->reg=srcMod->reg; +#ifdef VERBOSE + printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); +#endif + if (srcMod->gain>=0) + destMod->gain=srcMod->gain; + if (srcMod->offset>=0) + destMod->offset=srcMod->offset; + + if((destMod->nchip!=0) || (destMod->nchan!=0)) { + for (ichip=0; ichip<(srcMod->nchip); ichip++) { + if (*((srcMod->chipregs)+ichip)>=0) + *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); + } + for (ichan=0; ichan<(srcMod->nchan); ichan++) { + if (*((srcMod->chanregs)+ichan)>=0) + *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); + } + } +#ifdef VERBOSE + else printf("Not Copying trimbits\n"); +#endif + for (idac=0; idac<(srcMod->ndac); idac++) { + if (*((srcMod->dacs)+idac)>=0) + *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); + } + for (iadc=0; iadc<(srcMod->nadc); iadc++) { + if (*((srcMod->adcs)+iadc)>=0) + *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); + } + return ret; +} + + +int calculateDataBytes(){ + if(send_to_ten_gig) + return setDynamicRange(-1) * ONE_GIGA_CONSTANT * TEN_GIGA_BUFFER_SIZE; + else + return setDynamicRange(-1) * TEN_GIGA_CONSTANT * ONE_GIGA_BUFFER_SIZE; +} + + +int getTotalNumberOfChannels(){return ((int)getNumberOfChannelsPerModule() * (int)getTotalNumberOfModules());} +int getTotalNumberOfChips(){return ((int)getNumberOfChipsPerModule() * (int)getTotalNumberOfModules());} +int getTotalNumberOfModules(){return NMOD;} +int getNumberOfChannelsPerModule(){return ((int)getNumberOfChannelsPerChip() * (int)getTotalNumberOfChips());} +int getNumberOfChipsPerModule(){return NCHIP;} +int getNumberOfDACsPerModule(){return NDAC;} +int getNumberOfADCsPerModule(){return NADC;} +int getNumberOfChannelsPerChip(){return NCHAN;} +int getNumberOfGainsPerModule(){return NGAIN;} +int getNumberOfOffsetsPerModule(){return NOFFSET;} + + + + + + +/* sync */ + +enum masterFlags setMaster(enum masterFlags arg){ + return NO_MASTER; +} + + + +enum synchronizationMode setSynchronization(enum synchronizationMode arg){ + return NO_SYNCHRONIZATION; +} + + + + + + + +#endif diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index 145af32fa..648dbb448 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -202,6 +202,9 @@ int setNetworkParameter(enum NETWORKINDEX mode, int value); int prepareAcquisition(); #endif int startStateMachine(); +#ifdef VIRTUAL +void* start_timer(void* arg); +#endif int stopStateMachine(); #ifndef JUNGFRAUD int startReadOut(); diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 13ed95699..cd96a92b7 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -57,6 +57,7 @@ void init_detector(int controlserver) { #ifdef VIRTUAL printf("This is a VIRTUAL detector\n"); #endif + #ifdef SLS_DETECTOR_FUNCTION_LIST if (controlserver) initControlServer(); @@ -3412,9 +3413,17 @@ int configure_mac(int file_des) { uint32_t udpport2; uint32_t detipad; sscanf(arg[0], "%x", &ipad); +#ifdef VIRTUAL + sscanf(arg[1], "%lx", &imacadd); +#else sscanf(arg[1], "%llx", &imacadd); +#endif sscanf(arg[2], "%x", &udpport); +#ifdef VIRTUAL + sscanf(arg[3], "%lx", &idetectormacadd); +#else sscanf(arg[3], "%llx", &idetectormacadd); +#endif sscanf(arg[4], "%x", &detipad); sscanf(arg[5], "%x", &udpport2); @@ -4295,7 +4304,7 @@ int set_rate_correct(int file_des) { } #ifdef SLS_DETECTOR_FUNCTION_LIST else { - printf("Setting rate correction to %lld ns\n",tau_ns); + printf("Setting rate correction to %lld ns\n",(long long int)tau_ns); //set rate //wrong bit mode if((setDynamicRange(-1)!=32) && (setDynamicRange(-1)!=16) && (tau_ns!=0)){ From 91f3db6691f47cf5cbc92d6e3e18334566814fba Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 30 Aug 2017 15:38:43 +0200 Subject: [PATCH 44/45] separated virtual master and slave executables --- .../eigerDetectorServer/Makefile.virtual | 28 ++++++++---------- ...tual => eigerDetectorServer_virtualMaster} | Bin .../bin/eigerDetectorServer_virtualSlave | Bin 0 -> 85673 bytes 3 files changed, 13 insertions(+), 15 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerVirtual => eigerDetectorServer_virtualMaster} (100%) create mode 100755 slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave diff --git a/slsDetectorSoftware/eigerDetectorServer/Makefile.virtual b/slsDetectorSoftware/eigerDetectorServer/Makefile.virtual index 24f871d3d..ceff1fc75 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Makefile.virtual +++ b/slsDetectorSoftware/eigerDetectorServer/Makefile.virtual @@ -1,30 +1,28 @@ CC = gcc CFLAGS += -Wall -DDACS_INT -DEIGERD -DSLS_DETECTOR_FUNCTION_LIST -DDACS_INT -DPCCOMPILE -DSTOP_SERVER #-DVERBOSE -CFLAGS += -DVIRTUAL -DVIRTUAL_9M -DVIRTUAL_MASTER - +CFLAGS += -DVIRTUAL -DVIRTUAL_9M +MASTERFLAG += -DVIRTUAL_MASTER LDLIBS += -lm -lstdc++ -pthread -PROGS = eigerDetectorServerVirtual DESTDIR ?= bin -INSTMODE = 0777 SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList_virtual.c -OBJS = $(SRC_CLNT:.c=.o) -all: clean $(PROGS) + +all: clean master slave -boot: $(OBJS) - - -$(PROGS): $(OBJS) -# echo $(CFLAGS) -# echo $(OBJS) +master: $(SRC_CLNT) mkdir -p $(DESTDIR) - $(CC) -o $@ $(SRC_CLNT) $(CFLAGS) $(LDLIBS) - mv $(PROGS) $(DESTDIR) + $(CC) -o eigerDetectorServer_virtualMaster $(SRC_CLNT) $(CFLAGS) $(MASTERFLAG) $(LDLIBS) + mv eigerDetectorServer_virtualMaster $(DESTDIR) + +slave: $(SRC_CLNT) + mkdir -p $(DESTDIR) + $(CC) -o eigerDetectorServer_virtualSlave $(SRC_CLNT) $(CFLAGS) $(LDLIBS) + mv eigerDetectorServer_virtualSlave $(DESTDIR) clean: - rm -rf $(DESTDIR)/$(PROGS) *.o + rm -rf $(DESTDIR)/eigerDetectorServer_virtualMaster $(DESTDIR)/eigerDetectorServer_virtualSlave *.o \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerVirtual b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster similarity index 100% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerVirtual rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave new file mode 100755 index 0000000000000000000000000000000000000000..b92f53b65548e1327a0c100839332937a370f0c2 GIT binary patch literal 85673 zcmeFadtg*W(l>k(7zqd@AP5M`pr8Sft0Ky(3CX|&ax)}cL<}LBkZ5jZW*{ixVn7)W ztZ}{Jb)N6QjtVSmjcMQWN?lu`K>uQPvC$(IhETl{h6yIYSw$oCGQh z{z-4vjb9`Cpk}2np zFDp8)thB;ib6(BVDd$Z&f1I;&+$1J{0yvSzW@hFwo>CwEk)pN-;2(`8m4EobnXm3D zu3SI=!F6E^52S*|02upqYNIE1WZxLzS$4vc{xq%DN26+((=lRe5b3R+LfQLU24(Q_2dQPKQ$gvC~ylc<#BpMwP3i+EGxHUx?o>2bGE(DxRP$uP#L{Q7Fz8U{j7J z9M#nomHB0rg$1tC$_k~Ru+UNEQVPo|oveN#XY8yjyvE^DoUZD^sufC!tFoeu{dOwO zs_N1TSFutBMwQiISPI&UF3NX03kxcWmC_1_E5E{3S*18jmsS*%DOGNllYSMJ6jVb% zNKv6U9c7L}ms0L1ccPIcr4>blQ%guw)0GgZyr2wHG7$<~irZP{aDXWUDrZ18k3JU) zm6aEiRw%{Q4u>)`J#BhQ{-kk}#$BM{7m~JP@gI3bj&&Dlo*Vj2nEbDshEYvQ!LaZX zga6V2$q!rc&wW~HPx82Vycngi%0^KRpbRQ4#R}G4DL^^Z;q(BFh02iz&TS?I6i=~X^57y=Lp0aGks>|1}M~S+8YD4}^(B;cDiOQzx^3h@KCrOvz zOUqRhyDp!6z5L16<@c7Efb(_v+LDj_#k%~yI{Fe_zJ9@~(&dxBoUH(9s3AjaYrX~L z`*it3b@VN|d>PYGajP!>bRB)0F8>T&zE77wT$g`Tmv7bOx9jpp=<=0QLUw+pF5g~v zB+fS*7Vi6yehu6Tld5Zq+Y`Ltos&i=!BGeBJAQZ)FiMwDO@CVuKcilwG))`*HN0Lgnt4{S5um%g5S#0S5um%fIoqymr$Ba->m8HL?G?}13fu#>onoQ5Hu=IzNCX@3Y{Vf=r_)VJU?W^pbL-xAEN3(O& znj7n%PEzd6yS6aUJPGTrZ#gO+tFI@Uva6Q0-A5?)^^LCBU<)&;di_tH-Sfp9B3yIH zHVCe`XTLNUTMShDCzAHHfdoqJ`n8+AE)ZkCsMR^LIDU948E0dR-D6n~qTqnNj7YUC zrz#hOGd9fw!?L`hm{ra z4I7_-t9bSxg6v-Al@;(6#4nyXVv6KiVJjw0mCj7Y4eEJS#c^`uA)QrQPPwbv%CZ2EoufZTwgr&0E2qn

=-QHH# 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 Of3wFCG$Zk>;QkNQ{f%@0 literal 0 HcmV?d00001 From 272167435d5627e3e544a5a4a4af199ee9bf9859 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Fri, 1 Sep 2017 12:04:04 +0200 Subject: [PATCH 45/45] gainplot added, masking done separately before converting to double --- .../multiSlsDetector/multiSlsDetector.cpp | 43 ++++++++++++++----- .../multiSlsDetector/multiSlsDetector.h | 13 +++++- .../slsDetectorAnalysis/detectorData.h | 6 ++- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 3652d3a80..26de3b26e 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -279,6 +279,7 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) threadpool = 0; if(createThreadPool() == FAIL) exit(-1); + gainDataEnable = false; } @@ -5436,7 +5437,7 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy){ -int multiSlsDetector::getData(const int isocket, const bool masking, int* image, const int size, +int multiSlsDetector::getData(const int isocket, int* image, const int size, uint64_t &acqIndex, uint64_t &frameIndex, uint32_t &subframeIndex, string &filename) { //fail is on parse error or end of acquisition @@ -5446,14 +5447,6 @@ int multiSlsDetector::getData(const int isocket, const bool masking, int* image, //receiving incorrect size is replaced by 0xFF zmqSocket[isocket]->ReceiveData(isocket, image, size); - //jungfrau masking adcval - if(masking){ - unsigned int snel = size/sizeof(int); - for(unsigned int i=0;inumberOfDetectors; int numSocketsPerSLSDetector = 1; bool jungfrau = false; + double* gdata = NULL; switch(getDetectorsType()){ case EIGER: numSocketsPerSLSDetector = 2; @@ -5526,6 +5520,9 @@ void multiSlsDetector::readFrameFromReceiver(){ return; } int* multiframe=new int[nel](); + int* multiframegain=NULL; + if (jungfrau) + multiframegain = new int[nel](); int nch; bool runningList[numSockets]; @@ -5552,7 +5549,7 @@ void multiSlsDetector::readFrameFromReceiver(){ //if running if (runningList[isocket]) { //get individual images - if(FAIL == getData(isocket, jungfrau, image, expectedslssize, currentAcquisitionIndex,currentFrameIndex,currentSubFrameIndex,currentFileName)){ + if(FAIL == getData(isocket, image, expectedslssize, currentAcquisitionIndex,currentFrameIndex,currentSubFrameIndex,currentFileName)){ runningList[isocket] = false; numRunning--; continue; @@ -5606,12 +5603,29 @@ void multiSlsDetector::readFrameFromReceiver(){ //send data to callback if(running){ + if (jungfrau) { + // with gain data + if (gainDataEnable) { + memcpy(multiframegain, multiframe, nel * sizeof(int)); + for(unsigned int i=0;i> 14) | ((multiframe[i] & 0x0000C000) >> 14) ; + multiframe[i] = (multiframe[i] & 0x3FFF3FFF); + } + gdata = decodeData(multiframegain,nch); + } + // without gain data + else { + for(unsigned int i=0;iexternalgui; } + + +void multiSlsDetector::setGainDataEnableinDataCallback(bool e) { + gainDataEnable = e; +} diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 258bfa933..5a1fc4139 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1457,6 +1457,13 @@ class multiSlsDetector : public slsDetectorUtils { */ bool getExternalGuiFlag(); + /** + * Set Gain Data enable for gain plot + * in data call back + * @param e enable + */ + void setGainDataEnableinDataCallback(bool e); + private: @@ -1464,7 +1471,6 @@ private: /** * Gets data from socket * @param isocket socket index - * @param masking if masking required (jungfrau) * @param image image buffer * @param size size of image * @param acqIndex address of acquisition index @@ -1472,7 +1478,7 @@ private: * @param subframeIndex address of subframe index * @param filename address of file name */ - int getData(const int isocket, const bool masking, int* image, const int size, uint64_t &acqIndex, uint64_t &frameIndex, uint32_t &subframeIndex, string &filename); + int getData(const int isocket, int* image, const int size, uint64_t &acqIndex, uint64_t &frameIndex, uint32_t &subframeIndex, string &filename); /** Ensures if sockets created successfully */ @@ -1496,6 +1502,9 @@ private: private: ThreadPool* threadpool; + /** Gain Data enabled in data call back */ + bool gainDataEnable; + }; diff --git a/slsDetectorSoftware/slsDetectorAnalysis/detectorData.h b/slsDetectorSoftware/slsDetectorAnalysis/detectorData.h index 888993fa0..f0d238b4e 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/detectorData.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/detectorData.h @@ -16,15 +16,16 @@ class detectorData { \param fname file name to which the data are saved \param np number of points in x coordinate defaults to the number of detector channels (1D detector) \param ny dimension in y (1D detector) + \param gval pointer to gain data (for jungfrau) */ - detectorData(double *val=NULL, double *err=NULL, double *ang=NULL, double p_ind=-1, const char *fname="", int np=-1, int ny=1) : values(val), errors(err), angles(ang), progressIndex(p_ind), npoints(np), npy(ny){ + detectorData(double *val=NULL, double *err=NULL, double *ang=NULL, double p_ind=-1, const char *fname="", int np=-1, int ny=1, double* gval=NULL) : values(val), errors(err), angles(ang), progressIndex(p_ind), npoints(np), npy(ny), gvalues(gval){ strcpy(fileName,fname); }; /** @short The destructor deletes also the arrays pointing to data/errors/angles if not NULL */ - ~detectorData() {if (values) delete [] values; if (errors) delete [] errors; if (angles) delete [] angles;}; + ~detectorData() {if (values) delete [] values; if (errors) delete [] errors; if (angles) delete [] angles; if (gvalues) delete [] gvalues;}; //private: double *values; /**< @short pointer to the data */ double *errors; /**< @short pointer to the errors */ @@ -33,6 +34,7 @@ class detectorData { char fileName[1000];/**< @short file name */ int npoints;/**< @short number of points */ int npy;/**< @short dimensions in y coordinate*/ + double *gvalues; /**< @short pointer to the gain data */ };