diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 52a9ca195..f657011a7 100755 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -90,7 +90,7 @@ int eiger_virtual_transmission_delay_right=0; int eiger_virtual_transmission_delay_frame=0; int eiger_virtual_transmission_flowcontrol_10g=0; int eiger_virtual_activate=1; -uint64_t eiger_virtual_startingframenumber = 0; +uint64_t eiger_virtual_startingframenumber = 1; int eiger_virtual_detPos[2] = {0, 0}; int eiger_virtual_test_mode = 0; int eiger_virtual_quad_mode = 0; @@ -1921,9 +1921,11 @@ void* start_timer(void* arg) { // Send data { - int frameNr = 1; + uint64_t frameNr = 0; + getStartingFrameNumber(&frameNr); // loop over number of frames - for(frameNr = 1; frameNr <= numFrames; ++frameNr ) { + int iframes = 0; + for(iframes = 0; iframes != numFrames; ++iframes ) { usleep(eiger_virtual_transmission_delay_frame); @@ -1931,6 +1933,7 @@ void* start_timer(void* arg) { virtual_stop = ComVirtual_getStop(); //check if virtual_stop is high if(virtual_stop == 1){ + setStartingFrameNumber(frameNr + iframes + 1); break; } @@ -1952,7 +1955,7 @@ void* start_timer(void* arg) { sls_detector_header* header = (sls_detector_header*)(packetData); header->detType = 3;//(uint16_t)myDetectorType; updated when firmware updates header->version = SLS_DETECTOR_HEADER_VERSION - 1; - header->frameNumber = frameNr; + header->frameNumber = frameNr + iframes; header->packetNumber = i; header->row = row; header->column = colLeft; @@ -1962,7 +1965,7 @@ void* start_timer(void* arg) { header = (sls_detector_header*)(packetData2); header->detType = 3;//(uint16_t)myDetectorType; updated when firmware updates header->version = SLS_DETECTOR_HEADER_VERSION - 1; - header->frameNumber = frameNr; + header->frameNumber = frameNr + iframes; header->packetNumber = i; header->row = row; header->column = colRight; @@ -2008,18 +2011,19 @@ void* start_timer(void* arg) { sendUDPPacket(1, packetData2, packetsize); } } - LOG(logINFO, ("Sent frame: %d\n", frameNr)); + LOG(logINFO, ("Sent frame: %d\n", iframes)); clock_gettime(CLOCK_REALTIME, &end); int64_t timeNs = ((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 (iframes < numFrames) { // if there is a next frame if (periodNs > timeNs) { usleep((periodNs - timeNs)/ 1000); } } } + setStartingFrameNumber(frameNr + numFrames); } diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index be97d17a2..42a30b2b0 100755 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -560,16 +560,24 @@ int selectStoragecellStart(int pos) { int setStartingFrameNumber(uint64_t value) { LOG(logINFO, ("Setting starting frame number: %llu\n",(long long unsigned int)value)); +#ifdef VIRTUAL + setU64BitReg(value, FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG); +#else // decrement is for firmware setU64BitReg(value - 1, FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG); // need to set it twice for the firmware to catch setU64BitReg(value - 1, FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG); +#endif return OK; } int getStartingFrameNumber(uint64_t* retval) { +#ifdef VIRTUAL + *retval = getU64BitReg(FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG); +#else // increment is for firmware *retval = (getU64BitReg(GET_FRAME_NUMBER_LSB_REG, GET_FRAME_NUMBER_MSB_REG) + 1); +#endif return OK; } @@ -1705,8 +1713,10 @@ void* start_timer(void* arg) { // Send data { - int frameNr = 0; - for(frameNr = 0; frameNr != numFrames; ++frameNr ) { + uint64_t frameNr = 0; + getStartingFrameNumber(&frameNr); + int iframes = 0; + for(iframes = 0; iframes != numFrames; ++iframes ) { usleep(transmissionDelayUs); @@ -1714,6 +1724,7 @@ void* start_timer(void* arg) { virtual_stop = ComVirtual_getStop(); //check if virtual_stop is high if(virtual_stop == 1){ + setStartingFrameNumber(frameNr + iframes + 1); break; } @@ -1734,7 +1745,7 @@ void* start_timer(void* arg) { sls_detector_header* header = (sls_detector_header*)(packetData); header->detType = (uint16_t)myDetectorType; header->version = SLS_DETECTOR_HEADER_VERSION - 1; - header->frameNumber = frameNr; + header->frameNumber = frameNr + iframes; header->packetNumber = i; header->modId = 0; header->row = detPos[2]; @@ -1769,18 +1780,19 @@ void* start_timer(void* arg) { } } } - LOG(logINFO, ("Sent frame: %d\n", frameNr)); + LOG(logINFO, ("Sent frame: %d\n", iframes)); clock_gettime(CLOCK_REALTIME, &end); int64_t timeNs = ((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 (iframes < numFrames) { // if there is a next frame if (periodNs > timeNs) { usleep((periodNs - timeNs)/ 1000); } } } + setStartingFrameNumber(frameNr + numFrames); } closeUDPSocket(0); diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index a69cb6870..d4785705d 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -862,7 +862,7 @@ TEST_CASE("clearbusy", "[.cmd][.new]") { REQUIRE_THROWS(proxy.Call("clearbusy", {}, -1, GET)); } -TEST_CASE("start", "[.cmd][.rx][.new]") { +TEST_CASE("start", "[.cmd][.new]") { Detector det; CmdProxy proxy(&det); // PUT only command @@ -885,7 +885,7 @@ TEST_CASE("start", "[.cmd][.rx][.new]") { } } -TEST_CASE("stop", "[.cmd][.rx][.new]") { +TEST_CASE("stop", "[.cmd][.new]") { Detector det; CmdProxy proxy(&det); // PUT only command @@ -913,7 +913,7 @@ TEST_CASE("stop", "[.cmd][.rx][.new]") { } } -TEST_CASE("status", "[.cmd][.rx][.new]") { +TEST_CASE("status", "[.cmd][.new]") { Detector det; CmdProxy proxy(&det); auto prev_val = det.getExptime(); @@ -935,7 +935,35 @@ TEST_CASE("status", "[.cmd][.rx][.new]") { } } - +TEST_CASE("startingfnum", "[.cmd][.new]") { + Detector det; + CmdProxy proxy(&det); + auto det_type = det.getDetectorType().squash(); + if (det_type == defs::EIGER || det_type == defs::JUNGFRAU) { + auto prev_sfnum = det.getStartingFrameNumber(); + REQUIRE_THROWS(proxy.Call("startingfnum", {"0"}, -1, PUT)); + { + std::ostringstream oss; + proxy.Call("startingfnum", {"3"}, -1, PUT, oss); + REQUIRE(oss.str() == "startingfnum 3\n"); + } + { + std::ostringstream oss; + proxy.Call("startingfnum", {}, -1, GET, oss); + REQUIRE(oss.str() == "startingfnum 3\n"); + } + { + std::ostringstream oss; + proxy.Call("startingfnum", {"1"}, -1, PUT, oss); + REQUIRE(oss.str() == "startingfnum 1\n"); + } + for (int i = 0; i != det.size(); ++i) { + det.setStartingFrameNumber(prev_sfnum[i], {i}); + } + } else { + REQUIRE_THROWS(proxy.Call("startingfnum", {}, -1, GET)); + } +}