From 6e4e2c4524e35f82861088ea76a98c0d772a0d10 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil <33750417+thattil@users.noreply.github.com> Date: Tue, 23 Jul 2019 14:15:08 +0200 Subject: [PATCH] Startingfnum (#40) * starting fnum * by default starting fnum disabled in gui * insignificant change * adding binary * virtual eiger server working now * test:: namespace --- integrationTests/test-eigerIntegration.cpp | 9 +- .../test-integrationDectector.cpp | 46 +++++----- integrationTests/test-integrationMulti.cpp | 21 ++--- slsDetectorGui/forms/form_tab_measurement.ui | 83 +++++++++++++++--- slsDetectorGui/include/qTabMeasurement.h | 3 + slsDetectorGui/src/qTabMeasurement.cpp | 40 ++++++++- slsDetectorServers/eigerDetectorServer/Beb.c | 82 +++++++++++------ slsDetectorServers/eigerDetectorServer/Beb.h | 2 +- .../eigerDetectorServer/FebRegisterDefs.h | 3 - .../bin/eigerDetectorServer_developer | Bin 293851 -> 293851 bytes .../slsDetectorFunctionList.c | 22 +++-- .../eigerDetectorServer/xparameters.h | 18 ++++ .../slsDetectorServer_funcs.c | 6 ++ slsSupportLib/include/versionAPI.h | 2 +- 14 files changed, 248 insertions(+), 89 deletions(-) diff --git a/integrationTests/test-eigerIntegration.cpp b/integrationTests/test-eigerIntegration.cpp index 2fc9bdeb3..f63a91753 100644 --- a/integrationTests/test-eigerIntegration.cpp +++ b/integrationTests/test-eigerIntegration.cpp @@ -10,9 +10,9 @@ class MultiDetectorFixture { public: MultiDetectorFixture() : d(0, true, true) { - d.setHostname(hostname.c_str()); - if (my_ip != "undefined") - d.setReceiverHostname(my_ip); + d.setHostname(test::hostname.c_str()); + if (test::my_ip != "undefined") + d.setReceiverHostname(test::my_ip); } ~MultiDetectorFixture() { d.freeSharedMemory(); } }; @@ -99,7 +99,6 @@ int to_time(uint32_t reg) { TEST_CASE_METHOD(MultiDetectorFixture, "Read/write register", "[.eigerintegration][cli]") { - d.setTimer(ti::MEASUREMENTS_NUMBER, 1); d.setNumberOfFrames(1); d.setExposureTime(10000); d.acquire(); @@ -132,7 +131,7 @@ TEST_CASE_METHOD(MultiDetectorFixture, "Get time left", } TEST_CASE_METHOD(MultiDetectorFixture, "Get ID", "[.eigerintegration][cli]") { - std::string hn = hostname; + std::string hn = test::hostname; hn.erase(std::remove(begin(hn), end(hn), 'b'), end(hn)); hn.erase(std::remove(begin(hn), end(hn), 'e'), end(hn)); auto hostnames = sls::split(hn, '+'); diff --git a/integrationTests/test-integrationDectector.cpp b/integrationTests/test-integrationDectector.cpp index aa9153790..4270d6060 100755 --- a/integrationTests/test-integrationDectector.cpp +++ b/integrationTests/test-integrationDectector.cpp @@ -16,27 +16,27 @@ // Header holding all configurations for different detectors #include "tests/config.h" #include "tests/globals.h" - +// using namespace test; // using dt = slsDetectorDefs::detectorType; // extern std::string hostname; // extern std::string detector_type; // extern dt type; TEST_CASE("Single detector no receiver", "[.integration][.single]") { - auto t = slsDetector::getTypeFromDetector(hostname); - CHECK(t == type); + auto t = slsDetector::getTypeFromDetector(test::hostname); + CHECK(t == test::type); slsDetector d(t); CHECK(d.getDetectorTypeAsEnum() == t); - CHECK(d.getDetectorTypeAsString() == detector_type); + CHECK(d.getDetectorTypeAsString() == test::detector_type); - d.setHostname(hostname); - CHECK(d.getHostname() == hostname); + d.setHostname(test::hostname); + CHECK(d.getHostname() == test::hostname); d.setOnline(true); CHECK(d.getOnlineFlag() == true); - CHECK(d.setDetectorType() == type); + CHECK(d.setDetectorType() == test::type); d.freeSharedMemory(); } @@ -54,8 +54,8 @@ TEST_CASE("Set control port then create a new object with this control port", int new_cport = 1993; int new_sport = 2000; { - slsDetector d(type); - d.setHostname(hostname); + slsDetector d(test::type); + d.setHostname(test::hostname); d.setOnline(true); CHECK(d.getControlPort() == old_cport); d.setControlPort(new_cport); @@ -64,8 +64,8 @@ TEST_CASE("Set control port then create a new object with this control port", d.freeSharedMemory(); } { - slsDetector d(type); - d.setHostname(hostname); + slsDetector d(test::type); + d.setHostname(test::hostname); d.setControlPort(new_cport); d.setStopPort(new_sport); CHECK(d.getControlPort() == new_cport); @@ -79,8 +79,8 @@ TEST_CASE("Set control port then create a new object with this control port", d.freeSharedMemory(); } - slsDetector d(type); - d.setHostname(hostname); + slsDetector d(test::type); + d.setHostname(test::hostname); d.setOnline(true); CHECK(d.getStopPort() == DEFAULT_PORTNO + 1); d.freeSharedMemory(); @@ -143,8 +143,8 @@ TEST_CASE("single EIGER detector no receiver basic set and get", TEST_CASE("Locking mechanism and last ip", "[.integration][.single]") { - slsDetector d(type); - d.setHostname(hostname); + slsDetector d(test::type); + d.setHostname(test::hostname); d.setOnline(true); // Check that detector server is unlocked then lock @@ -161,13 +161,13 @@ TEST_CASE("Locking mechanism and last ip", "[.integration][.single]") { d.lockServer(0); CHECK(d.lockServer() == 0); - CHECK(d.getLastClientIP() == my_ip); + CHECK(d.getLastClientIP() == test::my_ip); d.freeSharedMemory(); } TEST_CASE("Set settings", "[.integration][.single]"){ - slsDetector d(type); - d.setHostname(hostname); + slsDetector d(test::type); + d.setHostname(test::hostname); d.setOnline(true); CHECK(d.setSettings(defs::STANDARD) == defs::STANDARD); } @@ -197,8 +197,8 @@ TEST_CASE("Timer functions", "[.integration][cli]") { // MEASURED_SUBPERIOD, /**< measured subperiod */ // MAX_TIMERS - slsDetector d(type); - d.setHostname(hostname); + slsDetector d(test::type); + d.setHostname(test::hostname); d.setOnline(true); // Number of frames @@ -214,14 +214,14 @@ TEST_CASE("Timer functions", "[.integration][cli]") { d.setTimer(slsDetectorDefs::timerIndex::FRAME_PERIOD, period); CHECK(d.setTimer(slsDetectorDefs::timerIndex::FRAME_PERIOD) == period); - if (type != dt::EIGER) { + if (test::type != dt::EIGER) { auto delay = 10000; d.setTimer(slsDetectorDefs::timerIndex::DELAY_AFTER_TRIGGER, delay); CHECK(d.setTimer(slsDetectorDefs::timerIndex::DELAY_AFTER_TRIGGER) == delay); } - if (type != dt::EIGER) { + if (test::type != dt::EIGER) { auto gates = 1; d.setTimer(slsDetectorDefs::timerIndex::GATES_NUMBER, gates); CHECK(d.setTimer(slsDetectorDefs::timerIndex::GATES_NUMBER) == gates); @@ -231,7 +231,7 @@ TEST_CASE("Timer functions", "[.integration][cli]") { d.setTimer(slsDetectorDefs::timerIndex::CYCLES_NUMBER, cycles); CHECK(d.setTimer(slsDetectorDefs::timerIndex::CYCLES_NUMBER) == cycles); - if (type == dt::EIGER) { + if (test::type == dt::EIGER) { auto subtime = 200; d.setTimer(slsDetectorDefs::timerIndex::SUBFRAME_ACQUISITION_TIME, subtime); diff --git a/integrationTests/test-integrationMulti.cpp b/integrationTests/test-integrationMulti.cpp index 2eb138eb3..2df42fc60 100755 --- a/integrationTests/test-integrationMulti.cpp +++ b/integrationTests/test-integrationMulti.cpp @@ -7,19 +7,19 @@ using namespace Catch::literals; TEST_CASE("Initialize a multi detector", "[.integration][.multi]") { - auto hostnames = sls::split(hostname, '+'); + auto hostnames = sls::split(test::hostname, '+'); multiSlsDetector d(0, true, true); - d.setHostname(hostname.c_str()); + d.setHostname(test::hostname.c_str()); REQUIRE(d.setOnline() == true); // get! - CHECK(d.getHostname() == hostname); + CHECK(d.getHostname() == test::hostname); for (size_t i = 0; i != hostnames.size(); ++i) { CHECK(d.getHostname(i) == hostnames[i]); } - CHECK(d.getDetectorTypeAsEnum() == type); - CHECK(d.getDetectorTypeAsString() == detector_type); + CHECK(d.getDetectorTypeAsEnum() == test::type); + CHECK(d.getDetectorTypeAsString() == test::detector_type); CHECK(d.getNumberOfDetectors() == hostnames.size()); d.freeSharedMemory(); @@ -30,7 +30,7 @@ TEST_CASE("Initialize a multi detector", "[.integration][.multi]") { TEST_CASE("Set and read timers", "[.integration][.multi]") { multiSlsDetector d(0, true, true); - d.setHostname(hostname.c_str()); + d.setHostname(test::hostname.c_str()); // FRAME_NUMBER int n_frames = 3; @@ -58,9 +58,6 @@ TEST_CASE("Set and read timers", "[.integration][.multi]") { // PROGRESS, /**< fraction of measurement elapsed - only get! */ // MEASUREMENTS_NUMBER, - int measurements = 2; - d.setTimer(ti::MEASUREMENTS_NUMBER, measurements); - CHECK(d.setTimer(ti::MEASUREMENTS_NUMBER, -1) == measurements); // FRAMES_FROM_START, // FRAMES_FROM_START_PG, @@ -68,7 +65,7 @@ TEST_CASE("Set and read timers", "[.integration][.multi]") { // SUBFRAME_ACQUISITION_TIME, /**< subframe exposure time */ double subframe_exposure = 2000000; // ns - if (type == dt::EIGER) { + if (test::type == dt::EIGER) { d.setSubFrameExposureTime(subframe_exposure); CHECK(d.setSubFrameExposureTime(-1) == Approx(subframe_exposure)); } @@ -77,13 +74,13 @@ TEST_CASE("Set and read timers", "[.integration][.multi]") { // SUBFRAME_DEADTIME, /**< subframe deadtime */ double subframe_deadtime = 4000; // ns - if (type == dt::EIGER) { + if (test::type == dt::EIGER) { d.setSubFrameExposureDeadTime(subframe_deadtime); CHECK(d.setSubFrameExposureDeadTime(-1) == Approx(subframe_deadtime)); } - if (type == dt::EIGER) { + if (test::type == dt::EIGER) { // 32bit is needed for subframe exposure d.setDynamicRange(32); CHECK(d.setDynamicRange(-1) == 32); diff --git a/slsDetectorGui/forms/form_tab_measurement.ui b/slsDetectorGui/forms/form_tab_measurement.ui index ffcf9b848..8454d2434 100755 --- a/slsDetectorGui/forms/form_tab_measurement.ui +++ b/slsDetectorGui/forms/form_tab_measurement.ui @@ -255,6 +255,27 @@ QFrame::Plain + + + + Run Index: + + + + + + + <nobr>Sets output file name prefix</nobr><br> +<nobr>Check the box to enable write to file. </nobr> + + + File Name: + + + true + + + @@ -322,24 +343,62 @@ - - - - Run Index: + + + + false + + + + 0 + 0 + + + + + 0 + 25 + + + + <html><head/><body><p>The starting frame number of next acquisition.</p><p>#startingfnum</p></body></html> + + + + + + + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + + + + -1 + + + 2000000000 + + + 0 - - + + + + false + - <nobr>Sets output file name prefix</nobr><br> -<nobr>Check the box to enable write to file. </nobr> + <html><head/><body><p>The starting frame number of next acquisition.</p><p>#startingfnum</p></body></html> - File Name: - - - true + Next Frame Number: diff --git a/slsDetectorGui/include/qTabMeasurement.h b/slsDetectorGui/include/qTabMeasurement.h index ce97ad69d..7da464d2e 100755 --- a/slsDetectorGui/include/qTabMeasurement.h +++ b/slsDetectorGui/include/qTabMeasurement.h @@ -33,6 +33,7 @@ private slots: void SetFileWrite(bool val); void SetFileName(); void SetRunIndex(int val); + void SetStartingFrameNumber(int val); void UpdateProgress(); void StartAcquisition(); void StopAcquisition(); @@ -54,6 +55,7 @@ private: void GetFileWrite(); void GetFileName(); void GetRunIndex(); + void GetStartingFrameNumber(); void ResetProgress(); @@ -81,6 +83,7 @@ private: QPalette red; bool delayImplemented; bool sampleImplemented; + bool startingFnumImplemented; bool isAcquisitionStopped{false}; int numMeasurements{1}; int currentMeasurement{0}; diff --git a/slsDetectorGui/src/qTabMeasurement.cpp b/slsDetectorGui/src/qTabMeasurement.cpp index 5c11335d5..7efad7761 100755 --- a/slsDetectorGui/src/qTabMeasurement.cpp +++ b/slsDetectorGui/src/qTabMeasurement.cpp @@ -37,7 +37,8 @@ void qTabMeasurement::SetupWidgetWindow() { sampleImplemented = false; delayImplemented = true; - // by default, delay is disabled in form + startingFnumImplemented = false; + // by default, delay and starting fnum is disabled in form lblDelay->setEnabled(true); spinDelay->setEnabled(true); comboDelayUnit->setEnabled(true); @@ -50,6 +51,14 @@ void qTabMeasurement::SetupWidgetWindow() { break; case slsDetectorDefs::EIGER: delayImplemented = false; + lblStartingFrameNumber->setEnabled(true); + spinStartingFrameNumber->setEnabled(true); + startingFnumImplemented = true; + break; + case slsDetectorDefs::JUNGFRAU: + lblStartingFrameNumber->setEnabled(true); + spinStartingFrameNumber->setEnabled(true); + startingFnumImplemented = true; break; default: break; @@ -83,6 +92,9 @@ void qTabMeasurement::Initialization() { connect(chkFile, SIGNAL(toggled(bool)), this, SLOT(SetFileWrite(bool))); connect(dispFileName, SIGNAL(editingFinished()), this, SLOT(SetFileName())); connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(SetRunIndex(int))); + if (startingFnumImplemented) { + connect(spinStartingFrameNumber, SIGNAL(valueChanged(int)), this, SLOT(SetStartingFrameNumber(int))); + } connect(progressTimer, SIGNAL(timeout()), this, SLOT(UpdateProgress())); connect(btnStart, SIGNAL(clicked()), this, SLOT(StartAcquisition())); connect(btnStop, SIGNAL(clicked()), this, SLOT(StopAcquisition())); @@ -512,6 +524,26 @@ void qTabMeasurement::SetRunIndex(int val) { } CATCH_HANDLE("Could not set acquisition file index.", "qTabMeasurement::SetRunIndex", this, &qTabMeasurement::GetRunIndex) } +void qTabMeasurement::GetStartingFrameNumber() { + FILE_LOG(logDEBUG) << "Getting Starting Frame Number"; + disconnect(spinStartingFrameNumber, SIGNAL(valueChanged(int)), this, SLOT(SetStartingFrameNumber(int))); + + try { + auto retval = myDet->getStartingFrameNumber(); + spinStartingFrameNumber->setValue(retval); + } CATCH_DISPLAY ("Could not get starting frame number.", "qTabMeasurement::GetStartingFrameNumber") + + connect(spinStartingFrameNumber, SIGNAL(valueChanged(int)), this, SLOT(SetStartingFrameNumber(int))); +} + +void qTabMeasurement::SetStartingFrameNumber(int val) { + FILE_LOG(logINFO) << "Setting Starting frame number to " << val; + + try { + myDet->setStartingFrameNumber(val); + } CATCH_HANDLE("Could not set starting frame number.", "qTabMeasurement::SetStartingFrameNumber", this, &qTabMeasurement::GetStartingFrameNumber) +} + void qTabMeasurement::ResetProgress() { FILE_LOG(logDEBUG) << "Resetting progress"; lblCurrentFrame->setText("0"); @@ -590,6 +622,9 @@ void qTabMeasurement::AcquireFinished() { FILE_LOG(logDEBUG) << "Acquire Finished"; UpdateProgress(); GetRunIndex(); + if (startingFnumImplemented) { + GetStartingFrameNumber(); + } FILE_LOG(logDEBUG) << "Measurement " << currentMeasurement << " finished"; // next measurement if acq is not stopped if (!isAcquisitionStopped && ((currentMeasurement + 1) < numMeasurements)) { @@ -639,6 +674,9 @@ void qTabMeasurement::Refresh() { GetFileWrite(); GetFileName(); GetRunIndex(); + if (startingFnumImplemented) { + GetStartingFrameNumber(); + } ResetProgress(); } diff --git a/slsDetectorServers/eigerDetectorServer/Beb.c b/slsDetectorServers/eigerDetectorServer/Beb.c index 8d25e91e3..605b904ce 100755 --- a/slsDetectorServers/eigerDetectorServer/Beb.c +++ b/slsDetectorServers/eigerDetectorServer/Beb.c @@ -1302,47 +1302,77 @@ int Beb_SetStartingFrameNumber(uint64_t value) { if (fd < 0) { FILE_LOG(logERROR, ("Set Start Frame Number FAIL\n")); return FAIL; - } else { - // since the read is not implemented in firmware yet - Beb_deactivatedStartFrameNumber = value; + } + // since the read is not implemented in firmware yet + Beb_deactivatedStartFrameNumber = value; - // decrement for firmware - uint64_t valueInFirmware = value - 1; - Beb_Write32(csp0base, UDP_HEADER_FRAME_NUMBER_LSB_OFST, valueInFirmware & (0xffffffff)); - Beb_Write32(csp0base, UDP_HEADER_FRAME_NUMBER_MSB_OFST, (valueInFirmware >> 32) & (0xffffffff)); - Beb_close(fd,csp0base); - } + // decrement for firmware + uint64_t valueInFirmware = value - 1; + Beb_Write32(csp0base, UDP_HEADER_FRAME_NUMBER_LSB_OFST, valueInFirmware & (0xffffffff)); + Beb_Write32(csp0base, UDP_HEADER_FRAME_NUMBER_MSB_OFST, (valueInFirmware >> 32) & (0xffffffff)); + Beb_close(fd,csp0base); - uint64_t retval = -1; - if ((Beb_GetStartingFrameNumber(&retval) == OK) && (retval == value)) { - FILE_LOG(logINFO, ("Going to reset Frame Number\n")); - Beb_ResetFrameNumber(); - } + FILE_LOG(logINFO, ("Going to reset Frame Number\n")); + Beb_ResetFrameNumber(); return OK; } -int Beb_GetStartingFrameNumber(uint64_t* retval) { +int Beb_GetStartingFrameNumber(uint64_t* retval, int tengigaEnable) { if (!Beb_activated) { *retval = Beb_deactivatedStartFrameNumber; return OK; } - FILE_LOG(logDEBUG1, ("Getting start frame number\n")); - // since it is not implemented in firmware yet - *retval = Beb_deactivatedStartFrameNumber; -/* + FILE_LOG(logDEBUG1, ("Getting start frame number\n")); u_int32_t* csp0base = 0; - int fd = Beb_open(&csp0base, XPAR_PLB_GPIO_TEST_BASEADDR); + int fd = Beb_open(&csp0base, XPAR_COUNTER_BASEADDR); if (fd < 0) { - FILE_LOG(logERROR, ("Set Start Frame Number FAIL\n")); + FILE_LOG(logERROR, ("Get Start Frame Number FAIL\n")); return FAIL; - } else { - *retval = Beb_Read32(csp0base, UDP_HEADER_FRAME_NUMBER_MSB_OFST); - uint32_t lretval = Beb_Read32(csp0base, UDP_HEADER_FRAME_NUMBER_MSB_OFST); - *retval = (*retval << 32) | lretval; + } + + uint32_t temp = 0; + if (!tengigaEnable) { + uint64_t left1g = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_MSB_OFST); + temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_LSB_OFST); + left1g = ((left1g << 32) | temp) >> 16; + ++left1g; // increment for firmware + + uint64_t right1g = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_MSB_OFST); + temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_LSB_OFST); + right1g = ((right1g << 32) | temp) >> 16; + ++right1g; // increment for firmware + Beb_close(fd,csp0base); + if (left1g != right1g) { + FILE_LOG(logERROR, ("Retrieved inconsistent frame numbers from 1g left %llu and right %llu\n", + (long long int)left1g, (long long int)right1g)); + *retval = (left1g > right1g) ? left1g : right1g; // give max to set it to when stopping acq & different value + return -2; // to differentiate between failed address mapping + } + *retval = left1g; + } + + else { + uint64_t left10g = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_MSB_OFST); + temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_LSB_OFST); + left10g = ((left10g << 32) | temp) >> 16; + ++left10g; // increment for firmware + + uint64_t right10g = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_MSB_OFST); + temp = Beb_Read32(csp0base, UDP_HEADER_GET_FNUM_1G_LEFT_LSB_OFST); + right10g = ((right10g << 32) | temp) >> 16; + Beb_close(fd,csp0base); + ++right10g; // increment for firmware + + if (left10g != right10g) { + FILE_LOG(logERROR, ("Retrieved inconsistent frame numbers from `0g left %llu and right %llu\n", + (long long int)left10g, (long long int)right10g)); + *retval = (left10g > right10g) ? left10g : right10g; // give max to set it to when stopping acq & different value + return -2; // to differentiate between failed address mapping + } + *retval = left10g; } -*/ return OK; } diff --git a/slsDetectorServers/eigerDetectorServer/Beb.h b/slsDetectorServers/eigerDetectorServer/Beb.h index f215e5d4d..36d2c0ca7 100755 --- a/slsDetectorServers/eigerDetectorServer/Beb.h +++ b/slsDetectorServers/eigerDetectorServer/Beb.h @@ -78,7 +78,7 @@ void Beb_SetQuad(int value); int Beb_GetQuad(); int Beb_SetDetectorPosition(int pos[]); int Beb_SetStartingFrameNumber(uint64_t value); -int Beb_GetStartingFrameNumber(uint64_t* retval); +int Beb_GetStartingFrameNumber(uint64_t* retval, int tengigaEnable); uint16_t Beb_swap_uint16( uint16_t val); int Beb_open(u_int32_t** csp0base, u_int32_t offset); diff --git a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h index 9f3ac5454..686771347 100755 --- a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h @@ -202,9 +202,6 @@ #define UDP_HEADER_Y_OFST (16) #define UDP_HEADER_Y_MSK (0xFFFF << UDP_HEADER_Y_OFST) -// udp header (frame number) -#define UDP_HEADER_FRAME_NUMBER_LSB_OFST (0x0140) -#define UDP_HEADER_FRAME_NUMBER_MSB_OFST (0x0160) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 031b60865c8e15537d40e80b7c1aedba5372d484..9d18f2e85057effe398576ed5ad417256558049d 100755 GIT binary patch delta 38557 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 WjWg)M`)LIlF|8o~)PX9qD*Jzd=%QEv delta 36976 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 JY4KYs{tr_JtI_}f diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 486be8cca..e8e80bcad 100755 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -666,7 +666,7 @@ int getStartingFrameNumber(uint64_t* retval) { *retval = eiger_virtual_startingframenumber; return OK; #else - return Beb_GetStartingFrameNumber(retval); + return Beb_GetStartingFrameNumber(retval, send_to_ten_gig); #endif } @@ -1311,11 +1311,17 @@ int setDetectorPosition(int pos[]) { } void setQuad(int value) { +#ifndef VIRTUAL Beb_SetQuad(value); +#endif } int getQuad() { +#ifdef VIRTUAL + return 0; +#else return Beb_GetQuad(); +#endif } int enableTenGigabitEthernet(int val) { @@ -1793,11 +1799,17 @@ int stopStateMachine() { eiger_virtual_stop = 0; return OK; #else + if ((Feb_Control_StopAcquisition() != STATUS_IDLE) || (!Beb_StopAcquisition()) ) { + FILE_LOG(logERROR, ("failed to stop acquisition\n")); + return FAIL; + } - if ((Feb_Control_StopAcquisition() == STATUS_IDLE) & Beb_StopAcquisition()) - return OK; - FILE_LOG(logERROR, ("failed to stop acquisition\n")); - return FAIL; + // ensure all have same starting frame numbers + uint64_t retval = 0; + if(Beb_GetStartingFrameNumber(&retval, send_to_ten_gig) == -2) { + Beb_SetStartingFrameNumber(retval + 1); + } + return OK; #endif } diff --git a/slsDetectorServers/eigerDetectorServer/xparameters.h b/slsDetectorServers/eigerDetectorServer/xparameters.h index 446c89859..fbdac2b1f 100755 --- a/slsDetectorServers/eigerDetectorServer/xparameters.h +++ b/slsDetectorServers/eigerDetectorServer/xparameters.h @@ -56,16 +56,34 @@ XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT_BASEADDR /** Version Numbers */ #define XPAR_VERSION 0xc6000000 + + /* Definitions for peripheral PLB_GPIO_TEST */ #define XPAR_PLB_GPIO_TEST_BASEADDR 0xD1010000 #define XPAR_PLB_GPIO_TEST_HIGHADDR 0xD101FFFF +// udp header (set frame number) +#define UDP_HEADER_FRAME_NUMBER_LSB_OFST (0x0140) +#define UDP_HEADER_FRAME_NUMBER_MSB_OFST (0x0160) + + /* Definitions for packet, frame and delay down counters */ #define XPAR_COUNTER_BASEADDR 0xD1020000 #define XPAR_COUNTER_HIGHADDR 0xD102FFFF +// udp header (get frame number) +#define UDP_HEADER_GET_FNUM_1G_LEFT_LSB_OFST (0x0004) +#define UDP_HEADER_GET_FNUM_1G_LEFT_MSB_OFST (0x0024) +#define UDP_HEADER_GET_FNUM_1G_RIGHT_LSB_OFST (0x0044) +#define UDP_HEADER_GET_FNUM_1G_RIGHT_MSB_OFST (0x0064) +#define UDP_HEADER_GET_FNUM_10G_LEFT_LSB_OFST (0x0084) +#define UDP_HEADER_GET_FNUM_10G_LEFT_MSB_OFST (0x00A4) +#define UDP_HEADER_GET_FNUM_10G_RIGHT_LSB_OFST (0x00C4) +#define UDP_HEADER_GET_FNUM_10G_RIGHT_MSB_OFST (0x00E4) + + /* Definitions for peripheral PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT */ #define XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT_BASEADDR 0xC4100000 diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index 3b9bece4e..988269bfb 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -4044,6 +4044,9 @@ int set_starting_frame_number(int file_des) { if (ret == FAIL) { sprintf(mess, "Could not get starting frame number. Failed to map address.\n"); FILE_LOG(logERROR,(mess)); + } else if (ret == -2) { + sprintf(mess, "Inconsistent starting frame number from left and right FPGA. Please set it.\n"); + FILE_LOG(logERROR,(mess)); } else { if (arg != retval) { ret = FAIL; @@ -4073,6 +4076,9 @@ int get_starting_frame_number(int file_des) { if (ret == FAIL) { sprintf(mess, "Could not get starting frame number. Failed to map address.\n"); FILE_LOG(logERROR,(mess)); + } else if (ret == -2) { + sprintf(mess, "Inconsistent starting frame number from left and right FPGA. Please set it.\n"); + FILE_LOG(logERROR,(mess)); } else { FILE_LOG(logDEBUG1, ("Start frame number retval: %u\n", retval)); } diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index e84110be2..b498cdf09 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -4,7 +4,7 @@ #define APICTB 0x190604 #define APIGOTTHARD 0x190715 #define APIJUNGFRAU 0x190718 -#define APIEIGER 0x190722 +#define APIEIGER 0x190723 #define APILIB 0x190723 #define APIRECEIVER 0x190722 #define APIGUI 0x190723