mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-20 02:40:03 +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
|
@property
|
||||||
@element
|
@element
|
||||||
def nextframenumber(self):
|
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()
|
return self.getNextFrameNumber()
|
||||||
|
|
||||||
@nextframenumber.setter
|
@nextframenumber.setter
|
||||||
|
@ -135,11 +135,16 @@
|
|||||||
#define DTA_OFFSET_REG (0x0A * REG_OFFSET + BASE_CONTROL)
|
#define DTA_OFFSET_REG (0x0A * REG_OFFSET + BASE_CONTROL)
|
||||||
|
|
||||||
|
|
||||||
|
/** Module ID Register */
|
||||||
#define MOD_ID_REG (0x0B * REG_OFFSET + BASE_CONTROL)
|
#define MOD_ID_REG (0x0B * REG_OFFSET + BASE_CONTROL)
|
||||||
|
|
||||||
#define MOD_ID_OFST (0)
|
#define MOD_ID_OFST (0)
|
||||||
#define MOD_ID_MSK (0x0000FFFF << MOD_ID_OFST)
|
#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 registers --------------------------------------------------*/
|
||||||
|
|
||||||
/* ASIC Config register */
|
/* ASIC Config register */
|
||||||
|
Binary file not shown.
@ -45,7 +45,6 @@ char initErrorMessage[MAX_STR_LENGTH];
|
|||||||
|
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
pthread_t pthread_virtual_tid;
|
pthread_t pthread_virtual_tid;
|
||||||
int64_t virtual_currentFrameNumber = 2;
|
|
||||||
int virtual_moduleid = 0;
|
int virtual_moduleid = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -75,6 +74,8 @@ int filterResistor = 0;
|
|||||||
int cdsGain = 0;
|
int cdsGain = 0;
|
||||||
int detPos[2] = {};
|
int detPos[2] = {};
|
||||||
int chipConfigured = 0;
|
int chipConfigured = 0;
|
||||||
|
uint64_t nextFrameNumber = 0;
|
||||||
|
uint64_t acqStartFrameNumber = 0;
|
||||||
|
|
||||||
int isInitCheckDone() { return initCheckDone; }
|
int isInitCheckDone() { return initCheckDone; }
|
||||||
|
|
||||||
@ -424,6 +425,8 @@ void setupDetector() {
|
|||||||
detPos[0] = 0;
|
detPos[0] = 0;
|
||||||
detPos[1] = 0;
|
detPos[1] = 0;
|
||||||
chipConfigured = 0;
|
chipConfigured = 0;
|
||||||
|
nextFrameNumber = 0;
|
||||||
|
acqStartFrameNumber = 0;
|
||||||
|
|
||||||
thisSettings = UNINITIALIZED;
|
thisSettings = UNINITIALIZED;
|
||||||
injectedChannelsOffset = 0;
|
injectedChannelsOffset = 0;
|
||||||
@ -528,6 +531,7 @@ void setupDetector() {
|
|||||||
setSettings(DEFAULT_SETTINGS);
|
setSettings(DEFAULT_SETTINGS);
|
||||||
|
|
||||||
// Initialization of acquistion parameters
|
// Initialization of acquistion parameters
|
||||||
|
setNextFrameNumber(DEFAULT_FRAME_NUMBER);
|
||||||
setNumFrames(DEFAULT_NUM_FRAMES);
|
setNumFrames(DEFAULT_NUM_FRAMES);
|
||||||
setNumTriggers(DEFAULT_NUM_CYCLES);
|
setNumTriggers(DEFAULT_NUM_CYCLES);
|
||||||
setNumBursts(DEFAULT_NUM_BURSTS);
|
setNumBursts(DEFAULT_NUM_BURSTS);
|
||||||
@ -1068,6 +1072,73 @@ int getDynamicRange(int *retval) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* parameters - timer */
|
/* 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) {
|
void setNumFrames(int64_t val) {
|
||||||
if (val > 0) {
|
if (val > 0) {
|
||||||
numFramesReg = val;
|
numFramesReg = val;
|
||||||
@ -1329,7 +1400,9 @@ int64_t getNumFramesLeft() {
|
|||||||
if ((burstMode == CONTINUOUS_INTERNAL ||
|
if ((burstMode == CONTINUOUS_INTERNAL ||
|
||||||
burstMode == CONTINUOUS_EXTERNAL) &&
|
burstMode == CONTINUOUS_EXTERNAL) &&
|
||||||
getTiming() == AUTO_TIMING) {
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1337,7 +1410,7 @@ int64_t getNumFramesLeft() {
|
|||||||
int64_t getNumTriggersLeft() {
|
int64_t getNumTriggersLeft() {
|
||||||
// trigger
|
// trigger
|
||||||
if (getTiming() == TRIGGER_EXPOSURE) {
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1356,7 +1429,7 @@ int64_t getNumBurstsLeft() {
|
|||||||
// burst and auto
|
// burst and auto
|
||||||
if ((burstMode == BURST_INTERNAL || burstMode == BURST_EXTERNAL) &&
|
if ((burstMode == BURST_INTERNAL || burstMode == BURST_EXTERNAL) &&
|
||||||
getTiming() == AUTO_TIMING) {
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -3360,6 +3433,39 @@ int startStateMachine() {
|
|||||||
// start state machine
|
// start state machine
|
||||||
bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_ACQSTN_MSK);
|
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)));
|
LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG)));
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@ -3419,7 +3525,7 @@ void *start_timer(void *arg) {
|
|||||||
|
|
||||||
*((uint16_t *)(imageData + i * sizeof(uint16_t))) =
|
*((uint16_t *)(imageData + i * sizeof(uint16_t))) =
|
||||||
(uint16_t)channelVal;
|
(uint16_t)channelVal;
|
||||||
// LOG(logINFORED, ("[%d]:0x%08x\n", i, channelVal));
|
LOG(logDEBUG, ("[%d]:0x%08x\n", i, channelVal));
|
||||||
}
|
}
|
||||||
char vetoData[vetodatasize];
|
char vetoData[vetodatasize];
|
||||||
memset(vetoData, 0, sizeof(vetodatasize));
|
memset(vetoData, 0, sizeof(vetodatasize));
|
||||||
@ -3427,109 +3533,121 @@ void *start_timer(void *arg) {
|
|||||||
*((uint16_t *)(vetoData + i)) = i;
|
*((uint16_t *)(vetoData + i)) = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iRxEntry = firstDest;
|
{
|
||||||
// loop over number of repeats
|
uint64_t frameNr = 0;
|
||||||
for (int repeatNr = 0; repeatNr != numRepeats; ++repeatNr) {
|
getNextFrameNumber(&frameNr);
|
||||||
|
|
||||||
struct timespec rbegin, rend;
|
int iRxEntry = firstDest;
|
||||||
clock_gettime(CLOCK_REALTIME, &rbegin);
|
// loop over number of repeats
|
||||||
|
for (int repeatNr = 0; repeatNr != numRepeats; ++repeatNr) {
|
||||||
|
|
||||||
// loop over number of frames
|
struct timespec rbegin, rend;
|
||||||
for (int frameNr = 0; frameNr != numFrames; ++frameNr) {
|
clock_gettime(CLOCK_REALTIME, &rbegin);
|
||||||
|
|
||||||
// check if manual stop
|
// loop over number of frames
|
||||||
if (sharedMemory_getStop() == 1) {
|
for (int iframes = 0; iframes != numFrames; ++iframes) {
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// change gain and data for every frame
|
// check if manual stop
|
||||||
{
|
if (sharedMemory_getStop() == 1) {
|
||||||
const int nchannels = NCHIP * NCHAN;
|
setNextFrameNumber(frameNr + (repeatNr * numFrames) +
|
||||||
int gainVal = 0;
|
iframes + 1);
|
||||||
for (int i = 0; i < nchannels; ++i) {
|
break;
|
||||||
if ((i % nchannels) < 400) {
|
}
|
||||||
gainVal = 1 + frameNr;
|
|
||||||
} else if ((i % nchannels) < 800) {
|
// change gain and data for every frame
|
||||||
gainVal = 2 + frameNr;
|
{
|
||||||
} else {
|
const int nchannels = NCHIP * NCHAN;
|
||||||
gainVal = 3 + frameNr;
|
int gainVal = 0;
|
||||||
|
for (int i = 0; i < nchannels; ++i) {
|
||||||
|
if ((i % nchannels) < 400) {
|
||||||
|
gainVal = 1 + iframes;
|
||||||
|
} else if ((i % nchannels) < 800) {
|
||||||
|
gainVal = 2 + iframes;
|
||||||
|
} else {
|
||||||
|
gainVal = 3 + iframes;
|
||||||
|
}
|
||||||
|
int dataVal =
|
||||||
|
*((uint16_t *)(imageData + i * sizeof(uint16_t)));
|
||||||
|
dataVal += iframes;
|
||||||
|
int channelVal = (dataVal & ~GAIN_VAL_MSK) |
|
||||||
|
(gainVal << GAIN_VAL_OFST);
|
||||||
|
*((uint16_t *)(imageData + i * sizeof(uint16_t))) =
|
||||||
|
(uint16_t)channelVal;
|
||||||
}
|
}
|
||||||
int dataVal =
|
|
||||||
*((uint16_t *)(imageData + i * sizeof(uint16_t)));
|
|
||||||
dataVal += frameNr;
|
|
||||||
int channelVal =
|
|
||||||
(dataVal & ~GAIN_VAL_MSK) | (gainVal << GAIN_VAL_OFST);
|
|
||||||
*((uint16_t *)(imageData + i * sizeof(uint16_t))) =
|
|
||||||
(uint16_t)channelVal;
|
|
||||||
}
|
}
|
||||||
}
|
// sleep for exposure time
|
||||||
// sleep for exposure time
|
struct timespec begin, end;
|
||||||
struct timespec begin, end;
|
clock_gettime(CLOCK_REALTIME, &begin);
|
||||||
clock_gettime(CLOCK_REALTIME, &begin);
|
usleep(expUs);
|
||||||
usleep(expUs);
|
|
||||||
|
|
||||||
// first interface
|
// first interface
|
||||||
char packetData[packetsize];
|
char packetData[packetsize];
|
||||||
memset(packetData, 0, packetsize);
|
memset(packetData, 0, packetsize);
|
||||||
// set header
|
|
||||||
sls_detector_header *header = (sls_detector_header *)(packetData);
|
|
||||||
header->detType = (uint16_t)myDetectorType;
|
|
||||||
header->version = SLS_DETECTOR_HEADER_VERSION;
|
|
||||||
header->frameNumber = virtual_currentFrameNumber;
|
|
||||||
header->packetNumber = 0;
|
|
||||||
header->modId = virtual_moduleid;
|
|
||||||
header->row = detPos[Y];
|
|
||||||
header->column = detPos[X];
|
|
||||||
// fill data
|
|
||||||
memcpy(packetData + sizeof(sls_detector_header), imageData,
|
|
||||||
datasize);
|
|
||||||
// send 1 packet = 1 frame
|
|
||||||
sendUDPPacket(iRxEntry, 0, packetData, packetsize);
|
|
||||||
|
|
||||||
// second interface (veto)
|
|
||||||
char packetData2[vetopacketsize];
|
|
||||||
memset(packetData2, 0, vetopacketsize);
|
|
||||||
if (i10gbe) {
|
|
||||||
// set header
|
// set header
|
||||||
veto_header *header = (veto_header *)(packetData2);
|
sls_detector_header *header =
|
||||||
header->frameNumber = virtual_currentFrameNumber;
|
(sls_detector_header *)(packetData);
|
||||||
header->bunchId = 0;
|
header->detType = (uint16_t)myDetectorType;
|
||||||
|
header->version = SLS_DETECTOR_HEADER_VERSION;
|
||||||
|
header->frameNumber =
|
||||||
|
frameNr + (repeatNr * numFrames) + iframes;
|
||||||
|
header->packetNumber = 0;
|
||||||
|
header->modId = virtual_moduleid;
|
||||||
|
header->row = detPos[Y];
|
||||||
|
header->column = detPos[X];
|
||||||
// fill data
|
// fill data
|
||||||
memcpy(packetData2 + sizeof(veto_header), vetoData,
|
memcpy(packetData + sizeof(sls_detector_header), imageData,
|
||||||
vetodatasize);
|
datasize);
|
||||||
// send 1 packet = 1 frame
|
// send 1 packet = 1 frame
|
||||||
sendUDPPacket(iRxEntry, 1, packetData2, vetopacketsize);
|
sendUDPPacket(iRxEntry, 0, packetData, packetsize);
|
||||||
}
|
|
||||||
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));
|
|
||||||
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)
|
// second interface (veto)
|
||||||
if (frameNr < numFrames) { // if there is a next frame
|
char packetData2[vetopacketsize];
|
||||||
if (periodNs > timeNs) {
|
memset(packetData2, 0, vetopacketsize);
|
||||||
usleep((periodNs - timeNs) / 1000);
|
if (i10gbe) {
|
||||||
|
// set header
|
||||||
|
veto_header *header = (veto_header *)(packetData2);
|
||||||
|
header->frameNumber =
|
||||||
|
frameNr + (repeatNr * numFrames) + iframes;
|
||||||
|
header->bunchId = 0;
|
||||||
|
// fill data
|
||||||
|
memcpy(packetData2 + sizeof(veto_header), vetoData,
|
||||||
|
vetodatasize);
|
||||||
|
// send 1 packet = 1 frame
|
||||||
|
sendUDPPacket(iRxEntry, 1, packetData2, vetopacketsize);
|
||||||
|
}
|
||||||
|
LOG(logINFO,
|
||||||
|
("Sent frame %s: %d (bursts/ triggers: %d) [%lld] to E%d\n",
|
||||||
|
(i10gbe ? "(+veto)" : ""), frameNr, repeatNr,
|
||||||
|
(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 (iframes < numFrames) { // if there is a next frame
|
||||||
|
if (periodNs > timeNs) {
|
||||||
|
usleep((periodNs - timeNs) / 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
++iRxEntry;
|
||||||
|
if (iRxEntry == numUdpDestinations) {
|
||||||
|
iRxEntry = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++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));
|
|
||||||
|
|
||||||
// sleep for (repeatPeriodNs - time remaining)
|
clock_gettime(CLOCK_REALTIME, &rend);
|
||||||
if (repeatNr < numRepeats) { // if there is a next repeat
|
int64_t timeNs = ((rend.tv_sec - rbegin.tv_sec) * 1E9 +
|
||||||
if (repeatPeriodNs > timeNs) {
|
(rend.tv_nsec - rbegin.tv_nsec));
|
||||||
usleep((repeatPeriodNs - timeNs) / 1000);
|
|
||||||
|
// sleep for (repeatPeriodNs - time remaining)
|
||||||
|
if (repeatNr < numRepeats) { // if there is a next repeat
|
||||||
|
if (repeatPeriodNs > timeNs) {
|
||||||
|
usleep((repeatPeriodNs - timeNs) / 1000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// already being set in the start acquisition (also for real detectors)
|
||||||
|
setNextFrameNumber(frameNr + (numRepeats * numFrames) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
closeUDPSocket(0);
|
closeUDPSocket(0);
|
||||||
|
@ -61,6 +61,7 @@
|
|||||||
#define DEFAULT_BURST_MODE (BURST_INTERNAL)
|
#define DEFAULT_BURST_MODE (BURST_INTERNAL)
|
||||||
#define DEFAULT_FILTER_RESISTOR (0)
|
#define DEFAULT_FILTER_RESISTOR (0)
|
||||||
#define DEFAILT_CDS_GAIN (0)
|
#define DEFAILT_CDS_GAIN (0)
|
||||||
|
#define DEFAULT_FRAME_NUMBER (1)
|
||||||
#define DEFAULT_NUM_FRAMES (1)
|
#define DEFAULT_NUM_FRAMES (1)
|
||||||
#define DEFAULT_NUM_CYCLES (1)
|
#define DEFAULT_NUM_CYCLES (1)
|
||||||
#define DEFAULT_NUM_BURSTS (1)
|
#define DEFAULT_NUM_BURSTS (1)
|
||||||
|
@ -269,7 +269,8 @@ int selectStoragecellStart(int pos);
|
|||||||
int getMaxStoragecellStart();
|
int getMaxStoragecellStart();
|
||||||
#endif
|
#endif
|
||||||
#if defined(JUNGFRAUD) || defined(MOENCHD) || defined(EIGERD) || \
|
#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 setNextFrameNumber(uint64_t value);
|
||||||
int getNextFrameNumber(uint64_t *value);
|
int getNextFrameNumber(uint64_t *value);
|
||||||
#endif
|
#endif
|
||||||
|
@ -4710,7 +4710,8 @@ int set_next_frame_number(int file_des) {
|
|||||||
LOG(logDEBUG1, ("Setting next frame number to %llu\n", arg));
|
LOG(logDEBUG1, ("Setting next frame number to %llu\n", arg));
|
||||||
|
|
||||||
#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
||||||
|
!defined(GOTTHARD2D)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
@ -4789,7 +4790,8 @@ int get_next_frame_number(int file_des) {
|
|||||||
LOG(logDEBUG1, ("Getting next frame number \n"));
|
LOG(logDEBUG1, ("Getting next frame number \n"));
|
||||||
|
|
||||||
#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
#if !defined(EIGERD) && !defined(JUNGFRAUD) && !defined(MOENCHD) && \
|
||||||
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD)
|
!defined(CHIPTESTBOARDD) && !defined(XILINX_CHIPTESTBOARDD) && \
|
||||||
|
!defined(GOTTHARD2D)
|
||||||
functionNotImplemented();
|
functionNotImplemented();
|
||||||
#else
|
#else
|
||||||
// get
|
// get
|
||||||
@ -6751,8 +6753,8 @@ int set_burst_mode(int file_des) {
|
|||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
switch (arg) {
|
switch (arg) {
|
||||||
case BURST_INTERNAL:
|
case BURST_INTERNAL:
|
||||||
case BURST_EXTERNAL:
|
// case BURST_EXTERNAL:
|
||||||
case CONTINUOUS_INTERNAL:
|
// case CONTINUOUS_INTERNAL:
|
||||||
case CONTINUOUS_EXTERNAL:
|
case CONTINUOUS_EXTERNAL:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -764,7 +764,7 @@ readnrows:
|
|||||||
function: setReadNRows
|
function: setReadNRows
|
||||||
|
|
||||||
nextframenumber:
|
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
|
inherit_actions: INTEGER_COMMAND_VEC_ID
|
||||||
actions:
|
actions:
|
||||||
GET:
|
GET:
|
||||||
|
@ -661,11 +661,13 @@ class Detector {
|
|||||||
Result<std::vector<int64_t>>
|
Result<std::vector<int64_t>>
|
||||||
getRxCurrentFrameIndex(Positions pos = {}) const;
|
getRxCurrentFrameIndex(Positions pos = {}) const;
|
||||||
|
|
||||||
/** [Eiger][Jungfrau][Moench][CTB][Xilinx CTB] */
|
/** [Eiger][Jungfrau][Moench][CTB][Xilinx CTB][Gotthard2] */
|
||||||
Result<uint64_t> getNextFrameNumber(Positions pos = {}) const;
|
Result<uint64_t> getNextFrameNumber(Positions pos = {}) const;
|
||||||
|
|
||||||
/** [Eiger][Jungfrau][Moench][CTB][Xilinx CTB] Stopping acquisition might
|
/** [Eiger][Jungfrau][Moench][CTB][Xilinx CTB][Gotthard2] Stopping
|
||||||
* result in different frame numbers for different modules.*/
|
* 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 = {});
|
void setNextFrameNumber(uint64_t value, Positions pos = {});
|
||||||
|
|
||||||
/** [Eiger][Mythen3][Jungfrau][Moench] Sends an internal software trigger to
|
/** [Eiger][Mythen3][Jungfrau][Moench] Sends an internal software trigger to
|
||||||
|
@ -911,7 +911,8 @@ void Detector::stopDetector(Positions pos) {
|
|||||||
case defs::JUNGFRAU:
|
case defs::JUNGFRAU:
|
||||||
case defs::MOENCH:
|
case defs::MOENCH:
|
||||||
case defs::CHIPTESTBOARD:
|
case defs::CHIPTESTBOARD:
|
||||||
case defs::XILINX_CHIPTESTBOARD: {
|
case defs::XILINX_CHIPTESTBOARD:
|
||||||
|
case defs::GOTTHARD2: {
|
||||||
auto res = getNextFrameNumber(pos);
|
auto res = getNextFrameNumber(pos);
|
||||||
if (!res.equal()) {
|
if (!res.equal()) {
|
||||||
uint64_t maxVal = 0;
|
uint64_t maxVal = 0;
|
||||||
|
@ -2403,7 +2403,7 @@ TEST_CASE("nextframenumber", "[.cmdcall]") {
|
|||||||
auto det_type = det.getDetectorType().squash();
|
auto det_type = det.getDetectorType().squash();
|
||||||
if (det_type == defs::EIGER || det_type == defs::JUNGFRAU ||
|
if (det_type == defs::EIGER || det_type == defs::JUNGFRAU ||
|
||||||
det_type == defs::MOENCH || det_type == defs::CHIPTESTBOARD ||
|
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();
|
auto prev_sfnum = det.getNextFrameNumber();
|
||||||
REQUIRE_THROWS(caller.call("nextframenumber", {"0"}, -1, PUT));
|
REQUIRE_THROWS(caller.call("nextframenumber", {"0"}, -1, PUT));
|
||||||
{
|
{
|
||||||
|
@ -6,9 +6,9 @@
|
|||||||
#define APIRECEIVER "developer 0x230224"
|
#define APIRECEIVER "developer 0x230224"
|
||||||
#define APICTB "developer 0x240918"
|
#define APICTB "developer 0x240918"
|
||||||
#define APIGOTTHARD "developer 0x240918"
|
#define APIGOTTHARD "developer 0x240918"
|
||||||
#define APIGOTTHARD2 "developer 0x240918"
|
|
||||||
#define APIMOENCH "developer 0x240918"
|
#define APIMOENCH "developer 0x240918"
|
||||||
#define APIXILINXCTB "developer 0x240918"
|
#define APIXILINXCTB "developer 0x240918"
|
||||||
#define APIEIGER "developer 0x240918"
|
#define APIEIGER "developer 0x240918"
|
||||||
#define APIMYTHEN3 "developer 0x241001"
|
#define APIMYTHEN3 "developer 0x241001"
|
||||||
#define APIJUNGFRAU "developer 0x241001"
|
#define APIJUNGFRAU "developer 0x241001"
|
||||||
|
#define APIGOTTHARD2 "developer 0x241002"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user