first draft at fixing nextframenumber properly with firmware (#995)

* fixing nextframenumber properly with firmware

* updated firmware to have getnextframenumber and fixed setnextframenumber to reset also the header fifo when stopping

* fix tests for gotthard2
This commit is contained in:
maliakal_d 2024-10-04 16:53:14 +02:00 committed by GitHub
parent 04eed990c7
commit 0f88617477
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 92 additions and 131 deletions

View File

@ -141,10 +141,14 @@
#define MOD_ID_OFST (0)
#define MOD_ID_MSK (0x0000FFFF << MOD_ID_OFST)
/** Next Frame Number Register */
/** Set Next Frame Number Register */
#define FRAME_NUMBER_LSB_REG (0x0C * REG_OFFSET + BASE_CONTROL)
#define FRAME_NUMBER_MSB_REG (0x0D * REG_OFFSET + BASE_CONTROL)
/** Get Next Frame Number Register */
#define GET_FRAME_NUMBER_LSB_REG (0x0E * REG_OFFSET + BASE_CONTROL)
#define GET_FRAME_NUMBER_MSB_REG (0x0F * REG_OFFSET + BASE_CONTROL)
/* ASIC registers --------------------------------------------------*/
/* ASIC Config register */

View File

@ -74,8 +74,6 @@ int filterResistor = 0;
int cdsGain = 0;
int detPos[2] = {};
int chipConfigured = 0;
uint64_t nextFrameNumber = 0;
uint64_t acqStartFrameNumber = 0;
int isInitCheckDone() { return initCheckDone; }
@ -425,8 +423,6 @@ void setupDetector() {
detPos[0] = 0;
detPos[1] = 0;
chipConfigured = 0;
nextFrameNumber = 0;
acqStartFrameNumber = 0;
thisSettings = UNINITIALIZED;
injectedChannelsOffset = 0;
@ -1075,67 +1071,23 @@ int getDynamicRange(int *retval) {
int setNextFrameNumber(uint64_t value) {
LOG(logINFO, ("Setting next frame number: %lu\n", value));
#ifdef VIRTUAL
setU64BitReg(value, FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG);
#else
// decrement by 1 for firmware
setU64BitReg(value - 1, FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG);
nextFrameNumber = value;
acqStartFrameNumber = value;
#endif
return OK;
}
int getNextFrameNumber(uint64_t *value) {
#ifdef VIRTUAL
return nextFrameNumber;
*value = getU64BitReg(FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG);
#else
// increment is for firmware
*value =
(getU64BitReg(GET_FRAME_NUMBER_LSB_REG, GET_FRAME_NUMBER_MSB_REG) + 1);
#endif
// no acquisition has occured
if ((nextFrameNumber - acqStartFrameNumber) == 0) {
LOG(logDEBUG, ("No acquisition has occured nf:%lld, acqStart:%lld\n",
nextFrameNumber, acqStartFrameNumber));
*value = nextFrameNumber;
return OK;
}
// Not implemented in firmware, calculate for now
int64_t framesLeft = getNumFramesLeft();
int64_t repeatsLeft = getNumTriggersLeft();
int64_t burstsLeft = getNumBurstsLeft();
int64_t numFrames = getNumFrames();
LOG(logDEBUG, ("fl:%lld rl:%lld bl:%lld nf:%ld\n", framesLeft, repeatsLeft,
burstsLeft, numFrames));
// burst mode
if (burstMode == BURST_INTERNAL || burstMode == BURST_EXTERNAL) {
// cannot get framesleft. So fix at 0
framesLeft = 0;
// repeats = #bursts (auto burst)
if (getTiming() == AUTO_TIMING) {
repeatsLeft = burstsLeft;
}
}
// continuous mdoe
else {
// repeats = 1 (no trigger for continuous auto)
if (getTiming() == AUTO_TIMING) {
repeatsLeft = 0;
}
// frames = 1 (no frames for continuous trigger)
else {
framesLeft = 0;
numFrames = 1;
}
}
LOG(logDEBUG, ("update fl:%lld rl:%lld bl:%lld nf:%ld\n", framesLeft,
repeatsLeft, burstsLeft, numFrames));
*value = nextFrameNumber;
// if not last frame
if (framesLeft != 0 || repeatsLeft != 0) {
if (framesLeft && !repeatsLeft)
framesLeft += 2; // why??
*value -= ((numFrames * repeatsLeft) + framesLeft);
}
LOG(logDEBUG, ("get next frame number retval: %lu\n", *value));
return OK;
}
@ -1400,8 +1352,6 @@ int64_t getNumFramesLeft() {
if ((burstMode == CONTINUOUS_INTERNAL ||
burstMode == CONTINUOUS_EXTERNAL) &&
getTiming() == AUTO_TIMING) {
LOG(logDEBUG, ("getFramesLeft: %lld\n",
get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG)));
return (get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG) + 1);
}
return -1;
@ -3433,39 +3383,6 @@ int startStateMachine() {
// start state machine
bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_ACQSTN_MSK);
LOG(logDEBUG, ("Next frame number: %ld\n", nextFrameNumber));
acqStartFrameNumber = nextFrameNumber;
// increment the current frame number by (#frames x #triggers)
// done because there is no get frame number (decremented at stop with what
// is left)
{
int64_t frames = getNumFrames();
int64_t repeats = getNumTriggers();
int64_t bursts = getNumBursts();
if (getTiming() == AUTO_TIMING) {
// burst mode, repeats = #bursts
if (burstMode == BURST_INTERNAL || burstMode == BURST_EXTERNAL) {
repeats = bursts;
}
// continuous, repeats = 1 (no trigger as well)
else {
repeats = 1;
}
}
// trigger
else {
// continuous, numFrames is limited
if (burstMode == CONTINUOUS_INTERNAL ||
burstMode == CONTINUOUS_EXTERNAL) {
frames = 1;
}
}
nextFrameNumber += frames * repeats;
LOG(logDEBUG,
("If not stopped, nextframenumber: %ld\n", nextFrameNumber));
}
LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG)));
return OK;
}
@ -3550,7 +3467,7 @@ void *start_timer(void *arg) {
// check if manual stop
if (sharedMemory_getStop() == 1) {
setNextFrameNumber(frameNr + (repeatNr * numFrames) +
iframes + 1);
iframes);
break;
}
@ -3647,7 +3564,7 @@ void *start_timer(void *arg) {
}
}
// already being set in the start acquisition (also for real detectors)
setNextFrameNumber(frameNr + (numRepeats * numFrames) + 1);
setNextFrameNumber(frameNr + (numRepeats * numFrames));
}
closeUDPSocket(0);

