mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-19 18:40:01 +02:00
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:
parent
04eed990c7
commit
0f88617477
@ -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 */
|
||||
|
Binary file not shown.
@ -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);
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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});
|
||||
|
@ -2422,6 +2422,44 @@ TEST_CASE("nextframenumber", "[.cmdcall]") {
|
||||
REQUIRE(oss.str() == "nextframenumber 1\n");
|
||||
}
|
||||
|
||||
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");
|
||||
REQUIRE(currentfnum == 2);
|
||||
|
||||
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 =
|
||||
@ -2456,6 +2494,8 @@ TEST_CASE("nextframenumber", "[.cmdcall]") {
|
||||
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});
|
||||
}
|
||||
|
@ -11,4 +11,4 @@
|
||||
#define APIEIGER "developer 0x240918"
|
||||
#define APIMYTHEN3 "developer 0x241001"
|
||||
#define APIJUNGFRAU "developer 0x241001"
|
||||
#define APIGOTTHARD2 "developer 0x241002"
|
||||
#define APIGOTTHARD2 "developer 0x241004"
|
||||
|
Loading…
x
Reference in New Issue
Block a user