mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-19 18:40:01 +02:00
Dev/g2 stop frame number (#980)
* get/set next frame number in G2 (firmware only has set, no get) * firmware has issues: each stop keeps 2 frame header in fifo and the resetting frame number happens after that * removed the option to set burstmode to burst external or continuwous internal * needs to be revisited before 9.0.0
This commit is contained in:
parent
e59de85a33
commit
5e024153bc
@ -743,7 +743,7 @@ class Detector(CppDetectorApi):
|
||||
@property
|
||||
@element
|
||||
def nextframenumber(self):
|
||||
"""[Eiger][Jungfrau][Moench][CTB][Xilinx CTB] Next frame number. Stopping acquisition might result in different frame numbers for different modules. """
|
||||
"""[Eiger][Jungfrau][Moench][CTB][Xilinx CTB][Gotthard2] Next frame number. Stopping acquisition might result in different frame numbers for different modules. So, after stopping, next frame number (max + 1) is set for all the modules afterwards."""
|
||||
return self.getNextFrameNumber()
|
||||
|
||||
@nextframenumber.setter
|
||||
|
@ -135,11 +135,16 @@
|
||||
#define DTA_OFFSET_REG (0x0A * REG_OFFSET + BASE_CONTROL)
|
||||
|
||||
|
||||
/** Module ID Register */
|
||||
#define MOD_ID_REG (0x0B * REG_OFFSET + BASE_CONTROL)
|
||||
|
||||
#define MOD_ID_OFST (0)
|
||||
#define MOD_ID_MSK (0x0000FFFF << MOD_ID_OFST)
|
||||
|
||||
/** Next Frame Number Register */
|
||||
#define FRAME_NUMBER_LSB_REG (0x0C * REG_OFFSET + BASE_CONTROL)
|
||||
#define FRAME_NUMBER_MSB_REG (0x0D * REG_OFFSET + BASE_CONTROL)
|
||||
|
||||
/* ASIC registers --------------------------------------------------*/
|
||||
|
||||
/* ASIC Config register */
|
||||
|
Binary file not shown.
@ -45,7 +45,6 @@ char initErrorMessage[MAX_STR_LENGTH];
|
||||
|
||||
#ifdef VIRTUAL
|
||||
pthread_t pthread_virtual_tid;
|
||||
int64_t virtual_currentFrameNumber = 2;
|
||||
int virtual_moduleid = 0;
|
||||
#endif
|
||||
|
||||
@ -75,6 +74,8 @@ int filterResistor = 0;
|
||||
int cdsGain = 0;
|
||||
int detPos[2] = {};
|
||||
int chipConfigured = 0;
|
||||
uint64_t nextFrameNumber = 0;
|
||||
uint64_t acqStartFrameNumber = 0;
|
||||
|
||||
int isInitCheckDone() { return initCheckDone; }
|
||||
|
||||
@ -424,6 +425,8 @@ void setupDetector() {
|
||||
detPos[0] = 0;
|
||||
detPos[1] = 0;
|
||||
chipConfigured = 0;
|
||||
nextFrameNumber = 0;
|
||||
acqStartFrameNumber = 0;
|
||||
|
||||
thisSettings = UNINITIALIZED;
|
||||
injectedChannelsOffset = 0;
|
||||
@ -528,6 +531,7 @@ void setupDetector() {
|
||||
setSettings(DEFAULT_SETTINGS);
|
||||
|
||||
// Initialization of acquistion parameters
|
||||
setNextFrameNumber(DEFAULT_FRAME_NUMBER);
|
||||
setNumFrames(DEFAULT_NUM_FRAMES);
|
||||
setNumTriggers(DEFAULT_NUM_CYCLES);
|
||||
setNumBursts(DEFAULT_NUM_BURSTS);
|
||||
@ -1068,6 +1072,73 @@ int getDynamicRange(int *retval) {
|
||||
}
|
||||
|
||||
/* parameters - timer */
|
||||
|
||||
int setNextFrameNumber(uint64_t value) {
|
||||
LOG(logINFO, ("Setting next frame number: %lu\n", value));
|
||||
// decrement by 1 for firmware
|
||||
setU64BitReg(value - 1, FRAME_NUMBER_LSB_REG, FRAME_NUMBER_MSB_REG);
|
||||
nextFrameNumber = value;
|
||||
acqStartFrameNumber = value;
|
||||
return OK;
|
||||
}
|
||||
|
||||
int getNextFrameNumber(uint64_t *value) {
|
||||
#ifdef VIRTUAL
|
||||
return nextFrameNumber;
|
||||
#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;
|
||||
}
|
||||
|
||||
void setNumFrames(int64_t val) {
|
||||
if (val > 0) {
|
||||
numFramesReg = val;
|
||||
@ -1329,7 +1400,9 @@ int64_t getNumFramesLeft() {
|
||||
if ((burstMode == CONTINUOUS_INTERNAL ||
|
||||
burstMode == CONTINUOUS_EXTERNAL) &&
|
||||
getTiming() == AUTO_TIMING) {
|
||||
return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG);
|
||||
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;
|
||||
}
|
||||
@ -1337,7 +1410,7 @@ int64_t getNumFramesLeft() {
|
||||
int64_t getNumTriggersLeft() {
|
||||
// trigger
|
||||
if (getTiming() == TRIGGER_EXPOSURE) {
|
||||
return get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG);
|
||||
return (get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG) + 1);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@ -1356,7 +1429,7 @@ int64_t getNumBurstsLeft() {
|
||||
// burst and auto
|
||||
if ((burstMode == BURST_INTERNAL || burstMode == BURST_EXTERNAL) &&
|
||||
getTiming() == AUTO_TIMING) {
|
||||
return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG);
|
||||
return (get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG) + 1);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@ -3360,6 +3433,39 @@ 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;
|
||||
}
|
||||
@ -3419,7 +3525,7 @@ void *start_timer(void *arg) {
|
||||
|
||||
*((uint16_t *)(imageData + i * sizeof(uint16_t))) =
|
||||
(uint16_t)channelVal;
|
||||
// LOG(logINFORED, ("[%d]:0x%08x\n", i, channelVal));
|
||||
LOG(logDEBUG, ("[%d]:0x%08x\n", i, channelVal));
|
||||
}
|
||||
char vetoData[vetodatasize];
|
||||
memset(vetoData, 0, sizeof(vetodatasize));
|
||||
@ -3427,6 +3533,10 @@ void *start_timer(void *arg) {
|
||||
*((uint16_t *)(vetoData + i)) = i;
|
||||
}
|
||||
|
||||
{
|
||||
uint64_t frameNr = 0;
|
||||
getNextFrameNumber(&frameNr);
|
||||
|
||||
int iRxEntry = firstDest;
|
||||
// loop over number of repeats
|
||||
for (int repeatNr = 0; repeatNr != numRepeats; ++repeatNr) {
|
||||
@ -3435,10 +3545,12 @@ void *start_timer(void *arg) {
|
||||
clock_gettime(CLOCK_REALTIME, &rbegin);
|
||||
|
||||
// loop over number of frames
|
||||
for (int frameNr = 0; frameNr != numFrames; ++frameNr) {
|
||||
for (int iframes = 0; iframes != numFrames; ++iframes) {
|
||||
|
||||
// check if manual stop
|
||||
if (sharedMemory_getStop() == 1) {
|
||||
setNextFrameNumber(frameNr + (repeatNr * numFrames) +
|
||||
iframes + 1);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -3448,17 +3560,17 @@ void *start_timer(void *arg) {
|
||||
int gainVal = 0;
|
||||
for (int i = 0; i < nchannels; ++i) {
|
||||
if ((i % nchannels) < 400) {
|
||||
gainVal = 1 + frameNr;
|
||||
gainVal = 1 + iframes;
|
||||
} else if ((i % nchannels) < 800) {
|
||||
gainVal = 2 + frameNr;
|
||||
gainVal = 2 + iframes;
|
||||
} else {
|
||||
gainVal = 3 + frameNr;
|
||||
gainVal = 3 + iframes;
|
||||
}
|
||||
int dataVal =
|
||||
*((uint16_t *)(imageData + i * sizeof(uint16_t)));
|
||||
dataVal += frameNr;
|
||||
int channelVal =
|
||||
(dataVal & ~GAIN_VAL_MSK) | (gainVal << GAIN_VAL_OFST);
|
||||
dataVal += iframes;
|
||||
int channelVal = (dataVal & ~GAIN_VAL_MSK) |
|
||||
(gainVal << GAIN_VAL_OFST);
|
||||
*((uint16_t *)(imageData + i * sizeof(uint16_t))) =
|
||||
(uint16_t)channelVal;
|
||||
}
|
||||
@ -3472,10 +3584,12 @@ void *start_timer(void *arg) {
|
||||
char packetData[packetsize];
|
||||
memset(packetData, 0, packetsize);
|
||||
// set header
|
||||
sls_detector_header *header = (sls_detector_header *)(packetData);
|
||||
sls_detector_header *header =
|
||||
(sls_detector_header *)(packetData);
|
||||
header->detType = (uint16_t)myDetectorType;
|
||||
header->version = SLS_DETECTOR_HEADER_VERSION;
|
||||
header->frameNumber = virtual_currentFrameNumber;
|
||||
header->frameNumber =
|
||||
frameNr + (repeatNr * numFrames) + iframes;
|
||||
header->packetNumber = 0;
|
||||
header->modId = virtual_moduleid;
|
||||
header->row = detPos[Y];
|
||||
@ -3492,7 +3606,8 @@ void *start_timer(void *arg) {
|
||||
if (i10gbe) {
|
||||
// set header
|
||||
veto_header *header = (veto_header *)(packetData2);
|
||||
header->frameNumber = virtual_currentFrameNumber;
|
||||
header->frameNumber =
|
||||
frameNr + (repeatNr * numFrames) + iframes;
|
||||
header->bunchId = 0;
|
||||
// fill data
|
||||
memcpy(packetData2 + sizeof(veto_header), vetoData,
|
||||
@ -3503,23 +3618,23 @@ void *start_timer(void *arg) {
|
||||
LOG(logINFO,
|
||||
("Sent frame %s: %d (bursts/ triggers: %d) [%lld] to E%d\n",
|
||||
(i10gbe ? "(+veto)" : ""), frameNr, repeatNr,
|
||||
(long long unsigned int)virtual_currentFrameNumber, iRxEntry));
|
||||
(frameNr + (repeatNr * numFrames) + iframes), iRxEntry));
|
||||
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);
|
||||
}
|
||||
}
|
||||
++virtual_currentFrameNumber;
|
||||
++iRxEntry;
|
||||
if (iRxEntry == numUdpDestinations) {
|
||||
iRxEntry = 0;
|
||||
}
|
||||
}
|
||||
|
||||
clock_gettime(CLOCK_REALTIME, &rend);
|
||||
int64_t timeNs = ((rend.tv_sec - rbegin.tv_sec) * 1E9 +
|
||||
(rend.tv_nsec - rbegin.tv_nsec));
|
||||
@ -3531,6 +3646,9 @@ void *start_timer(void *arg) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// already being set in the start acquisition (also for real detectors)
|
||||
setNextFrameNumber(frameNr + (numRepeats * numFrames) + 1);
|
||||
}
|
||||
|
||||
closeUDPSocket(0);
|
||||
if (i10gbe) {
|
||||
|
@ -61,6 +61,7 @@
|
||||
#define DEFAULT_BURST_MODE (BURST_INTERNAL)
|
||||
#define DEFAULT_FILTER_RESISTOR (0)
|
||||
#define DEFAILT_CDS_GAIN (0)
|
||||
#define DEFAULT_FRAME_NUMBER (1)
|
||||
#define DEFAULT_NUM_FRAMES (1)
|
||||
#define DEFAULT_NUM_CYCLES (1)
|
||||
#define DEFAULT_NUM_BURSTS (1)
|
||||
|
@ -269,7 +269,8 @@ int selectStoragecellStart(int pos);
|
||||
int getMaxStoragecellStart();
|
||||
#endif
|
||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) || \
|
||||
defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD)
|
||||
defined(CHIPTESTBOARDD) || defined(XILINX_CHIPTESTBOARDD) || \
|
||||
defined(GOTTHARD2D)
|
||||
int setNextFrameNumber(uint64_t value);
|
||||
int getNextFrameNumber(uint64_t *value);
|
||||
#endif
|
||||
|
@ -4710,7 +4710,8 @@ int set_next_frame_number(int file_des) {
|
||||
LOG(logDEBUG1, ("Setting next frame number to %llu\n", arg));
|
||||
|
||||
#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
||||
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
||||
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
||||
!defined(GOTTHARD2D)
|
||||
functionNotImplemented();
|
||||
#else
|
||||
// only set
|
||||
@ -4789,7 +4790,8 @@ int get_next_frame_number(int file_des) {
|
||||
LOG(logDEBUG1, ("Getting next frame number \n"));
|
||||
|
||||
#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
||||
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
||||
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
||||
!defined(GOTTHARD2D)
|
||||
functionNotImplemented();
|
||||
#else
|
||||
// get
|
||||
@ -6751,8 +6753,8 @@ int set_burst_mode(int file_des) {
|
||||
if (Server_VerifyLock() == OK) {
|
||||
switch (arg) {
|
||||
case BURST_INTERNAL:
|
||||
case BURST_EXTERNAL:
|
||||
case CONTINUOUS_INTERNAL:
|
||||
// case BURST_EXTERNAL:
|
||||
// case CONTINUOUS_INTERNAL:
|
||||
case CONTINUOUS_EXTERNAL:
|
||||
break;
|
||||
default:
|
||||
|
@ -764,7 +764,7 @@ readnrows:
|
||||
function: setReadNRows
|
||||
|
||||
nextframenumber:
|
||||
help: "[n_value]\n\t[Eiger][Jungfrau][Moench][Ctb][Xilinx Ctb] Next frame number. Stopping acquisition might result in different frame numbers for different modules."
|
||||
help: "[n_value]\n\t[Eiger][Jungfrau][Moench][Ctb][Xilinx Ctb][Gotthard2] Next frame number. Stopping acquisition might result in different frame numbers for different modules. So, after stopping, next frame number (max + 1) is set for all the modules afterwards."
|
||||
inherit_actions: INTEGER_COMMAND_VEC_ID
|
||||
actions:
|
||||
GET:
|
||||
|
@ -661,11 +661,13 @@ class Detector {
|
||||
Result<std::vector<int64_t>>
|
||||
getRxCurrentFrameIndex(Positions pos = {}) const;
|
||||
|
||||
/** [Eiger][Jungfrau][Moench][CTB][Xilinx CTB] */
|
||||
/** [Eiger][Jungfrau][Moench][CTB][Xilinx CTB][Gotthard2] */
|
||||
Result<uint64_t> getNextFrameNumber(Positions pos = {}) const;
|
||||
|
||||
/** [Eiger][Jungfrau][Moench][CTB][Xilinx CTB] Stopping acquisition might
|
||||
* result in different frame numbers for different modules.*/
|
||||
/** [Eiger][Jungfrau][Moench][CTB][Xilinx CTB][Gotthard2] Stopping
|
||||
* acquisition might result in different frame numbers for different
|
||||
* modules. So, after stopping, next frame number (max + 1) is set for all
|
||||
* the modules afterwards.*/
|
||||
void setNextFrameNumber(uint64_t value, Positions pos = {});
|
||||
|
||||
/** [Eiger][Mythen3][Jungfrau][Moench] Sends an internal software trigger to
|
||||
|
@ -911,7 +911,8 @@ void Detector::stopDetector(Positions pos) {
|
||||
case defs::JUNGFRAU:
|
||||
case defs::MOENCH:
|
||||
case defs::CHIPTESTBOARD:
|
||||
case defs::XILINX_CHIPTESTBOARD: {
|
||||
case defs::XILINX_CHIPTESTBOARD:
|
||||
case defs::GOTTHARD2: {
|
||||
auto res = getNextFrameNumber(pos);
|
||||
if (!res.equal()) {
|
||||
uint64_t maxVal = 0;
|
||||
|
@ -2403,7 +2403,7 @@ TEST_CASE("nextframenumber", "[.cmdcall]") {
|
||||
auto det_type = det.getDetectorType().squash();
|
||||
if (det_type == defs::EIGER || det_type == defs::JUNGFRAU ||
|
||||
det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD ||
|
||||
det_type == defs::XILINX_CHIPTESTBOARD) {
|
||||
det_type == defs::XILINX_CHIPTESTBOARD || det_type == defs::GOTTHARD2) {
|
||||
auto prev_sfnum = det.getNextFrameNumber();
|
||||
REQUIRE_THROWS(caller.call("nextframenumber", {"0"}, -1, PUT));
|
||||
{
|
||||
|
@ -6,9 +6,9 @@
|
||||
#define APIRECEIVER "developer 0x230224"
|
||||
#define APICTB "developer 0x240918"
|
||||
#define APIGOTTHARD "developer 0x240918"
|
||||
#define APIGOTTHARD2 "developer 0x240918"
|
||||
#define APIMOENCH "developer 0x240918"
|
||||
#define APIXILINXCTB "developer 0x240918"
|
||||
#define APIEIGER "developer 0x240918"
|
||||
#define APIMYTHEN3 "developer 0x241001"
|
||||
#define APIJUNGFRAU "developer 0x241001"
|
||||
#define APIGOTTHARD2 "developer 0x241002"
|
||||
|
Loading…
x
Reference in New Issue
Block a user