View File

@ -3,7 +3,7 @@
#pragma once
#include "sls/sls_detector_defs.h"
#define REQRD_FRMWRE_VRSN (0x221123)
#define REQRD_FRMWRE_VRSN (0x241003)
#define KERNEL_DATE_VRSN "Mon May 10 18:00:21 CEST 2021"
#define ID_FILE "detid_gotthard2.txt"

View File

@ -86,7 +86,7 @@ TEST_CASE("timegotthard2", "[.cmdcall]") {
det.setPeriod(prev_val[i], {i});
}
// period in continuous mode
det.setBurstMode(defs::CONTINUOUS_INTERNAL, {});
det.setBurstMode(defs::CONTINUOUS_EXTERNAL, {});
prev_val = det.getPeriod();
{
std::ostringstream oss;
@ -338,7 +338,7 @@ TEST_CASE("bursts", "[.cmdcall]") {
}
// continuous mode: reg set to #frames,
// but bursts should return same value
det.setBurstMode(defs::CONTINUOUS_INTERNAL);
det.setBurstMode(defs::CONTINUOUS_EXTERNAL);
det.setNumberOfFrames(2);
{
std::ostringstream oss;
@ -494,13 +494,13 @@ TEST_CASE("burstmode", "[.cmdcall]") {
}
{
std::ostringstream oss;
caller.call("burstmode", {"cw_internal"}, -1, PUT, oss);
REQUIRE(oss.str() == "burstmode cw_internal\n");
caller.call("burstmode", {"cw_external"}, -1, PUT, oss);
REQUIRE(oss.str() == "burstmode cw_external\n");
}
{
std::ostringstream oss;
caller.call("burstmode", {}, -1, GET, oss);
REQUIRE(oss.str() == "burstmode cw_internal\n");
REQUIRE(oss.str() == "burstmode cw_external\n");
}
for (int i = 0; i != det.size(); ++i) {
det.setBurstMode(burst[i], {i});

View File

@ -2422,40 +2422,80 @@ TEST_CASE("nextframenumber", "[.cmdcall]") {
REQUIRE(oss.str() == "nextframenumber 1\n");
}
auto prev_timing =
det.getTimingMode().tsquash("inconsistent timing mode in test");
auto prev_frames =
det.getNumberOfFrames().tsquash("inconsistent #frames in test");
auto prev_exptime =
det.getExptime().tsquash("inconsistent exptime in test");
auto prev_period =
det.getPeriod().tsquash("inconsistent period in test");
det.setTimingMode(defs::AUTO_TIMING);
det.setNumberOfFrames(1);
det.setExptime(std::chrono::microseconds(200));
det.setPeriod(std::chrono::milliseconds(1));
det.startDetector();
std::this_thread::sleep_for(std::chrono::seconds(2));
auto currentfnum =
det.getNextFrameNumber().tsquash("inconsistent frame nr in test");
REQUIRE(currentfnum == 2);
if (det_type == defs::EIGER) {
auto prev_tengiga =
det.getTenGiga().tsquash("inconsistent ten giga enable");
det.setTenGiga(true);
det.setNextFrameNumber(1);
if (det_type == defs::GOTTHARD2) {
auto prev_timing =
det.getTimingMode().tsquash("inconsistent timing mode in test");
auto prev_frames =
det.getNumberOfFrames().tsquash("inconsistent #frames in test");
auto prev_exptime =
det.getExptime().tsquash("inconsistent exptime in test");
auto prev_period =
det.getPeriod().tsquash("inconsistent period in test");
auto prev_burstmode =
det.getBurstMode().tsquash("inconsistent burst mode in test");
auto prev_bursts = det.getNumberOfBursts().tsquash(
"inconsistent #bursts in test");
auto prev_burstperiod = det.getBurstPeriod().tsquash(
"inconsistent burst period in test");
det.setTimingMode(defs::AUTO_TIMING);
det.setNumberOfFrames(1);
det.setExptime(std::chrono::microseconds(200));
det.setPeriod(std::chrono::milliseconds(1));
det.setBurstMode(defs::CONTINUOUS_EXTERNAL);
det.setNumberOfBursts(1);
det.setBurstPeriod(std::chrono::milliseconds(0));
det.startDetector();
std::this_thread::sleep_for(std::chrono::seconds(2));
auto currentfnum = det.getNextFrameNumber().tsquash(
"inconsistent frame nr in test");
auto currentfnum =
det.getNextFrameNumber().tsquash("inconsistent frame nr in test");
REQUIRE(currentfnum == 2);
det.setTenGiga(prev_tengiga);
det.setTimingMode(prev_timing);
det.setNumberOfFrames(prev_frames);
det.setExptime(prev_exptime);
det.setPeriod(prev_period);
det.setBurstMode(prev_burstmode);
det.setNumberOfBursts(prev_bursts);
det.setBurstPeriod(prev_burstperiod);
} else {
auto prev_timing =
det.getTimingMode().tsquash("inconsistent timing mode in test");
auto prev_frames =
det.getNumberOfFrames().tsquash("inconsistent #frames in test");
auto prev_exptime =
det.getExptime().tsquash("inconsistent exptime in test");
auto prev_period =
det.getPeriod().tsquash("inconsistent period in test");
det.setTimingMode(defs::AUTO_TIMING);
det.setNumberOfFrames(1);
det.setExptime(std::chrono::microseconds(200));
det.setPeriod(std::chrono::milliseconds(1));
det.startDetector();
std::this_thread::sleep_for(std::chrono::seconds(2));
auto currentfnum =
det.getNextFrameNumber().tsquash("inconsistent frame nr in test");
REQUIRE(currentfnum == 2);
if (det_type == defs::EIGER) {
auto prev_tengiga =
det.getTenGiga().tsquash("inconsistent ten giga enable");
det.setTenGiga(true);
det.setNextFrameNumber(1);
det.startDetector();
std::this_thread::sleep_for(std::chrono::seconds(2));
auto currentfnum = det.getNextFrameNumber().tsquash(
"inconsistent frame nr in test");
REQUIRE(currentfnum == 2);
det.setTenGiga(prev_tengiga);
}
det.setTimingMode(prev_timing);
det.setNumberOfFrames(prev_frames);
det.setExptime(prev_exptime);
det.setPeriod(prev_period);
}
det.setTimingMode(prev_timing);
det.setNumberOfFrames(prev_frames);
det.setExptime(prev_exptime);
det.setPeriod(prev_period);
for (int i = 0; i != det.size(); ++i) {
det.setNextFrameNumber(prev_sfnum[i], {i});
}

View File

@ -11,4 +11,4 @@
#define APIEIGER "developer 0x240918"
#define APIMYTHEN3 "developer 0x241001"
#define APIJUNGFRAU "developer 0x241001"
#define APIGOTTHARD2 "developer 0x241002"
#define APIGOTTHARD2 "developer 0x241004"