From 6bbcf6173dedde62ad820c9e6bb554fb091c5d31 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 2 Mar 2020 18:34:10 +0100 Subject: [PATCH 1/5] moench: first version --- slsDetectorGui/include/qDrawPlot.h | 2 - slsDetectorGui/src/qDetectorMain.cpp | 5 +- slsDetectorGui/src/qDrawPlot.cpp | 9 - slsDetectorGui/src/qTabDeveloper.cpp | 41 +- slsDetectorGui/src/qTabPlot.cpp | 2 - .../slsDetectorFunctionList.c | 2 +- .../slsDetectorServer_defs.h | 1 - .../slsDetectorFunctionList.c | 3 +- .../moenchDetectorServer/Makefile | 1 + .../moenchDetectorServer/RegisterDefs.h | 65 +- .../bin/moenchDetectorServer_developer | Bin 0 -> 176860 bytes .../slsDetectorFunctionList.c | 1638 ++++++++--------- .../slsDetectorServer_defs.h | 85 +- .../include/slsDetectorFunctionList.h | 21 +- .../src/slsDetectorServer_funcs.c | 121 +- slsDetectorSoftware/include/Detector.h | 221 +-- slsDetectorSoftware/src/CmdProxy.cpp | 75 +- slsDetectorSoftware/src/CmdProxy.h | 152 +- slsDetectorSoftware/src/Detector.cpp | 163 +- slsDetectorSoftware/src/DetectorImpl.cpp | 3 +- slsDetectorSoftware/src/slsDetector.cpp | 37 +- slsDetectorSoftware/src/slsDetector.h | 41 +- slsReceiverSoftware/src/ClientInterface.cpp | 2 +- slsReceiverSoftware/src/DataProcessor.cpp | 1 + slsReceiverSoftware/src/GeneralData.h | 104 +- slsSupportLib/include/sls_detector_defs.h | 5 + slsSupportLib/include/versionAPI.h | 2 +- 27 files changed, 1452 insertions(+), 1350 deletions(-) create mode 100755 slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer diff --git a/slsDetectorGui/include/qDrawPlot.h b/slsDetectorGui/include/qDrawPlot.h index 906617416..950154bae 100755 --- a/slsDetectorGui/include/qDrawPlot.h +++ b/slsDetectorGui/include/qDrawPlot.h @@ -161,8 +161,6 @@ class qDrawPlot : public QWidget, private Ui::PlotObject { unsigned int nPixelsX{0}; unsigned int nPixelsY{0}; - const static int npixelsx_jctb = 400; - int npixelsy_jctb{0}; uint32_t pixelMask{0}; uint32_t gainMask{0}; int gainOffset{0}; diff --git a/slsDetectorGui/src/qDetectorMain.cpp b/slsDetectorGui/src/qDetectorMain.cpp index 139b56729..40c6712e2 100755 --- a/slsDetectorGui/src/qDetectorMain.cpp +++ b/slsDetectorGui/src/qDetectorMain.cpp @@ -431,8 +431,7 @@ void qDetectorMain::ExecuteUtilities(QAction *action) { void qDetectorMain::ExecuteHelp(QAction *action) { if (action == actionAbout) { - FILE_LOG(logINFO) << "About Common GUI for Eiger, Gotthard, Jungfrau " - "and Moench detectors"; + FILE_LOG(logINFO) << "About Common GUI for Jungfrau, Eiger, Mythen3, Gotthard, Gotthard2 and Moench detectors"; std::string guiVersion = std::to_string(APIGUI); std::string clientVersion = "unknown"; @@ -449,7 +448,7 @@ void qDetectorMain::ExecuteHelp(QAction *action) { clientVersion + "

" "Common GUI to control the SLS Detectors: " - "Eiger, Jungfrau, Mythen3, Gotthard, Gotthard2 and Moench.

" + "Jungfrau, Eiger, Mythen3, Gotthard, Gotthard2 and Moench.

" "It can be operated in parallel with the command " "line interface:
" "sls_detector_put,
sls_detector_get,
sls_" diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index 6f4b8934d..50c38f28b 100755 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -60,7 +60,6 @@ void qDrawPlot::SetupWidgetWindow() { detType = det->getDetectorType().squash(); switch (detType) { case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::MOENCH: pixelMask = ((1 << 14) - 1); gainMask = (3 << 14); gainOffset = 14; @@ -111,13 +110,6 @@ void qDrawPlot::SetupPlots() { nPixelsX = res.x; nPixelsY = res.y; switch(detType) { - case slsDetectorDefs::MOENCH: - try{ - npixelsy_jctb = (det->getNumberOfAnalogSamples().tsquash("Inconsistent values for number of analog samples") * 2)/25;// for moench 03 - nPixelsX = npixelsx_jctb; - nPixelsY = npixelsy_jctb; - } CATCH_DISPLAY ("Could not get number of analog samples.", "qDrawPlot::SetupPlots") - break; case slsDetectorDefs::EIGER: try{ if (det->getQuad().tsquash("Inconsistent values for quad type")) { @@ -984,7 +976,6 @@ void qDrawPlot::toDoublePixelData(double *dest, char *source, int size, int data case 16: if (detType == slsDetectorDefs::JUNGFRAU || - detType == slsDetectorDefs::MOENCH || detType == slsDetectorDefs::GOTTHARD2) { // show gain plot diff --git a/slsDetectorGui/src/qTabDeveloper.cpp b/slsDetectorGui/src/qTabDeveloper.cpp index 1fe5c5332..d82312a4f 100755 --- a/slsDetectorGui/src/qTabDeveloper.cpp +++ b/slsDetectorGui/src/qTabDeveloper.cpp @@ -82,14 +82,14 @@ void qTabDeveloper::SetupWidgetWindow() { case slsDetectorDefs::MOENCH: lblSpinHV->show(); spinHV->show(); - dacWidgets.push_back(new qDacWidget(this, det, true, "v Dac 0: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget(this, det, true, "v Dac 1: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget(this, det, true, "v Dac 2: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget(this, det, true, "v Dac 3: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget(this, det, true, "v Dac 4: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget(this, det, true, "v Dac 5: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget(this, det, true, "v Dac 6: ", getSLSIndex(detType, tempid++))); - dacWidgets.push_back(new qDacWidget(this, det, true, "i Dac 7: ", getSLSIndex(detType, tempid++))); + dacWidgets.push_back(new qDacWidget(this, det, true, "vbp_colbuf: ", getSLSIndex(detType, tempid++))); + dacWidgets.push_back(new qDacWidget(this, det, true, "vipre: ", getSLSIndex(detType, tempid++))); + dacWidgets.push_back(new qDacWidget(this, det, true, "vin_cm: ", getSLSIndex(detType, tempid++))); + dacWidgets.push_back(new qDacWidget(this, det, true, "vb_sda: ", getSLSIndex(detType, tempid++))); + dacWidgets.push_back(new qDacWidget(this, det, true, "vcasc_sfp: ", getSLSIndex(detType, tempid++))); + dacWidgets.push_back(new qDacWidget(this, det, true, "vout_cm: ", getSLSIndex(detType, tempid++))); + dacWidgets.push_back(new qDacWidget(this, det, true, "vipre_cds: ", getSLSIndex(detType, tempid++))); + dacWidgets.push_back(new qDacWidget(this, det, true, "ibias_sfp: ", getSLSIndex(detType, tempid++))); break; case slsDetectorDefs::MYTHEN3: @@ -343,10 +343,27 @@ slsDetectorDefs::dacIndex qTabDeveloper::getSLSIndex(slsDetectorDefs::detectorTy break; case slsDetectorDefs::MOENCH: - if (index >= 0 && index < (int)dacWidgets.size()) { - return (slsDetectorDefs::dacIndex)index; - } - throw sls::RuntimeError(std::string("Unknown dac/adc index") + std::to_string(index)); + switch (index) { + case 0: + return slsDetectorDefs::VBP_COLBUF; + case 1: + return slsDetectorDefs::VIPRE; + case 2: + return slsDetectorDefs::VIN_CM; + case 3: + return slsDetectorDefs::VB_SDA; + case 4: + return slsDetectorDefs::VCASC_SFP; + case 5: + return slsDetectorDefs::VOUT_CM; + case 6: + return slsDetectorDefs::VIPRE_CDS; + case 7: + return slsDetectorDefs::IBIAS_SFP; + default: + throw sls::RuntimeError(std::string("Unknown dac/adc index") + std::to_string(index)); + } + break; case slsDetectorDefs::MYTHEN3: switch (index) { diff --git a/slsDetectorGui/src/qTabPlot.cpp b/slsDetectorGui/src/qTabPlot.cpp index 4fbea4210..83703e364 100755 --- a/slsDetectorGui/src/qTabPlot.cpp +++ b/slsDetectorGui/src/qTabPlot.cpp @@ -72,7 +72,6 @@ void qTabPlot::SetupWidgetWindow() { chkGapPixels->setEnabled(true); break; case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::MOENCH: chkGainPlot->setEnabled(true); chkGainPlot->setChecked(true); plot->EnableGainPlot(true); @@ -585,7 +584,6 @@ void qTabPlot::Refresh() { GetGapPixels(); break; case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::MOENCH: chkGainPlot->setEnabled(true); break; case slsDetectorDefs::GOTTHARD2: diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 368e3f8ab..1957d7df3 100755 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -515,7 +515,7 @@ void setupDetector() { // altera pll ALTERA_PLL_SetDefines(PLL_CNTRL_REG, PLL_PARAM_REG, PLL_CNTRL_RCNFG_PRMTR_RST_MSK, PLL_CNTRL_WR_PRMTR_MSK, PLL_CNTRL_PLL_RST_MSK, PLL_CNTRL_ADDR_MSK, PLL_CNTRL_ADDR_OFST); - bus_w(ADC_PORT_INVERT_REG, 0);// depends on chip + setADCInvertRegister(0);// depends on chip FILE_LOG(logINFOBLUE, ("Setting Default parameters\n")); cleanFifos(); // FIXME: why twice? diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h index dd26567da..0db56c528 100755 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h @@ -107,7 +107,6 @@ enum CLKINDEX {RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS}; #define BIT32_MSK (0xFFFFFFFF) #define BIT16_MASK (0xFFFF) -#define ADC_PORT_INVERT_VAL (0x453b2593) #define MAXIMUM_ADC_CLK (65) #define PLL_VCO_FREQ_MHZ (800) diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index 6c628adfb..79d3841ba 100755 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -1,7 +1,7 @@ #include "slsDetectorFunctionList.h" #include "versionAPI.h" #include "clogger.h" -#include + #include "AD9257.h" // commonServerFunctions.h, blackfin.h, ansi.h #include "LTC2620.h" // dacs #include "MAX1932.h" // hv @@ -14,6 +14,7 @@ #include #include // usleep +#include #ifdef VIRTUAL #include #include diff --git a/slsDetectorServers/moenchDetectorServer/Makefile b/slsDetectorServers/moenchDetectorServer/Makefile index 00d7f828e..5285f2ea2 100755 --- a/slsDetectorServers/moenchDetectorServer/Makefile +++ b/slsDetectorServers/moenchDetectorServer/Makefile @@ -34,6 +34,7 @@ $(PROGS): $(OBJS) mv $(PROGS) $(DESTDIR) rm *.gdb rm $(main_src)*.o + rm *.o clean: rm -rf $(DESTDIR)/$(PROGS) *.o *.gdb $(main_src)*.o diff --git a/slsDetectorServers/moenchDetectorServer/RegisterDefs.h b/slsDetectorServers/moenchDetectorServer/RegisterDefs.h index 83b9f3c0e..ca8263056 100755 --- a/slsDetectorServers/moenchDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/moenchDetectorServer/RegisterDefs.h @@ -16,7 +16,7 @@ /* Fix pattern RO register */ #define FIX_PATT_REG (0x01 << MEM_MAP_SHIFT) -#define FIX_PATT_VAL (0xACDC2014) +#define FIX_PATT_VAL (0xACDC2016) /* Status RO register */ #define STATUS_REG (0x02 << MEM_MAP_SHIFT) @@ -289,7 +289,7 @@ /* Configuration RW register */ #define CONFIG_REG (0x4D << MEM_MAP_SHIFT) -#define CONFIG_LED_DSBL_OFST (0) +#define CONFIG_LED_DSBL_OFST (0) // Not used in firmware or software #define CONFIG_LED_DSBL_MSK (0x00000001 << CONFIG_LED_DSBL_OFST) #define CONFIG_DSBL_ANLG_OTPT_OFST (8) #define CONFIG_DSBL_ANLG_OTPT_MSK (0x00000001 << CONFIG_DSBL_ANLG_OTPT_OFST) @@ -365,23 +365,23 @@ #define PATTERN_CNTRL_RD_OFST (1) #define PATTERN_CNTRL_RD_MSK (0x00000001 << PATTERN_CNTRL_RD_OFST) #define PATTERN_CNTRL_ADDR_OFST (16) -#define PATTERN_CNTRL_ADDR_MSK (0x0000FFFF << PATTERN_CNTRL_ADDR_OFST) +#define PATTERN_CNTRL_ADDR_MSK (0x00001FFF << PATTERN_CNTRL_ADDR_OFST) /* Pattern Limit RW regiser */ #define PATTERN_LIMIT_REG (0x53 << MEM_MAP_SHIFT) #define PATTERN_LIMIT_STRT_OFST (0) -#define PATTERN_LIMIT_STRT_MSK (0x0000FFFF << PATTERN_LIMIT_STRT_OFST) +#define PATTERN_LIMIT_STRT_MSK (0x00001FFF << PATTERN_LIMIT_STRT_OFST) #define PATTERN_LIMIT_STP_OFST (16) -#define PATTERN_LIMIT_STP_MSK (0x0000FFFF << PATTERN_LIMIT_STP_OFST) +#define PATTERN_LIMIT_STP_MSK (0x00001FFF << PATTERN_LIMIT_STP_OFST) /* Pattern Loop 0 Address RW regiser */ #define PATTERN_LOOP_0_ADDR_REG (0x54 << MEM_MAP_SHIFT) #define PATTERN_LOOP_0_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_0_ADDR_STRT_MSK (0x0000FFFF << PATTERN_LOOP_0_ADDR_STRT_OFST) +#define PATTERN_LOOP_0_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_0_ADDR_STRT_OFST) #define PATTERN_LOOP_0_ADDR_STP_OFST (16) -#define PATTERN_LOOP_0_ADDR_STP_MSK (0x0000FFFF << PATTERN_LOOP_0_ADDR_STP_OFST) +#define PATTERN_LOOP_0_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_0_ADDR_STP_OFST) /* Pattern Loop 0 Iteration RW regiser */ #define PATTERN_LOOP_0_ITERATION_REG (0x55 << MEM_MAP_SHIFT) @@ -390,9 +390,9 @@ #define PATTERN_LOOP_1_ADDR_REG (0x56 << MEM_MAP_SHIFT) #define PATTERN_LOOP_1_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_1_ADDR_STRT_MSK (0x0000FFFF << PATTERN_LOOP_1_ADDR_STRT_OFST) +#define PATTERN_LOOP_1_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_1_ADDR_STRT_OFST) #define PATTERN_LOOP_1_ADDR_STP_OFST (16) -#define PATTERN_LOOP_1_ADDR_STP_MSK (0x0000FFFF << PATTERN_LOOP_1_ADDR_STP_OFST) +#define PATTERN_LOOP_1_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_1_ADDR_STP_OFST) /* Pattern Loop 1 Iteration RW regiser */ #define PATTERN_LOOP_1_ITERATION_REG (0x57 << MEM_MAP_SHIFT) @@ -401,9 +401,9 @@ #define PATTERN_LOOP_2_ADDR_REG (0x58 << MEM_MAP_SHIFT) #define PATTERN_LOOP_2_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_2_ADDR_STRT_MSK (0x0000FFFF << PATTERN_LOOP_2_ADDR_STRT_OFST) +#define PATTERN_LOOP_2_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_2_ADDR_STRT_OFST) #define PATTERN_LOOP_2_ADDR_STP_OFST (16) -#define PATTERN_LOOP_2_ADDR_STP_MSK (0x0000FFFF << PATTERN_LOOP_2_ADDR_STP_OFST) +#define PATTERN_LOOP_2_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_2_ADDR_STP_OFST) /* Pattern Loop 2 Iteration RW regiser */ #define PATTERN_LOOP_2_ITERATION_REG (0x59 << MEM_MAP_SHIFT) @@ -412,31 +412,36 @@ #define PATTERN_WAIT_0_ADDR_REG (0x5A << MEM_MAP_SHIFT) #define PATTERN_WAIT_0_ADDR_OFST (0) -#define PATTERN_WAIT_0_ADDR_MSK (0x0000FFFF << PATTERN_WAIT_0_ADDR_OFST) +#define PATTERN_WAIT_0_ADDR_MSK (0x00001FFF << PATTERN_WAIT_0_ADDR_OFST) //FIXME: is mask 3FF /* Pattern Wait 1 RW regiser */ #define PATTERN_WAIT_1_ADDR_REG (0x5B << MEM_MAP_SHIFT) #define PATTERN_WAIT_1_ADDR_OFST (0) -#define PATTERN_WAIT_1_ADDR_MSK (0x0000FFFF << PATTERN_WAIT_1_ADDR_OFST) +#define PATTERN_WAIT_1_ADDR_MSK (0x00001FFF << PATTERN_WAIT_1_ADDR_OFST) /* Pattern Wait 2 RW regiser */ #define PATTERN_WAIT_2_ADDR_REG (0x5C << MEM_MAP_SHIFT) #define PATTERN_WAIT_2_ADDR_OFST (0) -#define PATTERN_WAIT_2_ADDR_MSK (0x0000FFFF << PATTERN_WAIT_2_ADDR_OFST) +#define PATTERN_WAIT_2_ADDR_MSK (0x00001FFF << PATTERN_WAIT_2_ADDR_OFST) /* Samples RW register */ #define SAMPLES_REG (0x5D << MEM_MAP_SHIFT) +#define SAMPLES_DIGITAL_OFST (0) +#define SAMPLES_DIGITAL_MSK (0x0000FFFF << SAMPLES_DIGITAL_OFST) +#define SAMPLES_ANALOG_OFST (16) +#define SAMPLES_ANALOG_MSK (0x0000FFFF << SAMPLES_ANALOG_OFST) + /** Power RW register */ #define POWER_REG (0x5E << MEM_MAP_SHIFT) -#define POWER_ENBL_VLTG_RGLTR_OFST (16) -#define POWER_ENBL_VLTG_RGLTR_MSK (0x0000001F << POWER_ENBL_VLTG_RGLTR_OFST) -#define POWER_HV_SLCT_OFST (31) -#define POWER_HV_SLCT_MSK (0x00000001 << POWER_HV_SLCT_OFST) +#define POWER_CHIP_OFST (16) +#define POWER_CHIP_MSK (0x00000001 << POWER_CHIP_OFST) +#define POWER_HV_INTERNAL_SLCT_OFST (31) +#define POWER_HV_INTERNAL_SLCT_MSK (0x00000001 << POWER_HV_INTERNAL_SLCT_OFST) /* Number of Words RW register TODO */ #define NUMBER_OF_WORDS_REG (0x5F << MEM_MAP_SHIFT) @@ -493,17 +498,16 @@ #define PATTERN_WAIT_TIMER_2_LSB_REG (0x76 << MEM_MAP_SHIFT) #define PATTERN_WAIT_TIMER_2_MSB_REG (0x77 << MEM_MAP_SHIFT) -/* ADC Disable RW register TODO */ -#define ADC_DISABLE_REG (0x78 << MEM_MAP_SHIFT) +/* Readout enable RW register */ +#define READOUT_10G_ENABLE_REG (0x79 << MEM_MAP_SHIFT) -/* DAC Value RW register TODO */ -//#define DAC_VALUE_REG (0x79 << MEM_MAP_SHIFT) - -/* DAC Number RW register TODO */ -//#define DAC_NUMBER_REG (0x7A << MEM_MAP_SHIFT) +#define READOUT_10G_ENABLE_ANLG_OFST (0) +#define READOUT_10G_ENABLE_ANLG_MSK (0x000000FF << READOUT_10G_ENABLE_ANLG_OFST) +#define READOUT_10G_ENABLE_DGTL_OFST (8) +#define READOUT_10G_ENABLE_DGTL_MSK (0x00000001 << READOUT_10G_ENABLE_DGTL_OFST) /* Digital Bit External Trigger RW register */ -#define DBIT_EXT_TRG_REG (0x7B << MEM_MAP_SHIFT) +#define DBIT_EXT_TRG_REG (0x7B << MEM_MAP_SHIFT) // Not used in firmware or software #define DBIT_EXT_TRG_SRC_OFST (0) #define DBIT_EXT_TRG_SRC_MSK (0x0000003F << DBIT_EXT_TRG_SRC_OFST) @@ -511,7 +515,8 @@ #define DBIT_EXT_TRG_OPRTN_MD_MSK (0x00000001 << DBIT_EXT_TRG_OPRTN_MD_OFST) /* Pin Delay 0 RW register */ -#define OUTPUT_DELAY_0_REG (0x7C << MEM_MAP_SHIFT) +#define OUTPUT_DELAY_0_REG (0x7C << MEM_MAP_SHIFT) // Not used in firmware or software + #define OUTPUT_DELAY_0_OTPT_STTNG_STEPS (25) #define OUTPUT_DELAY_0_OTPT_STTNG_OFST (0) //t = OTPT_STTNG * 25 ps, max for Cyclone V = 775 ps #define OUTPUT_DELAY_0_OTPT_STTNG_MSK (0x0000001F << OUTPUT_DELAY_0_OTPT_STTNG_OFST) @@ -523,7 +528,7 @@ /* Pin Delay 1 RW register * Each bit configured as enable for dynamic output delay configuration */ -#define PIN_DELAY_1_REG (0x7D << MEM_MAP_SHIFT) +#define PIN_DELAY_1_REG (0x7D << MEM_MAP_SHIFT) // Not used in firmware or software /** Pattern Mask 64 bit RW regiser */ #define PATTERN_MASK_LSB_REG (0x80 << MEM_MAP_SHIFT) @@ -533,7 +538,7 @@ #define PATTERN_SET_LSB_REG (0x82 << MEM_MAP_SHIFT) #define PATTERN_SET_MSB_REG (0x83 << MEM_MAP_SHIFT) - - +/* Round Robin */ +#define RXR_ENDPOINT_START_REG (0x1000 << MEM_MAP_SHIFT) diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer new file mode 100755 index 0000000000000000000000000000000000000000..5f32a8451989eba90a1abff25f0c7450ccd81171 GIT binary patch literal 176860 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 z z9J~yBbuGSHwD?-M1#Z{1gmlpomcUhT4O|a5>e|!gqCLG@*Ao3jOALln;dEU~4-hSV z3Y-oj;0D+NNk{rNcullt+;#04Z#W9Z!*o~x%OLT8X0xtkke-ZExCU0it*{f`5N*Dj zt`%Mttq6aLM#C|>RuUvyNeDzACG#Nulr+Pm@T9Jl`iNFK8WLV9@0X7eZ8>@=KO_A2jR zT@5RBjbBsJ8cAPcF(iHb>bKU!b5lOV|JMRUdu41t75nd?x#FWq&$)SMC>JEFFla* zL;j|t-}D8r0d9oogSJsiC;y&tqx?_~oc$0GENqHiiBHWjEQ!cJh-^Nld{3#EFyB2rrE{V3Tm-0Y8s&6IVb@JT{ zX25*d4$(&gdTu};uZB<#!r%f({d~0xl5dUp*GPUg_P}eD2g*rP7Np!Z;qPm~l!xh% zdiYugK*XBA%Id47n5v8NluT{oL9BWNo}&{n$9yt$2l2jC%HhA>ng5(pPS z#+E}cAA-5g*i)YYX@hmzVEq#8;cPedhhl%|R5%Sr!#J1*(_tRWhYYQUu7WkN7B<3- zupMrNyWk#p2p)l_;2G!({d93>JJsD6#;RX+gKJ#=lK7824e9%Q$QK{- z#fS9zkY1m|@Te~LE)lu60Pco+bs6Q!?AjZW&QYXu)Dd`0m-{+J?%T!lWuC9_oWXOJ zE~A6^mAMdIJ{KtRxnP(M7r>K{KHWEpnO!WT5A~%F^(Fqk#Q*a}BA+jX4X{a<`zdGl zQ_k)Wfm3wx+s@3g6XK5_{yd0358}^*#QQmYg?kKQJrw+ZNN0`Zzaye724ExJr3T@y*yMAAEv^gfg( z@=!WF2fK9%h+`(20N21OcnBWR*$Nr<(pG^ImO#OTKI`41t z{uu91@E-e*Vt?{c-XGUxk}uWX4^j>%Q4S}ew@K)2QW>m(JK=6!9`O@-#0JsFBk1E1 z;`<2k4UEO#c>ERo)gk%$DES%W&gltH7zU?9><3{#=rX)Q_@fDb45XY*rkn-y9L#et z;RX|Ka0{ed2Y15@x;#etdyMk;*lJh_iT`87KO}^&uT6pVuo05(5Yqj{a*;2tf?MHs zT|%R2*5V-f5K2CTUV&G2`BJ0Emo`Gozl8Y|>em$N*W=iK9Q%)NfDI76K8{|W7$fq; zShxzVfj61HyXg{!-ont^6I(Ff#&asq^Wb{80g|6#o$xH|(&b4nktZqFPomE!(dUy3 zU^d(aJ9L>gO|8Dbi}128Uq=65M*q{%*L3tXeLp;?%U7<6eC38NGe)tZ;R~@h1A8;F zVIC}n@DjWRZ|D-~!53(~pfB`;0WgsFdA!fpWzjs5MH#yMqEX}* zj5~&$7HtUWiHyfyA|!tz$)Cteum|4YHn->!iMsLyRE!q#-;3OCXr^0D43dX`@ zm0_kjUn6^!i^!^7{ZMq+!(@*A>0_kjUn6^ z!i^!^7~&m6ykl<1 z7u*96!o%ZZ#aFE|2@fn#9+41`l)7>t0?FcGH01uz>Hz+$)x zu7T^|de{gz!Zx@CcEVk7KRgJJ!4vQ-?1GnI54;X<>Jsn4iAOIu8jgYEVE_z)Q{W63 z0pnpJOot2L5?BDs;VM`S*TH(&2wPzr+zvb8Ubr6~fydx!cotrOm*7=+U6;AK$XpNT z14ly}91nwF2%H9Iz*ra$(_lKxg-c*5EQgh_8rH#j*bH0YR=6GRhI`>5cm$q=r(rj| z0I$HSx+I85f)2f*5A=gJI0**9sc;&Mg0V0erok+j3yWYWTn#H>Ev$o0uo$1>;Uu5ut&9D_7fyZ>o zCcm=DuWa%shy2MQUvkKooLX21(Ps|&%$>@YU8d=hNBZ+fe;(x{uT+<%jUr1o>XPpz zl0O2*!30Qz0DqTtf`9gQFF3VSOvULs5n3rI_{1DGacqX4q$mcTBUq<>%38$2BR*>Emq_@1D zuc0^UQbE2}kgpZQyMlOE9D&DlS+z!FRh2H!Z54TLyDqCwiL5@OOBMR5LO)fPV2>`< zzI;X0PnWgRMApuL88Azinsw~Rt%sN46^Q>e_+NuwUqG)ll!F?|!3&-|d+YKd`TZjK zUAsV}HXF9Xt?(S|)@8jHzjiwUo`9!xd71M4GUdCD^wg1_x~uTIF5gNM`BpkChGn{J z2;eKkfp9gf)aBcuBHx}0dH%L~rk;MAdRmWu>(OsL>8vN6uTXwpq5L+W-v;#CG@et) z0k8-5>hjtiP9*QsWn&G$Twbfo>!km6(*HWaBl=pVRZ71CJbhrR+hnaPKQmf84{oG5ufjM!SlLoAwRZ|AKxdw-zUCXqxog>I9=XK7I`a8mmd)C9}w>! zoPpR>(Wh8J|%IaOrmG@dJYu7)S!Y0M{K9t5|-?GRnBNz2=$FY<1qE(a*92PmsQ4;1-% zur3GZ@de!sSPj>~R@kP?A#`~NUHYpU^@%!P4CR+J zyl_W44w8;T)cr#jaYvc_C1vtGp5Np7=x*HY#T{k+SUT>=gX84E!JW9Jl{cQ)MZ!`%VgUB}%`++D(55AJw=kLRPr`zY}~mXEt4 z+)c#YB<2zo%q3Ps%E&J$Bfp?b{DLy^i@k6^{t?eZ#PgRO__tG+!|3r>=M!;xDKKzP&I6|9ngf`&_`aObvkDP^F#E0~~NBWMgCq5g9PYCguqRX#|&##Hk zuhGx1(a&$nM1E7D%Wp@B{C1QsCztS5;{siN*C_J4jk^5)h{*4c>GJ**k@v$O`hFjM zpGg!sld8)Hr1JyP`62QCka(ZlEOM@0mu~#&#-BeDpFa|x3&AWOhQeyN4if$a!tYtd zuXL=zU()qH>3SbMypJBvke)N7=L7Wi0ebszKmH%Yf5JIOINjy=zY6~^;eQYQO~=1* zNO`+JdAraHui^hX{9lj1^YAwV9)l@}D-o&@^6`YlMG|@ULxzEpRK` z4)?%)@CZBx&%kq#^j;&q*KP>k!qDY!UT_5TgEkllgW)td1IEDw?APM1PM5z^9{x^w z_tc8tmBW#CT z;V!rb9)d^UDR>6@LO)&O2o#?|hUt(!9xaS-S+NJA)j{?k+(P;O*i={z*TG)M-pP<~ z)?%V`ZCE8A+o*=@Q4EWR7vLpb^T1yZ{Pn=S2kt#0AbTht$&fu1k8GF+OJO;zf;F%n zHp0!Y9d^Q9@BlmnPry@f6!g`#yOxM{7kfN+ZGqe1VR#f?gqL;A(^E80Z#W4CVa{I9 zUClhRSL0c$Yj?Yeb~k%BcaMeaIo(aV?j~J#=fWkBy_mb%qq%!K?1X3FIbHK&i^YpQ zKQH3zMSO>|w=|r+x#2tySI@+MIPo9e33ox_Kb-gvKLJm{Zg>Iq!fU$bt&8UE0Y^b! zI35PTP&gGvz-a7OVZVmwe4dMR?VfJY?zy0ABZ&71;>})<#$Jy$>bhv7ZtB{7t3Z(?uL6IT}$>CEqS7@ac)WD+>-V+^6zWp-@H=M z=2gISxBx~&{Fz7noJakf=Lc<&J?MEMum-NjeH89vc|OGR5lDLGk?!nP(X!igEhkH~ z9Q4W@S!0f@xmrE1 z=XnG6H()my&j`-HqK*Fyh{JKuKi*%x&Z1nRz(#af4``#9~ zjWYsuoDrypO|Th~Zq_oj_;Ahy5N_EO(aLV}jQ--2dA=&z3OAmKe>~;0>^jecn-a=d zn5l3xBp-7&qQ@5Y=r6KIe}z4F5BA(g=vvDZ(OM{9EeR0!JMec$BFu*Qx>iWLP)NSi zpU2&0-08UU(zRFc|CKOExUXRU75smNe0zoR`^s5Z3Mm(_m9bY3nVV`Y*l$69EyTNp zc(>fpweJ$%cjF-C?7JC+OFDPN!v!#pJzB;&!!N_D@H%_3ZtTUnLvQEpFPimx{UGX7iuO##u;N6XWXB`-e(p(2oJOOi9de$^8o%ofdABM zp>6NPV~3)1U!Yl1byi+9WG#qcC%Kqfwh_j)@T?PZmwm%6~KHe5Td{L z(cc;J{|x#6K?d`#EapL*nFqBq|7l?U)5QFP_;nM%Ka&1GlKu;%=K|@uP!3l?^6dio z_Hh^UgY(P}3YZ@h6TkDs?;?9-43K7zfRu~bl#AKhVJ9U2XOsW4nLo^C{*ZZ{b9Xmc z<0L<_$d9b8a64qYnstOV&P3KYQz7YFNcwWRSJIC;j=@%g5fbXx2vK;6ZqpHPY#@;w^jPYM2%Y=a$e7u>_zEAC5iUm6ahU>r<#z(So56%Nq;%%UrG8`lKz$C|4Q!PEYV@*tFWj%oH_^*C(aSe+_f6b=^8&o2%NoqrV7`X@SknSA zUxWF-B#8V=GHijHVGr!prE(g-N;d=6!a7L2D$nWiuK^?Sp&!YdfdN^zc1tO%XP4x zHSiIvfscaNtHWL$<+zS={4MnPE%dp8^lTtK8+O4xtbN;9`yLOMzye4)tEZgRuZESn zyfRkg6@N%NULhR~qge|d1NXpvy1eQo!nj0Ut%0?$7hcn)ae+uGGXmk?(}U zMz|4n!wamX=dqTa4@qYe>3j|Sy@vi?TLss!wl1u#>o6L|LHyf@f3Fjd*NMmL=9j=R&2d%}2_2=iePq`tOvz*F!HYw`iC$p=E> z@m=Ea-3#!NF0GiiV%}O08+E=hD)I*5yn#P&;LjVle*^cMqv$7MA?eyox;FQ~UR~bw z7J1VLM!;xDKD|jky?KMReqqhO2$n+Jwc+mH{6zlE25Vs*YyIn4^WVT4ejsc3!7vua zL-KD6`L|^atb#}2F?bT5X03lBYyFd89ju4M^ZUeeYY1!qv?4eTg#Rw#zl;Cx;{O2~`wHXXX4nqV;{o*e^CI>c zO5rZJhjn|(*+I(L!Ft%pdV47A?Ni}Fc$jr}((y~u@ymVi0PE|Otglx?{QDLDy+?fB zBR=mPfQMLD$No|5A8mro5dHi+`uX>4mZz^f=-LqG;X^_o^Q$4*konn=3jD3Z-+I^qce3tT&bsF+Nc#Rx`fg5P-IMv7 zFs~Knms&agu7bVr8vYmHe=%o-&vQojBIDnkjDL4?HVb!=VT^;fFb>|v_|TK_p*QVk z1MMgE?nC;y59#N+FEgIK!ul_IxQZVBHjnk#4Aw#M&wi2h#4gqo&$F(U$hsQqAft)* zXy%n;yjef;Vco@_b(e|Emzk$NbqO->eTsQ+!dB4|w(Hu{MWQ`j3U|Rhx|WW+blg3| z^D{hWu#S)s4i7`-+Z)D+wqY#pSuaRny&$0#GQWMAb%3YQ|1-_F!~bWt!4BM^=Zswt zJ!hcjSl-8Ofji-T;xmf)_(9eio?>2}fc_H-AbL!w!ryuLn}vU*@0kT~2`t9HeEchd zt03zL3DdA2%ku@EN#}f?=g+{Ld`}?Xm$DAA^q8)dU|tdd+ac*^+^Ci83o1a!{CdvGQm|DGk?&jv&E`YiU+&`%nATd|S#3iP;k3wH^4u0bC)l&cpg z*DtKrwU^1)m&w<rj8scUV=L~A>vYwe_`eWR{*M2psu zpldsWMB5nx(eKU-U0Zlsw1ww&jlFH{dquidkNx^)h@R@vQv>!I@?bHfd^H?_r(ril z->;^N_A2jRC4R3~>sn*7XpQ7oV*$i|(>l?b*6Ug`@0%-iZ4-Lmgx(9Ui&o^OYehbg z^uLBaUJHW}ka%wN5^dusI35P$9z8dcuI4U?J~!dM#e?+Xz6JM;541PX!y8qwjyo*G z^UYJ}ApkvuLdt1dw65);{OzG03iU~-Pm%?5VJmEdC*fJ{bX-LUW93cmR1r_c;Tq#` z?OD?IY#Lk*Nzb#Cn`hVIE*f`nFdtIy`CK_0WV&b(!ongmqz>LHiK>a2<|Yf z;|{}m?kwO$r@hoy!8M%8-^Q8z4$jtJ7ka2mJ^Q!#3LIPK=e5hy^KUJBWWi`(oT+SftyL6JL&Vpzij-= z!#(jFPCSRNha2EV*rIFhUZT0v&kQI2!?)@(o%By9{nLYB2n>VM@oxnFjly0h_I9yu zmCCx+JkmXybdP~EU<7v%=(p~}zx%>r6zf-AtY4kSeirs~xtl=xM<>7vxEi*?Hn<&j z!lUrGE)S0tdDtJu!g!bsRXUCk{xR0=2+y1Fyz$=~{~vJ^dBh!7!fJRHQqBS~55zp^ zB(#|ZdTgY}77RnNHw}B_o2`oH8n^*Az&&su z?1mR~d607PAm!r0iEt9`i1$6j`@sgDn_w$!ca8LDq-O~69YTC(oD!LFhW@gb{_-00KK!f3zv|2I3iH2u z=6{XM<8c2X?mtGqAEV#ugSH)=t7+5F~wTN#9!Zvljil5J0$rkaF_^yuCqK@H$u<3==l%DB7dMB|EUds zx8PqQ{-&}n*2%iqF2+axjE^Ql%JT=5=Wg`Yjo!M+w{G(7gQ=KLV|+n49}>2}~^b*+F;| z9@jN(zi8S)coI^+Z@mL3d?EdswuJGRH{&rMNPp!< z|1{(Z<2>4UeG=_c5S#}y;3~L=_Jn?VDE;(M8ypX#U@W9x8(Iu2A@Lnbe>t=s|L7-l z`U#zWS&xE*s}nAF(lqX*X+yVSZ#z5y55bF&e$1V5g8LXqJlu(g`&39iO&d@99e}?Z zh-U--pa&g2=%*q5lYSmvggvkq`;@C`jHiaQVSfweo|t>XMo9m!Z-gM^$5g9rhMrFB{??clR_O^zMV+?~TA-G&~2pv0sP%dhF$6uLyhBuy=#^ z@w`vOyd3jYJXi8ujr{}IKg7Pe5But)p+B4mvG+ObjjY0c4gO5WpKw?KS7S~%BMHZc z^!kuqAME*H&zJQ1lD;tk%y$A|2%N$`_*nMA{dr%*`&!JyF^|GL5c6Qn>oIS{oOq5Q zp7&3|JPh*|%r|2`5AzJnXJ8(I`Bu!g^Bl`_JkPs$-h;jM*xLZf|1sphFX{6oePh~r z-U|1?eeeW4h5OaGuY{-I8Rlo?+XLj=*ar5un_wH<0&j>mPIPS?dK!nG#*waZq-z}U z8b`e18byn1gWDnTm~&LLImdM^o^-{Nt~mUS!{2xt&*LHSjmKW>A?962m`95 zDCSGPkaT2_4(^<2+&R&nS;zbJn0sLE&Au%DWaCdZddx z6L;ia1^HJo9tPl^{CJk|D?)jm3h}Q3|0;@M1?dYSeIdH`+&0mk>tOzZy?X35knauT zd*cY^BcpWfJEZ43q^F*Is3#v@5z$`Ju~&(`8rTc3L)TP8|L3H5bgWLupF*}@h}lCfZ4h{;Vtrn zk1kI#{(6$}*OR^Qnl7B163$JbY*-HIk2U&ZtrIdXV5lN)9*};>Er9V@8so8aSOAOR z9>}8=}IA8DU8=rw!qzRFGL?H=p&^Io`+ZAbzM?D`A(2G91Hzn2%G{* zPb%q2od+`@`b$NBsg zFdk;WELaT7U^QF^n_x5C20P$>co3e1r{P6-8Qv60bJHcw2abjl;UpLar^9%d2(w@= zEQ1wr9b6BaVJqx_|Eq#K4(U42^Em$X$B+14BjJg7)@gd3j50__NJvOXNND49GDx_s zL^RS^IF4h#3kxf^^;)lW8tL5dS__@5k@{WhhP2XpjoWzPwO%Kk7iMlFt%Q`-pYP|ZzhA%4@73=n-{pHe%}@9xzlsJwi3Gt-YoS$Xj_Ef6TjhKOf|ye4NklS^k=@@J+tO_xL_P;ivqHU;93w zRlXN!HLv6KypcEYHr~#=csC#9dOpr4`7EE~D}0r2@om1(5BMoR>f=lLRE=No*7?|MJ!dG~wIyWiJxoqc)ppEdv4QZDEHe9-$;?Ps)~ zS>k2yM?HW4$@BO3Mfw$c|7n~*8|Tko^A+z~lf7?E<$NySevb29zGpw+iT!}5-Y2Je zpS+Gg;ElYG_p{fReO_PoP4g3Zj6fbE%3jYt@p|@&b^FA+eKN{pJkJaE;}`A6FL~b` zdf%PM#@}!J{Uuz=_67Fa7x>imed_u??c^?bji}s4$V2RX@&Wx1=zqZL&;hSQ2jV=y z%e)c|4yt!hy@UN6=U4nX8q}#%r%v5EUe8DQIG^QntX-XUpQXuZr1Ngx!(QJ$^ZNGL zbAA~O>b(!IPh#s@Z(Zw+Q*WGl zjcFg#KIS@Nt|O*>O#9dn53~8k%=aIQUKibFravDi;8Yx`G)jZ52@)`c_n*H51H*qs}a}S$Ov-un|pJV28Or2xu92?{D zXmC6w2#%+*`*qy?IzGXZyu{0L8rJ26bva?4C(QGN<0l+%alFOxmVS=2<1LQ=tU3sO zwwL2Pz$@|@ft*Gumva|)vw58~ub&slX%un`x3cknZv57)AZX3z29C*TWFRj-vN8~Wn`%=9x{hfa4 z@AS+bd5nE>82W#u|5w)Us~*11cjPeAv+kpvGqA` zeSTdmzfr<%+%C6~D7TTsm0ZQ@b*p#5JT92W1?zjk`d+xl_vJ8}gud$7T2N zvio@1eYxzuTz0=MyI)sAAGaiOJ{NE^x3D@_)cHogZ}j`7i@W7A&dX(7l(#69wza98>*gLd-)rU@w{CIk7WexU_xlv@=QvyExOM)wayg6& zKFIYv$V0p$j}gda)N&oW&g-u8H`Q_(ds&^|s56i!kCD$YZsKKLk;^ddZ;kugQ67`a zaD6xOcq?z?I1jMDha3JL2E!m2Oynt^;RRld1~>bH;ATHtr<>O4<_ypBJTF9p-!%lm z?_$wlNc|!8hg!H*UL#RnBZ(`yDjMAK_?E}FYPgnN|1H=5d+Ymq>pN`xVdD?)2Af&y>4E?9|pVog`|LHLvm#?r+kFC?=dTwOLAHO@U&SQ0E9G`J~<}`c0`%{~L zx3zO0_xl_|y&u&3!T3KIe{s9dIlL||?&96ighu-ujWs^!E%G^UNi?C?zEZD!qD%HK zF4@0m$adWRP7n8RZ+~{?H}+W0%hRT=Q*NU#0M-qUPGY&RG<=7 zs16gRCozQ?%wi7nSimBdu#A;3;cWyI>6PUylW-yC6nCFWHEMf`ESP2sr0z?ra5lKiv8q$%4 zY~&&j`6xgkicpLal%gCJs6-X2u@^O{MI9OtLlc_Of>yMl9UbUI7rN1dKJ+7w0SsaY z!x+IR#xRZvOkxT%n8h6Cv4BM^VHqo7!v6(`B19sRkb*R%BMaHcMIQ1|fI<|Z7$qo0 zIVwDfN921zt6lO4s zIm}}Li&(-kR>Fjr0ipPpqRH6#iVZy5zjPYYT zH=)_jt=t0su?-#QL>IczgFf^ljsXl}2*Vh`D8?|32~1)NbC|~h7O{k7tQaqf5Q#`a z3eu2{EMy}WdB{fr3Q>e&l%N#ls6ZvEP>sE)K`rXgfHt(F1D)tXH+s;Ae#9|=K@4FS zBN)XP#xa3OOkoDIn8Q34u!torV-VF6e@O`=;XD?wh$SpzC5-%4 zfG9#FA_>~BEd=f9w4x2|=s+jB(2XASp&xM!U=TxiH-{07VhrP$z$B(HgIUaB9t&8+5|*)I?g63* zk%%OuAst!BMlSM@k3tlo7$qo0IVwBBq9kZNJBcZkd0jAg^^^nlGRF9D_N~%wUX6J9)xX)kD-z;GnD`6xpKolVok%SbaAsty^ zWUV%9wOOmpT5Z;9^S8CALjz)HLNi*>iZ-;P1D#4!Yp$H`?M+0h5i#n8|8pWu{yA#rsF9;?jxlnE zFoH2mU<$KPBS-%aJ^pY8j+Gg=OpP)%%G4_}UYRy!=DZ^x>XvC=_O7jYl&Mi>9%cIP zNJAE~k&8T}hmrDHs8c=!ean}_$Vb|KRE#(`_x}M9 CuV>8w literal 0 HcmV?d00001 diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 46613a557..77513d918 100755 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -9,9 +9,7 @@ #include "MAX1932.h" // hv #include "ALTERA_PLL.h" // pll #include "blackfin.h" -#ifndef VIRTUAL -#include "programFpgaBlackfin.h" -#endif +#include "common.h" #include #include // usleep @@ -22,14 +20,15 @@ // Global variable from slsDetectorServer_funcs extern int debugflag; +extern udpStruct udpDetails; // Global variable from UDPPacketHeaderGenerator extern uint64_t udpFrameNumber; extern uint32_t udpPacketNumber; -int firmware_compatibility = OK; -int firmware_check_done = 0; -char firmware_message[MAX_STR_LENGTH]; +int initError = OK; +int initCheckDone = 0; +char initErrorMessage[MAX_STR_LENGTH]; #ifdef VIRTUAL pthread_t pthread_virtual_tid; @@ -37,70 +36,69 @@ int virtual_status = 0; int virtual_stop = 0; #endif +// 1g readout int dataBytes = 0; -char* ramValues = 0; +int analogDataBytes = 0; +int digitalDataBytes = 0; +char* analogData = 0; +char* digitalData = 0; +char volatile *analogDataPtr = 0; +char volatile *digitalDataPtr = 0; char udpPacketData[UDP_PACKET_DATA_BYTES + sizeof(sls_detector_header)]; +uint32_t adcEnableMask_1g = 0; -int32_t clkPhase[NUM_CLOCKS] = {0, 0, 0, 0}; -uint32_t clkDivider[NUM_CLOCKS] = {40, 20, 20, 200}; +// 10g readout +uint8_t adcEnableMask_10g = 0; -int dacValues[NDAC] = {0}; +int32_t clkPhase[NUM_CLOCKS] = {}; +uint32_t clkFrequency[NUM_CLOCKS] = {40, 20, 20, 200}; +int dacValues[NDAC] = {}; // software limit that depends on the current chip on the ctb int vLimit = 0; - int highvoltage = 0; -ROI rois[MAX_ROIS]; -int nROI = 0; -uint32_t adcDisableMask = 0; int nSamples = 1; -char volatile *now_ptr = 0; +int detPos[2] = {0, 0}; -// basic tests -int isFirmwareCheckDone() { - return firmware_check_done; +int isInitCheckDone() { + return initCheckDone; } -int getFirmwareCheckResult(char** mess) { - *mess = firmware_message; - return firmware_compatibility; +int getInitResult(char** mess) { + *mess = initErrorMessage; + return initError; } void basictests() { - firmware_compatibility = OK; - firmware_check_done = 0; - memset(firmware_message, 0, MAX_STR_LENGTH); + initError = OK; + initCheckDone = 0; + memset(initErrorMessage, 0, MAX_STR_LENGTH); #ifdef VIRTUAL FILE_LOG(logINFOBLUE, ("******** Moench Detector Virtual Server *****************\n")); if (mapCSP0() == FAIL) { - strcpy(firmware_message, + strcpy(initErrorMessage, "Could not map to memory. Dangerous to continue.\n"); - FILE_LOG(logERROR, (firmware_message)); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; + FILE_LOG(logERROR, (initErrorMessage)); + initError = FAIL; } - firmware_check_done = 1; return; #else defineGPIOpins(); resetFPGA(); if (mapCSP0() == FAIL) { - strcpy(firmware_message, + strcpy(initErrorMessage, "Could not map to memory. Dangerous to continue.\n"); - FILE_LOG(logERROR, ("%s\n\n", firmware_message)); - firmware_compatibility = FAIL; - firmware_check_done = 1; + FILE_LOG(logERROR, ("%s\n\n", initErrorMessage)); + initError = FAIL; return; } // does check only if flag is 0 (by default), set by command line if ((!debugflag) && ((checkType() == FAIL) || (testFpga() == FAIL) || (testBus() == FAIL))) { - strcpy(firmware_message, + strcpy(initErrorMessage, "Could not pass basic tests of FPGA and bus. Dangerous to continue.\n"); - FILE_LOG(logERROR, ("%s\n\n", firmware_message)); - firmware_compatibility = FAIL; - firmware_check_done = 1; + FILE_LOG(logERROR, ("%s\n\n", initErrorMessage)); + initError = FAIL; return; } @@ -108,14 +106,14 @@ void basictests() { uint16_t hsnumber = getHardwareSerialNumber(); uint32_t ipadd = getDetectorIP(); uint64_t macadd = getDetectorMAC(); - int64_t fwversion = getDetectorId(DETECTOR_FIRMWARE_VERSION); - int64_t swversion = getDetectorId(DETECTOR_SOFTWARE_VERSION); + int64_t fwversion = getFirmwareVersion(); + int64_t swversion = getServerVersion(); int64_t sw_fw_apiversion = 0; - int64_t client_sw_apiversion = getDetectorId(CLIENT_SOFTWARE_API_VERSION); + int64_t client_sw_apiversion = getClientServerAPIVersion(); if (fwversion >= MIN_REQRD_VRSN_T_RD_API) - sw_fw_apiversion = getDetectorId(SOFTWARE_FIRMWARE_API_VERSION); + sw_fw_apiversion = getFirmwareAPIVersion(); FILE_LOG(logINFOBLUE, ("************ Moench Detector Server *********************\n" "Hardware Version:\t\t 0x%x\n" "Hardware Serial Nr:\t\t 0x%x\n" @@ -141,7 +139,6 @@ void basictests() { // return if flag is not zero, debug mode if (debugflag) { - firmware_check_done = 1; return; } @@ -149,41 +146,37 @@ void basictests() { //cant read versions FILE_LOG(logINFO, ("Testing Firmware-software compatibility:\n")); if(!fwversion || !sw_fw_apiversion){ - strcpy(firmware_message, + strcpy(initErrorMessage, "Cant read versions from FPGA. Please update firmware.\n"); - FILE_LOG(logERROR, (firmware_message)); - firmware_compatibility = FAIL; - firmware_check_done = 1; + FILE_LOG(logERROR, (initErrorMessage)); + initError = FAIL; return; } //check for API compatibility - old server if(sw_fw_apiversion > REQRD_FRMWR_VRSN){ - sprintf(firmware_message, + sprintf(initErrorMessage, "This detector software software version (0x%llx) is incompatible.\n" "Please update detector software (min. 0x%llx) to be compatible with this firmware.\n", (long long int)sw_fw_apiversion, (long long int)REQRD_FRMWR_VRSN); - FILE_LOG(logERROR, (firmware_message)); - firmware_compatibility = FAIL; - firmware_check_done = 1; + FILE_LOG(logERROR, (initErrorMessage)); + initError = FAIL; return; } //check for firmware compatibility - old firmware if( REQRD_FRMWR_VRSN > fwversion) { - sprintf(firmware_message, + sprintf(initErrorMessage, "This firmware version (0x%llx) is incompatible.\n" "Please update firmware (min. 0x%llx) to be compatible with this server.\n", (long long int)fwversion, (long long int)REQRD_FRMWR_VRSN); - FILE_LOG(logERROR, (firmware_message)); - firmware_compatibility = FAIL; - firmware_check_done = 1; + FILE_LOG(logERROR, (initErrorMessage)); + initError = FAIL; return; } FILE_LOG(logINFO, ("\tCompatibility - success\n")); - firmware_check_done = 1; #endif } @@ -195,7 +188,7 @@ int checkType() { uint32_t expectedType = (((FPGA_VERSION_DTCTR_TYP_MOENCH_VAL) & FPGA_VERSION_DTCTR_TYP_MSK) >> FPGA_VERSION_DTCTR_TYP_OFST); if (type != expectedType) { - FILE_LOG(logERROR, ("This is not a Moench Detector Server (read %d, expected %d)\n", + FILE_LOG(logERROR, ("(Type Fail) - This is not a Moench Detector Server (read %d, expected %d)\n", type, expectedType)); return FAIL; } @@ -313,39 +306,15 @@ int testBus() { return ret; } -int detectorTest( enum digitalTestMode arg){ -#ifdef VIRTUAL - return OK; -#endif - switch(arg){ - case DETECTOR_FIRMWARE_TEST: return testFpga(); - case DETECTOR_BUS_TEST: return testBus(); - default: - FILE_LOG(logERROR, ("Test %s not implemented for this detector\n", (int)arg)); - break; - } - return OK; -} - /* Ids */ -int64_t getDetectorId(enum idMode arg){ - int64_t retval = -1; +uint64_t getServerVersion() { + return APIMOENCH; +} - switch(arg){ - case DETECTOR_SERIAL_NUMBER: - return getDetectorNumber(); - case DETECTOR_FIRMWARE_VERSION: - return getFirmwareVersion(); - case SOFTWARE_FIRMWARE_API_VERSION: - return getFirmwareAPIVersion(); - case DETECTOR_SOFTWARE_VERSION: - case CLIENT_SOFTWARE_API_VERSION: - return APIMOENCH; - default: - return retval; - } +uint64_t getClientServerAPIVersion() { + return APIMOENCH; } uint64_t getFirmwareVersion() { @@ -434,7 +403,10 @@ uint32_t getDetectorIP(){ /* initialization */ void initControlServer(){ - setupDetector(); + if (initError == OK) { + setupDetector(); + } + initCheckDone = 1; } void initStopServer() { @@ -450,139 +422,175 @@ void initStopServer() { /* set up detector */ void setupDetector() { - FILE_LOG(logINFO, ("This Server is for 1 moench board\n")); + FILE_LOG(logINFO, ("This Server is for 1 Chip Test Board module\n")); // default variables dataBytes = 0; - if (ramValues) { - free(ramValues); - ramValues = 0; + analogDataBytes = 0; + digitalDataBytes = 0; + if (analogData) { + free(analogData); + analogData = 0; } + if (digitalData) { + free(digitalData); + digitalData = 0; + } + analogDataPtr = 0; + digitalDataPtr = 0; { int i = 0; for (i = 0; i < NUM_CLOCKS; ++i) { clkPhase[i] = 0; } - clkDivider[RUN_CLK] = DEFAULT_RUN_CLK; - clkDivider[ADC_CLK] = DEFAULT_ADC_CLK; - clkDivider[SYNC_CLK] = DEFAULT_SYNC_CLK; - clkDivider[DBIT_CLK] = DEFAULT_DBIT_CLK; + clkFrequency[RUN_CLK] = DEFAULT_RUN_CLK; + clkFrequency[ADC_CLK] = DEFAULT_ADC_CLK; + clkFrequency[SYNC_CLK] = DEFAULT_SYNC_CLK; + clkFrequency[DBIT_CLK] = DEFAULT_DBIT_CLK; + // default adc phase in deg + { + int phase_shifts = 0; + ConvertToDifferentRange(0, 359, 0, getMaxPhase(ADC_CLK) - 1, DEFAULT_ADC_PHASE_DEG, &phase_shifts); + clkPhase[ADC_CLK] = phase_shifts; + } + FILE_LOG(logINFO, ("Default Run clk: %d MHz\n", clkFrequency[RUN_CLK])); + FILE_LOG(logINFO, ("Default Adc clk: %d MHz\n", clkFrequency[ADC_CLK])); + FILE_LOG(logINFO, ("Default Sync clk: %d MHz\n", clkFrequency[SYNC_CLK])); + FILE_LOG(logINFO, ("Default Dbit clk: %d MHz\n", clkFrequency[DBIT_CLK])); + FILE_LOG(logINFO, ("Default Adc Phase: %d (%d deg)\n", clkPhase[ADC_CLK], getPhase(ADC_CLK, 1))); + for (i = 0; i < NDAC; ++i) dacValues[i] = -1; } vLimit = DEFAULT_VLIMIT; highvoltage = 0; - nROI = 0; - adcDisableMask = 0; + adcEnableMask_1g = 0; + adcEnableMask_10g = 0; nSamples = 1; - now_ptr = 0; - ALTERA_PLL_ResetPLLAndReconfiguration(); - resetCore(); - resetPeripheral(); - cleanFifos(); + resetCore(); + resetPeripheral(); + cleanFifos(); // hv MAX1932_SetDefines(SPI_REG, SPI_HV_SRL_CS_OTPT_MSK, SPI_HV_SRL_CLK_OTPT_MSK, SPI_HV_SRL_DGTL_OTPT_MSK, SPI_HV_SRL_DGTL_OTPT_OFST, HIGHVOLTAGE_MIN, HIGHVOLTAGE_MAX); MAX1932_Disable(); setHighVoltage(DEFAULT_HIGH_VOLTAGE); - // adc + // power off chip + powerChip(0); + + // adcs AD9257_SetDefines(ADC_SPI_REG, ADC_SPI_SRL_CS_OTPT_MSK, ADC_SPI_SRL_CLK_OTPT_MSK, ADC_SPI_SRL_DT_OTPT_MSK, ADC_SPI_SRL_DT_OTPT_OFST); AD9257_Disable(); AD9257_Configure(); - //dac - LTC2620_SetDefines(SPI_REG, SPI_DAC_SRL_CS_OTPT_MSK, SPI_DAC_SRL_CLK_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_OFST, NDAC, DAC_MIN_MV, DAC_MAX_MV); + // dacs + LTC2620_SetDefines(SPI_REG, SPI_DAC_SRL_CS_OTPT_MSK, SPI_DAC_SRL_CLK_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_MSK, SPI_DAC_SRL_DGTL_OTPT_OFST, NDAC, DAC_MIN_MV, DAC_MAX_MV); //has to be before setvchip LTC2620_Disable(); LTC2620_Configure(); - //FIXME: - // switch off dacs (power regulators most likely only sets to minimum (if power enable on)) - FILE_LOG(logINFOBLUE, ("Powering down all dacs\n")); - { - int idac = 0; - for (idac = 0; idac < NDAC; ++idac) { - setDAC(idac, LTC2620_PWR_DOWN_VAL, 0); - } - } + setDefaultDacs(); - // altera pll - ALTERA_PLL_SetDefines(PLL_CNTRL_REG, PLL_PARAM_REG, PLL_CNTRL_RCNFG_PRMTR_RST_MSK, PLL_CNTRL_WR_PRMTR_MSK, PLL_CNTRL_PLL_RST_MSK, PLL_CNTRL_ADDR_MSK, PLL_CNTRL_ADDR_OFST); - - bus_w(ADC_PORT_INVERT_REG, ADC_PORT_INVERT_VAL);//FIXME: got from moench config file + // altera pll + ALTERA_PLL_SetDefines(PLL_CNTRL_REG, PLL_PARAM_REG, PLL_CNTRL_RCNFG_PRMTR_RST_MSK, PLL_CNTRL_WR_PRMTR_MSK, PLL_CNTRL_PLL_RST_MSK, PLL_CNTRL_ADDR_MSK, PLL_CNTRL_ADDR_OFST); + // not using setADCInvertRegister command (as it xors the default) + bus_w(ADC_PORT_INVERT_REG, ADC_PORT_INVERT_VAL); FILE_LOG(logINFOBLUE, ("Setting Default parameters\n")); cleanFifos(); // FIXME: why twice? resetCore(); - // 10 G UDP - enableTenGigabitEthernet(1); + // 1G UDP + enableTenGigabitEthernet(0); //Initialization of acquistion parameters - setTimer(SAMPLES, DEFAULT_NUM_SAMPLES); // update databytes and allocate ram - setTimer(FRAME_NUMBER, DEFAULT_NUM_FRAMES); - setTimer(ACQUISITION_TIME, DEFAULT_EXPTIME); - setTimer(TRIGGER_NUMBER, DEFAULT_NUM_CYCLES); - setTimer(FRAME_PERIOD, DEFAULT_PERIOD); - setTimer(DELAY_AFTER_TRIGGER, DEFAULT_DELAY); + setNumAnalogSamples(DEFAULT_NUM_SAMPLES); + setNumFrames(DEFAULT_NUM_FRAMES); + setExpTime(DEFAULT_EXPTIME); + setNumTriggers(DEFAULT_NUM_CYCLES); + setPeriod(DEFAULT_PERIOD); + setDelayAfterTrigger(DEFAULT_DELAY); setTiming(DEFAULT_TIMING_MODE); - - // ensuring normal readout (only option for moench) - bus_w(CONFIG_REG, bus_r(CONFIG_REG) & (~CONFIG_DSBL_ANLG_OTPT_MSK) & (~CONFIG_ENBLE_DGTL_OTPT_MSK)); - - // clear roi - { - int ret = OK, retvalsize = 0; - setROI(0, rois, &retvalsize, &ret); + setADCEnableMask(BIT32_MSK); + setADCEnableMask_10G(BIT32_MSK); + if (setAnalogOnlyReadout() == FAIL) { + strcpy(initErrorMessage, + "Could not set readout mode to analog only.\n"); + FILE_LOG(logERROR, ("%s\n\n", initErrorMessage)); + initError = FAIL; } + setPipeline(ADC_CLK, DEFAULT_PIPELINE); } -int allocateRAM() { - int oldDataBytes = dataBytes; - updateDataBytes(); +int updateDatabytesandAllocateRAM() { - // only allcoate RAM for 1 giga udp (if 10G, return) - if (enableTenGigabitEthernet(-1)) + int oldDataBytes = analogDataBytes; + updateDataBytes(); + + // update only if change in databytes + if (analogDataBytes == oldDataBytes) { + FILE_LOG(logDEBUG1, ("RAM size (Databytes:%d) already allocated. Nothing to be done.\n", dataBytes)); return OK; - - // update only if change in databytes - if (dataBytes == oldDataBytes) { - FILE_LOG(logDEBUG1, ("RAM of size %d already allocated. Nothing to be done.\n", dataBytes)); - return OK; + } + // Zero databytes + if (analogDataBytes == 0) { + FILE_LOG(logERROR, ("Can not allocate RAM for 0 bytes.\n")); + return FAIL; + } + // clear RAM + if (analogData) { + free(analogData); + analogData = 0; } - // Zero databytes - if (dataBytes <= 0) { - FILE_LOG(logERROR, ("Can not allocate RAM for 0 bytes (databytes: 0).\n")); - return FAIL; - } - // clear RAM - if (ramValues) { - free(ramValues); - ramValues = 0; - } - // allocate RAM - ramValues = malloc(dataBytes); + // allocate RAM + analogData = malloc(analogDataBytes); // cannot malloc - if (ramValues == NULL) { - FILE_LOG(logERROR, ("Can not allocate RAM for even 1 frame. " - "Probably cause: Memory Leak.\n")); + if (analogData == NULL) { + FILE_LOG(logERROR, ("Can not allocate data RAM for even 1 frame. " + "Probable cause: Memory Leak.\n")); return FAIL; } - - FILE_LOG(logINFO, ("\tRAM allocated to %d bytes\n", dataBytes)); - return OK; + FILE_LOG(logINFO, ("\tRAM allocated to %d bytes\n", analogDataBytes)); + return OK; } void updateDataBytes() { - int oldDataBytes = dataBytes; - dataBytes = NCHIP * NUM_BYTES_PER_PIXEL * nSamples; - if (dataBytes != oldDataBytes) { - FILE_LOG(logINFO, ("\tUpdating Databytes: %d\n", dataBytes)); + int nchans = 0; + analogDataBytes = 0; + + if (adcEnableMask_1g == BIT32_MSK) + nchans = 32; + else { + int ichan = 0; + for (ichan = 0; ichan < NCHAN; ++ichan) { + if (adcEnableMask_1g & (1 << ichan)) + ++nchans; + } } + analogDataBytes = nchans * (DYNAMIC_RANGE / 8) * nSamples; + FILE_LOG(logINFO, ("\t#Channels:%d, Databytes:%d\n", nchans, analogDataBytes)); + + dataBytes = analogDataBytes; } +int setDefaultDacs() { + int ret = OK; + FILE_LOG(logINFOBLUE, ("Setting Default Dac values\n")); + { + int i = 0; + const int defaultvals[NDAC] = DEFAULT_DAC_VALS; + for(i = 0; i < NDAC; ++i) { + // if not already default, set it to default + if (dacValues[i] != defaultvals[i]) { + setDAC((enum DACINDEX)i,defaultvals[i],0); + } + } + } + return ret; +} + /* firmware functions (resets) */ void cleanFifos() { @@ -613,354 +621,246 @@ void resetPeripheral() { } -/* set parameters - dr, roi */ +/* set parameters - dr, adcenablemask */ int setDynamicRange(int dr){ return DYNAMIC_RANGE; } -ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret) { - uint32_t addr = ADC_DISABLE_REG; - - // set ROI - if(n >= 0) { - // clear roi - if (!n) { - FILE_LOG(logINFO, ("Clearing ROI\n")); - adcDisableMask = 0; - } - // set roi - else { - FILE_LOG(logINFO, ("Setting ROI:\n")); - adcDisableMask = 0xffffffff; - int iroi = 0; - // for every roi - for (iroi = 0; iroi < n; ++iroi) { - FILE_LOG(logINFO, ("\t%d: (%d, %d)\n", iroi, arg[iroi].xmin, arg[iroi].xmax)); - // swap if xmin > xmax - if (arg[iroi].xmin > arg[iroi].xmax) { - int temp = arg[iroi].xmin; - arg[iroi].xmin = arg[iroi].xmax; - arg[iroi].xmax = temp; - FILE_LOG(logINFORED, ("\tCorrected %d: (%d, %d)\n", iroi, arg[iroi].xmin, arg[iroi].xmax)); - } - int ich = 0; - // for the roi specified - for (ich = arg[iroi].xmin; ich <= arg[iroi].xmax; ++ich) { - // valid channel (disable) - if (ich >= 0 && ich < NCHAN) - adcDisableMask &= ~(1 << ich); - - FILE_LOG(logDEBUG1, ("%d: ich:%d adcDisableMask:0x%08x\n", - iroi, ich, adcDisableMask)); - } - } - } - FILE_LOG(logINFO, ("\tSetting adcDisableMask to 0x%08x\n", adcDisableMask)); - bus_w(addr, adcDisableMask); +int setADCEnableMask(uint32_t mask) { + if (mask == 0u) { + FILE_LOG(logERROR, ("Cannot set 1gb adc mask to 0\n")); + return FAIL; } - - // get roi - adcDisableMask = bus_r(addr); - FILE_LOG(logDEBUG1, ("Getting adcDisableMask: 0x%08x\n", adcDisableMask)); - - nROI = 0; - if (adcDisableMask) { - int ich = 0; - // loop through channels - for (ich = 0; ich < NCHAN; ++ich) { - // channel disabled - if ((~adcDisableMask) & (1 << ich)) { - // first channel - if (ich == 0) { - ++nROI; - rois[nROI - 1].xmin = ich; - rois[nROI - 1].xmax = ich; - rois[nROI - 1].ymin = -1; - rois[nROI - 1].ymax = -1; - } - // not first channel - else { - // previous channel enabled (so increase roi) - if ((adcDisableMask) & (1 << (ich - 1))) { - ++nROI; - // max roi level - if (nROI > MAX_ROIS) { - nROI = -1; - *ret = FAIL; - FILE_LOG(logERROR, ("Max ROI reached!\n")); - break; - } - rois[nROI - 1].xmin = ich; - rois[nROI - 1].ymin = -1; - rois[nROI - 1].ymax = -1; - } - // set max as current one each time - rois[nROI - 1].xmax = ich; - } - } - } + int topAdcs = __builtin_popcount(mask & 0xF0F0F0F0); + int bottomAdcs = __builtin_popcount(mask & 0x0F0F0F0F); + if (topAdcs > 0 && bottomAdcs > 0 && topAdcs != bottomAdcs) { + FILE_LOG(logERROR, ("Invalid mask. Top and bottom number of adcs do not match\n")); + return FAIL; } - - // print - if (!nROI) { - FILE_LOG(logINFO, ("\tROI: None\n")); - } else { - FILE_LOG(logINFO, ("ROI:\n")); - int i = 0; - for (i = 0; i < nROI; ++i) { - FILE_LOG(logINFO, ("\t%d: (%d, %d)\n", i, rois[i].xmin, rois[i].xmax)); - + FILE_LOG(logINFO, ("Setting adcEnableMask 1G to 0x%08x\n", mask)); + adcEnableMask_1g = mask; + // 1Gb enabled + if (!enableTenGigabitEthernet(-1)) { + if (updateDatabytesandAllocateRAM() == FAIL) { + return FAIL; } } - - // validate and update databytes - if (n >= 0) { - // validate - if((n != 0) && ((arg[0].xmin != rois[0].xmin)|| - (arg[0].xmax != rois[0].xmax)|| - (arg[0].ymin != rois[0].ymin)|| - (arg[0].ymax != rois[0].ymax))) { - *ret = FAIL; - FILE_LOG(logERROR, ("\tCould not set given ROI\n")); - } - if(n != nROI) { - *ret = FAIL; - FILE_LOG(logERROR, ("\tCould not set or clear ROIs\n")); - } - // update databytes (now that mask is up to date from fpga) and allocate ram - if (allocateRAM() == FAIL) { - *ret = FAIL; - nROI = -2; - } - } - - *retvalsize = nROI; - return rois; -} - - -/* parameters - speed, readout */ - -void setSpeed(enum speedVariable ind, int val, int mode) { - switch(ind) { - case ADC_PHASE: - FILE_LOG(logINFOBLUE, ("Configuring ADC Phase\n")); - configurePhase(ADC_CLK, val, mode); - break; - case DBIT_PHASE: - FILE_LOG(logINFOBLUE, ("Configuring Dbit Phase\n")); - configurePhase(DBIT_CLK, val, mode); - break; - case ADC_CLOCK: - FILE_LOG(logINFOBLUE, ("Configuring ADC Clock\n")); - configureFrequency(ADC_CLK, val); - configureSyncFrequency(ADC_CLK); - break; - case DBIT_CLOCK: - FILE_LOG(logINFOBLUE, ("Configuring Dbit Clock\n")); - configureFrequency(DBIT_CLK, val); - configureSyncFrequency(DBIT_CLK); - break; - case ADC_PIPELINE: - setAdcOffsetRegister(1, val); - break; - case DBIT_PIPELINE: - setAdcOffsetRegister(0, val); - break; - case CLOCK_DIVIDER: - FILE_LOG(logINFOBLUE, ("Configuring Run Clock\n")); - configureFrequency(RUN_CLK, val); - configureSyncFrequency(RUN_CLK); - break; - default: - return; - } -} - -int getSpeed(enum speedVariable ind, int mode) { - switch(ind) { - case ADC_PHASE: - return getPhase(ADC_CLK, mode); - case DBIT_PHASE: - return getPhase(DBIT_CLK, mode); - case MAX_ADC_PHASE_SHIFT: - return getMaxPhase(ADC_CLK); - case MAX_DBIT_PHASE_SHIFT: - return getMaxPhase(DBIT_CLK); - case ADC_CLOCK: - return getFrequency(ADC_CLK); - case DBIT_CLOCK: - return getFrequency(DBIT_CLK); - case CLOCK_DIVIDER: - return getFrequency(RUN_CLK); - case ADC_PIPELINE: - return getAdcOffsetRegister(1); - case DBIT_PIPELINE: - return getAdcOffsetRegister(0); - default: - return -1; - } -} - - - -/* parameters - timer */ -int64_t setTimer(enum timerIndex ind, int64_t val) { - - int64_t retval = -1; - switch(ind){ - - case FRAME_NUMBER: - if(val >= 0) { - FILE_LOG(logINFO, ("Setting #frames: %lld\n",(long long int)val)); - } - retval = set64BitReg(val, FRAMES_LSB_REG, FRAMES_MSB_REG); - FILE_LOG(logINFO, ("\tGetting #frames: %lld\n", (long long int)retval)); - break; - - case ACQUISITION_TIME: - if(val >= 0){ - FILE_LOG(logINFO, ("Setting exptime (pattern wait time level 0): %lldns\n",(long long int)val)); - val *= (1E-3 * clkDivider[RUN_CLK]); - setPatternWaitTime(0, val); - } - retval = setPatternWaitTime(0, -1) / (1E-3 * clkDivider[RUN_CLK]); - FILE_LOG(logINFO, ("\tGetting exptime (pattern wait time level 0): %lldns\n", (long long int)retval)); - break; - - case FRAME_PERIOD: - if(val >= 0){ - FILE_LOG(logINFO, ("Setting period: %lldns\n",(long long int)val)); - val *= (1E-3 * clkDivider[SYNC_CLK]); - } - retval = set64BitReg(val, PERIOD_LSB_REG, PERIOD_MSB_REG )/ (1E-3 * clkDivider[SYNC_CLK]); - FILE_LOG(logINFO, ("\tGetting period: %lldns\n", (long long int)retval)); - break; - - case DELAY_AFTER_TRIGGER: - if(val >= 0){ - FILE_LOG(logINFO, ("Setting delay: %lldns\n", (long long int)val)); - val *= (1E-3 * clkDivider[SYNC_CLK]); - } - retval = set64BitReg(val, DELAY_LSB_REG, DELAY_MSB_REG) / (1E-3 * clkDivider[SYNC_CLK]); - FILE_LOG(logINFO, ("\tGetting delay: %lldns\n", (long long int)retval)); - break; - - case TRIGGER_NUMBER: - if(val >= 0) { - FILE_LOG(logINFO, ("Setting #triggers: %lld\n", (long long int)val)); - } - retval = set64BitReg(val, CYCLES_LSB_REG, CYCLES_MSB_REG); - FILE_LOG(logINFO, ("\tGetting #triggers: %lld\n", (long long int)retval)); - break; - - case SAMPLES: - if(val >= 0) { - FILE_LOG(logINFO, ("Setting #samples: %lld\n", (long long int)val)); - nSamples = val; - bus_w(SAMPLES_REG, val); - if (allocateRAM() == FAIL) { - return -1; - } - } - retval = nSamples; - FILE_LOG(logINFO, ("\tGetting #samples: %lld\n", (long long int)retval)); - break; - - default: - FILE_LOG(logERROR, ("Timer Index not implemented for this detector: %d\n", ind)); - break; - } - - return retval; - -} - - - -int64_t getTimeLeft(enum timerIndex ind){ -#ifdef VIRTUAL - return 0; -#endif - int64_t retval = -1; - switch(ind){ - - case FRAME_NUMBER: - retval = get64BitReg(FRAMES_LEFT_LSB_REG, FRAMES_LEFT_MSB_REG); - FILE_LOG(logINFO, ("Getting number of frames left: %lld\n",(long long int)retval)); - break; - - case FRAME_PERIOD: - retval = get64BitReg(PERIOD_LEFT_LSB_REG, PERIOD_LEFT_MSB_REG) / (1E-3 * clkDivider[SYNC_CLK]); - FILE_LOG(logINFO, ("Getting period left: %lldns\n", (long long int)retval)); - break; - - case DELAY_AFTER_TRIGGER: - retval = get64BitReg(DELAY_LEFT_LSB_REG, DELAY_LEFT_MSB_REG) / (1E-3 * clkDivider[SYNC_CLK]); - FILE_LOG(logINFO, ("Getting delay left: %lldns\n", (long long int)retval)); - break; - - case TRIGGER_NUMBER: - retval = get64BitReg(CYCLES_LEFT_LSB_REG, CYCLES_LEFT_MSB_REG); - FILE_LOG(logINFO, ("Getting number of triggers left: %lld\n", (long long int)retval)); - break; - - case ACTUAL_TIME: - retval = get64BitReg(TIME_FROM_START_LSB_REG, TIME_FROM_START_MSB_REG) / (1E-3 * CLK_FREQ); - FILE_LOG(logINFO, ("Getting actual time (time from start): %lld\n", (long long int)retval)); - break; - - case MEASUREMENT_TIME: - retval = get64BitReg(START_FRAME_TIME_LSB_REG, START_FRAME_TIME_MSB_REG) / (1E-3 * CLK_FREQ); - FILE_LOG(logINFO, ("Getting measurement time (timestamp/ start frame time): %lld\n", (long long int)retval)); - break; - - case FRAMES_FROM_START: - case FRAMES_FROM_START_PG: - retval = get64BitReg(FRAMES_FROM_START_PG_LSB_REG, FRAMES_FROM_START_PG_MSB_REG); - FILE_LOG(logINFO, ("Getting frames from start run control %lld\n", (long long int)retval)); - break; - - default: - FILE_LOG(logERROR, ("Remaining Timer index not implemented for this detector: %d\n", ind)); - break; - } - - return retval; -} - - -int validateTimer(enum timerIndex ind, int64_t val, int64_t retval) { - if (val < 0) - return OK; - switch(ind) { - case FRAME_PERIOD: - case DELAY_AFTER_TRIGGER: - // convert to freq - val *= (1E-3 * clkDivider[SYNC_CLK]); - // convert back to timer - val = (val) / (1E-3 * clkDivider[SYNC_CLK]); - if (val != retval) { - return FAIL; - } - break; - - case ACQUISITION_TIME: - // convert to freq - val *= (1E-3 * clkDivider[RUN_CLK]); - // convert back to timer - val = (val) / (1E-3 * clkDivider[RUN_CLK]); - if (val != retval) { - return FAIL; - } - break; - default: - break; - } return OK; } +uint32_t getADCEnableMask() { + return adcEnableMask_1g; +} + +void setADCEnableMask_10G(uint32_t mask) { + if (mask == 0u) { + FILE_LOG(logERROR, ("Cannot set 10gb adc mask to 0\n")); + return; + } + int topAdcs = __builtin_popcount(mask & 0xF0F0F0F0); + int bottomAdcs = __builtin_popcount(mask & 0x0F0F0F0F); + if (topAdcs > 0 && bottomAdcs > 0 && topAdcs != bottomAdcs) { + FILE_LOG(logERROR, ("Invalid mask. Top and bottom number of adcs do not match\n")); + return; + } + // convert 32 bit mask to 8 bit mask + uint8_t actualMask = 0; + if (mask != 0) { + int ival = 0; + int ich = 0; + for (ich = 0; ich < NCHAN; ich = ich + 4) { + if ((1 << ich) & mask) { + actualMask |= (1 << ival); + } + ++ival; + } + } + + FILE_LOG(logINFO, ("Setting adcEnableMask 10G to 0x%x (from 0x%08x)\n", actualMask, mask)); + adcEnableMask_10g = actualMask; + uint32_t addr = READOUT_10G_ENABLE_REG; + bus_w(addr, bus_r(addr) & (~READOUT_10G_ENABLE_ANLG_MSK)); + bus_w(addr, bus_r(addr) | ((adcEnableMask_10g << READOUT_10G_ENABLE_ANLG_OFST) & READOUT_10G_ENABLE_ANLG_MSK)); +} + +uint32_t getADCEnableMask_10G() { + adcEnableMask_10g = ((bus_r(READOUT_10G_ENABLE_REG) & READOUT_10G_ENABLE_ANLG_MSK) >> READOUT_10G_ENABLE_ANLG_OFST); + + // convert 8 bit mask to 32 bit mask + uint32_t retval = 0; + if (adcEnableMask_10g) { + int ival = 0; + int iloop = 0; + for (ival = 0; ival < 8; ++ival) { + // if bit in 8 bit mask set + if ((1 << ival) & adcEnableMask_10g) { + // set it for 4 bits in 32 bit mask + for (iloop = 0; iloop < 4; ++iloop) { + retval |= (1 << (ival * 4 + iloop)); + } + } + } + } + return retval; +} + +void setADCInvertRegister(uint32_t val) { + FILE_LOG(logINFO, ("Setting ADC Port Invert Reg to 0x%x\n", val)); + uint32_t defaultValue = ADC_PORT_INVERT_VAL; + uint32_t changeValue = defaultValue ^ val; + FILE_LOG(logINFO, ("\t default: 0x%x, final:0x%x\n", defaultValue, changeValue)); + bus_w(ADC_PORT_INVERT_REG, changeValue); +} + +uint32_t getADCInvertRegister() { + uint32_t readValue = bus_r(ADC_PORT_INVERT_REG); + int32_t defaultValue = ADC_PORT_INVERT_VAL; + uint32_t val = defaultValue ^ readValue; + FILE_LOG(logDEBUG1, ("\tread:0x%x, default:0x%x returned:0x%x\n", readValue, defaultValue, val)); + return val; +} + +/* parameters - timer */ +void setNumFrames(int64_t val) { + if (val > 0) { + FILE_LOG(logINFO, ("Setting number of frames %lld\n", (long long int)val)); + set64BitReg(val, FRAMES_LSB_REG, FRAMES_MSB_REG); + } +} + +int64_t getNumFrames() { + return get64BitReg(FRAMES_LSB_REG, FRAMES_MSB_REG); +} + +void setNumTriggers(int64_t val) { + if (val > 0) { + FILE_LOG(logINFO, ("Setting number of triggers %lld\n", (long long int)val)); + set64BitReg(val, CYCLES_LSB_REG, CYCLES_MSB_REG); + } +} + +int64_t getNumTriggers() { + return get64BitReg(CYCLES_LSB_REG, CYCLES_MSB_REG); +} + +int setNumAnalogSamples(int val) { + if (val < 0) { + FILE_LOG(logERROR, ("Invalid analog samples: %d\n", val)); + return FAIL; + } + FILE_LOG(logINFO, ("Setting number of analog samples %d\n", val)); + nSamples = val; + bus_w(SAMPLES_REG, bus_r(SAMPLES_REG) &~ SAMPLES_ANALOG_MSK); + bus_w(SAMPLES_REG, bus_r(SAMPLES_REG) | ((val << SAMPLES_ANALOG_OFST) & SAMPLES_ANALOG_MSK)); + + // 1Gb + if (!enableTenGigabitEthernet(-1)) { + if (updateDatabytesandAllocateRAM() == FAIL) { + return FAIL; + } + } + return OK; +} + +int getNumAnalogSamples() { + return nSamples; +} + +int setExpTime(int64_t val) { + if (val < 0) { + FILE_LOG(logERROR, ("Invalid exptime: %lld ns\n", (long long int)val)); + return FAIL; + } + FILE_LOG(logINFO, ("Setting exptime %lld ns\n", (long long int)val)); + val *= (1E-3 * clkFrequency[RUN_CLK]); + setPatternWaitTime(0, val); + + // validate for tolerance + int64_t retval = getExpTime(); + val /= (1E-3 * clkFrequency[RUN_CLK]); + if (val != retval) { + return FAIL; + } + return OK; +} + +int64_t getExpTime() { + return setPatternWaitTime(0, -1) / (1E-3 * clkFrequency[RUN_CLK]); +} + +int setPeriod(int64_t val) { + if (val < 0) { + FILE_LOG(logERROR, ("Invalid period: %lld ns\n", (long long int)val)); + return FAIL; + } + FILE_LOG(logINFO, ("Setting period %lld ns\n", (long long int)val)); + val *= (1E-3 * clkFrequency[SYNC_CLK]); + set64BitReg(val, PERIOD_LSB_REG, PERIOD_MSB_REG); + + // validate for tolerance + int64_t retval = getPeriod(); + val /= (1E-3 * clkFrequency[SYNC_CLK]); + if (val != retval) { + return FAIL; + } + return OK; +} + +int64_t getPeriod() { + return get64BitReg(PERIOD_LSB_REG, PERIOD_MSB_REG)/ (1E-3 * clkFrequency[SYNC_CLK]); +} + +int setDelayAfterTrigger(int64_t val) { + if (val < 0) { + FILE_LOG(logERROR, ("Invalid delay after trigger: %lld ns\n", (long long int)val)); + return FAIL; + } + FILE_LOG(logINFO, ("Setting delay after trigger %lld ns\n", (long long int)val)); + val *= (1E-3 * clkFrequency[SYNC_CLK]); + set64BitReg(val, DELAY_LSB_REG, DELAY_MSB_REG); + + // validate for tolerance + int64_t retval = getDelayAfterTrigger(); + val /= (1E-3 * clkFrequency[SYNC_CLK]); + if (val != retval) { + return FAIL; + } + return OK; +} + +int64_t getDelayAfterTrigger() { + return get64BitReg(DELAY_LSB_REG, DELAY_MSB_REG) / (1E-3 * clkFrequency[SYNC_CLK]); +} + +int64_t getNumFramesLeft() { + return get64BitReg(FRAMES_LEFT_LSB_REG, FRAMES_LEFT_MSB_REG); +} + +int64_t getNumTriggersLeft() { + return get64BitReg(CYCLES_LEFT_LSB_REG, CYCLES_LEFT_MSB_REG); +} + +int64_t getDelayAfterTriggerLeft() { + return get64BitReg(DELAY_LEFT_LSB_REG, DELAY_LEFT_MSB_REG) / (1E-3 * clkFrequency[SYNC_CLK]); +} + +int64_t getPeriodLeft() { + return get64BitReg(PERIOD_LEFT_LSB_REG, PERIOD_LEFT_MSB_REG) / (1E-3 * clkFrequency[SYNC_CLK]); +} + +int64_t getFramesFromStart() { + return get64BitReg(FRAMES_FROM_START_PG_LSB_REG, FRAMES_FROM_START_PG_MSB_REG); +} + +int64_t getActualTime() { + return get64BitReg(TIME_FROM_START_LSB_REG, TIME_FROM_START_MSB_REG) / (1E-3 * CLK_FREQ); +} + +int64_t getMeasurementTime() { + return get64BitReg(START_FRAME_TIME_LSB_REG, START_FRAME_TIME_MSB_REG) / (1E-3 * CLK_FREQ); +} + /* parameters - settings */ @@ -970,8 +870,9 @@ enum detectorSettings getSettings() { /* parameters - dac, adc, hv */ + void setDAC(enum DACINDEX ind, int val, int mV) { - if (val < 0 && val != LTC2620_PWR_DOWN_VAL) + if (val < 0 && val != LTC2620_GetPowerDownValue()) return; FILE_LOG(logDEBUG1, ("Setting dac[%d]: %d %s \n", (int)ind, val, (mV ? "mV" : "dac units"))); @@ -1002,7 +903,7 @@ int getDAC(enum DACINDEX ind, int mV) { } int getMaxDacSteps() { - return LTC2620_MAX_STEPS; + return LTC2620_GetMaxNumSteps(); } int dacToVoltage(int dac) { @@ -1045,13 +946,23 @@ int setHighVoltage(int val){ highvoltage = val; return highvoltage; #endif - // setting hv - if (val >= 0) { - FILE_LOG(logINFO, ("Setting High voltage: %d V\n", val)); - MAX1932_Set(val); - highvoltage = val; - } + // setting hv + if (val >= 0) { + FILE_LOG(logINFO, ("Setting High voltage: %d V\n", val)); + uint32_t addr = POWER_REG; + + // switch to external high voltage + bus_w(addr, bus_r(addr) & (~POWER_HV_INTERNAL_SLCT_MSK)); + + MAX1932_Set(val); + + // switch on internal high voltage, if set + if (val > 0) + bus_w(addr, bus_r(addr) | POWER_HV_INTERNAL_SLCT_MSK); + + highvoltage = val; + } return highvoltage; } @@ -1064,22 +975,18 @@ int setHighVoltage(int val){ void setTiming( enum timingMode arg){ - - if(arg != GET_TIMING_MODE){ - switch((int)arg){ - case AUTO_TIMING: - FILE_LOG(logINFO, ("Set Timing: Auto\n")); - bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) & ~EXT_SIGNAL_MSK); - break; - case TRIGGER_EXPOSURE: - FILE_LOG(logINFO, ("Set Timing: Trigger\n")); - bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) | EXT_SIGNAL_MSK); - break; - default: - FILE_LOG(logERROR, ("Unknown timing mode %d\n", arg)); - return; - } - } + switch(arg){ + case AUTO_TIMING: + FILE_LOG(logINFO, ("Set Timing: Auto\n")); + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) & ~EXT_SIGNAL_MSK); + break; + case TRIGGER_EXPOSURE: + FILE_LOG(logINFO, ("Set Timing: Trigger\n")); + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) | EXT_SIGNAL_MSK); + break; + default: + FILE_LOG(logERROR, ("Unknown timing mode %d\n", arg)); + } } @@ -1094,57 +1001,60 @@ enum timingMode getTiming() { /* configure mac */ -long int calcChecksum(int sourceip, int destip) { - ip_header ip; - ip.ip_ver = 0x4; - ip.ip_ihl = 0x5; - ip.ip_tos = 0x0; - ip.ip_len = IP_PACKETSIZE; - ip.ip_ident = 0x0000; - ip.ip_flag = 0x2; //not nibble aligned (flag& offset - ip.ip_offset = 0x000; - ip.ip_ttl = 0x40; - ip.ip_protocol = 0x11; - ip.ip_chksum = 0x0000 ; // pseudo - ip.ip_sourceip = sourceip; - ip.ip_destip = destip; - - int count = sizeof(ip); - - unsigned short *addr; - addr = (unsigned short*) &(ip); /* warning: assignment from incompatible pointer type */ - +void calcChecksum(udp_header* udp) { + int count = IP_HEADER_SIZE; long int sum = 0; - while( count > 1 ) { + + // start at ip_tos as the memory is not continous for ip header + uint16_t *addr = (uint16_t*) (&(udp->ip_tos)); + + sum += *addr++; + count -= 2; + + // ignore ethertype (from udp header) + addr++; + + // from identification to srcip_lsb + while( count > 2 ) { sum += *addr++; count -= 2; } + + // ignore src udp port (from udp header) + addr++; + if (count > 0) sum += *addr; // Add left-over byte, if any - while (sum>>16) + while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16);// Fold 32-bit sum to 16 bits - long int checksum = (~sum) & 0xffff; - FILE_LOG(logINFO, ("IP checksum is 0x%lx\n",checksum)); - return checksum; + long int checksum = sum & 0xffff; + checksum += UDP_IP_HEADER_LENGTH_BYTES; + FILE_LOG(logINFO, ("\tIP checksum is 0x%lx\n",checksum)); + udp->ip_checksum = checksum; } - -int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport){ +int configureMAC(){ + uint32_t sourceip = udpDetails.srcip; + uint32_t destip = udpDetails.dstip; + uint64_t sourcemac = udpDetails.srcmac; + uint64_t destmac = udpDetails.dstmac; + int sourceport = udpDetails.srcport; + int destport = udpDetails.dstport; #ifdef VIRTUAL - return OK; + return OK; #endif FILE_LOG(logINFOBLUE, ("Configuring MAC\n")); // 1 giga udp if (!enableTenGigabitEthernet(-1)) { - // if it was in 10G mode, it was not allocating RAM - if (allocateRAM() == FAIL) + FILE_LOG(logINFOBLUE, ("Configuring 1G MAC\n")); + if (updateDatabytesandAllocateRAM() == FAIL) return -1; char cDestIp[MAX_STR_LENGTH]; memset(cDestIp, 0, MAX_STR_LENGTH); sprintf(cDestIp, "%d.%d.%d.%d", (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff); - FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, udpport)); - if (setUDPDestinationDetails(cDestIp, udpport) == FAIL) { + FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, destport)); + if (setUDPDestinationDetails(0, cDestIp, destport) == FAIL) { FILE_LOG(logERROR, ("could not set udp 1G destination IP and port\n")); return FAIL; } @@ -1152,71 +1062,84 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t } // 10 G - else { - uint32_t sourceport = DEFAULT_TX_UDP_PORT; + FILE_LOG(logINFOBLUE, ("Configuring 10G MAC\n")); - FILE_LOG(logINFO, ("\tSource IP : %d.%d.%d.%d \t\t(0x%08x)\n", - (sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip)); - FILE_LOG(logINFO, ("\tSource MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((sourcemac>>40)&0xFF), - (unsigned int)((sourcemac>>32)&0xFF), - (unsigned int)((sourcemac>>24)&0xFF), - (unsigned int)((sourcemac>>16)&0xFF), - (unsigned int)((sourcemac>>8)&0xFF), - (unsigned int)((sourcemac>>0)&0xFF), - (long long unsigned int)sourcemac)); - FILE_LOG(logINFO, ("\tSource Port : %d \t\t\t(0x%08x)\n",sourceport, sourceport)); + FILE_LOG(logINFO, ("\tSource IP : %d.%d.%d.%d \t\t(0x%08x)\n", + (sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip)); + FILE_LOG(logINFO, ("\tSource MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", + (unsigned int)((sourcemac>>40)&0xFF), + (unsigned int)((sourcemac>>32)&0xFF), + (unsigned int)((sourcemac>>24)&0xFF), + (unsigned int)((sourcemac>>16)&0xFF), + (unsigned int)((sourcemac>>8)&0xFF), + (unsigned int)((sourcemac>>0)&0xFF), + (long long unsigned int)sourcemac)); + FILE_LOG(logINFO, ("\tSource Port : %d \t\t\t(0x%08x)\n",sourceport, sourceport)); - FILE_LOG(logINFO, ("\tDest. IP : %d.%d.%d.%d \t\t(0x%08x)\n", - (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff, destip)); - FILE_LOG(logINFO, ("\tDest. MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((destmac>>40)&0xFF), - (unsigned int)((destmac>>32)&0xFF), - (unsigned int)((destmac>>24)&0xFF), - (unsigned int)((destmac>>16)&0xFF), - (unsigned int)((destmac>>8)&0xFF), - (unsigned int)((destmac>>0)&0xFF), - (long long unsigned int)destmac)); - FILE_LOG(logINFO, ("\tDest. Port : %d \t\t\t(0x%08x)\n",udpport, udpport)); + FILE_LOG(logINFO, ("\tDest. IP : %d.%d.%d.%d \t\t(0x%08x)\n", + (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff, destip)); + FILE_LOG(logINFO, ("\tDest. MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", + (unsigned int)((destmac>>40)&0xFF), + (unsigned int)((destmac>>32)&0xFF), + (unsigned int)((destmac>>24)&0xFF), + (unsigned int)((destmac>>16)&0xFF), + (unsigned int)((destmac>>8)&0xFF), + (unsigned int)((destmac>>0)&0xFF), + (long long unsigned int)destmac)); + FILE_LOG(logINFO, ("\tDest. Port : %d \t\t\t(0x%08x)\n",destport, destport)); - long int checksum=calcChecksum(sourceip, destip); - bus_w(TX_IP_REG, sourceip); - bus_w(RX_IP_REG, destip); + // start addr + uint32_t addr = RXR_ENDPOINT_START_REG; + // get struct memory + udp_header *udp = (udp_header*) (Blackfin_getBaseAddress() + addr / 2); + memset(udp, 0, sizeof(udp_header)); - uint32_t val = 0; + // mac addresses + // msb (32) + lsb (16) + udp->udp_destmac_msb = ((destmac >> 16) & BIT32_MASK); + udp->udp_destmac_lsb = ((destmac >> 0) & BIT16_MASK); + // msb (16) + lsb (32) + udp->udp_srcmac_msb = ((sourcemac >> 32) & BIT16_MASK); + udp->udp_srcmac_lsb = ((sourcemac >> 0) & BIT32_MASK); - val = ((sourcemac >> LSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); - bus_w(TX_MAC_LSB_REG, val); - FILE_LOG(logDEBUG1, ("Read from TX_MAC_LSB_REG: 0x%08x\n", bus_r(TX_MAC_LSB_REG))); + // ip addresses + udp->ip_srcip_msb = ((sourceip >> 16) & BIT16_MASK); + udp->ip_srcip_lsb = ((sourceip >> 0) & BIT16_MASK); + udp->ip_destip_msb = ((destip >> 16) & BIT16_MASK); + udp->ip_destip_lsb = ((destip >> 0) & BIT16_MASK); - val = ((sourcemac >> MSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); - bus_w(TX_MAC_MSB_REG,val); - FILE_LOG(logDEBUG1, ("Read from TX_MAC_MSB_REG: 0x%08x\n", bus_r(TX_MAC_MSB_REG))); + // source port + udp->udp_srcport = sourceport; + udp->udp_destport = destport; - val = ((destmac >> LSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); - bus_w(RX_MAC_LSB_REG, val); - FILE_LOG(logDEBUG1, ("Read from RX_MAC_LSB_REG: 0x%08x\n", bus_r(RX_MAC_LSB_REG))); + // other defines + udp->udp_ethertype = 0x800; + udp->ip_ver = 0x4; + udp->ip_ihl = 0x5; + udp->ip_flags = 0x2; //FIXME + udp->ip_ttl = 0x40; + udp->ip_protocol = 0x11; + // total length is redefined in firmware - val = ((destmac >> MSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); - bus_w(RX_MAC_MSB_REG, val); - FILE_LOG(logDEBUG1, ("Read from RX_MAC_MSB_REG: 0x%08x\n", bus_r(RX_MAC_MSB_REG))); + calcChecksum(udp); - val = (((sourceport << UDP_PORT_TX_OFST) & UDP_PORT_TX_MSK) | - ((udpport << UDP_PORT_RX_OFST) & UDP_PORT_RX_MSK)); - bus_w(UDP_PORT_REG, val); - FILE_LOG(logDEBUG1, ("Read from UDP_PORT_REG: 0x%08x\n", bus_r(UDP_PORT_REG))); - - bus_w(TX_IP_CHECKSUM_REG,(checksum << TX_IP_CHECKSUM_OFST) & TX_IP_CHECKSUM_MSK); - FILE_LOG(logDEBUG1, ("Read from TX_IP_CHECKSUM_REG: 0x%08x\n", bus_r(TX_IP_CHECKSUM_REG))); - - cleanFifos();//FIXME: resetPerpheral() for ctb? - resetPeripheral(); - usleep(WAIT_TIME_CONFIGURE_MAC); /* todo maybe without */ - } + cleanFifos();//FIXME: resetPerpheral() for ctb? + resetPeripheral(); + FILE_LOG(logINFO, ("Waiting for %d s for mac to be up\n", WAIT_TIME_CONFIGURE_MAC / (1000 * 1000))); + usleep(WAIT_TIME_CONFIGURE_MAC); // todo maybe without return OK; } +int setDetectorPosition(int pos[]) { + memcpy(detPos, pos, sizeof(detPos)); + return OK; +} + +int* getDetectorPosition() { + return detPos; +} + int enableTenGigabitEthernet(int val) { uint32_t addr = CONFIG_REG; @@ -1234,43 +1157,69 @@ int enableTenGigabitEthernet(int val) { } - -/* moench specific - configure frequency, phase, pll, */ - -int powerChip(int on) { +/* moench specific - powerchip, configure frequency, phase, pll*/ +int powerChip (int on) { uint32_t addr = POWER_REG; - if (on >= 0) { - FILE_LOG(logINFO, ("Powering %s\n", (on > 0 ? "on" : "off"))); - if (on) - bus_w(addr, bus_r(addr) | POWER_ENBL_VLTG_RGLTR_MSK); - else - bus_w(addr, bus_r(addr) & (~POWER_ENBL_VLTG_RGLTR_MSK)); + if (on > 0) { + FILE_LOG(logINFOBLUE, ("Powering on chip\n")); + bus_w(addr, bus_r(addr) | POWER_CHIP_MSK); + } else if (on == 0) { + FILE_LOG(logINFOBLUE, ("Powering off chip\n")); + bus_w(addr, bus_r(addr) &~ POWER_CHIP_MSK); } - - uint32_t regval = bus_r(addr); - FILE_LOG(logDEBUG1, ("\tPower Register: 0x%08x\n", regval)); - - if (regval & POWER_ENBL_VLTG_RGLTR_MSK) - return 1; - return 0; + return ((bus_r(addr) & POWER_CHIP_MSK) >> POWER_CHIP_OFST); } -// ind can only be ADC_CLK or DBIT_CLK -void configurePhase(enum CLKINDEX ind, int val, int degrees) { - char clock_names[4][10]={"run_clk","adc_clk", "sync_clk", "dbit_clk"}; - int maxShift = getMaxPhase(ind); +/* parameters - readout */ +int setAnalogOnlyReadout() { + FILE_LOG(logINFOBLUE, ("Setting Analog Only Readout\n")); + + uint32_t addr = CONFIG_REG; + uint32_t addr_readout_10g = READOUT_10G_ENABLE_REG; + // default: analog only + bus_w(addr, bus_r(addr) & (~CONFIG_DSBL_ANLG_OTPT_MSK) & (~CONFIG_ENBLE_DGTL_OTPT_MSK)); + bus_w(addr_readout_10g, bus_r(addr_readout_10g) & (~READOUT_10G_ENABLE_ANLG_MSK) & ~(READOUT_10G_ENABLE_DGTL_MSK)); + bus_w(addr_readout_10g, bus_r(addr_readout_10g) | ((adcEnableMask_10g << READOUT_10G_ENABLE_ANLG_OFST) & READOUT_10G_ENABLE_ANLG_MSK)); + + // 1Gb + if (!enableTenGigabitEthernet(-1)) { + if (updateDatabytesandAllocateRAM() == FAIL) { + return FAIL; + } + } + + // 10Gb + else { + // validate adcenablemask for 10g + if (adcEnableMask_10g != ((bus_r(READOUT_10G_ENABLE_REG) & READOUT_10G_ENABLE_ANLG_MSK) >> READOUT_10G_ENABLE_ANLG_OFST)) { + FILE_LOG(logERROR, ("Setting readout mode failed. Could not set 10g adc enable mask to 0x%x\n.", adcEnableMask_10g)); + return FAIL; + } + } + return OK; +} + + + +int setPhase(enum CLKINDEX ind, int val, int degrees) { + if (ind != ADC_CLK && ind != DBIT_CLK) { + FILE_LOG(logERROR, ("Unknown clock index %d to set phase\n", ind)); + return FAIL; + } + char* clock_names[] = {CLK_NAMES}; + FILE_LOG(logINFO, ("Setting %s clock (%d) phase to %d %s\n", clock_names[ind], ind, val, degrees == 0 ? "" : "degrees")); + int maxShift = getMaxPhase(ind); // validation if (degrees && (val < 0 || val > 359)) { - FILE_LOG(logERROR, ("\tPhase provided for C%d(%s) outside limits (0 - 359°C)\n", ind, clock_names[ind])); - return; + FILE_LOG(logERROR, ("\tPhase outside limits (0 - 359°C)\n")); + return FAIL; } if (!degrees && (val < 0 || val > maxShift - 1)) { - FILE_LOG(logERROR, ("\tPhase provided for C%d(%s) outside limits (0 - %d phase shifts)\n", ind, clock_names[ind], maxShift - 1)); - return; + FILE_LOG(logERROR, ("\tPhase outside limits (0 - %d phase shifts)\n", maxShift - 1)); + return FAIL; } - FILE_LOG(logINFO, ("\tConfiguring Phase of C%d(%s) to %d (degree mode: %d)\n", ind, clock_names[ind], val, degrees)); int valShift = val; // convert to phase shift if (degrees) { @@ -1284,8 +1233,9 @@ void configurePhase(enum CLKINDEX ind, int val, int degrees) { // same phase if (!relativePhase) { FILE_LOG(logINFO, ("\tNothing to do in Phase Shift\n")); - return; + return OK; } + FILE_LOG(logINFOBLUE, ("Configuring Phase\n")); int phase = 0; if (relativePhase > 0) { @@ -1298,9 +1248,14 @@ void configurePhase(enum CLKINDEX ind, int val, int degrees) { ALTERA_PLL_SetPhaseShift(phase, (int)ind, 0); clkPhase[ind] = valShift; + return OK; } int getPhase(enum CLKINDEX ind, int degrees) { + if (ind != ADC_CLK && ind != DBIT_CLK) { + FILE_LOG(logERROR, ("Unknown clock index %d to get phase\n", ind)); + return -1; + } if (!degrees) return clkPhase[ind]; // convert back to degrees @@ -1310,31 +1265,29 @@ int getPhase(enum CLKINDEX ind, int degrees) { } int getMaxPhase(enum CLKINDEX ind) { - int ret = ((double)PLL_VCO_FREQ_MHZ / (double)clkDivider[ind]) * MAX_PHASE_SHIFTS_STEPS; + if (ind != ADC_CLK && ind != DBIT_CLK) { + FILE_LOG(logERROR, ("Unknown clock index %d to get max phase\n", ind)); + return -1; + } + int ret = ((double)PLL_VCO_FREQ_MHZ / (double)clkFrequency[ind]) * MAX_PHASE_SHIFTS_STEPS; - char clock_names[4][10]={"run_clk","adc_clk", "sync_clk", "dbit_clk"}; + char* clock_names[] = {CLK_NAMES}; FILE_LOG(logDEBUG1, ("Max Phase Shift (%s): %d (Clock: %d MHz, VCO:%d MHz)\n", - clock_names[ind], ret, clkDivider[ind], PLL_VCO_FREQ_MHZ)); + clock_names[ind], ret, clkFrequency[ind], PLL_VCO_FREQ_MHZ)); return ret; } -int validatePhaseinDegrees(enum speedVariable ind, int val, int retval) { - if (val == -1) - return OK; - enum CLKINDEX clkIndex; - switch(ind) { - case ADC_PHASE: - clkIndex = ADC_CLK; - break; - case DBIT_PHASE: - clkIndex = DBIT_CLK; - break; - default: - FILE_LOG(logERROR, ("Unknown speed enum %d for validating phase in degrees\n", (int)ind)); +int validatePhaseinDegrees(enum CLKINDEX ind, int val, int retval) { + if (ind != ADC_CLK && ind != DBIT_CLK) { + FILE_LOG(logERROR, ("Unknown clock index %d to validate phase in degrees\n", ind)); + return FAIL; } - FILE_LOG(logDEBUG1, ("validating phase in degrees for clk %d\n", clkIndex)); - int maxShift = getMaxPhase(clkIndex); + if (val == -1) { + return OK; + } + FILE_LOG(logDEBUG1, ("validating phase in degrees for clk %d\n", ind)); + int maxShift = getMaxPhase(ind); // convert degrees to shift int valShift = 0; ConvertToDifferentRange(0, 359, 0, maxShift - 1, val, &valShift); @@ -1346,36 +1299,62 @@ int validatePhaseinDegrees(enum speedVariable ind, int val, int retval) { return FAIL; } -void configureFrequency(enum CLKINDEX ind, int val) { - char clock_names[4][10]={"run_clk","adc_clk", "sync_clk", "dbit_clk"}; - if (val <= 0) - return; - - FILE_LOG(logINFO, ("\tConfiguring Frequency of C%d(%s) to %d MHz\n", ind, clock_names[ind], val)); +int setFrequency(enum CLKINDEX ind, int val) { + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to set frequency\n", ind)); + return FAIL; + } + if (val <= 0) { + return FAIL; + } + char* clock_names[] = {CLK_NAMES}; + FILE_LOG(logINFO, ("\tSetting %s clock (%d) frequency to %d MHz\n", clock_names[ind], ind, val)); // check adc clk too high if (ind == ADC_CLK && val > MAXIMUM_ADC_CLK) { FILE_LOG(logERROR, ("Frequency %d MHz too high for ADC\n", val)); - return; + return FAIL; } - // reset phase - if (ind == ADC_CLK || ind == DBIT_CLK) { - FILE_LOG(logINFO, ("\tReseting phase of %s\n", clock_names[ind])); - configurePhase(ind, 0, 0); - } + // Remembering adcphase/ dbit phase in degrees + int adcPhase = getPhase(ADC_CLK, 1); + FILE_LOG(logDEBUG1, ("\tRemembering ADC phase: %d degrees\n", adcPhase)); + int dbitPhase = getPhase(DBIT_CLK, 1); + FILE_LOG(logDEBUG1, ("\tRemembering DBIT phase: %d degrees\n", dbitPhase)); // Calculate and set output frequency - clkDivider[ind] = ALTERA_PLL_SetOuputFrequency (ind, PLL_VCO_FREQ_MHZ, val); - FILE_LOG(logINFO, ("\tC%d(%s): Frequency set to %d MHz\n", ind, clock_names[ind], clkDivider[ind])); + clkFrequency[ind] = ALTERA_PLL_SetOuputFrequency (ind, PLL_VCO_FREQ_MHZ, val); + FILE_LOG(logINFO, ("\t%s clock (%d) frequency set to %d MHz\n", clock_names[ind], ind, clkFrequency[ind])); + + // phase reset by pll (when setting output frequency) + clkPhase[ADC_CLK] = 0; + clkPhase[DBIT_CLK] = 0; + + // set the phase (reset by pll) + FILE_LOG(logINFO, ("\tCorrecting ADC phase to %d degrees\n", adcPhase)); + setPhase(ADC_CLK, adcPhase, 1); + FILE_LOG(logINFO, ("\tCorrecting DBIT phase to %d degrees\n", dbitPhase)); + setPhase(DBIT_CLK, dbitPhase, 1); + + // required to reconfigure as adc clock is stopped temporarily when resetting pll (in changing output frequency) + AD9257_Configure(); + + if (ind != SYNC_CLK) { + configureSyncFrequency(ind); + } + return OK; } int getFrequency(enum CLKINDEX ind) { - return clkDivider[ind]; + if (ind < 0 || ind >= NUM_CLOCKS) { + FILE_LOG(logERROR, ("Unknown clock index %d to get frequency\n", ind)); + return -1; + } + return clkFrequency[ind]; } void configureSyncFrequency(enum CLKINDEX ind) { - char clock_names[4][10]={"run_clk","adc_clk", "sync_clk", "dbit_clk"}; + char* clock_names[] = {CLK_NAMES}; int clka = 0, clkb = 0; switch(ind) { case ADC_CLK: @@ -1391,6 +1370,7 @@ void configureSyncFrequency(enum CLKINDEX ind) { clkb = ADC_CLK; break; default: + FILE_LOG(logERROR, ("Unknown clock index %d to configure sync frequcny\n", ind)); return; } @@ -1421,67 +1401,69 @@ void configureSyncFrequency(enum CLKINDEX ind) { // configure sync to current if (configure) - configureFrequency(SYNC_CLK, min); + setFrequency(SYNC_CLK, min); } - -void setAdcOffsetRegister(int adc, int val) { - if (val < 0) +// adc pipeline only +void setPipeline(enum CLKINDEX ind, int val) { + if (ind != ADC_CLK) { + FILE_LOG(logERROR, ("Unknown clock index %d to set pipeline\n", ind)); + return; + } + if (val < 0) { return; - - FILE_LOG(logINFO, ("Setting %s Pipeline to %d\n", (adc ? "ADC" : "Dbit"), val)); + } + FILE_LOG(logINFO, ("Setting adc clock (%d) Pipeline to %d\n", ADC_CLK, val)); uint32_t offset = ADC_OFFSET_ADC_PPLN_OFST; uint32_t mask = ADC_OFFSET_ADC_PPLN_MSK; - if (!adc) { - offset = ADC_OFFSET_DBT_PPLN_OFST; - mask = ADC_OFFSET_DBT_PPLN_MSK; - } - uint32_t addr = ADC_OFFSET_REG; // reset value bus_w(addr, bus_r(addr) & ~ mask); // set value bus_w(addr, bus_r(addr) | ((val << offset) & mask)); - FILE_LOG(logDEBUG1, (" %s Offset: 0x%8x\n", (adc ? "ADC" : "Dbit"), bus_r(addr))); + FILE_LOG(logDEBUG1, (" adc clock (%d) Offset: 0x%8x\n", ADC_CLK, bus_r(addr))); } -int getAdcOffsetRegister(int adc) { - if (adc) - return ((bus_r(ADC_OFFSET_REG) & ADC_OFFSET_ADC_PPLN_MSK) >> ADC_OFFSET_ADC_PPLN_OFST); - return ((bus_r(ADC_OFFSET_REG) & ADC_OFFSET_DBT_PPLN_MSK) >> ADC_OFFSET_DBT_PPLN_OFST); +int getPipeline(enum CLKINDEX ind) { + if (ind != ADC_CLK) { + FILE_LOG(logERROR, ("Unknown clock index %d to get pipeline\n", ind)); + return -1; + } + return ((bus_r(ADC_OFFSET_REG) & ADC_OFFSET_ADC_PPLN_MSK) >> ADC_OFFSET_ADC_PPLN_OFST); } // patterns + uint64_t writePatternIOControl(uint64_t word) { if (word != -1) { - FILE_LOG(logINFO, ("Setting Pattern - I/O Control: 0x%llx\n", (long long int) word)); + FILE_LOG(logINFO, ("Setting Pattern I/O Control: 0x%llx\n", (long long int) word)); set64BitReg(word, PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); } uint64_t retval = get64BitReg(PATTERN_IO_CNTRL_LSB_REG, PATTERN_IO_CNTRL_MSB_REG); - FILE_LOG(logDEBUG1, ("I/O Control: 0x%llx\n", (long long int) retval)); + FILE_LOG(logDEBUG1, (" I/O Control retval: 0x%llx\n", (long long int) retval)); return retval; } uint64_t writePatternClkControl(uint64_t word) { if (word != -1) { - FILE_LOG(logINFO, ("Setting Pattern - Clock Control: 0x%llx\n", (long long int) word)); + FILE_LOG(logINFO, ("Setting Pattern Clock Control: 0x%llx\n", (long long int) word)); set64BitReg(word, PATTERN_IO_CLK_CNTRL_LSB_REG, PATTERN_IO_CLK_CNTRL_MSB_REG); } uint64_t retval = get64BitReg(PATTERN_IO_CLK_CNTRL_LSB_REG, PATTERN_IO_CLK_CNTRL_MSB_REG); - FILE_LOG(logDEBUG1, ("Clock Control: 0x%llx\n", (long long int) retval)); + FILE_LOG(logDEBUG1, (" Clock Control retval: 0x%llx\n", (long long int) retval)); return retval; } uint64_t readPatternWord(int addr) { // error (handled in tcp) - if (addr < 0 || addr > MAX_PATTERN_LENGTH) { + if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { FILE_LOG(logERROR, ("Cannot get Pattern - Word. Invalid addr 0x%x. " - "Should be <= 0x%x\n", addr, MAX_PATTERN_LENGTH)); + "Should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH)); return -1; } - FILE_LOG(logDEBUG1, (" Reading Pattern - Word (addr:0x%x)\n", addr)); + FILE_LOG(logINFORED, (" Reading (Executing) Pattern Word (addr:0x%x)\n", addr)); uint32_t reg = PATTERN_CNTRL_REG; // overwrite with only addr @@ -1496,7 +1478,7 @@ uint64_t readPatternWord(int addr) { // read value uint64_t retval = get64BitReg(PATTERN_OUT_LSB_REG, PATTERN_OUT_MSB_REG); - FILE_LOG(logDEBUG1, (" Word(addr:0x%x): 0x%llx\n", addr, (long long int) retval)); + FILE_LOG(logDEBUG1, (" Word(addr:0x%x) retval: 0x%llx\n", addr, (long long int) retval)); return retval; } @@ -1507,13 +1489,13 @@ uint64_t writePatternWord(int addr, uint64_t word) { return readPatternWord(addr); // error (handled in tcp) - if (addr < 0 || addr > MAX_PATTERN_LENGTH) { + if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { FILE_LOG(logERROR, ("Cannot set Pattern - Word. Invalid addr 0x%x. " - "Should be <= 0x%x\n", addr, MAX_PATTERN_LENGTH)); + "Should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH)); return -1; } - FILE_LOG(logINFO, ("Setting Pattern - Word (addr:0x%x, word:0x%llx)\n", addr, (long long int) word)); + FILE_LOG(logINFO, ("Setting Pattern Word (addr:0x%x, word:0x%llx)\n", addr, (long long int) word)); uint32_t reg = PATTERN_CNTRL_REG; // write word @@ -1536,9 +1518,9 @@ uint64_t writePatternWord(int addr, uint64_t word) { int setPatternWaitAddress(int level, int addr) { // error (handled in tcp) - if (addr > MAX_PATTERN_LENGTH) { - FILE_LOG(logERROR, ("Cannot set Pattern - Wait Address. Invalid addr 0x%x. " - "Should be <= 0x%x\n", addr, MAX_PATTERN_LENGTH)); + if (addr >= MAX_PATTERN_LENGTH) { + FILE_LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid addr 0x%x. " + "Should be between 0 and 0x%x\n", addr, MAX_PATTERN_LENGTH)); return -1; } @@ -1563,20 +1545,20 @@ int setPatternWaitAddress(int level, int addr) { mask = PATTERN_WAIT_2_ADDR_MSK; break; default: - FILE_LOG(logERROR, ("Cannot set Pattern - Wait Address. Invalid level 0x%x. " + FILE_LOG(logERROR, ("Cannot set Pattern Wait Address. Invalid level 0x%x. " "Should be between 0 and 2.\n", level)); return -1; } // set if (addr >= 0) { - FILE_LOG(logINFO, ("Setting Pattern - Wait Address (level:%d, addr:0x%x)\n", level, addr)); + FILE_LOG(logINFO, ("Setting Pattern Wait Address (level:%d, addr:0x%x)\n", level, addr)); bus_w(reg, ((addr << offset) & mask)); } // get - uint32_t regval = bus_r((reg & mask) >> offset); - FILE_LOG(logDEBUG1, (" Wait Address (level:%d, addr:0x%x)\n", level, regval)); + uint32_t regval = ((bus_r(reg) & mask) >> offset); + FILE_LOG(logDEBUG1, (" Wait Address retval (level:%d, addr:0x%x)\n", level, regval)); return regval; } @@ -1598,38 +1580,29 @@ uint64_t setPatternWaitTime(int level, uint64_t t) { regm = PATTERN_WAIT_TIMER_2_MSB_REG; break; default: - FILE_LOG(logERROR, ("Cannot set Pattern - Wait Time. Invalid level %d. " + FILE_LOG(logERROR, ("Cannot set Pattern Wait Time. Invalid level %d. " "Should be between 0 and 2.\n", level)); return -1; } // set if (t >= 0) { - FILE_LOG(logINFO, ("Setting Pattern - Wait Time (level:%d, t:%lld)\n", level, (long long int)t)); + FILE_LOG(logINFO, ("Setting Pattern Wait Time (level:%d, t:%lld)\n", level, (long long int)t)); set64BitReg(t, regl, regm); } // get uint64_t regval = get64BitReg(regl, regm); - FILE_LOG(logDEBUG1, (" Wait Time (level:%d, t:%lld)\n", level, (long long int)regval)); + FILE_LOG(logDEBUG1, (" Wait Time retval (level:%d, t:%lld)\n", level, (long long int)regval)); return regval; } void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { - // level 0-2, addr upto patternlength + 1 (checked at tcp) - if ((level != -1) && - (*startAddr > MAX_PATTERN_LENGTH || *stopAddr > MAX_PATTERN_LENGTH)) { - FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, level:%d, startaddr:0x%x, stopaddr:0x%x). " - "Addr must be <= 0x%x\n", - level, *startAddr, *stopAddr, MAX_PATTERN_LENGTH)); - } - - //level -1, addr upto patternlength (checked at tcp) - else if ((level == -1) && - (*startAddr > MAX_PATTERN_LENGTH || *stopAddr > MAX_PATTERN_LENGTH)) { - FILE_LOG(logERROR, ("Cannot set Pattern (Pattern Loop, complete pattern, startaddr:0x%x, stopaddr:0x%x). " - "Addr must be <= 0x%x\n", + // (checked at tcp) + if (*startAddr >= MAX_PATTERN_LENGTH || *stopAddr >= MAX_PATTERN_LENGTH) { + FILE_LOG(logERROR, ("Cannot set Pattern Loop, Address (startaddr:0x%x, stopaddr:0x%x) must be " + "less than 0x%x\n", *startAddr, *stopAddr, MAX_PATTERN_LENGTH)); } @@ -1676,7 +1649,7 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { break; default: // already checked at tcp interface - FILE_LOG(logERROR, ("Cannot set Pattern - Pattern loop. Invalid level %d. " + FILE_LOG(logERROR, ("Cannot set Pattern loop. Invalid level %d. " "Should be between -1 and 2.\n", level)); *startAddr = 0; *stopAddr = 0; @@ -1687,7 +1660,7 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { if (level >= 0) { // set iteration if (*nLoop >= 0) { - FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop (level:%d, nLoop:%d)\n", + FILE_LOG(logINFO, ("Setting Pattern Loop (level:%d, nLoop:%d)\n", level, *nLoop)); bus_w(nLoopReg, *nLoop); } @@ -1695,9 +1668,9 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { } // set - if (*startAddr != -1 && *stopAddr != -1) { + if (*startAddr >= 0 && *stopAddr >= 0) { // writing start and stop addr - FILE_LOG(logINFO, ("Setting Pattern - Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n", + FILE_LOG(logINFO, ("Setting Pattern Loop (level:%d, startaddr:0x%x, stopaddr:0x%x)\n", level, *startAddr, *stopAddr)); bus_w(addr, ((*startAddr << startOffset) & startMask) | ((*stopAddr << stopOffset) & stopMask)); FILE_LOG(logDEBUG1, ("Addr:0x%x, val:0x%x\n", addr, bus_r(addr))); @@ -1706,55 +1679,15 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { // get else { *startAddr = ((bus_r(addr) & startMask) >> startOffset); - FILE_LOG(logDEBUG1, ("Getting Pattern - Pattern Loop Start Address (level:%d, Read startAddr:0x%x)\n", + FILE_LOG(logDEBUG1, ("Getting Pattern Loop Start Address (level:%d, Read startAddr:0x%x)\n", level, *startAddr)); *stopAddr = ((bus_r(addr) & stopMask) >> stopOffset); - FILE_LOG(logDEBUG1, ("Getting Pattern - Pattern Loop Stop Address (level:%d, Read stopAddr:0x%x)\n", + FILE_LOG(logDEBUG1, ("Getting Pattern Loop Stop Address (level:%d, Read stopAddr:0x%x)\n", level, *stopAddr)); } } -int setLEDEnable(int enable) { - uint32_t addr = CONFIG_REG; - - // set - if (enable >= 0) { - FILE_LOG(logINFO, ("Switching LED %s\n", (enable > 0) ? "ON" : "OFF")); - // disable - if (enable == 0) { - bus_w(addr, bus_r(addr) | CONFIG_LED_DSBL_MSK); - } - // enable - else { - bus_w(addr, bus_r(addr) & (~CONFIG_LED_DSBL_MSK)); - } - } - // ~ to get the opposite - return (((~bus_r(addr)) & CONFIG_LED_DSBL_MSK) >> CONFIG_LED_DSBL_OFST); -} - -void setDigitalIODelay(uint64_t pinMask, int delay) { - FILE_LOG(logINFO, ("Setings Digital IO Delay (pinMask:0x%llx, delay: %d ps)\n", - (long long unsigned int)pinMask, delay)); - - int delayunit = delay / OUTPUT_DELAY_0_OTPT_STTNG_STEPS; - FILE_LOG(logDEBUG1, ("delay unit: 0x%x (steps of 25ps)\n", delayunit)); - - // set pin mask - bus_w(PIN_DELAY_1_REG, pinMask); - - uint32_t addr = OUTPUT_DELAY_0_REG; - // set delay - bus_w(addr, bus_r(addr) & (~OUTPUT_DELAY_0_OTPT_STTNG_MSK)); - bus_w(addr, (bus_r(addr) | ((delayunit << OUTPUT_DELAY_0_OTPT_STTNG_OFST) & OUTPUT_DELAY_0_OTPT_STTNG_MSK))); - - // load value - bus_w(addr, bus_r(addr) | OUTPUT_DELAY_0_OTPT_TRGGR_MSK); - - // trigger configuration - bus_w(addr, bus_r(addr) & (~OUTPUT_DELAY_0_OTPT_TRGGR_MSK)); -} void setPatternMask(uint64_t mask) { set64BitReg(mask, PATTERN_MASK_LSB_REG, PATTERN_MASK_MSB_REG); @@ -1772,6 +1705,7 @@ uint64_t getPatternBitMask() { return get64BitReg(PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG); } + /* aquisition */ int startStateMachine(){ @@ -1786,10 +1720,11 @@ int startStateMachine(){ FILE_LOG(logINFOGREEN, ("Virtual Acquisition started\n")); return OK; #endif + int send_to_10g = enableTenGigabitEthernet(-1); // 1 giga udp - if (!enableTenGigabitEthernet(-1)) { + if (send_to_10g == 0) { // create udp socket - if(createUDPSocket() != OK) { + if(createUDPSocket(0) != OK) { return FAIL; } // update header with modId, detType and version. Reset offset and fnum @@ -1797,9 +1732,10 @@ int startStateMachine(){ } FILE_LOG(logINFOBLUE, ("Starting State Machine\n")); - cleanFifos(); - unsetFifoReadStrobes(); // FIXME: unnecessary to write bus_w(dumm, 0) as it is 0 in the beginnig and the strobes are always unset if set + if (send_to_10g == 0) { + unsetFifoReadStrobes(); // FIXME: unnecessary to write bus_w(dumm, 0) as it is 0 in the beginnig and the strobes are always unset if set + } //start state machine bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_ACQSTN_MSK | CONTROL_STRT_EXPSR_MSK); @@ -1812,17 +1748,43 @@ int startStateMachine(){ #ifdef VIRTUAL void* start_timer(void* arg) { - int wait_in_s = (setTimer(FRAME_NUMBER, -1) * - setTimer(TRIGGER_NUMBER, -1) * - (setTimer(FRAME_PERIOD, -1)/(1E9))); - FILE_LOG(logDEBUG1, ("going to wait for %d s\n", wait_in_s)); - while(!virtual_stop && (wait_in_s >= 0)) { - usleep(1000 * 1000); - wait_in_s--; - } - FILE_LOG(logINFOGREEN, ("Virtual Timer Done\n")); + int64_t periodns = getPeriod(); + int numFrames = (getNumFrames() * + getNumTriggers() ); + int64_t exp_ns = getExpTime(); + int frameNr = 0; + // loop over number of frames + for(frameNr=0; frameNr!= numFrames; ++frameNr ) { + + //check if virtual_stop is high + if(virtual_stop == 1){ + break; + } + + // sleep for exposure time + struct timespec begin, end; + clock_gettime(CLOCK_REALTIME, &begin); + usleep(exp_ns / 1000); + clock_gettime(CLOCK_REALTIME, &end); + + // calculate time left in period + int64_t time_ns = ((end.tv_sec - begin.tv_sec) * 1E9 + + (end.tv_nsec - begin.tv_nsec)); + + // sleep for (period - exptime) + if (frameNr < numFrames) { // if there is a next frame + if (periodns > time_ns) { + usleep((periodns - time_ns)/ 1000); + } + } + + // set register frames left + } + + // set status to idle virtual_status = 0; + FILE_LOG(logINFOBLUE, ("Finished Acquiring\n")); return NULL; } #endif @@ -1839,6 +1801,7 @@ int stopStateMachine(){ bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STP_ACQSTN_MSK); FILE_LOG(logINFO, ("Status Register: %08x\n",bus_r(STATUS_REG))); + return OK; } @@ -1863,7 +1826,7 @@ enum runStatus getRunStatus(){ // error //if (retval & STATUS_SM_FF_FLL_MSK) { This bit is high when a analog fifo is full Or when external stop - if (retval & STATUS_ANY_FF_FLL_MSK) { // if adc fifo is full + if (retval & STATUS_ANY_FF_FLL_MSK) { // if adc or digital fifo is full FILE_LOG(logINFORED, ("Status: Error (Any fifo full)\n")); return ERROR; } @@ -1908,9 +1871,9 @@ void readandSendUDPFrames(int *ret, char *mess) { FILE_LOG(logDEBUG1, ("Reading from 1G UDP\n")); // validate udp socket - if (getUdPSocketDescriptor() <= 0) { + if (getUdPSocketDescriptor(0) <= 0) { *ret = FAIL; - sprintf(mess,"UDP Socket not created. sockfd:%d\n", getUdPSocketDescriptor()); + sprintf(mess,"UDP Socket not created. sockfd:%d\n", getUdPSocketDescriptor(0)); FILE_LOG(logERROR, (mess)); return; } @@ -1919,24 +1882,24 @@ void readandSendUDPFrames(int *ret, char *mess) { while(readFrameFromFifo() == OK) { int bytesToSend = 0, n = 0; while((bytesToSend = fillUDPPacket(udpPacketData))) { - n += sendUDPPacket(udpPacketData, bytesToSend); + n += sendUDPPacket(0, udpPacketData, bytesToSend); } if (n >= dataBytes) { FILE_LOG(logINFO, (" Frame %lld sent (%d packets, %d databytes, n:%d bytes sent)\n", udpFrameNumber, udpPacketNumber + 1, dataBytes, n)); } } - closeUDPSocket(); + closeUDPSocket(0); } - void readFrame(int *ret, char *mess) { #ifdef VIRTUAL - while(virtual_status) { - //FILE_LOG(logERROR, ("Waiting for finished flag\n"); - usleep(5000); - } + // wait for acquisition to be done + while(runBusy()){ + usleep(500); // random + } + FILE_LOG(logINFOGREEN, ("acquisition successfully finished\n")); return; #endif // 1G @@ -1954,76 +1917,84 @@ void readFrame(int *ret, char *mess) { // ret could be fail in 1gudp for not creating udp sockets if (*ret != FAIL) { // frames left to give status - int64_t retval = getTimeLeft(FRAME_NUMBER) + 2; + int64_t retval = getNumFramesLeft() + 2; if ( retval > 1) { - *ret = (int)FAIL; sprintf(mess,"No data and run stopped: %lld frames left\n",(long long int)retval); FILE_LOG(logERROR, (mess)); } else { - *ret = (int)OK; FILE_LOG(logINFOGREEN, ("Acquisition successfully finished\n")); } } + *ret = (int)OK; } void unsetFifoReadStrobes() { - bus_w(DUMMY_REG, bus_r(DUMMY_REG) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK)); + bus_w(DUMMY_REG, bus_r(DUMMY_REG) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK) & (~DUMMY_DGTL_FIFO_RD_STRBE_MSK)); } void readSample(int ns) { - uint32_t addr = DUMMY_REG; - // read analog data - uint32_t fifoAddr = FIFO_DATA_REG; + uint32_t addr = DUMMY_REG; - // read strobe to all analog fifos - bus_w(addr, bus_r(addr) | DUMMY_ANLG_FIFO_RD_STRBE_MSK); - bus_w(addr, bus_r(addr) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK)); - // wait as it is connected directly to fifo running on a different clock - //usleep(WAIT_TIME_FIFO_RD_STROBE); - if (!(ns%1000)) { - FILE_LOG(logDEBUG1, ("Reading sample ns:%d of %d AEmtpy:0x%x AFull:0x%x Status:0x%x\n", - ns, nSamples, bus_r(FIFO_EMPTY_REG), bus_r(FIFO_FULL_REG), bus_r(STATUS_REG))); - } + // read adcs + if (ns < nSamples) { - // loop through all channels - int ich = 0; - for (ich = 0; ich < NCHAN; ++ich) { + uint32_t fifoAddr = FIFO_DATA_REG; - // if channel is in ROI - if ((1 << ich) & ~(adcDisableMask)) { + // read strobe to all analog fifos + bus_w(addr, bus_r(addr) | DUMMY_ANLG_FIFO_RD_STRBE_MSK); + bus_w(addr, bus_r(addr) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK)); - // unselect channel - bus_w(addr, bus_r(addr) & ~(DUMMY_FIFO_CHNNL_SLCT_MSK)); + // wait for 1 us to latch different clocks of read and read strobe + { + int i = 0; + for (i = 0; i < WAIT_TIME_1US_FOR_LOOP_CNT; ++i) + ; + } - // select channel - bus_w(addr, bus_r(addr) | ((ich << DUMMY_FIFO_CHNNL_SLCT_OFST) & DUMMY_FIFO_CHNNL_SLCT_MSK)); + if (!(ns%1000)) { + FILE_LOG(logDEBUG1, ("Reading sample ns:%d of %d AEmtpy:0x%x AFull:0x%x Status:0x%x\n", + ns, nSamples, bus_r(FIFO_EMPTY_REG), bus_r(FIFO_FULL_REG), bus_r(STATUS_REG))); + } - // read fifo and write it to current position of data pointer - *((uint16_t*)now_ptr) = bus_r16(fifoAddr); + // loop through all channels + int ich = 0; + for (ich = 0; ich < NCHAN; ++ich) { - // keep reading till the value is the same - /* while (*((uint16_t*)now_ptr) != bus_r16(fifoAddr)) { - FILE_LOG(logDEBUG1, ("%d ", ich)); - *((uint16_t*)now_ptr) = bus_r16(fifoAddr); - }*/ + // if channel is in enable mask + if ((1 << ich) & (adcEnableMask_1g)) { - // increment pointer to data out destination - now_ptr += 2; + // unselect channel + bus_w(addr, bus_r(addr) & ~(DUMMY_FIFO_CHNNL_SLCT_MSK)); + + // select channel + bus_w(addr, bus_r(addr) | ((ich << DUMMY_FIFO_CHNNL_SLCT_OFST) & DUMMY_FIFO_CHNNL_SLCT_MSK)); + + // read fifo and write it to current position of data pointer + *((uint16_t*)analogDataPtr) = bus_r16(fifoAddr); + + // keep reading till the value is the same + /* while (*((uint16_t*)analogDataPtr) != bus_r16(fifoAddr)) { + FILE_LOG(logDEBUG1, ("%d ", ich)); + *((uint16_t*)analogDataPtr) = bus_r16(fifoAddr); + }*/ + + // increment pointer to data out destination + analogDataPtr += 2; + } } } - } uint32_t checkDataInFifo() { uint32_t dataPresent = 0; - uint32_t analogFifoEmpty = bus_r(FIFO_EMPTY_REG); - FILE_LOG(logDEBUG2, ("Analog Fifo Empty (32 channels): 0x%x\n",analogFifoEmpty)); - dataPresent = (~analogFifoEmpty); - FILE_LOG(logDEBUG2, ("Data in Fifo :0x%x\n", dataPresent)); + uint32_t fifoEmpty = bus_r(FIFO_EMPTY_REG); + FILE_LOG(logINFO, ("Analog Fifo Empty (32 channels): 0x%08x\n", fifoEmpty)); + dataPresent = (~fifoEmpty); + FILE_LOG(logDEBUG2, ("Data in Fifo :0x%x\n", dataPresent)); return dataPresent; } -// only called for first sample +// only called for starting of a new frame int checkFifoForEndOfAcquisition() { uint32_t dataPresent = checkDataInFifo(); FILE_LOG(logDEBUG2, ("status:0x%x\n", bus_r(STATUS_REG))); @@ -2053,11 +2024,10 @@ int checkFifoForEndOfAcquisition() { return OK; } - int readFrameFromFifo() { int ns = 0; // point the data pointer to the starting position of data - now_ptr = ramValues; + analogDataPtr = analogData; // no data for this frame if (checkFifoForEndOfAcquisition() == FAIL) { @@ -2066,7 +2036,6 @@ int readFrameFromFifo() { // read Sample while(ns < nSamples) { - // chceck if no data in fifo, return ns?//FIXME: ask Anna readSample(ns); ns++; } @@ -2075,7 +2044,6 @@ int readFrameFromFifo() { return OK; } - uint32_t runBusy() { #ifdef VIRTUAL return virtual_status; @@ -2098,7 +2066,7 @@ int calculateDataBytes(){ return dataBytes; } -int getTotalNumberOfChannels(){return ((int)getNumberOfChannelsPerChip() * (int)getNumberOfChips());} +int getTotalNumberOfChannels() {return (getNumberOfChannelsPerChip() * getNumberOfChips());} int getNumberOfChips(){return NCHIP;} int getNumberOfDACs(){return NDAC;} int getNumberOfChannelsPerChip(){return NCHAN;} diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h index c9b0247b9..2641a83d2 100755 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h @@ -4,27 +4,51 @@ #define MIN_REQRD_VRSN_T_RD_API 0x180314 -#define REQRD_FRMWR_VRSN 0x180314 +#define REQRD_FRMWR_VRSN 0x200302 -#define CTRL_SRVR_INIT_TIME_US (300 * 1000) +#define CTRL_SRVR_INIT_TIME_US (2 * 1000 * 1000) /* Struct Definitions */ -typedef struct ip_header_struct { - uint16_t ip_len; - uint8_t ip_tos; - uint8_t ip_ihl:4 ,ip_ver:4; - uint16_t ip_offset:13,ip_flag:3; - uint16_t ip_ident; - uint16_t ip_chksum; - uint8_t ip_protocol; - uint8_t ip_ttl; - uint32_t ip_sourceip; - uint32_t ip_destip; -} ip_header; +typedef struct udp_header_struct { + uint32_t udp_destmac_msb; + uint16_t udp_srcmac_msb; + uint16_t udp_destmac_lsb; + uint32_t udp_srcmac_lsb; + uint8_t ip_tos; + uint8_t ip_ihl: 4, ip_ver: 4; + uint16_t udp_ethertype; + uint16_t ip_identification; + uint16_t ip_totallength; + uint8_t ip_protocol; + uint8_t ip_ttl; + uint16_t ip_fragmentoffset: 13, ip_flags: 3; + uint16_t ip_srcip_msb; + uint16_t ip_checksum; + uint16_t ip_destip_msb; + uint16_t ip_srcip_lsb; + uint16_t udp_srcport; + uint16_t ip_destip_lsb; + uint16_t udp_checksum; + uint16_t udp_destport; +} udp_header; + +#define IP_HEADER_SIZE (20) +#define UDP_IP_HEADER_LENGTH_BYTES (28) /* Enums */ +enum DACINDEX {MO_VBP_COLBUF, MO_VIPRE, MO_VIN_CM, MO_VB_SDA, MO_VCASC_SFP, MO_VOUT_CM, MO_VIPRE_CDS, MO_IBIAS_SFP}; +#define DEFAULT_DAC_VALS { 1300, /* MO_VBP_COLBUF */ \ + 1000, /* MO_VIPRE */ \ + 1400, /* MO_VIN_CM */ \ + 680, /* MO_VB_SDA */ \ + 1428, /* MO_VCASC_SFP */ \ + 1200, /* MO_VOUT_CM */ \ + 800, /* MO_VIPRE_CDS */ \ + 900 /* MO_IBIAS_SFP */ \ + }; + enum CLKINDEX {RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS}; -enum DACINDEX {D0, D1, D2, D3, D4, D5, D6, D7}; +#define CLK_NAMES "run", "adc", "sync", "dbit" /* Hardware Definitions */ #define NCHAN (32) @@ -33,12 +57,13 @@ enum DACINDEX {D0, D1, D2, D3, D4, D5, D6, D7}; #define DYNAMIC_RANGE (16) #define NUM_BYTES_PER_PIXEL (DYNAMIC_RANGE / 8) #define CLK_FREQ (156.25) /* MHz */ +#define NSAMPLES_PER_ROW (25) /** Default Parameters */ #define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL) -#define DEFAULT_NUM_SAMPLES (1) +#define DEFAULT_NUM_SAMPLES (5000) #define DEFAULT_EXPTIME (0) -#define DEFAULT_NUM_FRAMES (100 * 1000 * 1000) +#define DEFAULT_NUM_FRAMES (1) #define DEFAULT_NUM_CYCLES (1) #define DEFAULT_PERIOD (1 * 1000 * 1000) //ns #define DEFAULT_DELAY (0) @@ -46,35 +71,37 @@ enum DACINDEX {D0, D1, D2, D3, D4, D5, D6, D7}; #define DEFAULT_VLIMIT (-100) #define DEFAULT_TIMING_MODE (AUTO_TIMING) #define DEFAULT_TX_UDP_PORT (0x7e9a) -#define DEFAULT_RUN_CLK (40) -#define DEFAULT_ADC_CLK (20) -#define DEFAULT_SYNC_CLK (20) -#define DEFAULT_DBIT_CLK (200) +#define DEFAULT_RUN_CLK (40) +#define DEFAULT_ADC_CLK (20) +#define DEFAULT_SYNC_CLK (20) +#define DEFAULT_DBIT_CLK (20) +#define DEFAULT_ADC_PHASE_DEG (30) +#define DEFAULT_PIPELINE (14) #define HIGHVOLTAGE_MIN (60) -#define HIGHVOLTAGE_MAX (200) +#define HIGHVOLTAGE_MAX (200) // min dac val #define DAC_MIN_MV (0) #define DAC_MAX_MV (2500) /* Defines in the Firmware */ -#define MAX_PATTERN_LENGTH (0x7FFF) +#define MAX_PATTERN_LENGTH (0x2000) #define DIGITAL_IO_DELAY_MAXIMUM_PS ((OUTPUT_DELAY_0_OTPT_STTNG_MSK >> OUTPUT_DELAY_0_OTPT_STTNG_OFST) * OUTPUT_DELAY_0_OTPT_STTNG_STEPS) #define MAX_PHASE_SHIFTS_STEPS (8) #define WAIT_TME_US_FR_ACQDONE_REG (100) // wait time in us after acquisition done to ensure there is no data in fifo #define WAIT_TIME_US_PLL (10 * 1000) #define WAIT_TIME_US_STP_ACQ (100) -#define WAIT_TIME_CONFIGURE_MAC (500 * 1000) +#define WAIT_TIME_CONFIGURE_MAC (2 * 1000 * 1000) #define WAIT_TIME_PATTERN_READ (10) -#define WAIT_TIME_FIFO_RD_STROBE (10) +#define WAIT_TIME_1US_FOR_LOOP_CNT (50) // around 30 is 1 us in blackfin /* MSB & LSB DEFINES */ #define MSB_OF_64_BIT_REG_OFST (32) #define LSB_OF_64_BIT_REG_OFST (0) -#define BIT_32_MSK (0xFFFFFFFF) +#define BIT32_MSK (0xFFFFFFFF) +#define BIT16_MASK (0xFFFF) -#define IP_PACKETSIZE (0x2032) -#define ADC_PORT_INVERT_VAL (0x453b2593) //FIXME: a default value? -#define MAXIMUM_ADC_CLK (40) +#define ADC_PORT_INVERT_VAL (0x4a342593) +#define MAXIMUM_ADC_CLK (20) #define PLL_VCO_FREQ_MHZ (800) diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index e0295aa1c..71696a9c7 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -3,6 +3,14 @@ #ifdef GOTTHARDD #include "clogger.h" // runState(enum TLogLevel) #endif +#ifndef VIRTUAL +#if defined(MYTHEN3D) || defined(GOTTHARD2D) +#include "programFpgaNios.h" +#elif defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) +#include "programFpgaBlackfin.h" +#endif +#endif + #include #include // FILE #include @@ -84,7 +92,7 @@ int updateDatabytesandAllocateRAM(); void updateDataBytes(); #endif -#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MYTHEN3D) +#if defined(GOTTHARDD) || defined(JUNGFRAUD) || defined(MYTHEN3D) || defined(MOENCHD) int setDefaultDacs(); #endif #ifdef GOTTHARD2D @@ -141,6 +149,8 @@ void setADCEnableMask_10G(uint32_t mask); uint32_t getADCEnableMask_10G(); void setADCInvertRegister(uint32_t val); uint32_t getADCInvertRegister(); +#endif +#if defined(CHIPTESTBOARDD) int setExternalSamplingSource(int val); int setExternalSampling(int val); #endif @@ -213,6 +223,8 @@ int64_t getStorageCellDelay(); #if defined(CHIPTESTBOARDD) || defined(MOENCHD) int setNumAnalogSamples(int val); int getNumAnalogSamples(); +#endif +#ifdef CHIPTESTBOARDD int setNumDigitalSamples(int val); int getNumDigitalSamples(); #endif @@ -298,11 +310,9 @@ void setPower(enum DACINDEX ind, int val); void powerOff(); #endif -#ifndef MOENCHD -#if !defined(MYTHEN3D) && !defined(GOTTHARD2D) +#if !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) int getADC(enum ADCINDEX ind); #endif -#endif int setHighVoltage(int val); @@ -358,6 +368,7 @@ int enableTenGigabitEthernet(int val); // moench specific - powerchip #ifdef MOENCHD int powerChip (int on); +int setAnalogOnlyReadout(); #endif // chip test board or moench specific - configure frequency, phase, pll, flashing firmware @@ -383,8 +394,10 @@ uint64_t writePatternWord(int addr, uint64_t word); int setPatternWaitAddress(int level, int addr); uint64_t setPatternWaitTime(int level, uint64_t t); void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop); +#ifdef CHIPTESTBOARDD int setLEDEnable(int enable); void setDigitalIODelay(uint64_t pinMask, int delay); +#endif void setPatternMask(uint64_t mask); uint64_t getPatternMask(); void setPatternBitMask(uint64_t mask); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 51170c764..42137d235 100755 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -2,13 +2,6 @@ #include "slsDetectorFunctionList.h" #include "communication_funcs.h" #include "clogger.h" -#ifndef VIRTUAL -#if defined(MYTHEN3D) || defined(GOTTHARD2D) -#include "programFpgaNios.h" -#elif defined(CHIPTESTBOARDD) || defined(JUNGFRAUD) || defined(MOENCHD) -#include "programFpgaBlackfin.h" -#endif -#endif #include #include @@ -928,10 +921,35 @@ int set_dac(int file_des) { case V_LIMIT: break; #elif MOENCHD + case VBP_COLBUF: + serverDacIndex = MO_VBP_COLBUF; + break; + case VIPRE: + serverDacIndex = MO_VIPRE; + break; + case VIN_CM: + serverDacIndex = MO_VIN_CM; + break; + case VB_SDA: + serverDacIndex = MO_VB_SDA; + break; + case VCASC_SFP: + serverDacIndex = MO_VCASC_SFP; + break; + case VOUT_CM: + serverDacIndex = MO_VOUT_CM; + break; + case VIPRE_CDS: + serverDacIndex = MO_VIPRE_CDS; + break; + case IBIAS_SFP: + serverDacIndex = MO_IBIAS_SFP; + break; case ADC_VPP: case HIGH_VOLTAGE: case V_LIMIT: break; + #elif MYTHEN3D case HIGH_VOLTAGE: break; @@ -1056,17 +1074,13 @@ int set_dac(int file_des) { serverDacIndex = J_VREF_COMP; break; #endif + default: #ifdef CHIPTESTBOARDD if (ind < NDAC_ONLY) { serverDacIndex = ind; break; } -#elif MOENCHD - if (ind < NDAC) { - serverDacIndex = ind; - break; - } #endif modeNotImplemented("Dac Index", (int)ind); break; @@ -1750,18 +1764,23 @@ int start_acquisition(int file_des) { FILE_LOG(logDEBUG1, ("Starting Acquisition\n")); // only set if (Server_VerifyLock() == OK) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) - int mode = getReadoutMode(); - int asamples = getNumAnalogSamples(); - int dsamples = getNumDigitalSamples(); - if ((mode == ANALOG_AND_DIGITAL || mode == ANALOG_ONLY) && (asamples <= 0)) { +#if defined(MOENCHD) + if (getNumAnalogSamples() <= 0) { ret = FAIL; - sprintf(mess, "Could not start acquisition. Invalid number of analog samples: %d.\n", asamples); + sprintf(mess, "Could not start acquisition. Invalid number of analog samples: %d.\n", getNumAnalogSamples()); FILE_LOG(logERROR,(mess)); } - else if ((mode == ANALOG_AND_DIGITAL || mode == DIGITAL_ONLY) && (dsamples <= 0)) { + else +#endif +#if defined(CHIPTESTBOARDD) + if ((getReadoutMode() == ANALOG_AND_DIGITAL || mode == ANALOG_ONLY) && (getNumAnalogSamples() <= 0)) { ret = FAIL; - sprintf(mess, "Could not start acquisition. Invalid number of digital samples: %d.\n", dsamples); + sprintf(mess, "Could not start acquisition. Invalid number of analog samples: %d.\n", getNumAnalogSamples()); + FILE_LOG(logERROR,(mess)); + } + else if ((getReadoutMode() == ANALOG_AND_DIGITAL || mode == DIGITAL_ONLY) && (getNumDigitalSamples() <= 0)) { + ret = FAIL; + sprintf(mess, "Could not start acquisition. Invalid number of digital samples: %d.\n", getNumDigitalSamples()); FILE_LOG(logERROR,(mess)); } else @@ -1880,18 +1899,23 @@ int start_and_read_all(int file_des) { FILE_LOG(logDEBUG1, ("Starting Acquisition\n")); // only set if (Server_VerifyLock() == OK) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) - int mode = getReadoutMode(); - int asamples = getNumAnalogSamples(); - int dsamples = getNumDigitalSamples(); - if ((mode == ANALOG_AND_DIGITAL || mode == ANALOG_ONLY) && (asamples <= 0)) { +#if defined(MOENCHD) + if (getNumAnalogSamples() <= 0) { ret = FAIL; - sprintf(mess, "Could not start acquisition. Invalid number of analog samples: %d.\n", asamples); + sprintf(mess, "Could not start acquisition. Invalid number of analog samples: %d.\n", getNumAnalogSamples()); FILE_LOG(logERROR,(mess)); } - else if ((mode == ANALOG_AND_DIGITAL || mode == DIGITAL_ONLY) && (dsamples <= 0)) { + else +#endif +#if defined(CHIPTESTBOARDD) + if ((getReadoutMode() == ANALOG_AND_DIGITAL || mode == ANALOG_ONLY) && (getNumAnalogSamples() <= 0)) { ret = FAIL; - sprintf(mess, "Could not start acquisition. Invalid number of digital samples: %d.\n", dsamples); + sprintf(mess, "Could not start acquisition. Invalid number of analog samples: %d.\n", getNumAnalogSamples()); + FILE_LOG(logERROR,(mess)); + } + else if ((getReadoutMode() == ANALOG_AND_DIGITAL || mode == DIGITAL_ONLY) && (getNumDigitalSamples() <= 0)) { + ret = FAIL; + sprintf(mess, "Could not start acquisition. Invalid number of digital samples: %d.\n", getNumDigitalSamples()); FILE_LOG(logERROR,(mess)); } else @@ -2102,14 +2126,23 @@ int set_num_analog_samples(int file_des) { #else // only set if (Server_VerifyLock() == OK) { - ret = setNumAnalogSamples(arg); - if (ret == FAIL) { - sprintf(mess, "Could not set number of analog samples to %d. Could not allocate RAM\n", arg); - FILE_LOG(logERROR,(mess)); - } else { - int retval = getNumAnalogSamples(); - FILE_LOG(logDEBUG1, ("retval num analog samples %d\n", retval)); - validate(arg, retval, "set number of analog samples", DEC); +#ifdef MOENCHD + if (arg % NSAMPLES_PER_ROW != 0) { + ret = FAIL; + sprintf(mess, "Could not set number of analog samples to %d. Must be divisible by %d\n", arg, NSAMPLES_PER_ROW); + FILE_LOG(logERROR,(mess)); + } +#endif + if (ret == OK) { + ret = setNumAnalogSamples(arg); + if (ret == FAIL) { + sprintf(mess, "Could not set number of analog samples to %d. Could not allocate RAM\n", arg); + FILE_LOG(logERROR,(mess)); + } else { + int retval = getNumAnalogSamples(); + FILE_LOG(logDEBUG1, ("retval num analog samples %d\n", retval)); + validate(arg, retval, "set number of analog samples", DEC); + } } } #endif @@ -2121,7 +2154,7 @@ int get_num_digital_samples(int file_des) { memset(mess, 0, sizeof(mess)); int retval = -1; -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) functionNotImplemented(); #else // get only @@ -2140,7 +2173,7 @@ int set_num_digital_samples(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting number of digital samples %d\n", arg)); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) functionNotImplemented(); #else // only set @@ -2856,10 +2889,16 @@ int send_update(int file_des) { #endif #if defined(CHIPTESTBOARDD) || defined(MOENCHD) + // analog samples + i32 = getNumAnalogSamples(); + n = sendData(file_des,&i32,sizeof(i32),INT32); + if (n < 0) return printSocketReadError(); + // 1g adcmask i32 = getADCEnableMask(); n = sendData(file_des,&i32,sizeof(i32),INT32); if (n < 0) return printSocketReadError(); + // 10g adc mask i32 = getADCEnableMask_10G(); n = sendData(file_des,&i32,sizeof(i32),INT32); @@ -4237,7 +4276,7 @@ int led(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting led enable to %d\n", arg)); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if (!defined(CHIPTESTBOARDD)) functionNotImplemented(); #else // set & get @@ -4262,7 +4301,7 @@ int digital_io_delay(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Digital IO Delay, pinMask: 0x%llx, delay:%d ps\n", args[0], (int)args[1])); -#if (!defined(MOENCHD)) && (!defined(CHIPTESTBOARDD)) +#if (!defined(CHIPTESTBOARDD)) functionNotImplemented(); #else // only set @@ -6169,9 +6208,11 @@ int set_pipeline(int file_des) { case ADC_CLOCK: c = ADC_CLK; break; +#ifdef CHIPTESTBOARDD case DBIT_CLOCK: c = DBIT_CLK; break; +#endif default: modeNotImplemented("clock index (pipeline set)", ind); break; diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index eab4b6f9c..ce8128602 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -155,32 +155,32 @@ class Detector { void setPeriod(ns t, Positions pos = {}); - /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3][Gotthard2] */ Result getDelayAfterTrigger(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3][Gotthard2] */ void setDelayAfterTrigger(ns value, Positions pos = {}); - /** [Gotthard][Jungfrau][CTB][Mythen3] + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3] * [Gotthard2] only in continuous mode */ Result getNumberOfFramesLeft(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Mythen3] + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3] * [Gotthard2] only in continuous mode */ Result getNumberOfTriggersLeft(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Mythen3] + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3] * [Gotthard2] only in continuous mode */ Result getPeriodLeft(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB][Mythen3] + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3] * [Gotthard2] only in continuous mode */ Result getDelayAfterTriggerLeft(Positions pos = {}) const; Result getTimingMode(Positions pos = {}) const; /** - * [Gotthard][Jungfrau][CTB] Options: AUTO_TIMING, TRIGGER_EXPOSURE + * [Gotthard][Jungfrau][CTB][Moench] Options: AUTO_TIMING, TRIGGER_EXPOSURE * [Eiger] Options: AUTO_TIMING, TRIGGER_EXPOSURE, GATED, BURST_TRIGGER */ void setTimingMode(defs::timingMode value, Positions pos = {}); @@ -192,19 +192,19 @@ class Detector { * Options: FULL_SPEED, HALF_SPEED, QUARTER_SPEED */ void setSpeed(defs::speedLevel value, Positions pos = {}); - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Moench] */ Result getADCPhase(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Moench] */ void setADCPhase(int value, Positions pos = {}); - /** [Jungfrau][CTB] */ + /** [Jungfrau][CTB][Moench] */ Result getMaxADCPhaseShift(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Moench] */ Result getADCPhaseInDegrees(Positions pos = {}) const; - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Moench] */ void setADCPhaseInDegrees(int value, Positions pos = {}); /** [Mythen3][Gotthard2] Hz */ @@ -244,7 +244,7 @@ class Detector { /** * [Gotthard] Options: 0, 90, 110, 120, 150, 180, 200 - * [Jungfrau], CTB Options: 0, 60 - 200 + * [Jungfrau][CTB][Moench] Options: 0, 60 - 200 * [Eiger][Mythen3][Gotthard2] Options: 0 - 200 */ void setHighVoltage(int value, Positions pos = {}); @@ -415,10 +415,10 @@ class Detector { Result printRxConfiguration(Positions pos = {}) const; - /** [Eiger][CTB] */ + /** [Eiger][CTB][Moench] */ Result getTenGiga(Positions pos = {}) const; - /** [Eiger][CTB] */ + /** [Eiger][CTB][Moench] */ void setTenGiga(bool value, Positions pos = {}); /** [Eiger, Jungfrau] */ @@ -954,18 +954,67 @@ class Detector { /** [Mythen3] countermask bit set for each counter enabled */ void setCounterMask(uint32_t countermask, Positions pos = {}); + /************************************************** + * * + * CTB / Moench Specific * + * * + * ************************************************/ + /** [CTB][Moench] */ + Result getNumberOfAnalogSamples(Positions pos = {}) const; + + /** [CTB][Moench] */ + void setNumberOfAnalogSamples(int value, Positions pos = {}); + + /** [CTB][Moench] */ + Result getADCClock(Positions pos = {}) const; + + /** [CTB][Moench] */ + void setADCClock(int value_in_MHz, Positions pos = {}); + + /** [CTB][Moench] */ + Result getRUNClock(Positions pos = {}) const; + + /** [CTB][Moench] */ + void setRUNClock(int value_in_MHz, Positions pos = {}); + + /** [CTB][Moench] */ + Result getSYNCClock(Positions pos = {}) const; + + /** [CTB][Moench] */ + Result getADCPipeline(Positions pos = {}) const; + + /** [CTB][Moench] */ + void setADCPipeline(int value, Positions pos = {}); + + /** [CTB][Moench] */ + Result getVoltage(defs::dacIndex index, Positions pos = {}) const; + + /** + * [CTB][Moench] mV + * [Ctb] Options: V_LIMIT, V_POWER_A, V_POWER_B, V_POWER_C, + * V_POWER_D, V_POWER_IO, V_POWER_CHIP + * [Moench] Options: V_LIMIT + */ + void setVoltage(defs::dacIndex index, int value, Positions pos = {}); + + /** [CTB][Moench] */ + Result getADCEnableMask(Positions pos = {}) const; + + /** [CTB][Moench] */ + void setADCEnableMask(uint32_t mask, Positions pos = {}); + + /** [CTB][Moench] */ + Result getTenGigaADCEnableMask(Positions pos = {}) const; + + /** [CTB][Moench] */ + void setTenGigaADCEnableMask(uint32_t mask, Positions pos = {}); + /************************************************** * * * CTB Specific * * * * ************************************************/ - /** [CTB] */ - Result getNumberOfAnalogSamples(Positions pos = {}) const; - - /** [CTB] */ - void setNumberOfAnalogSamples(int value, Positions pos = {}); - /** [CTB] */ Result getNumberOfDigitalSamples(Positions pos = {}) const; @@ -978,6 +1027,12 @@ class Detector { /** [CTB] Options: ANALOG_ONLY = 0, DIGITAL_ONLY = 1, ANALOG_AND_DIGITAL */ void setReadoutMode(defs::readoutMode value, Positions pos = {}); + /** [CTB] */ + Result getDBITClock(Positions pos = {}) const; + + /** [CTB] */ + void setDBITClock(int value_in_MHz, Positions pos = {}); + /** [CTB] */ Result getDBITPhase(Positions pos = {}) const; @@ -993,49 +1048,12 @@ class Detector { /** [CTB] */ void setDBITPhaseInDegrees(int value, Positions pos = {}); - /** [CTB] */ - Result getADCClock(Positions pos = {}) const; - - /** [CTB] */ - void setADCClock(int value_in_MHz, Positions pos = {}); - - /** [CTB] */ - Result getDBITClock(Positions pos = {}) const; - - /** [CTB] */ - void setDBITClock(int value_in_MHz, Positions pos = {}); - - /** [CTB] */ - Result getRUNClock(Positions pos = {}) const; - - /** [CTB] */ - void setRUNClock(int value_in_MHz, Positions pos = {}); - - /** [CTB] */ - Result getSYNCClock(Positions pos = {}) const; - - /** [CTB] */ - Result getADCPipeline(Positions pos = {}) const; - - /** [CTB] */ - void setADCPipeline(int value, Positions pos = {}); - /** [CTB] */ Result getDBITPipeline(Positions pos = {}) const; /** [CTB] */ void setDBITPipeline(int value, Positions pos = {}); - /** [CTB] */ - Result getVoltage(defs::dacIndex index, Positions pos = {}) const; - - /** - * [CTB] mV - * Options: V_LIMIT, V_POWER_A, V_POWER_B, V_POWER_C, - * V_POWER_D, V_POWER_IO, V_POWER_CHIP - */ - void setVoltage(defs::dacIndex index, int value, Positions pos = {}); - /** * [CTB] mV * Options: V_POWER_A, V_POWER_B, V_POWER_C, V_POWER_D, V_POWER_IO */ @@ -1051,24 +1069,6 @@ class Detector { /** [CTB] Options: SLOW_ADC0 - SLOW_ADC7 in uV */ Result getSlowADC(defs::dacIndex index, Positions pos = {}) const; - /** [CTB]*/ - Result getADCEnableMask(Positions pos = {}) const; - - /** [CTB]*/ - void setADCEnableMask(uint32_t mask, Positions pos = {}); - - /** [CTB]*/ - Result getTenGigaADCEnableMask(Positions pos = {}) const; - - /** [CTB]*/ - void setTenGigaADCEnableMask(uint32_t mask, Positions pos = {}); - - /** [CTB] */ - Result getADCInvert(Positions pos = {}) const; - - /** [CTB]*/ - void setADCInvert(uint32_t value, Positions pos = {}); - /** [CTB] */ Result getExternalSamplingSource(Positions pos = {}) const; @@ -1113,72 +1113,71 @@ class Detector { * * * ************************************************/ - /** [CTB] */ + /** [CTB][Moench][Mythen3] */ void setPattern(const std::string &fname, Positions pos = {}); - /** [CTB] */ + /** [CTB][Moench][Mythen3] */ void savePattern(const std::string &fname); - /** [CTB] */ + /** [CTB][Moench][Mythen3] */ Result getPatternIOControl(Positions pos = {}) const; - /** [CTB] */ + /** [CTB][Moench][Mythen3] */ void setPatternIOControl(uint64_t word, Positions pos = {}); - /** [CTB] */ + /** [CTB][Moench][Mythen3] */ Result getPatternClockControl(Positions pos = {}) const; - /** [CTB] */ + /** [CTB][Moench][Mythen3] */ void setPatternClockControl(uint64_t word, Positions pos = {}); - /** [CTB] same as executing - * [Mythen3] */ + /** [CTB][Moench][Mythen3] same as executing for ctb and moench */ Result getPatternWord(int addr, Positions pos = {}); /** [CTB] Caution: If word is -1 reads the addr (same as * executing the pattern) - * [Mythen3] */ + * [Mythen3][Moench] */ void setPatternWord(int addr, uint64_t word, Positions pos = {}); - /**[CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 levels + /**[CTB][Moench][Mythen3] Options: level: -1 (complete pattern) and 0-2 levels * @returns array of start address and stop address */ Result> getPatternLoopAddresses(int level, Positions pos = {}) const; - /** [CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 levels */ + /** [CTB][Moench][Mythen3] Options: level: -1 (complete pattern) and 0-2 levels */ void setPatternLoopAddresses(int level, int start, int stop, Positions pos = {}); - /**[CTB][Mythen3] Options: level: -1 (complete pattern) and 0-2 levels + /**[CTB][Moench][Mythen3] Options: level: -1 (complete pattern) and 0-2 levels * @returns number of loops */ Result getPatternLoopCycles(int level, Positions pos = {}) const; - /** [CTB][Mythen3] n: 0-2, level: -1 (complete pattern) and 0-2 levels */ + /** [CTB][Moench][Mythen3] n: 0-2, level: -1 (complete pattern) and 0-2 levels */ void setPatternLoopCycles(int level, int n, Positions pos = {}); - /* [CTB][Mythen3] */ + /* [CTB][Moench][Mythen3] */ Result getPatternWaitAddr(int level, Positions pos = {}) const; - /** [CTB][Mythen3] Options: level 0-2 */ + /** [CTB][Moench][Mythen3] Options: level 0-2 */ void setPatternWaitAddr(int level, int addr, Positions pos = {}); - /** [CTB][Mythen3] */ + /** [CTB][Moench][Mythen3] */ Result getPatternWaitTime(int level, Positions pos = {}) const; - /** [CTB][Mythen3] Options: level 0-2 */ + /** [CTB][Moench][Mythen3] Options: level 0-2 */ void setPatternWaitTime(int level, uint64_t t, Positions pos = {}); - /** [CTB][Mythen3] */ + /** [CTB][Moench][Mythen3] */ Result getPatternMask(Positions pos = {}); - /** [CTB][Mythen3] Sets the mask applied to every pattern to the selected bit mask */ + /** [CTB][Moench][Mythen3] Sets the mask applied to every pattern to the selected bit mask */ void setPatternMask(uint64_t mask, Positions pos = {}); - /** [CTB][Mythen3] */ + /** [CTB][Moench][Mythen3] */ Result getPatternBitMask(Positions pos = {}) const; - /** [CTB][Mythen3] Sets the bitmask that the mask will be applied to for every + /** [CTB][Moench][Mythen3] Sets the bitmask that the mask will be applied to for every * pattern */ void setPatternBitMask(uint64_t mask, Positions pos = {}); @@ -1238,26 +1237,26 @@ class Detector { * * * ************************************************/ - /** [Jungfrau][CTB] fname is a pof file + /** [Jungfrau][CTB][Moench] fname is a pof file * [Mythen3][Gotthard2] fname is an rbf file */ void programFPGA(const std::string &fname, Positions pos = {}); - /** [Jungfrau][CTB] */ + /** [Jungfrau][CTB][Moench] */ void resetFPGA(Positions pos = {}); - /** [Jungfrau][Gotthard][CTB] + /** [Jungfrau][Gotthard][CTB][Moench] * Copy detector server fname from tftp folder of hostname to detector * Also changes respawn server, which is effective after a reboot. */ void copyDetectorServer(const std::string &fname, const std::string &hostname, Positions pos = {}); - /** [Jungfrau][Gotthard][CTB][Mythen3][Gotthard2] */ + /** [Jungfrau][Gotthard][CTB][Moench][Mythen3][Gotthard2] */ void rebootController(Positions pos = {}); /** - * [Jungfrau][Gotthard][CTB] + * [Jungfrau][Gotthard][CTB][Moench] * Updates the firmware, detector server and then reboots detector * controller blackfin. * @param sname name of detector server binary found on tftp folder of host @@ -1278,13 +1277,13 @@ class Detector { void clearBit(uint32_t addr, int bitnr, Positions pos = {}); - /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] */ + /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] */ void executeFirmwareTest(Positions pos = {}); - /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] */ + /** [Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] */ void executeBusTest(Positions pos = {}); - /** [Gotthard][Jungfrau][CTB] not possible to read back*/ + /** [Gotthard][Jungfrau][CTB][Moench] not possible to read back*/ void writeAdcRegister(uint32_t addr, uint32_t value, Positions pos = {}); bool getInitialChecks() const; @@ -1293,6 +1292,12 @@ class Detector { * default enabled */ void setInitialChecks(const bool value); + /** [CTB][Moench][Jungfrau] */ + Result getADCInvert(Positions pos = {}) const; + + /** [CTB][Moench][Jungfrau] */ + void setADCInvert(uint32_t value, Positions pos = {}); + /************************************************** * * * Insignificant * @@ -1321,15 +1326,15 @@ class Detector { /** Execute a command on the detector server console */ void executeCommand(const std::string &value, Positions pos = {}); - /** [Jungfrau][Mythen3][CTB] + /** [Jungfrau][Mythen3][CTB][Moench] * [Gotthard2] only in continuous mode */ Result getNumberOfFramesFromStart(Positions pos = {}) const; - /** [Jungfrau][Mythen3][CTB] Get time from detector start + /** [Jungfrau][Mythen3][CTB][Moench] Get time from detector start * [Gotthard2] only in continuous mode */ Result getActualTime(Positions pos = {}) const; - /** [Jungfrau][Mythen3][CTB] Get timestamp at a frame start + /** [Jungfrau][Mythen3][CTB][Moench] Get timestamp at a frame start * [Gotthard2] only in continuous mode */ Result getMeasurementTime(Positions pos = {}) const; diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 0d72860f4..add741892 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -395,10 +395,10 @@ std::string CmdProxy::Adcphase(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[n_value] [(optional)deg]\n\t[Jungfrau][Ctb][Gotthard] Phase " + os << "[n_value] [(optional)deg]\n\t[Jungfrau][Ctb][Moench][Moench][Gotthard] Phase " "shift of ADC clock. \n\t[Jungfrau] Absolute phase shift. If deg " "used, then shift in degrees. Changing Speed also resets " - "adcphase to recommended defaults.\n\t[Ctb] Absolute phase " + "adcphase to recommended defaults.\n\t[Ctb][Moench] Absolute phase " "shift. If deg used, then shift in degrees. Changing adcclk also " "resets adcphase and sets it to previous values.\n\t[Gotthard] " "Relative phase shift" @@ -588,8 +588,10 @@ std::string CmdProxy::Dac(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[dac index] [dac or mv value] [(optional unit) mv] " - "\n\t[Ctb][Jungfrau] Dac." + "\n\t[Ctb] Dac." << '\n'; + } else if (det->getDetectorType().squash(defs::GENERIC) != defs::CHIPTESTBOARD) { + throw sls::RuntimeError("Dac command can only be used for chip test board. Use daclist to get list of dac commands for current detector."); } else if (action == defs::GET_ACTION) { bool mv = false; if (args.size() == 2) { @@ -707,6 +709,11 @@ std::vector CmdProxy::DacCommands() { "vth1", "vicin", "vcas", "vpreamp", "vpl", "vipre", "viinsh", "vph", "vtrim", "vdcsh"}; break; + case defs::MOENCH: + return std::vector{"vbp_colbuf", "vipre", "vin_cm", + "vb_sda", "vcasc_sfp", "vout_cm", + "vipre_cds", "ibias_sfp"}; + break; case defs::CHIPTESTBOARD: return std::vector{ "dac 0", "dac 1", "dac 2", "dac 3", "dac 4", "dac 5", @@ -1316,26 +1323,29 @@ std::string CmdProxy::Counters(int action) { return os.str(); } -/* CTB Specific */ +/* CTB / Moench Specific */ std::string CmdProxy::Samples(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[n_samples]\n\t[CTB] Number of samples (both analog and " - "digitial) expected." + "digitial) expected.\n\t[Moench] Number of samples (analog only)" << '\n'; } else if (action == defs::GET_ACTION) { if (!args.empty()) { WrongNumberOfParameters(0); } auto a = det->getNumberOfAnalogSamples({det_id}); - auto d = det->getNumberOfDigitalSamples({det_id}); - int as = a.squash(-1); - int ds = d.squash(-1); - if (as == -1 || ds == -1 || as != ds) { // check if a == d? - throw sls::RuntimeError( + // get also digital samples for ctb and compare with analog + if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + auto d = det->getNumberOfDigitalSamples({det_id}); + int as = a.squash(-1); + int ds = d.squash(-1); + if (as == -1 || ds == -1 || as != ds) { // check if a == d? + throw sls::RuntimeError( "Different samples. Use asamples or dsamples."); + } } os << OutString(a) << '\n'; } else if (action == defs::PUT_ACTION) { @@ -1343,7 +1353,10 @@ std::string CmdProxy::Samples(int action) { WrongNumberOfParameters(1); } det->setNumberOfAnalogSamples(std::stoi(args[0]), {det_id}); - det->setNumberOfDigitalSamples(std::stoi(args[0]), {det_id}); + // set also digital samples for ctb + if (det->getDetectorType().squash() == defs::CHIPTESTBOARD) { + det->setNumberOfDigitalSamples(std::stoi(args[0]), {det_id}); + } os << args.front() << '\n'; } else { throw sls::RuntimeError("Unknown action"); @@ -1351,6 +1364,8 @@ std::string CmdProxy::Samples(int action) { return os.str(); } +/* CTB Specific */ + std::string CmdProxy::Dbitphase(int action) { std::ostringstream os; os << cmd << ' '; @@ -1499,7 +1514,7 @@ std::string CmdProxy::Pattern(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[fname]\n\t[Mythen3][Ctb] Loads binary pattern file with only pattern " + os << "[fname]\n\t[Mythen3][Moench][Ctb][Moench] Loads binary pattern file with only pattern " "words" << '\n'; } else if (action == defs::GET_ACTION) { @@ -1520,7 +1535,7 @@ std::string CmdProxy::PatternWord(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[step or address] [64 bit mask]\n\t[Ctb][Mythen3] 64 bit pattern at " + os << "[step or address] [64 bit mask]\n\t[Ctb][Moench][Mythen3] 64 bit pattern at " "address of pattern memory." << '\n'; } else if (action == defs::GET_ACTION) { @@ -1546,17 +1561,17 @@ std::string CmdProxy::PatternLoopAddresses(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patlimits") { - os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of complete " + os << "[start addr] [stop addr] \n\t[Ctb][Moench][Mythen3] Limits of complete " "pattern." << '\n'; } else if (cmd == "patloop0") { - os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of loop 0." + os << "[start addr] [stop addr] \n\t[Ctb][Moench][Mythen3] Limits of loop 0." << '\n'; } else if (cmd == "patloop1") { - os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of loop 1." + os << "[start addr] [stop addr] \n\t[Ctb][Moench][Mythen3] Limits of loop 1." << '\n'; } else if (cmd == "patloop2") { - os << "[start addr] [stop addr] \n\t[Ctb][Mythen3] Limits of loop 2." + os << "[start addr] [stop addr] \n\t[Ctb][Moench][Mythen3] Limits of loop 2." << '\n'; } else { throw sls::RuntimeError( @@ -1601,11 +1616,11 @@ std::string CmdProxy::PatternLoopCycles(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patnloop0") { - os << "[n_cycles] \n\t[Ctb][Mythen3] Number of cycles of loop 0." << '\n'; + os << "[n_cycles] \n\t[Ctb][Moench][Mythen3] Number of cycles of loop 0." << '\n'; } else if (cmd == "patnloop1") { - os << "[n_cycles] \n\t[Ctb][Mythen3] Number of cycles of loop 1." << '\n'; + os << "[n_cycles] \n\t[Ctb][Moench][Mythen3] Number of cycles of loop 1." << '\n'; } else if (cmd == "patnloop2") { - os << "[n_cycles] \n\t[Ctb][Mythen3] Number of cycles of loop 2." << '\n'; + os << "[n_cycles] \n\t[Ctb][Moench][Mythen3] Number of cycles of loop 2." << '\n'; } else { throw sls::RuntimeError( "Unknown command, use list to list all commands"); @@ -1646,11 +1661,11 @@ std::string CmdProxy::PatternWaitAddress(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patwait0") { - os << "[addr] \n\t[Ctb][Mythen3] Wait 0 address." << '\n'; + os << "[addr] \n\t[Ctb][Moench][Mythen3] Wait 0 address." << '\n'; } else if (cmd == "patwait1") { - os << "[addr] \n\t[Ctb][Mythen3] Wait 1 address." << '\n'; + os << "[addr] \n\t[Ctb][Moench][Mythen3] Wait 1 address." << '\n'; } else if (cmd == "patwait2") { - os << "[addr] \n\t[Ctb][Mythen3] Wait 2 address." << '\n'; + os << "[addr] \n\t[Ctb][Moench][Mythen3] Wait 2 address." << '\n'; } else { throw sls::RuntimeError( "Unknown command, use list to list all commands"); @@ -1691,11 +1706,11 @@ std::string CmdProxy::PatternWaitTime(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { if (cmd == "patwaittime0") { - os << "[n_clk] \n\t[Ctb][Mythen3] Wait 0 time in clock cycles." << '\n'; + os << "[n_clk] \n\t[Ctb][Moench][Mythen3] Wait 0 time in clock cycles." << '\n'; } else if (cmd == "patwaittime1") { - os << "[n_clk] \n\t[Ctb][Mythen3] Wait 1 time in clock cycles." << '\n'; + os << "[n_clk] \n\t[Ctb][Moench][Mythen3] Wait 1 time in clock cycles." << '\n'; } else if (cmd == "patwaittime2") { - os << "[n_clk] \n\t[Ctb][Mythen3] Wait 2 time in clock cycles." << '\n'; + os << "[n_clk] \n\t[Ctb][Moench][Mythen3] Wait 2 time in clock cycles." << '\n'; } else { throw sls::RuntimeError( "Unknown command, use list to list all commands"); @@ -1811,7 +1826,7 @@ std::string CmdProxy::ProgramFpga(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[fname.pof | fname.rbf]\n\t[Jungfrau][Ctb] Programs FPGA from pof file." + os << "[fname.pof | fname.rbf]\n\t[Jungfrau][Ctb][Moench] Programs FPGA from pof file." << "\n\t[Mythen3][Gotthard2] Programs FPGA from rbf file." << '\n'; } else if (action == defs::GET_ACTION) { @@ -1832,7 +1847,7 @@ std::string CmdProxy::CopyDetectorServer(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[server_name] [pc_host_name]\n\t[Jungfrau][Ctb] Copies detector " + os << "[server_name] [pc_host_name]\n\t[Jungfrau][Ctb][Moench] Copies detector " "server via tftp from pc and changes respawn server name in " "/etc/inittab of detector." << '\n'; @@ -1854,7 +1869,7 @@ std::string CmdProxy::UpdateFirmwareAndDetectorServer(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[server_name] [pc_host_name] [fname.pof]\n\t[Jungfrau][Ctb] " + os << "[server_name] [pc_host_name] [fname.pof]\n\t[Jungfrau][Ctb][Moench] " "Updates detector server via tftp from pc, updates firmware to " "pof file and then reboots controller (blackfin)." << '\n'; @@ -1904,7 +1919,7 @@ std::string CmdProxy::AdcRegister(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[address] [value]\n\t[Jungfrau][Ctb][Gotthard] Writes to an adc " + os << "[address] [value]\n\t[Jungfrau][Ctb][Moench][Gotthard] Writes to an adc " "register in hex." << '\n'; } else if (action == defs::GET_ACTION) { diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index 1a5adeca4..d5d072df0 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -666,6 +666,12 @@ class CmdProxy { {"vb_pixbuf", &CmdProxy::vb_pixbuf}, {"vin_com", &CmdProxy::vin_com}, {"vdd_prot", &CmdProxy::vdd_prot}, + {"vbp_colbuf", &CmdProxy::vbp_colbuf}, + {"vb_sda", &CmdProxy::vb_sda}, + {"vcasc_sfp", &CmdProxy::vcasc_sfp}, + {"vipre_cds", &CmdProxy::vipre_cds}, + {"ibias_sfp", &CmdProxy::ibias_sfp}, + {"dac", &CmdProxy::Dac}, {"daclist", &CmdProxy::DacList}, @@ -796,20 +802,24 @@ class CmdProxy { /* Mythen3 Specific */ {"counters", &CmdProxy::Counters}, - /* CTB Specific */ + /* CTB/ Moench Specific */ {"samples", &CmdProxy::Samples}, {"asamples", &CmdProxy::asamples}, - {"dsamples", &CmdProxy::dsamples}, - {"romode", &CmdProxy::romode}, - {"dbitphase", &CmdProxy::Dbitphase}, - {"maxdbitphaseshift", &CmdProxy::maxdbitphaseshift}, {"adcclk", &CmdProxy::adcclk}, - {"dbitclk", &CmdProxy::dbitclk}, {"runclk", &CmdProxy::runclk}, {"syncclk", &CmdProxy::syncclk}, {"adcpipeline", &CmdProxy::adcpipeline}, - {"dbitpipeline", &CmdProxy::dbitpipeline}, {"v_limit", &CmdProxy::v_limit}, + {"adcenable", &CmdProxy::adcenable}, + {"adcenable10g", &CmdProxy::adcenable10g}, + + /* CTB Specific */ + {"dsamples", &CmdProxy::dsamples}, + {"romode", &CmdProxy::romode}, + {"dbitclk", &CmdProxy::dbitclk}, + {"dbitphase", &CmdProxy::Dbitphase}, + {"maxdbitphaseshift", &CmdProxy::maxdbitphaseshift}, + {"dbitpipeline", &CmdProxy::dbitpipeline}, {"v_a", &CmdProxy::v_a}, {"v_b", &CmdProxy::v_b}, {"v_c", &CmdProxy::v_c}, @@ -827,9 +837,6 @@ class CmdProxy { {"im_d", &CmdProxy::im_d}, {"im_io", &CmdProxy::im_io}, {"adc", &CmdProxy::SlowAdc}, - {"adcenable", &CmdProxy::adcenable}, - {"adcenable10g", &CmdProxy::adcenable10g}, - {"adcinvert", &CmdProxy::adcinvert}, {"extsampling", &CmdProxy::extsampling}, {"extsamplingsrc", &CmdProxy::extsamplingsrc}, {"rx_dbitlist", &CmdProxy::ReceiverDbitList}, @@ -881,6 +888,7 @@ class CmdProxy { {"firmwaretest", &CmdProxy::firmwaretest}, {"bustest", &CmdProxy::bustest}, {"initialchecks", &CmdProxy::InitialChecks}, + {"adcinvert", &CmdProxy::adcinvert}, /* Insignificant */ {"port", &CmdProxy::port}, @@ -955,8 +963,9 @@ class CmdProxy { std::string BurstMode(int action); /* Mythen3 Specific */ std::string Counters(int action); - /* CTB Specific */ + /* CTB/ Moench Specific */ std::string Samples(int action); + /* CTB Specific */ std::string Dbitphase(int action); std::string SlowAdc(int action); std::string ReceiverDbitList(int action); @@ -1034,38 +1043,38 @@ class CmdProxy { "\n\t[Gotthard2] Uploaded to detector just before acquisition starts"); TIME_COMMAND(delay, getDelayAfterTrigger, setDelayAfterTrigger, - "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] Delay after trigger"); + "[duration] [(optional unit) ns|us|ms|s]\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb][Moench] Delay after trigger"); TIME_COMMAND(burstperiod, getBurstPeriod, setBurstPeriod, "[duration] [(optional unit) ns|us|ms|s]\n\t[Gotthard2] Burst period. Only in burst mode and auto timing mode."); GET_COMMAND(framesl, getNumberOfFramesLeft, - "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] Number of frames left in acquisition." + "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] Number of frames left in acquisition." "\n\t[Gotthard2] only in continuous mode."); GET_COMMAND(triggersl, getNumberOfTriggersLeft, - "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] Number of triggers left in acquisition." + "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] Number of triggers left in acquisition." "\n\t[Gotthard2] only in continuous mode."); TIME_GET_COMMAND(delayl, getDelayAfterTriggerLeft, - "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] DelayLeft Delay Left in Acquisition." + "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] DelayLeft Delay Left in Acquisition." "\n\t[Gotthard2] only in continuous mode."); TIME_GET_COMMAND(periodl, getPeriodLeft, - "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB] Period left for current frame." + "\n\t[Gotthard][Jungfrau][Mythen3][Gotthard2][CTB][Moench] Period left for current frame." "\n\t[Gotthard2] only in continuous mode."); INTEGER_COMMAND(timing, getTimingMode, setTimingMode, sls::StringTo, - "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] [auto|trigger]\n\t[Eiger] [auto|trigger|gating|burst_trigger]"); + "[auto|trigger|gating|burst_trigger]\n\tTiming Mode of detector.\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb][Moench] [auto|trigger]\n\t[Eiger] [auto|trigger|gating|burst_trigger]"); GET_COMMAND(maxadcphaseshift, getMaxADCPhaseShift, - "\n\t[Jungfrau][CTB] Absolute maximum Phase shift of ADC clock."); + "\n\t[Jungfrau][CTB][Moench] Absolute maximum Phase shift of ADC clock."); INTEGER_COMMAND(vhighvoltage, getHighVoltage, setHighVoltage, std::stoi, "[n_value]\n\tHigh voltage to the sensor in Voltage." "\n\t[Gotthard] [0|90|110|120|150|180|200]" "\n\t[Eiger][Mythen3][Gotthard2] 0-200" - "\n\t[Jungfrau][Ctb] [0|60-200]"); + "\n\t[Jungfrau][Ctb][Moench] [0|60-200]"); INTEGER_COMMAND(powerchip, getPowerChip, setPowerChip, std::stoi, "[0, 1]\n\t[Jungfrau][Mythen3][Gotthard2] Power the chip. Default 0." @@ -1169,13 +1178,13 @@ class CmdProxy { "[dac or mv value][(optional unit) mv] \n\t[Gotthard] Dac for ?? "); //TODO DAC_COMMAND(vout_cm, getDAC, setDAC, defs::VOUT_CM, - "[dac or mv value][(optional unit) mv] \n\t[Gotthard] Dac for ?? "); //TODO + "[dac or mv value][(optional unit) mv] \n\t[Gotthard] Dac for ?? \n\t[Moench] Dac for 5"); //TODO DAC_COMMAND(vcasc_out, getDAC, setDAC, defs::VCASC_OUT, "[dac or mv value][(optional unit) mv] \n\t[Gotthard] Dac for ?? "); //TODO DAC_COMMAND(vin_cm, getDAC, setDAC, defs::VIN_CM, - "[dac or mv value][(optional unit) mv] \n\t[Gotthard] Dac for ?? "); //TODO + "[dac or mv value][(optional unit) mv] \n\t[Gotthard] Dac for ?? \n\t[Moench] Dac for 2"); //TODO DAC_COMMAND(vref_comp, getDAC, setDAC, defs::VREF_COMP, "[dac or mv value][(optional unit) mv] \n\t[Gotthard][Jungfrau] Dac for ?? "); //TODO @@ -1193,7 +1202,7 @@ class CmdProxy { "[dac or mv value][(optional unit) mv] \n\t[Mythen3] voltage to define feedback resistance of the second shaper."); DAC_COMMAND(vipre, getDAC, setDAC, defs::VIPRE, - "[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for the preamplifier's input transistor current."); + "[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for the preamplifier's input transistor current.\n\t[Moench] Dac for 1"); DAC_COMMAND(viinsh, getDAC, setDAC, defs::VIINSH, "[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for the bias current for the shaper."); @@ -1274,7 +1283,7 @@ class CmdProxy { "[dac or mv value][(optional unit) mv] \n\t[Gotthard2] Dac for common mode voltage of ADC DAC bank 2."); DAC_COMMAND(adcvpp, getDAC, setDAC, defs::ADC_VPP, - "[dac or mv value][(optional unit) mv] \n\t[Ctb] Vpp of ADC.\n\t 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V."); + "[dac or mv value][(optional unit) mv] \n\t[Ctb][Moench] Vpp of ADC.\n\t 0 -> 1V ; 1 -> 1.14V ; 2 -> 1.33V ; 3 -> 1.6V ; 4 -> 2V."); DAC_COMMAND(vb_ds, getDAC, setDAC, defs::VB_DS, "[dac or mv value][(optional unit) mv] \n\t[Jungfrau] Dac for ??"); //TODO @@ -1291,6 +1300,21 @@ class CmdProxy { DAC_COMMAND(vdd_prot, getDAC, setDAC, defs::VDD_PROT, "[dac or mv value][(optional unit) mv] \n\t[Jungfrau] Dac for ??"); //TODO + DAC_COMMAND(vbp_colbuf, getDAC, setDAC, defs::VBP_COLBUF, + "[dac or mv value][(optional unit) mv] \n\t[Moench] Dac for 0"); + + DAC_COMMAND(vb_sda, getDAC, setDAC, defs::VB_SDA, + "[dac or mv value][(optional unit) mv] \n\t[Moench] Dac for 3"); + + DAC_COMMAND(vcasc_sfp, getDAC, setDAC, defs::VCASC_SFP, + "[dac or mv value][(optional unit) mv] \n\t[Moench] Dac for 4"); + + DAC_COMMAND(vipre_cds, getDAC, setDAC, defs::VIPRE_CDS, + "[dac or mv value][(optional unit) mv] \n\t[Moench] Dac for 6"); + + DAC_COMMAND(ibias_sfp, getDAC, setDAC, defs::IBIAS_SFP, + "[dac or mv value][(optional unit) mv] \n\t[Moench] Dac for 7"); + /* on chip dacs */ INTEGER_USER_IND_COMMAND(vchip_comp_fe, getOnChipDAC, setOnChipDAC, stoiHex, defs::VB_COMP_FE, @@ -1391,7 +1415,7 @@ class CmdProxy { "\n\tPrints the receiver configuration."); INTEGER_COMMAND(tengiga, getTenGiga, setTenGiga, std::stoi, - "[0, 1]\n\t[Eiger][Ctb] 10GbE Enable."); + "[0, 1]\n\t[Eiger][Ctb][Moench] 10GbE Enable."); INTEGER_COMMAND(flowcontrol10g, getTenGigaFlowControl, setTenGigaFlowControl, std::stoi, "[0, 1]\n\t[Eiger][Jungfrau] 10GbE Flow Control."); @@ -1574,10 +1598,34 @@ class CmdProxy { /* Mythen3 Specific */ - /* CTB Specific */ + /* CTB/ Moench Specific */ INTEGER_COMMAND(asamples, getNumberOfAnalogSamples, setNumberOfAnalogSamples, std::stoi, - "[0, 1]\n\t[CTB] Number of analog samples expected."); + "[0, 1]\n\t[CTB][Moench] Number of analog samples expected."); + + INTEGER_COMMAND(adcclk, getADCClock, setADCClock, std::stoi, + "[n_clk in MHz]\n\t[Ctb][Moench] ADC clock frequency in MHz."); + + INTEGER_COMMAND(runclk, getRUNClock, setRUNClock, std::stoi, + "[n_clk in MHz]\n\t[Ctb][Moench] Run clock in MHz."); + + GET_COMMAND(syncclk, getSYNCClock, + "[n_clk in MHz]\n\t[Ctb][Moench] Sync clock in MHz."); + + INTEGER_COMMAND(adcpipeline, getADCPipeline, setADCPipeline, std::stoi, + "[n_value]\n\t[Ctb][Moench] Pipeline for ADC clock."); + + INTEGER_IND_COMMAND(v_limit, getVoltage, setVoltage, std::stoi, defs::V_LIMIT, + "[n_value]\n\t[Ctb][Moench] Soft limit for power supplies(ctb only) and DACS in mV."); + + INTEGER_COMMAND_HEX(adcenable, getADCEnableMask, setADCEnableMask, stoiHex, + "[bitmask]\n\t[Ctb][Moench] ADC Enable Mask for 1Gb Mode for each 32 ADC channel."); + + INTEGER_COMMAND_HEX(adcenable10g, getTenGigaADCEnableMask, setTenGigaADCEnableMask, stoiHex, + "[bitmask]\n\t[Ctb][Moench] ADC Enable Mask for 10Gb mode for each 32 ADC channel. However, if any of consecutive 4 bits are enabled, the complete 4 bits are enabled."); + + /* CTB Specific */ + INTEGER_COMMAND(dsamples, getNumberOfDigitalSamples, setNumberOfDigitalSamples, std::stoi, "[0, 1]\n\t[CTB] Number of digital samples expected."); @@ -1585,30 +1633,15 @@ class CmdProxy { INTEGER_COMMAND(romode, getReadoutMode, setReadoutMode, sls::StringTo, "[analog|digital|analog_digital]\n\t[CTB] Readout mode. Default is analog."); - GET_COMMAND(maxdbitphaseshift, getMaxDBITPhaseShift, - "\n\t[CTB] Absolute maximum Phase shift of of the clock to latch digital bits."); - - INTEGER_COMMAND(adcclk, getADCClock, setADCClock, std::stoi, - "[n_clk in MHz]\n\t[Ctb] ADC clock frequency in MHz."); - INTEGER_COMMAND(dbitclk, getDBITClock, setDBITClock, std::stoi, "[n_clk in MHz]\n\t[Ctb] Clock for latching the digital bits in MHz."); - INTEGER_COMMAND(runclk, getRUNClock, setRUNClock, std::stoi, - "[n_clk in MHz]\n\t[Ctb] Run clock in MHz."); - - GET_COMMAND(syncclk, getSYNCClock, - "[n_clk in MHz]\n\t[Ctb] Synch clock in MHz."); - - INTEGER_COMMAND(adcpipeline, getADCPipeline, setADCPipeline, std::stoi, - "[n_value]\n\t[Ctb] Pipeline for ADC clock."); + GET_COMMAND(maxdbitphaseshift, getMaxDBITPhaseShift, + "\n\t[CTB] Absolute maximum Phase shift of of the clock to latch digital bits."); INTEGER_COMMAND(dbitpipeline, getDBITPipeline, setDBITPipeline, std::stoi, "[n_value]\n\t[Ctb] Pipeline of the clock for latching digital bits."); - INTEGER_IND_COMMAND(v_limit, getVoltage, setVoltage, std::stoi, defs::V_LIMIT, - "[n_value]\n\t[Ctb] Soft limit for power supplies and DACS in mV."); - INTEGER_IND_COMMAND(v_a, getVoltage, setVoltage, std::stoi, defs::V_POWER_A, "[n_value]\n\t[Ctb] Voltage supply a in mV."); @@ -1655,16 +1688,7 @@ class CmdProxy { "\n\t[Ctb] Measured current of power supply d in mA."); GET_IND_COMMAND(im_io, getMeasuredCurrent, defs::I_POWER_IO, "", - "\n\t[Ctb] Measured current of power supply io in mA."); - - INTEGER_COMMAND_HEX(adcenable, getADCEnableMask, setADCEnableMask, stoiHex, - "[bitmask]\n\t[Ctb] ADC Enable Mask for 1Gb Mode for each 32 ADC channel."); - - INTEGER_COMMAND_HEX(adcenable10g, getTenGigaADCEnableMask, setTenGigaADCEnableMask, stoiHex, - "[bitmask]\n\t[Ctb] ADC Enable Mask for 10Gb mode for each 32 ADC channel. However, if any of consecutive 4 bits are enabled, the complete 4 bits are enabled."); - - INTEGER_COMMAND_HEX(adcinvert, getADCInvert, setADCInvert, stoiHex, - "[bitmask]\n\t[Ctb][Jungfrau] ADC Inversion Mask.\n\t[Jungfrau] Inversions on top of the default mask."); + "\n\t[Ctb] Measured current of power supply io in mA."); INTEGER_COMMAND(extsampling, getExternalSampling, setExternalSampling, std::stoi, "[0, 1]\n\t[Ctb] Enable for external sampling signal to extsamplingsrc signal for digital data. For advanced users only."); @@ -1682,19 +1706,19 @@ class CmdProxy { /* Pattern */ EXECUTE_SET_COMMAND_NOID_1ARG(savepattern, savePattern, - "[fname]\n\t[Ctb] Saves pattern to file (ascii). Also executes pattern."); + "[fname]\n\t[Ctb][Moench][Mythen3] Saves pattern to file (ascii). Also executes pattern."); INTEGER_COMMAND_HEX(patioctrl, getPatternIOControl, setPatternIOControl, stoulHex, - "[64 bit mask]\n\t[Ctb] 64 bit mask defining input (0) and output (1) signals."); + "[64 bit mask]\n\t[Ctb][Moench][Mythen3] 64 bit mask defining input (0) and output (1) signals."); INTEGER_COMMAND_HEX(patclkctrl, getPatternClockControl, setPatternClockControl, stoulHex, - "[64 bit mask]\n\t[Ctb] 64 bit mask defining output clock enable."); + "[64 bit mask]\n\t[Ctb][Moench][Mythen3] 64 bit mask defining output clock enable."); INTEGER_COMMAND_HEX(patmask, getPatternMask, setPatternMask, stoulHex, - "[64 bit mask]\n\t[Ctb][Mythen3] 64 bit mask applied to every pattern. Only these bits for each pattern will be masked against."); + "[64 bit mask]\n\t[Ctb][Moench][Mythen3] 64 bit mask applied to every pattern. Only these bits for each pattern will be masked against."); INTEGER_COMMAND_HEX(patsetbit, getPatternBitMask, setPatternBitMask, stoulHex, - "[64 bit mask]\n\t[Ctb][Mythen3] 64 bit values applied to the selected patmask for every pattern."); + "[64 bit mask]\n\t[Ctb][Moench][Mythen3] 64 bit values applied to the selected patmask for every pattern."); /* Moench */ @@ -1711,17 +1735,19 @@ class CmdProxy { /* Advanced */ EXECUTE_SET_COMMAND(resetfpga, resetFPGA, - "\n\t[Jungfrau][Ctb] Reset FPGA."); + "\n\t[Jungfrau][Ctb][Moench] Reset FPGA."); EXECUTE_SET_COMMAND(rebootcontroller, rebootController, - "\n\t[Jungfrau][Ctb][Gotthard][Mythen3][Gotthard2] Reboot controler (blackfin) of detector."); + "\n\t[Jungfrau][Ctb][Moench][Gotthard][Mythen3][Gotthard2] Reboot controler (blackfin) of detector."); EXECUTE_SET_COMMAND(firmwaretest, executeFirmwareTest, - "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] Firmware test, ie. reads a read fixed pattern from a register."); + "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb][Moench] Firmware test, ie. reads a read fixed pattern from a register."); EXECUTE_SET_COMMAND(bustest, executeBusTest, - "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb] Bus test, ie. keeps writing and reading back different values in R/W register."); + "\n\t[Jungfrau][Gotthard][Mythen3][Gotthard2][Ctb][Moench] Bus test, ie. keeps writing and reading back different values in R/W register."); + INTEGER_COMMAND_HEX(adcinvert, getADCInvert, setADCInvert, stoiHex, + "[bitmask]\n\t[Ctb][Moench][Jungfrau][Moench] ADC Inversion Mask.\n\t[Jungfrau][Moench] Inversions on top of the default mask."); /* Insignificant */ @@ -1738,7 +1764,7 @@ class CmdProxy { "\n\tClient IP Address that last communicated with the detector."); GET_COMMAND(nframes, getNumberOfFramesFromStart, - "\n\t[Jungfrau][Mythen3][Gotthard2][Moench][CTB] Number of frames from start run control." + "\n\t[Jungfrau][Mythen3][Gotthard2][Moench][CTB][Moench] Number of frames from start run control." "\n\t[Gotthard2] only in continuous mode."); TIME_GET_COMMAND(now, getActualTime, diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 51520f027..aa2e8be8b 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -1230,7 +1230,7 @@ void Detector::setCounterMask(uint32_t countermask, Positions pos) { pimpl->Parallel(&slsDetector::setCounterMask, pos, countermask); } -// CTB Specific +// CTB/ Moench Specific Result Detector::getNumberOfAnalogSamples(Positions pos) const { return pimpl->Parallel(&slsDetector::getNumberOfAnalogSamples, pos); @@ -1240,46 +1240,6 @@ void Detector::setNumberOfAnalogSamples(int value, Positions pos) { pimpl->Parallel(&slsDetector::setNumberOfAnalogSamples, pos, value); } -Result Detector::getNumberOfDigitalSamples(Positions pos) const { - return pimpl->Parallel(&slsDetector::getNumberOfDigitalSamples, pos); -} - -void Detector::setNumberOfDigitalSamples(int value, Positions pos) { - pimpl->Parallel(&slsDetector::setNumberOfDigitalSamples, pos, value); -} - -Result Detector::getReadoutMode(Positions pos) const { - return pimpl->Parallel(&slsDetector::getReadoutMode, pos); -} - -void Detector::setReadoutMode(defs::readoutMode value, Positions pos) { - pimpl->Parallel(&slsDetector::setReadoutMode, pos, value); -} - -Result Detector::getDBITPhase(Positions pos) const { - return pimpl->Parallel(&slsDetector::getClockPhase, pos, defs::DBIT_CLOCK, - false); -} - -void Detector::setDBITPhase(int value, Positions pos) { - pimpl->Parallel(&slsDetector::setClockPhase, pos, defs::DBIT_CLOCK, value, - false); -} - -Result Detector::getMaxDBITPhaseShift(Positions pos) const { - return pimpl->Parallel(&slsDetector::getMaxClockPhaseShift, pos, - defs::DBIT_CLOCK); -} - -Result Detector::getDBITPhaseInDegrees(Positions pos) const { - return pimpl->Parallel(&slsDetector::getClockPhase, pos, defs::DBIT_CLOCK, - true); -} - -void Detector::setDBITPhaseInDegrees(int value, Positions pos) { - pimpl->Parallel(&slsDetector::setClockPhase, pos, defs::DBIT_CLOCK, value, - true); -} Result Detector::getADCClock(Positions pos) const { return pimpl->Parallel(&slsDetector::getClockFrequency, pos, @@ -1291,16 +1251,6 @@ void Detector::setADCClock(int value_in_MHz, Positions pos) { value_in_MHz); } -Result Detector::getDBITClock(Positions pos) const { - return pimpl->Parallel(&slsDetector::getClockFrequency, pos, - defs::DBIT_CLOCK); -} - -void Detector::setDBITClock(int value_in_MHz, Positions pos) { - pimpl->Parallel(&slsDetector::setClockFrequency, pos, defs::DBIT_CLOCK, - value_in_MHz); -} - Result Detector::getRUNClock(Positions pos) const { return pimpl->Parallel(&slsDetector::getClockFrequency, pos, defs::RUN_CLOCK); @@ -1328,10 +1278,6 @@ Result Detector::getDBITPipeline(Positions pos) const { return pimpl->Parallel(&slsDetector::getPipeline, pos, defs::DBIT_CLOCK); } -void Detector::setDBITPipeline(int value, Positions pos) { - pimpl->Parallel(&slsDetector::setPipeline, pos, defs::DBIT_CLOCK, value); -} - Result Detector::getVoltage(defs::dacIndex index, Positions pos) const { switch (index) { case defs::V_LIMIT: @@ -1364,6 +1310,81 @@ void Detector::setVoltage(defs::dacIndex index, int value, Positions pos) { pimpl->Parallel(&slsDetector::setDAC, pos, value, index, 1); } +Result Detector::getADCEnableMask(Positions pos) const { + return pimpl->Parallel(&slsDetector::getADCEnableMask, pos); +} + +void Detector::setADCEnableMask(uint32_t mask, Positions pos) { + pimpl->Parallel(&slsDetector::setADCEnableMask, pos, mask); +} + +Result Detector::getTenGigaADCEnableMask(Positions pos) const { + return pimpl->Parallel(&slsDetector::getTenGigaADCEnableMask, pos); +} + +void Detector::setTenGigaADCEnableMask(uint32_t mask, Positions pos) { + pimpl->Parallel(&slsDetector::setTenGigaADCEnableMask, pos, mask); +} + +// CTB Specific + + +Result Detector::getNumberOfDigitalSamples(Positions pos) const { + return pimpl->Parallel(&slsDetector::getNumberOfDigitalSamples, pos); +} + +void Detector::setNumberOfDigitalSamples(int value, Positions pos) { + pimpl->Parallel(&slsDetector::setNumberOfDigitalSamples, pos, value); +} + +Result Detector::getReadoutMode(Positions pos) const { + return pimpl->Parallel(&slsDetector::getReadoutMode, pos); +} + +void Detector::setReadoutMode(defs::readoutMode value, Positions pos) { + pimpl->Parallel(&slsDetector::setReadoutMode, pos, value); +} + +Result Detector::getDBITClock(Positions pos) const { + return pimpl->Parallel(&slsDetector::getClockFrequency, pos, + defs::DBIT_CLOCK); +} + +void Detector::setDBITClock(int value_in_MHz, Positions pos) { + pimpl->Parallel(&slsDetector::setClockFrequency, pos, defs::DBIT_CLOCK, + value_in_MHz); +} + +Result Detector::getDBITPhase(Positions pos) const { + return pimpl->Parallel(&slsDetector::getClockPhase, pos, defs::DBIT_CLOCK, + false); +} + +void Detector::setDBITPhase(int value, Positions pos) { + pimpl->Parallel(&slsDetector::setClockPhase, pos, defs::DBIT_CLOCK, value, + false); +} + +Result Detector::getMaxDBITPhaseShift(Positions pos) const { + return pimpl->Parallel(&slsDetector::getMaxClockPhaseShift, pos, + defs::DBIT_CLOCK); +} + +Result Detector::getDBITPhaseInDegrees(Positions pos) const { + return pimpl->Parallel(&slsDetector::getClockPhase, pos, defs::DBIT_CLOCK, + true); +} + +void Detector::setDBITPhaseInDegrees(int value, Positions pos) { + pimpl->Parallel(&slsDetector::setClockPhase, pos, defs::DBIT_CLOCK, value, + true); +} + + +void Detector::setDBITPipeline(int value, Positions pos) { + pimpl->Parallel(&slsDetector::setPipeline, pos, defs::DBIT_CLOCK, value); +} + Result Detector::getMeasuredVoltage(defs::dacIndex index, Positions pos) const { switch (index) { @@ -1402,30 +1423,6 @@ Result Detector::getSlowADC(defs::dacIndex index, Positions pos) const { return pimpl->Parallel(&slsDetector::getADC, pos, index); } -Result Detector::getADCEnableMask(Positions pos) const { - return pimpl->Parallel(&slsDetector::getADCEnableMask, pos); -} - -void Detector::setADCEnableMask(uint32_t mask, Positions pos) { - pimpl->Parallel(&slsDetector::setADCEnableMask, pos, mask); -} - -Result Detector::getTenGigaADCEnableMask(Positions pos) const { - return pimpl->Parallel(&slsDetector::getTenGigaADCEnableMask, pos); -} - -void Detector::setTenGigaADCEnableMask(uint32_t mask, Positions pos) { - pimpl->Parallel(&slsDetector::setTenGigaADCEnableMask, pos, mask); -} - -Result Detector::getADCInvert(Positions pos) const { - return pimpl->Parallel(&slsDetector::getADCInvert, pos); -} - -void Detector::setADCInvert(uint32_t value, Positions pos) { - pimpl->Parallel(&slsDetector::setADCInvert, pos, value); -} - Result Detector::getExternalSamplingSource(Positions pos) const { return pimpl->Parallel(&slsDetector::getExternalSamplingSource, pos); } @@ -1747,6 +1744,14 @@ void Detector::setInitialChecks(const bool value) { pimpl->setInitialChecks(value); } +Result Detector::getADCInvert(Positions pos) const { + return pimpl->Parallel(&slsDetector::getADCInvert, pos); +} + +void Detector::setADCInvert(uint32_t value, Positions pos) { + pimpl->Parallel(&slsDetector::setADCInvert, pos, value); +} + // Insignificant Result Detector::getControlPort(Positions pos) const { diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index 22a211fe6..95eb7387d 100755 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -557,7 +557,7 @@ void DetectorImpl::readFrameFromReceiver() { uint32_t yoffset = coordY * nPixelsY; uint32_t singledetrowoffset = nPixelsX * bytesPerPixel; uint32_t rowoffset = nX * singledetrowoffset; - if (multi_shm()->multiDetectorType == CHIPTESTBOARD) { + if (multi_shm()->multiDetectorType == MOENCH) { singledetrowoffset = size; nPixelsY = 1; // TODO: nDetPixelsY is not updated. } @@ -1070,6 +1070,7 @@ std::vector DetectorImpl::readProgrammingFile(const std::string &fname) { switch (multi_shm()->multiDetectorType) { case JUNGFRAU: case CHIPTESTBOARD: + case MOENCH: if (fname.find(".pof") == std::string::npos) { throw RuntimeError("Programming file must be a pof file."); } diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index 3519f582a..1a9c36e21 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -336,6 +336,7 @@ void slsDetector::initializeDetectorStructure(detectorType type) { shm()->roMode = ANALOG_ONLY; shm()->currentSettings = UNINITIALIZED; shm()->currentThresholdEV = -1; + shm()->nASamples = 1; shm()->nFrames = 1; shm()->nTriggers = 1; shm()->nBursts = 1; @@ -557,8 +558,8 @@ slsDetectorDefs::detectorType slsDetector::getDetectorType() const { } void slsDetector::updateNumberOfChannels() { - if (shm()->myDetectorType == CHIPTESTBOARD || - shm()->myDetectorType == MOENCH) { + + if (shm()->myDetectorType == CHIPTESTBOARD) { int nachans = 0, ndchans = 0; // analog channels (normal, analog/digital readout) @@ -577,15 +578,29 @@ void slsDetector::updateNumberOfChannels() { } // digital channels (ctb only, digital, analog/digital readout) - if (shm()->myDetectorType == CHIPTESTBOARD && - (shm()->roMode == DIGITAL_ONLY || - shm()->roMode == ANALOG_AND_DIGITAL)) { + if (shm()->roMode == DIGITAL_ONLY || + shm()->roMode == ANALOG_AND_DIGITAL) { ndchans = 64; FILE_LOG(logDEBUG1) << "#Digital Channels:" << ndchans; } shm()->nChan.x = nachans + ndchans; FILE_LOG(logDEBUG1) << "# Total #Channels:" << shm()->nChan.x; } + + + else if (shm()->myDetectorType == MOENCH) { + uint32_t mask = shm()->tenGigaEnable ? shm()->adcEnableMaskTenGiga : shm()->adcEnableMaskOneGiga; + // count number of channels in x, each adc has 25 channels each + int nchanTop = __builtin_popcount(mask & 0xF0F0F0F0) * 25; + int nchanBot = __builtin_popcount(mask & 0x0F0F0F0F) * 25; + shm()->nChan.x = nchanTop > 0 ? nchanTop : nchanBot; + // if both top and bottom adcs enabled, rows = 2 + int nrows = 1; + if (nchanTop > 0 && nchanBot > 0) { + nrows = 2; + } + shm()->nChan.y = shm()->nASamples / 25 * nrows; + } } slsDetectorDefs::xy slsDetector::getNumberOfChannels() const { @@ -807,11 +822,18 @@ void slsDetector::updateCachedDetectorVariables() { shm()->tenGigaEnable = static_cast(i32); } + // analog samples and adc enable masks if (shm()->myDetectorType == CHIPTESTBOARD || shm()->myDetectorType == MOENCH) { - // 1gb adcmask + + // analog samples uint32_t u32 = 0; n += client.Receive(&u32, sizeof(u32)); + shm()->nASamples = u32; + + // 1gb adcmask + u32 = 0; + n += client.Receive(&u32, sizeof(u32)); shm()->adcEnableMaskOneGiga = u32; // 10gb adcmask @@ -1321,6 +1343,7 @@ int slsDetector::getNumberOfAnalogSamples() { void slsDetector::setNumberOfAnalogSamples(int value) { FILE_LOG(logDEBUG1) << "Setting number of analog samples to " << value; sendToDetector(F_SET_NUM_ANALOG_SAMPLES, value, nullptr); + shm()->nASamples = value; // update #nchan, as it depends on #samples, adcmask updateNumberOfChannels(); if (shm()->useReceiverFlag) { @@ -1836,7 +1859,6 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) { case MOENCH: setNumberOfAnalogSamples(getNumberOfAnalogSamples()); - setNumberOfDigitalSamples(getNumberOfDigitalSamples()); enableTenGigabitEthernet(static_cast(shm()->tenGigaEnable)); setADCEnableMask(shm()->adcEnableMaskOneGiga); setTenGigaADCEnableMask(shm()->adcEnableMaskTenGiga); @@ -2974,6 +2996,7 @@ void slsDetector::programFPGA(std::vector buffer) { switch (shm()->myDetectorType) { case JUNGFRAU: case CHIPTESTBOARD: + case MOENCH: programFPGAviaBlackfin(buffer); break; case MYTHEN3: diff --git a/slsDetectorSoftware/src/slsDetector.h b/slsDetectorSoftware/src/slsDetector.h index d5f318053..ff7cb8953 100755 --- a/slsDetectorSoftware/src/slsDetector.h +++ b/slsDetectorSoftware/src/slsDetector.h @@ -13,7 +13,7 @@ class ServerInterface; #define SLS_SHMAPIVERSION 0x190726 -#define SLS_SHMVERSION 0x200225 +#define SLS_SHMVERSION 0x200302 /** * @short structure allocated in shared memory to store detector settings for @@ -80,6 +80,9 @@ struct sharedSlsDetector { /** detector threshold (eV) */ int currentThresholdEV; + /** number of analog samples */ + int nASamples; + /** number of frames */ int64_t nFrames; @@ -295,7 +298,7 @@ class slsDetector : public virtual slsDetectorDefs { /** * Update total number of channels (chiptestboard or moench) - * depending on the number of samples, adenablemask, readout flags(ctb) + * depending on the number of samples, adcenablemask, readout flags(ctb) */ void updateNumberOfChannels(); @@ -554,10 +557,10 @@ class slsDetector : public virtual slsDetectorDefs { /** [Jungfrau] Advanced */ void setNumberOfAdditionalStorageCells(int value); - /** [CTB] */ + /** [CTB][Moench] */ int getNumberOfAnalogSamples(); - /** [CTB] */ + /** [CTB][Moench] */ void setNumberOfAnalogSamples(int value); /** [CTB] */ @@ -574,10 +577,10 @@ class slsDetector : public virtual slsDetectorDefs { void setPeriod(int64_t value); - /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3][Gotthard2] */ int64_t getDelayAfterTrigger(); - /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3][Gotthard2] */ void setDelayAfterTrigger(int64_t value); /** [Gotthard2] only in burst mode and in auto timing mode */ @@ -605,22 +608,22 @@ class slsDetector : public virtual slsDetectorDefs { * Options: (0-1638375 ns (resolution of 25ns) */ void setStorageCellDelay(int64_t value); - /** [Gotthard][Jungfrau][CTB][Mythen3] + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3] * [Gotthard2] only in continuous mode */ int64_t getNumberOfFramesLeft() const; - /** [Gotthard][Jungfrau][CTB][Mythen3] + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3] * [Gotthard2] only in continuous mode */ int64_t getNumberOfTriggersLeft() const; - /** [Gotthard][Jungfrau][CTB] + /** [Gotthard][Jungfrau][CTB][Moench] * [Gotthard2] only in continuous mode */ int64_t getDelayAfterTriggerLeft() const; /** [Gotthard] */ int64_t getExptimeLeft() const; - /** [Gotthard][Jungfrau][CTB][Mythen3][Gotthard2] */ + /** [Gotthard][Jungfrau][CTB][Moench][Mythen3][Gotthard2] */ int64_t getPeriodLeft() const; /** [Eiger] minimum two frames */ @@ -629,15 +632,15 @@ class slsDetector : public virtual slsDetectorDefs { /** [Eiger] */ int64_t getMeasuredSubFramePeriod() const; - /** [Jungfrau][CTB][Mythen3] + /** [Jungfrau][CTB][Moench][Mythen3] * [Gotthard2] only in continuous mode */ int64_t getNumberOfFramesFromStart() const; - /** [Jungfrau][CTB][Mythen3] Get time from detector start + /** [Jungfrau][CTB][Moench][Mythen3] Get time from detector start * [Gotthard2] only in continuous mode */ int64_t getActualTime() const; - /** [Jungfrau][CTB][Mythen3] Get timestamp at a frame start + /** [Jungfrau][CTB][Moench][Mythen3] Get timestamp at a frame start * [Gotthard2] only in continuous mode */ int64_t getMeasurementTime() const; @@ -727,13 +730,13 @@ class slsDetector : public virtual slsDetectorDefs { bool getStoreInRamMode(); /** - * Set readout mode (Only for CTB and Moench) + * [Ctb] * @param mode readout mode Options: ANALOG_ONLY, DIGITAL_ONLY, ANALOG_AND_DIGITAL */ void setReadoutMode(const readoutMode mode); /** - * Get readout mode(Only for CTB and Moench) + * [Ctb] * @returns readout mode */ readoutMode getReadoutMode(); @@ -1117,10 +1120,10 @@ class slsDetector : public virtual slsDetectorDefs { */ int64_t getReceiverRealUDPSocketBufferSize() const; - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Moench] */ void executeFirmwareTest(); - /** [Gotthard][Jungfrau][CTB] */ + /** [Gotthard][Jungfrau][CTB][Moench] */ void executeBusTest(); /** [Gotthard] */ @@ -1222,14 +1225,14 @@ class slsDetector : public virtual slsDetectorDefs { uint32_t getTenGigaADCEnableMask(); /** - * Set ADC invert register (CTB, Moench) + * Set ADC invert register (CTB, Moench, Jungfrau) * @param value ADC invert value * @param detPos -1 for all detectors in list or specific detector position */ void setADCInvert(uint32_t value); /** - * Get ADC invert register (CTB, Moench) + * Get ADC invert register (CTB, Moench, Jungfrau) * @param detPos -1 for all detectors in list or specific detector position * @returns ADC invert value */ diff --git a/slsReceiverSoftware/src/ClientInterface.cpp b/slsReceiverSoftware/src/ClientInterface.cpp index 2bd2be3c6..aadeb5ffe 100755 --- a/slsReceiverSoftware/src/ClientInterface.cpp +++ b/slsReceiverSoftware/src/ClientInterface.cpp @@ -529,7 +529,7 @@ int ClientInterface::set_num_analog_samples(Interface &socket) { int ClientInterface::set_num_digital_samples(Interface &socket) { auto value = socket.Receive(); FILE_LOG(logDEBUG1) << "Setting num digital samples to " << value; - if (myDetectorType != CHIPTESTBOARD && myDetectorType != MOENCH) { + if (myDetectorType != CHIPTESTBOARD) { functionNotImplemented(); } try { diff --git a/slsReceiverSoftware/src/DataProcessor.cpp b/slsReceiverSoftware/src/DataProcessor.cpp index f81673b55..0a1905514 100755 --- a/slsReceiverSoftware/src/DataProcessor.cpp +++ b/slsReceiverSoftware/src/DataProcessor.cpp @@ -447,6 +447,7 @@ void DataProcessor::PadMissingPackets(char* buf) { memset(buf + fifohsize + (pnum * dsize), 0xFF, dsize+2); break; case CHIPTESTBOARD: + case MOENCH: if (pnum == (pperFrame-1)) memset(buf + fifohsize + (pnum * dsize), 0xFF, corrected_dsize); else diff --git a/slsReceiverSoftware/src/GeneralData.h b/slsReceiverSoftware/src/GeneralData.h index 067505731..7e62c8353 100755 --- a/slsReceiverSoftware/src/GeneralData.h +++ b/slsReceiverSoftware/src/GeneralData.h @@ -629,13 +629,6 @@ private: /** Number of bytes per analog channel */ const int NUM_BYTES_PER_ANALOG_CHANNEL = 2; - struct ctb_10g_packet_header { - unsigned char emptyHeader[6]; - unsigned char reserved[4]; - uint32_t packetFrameNumber; - uint64_t bunchid; - } __attribute__((packed)); - public: @@ -660,7 +653,7 @@ public: }; /** - * Set databytes (ctb, moench) + * Set databytes * @param a adc enable mask * @param as analog number of samples * @param ds digital number of samples @@ -700,50 +693,21 @@ public: nPixelsX = nachans + ndchans; nPixelsY = 1; + // 10G if (t) { - headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); dataSize = 8144; - packetSize = headerSizeinPacket + dataSize; - imageSize = adatabytes + ddatabytes; - packetsPerFrame = ceil((double)imageSize / (double)dataSize); - standardheader = true; - - /* - headerSizeinPacket = 22; - dataSize = 8192; - packetSize = headerSizeinPacket + dataSize; - imageSize = adatabytes + ddatabytes; - packetsPerFrame = ceil((double)imageSize / (double)dataSize); - standardheader = false; - */ } // 1g udp (via fifo readout) else { - headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); dataSize = UDP_PACKET_DATA_BYTES; - packetSize = headerSizeinPacket + dataSize; - imageSize = adatabytes + ddatabytes; - packetsPerFrame = ceil((double)imageSize / (double)dataSize); - standardheader = true; } - return adatabytes; - } - /** - * Get Header Infomation (frame number, packet number) - * @param index thread index for debugging purposes - * @param packetData pointer to data - * @param oddStartingPacket odd starting packet (gotthard) - * @param frameNumber frame number - * @param packetNumber packet number - */ - void GetHeaderInfo(int index, char* packetData, bool oddStartingPacket, - uint64_t& frameNumber, uint32_t& packetNumber) const - { - auto header = reinterpret_cast(packetData); - frameNumber = (header->packetFrameNumber >> frameIndexOffset) & frameIndexMask; - packetNumber = header->packetFrameNumber & packetIndexMask; + packetSize = headerSizeinPacket + dataSize; + imageSize = adatabytes + ddatabytes; + packetsPerFrame = ceil((double)imageSize / (double)dataSize); + + return adatabytes; } }; @@ -769,14 +733,14 @@ public: imageSize = nPixelsX * nPixelsY * 2; packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); frameIndexMask = 0xFFFFFF; - maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; + maxFramesPerFile = MOENCH_MAX_FRAMES_PER_FILE; fifoBufferHeaderSize = FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); defaultFifoDepth = 2500; standardheader = true; }; /** - * Set databytes (ctb, moench) + * Set databytes * @param a adc enable mask * @param as analog number of samples * @param ds digital number of samples @@ -785,41 +749,37 @@ public: * @returns analog data bytes */ int setImageSize(uint32_t a, uint32_t as, uint32_t ds, bool t, slsDetectorDefs::readoutMode) { - int nachans = 0; - int adatabytes = 0; + + // count number of channels in x, each adc has 25 channels each + int nchanTop = __builtin_popcount(a & 0xF0F0F0F0) * 25; + int nchanBot = __builtin_popcount(a & 0x0F0F0F0F) * 25; + nPixelsX = nchanTop > 0 ? nchanTop : nchanBot; + + // if both top and bottom adcs enabled, rows = 2 + int nrows = 1; + if (nchanTop > 0 && nchanBot > 0) { + nrows = 2; + } + nPixelsY = as / 25 * nrows; + FILE_LOG(logINFO) << "Number of Pixels: [" << nPixelsX << ", " << nPixelsY << "]"; - // analog channels (normal, analog/digital readout) - if (a == BIT32_MASK) { - nachans = 32; - } else { - for (int ich = 0; ich < 32; ++ich) { - if (a & (1 << ich)) - ++nachans; - } - } - adatabytes = nachans * NUM_BYTES_PER_ANALOG_CHANNEL * as; - FILE_LOG(logDEBUG1) << "Total Number of Channels:" << nachans - << " Databytes: " << adatabytes; - nPixelsX = nachans; - nPixelsY = 1; // 10G if (t) { - headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); - dataSize = UDP_PACKET_DATA_BYTES; - packetSize = headerSizeinPacket + dataSize; - imageSize = adatabytes; - packetsPerFrame = ceil((double)imageSize / (double)dataSize); + dataSize = 8144; } // 1g udp (via fifo readout) else { - headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); - dataSize = UDP_PACKET_DATA_BYTES; - packetSize = headerSizeinPacket + dataSize; - imageSize = adatabytes; - packetsPerFrame = ceil((double)imageSize / (double)dataSize); + dataSize = UDP_PACKET_DATA_BYTES; } - return adatabytes; + + imageSize = nPixelsX * nPixelsY * NUM_BYTES_PER_ANALOG_CHANNEL; + packetSize = headerSizeinPacket + dataSize; + packetsPerFrame = ceil((double)imageSize / (double)dataSize); + + FILE_LOG(logDEBUG) << "Databytes: " << imageSize; + + return imageSize; } }; diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h index 6c1056f84..07e30f8f9 100755 --- a/slsSupportLib/include/sls_detector_defs.h +++ b/slsSupportLib/include/sls_detector_defs.h @@ -332,6 +332,11 @@ class slsDetectorDefs { VB_PIXBUF, VIN_COM, VDD_PROT, + VBP_COLBUF, + VB_SDA, + VCASC_SFP, + VIPRE_CDS, + IBIAS_SFP, V_POWER_A = 100, V_POWER_B = 101, V_POWER_C = 102, diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index b5d4b63ac..0c81f31b6 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -1,6 +1,5 @@ /** API versions */ #define GITBRANCH "developer" -#define APIMOENCH 0x200131 #define APIMYTHEN3 0x200226 #define APIJUNGFRAU 0x200226 #define APIEIGER 0x200226 @@ -10,3 +9,4 @@ #define APIGUI 0x200227 #define APICTB 0x200227 #define APIGOTTHARD2 0x200228 +#define APIMOENCH 0x200302 From 8abc32e7f1a7e6978ffc7cd7c3cd350aece19a22 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 3 Mar 2020 16:00:01 +0100 Subject: [PATCH 2/5] moench: default pattern file in server, settings, tests --- slsDetectorGui/forms/form_tab_settings.ui | 40 ++ slsDetectorGui/include/qTabSettings.h | 8 + slsDetectorGui/src/qTabSettings.cpp | 15 +- .../moenchDetectorServer/CMakeLists.txt | 3 +- .../moenchDetectorServer/DefaultPattern.txt | 414 ++++++++++++++++++ .../moenchDetectorServer/Makefile | 2 +- .../bin/moenchDetectorServer_developer | Bin 176860 -> 186624 bytes .../slsDetectorFunctionList.c | 100 ++++- .../slsDetectorServer_defs.h | 13 + .../include/readDefaultPattern.h | 22 + .../include/slsDetectorFunctionList.h | 5 +- .../src/readDefaultPattern.c | 414 ++++++++++++++++++ .../src/slsDetectorServer_funcs.c | 13 +- slsDetectorSoftware/include/Detector.h | 2 + slsDetectorSoftware/src/CmdProxy.h | 12 +- slsDetectorSoftware/src/slsDetector.cpp | 5 +- slsDetectorSoftware/src/slsDetector.h | 2 + slsDetectorSoftware/tests/CMakeLists.txt | 1 + .../tests/test-CmdProxy-moench.cpp | 103 +++++ slsSupportLib/include/ToString.h | 32 ++ slsSupportLib/include/sls_detector_defs.h | 36 +- slsSupportLib/include/versionAPI.h | 2 +- 22 files changed, 1213 insertions(+), 31 deletions(-) create mode 100755 slsDetectorServers/moenchDetectorServer/DefaultPattern.txt create mode 100755 slsDetectorServers/slsDetectorServer/include/readDefaultPattern.h create mode 100755 slsDetectorServers/slsDetectorServer/src/readDefaultPattern.c create mode 100644 slsDetectorSoftware/tests/test-CmdProxy-moench.cpp diff --git a/slsDetectorGui/forms/form_tab_settings.ui b/slsDetectorGui/forms/form_tab_settings.ui index b17a600ee..01d951982 100755 --- a/slsDetectorGui/forms/form_tab_settings.ui +++ b/slsDetectorGui/forms/form_tab_settings.ui @@ -214,6 +214,46 @@ Very Low Gain + + + G1_HG + + + + + G1_LG + + + + + G2_HC_HG + + + + + G2_HC_LG + + + + + G2_LC_HG + + + + + G2_LC_LG + + + + + G4_HG + + + + + G4_LG + + Undefined diff --git a/slsDetectorGui/include/qTabSettings.h b/slsDetectorGui/include/qTabSettings.h index a8076eda0..1b29ebbae 100755 --- a/slsDetectorGui/include/qTabSettings.h +++ b/slsDetectorGui/include/qTabSettings.h @@ -41,6 +41,14 @@ private: FORCESWITCHG1, FORCESWITCHG2, VERLOWGAIN, + G1_HIGHGAIN, + G1_LOWGAIN, + G2_HIGHCAP_HIGHGAIN, + G2_HIGHCAP_LOWGAIN, + G2_LOWCAP_HIGHGAIN, + G2_LOWCAP_LOWGAIN, + G4_HIGHGAIN, + G4_LOWGAIN, UNDEFINED, UNINITIALIZED, NUMSETTINGS diff --git a/slsDetectorGui/src/qTabSettings.cpp b/slsDetectorGui/src/qTabSettings.cpp index 10489db8e..59172de8f 100755 --- a/slsDetectorGui/src/qTabSettings.cpp +++ b/slsDetectorGui/src/qTabSettings.cpp @@ -20,7 +20,6 @@ void qTabSettings::SetupWidgetWindow() { // enabling according to det type switch(det->getDetectorType().squash()) { - case slsDetectorDefs::MOENCH: case slsDetectorDefs::MYTHEN3: lblSettings->setEnabled(false); comboSettings->setEnabled(false); @@ -83,11 +82,21 @@ void qTabSettings::SetupDetectorSettings() { item[(int)FORCESWITCHG1]->setEnabled(true); item[(int)FORCESWITCHG2]->setEnabled(true); break; - case slsDetectorDefs::GOTTHARD2: + case slsDetectorDefs::GOTTHARD2: item[(int)DYNAMICGAIN]->setEnabled(true); item[(int)FIXGAIN1]->setEnabled(true); item[(int)FIXGAIN2]->setEnabled(true); - break; + break; + case slsDetectorDefs::MOENCH: + item[(int)G1_HIGHGAIN]->setEnabled(true); + item[(int)G1_LOWGAIN]->setEnabled(true); + item[(int)G2_HIGHCAP_HIGHGAIN]->setEnabled(true); + item[(int)G2_HIGHCAP_LOWGAIN]->setEnabled(true); + item[(int)G2_LOWCAP_HIGHGAIN]->setEnabled(true); + item[(int)G2_LOWCAP_LOWGAIN]->setEnabled(true); + item[(int)G4_HIGHGAIN]->setEnabled(true); + item[(int)G4_LOWGAIN]->setEnabled(true); + break; default: FILE_LOG(logDEBUG) << "Unknown detector type. Exiting GUI."; qDefs::Message(qDefs::CRITICAL, diff --git a/slsDetectorServers/moenchDetectorServer/CMakeLists.txt b/slsDetectorServers/moenchDetectorServer/CMakeLists.txt index 2952e41ac..f7a99301c 100644 --- a/slsDetectorServers/moenchDetectorServer/CMakeLists.txt +++ b/slsDetectorServers/moenchDetectorServer/CMakeLists.txt @@ -12,7 +12,8 @@ add_executable(moenchDetectorServer_virtual ../slsDetectorServer/src/ALTERA_PLL.c ../slsDetectorServer/src/LTC2620.c ../slsDetectorServer/src/MAX1932.c - ../slsDetectorServer/src/programFpgaBlackfin.c + ../slsDetectorServer/src/programFpgaBlackfin.c + ../slsDetectorServer/src/readDefaultPattern.c ) include_directories( diff --git a/slsDetectorServers/moenchDetectorServer/DefaultPattern.txt b/slsDetectorServers/moenchDetectorServer/DefaultPattern.txt new file mode 100755 index 000000000..5cf148cc8 --- /dev/null +++ b/slsDetectorServers/moenchDetectorServer/DefaultPattern.txt @@ -0,0 +1,414 @@ +patword 0x0000 0x0000000000000000 +patword 0x0001 0x0000000000000000 +patword 0x0002 0x0008000900080000 +patword 0x0003 0x0008000900080000 +patword 0x0004 0x0008000900080000 +patword 0x0005 0x0008000900080000 +patword 0x0006 0x0008000900080000 +patword 0x0007 0x0008000900080000 +patword 0x0008 0x0008000900080000 +patword 0x0009 0x0008000900080000 +patword 0x000a 0x0008000900080000 +patword 0x000b 0x0008000900080000 +patword 0x000c 0x0008000900080000 +patword 0x000d 0x0008000900080000 +patword 0x000e 0x0008000900080000 +patword 0x000f 0x0008000900080000 +patword 0x0010 0x0008000900080000 +patword 0x0011 0x0008000900080000 +patword 0x0012 0x0008000900080000 +patword 0x0013 0x0008000900080000 +patword 0x0014 0x0008000900080000 +patword 0x0015 0x0008000900080000 +patword 0x0016 0x0008400900080020 +patword 0x0017 0x0008400900080020 +patword 0x0018 0x0008599f0418503a +patword 0x0019 0x0008599f0418503a +patword 0x001a 0x0108599f0418503a +patword 0x001b 0x0108599f0418503a +patword 0x001c 0x0108599f0418503a +patword 0x001d 0x0108599f0418503a +patword 0x001e 0x0108599f0418503a +patword 0x001f 0x0108599f0418503a +patword 0x0020 0x0108599f0418503a +patword 0x0021 0x0108599f0418503a +patword 0x0022 0x0108599f0418503a +patword 0x0023 0x0108599f0418503a +patword 0x0024 0x0108599f0418503a +patword 0x0025 0x0108599f0418503a +patword 0x0026 0x0108599f0418503a +patword 0x0027 0x0108599f0418503a +patword 0x0028 0x0108599f0418503a +patword 0x0029 0x0108599f0418503a +patword 0x002a 0x0108599f0418503a +patword 0x002b 0x0108599f0418503a +patword 0x002c 0x0108599f0418503a +patword 0x002d 0x0108599f0418503a +patword 0x002e 0x0108599f0418503a +patword 0x002f 0x0108599f0418503a +patword 0x0030 0x0108599f0418503a +patword 0x0031 0x0108599f0418503a +patword 0x0032 0x0108599f0418503a +patword 0x0033 0x0108599f0418503a +patword 0x0034 0x0108599f0418503a +patword 0x0035 0x0108599f0418503a +patword 0x0036 0x0108599f0418503a +patword 0x0037 0x0108599f0418503a +patword 0x0038 0x0108599f0418503a +patword 0x0039 0x0108599f0418503a +patword 0x003a 0x0108599f0418503a +patword 0x003b 0x0108599f0418503a +patword 0x003c 0x0108599f0418503a +patword 0x003d 0x0108599f0418503a +patword 0x003e 0x0108599f0418503a +patword 0x003f 0x0108599f0418503a +patword 0x0040 0x0108599f0418503a +patword 0x0041 0x0108599f0418503a +patword 0x0042 0x0108599f0418503a +patword 0x0043 0x0108599f0418503a +patword 0x0044 0x0108599f0418503a +patword 0x0045 0x0108599f0418503a +patword 0x0046 0x0108599f0418503a +patword 0x0047 0x0108599f0418503a +patword 0x0048 0x0108599f0418503a +patword 0x0049 0x0108599f0418503a +patword 0x004a 0x0108599f0418503a +patword 0x004b 0x0108599f0418503a +patword 0x004c 0x0108599f0418503a +patword 0x004d 0x0108599f0418503a +patword 0x004e 0x0108599f0418503a +patword 0x004f 0x0108599f0418503a +patword 0x0050 0x0108599f0418503a +patword 0x0051 0x0108599f0418503a +patword 0x0052 0x0108599f0418503a +patword 0x0053 0x0108599f0418503a +patword 0x0054 0x0108599f0418503a +patword 0x0055 0x0108599f0418503a +patword 0x0056 0x0108599f0418503a +patword 0x0057 0x0108599f0418503a +patword 0x0058 0x0108599f0418503a +patword 0x0059 0x0108599f0418503a +patword 0x005a 0x0108599f0418503a +patword 0x005b 0x0108599f0418503a +patword 0x005c 0x0108599f0418503a +patword 0x005d 0x0108599f0418503a +patword 0x005e 0x0108599f0418503a +patword 0x005f 0x0108599f0418503a +patword 0x0060 0x0108599f0418503a +patword 0x0061 0x0108599f0418503a +patword 0x0062 0x0108599f0418503a +patword 0x0063 0x0108599f0418503a +patword 0x0064 0x0108599f0418503a +patword 0x0065 0x0108599f0418503a +patword 0x0066 0x0108599f0418503a +patword 0x0067 0x0108599f0418503a +patword 0x0068 0x0108599f0418503a +patword 0x0069 0x0108599f0418503a +patword 0x006a 0x0108599f0418503a +patword 0x006b 0x0108599f0418503a +patword 0x006c 0x0108599f0418503a +patword 0x006d 0x0108599f0418503a +patword 0x006e 0x0108599f0418503a +patword 0x006f 0x0108599f0418503a +patword 0x0070 0x0108599f0418503a +patword 0x0071 0x0108599f0418503a +patword 0x0072 0x0108599f0418503a +patword 0x0073 0x0108599f0418503a +patword 0x0074 0x0108599f0418503a +patword 0x0075 0x0108599f0418503a +patword 0x0076 0x0108599f0418503a +patword 0x0077 0x0108599f0418503a +patword 0x0078 0x0108599f0418503a +patword 0x0079 0x0108599f0418503a +patword 0x007a 0x0108599f0418503a +patword 0x007b 0x0108599f0418503a +patword 0x007c 0x0108599f0418503a +patword 0x007d 0x0108599f0418503a +patword 0x007e 0x010859960418503a +patword 0x007f 0x010859960418503a +patword 0x0080 0x010859960418503a +patword 0x0081 0x010859960418503a +patword 0x0082 0x010859960418503a +patword 0x0083 0x010859960418503a +patword 0x0084 0x010859960418503a +patword 0x0085 0x010859960418503a +patword 0x0086 0x010859960418503a +patword 0x0087 0x010859960418503a +patword 0x0088 0x010859960418503a +patword 0x0089 0x010859960418503a +patword 0x008a 0x010859960418503a +patword 0x008b 0x010859960418503a +patword 0x008c 0x010859960418503a +patword 0x008d 0x010859960418503a +patword 0x008e 0x010859960418503a +patword 0x008f 0x010859960418503a +patword 0x0090 0x010859960418503a +patword 0x0091 0x010859960418503a +patword 0x0092 0x010819960418501a +patword 0x0093 0x010819960418501a +patword 0x0094 0x010819960418501a +patword 0x0095 0x010819960418501a +patword 0x0096 0x030819960418501a +patword 0x0097 0x030819960418501a +patword 0x0098 0x030819960418501a +patword 0x0099 0x030819960418501a +patword 0x009a 0x030819960418501a +patword 0x009b 0x030819960418501a +patword 0x009c 0x030819960418501a +patword 0x009d 0x030819960418501a +patword 0x009e 0x030819960418501a +patword 0x009f 0x030819960418501a +patword 0x00a0 0x030819960418501a +patword 0x00a1 0x030819960418501a +patword 0x00a2 0x030819960418501a +patword 0x00a3 0x030819960418501a +patword 0x00a4 0x030819960418501a +patword 0x00a5 0x030819960418501a +patword 0x00a6 0x030819960418501a +patword 0x00a7 0x030819960418501a +patword 0x00a8 0x030819960418501a +patword 0x00a9 0x030819960418501a +patword 0x00aa 0x030819960418501a +patword 0x00ab 0x030819960418501a +patword 0x00ac 0x030819960008501a +patword 0x00ad 0x030819960008501a +patword 0x00ae 0x030819960008501a +patword 0x00af 0x030819960008501a +patword 0x00b0 0x030819960008501a +patword 0x00b1 0x030819960008501a +patword 0x00b2 0x030819960008501a +patword 0x00b3 0x030819960008501a +patword 0x00b4 0x030819960008501a +patword 0x00b5 0x030819960008501a +patword 0x00b6 0x030819960008501a +patword 0x00b7 0x030819960008501a +patword 0x00b8 0x030819960008501a +patword 0x00b9 0x030819960008501a +patword 0x00ba 0x030819960008501a +patword 0x00bb 0x030819960008501a +patword 0x00bc 0x030819960008501a +patword 0x00bd 0x030819960008501a +patword 0x00be 0x030819960008501a +patword 0x00bf 0x030819960008501a +patword 0x00c0 0x0308199f0008501a +patword 0x00c1 0x0308199f0008501a +patword 0x00c2 0x0308199f0008501a +patword 0x00c3 0x0308199f0008501a +patword 0x00c4 0x0308199f0008501a +patword 0x00c5 0x0308199f0008501a +patword 0x00c6 0x0308199f0008501a +patword 0x00c7 0x0308199f0008501a +patword 0x00c8 0x0308199f0008501a +patword 0x00c9 0x0308199f0008501a +patword 0x00ca 0x0308199f0008501a +patword 0x00cb 0x0308199f0008501a +patword 0x00cc 0x0308199f0008501a +patword 0x00cd 0x0308199f0008501a +patword 0x00ce 0x0308199f0008501a +patword 0x00cf 0x0308199f0008501a +patword 0x00d0 0x0308199f0008501a +patword 0x00d1 0x0308199f0008501a +patword 0x00d2 0x0308199f0008501a +patword 0x00d3 0x0308199f0008501a +patword 0x00d4 0x0308599f0008503a +patword 0x00d5 0x0308599f0008503a +patword 0x00d6 0x030c599f000850ba +patword 0x00d7 0x030c599f000850ba +patword 0x00d8 0x030c599f000850ba +patword 0x00d9 0x030c599f000850ba +patword 0x00da 0x030c599f000850ba +patword 0x00db 0x030c599f000850ba +patword 0x00dc 0x030c599f000850ba +patword 0x00dd 0x030c599f000850ba +patword 0x00de 0x030c599f000850ba +patword 0x00df 0x030c599f000850ba +patword 0x00e0 0x030c599f000850ba +patword 0x00e1 0x030c599f000850ba +patword 0x00e2 0x030c599f000850ba +patword 0x00e3 0x030c599f000850ba +patword 0x00e4 0x030c599f000850ba +patword 0x00e5 0x030c599f000850ba +patword 0x00e6 0x030c599f000850ba +patword 0x00e7 0x030c599f000850ba +patword 0x00e8 0x030c599f000850ba +patword 0x00e9 0x030c599f000850ba +patword 0x00ea 0x030c799f010858ba +patword 0x00eb 0x030c799f010858ba +patword 0x00ec 0x030c599f000850ba +patword 0x00ed 0x030c599f000850ba +patword 0x00ee 0x030c599f000850ba +patword 0x00ef 0x030c599f000850ba +patword 0x00f0 0x030c599f000850ba +patword 0x00f1 0x030c599f000850ba +patword 0x00f2 0x030c599f000850ba +patword 0x00f3 0x030c599f000850ba +patword 0x00f4 0x030c599f000850ba +patword 0x00f5 0x030c599f000850ba +patword 0x00f6 0x030c599f000850ba +patword 0x00f7 0x030c599f000850ba +patword 0x00f8 0x030c599f000850ba +patword 0x00f9 0x030c599f000850ba +patword 0x00fa 0x030c599f000850ba +patword 0x00fb 0x030c599f000850ba +patword 0x00fc 0x030c599f000850ba +patword 0x00fd 0x030c599f000850ba +patword 0x00fe 0x030c599f000850ba +patword 0x00ff 0x030c599f000850ba +patword 0x0100 0x030c599f000850ba +patword 0x0101 0x030c599f000850ba +patword 0x0102 0x030c599f400850ba +patword 0x0103 0x030c599f400850ba +patword 0x0104 0x030c599f600850ba +patword 0x0105 0x030c599f400850ba +patword 0x0106 0x030c599f400850ba +patword 0x0107 0x030c599f400850ba +patword 0x0108 0x870c599f682e50ba +patword 0x0109 0x870c599f482850ba +patword 0x010a 0x870c599f000e50ba +patword 0x010b 0x870c599f000850ba +patword 0x010c 0x870c599f000e50ba +patword 0x010d 0x870c599f000850ba +patword 0x010e 0x870c599f000e50ba +patword 0x010f 0x870c599f000850ba +patword 0x0110 0x870c599f000e50ba +patword 0x0111 0x870c599f000850ba +patword 0x0112 0x870c599f000e50ba +patword 0x0113 0x870c599f000850ba +patword 0x0114 0x870c599f000e50ba +patword 0x0115 0x870c599f000850ba +patword 0x0116 0x870c599f000e50ba +patword 0x0117 0x870c599f000850ba +patword 0x0118 0x870c599f000e50ba +patword 0x0119 0x870c599f000850ba +patword 0x011a 0x870c599f000e50ba +patword 0x011b 0x870c599f000850ba +patword 0x011c 0x870c599f000e50ba +patword 0x011d 0x870c599f000850ba +patword 0x011e 0x870c599f000e50ba +patword 0x011f 0x870c599f000850ba +patword 0x0120 0x870c599f000e50ba +patword 0x0121 0x870c599f000850ba +patword 0x0122 0x870c599f200e50ba +patword 0x0123 0x870c599f000850ba +patword 0x0124 0x870c599f000e50ba +patword 0x0125 0x870c599f000850ba +patword 0x0126 0x870c599f000e50ba +patword 0x0127 0x870c599f000850ba +patword 0x0128 0x870c599f000e50ba +patword 0x0129 0x870c599f000850ba +patword 0x012a 0x870c599f000e50ba +patword 0x012b 0x870c599f000850ba +patword 0x012c 0x870c599f000e50ba +patword 0x012d 0x870c599f000850ba +patword 0x012e 0x870c599f000e50ba +patword 0x012f 0x870c599f000850ba +patword 0x0130 0x870c599f000e50ba +patword 0x0131 0x870c599f000850ba +patword 0x0132 0x870c599f000e50ba +patword 0x0133 0x870c599f000850ba +patword 0x0134 0x870c599f000e50ba +patword 0x0135 0x870c599f000850ba +patword 0x0136 0x870c599f000e50ba +patword 0x0137 0x870c599f000850ba +patword 0x0138 0x870c599f000e50ba +patword 0x0139 0x870c599f000850ba +patword 0x013a 0x870c599f282e50ba +patword 0x013b 0x870c599f082850ba +patword 0x013c 0x870c599f000e50ba +patword 0x013d 0x870c599f000850ba +patword 0x013e 0x870c599f000e50ba +patword 0x013f 0x870c599f000850ba +patword 0x0140 0x870c599f000e50ba +patword 0x0141 0x870c599f000850ba +patword 0x0142 0x870c599f000e50ba +patword 0x0143 0x870c599f000850ba +patword 0x0144 0x870c599f000e50ba +patword 0x0145 0x870c599f000850ba +patword 0x0146 0x870c599f000e50ba +patword 0x0147 0x870c599f000850ba +patword 0x0148 0x870c599f000e50ba +patword 0x0149 0x870c599f000850ba +patword 0x014a 0x870c599f000e50ba +patword 0x014b 0x870c599f000850ba +patword 0x014c 0x870c599f000e50ba +patword 0x014d 0x870c599f000850ba +patword 0x014e 0x870c599f000e50ba +patword 0x014f 0x870c599f000850ba +patword 0x0150 0x870c599f000e50ba +patword 0x0151 0x870c599f000850ba +patword 0x0152 0x870c599f000e50ba +patword 0x0153 0x870c599f000850ba +patword 0x0154 0x870c599f200e50ba +patword 0x0155 0x870c599f000850ba +patword 0x0156 0x870c599f000e50ba +patword 0x0157 0x870c599f000850ba +patword 0x0158 0x870c599f000e50ba +patword 0x0159 0x870c599f000850ba +patword 0x015a 0x870c599f000e50ba +patword 0x015b 0x870c599f000850ba +patword 0x015c 0x870c599f000e50ba +patword 0x015d 0x870c599f000850ba +patword 0x015e 0x870c599f000e50ba +patword 0x015f 0x870c599f000850ba +patword 0x0160 0x870c599f000e50ba +patword 0x0161 0x870c599f000850ba +patword 0x0162 0x870c599f000e50ba +patword 0x0163 0x870c599f000850ba +patword 0x0164 0x870c599f000e50ba +patword 0x0165 0x870c599f000850ba +patword 0x0166 0x870c599f000e50ba +patword 0x0167 0x870c599f000850ba +patword 0x0168 0x870c599f000e50ba +patword 0x0169 0x870c599f000850ba +patword 0x016a 0x870c599f000e50ba +patword 0x016b 0x870c599f000850ba +patword 0x016c 0x070c599f000850ba +patword 0x016d 0x070c599f000850ba +patword 0x016e 0x000c599f000850ba +patword 0x016f 0x000c599f000850ba +patword 0x0170 0x0008599f200e503a +patword 0x0171 0x0008599f0008503a +patword 0x0172 0x0008599f200e503a +patword 0x0173 0x0008599f0008503a +patword 0x0174 0x0008599f0008503a +patword 0x0175 0x0008599f0008503a +patword 0x0176 0x0008599f0008503a +patword 0x0177 0x0008599f0008503a +patword 0x0178 0x0008599f0008503a +patword 0x0179 0x0008599f0008503a +patword 0x017a 0x0008599f0008503a +patword 0x017b 0x0008599f0008503a +patword 0x017c 0x0008599f0008503a +patword 0x017d 0x0008599f0008503a +patword 0x017e 0x0008599f0008503a +patword 0x017f 0x0008599f0008503a +patword 0x0180 0x0008599f0008503a +patword 0x0181 0x0008599f0008503a +patword 0x0182 0x0008599f0008503a +patword 0x0183 0x0008599f0008503a +patword 0x0184 0x0008599f0008503a +patword 0x0185 0x0008599f0008503a +patword 0x0186 0x0008599f0008503a +patword 0x0187 0x0008599f0008503a +patword 0x0188 0x0008599f0008503a +patword 0x0189 0x0008599f0008503a +patword 0x018a 0x0008599f0008503a +patword 0x018b 0x0008599f0008503a +patword 0x018c 0x0008599f0008503a +patword 0x018d 0x0008599f0008503a +patioctrl 0x8f0effff6dbffdbf +patclkctrl 0x0000000000000000 +patlimits 0x0000 0x018c +patloop0 0x013a 0x016b +patnloop0 199 +patloop1 0x0400 0x0400 +patnloop1 0 +patloop2 0x0400 0x0400 +patnloop2 0 +patwait0 0x00aa +patwaittime0 10000 +patwait1 0x0400 +patwaittime1 0 +patwait2 0x0400 +patwaittime2 0 + diff --git a/slsDetectorServers/moenchDetectorServer/Makefile b/slsDetectorServers/moenchDetectorServer/Makefile index 5285f2ea2..9589da771 100755 --- a/slsDetectorServers/moenchDetectorServer/Makefile +++ b/slsDetectorServers/moenchDetectorServer/Makefile @@ -12,7 +12,7 @@ DESTDIR ?= bin INSTMODE = 0777 SRCS = slsDetectorFunctionList.c -SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c +SRCS += $(main_src)slsDetectorServer.c $(main_src)slsDetectorServer_funcs.c $(main_src)communication_funcs.c $(main_src)blackfin.c $(main_src)common.c $(main_src)commonServerFunctions.c $(main_src)communication_funcs_UDP.c $(main_src)UDPPacketHeaderGenerator.c $(main_src)AD9257.c $(main_src)ALTERA_PLL.c $(main_src)LTC2620.c $(main_src)MAX1932.c $(main_src)programFpgaBlackfin.c $(main_src)readDefaultPattern.c OBJS = $(SRCS:.c=.o) diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 5f32a8451989eba90a1abff25f0c7450ccd81171..439291dda044f8a687dff1b24a77fd21312ddbdf 100755 GIT binary patch literal 186624 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 z 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 delta 87709 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 diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 2c7604a74..637aa8fbf 100755 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -968,9 +968,12 @@ void setDAC(enum DACINDEX ind, int val, int mV) { if (val < 0 && val != LTC2620_GetPowerDownValue()) return; - FILE_LOG(logDEBUG1, ("Setting dac[%d]: %d %s \n", (int)ind, val, (mV ? "mV" : "dac units"))); + char* dac_names[] = {DAC_NAMES}; + FILE_LOG(logINFO, ("Setting DAC %s\n", dac_names[ind])); + FILE_LOG(logDEBUG, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dac_names[ind], val, (mV ? "mV" : "dac units"))); int dacval = val; #ifdef VIRTUAL + FILE_LOG(logINFO, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dac_names[ind], val, (mV ? "mV" : "dac units"))); if (!mV) { dacValues[ind] = val; } diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h index 427a74223..694d4eb83 100755 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h @@ -37,6 +37,7 @@ typedef struct udp_header_struct { /* Enums */ enum DACINDEX {MO_VBP_COLBUF, MO_VIPRE, MO_VIN_CM, MO_VB_SDA, MO_VCASC_SFP, MO_VOUT_CM, MO_VIPRE_CDS, MO_IBIAS_SFP}; +#define DAC_NAMES "vbp_colbuf", "vipre", "vin_cm", "vb_sda", "vcasc_sfp", "vout_cm", "vipre_cds", "ibias_sfp" #define DEFAULT_DAC_VALS { 1300, /* MO_VBP_COLBUF */ \ 1000, /* MO_VIPRE */ \ 1400, /* MO_VIN_CM */ \ From fca7d51cb4670e73c51fdb2d4469025781e78e50 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 3 Mar 2020 16:30:28 +0100 Subject: [PATCH 5/5] moench: removed hardcoding ny in call back for gui --- slsDetectorSoftware/src/DetectorImpl.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index 95eb7387d..49160833e 100755 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -557,10 +557,6 @@ void DetectorImpl::readFrameFromReceiver() { uint32_t yoffset = coordY * nPixelsY; uint32_t singledetrowoffset = nPixelsX * bytesPerPixel; uint32_t rowoffset = nX * singledetrowoffset; - if (multi_shm()->multiDetectorType == MOENCH) { - singledetrowoffset = size; - nPixelsY = 1; // TODO: nDetPixelsY is not updated. - } FILE_LOG(logDEBUG1) << "Multi Image Info:"

rNxr&%GNhK12#33oj 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 l8uuM}zmrR4eDdLjHX0xo`=3$D`2Q*sB18ZH diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 77513d918..6c0bcc36f 100755 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -9,6 +9,7 @@ #include "MAX1932.h" // hv #include "ALTERA_PLL.h" // pll #include "blackfin.h" +#include "readDefaultPattern.h" #include "common.h" #include @@ -55,6 +56,7 @@ uint32_t clkFrequency[NUM_CLOCKS] = {40, 20, 20, 200}; int dacValues[NDAC] = {}; // software limit that depends on the current chip on the ctb int vLimit = 0; +enum detectorSettings thisSettings = UNINITIALIZED; int highvoltage = 0; int nSamples = 1; int detPos[2] = {0, 0}; @@ -521,6 +523,8 @@ void setupDetector() { initError = FAIL; } setPipeline(ADC_CLK, DEFAULT_PIPELINE); + loadDefaultPattern(DEFAULT_PATTERN_FILE); + setSettings(DEFAULT_SETTINGS); } int updateDatabytesandAllocateRAM() { @@ -862,10 +866,99 @@ int64_t getMeasurementTime() { } - /* parameters - settings */ + +enum detectorSettings setSettings(enum detectorSettings sett){ + if (sett == UNINITIALIZED) + return thisSettings; + + // set settings + if(sett != GET_SETTINGS) { + switch (sett) { + case G1_HIGHGAIN: + FILE_LOG(logINFO, ("Set settings - G1_HIGHGAIN\n")); + setPatternMask(G1_HIGHGAIN_PATMASK); + break; + case G1_LOWGAIN: + FILE_LOG(logINFO, ("Set settings - G1_LOWGAIN\n")); + setPatternMask(G1_LOWGAIN_PATMASK); + break; + case G2_HIGHCAP_HIGHGAIN: + FILE_LOG(logINFO, ("Set settings - G2_HIGHCAP_HIGHGAIN\n")); + setPatternMask(G2_HIGHCAP_HIGHGAIN_PATMASK); + break; + case G2_HIGHCAP_LOWGAIN: + FILE_LOG(logINFO, ("Set settings - G2_HIGHCAP_LOWGAIN\n")); + setPatternMask(G2_HIGHCAP_LOWGAIN_PATMASK); + break; + case G2_LOWCAP_HIGHGAIN: + FILE_LOG(logINFO, ("Set settings - G2_LOWCAP_HIGHGAIN\n")); + setPatternMask(G2_LOWCAP_HIGHGAIN_PATMASK); + break; + case G2_LOWCAP_LOWGAIN: + FILE_LOG(logINFO, ("Set settings - G2_LOWCAP_LOWGAIN\n")); + setPatternMask(G2_LOWCAP_LOWGAIN_PATMASK); + break; + case G4_HIGHGAIN: + FILE_LOG(logINFO, ("Set settings - G4_HIGHGAIN\n")); + setPatternMask(G4_HIGHGAIN_PATMASK); + break; + case G4_LOWGAIN: + FILE_LOG(logINFO, ("Set settings - G4_LOWGAIN\n")); + setPatternMask(G4_LOWGAIN_PATMASK); + break; + default: + FILE_LOG(logERROR, ("This settings is not defined for this detector %d\n", (int)sett)); + return -1; + } + setPatternBitMask(DEFAULT_PATSETBIT); + thisSettings = sett; + } + + return getSettings(); +} + enum detectorSettings getSettings() { - return UNDEFINED; + + uint64_t patsetbit = getPatternBitMask(); + if (patsetbit != DEFAULT_PATSETBIT) { + FILE_LOG(logERROR, ("Patsetbit is 0x%llx, and not 0x%llx. Undefined Settings!\n", patsetbit, DEFAULT_PATSETBIT)); + thisSettings = UNDEFINED; + return thisSettings; + } + + uint64_t patsetmask = getPatternMask(); + switch (patsetmask) { + case G1_HIGHGAIN_PATMASK: + thisSettings = G1_HIGHGAIN; + break; + case G1_LOWGAIN_PATMASK: + thisSettings = G1_LOWGAIN; + break; + case G2_HIGHCAP_HIGHGAIN_PATMASK: + thisSettings = G2_HIGHCAP_HIGHGAIN; + break; + case G2_HIGHCAP_LOWGAIN_PATMASK: + thisSettings = G2_HIGHCAP_LOWGAIN; + break; + case G2_LOWCAP_HIGHGAIN_PATMASK: + thisSettings = G2_LOWCAP_HIGHGAIN; + break; + case G2_LOWCAP_LOWGAIN_PATMASK: + thisSettings = G2_LOWCAP_LOWGAIN; + break; + case G4_HIGHGAIN_PATMASK: + thisSettings = G4_HIGHGAIN; + break; + case G4_LOWGAIN_PATMASK: + thisSettings = G4_LOWGAIN; + break; + default: + FILE_LOG(logERROR, ("Patsetmask is 0x%llx. Undefined Settings!\n", patsetmask)); + thisSettings = UNDEFINED; + break; + } + return thisSettings; } /* parameters - dac, adc, hv */ @@ -1690,6 +1783,7 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { void setPatternMask(uint64_t mask) { + FILE_LOG(logINFO, ("Setting pattern mask to 0x%llx\n", mask)); set64BitReg(mask, PATTERN_MASK_LSB_REG, PATTERN_MASK_MSB_REG); } @@ -1698,6 +1792,7 @@ uint64_t getPatternMask() { } void setPatternBitMask(uint64_t mask) { + FILE_LOG(logINFO, ("Setting pattern bit mask to 0x%llx\n", mask)); set64BitReg(mask, PATTERN_SET_LSB_REG, PATTERN_SET_MSB_REG); } @@ -1706,6 +1801,7 @@ uint64_t getPatternBitMask() { } + /* aquisition */ int startStateMachine(){ diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h index 2641a83d2..427a74223 100755 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorServer_defs.h @@ -60,6 +60,7 @@ enum CLKINDEX {RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS}; #define NSAMPLES_PER_ROW (25) /** Default Parameters */ +#define DEFAULT_PATTERN_FILE ("DefaultPattern.txt") #define DEFAULT_DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL) #define DEFAULT_NUM_SAMPLES (5000) #define DEFAULT_EXPTIME (0) @@ -77,6 +78,18 @@ enum CLKINDEX {RUN_CLK, ADC_CLK, SYNC_CLK, DBIT_CLK, NUM_CLOCKS}; #define DEFAULT_DBIT_CLK (20) #define DEFAULT_ADC_PHASE_DEG (30) #define DEFAULT_PIPELINE (14) +#define DEFAULT_SETTINGS (G4_HIGHGAIN) + +// settings +#define DEFAULT_PATSETBIT (0x40800000115ULL) +#define G1_HIGHGAIN_PATMASK (0x40800000101ULL) +#define G1_LOWGAIN_PATMASK (0x40000000100ULL) +#define G2_HIGHCAP_HIGHGAIN_PATMASK (0x00800000001ULL) +#define G2_HIGHCAP_LOWGAIN_PATMASK (0x00000000000ULL) +#define G2_LOWCAP_HIGHGAIN_PATMASK (0x40800000115ULL) +#define G2_LOWCAP_LOWGAIN_PATMASK (0x40000000114ULL) +#define G4_HIGHGAIN_PATMASK (0x00800000015ULL) +#define G4_LOWGAIN_PATMASK (0x00000000014ULL) #define HIGHVOLTAGE_MIN (60) #define HIGHVOLTAGE_MAX (200) // min dac val diff --git a/slsDetectorServers/slsDetectorServer/include/readDefaultPattern.h b/slsDetectorServers/slsDetectorServer/include/readDefaultPattern.h new file mode 100755 index 000000000..a1554236a --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/include/readDefaultPattern.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +int loadDefaultPattern(char* fname); + +int default_writePatternWord(char* line, uint32_t addr, uint64_t word); + +int default_writePatternIOControl(char* line, uint64_t arg); + +int default_writePatternClkControl(char* line, uint64_t arg); + +int default_setPatternLoopLimits(char* line, uint32_t startAddr, uint32_t stopAddr); + +int default_setPatternLoopAddresses(char* line, int level, uint32_t startAddr, uint32_t stopAddr); + +int default_setPatternLoopCycles(char* line, int level, int numLoops); + +int default_setPatternWaitAddresses(char* line, int level, uint32_t addr); + +int default_setPatternWaitTime(char* line, int level, uint64_t waittime); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 71696a9c7..9483c33b1 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -257,7 +257,7 @@ int64_t getMeasurementTime(); int setModule(sls_detector_module myMod, char* mess); int getModule(sls_detector_module *myMod); #endif -#if (!defined(CHIPTESTBOARDD)) && (!defined(MOENCHD)) && (!defined(MYTHEN3D)) +#if (!defined(CHIPTESTBOARDD)) && (!defined(MYTHEN3D)) enum detectorSettings setSettings(enum detectorSettings sett); #endif #if !defined(MYTHEN3D) @@ -403,6 +403,9 @@ uint64_t getPatternMask(); void setPatternBitMask(uint64_t mask); uint64_t getPatternBitMask(); #endif +#ifdef MOENCHD +extern int loadDefaultPattern(char* fname); // readDefaultPattern.h +#endif // jungfrau specific - powerchip, autocompdisable, clockdiv, asictimer, clock, pll, flashing firmware #ifdef JUNGFRAUD diff --git a/slsDetectorServers/slsDetectorServer/src/readDefaultPattern.c b/slsDetectorServers/slsDetectorServer/src/readDefaultPattern.c new file mode 100755 index 000000000..a50b3c5b5 --- /dev/null +++ b/slsDetectorServers/slsDetectorServer/src/readDefaultPattern.c @@ -0,0 +1,414 @@ +#include "readDefaultPattern.h" +#include "sls_detector_defs.h" +#include "slsDetectorServer_defs.h" +#include "ansi.h" +#include "clogger.h" + +#include + +extern char initErrorMessage[MAX_STR_LENGTH]; +extern int initError; + +extern uint64_t writePatternIOControl(uint64_t word); +extern uint64_t writePatternClkControl(uint64_t word); +extern uint64_t writePatternWord(int addr, uint64_t word); +extern int setPatternWaitAddress(int level, int addr); +extern uint64_t setPatternWaitTime(int level, uint64_t t); +extern void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop); + + +int loadDefaultPattern(char* fname) { + if (initError == FAIL) { + return initError; + } + + FILE* fd = fopen(fname, "r"); + if(fd == NULL) { + sprintf(initErrorMessage, "Could not open pattern file [%s].\n", fname); + initError = FAIL; + FILE_LOG(logERROR, ("%s\n\n", initErrorMessage)); + return FAIL; + } + FILE_LOG(logINFOBLUE, ("Reading default pattern file %s\n", fname)); + + + // Initialization + const size_t LZ = 256; + char line[LZ]; + memset(line, 0, LZ); + char command[LZ]; + + // keep reading a line + while (fgets(line, LZ, fd)) { + + // ignore comments + if (line[0] == '#') { + FILE_LOG(logDEBUG1, ("Ignoring Comment\n")); + continue; + } + + // ignore empty lines + if (strlen(line) <= 1) { + FILE_LOG(logDEBUG1, ("Ignoring Empty line\n")); + continue; + } + + FILE_LOG(logDEBUG1, ("Command to process: (size:%d) %.*s\n", + strlen(line), strlen(line) -1, line)); + memset(command, 0, LZ); + + // patword + if (!strncmp(line, "patword", strlen("patword"))) { + uint32_t addr = 0; + uint64_t word = 0; + + // cannot scan values + if (sscanf(line, "%s 0x%x 0x%llx", command, &addr, &word) != 3) { + sprintf(initErrorMessage, "Could not scan patword arguments from default " + "pattern file. Line:[%s].\n", line); + break; + } + + if (default_writePatternWord(line, addr, word) == FAIL) { + break; + } + } + + // patioctrl + if (!strncmp(line, "patioctrl", strlen("patioctrl"))) { + uint64_t arg = 0; + + // cannot scan values + if (sscanf(line, "%s 0x%llx", command, &arg) != 2) { + sprintf(initErrorMessage, "Could not scan patioctrl arguments from default " + "pattern file. Line:[%s].\n", line); + break; + } + + if (default_writePatternIOControl(line, arg) == FAIL) { + break; + } + } + + // patclkctrl + if (!strncmp(line, "patclkctrl", strlen("patclkctrl"))) { + uint64_t arg = 0; + + // cannot scan values + if (sscanf(line, "%s 0x%llx", command, &arg) != 2) { + sprintf(initErrorMessage, "Could not scan patclkctrl arguments from default " + "pattern file. Line:[%s].\n", line); + break; + } + + if (default_writePatternClkControl(line, arg) == FAIL) { + break; + } + } + + // patlimits + if (!strncmp(line, "patlimits", strlen("patlimits"))) { + uint32_t startAddr = 0; + uint32_t stopAddr = 0; + + // cannot scan values + if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) != 3) { + sprintf(initErrorMessage, "Could not scan patlimits arguments from default " + "pattern file. Line:[%s].\n", line); + break; + } + + if (default_setPatternLoopLimits(line, startAddr, stopAddr) == FAIL) { + break; + } + } + + // patloop + if ((!strncmp(line, "patloop0", strlen("patloop0"))) || + (!strncmp(line, "patloop1", strlen("patloop1"))) || + (!strncmp(line, "patloop2", strlen("patloop2")))) { + + // level + int level = -1; + if (!strncmp(line, "patloop0", strlen("patloop0"))) { + level = 0; + } else if (!strncmp(line, "patloop1", strlen("patloop1"))) { + level = 1; + } else { + level = 2; + } + + uint32_t startAddr = 0; + uint32_t stopAddr = 0; + // cannot scan values + if (sscanf(line, "%s 0x%x 0x%x", command, &startAddr, &stopAddr) != 3) { + sprintf(initErrorMessage, "Could not scan patloop%d arguments from default " + "pattern file. Line:[%s].\n", level, line); + break; + } + + if (default_setPatternLoopAddresses(line, level, startAddr, stopAddr) == FAIL) { + break; + } + } + + // patnloop + if ((!strncmp(line, "patnloop0", strlen("patnloop0"))) || + (!strncmp(line, "patnloop1", strlen("patnloop1"))) || + (!strncmp(line, "patnloop2", strlen("patnloop2")))) { + + // level + int level = -1; + if (!strncmp(line, "patnloop0", strlen("patnloop0"))) { + level = 0; + } else if (!strncmp(line, "patnloop1", strlen("patnloop1"))) { + level = 1; + } else { + level = 2; + } + + int numLoops = -1; + // cannot scan values + if (sscanf(line, "%s %d", command, &numLoops) != 2) { + sprintf(initErrorMessage, "Could not scan patnloop%d arguments from default " + "pattern file. Line:[%s].\n", level, line); + break; + } + + if (default_setPatternLoopCycles(line, level, numLoops) == FAIL) { + break; + } + } + + // patwait + if ((!strncmp(line, "patwait0", strlen("patwait0"))) || + (!strncmp(line, "patwait1", strlen("patwait1"))) || + (!strncmp(line, "patwait2", strlen("patwait2")))) { + + // level + int level = -1; + if (!strncmp(line, "patwait0", strlen("patwait0"))) { + level = 0; + } else if (!strncmp(line, "patwait1", strlen("patwait1"))) { + level = 1; + } else { + level = 2; + } + + uint32_t addr = 0; + // cannot scan values + if (sscanf(line, "%s 0x%x", command, &addr) != 2) { + sprintf(initErrorMessage, "Could not scan patwait%d arguments from default " + "pattern file. Line:[%s].\n", level, line); + break; + } + + if (default_setPatternWaitAddresses(line, level, addr) == FAIL) { + break; + } + } + + // patwaittime + if ((!strncmp(line, "patwaittime0", strlen("patwaittime0"))) || + (!strncmp(line, "patwaittime1", strlen("patwaittime1"))) || + (!strncmp(line, "patwaittime2", strlen("patwaittime2")))) { + + // level + int level = -1; + if (!strncmp(line, "patwaittime0", strlen("patwaittime0"))) { + level = 0; + } else if (!strncmp(line, "patwaittime1", strlen("patwaittime1"))) { + level = 1; + } else { + level = 2; + } + + uint64_t waittime = 0; + + // cannot scan values + if (sscanf(line, "%s %lld", command, &waittime) != 2) { + sprintf(initErrorMessage, "Could not scan patwaittime%d arguments from default " + "pattern file. Line:[%s].\n", level, line); + break; + } + + if (default_setPatternWaitTime(line, level, waittime) == FAIL) { + break; + } + } + + memset(line, 0, LZ); + } + fclose(fd); + + if (strlen(initErrorMessage)) { + initError = FAIL; + FILE_LOG(logERROR, ("%s\n\n", initErrorMessage)); + } else { + FILE_LOG(logINFOBLUE, ("Successfully read default pattern file\n")); + } + return initError; +} + + +int default_writePatternWord(char* line, uint32_t addr, uint64_t word) { + //validations + if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { + sprintf(initErrorMessage, "Cannot set pattern word from default " + "pattern file. Addr must be between 0 and 0x%x. Line:[%s]\n", + MAX_PATTERN_LENGTH, line); + return FAIL; + } + writePatternWord(addr, word); + // cannot validate for moench, ctb ( same as executing pattern word) + return OK; +} + +int default_writePatternIOControl(char* line, uint64_t arg) { + uint64_t retval = writePatternIOControl(arg); + if (retval != arg) { + sprintf(initErrorMessage, "Could not set patioctrl from default pattern " + "file. Set 0x%llx, read 0x%llx. Line:[%s]\n", arg, retval, line); + return FAIL; + } + return OK; +} + + +int default_writePatternClkControl(char* line, uint64_t arg) { + uint64_t retval = writePatternClkControl(arg); + if (retval != arg) { + sprintf(initErrorMessage, "Could not set patclkctrl from default pattern " + "file. Set 0x%llx, read 0x%llx. Line:[%s]\n", arg, retval, line); + return FAIL; + } + return OK; +} + +int default_setPatternLoopLimits(char* line, uint32_t startAddr, uint32_t stopAddr) { + //validations + if (startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH || + stopAddr < 0 || stopAddr >= MAX_PATTERN_LENGTH) { + sprintf(initErrorMessage, "Cannot set patlimits from default " + "pattern file. Addr must be between 0 and 0x%x. Line:[%s]\n", + MAX_PATTERN_LENGTH, line); + return FAIL; + } + int numLoops = -1; + int r_startAddr = startAddr, r_stopAddr = stopAddr; + setPatternLoop(-1, &r_startAddr, &r_stopAddr, &numLoops); + + // validate + if (r_startAddr != startAddr || r_stopAddr != stopAddr) { + sprintf(initErrorMessage, "Could not set patlimits from default pattern " + "file. Read start addr:0x%x, stop addr: 0x%x. Line:[%s]\n", + r_startAddr, r_stopAddr, line); + return FAIL; + } + return OK; +} + +int default_setPatternLoopAddresses(char* line, int level, uint32_t startAddr, uint32_t stopAddr) { + //validations + if (level < 0 || level > 2) { + sprintf(initErrorMessage, "Cannot set patloop from default " + "pattern file. Level must be between 0 and 2. Line:[%s]\n", + line); + return FAIL; + } + if (startAddr < 0 || startAddr >= MAX_PATTERN_LENGTH || + stopAddr < 0 || stopAddr >= MAX_PATTERN_LENGTH) { + sprintf(initErrorMessage, "Cannot set patloop (level: %d) from default " + "pattern file. Addr must be between 0 and 0x%x. Line:[%s]\n", + level, MAX_PATTERN_LENGTH, line); + return FAIL; + } + int numLoops = -1; + int r_startAddr = startAddr, r_stopAddr = stopAddr; + setPatternLoop(level, &r_startAddr, &r_stopAddr, &numLoops); + + // validate + if (r_startAddr != startAddr || r_stopAddr != stopAddr) { + sprintf(initErrorMessage, "Could not set patloop (level: %d) from default " + "pattern file. Read start addr:0x%x, stop addr: 0x%x. Line:[%s]\n", + level, r_startAddr, r_stopAddr, line); + return FAIL; + } + return OK; +} + +int default_setPatternLoopCycles(char* line, int level, int numLoops) { + //validations + if (level < 0 || level > 2) { + sprintf(initErrorMessage, "Cannot set patnloop from default " + "pattern file. Level must be between 0 and 2. Line:[%s]\n", + line); + return FAIL; + } + if (numLoops < 0) { + sprintf(initErrorMessage, "Cannot set patnloop from default " + "pattern file. Iterations must be between > 0. Line:[%s]\n", + line); + return FAIL; + } + int startAddr = -1; + int stopAddr = -1; + int r_numLoops = numLoops; + setPatternLoop(level, &startAddr, &stopAddr, &r_numLoops); + + // validate + if (r_numLoops != numLoops) { + sprintf(initErrorMessage, "Could not set patnloop (level: %d) from default " + "pattern file. Read %d loops. Line:[%s]\n", + level, r_numLoops, line); + return FAIL; + } + return OK; +} + +int default_setPatternWaitAddresses(char* line, int level, uint32_t addr) { + //validations + if (level < 0 || level > 2) { + sprintf(initErrorMessage, "Cannot set patwait address from default " + "pattern file. Level must be between 0 and 2. Line:[%s]\n", + line); + return FAIL; + } + if (addr < 0 || addr >= MAX_PATTERN_LENGTH) { + sprintf(initErrorMessage, "Cannot set patwait address (level: %d) from default " + "pattern file. Addr must be between 0 and 0x%x. Line:[%s]\n", + level, MAX_PATTERN_LENGTH, line); + return FAIL; + } + + int retval = setPatternWaitAddress(level, addr); + + // validate + if (retval != addr) { + sprintf(initErrorMessage, "Could not set patwait address (level: %d) from default " + "pattern file. Read addr: 0x%x. Line:[%s]\n", + level, retval, line); + return FAIL; + } + return OK; +} + +int default_setPatternWaitTime(char* line, int level, uint64_t waittime) { + //validations + if (level < 0 || level > 2) { + sprintf(initErrorMessage, "Cannot set patwaittime from default " + "pattern file. Level must be between 0 and 2. Line:[%s]\n", + line); + return FAIL; + } + uint64_t retval = setPatternWaitTime(level, waittime); + + // validate + if (retval != waittime) { + sprintf(initErrorMessage, "Could not set patwaittime (level: %d) from default " + "pattern file. Read %lld wait time. Line:[%s]\n", + level, retval, line); + return FAIL; + } + return OK; +} diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 42137d235..7c709d39e 100755 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -1670,7 +1670,7 @@ int set_settings(int file_des) { if (receiveData(file_des, &isett, sizeof(isett), INT32) < 0) return printSocketReadError(); -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(CHIPTESTBOARDD) || defined(MYTHEN3D) functionNotImplemented(); #else FILE_LOG(logDEBUG1, ("Setting settings %d\n", isett)); @@ -1698,6 +1698,15 @@ int set_settings(int file_des) { case DYNAMICGAIN: case FIXGAIN1: case FIXGAIN2: +#elif MOENCHD + case G1_HIGHGAIN: + case G1_LOWGAIN: + case G2_HIGHCAP_HIGHGAIN: + case G2_HIGHCAP_LOWGAIN: + case G2_LOWCAP_HIGHGAIN: + case G2_LOWCAP_LOWGAIN: + case G4_HIGHGAIN: + case G4_LOWGAIN: #endif break; default: @@ -2818,7 +2827,7 @@ int send_update(int file_des) { if (n < 0) return printSocketReadError(); // settings -#if defined(EIGERD) || defined(JUNGFRAUD) || defined(GOTTHARDD) +#if defined(EIGERD) || defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(GOTTHARD2D)|| defined(MOENCHD) i32 = (int)getSettings(); n = sendData(file_des,&i32,sizeof(i32),INT32); if (n < 0) return printSocketReadError(); diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index ce8128602..8cbe0cd55 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -101,6 +101,8 @@ class Detector { /** [Jungfrau] Options:DYNAMICGAIN, DYNAMICHG0, FIXGAIN1, FIXGAIN2, FORCESWITCHG1, FORCESWITCHG2 * [Gotthard] Options: DYNAMICGAIN, HIGHGAIN, LOWGAIN, MEDIUMGAIN, VERYHIGHGAIN * [Gotthard2] Options: DYNAMICGAIN, FIXGAIN1, FIXGAIN2 + * [Moench] Options: G1_HIGHGAIN, G1_LOWGAIN, G2_HIGHCAP_HIGHGAIN, G2_HIGHCAP_LOWGAIN, + * G2_LOWCAP_HIGHGAIN, G2_LOWCAP_LOWGAIN, G4_HIGHGAIN, G4_LOWGAIN */ void setSettings(defs::detectorSettings value, Positions pos = {}); diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index d5d072df0..2c83f5679 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1013,10 +1013,14 @@ class CmdProxy { "\n\tSerial number or MAC of detector (hex)."); INTEGER_COMMAND(settings, getSettings, setSettings, sls::StringTo, - "[standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain, dynamichg0, fixgain1, fixgain2, forceswitchg1, forceswitchg2, verylowgain]" - "\n\t[Jungfrau] - Detector Settings [dynamicgain | dynamichg0 | fixgain1 | fixgain2 | forceswitchg1 | forceswitchg2]" - "\n\t[Gotthard] - Detector Settings [dynamicgain | highgain | lowgain | mediumgain | veryhighgain]" - "\n\t[Gotthard2] - Detector Settings [dynamicgain | fixgain1 | fixgain2]" + "[standard, fast, highgain, dynamicgain, lowgain, mediumgain, veryhighgain, dynamichg0, " + "fixgain1, fixgain2, forceswitchg1, forceswitchg2, verylowgain, g1_hg, g1_lg, g2_hc_hg, g2_hc_lg, " + "g2_lc_hg, g2_lc_lg, g4_hg, g4_lg]" + "\n\t Detector Settings" + "\n\t[Jungfrau] - [dynamicgain | dynamichg0 | fixgain1 | fixgain2 | forceswitchg1 | forceswitchg2]" + "\n\t[Gotthard] - [dynamicgain | highgain | lowgain | mediumgain | veryhighgain]" + "\n\t[Gotthard2] - [dynamicgain | fixgain1 | fixgain2]" + "\n\t[Moench] - [g1_hg | g1_lg | g2_hc_hg | g2_hc_lg | g2_lc_hg | g2_lc_lg | g4_hg | g4_lg]" "\n\t[Eiger] Use threshold or thresholdnotb."); /* acquisition parameters */ diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index 1a9c36e21..fe4a9ab49 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -758,8 +758,9 @@ void slsDetector::updateCachedDetectorVariables() { shm()->dynamicRange = i32; // settings - if (shm()->myDetectorType == EIGER || - shm()->myDetectorType == JUNGFRAU || shm()->myDetectorType == GOTTHARD) { + if (shm()->myDetectorType == EIGER || shm()->myDetectorType == JUNGFRAU || + shm()->myDetectorType == GOTTHARD || shm()->myDetectorType == GOTTHARD2 || + shm()->myDetectorType == MOENCH) { n += client.Receive(&i32, sizeof(i32)); shm()->currentSettings = static_cast(i32); } diff --git a/slsDetectorSoftware/src/slsDetector.h b/slsDetectorSoftware/src/slsDetector.h index ff7cb8953..86cfe127f 100755 --- a/slsDetectorSoftware/src/slsDetector.h +++ b/slsDetectorSoftware/src/slsDetector.h @@ -407,6 +407,8 @@ class slsDetector : public virtual slsDetectorDefs { /** [Jungfrau] Options:DYNAMICGAIN, DYNAMICHG0, FIXGAIN1, FIXGAIN2, FORCESWITCHG1, FORCESWITCHG2 * [Gotthard] Options: DYNAMICGAIN, HIGHGAIN, LOWGAIN, MEDIUMGAIN, VERYHIGHGAIN * [Gotthard2] Options: DYNAMICGAIN, FIXGAIN1, FIXGAIN2 + * [Moench] Options: G1_HIGHGAIN, G1_LOWGAIN, G2_HIGHCAP_HIGHGAIN, G2_HIGHCAP_LOWGAIN, + * G2_LOWCAP_HIGHGAIN, G2_LOWCAP_LOWGAIN, G4_HIGHGAIN, G4_LOWGAIN * [Eiger] Only stores them locally in shm Options: STANDARD, HIGHGAIN, LOWGAIN, VERYHIGHGAIN, VERYLOWGAIN */ detectorSettings setSettings(detectorSettings isettings); diff --git a/slsDetectorSoftware/tests/CMakeLists.txt b/slsDetectorSoftware/tests/CMakeLists.txt index 4a7d7287d..111c82122 100755 --- a/slsDetectorSoftware/tests/CMakeLists.txt +++ b/slsDetectorSoftware/tests/CMakeLists.txt @@ -9,6 +9,7 @@ target_sources(tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-gotthard2.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-gotthard.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-chiptestboard.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-moench.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdProxy-global.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-Result.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test-CmdParser.cpp diff --git a/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp b/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp new file mode 100644 index 000000000..b7d62c1d9 --- /dev/null +++ b/slsDetectorSoftware/tests/test-CmdProxy-moench.cpp @@ -0,0 +1,103 @@ +#include "CmdProxy.h" +#include "Detector.h" +#include "catch.hpp" +#include "sls_detector_defs.h" +#include + +#include "Result.h" +#include "ToString.h" +#include "test-CmdProxy-global.h" +#include "tests/globals.h" +#include "versionAPI.h" + +using sls::CmdProxy; +using sls::Detector; +using test::GET; +using test::PUT; + +TEST_CASE("Setting and reading back MOENCH dacs", "[.cmd][.dacs]") { + // vbp_colbuf, vipre, vin_cm", vb_sda, vcasc_sfp, vout_cm, vipre_cds, ibias_sfp + + Detector det; + CmdProxy proxy(&det); + auto det_type = det.getDetectorType().squash(); + if (det_type == defs::MOENCH) { + SECTION("vbp_colbuf") { test_dac(defs::VBP_COLBUF, "vbp_colbuf", 1300); } + SECTION("vipre") { test_dac(defs::VIPRE, "vipre", 1000); } + SECTION("vin_cm") { test_dac(defs::VIN_CM, "vin_cm", 1400); } + SECTION("vb_sda") { test_dac(defs::VB_SDA, "vb_sda", 680); } + SECTION("vcasc_sfp") { test_dac(defs::VCASC_SFP, "vcasc_sfp", 1428); } + SECTION("vout_cm") { test_dac(defs::VOUT_CM, "vout_cm", 1200); } + SECTION("vipre_cds") { test_dac(defs::VIPRE_CDS, "vipre_cds", 800); } + SECTION("ibias_sfp") { test_dac(defs::IBIAS_SFP, "ibias_sfp", 900); } + + // eiger + REQUIRE_THROWS(proxy.Call("vthreshold", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vsvp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vsvn", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vtr", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vrf", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vrs", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vtgstv", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcmp_ll", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcmp_lr", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcal", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcmp_rl", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcmp_rr", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("rxb_rb", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("rxb_lb", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcn", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vis", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("iodelay", {}, -1, GET)); + // jungfrau + REQUIRE_THROWS(proxy.Call("vb_comp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vdd_prot", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vin_com", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_prech", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_pixbuf", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_ds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET)); + // gotthard + REQUIRE_THROWS(proxy.Call("vref_ds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcascn_pb", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcascp_pb", {}, -1, GET)); + //REQUIRE_THROWS(proxy.Call("vout_cm", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcasc_out", {}, -1, GET)); + //REQUIRE_THROWS(proxy.Call("vin_cm", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_comp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("ib_test_c", {}, -1, GET)); + // mythen3 + REQUIRE_THROWS(proxy.Call("vpreamp", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vshaper", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vshaperneg", {}, -1, GET)); + //REQUIRE_THROWS(proxy.Call("vipre", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("viinsh", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vdcsh", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vth1", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vth2", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vth3", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vpl", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vph", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vtrim", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcassh", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcas", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vicin", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vipre_out", {}, -1, GET)); + // gotthard2 + REQUIRE_THROWS(proxy.Call("vref_h_adc", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_comp_adc", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcom_cds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_rstore", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_opa_1st", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_comp_fe", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcom_adc1", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_l_adc", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vref_cds", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_cs", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vb_opa_fd", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vcom_adc2", {}, -1, GET)); + } +} diff --git a/slsSupportLib/include/ToString.h b/slsSupportLib/include/ToString.h index e22d1732a..cde6dc972 100644 --- a/slsSupportLib/include/ToString.h +++ b/slsSupportLib/include/ToString.h @@ -91,6 +91,22 @@ inline std::string ToString(const defs::detectorSettings s) { return std::string("forceswitchg2"); case defs::VERYLOWGAIN: return std::string("verylowgain"); + case defs::G1_HIGHGAIN: + return std::string("g1_hg"); + case defs::G1_LOWGAIN: + return std::string("g1_lg"); + case defs::G2_HIGHCAP_HIGHGAIN: + return std::string("g2_hc_hg"); + case defs::G2_HIGHCAP_LOWGAIN: + return std::string("g2_hc_lg"); + case defs::G2_LOWCAP_HIGHGAIN: + return std::string("g2_lc_hg"); + case defs::G2_LOWCAP_LOWGAIN: + return std::string("g2_lc_lg"); + case defs::G4_HIGHGAIN: + return std::string("g4_hg"); + case defs::G4_LOWGAIN: + return std::string("g4_lg"); case defs::UNDEFINED: return std::string("undefined"); case defs::UNINITIALIZED: @@ -459,6 +475,22 @@ inline defs::detectorSettings StringTo(const std::string& s) { return defs::FORCESWITCHG2; if (s == "verylowgain") return defs::VERYLOWGAIN; + if (s == "g1_hg") + return defs::G1_HIGHGAIN; + if (s == "g1_lg") + return defs::G1_LOWGAIN; + if (s == "g2_hc_hg") + return defs::G2_HIGHCAP_HIGHGAIN; + if (s == "g2_hc_lg") + return defs::G2_HIGHCAP_LOWGAIN; + if (s == "g2_lc_hg") + return defs::G2_LOWCAP_HIGHGAIN; + if (s == "g2_lc_lg") + return defs::G2_LOWCAP_LOWGAIN; + if (s == "g4_hg") + return defs::G4_HIGHGAIN; + if (s == "g4_lg") + return defs::G4_LOWGAIN; throw sls::RuntimeError("Unknown setting " + s); } diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h index 07e30f8f9..48cc39268 100755 --- a/slsSupportLib/include/sls_detector_defs.h +++ b/slsSupportLib/include/sls_detector_defs.h @@ -364,20 +364,28 @@ class slsDetectorDefs { detector settings indexes */ enum detectorSettings { - GET_SETTINGS = -1, /**< return current detector settings */ - STANDARD, /**< standard settings */ - FAST, /**< fast settings */ - HIGHGAIN, /**< highgain settings */ - DYNAMICGAIN, /**< dynamic gain settings */ - LOWGAIN, /**< low gain settings */ - MEDIUMGAIN, /**< medium gain settings */ - VERYHIGHGAIN, /**< very high gain settings */ - DYNAMICHG0, /**< dynamic high gain 0 */ - FIXGAIN1, /**< fix gain 1 */ - FIXGAIN2, /**< fix gain 2 */ - FORCESWITCHG1, /**< force switch gain 1 */ - FORCESWITCHG2, /**< force switch gain 2 */ - VERYLOWGAIN, /**< very low gain settings */ + GET_SETTINGS = -1, + STANDARD, + FAST, + HIGHGAIN, + DYNAMICGAIN, + LOWGAIN, + MEDIUMGAIN, + VERYHIGHGAIN, + DYNAMICHG0, + FIXGAIN1, + FIXGAIN2, + FORCESWITCHG1, + FORCESWITCHG2, + VERYLOWGAIN, + G1_HIGHGAIN, + G1_LOWGAIN, + G2_HIGHCAP_HIGHGAIN, + G2_HIGHCAP_LOWGAIN, + G2_LOWCAP_HIGHGAIN, + G2_LOWCAP_LOWGAIN, + G4_HIGHGAIN, + G4_LOWGAIN, UNDEFINED = 200, /**< undefined or custom settings */ UNINITIALIZED /**< uninitialiazed (status at startup) */ }; diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 0c81f31b6..8f6161275 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -9,4 +9,4 @@ #define APIGUI 0x200227 #define APICTB 0x200227 #define APIGOTTHARD2 0x200228 -#define APIMOENCH 0x200302 +#define APIMOENCH 0x200303 From fac95516cf05961d9ecb2e904e5870c926ee6c45 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 3 Mar 2020 16:07:37 +0100 Subject: [PATCH 3/5] moench: insignficant naming fix --- .../bin/moenchDetectorServer_developer | Bin 186624 -> 186620 bytes .../slsDetectorFunctionList.c | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 439291dda044f8a687dff1b24a77fd21312ddbdf..9058910c2db8623ef544093bbe2c4314dff3d379 100755 GIT binary patch delta 38196 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 delta 38149 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%0A#aBaOvRE!L3tp-Qc>x-J#$NRXF`AtYU5J6=XHY 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 Date: Tue, 3 Mar 2020 16:21:45 +0100 Subject: [PATCH 4/5] moench: insignficant dac naming fix --- .../bin/moenchDetectorServer_developer | Bin 186620 -> 186892 bytes .../slsDetectorFunctionList.c | 5 ++++- .../slsDetectorServer_defs.h | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 9058910c2db8623ef544093bbe2c4314dff3d379..eb8453445fba7d05f8bad39b986ce1abe2530ced 100755 GIT binary patch delta 70230 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 delta 69965 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