ctb 1g non blocking acquire (#555)

* allowing ctb and moench 1g to have non blocking acquisition also send data, refactoring wait for acquisition finished for all others
This commit is contained in:
Dhanya Thattil 2022-09-16 17:45:51 +02:00 committed by GitHub
parent e385618d09
commit bac32dcba9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 99 additions and 146 deletions

View File

@ -99,6 +99,7 @@ This document describes the differences between v7.0.0 and v6.x.x
- setting rx_hostname (or udp_dstip with rx_hostname not none) will always set udp_dstmac. solves problem of chaing udp_dstip and udp_dstmac stays the same - setting rx_hostname (or udp_dstip with rx_hostname not none) will always set udp_dstmac. solves problem of chaing udp_dstip and udp_dstmac stays the same
- jungfrau reset core and usleep removed (fix for 6.1.1 is now fixed in firmware) - jungfrau reset core and usleep removed (fix for 6.1.1 is now fixed in firmware)
- g2 change clkdivs 2 3 4 to defaults for burst and cw mode. - g2 change clkdivs 2 3 4 to defaults for burst and cw mode.
- ctb and moench: allowing 1g non blocking acquire to send data
2. Resolved Issues 2. Resolved Issues
================== ==================

View File

@ -2083,7 +2083,7 @@ void *start_timer(void *arg) {
closeUDPSocket(0); closeUDPSocket(0);
sharedMemory_setStatus(IDLE); sharedMemory_setStatus(IDLE);
LOG(logINFOBLUE, ("Finished Acquiring\n")); LOG(logINFOBLUE, ("Transmitting frames done\n"));
return NULL; return NULL;
} }
#endif #endif
@ -2203,40 +2203,31 @@ void readandSendUDPFrames(int *ret, char *mess) {
closeUDPSocket(0); closeUDPSocket(0);
} }
void readFrame(int *ret, char *mess) { void waitForAcquisitionEnd() {
#ifdef VIRTUAL
// wait for acquisition to be done
while (runBusy()) { while (runBusy()) {
usleep(500); // random usleep(500);
}
#ifndef VIRTUAL
int64_t retval = getNumFramesLeft() + 1;
if (retval > 0) {
LOG(logINFORED, ("%lld frames left\n", (long long int)retval));
} }
LOG(logINFOGREEN, ("acquisition successfully finished\n"));
return;
#endif #endif
// 1G LOG(logINFOGREEN, ("Blocking Acquisition done\n"));
if (!enableTenGigabitEthernet(-1)) {
readandSendUDPFrames(ret, mess);
}
// 10G
else {
// wait for acquisition to be done
while (runBusy()) {
usleep(500); // random
}
} }
// ret could be fail in 1gudp for not creating udp sockets void readFrames(int *ret, char *mess) {
if (*ret != FAIL) { #ifdef VIRTUAL
// frames left to give status while (runBusy()) {
int64_t retval = getNumFramesLeft() + 2; usleep(500);
if (retval > 1) {
sprintf(mess, "No data and run stopped: %lld frames left\n",
(long long int)retval);
LOG(logERROR, (mess));
} else {
LOG(logINFOGREEN, ("Acquisition successfully finished\n"));
} }
#else
// 1G force reading of frames
if (!enableTenGigabitEthernet(-1)) {
readandSendUDPFrames(ret, mess);
LOG(logINFOBLUE, ("Transmitting frames done\n"));
} }
*ret = (int)OK; #endif
} }
void unsetFifoReadStrobes() { void unsetFifoReadStrobes() {

View File

@ -2765,7 +2765,7 @@ void *start_timer(void *arg) {
closeUDPSocket(1); closeUDPSocket(1);
sharedMemory_setStatus(IDLE); sharedMemory_setStatus(IDLE);
LOG(logINFOBLUE, ("Finished Acquiring\n")); LOG(logINFOBLUE, ("Transmitting frames done\n"));
return NULL; return NULL;
} }
#endif #endif
@ -2893,16 +2893,13 @@ enum runStatus getRunStatus() {
#endif #endif
} }
void readFrame(int *ret, char *mess) { void waitForAcquisitionEnd(int *ret, char *mess) {
#ifdef VIRTUAL #ifdef VIRTUAL
// wait for status to be done // wait for status to be done
while (sharedMemory_getStatus() == RUNNING) { while (sharedMemory_getStatus() == RUNNING) {
usleep(500); usleep(500);
} }
LOG(logINFOGREEN, ("acquisition successfully finished\n"));
return;
#else #else
sharedMemory_lockLocalLink(); sharedMemory_lockLocalLink();
if (Feb_Control_WaitForFinishedFlag(5000, 1) == STATUS_ERROR) { if (Feb_Control_WaitForFinishedFlag(5000, 1) == STATUS_ERROR) {
sharedMemory_unlockLocalLink(); sharedMemory_unlockLocalLink();
@ -2911,7 +2908,7 @@ void readFrame(int *ret, char *mess) {
return; return;
} }
sharedMemory_unlockLocalLink(); sharedMemory_unlockLocalLink();
LOG(logINFOGREEN, ("Acquisition finished\n")); LOG(logINFO, ("Acquisition done\n"));
// wait for detector to send // wait for detector to send
int isTransmitting = 1; int isTransmitting = 1;
@ -2940,9 +2937,9 @@ void readFrame(int *ret, char *mess) {
printf("Transmitting...\n"); printf("Transmitting...\n");
} }
} }
LOG(logINFO, ("Beb: Detector has sent all data (acquire)\n")); LOG(logINFOBLUE, ("Transmitting frames done\n"));
LOG(logINFOGREEN, ("Acquisition successfully finished\n"));
#endif #endif
LOG(logINFOGREEN, ("Blocking Acquisition done\n"));
} }
/* common */ /* common */

View File

@ -3310,7 +3310,7 @@ void *start_timer(void *arg) {
} }
sharedMemory_setStatus(IDLE); sharedMemory_setStatus(IDLE);
LOG(logINFOBLUE, ("Finished Acquiring\n")); LOG(logINFOBLUE, ("Transmitting frames done\n"));
return NULL; return NULL;
} }
#endif #endif
@ -3396,18 +3396,11 @@ enum runStatus getRunStatus() {
return s; return s;
} }
void readFrame(int *ret, char *mess) { void waitForAcquisitionEnd() {
// wait for status to be done
while (runBusy()) { while (runBusy()) {
usleep(500); usleep(500);
} }
#ifdef VIRTUAL LOG(logINFOGREEN, ("Blocking Acquisition done\n"));
LOG(logINFOGREEN, ("acquisition successfully finished\n"));
return;
#endif
*ret = (int)OK;
LOG(logINFOGREEN, ("Acquisition successfully finished\n"));
} }
u_int32_t runBusy() { u_int32_t runBusy() {

View File

@ -1729,7 +1729,7 @@ void *start_timer(void *arg) {
closeUDPSocket(0); closeUDPSocket(0);
sharedMemory_setStatus(IDLE); sharedMemory_setStatus(IDLE);
LOG(logINFOBLUE, ("Finished Acquiring\n")); LOG(logINFOBLUE, ("Transmitting frames done\n"));
return NULL; return NULL;
} }
#endif #endif
@ -1854,28 +1854,17 @@ enum runStatus getRunStatus() {
return s; return s;
} }
void readFrame(int *ret, char *mess) { void waitForAcquisitionEnd() {
#ifdef VIRTUAL
while (sharedMemory_getStatus() == RUNNING) {
// LOG(logERROR, ("Waiting for finished flag\n");
usleep(5000);
}
return;
#endif
// wait for status to be done
while (runBusy()) { while (runBusy()) {
usleep(500); usleep(500);
} }
#ifndef VIRTUAL
// frames left to give status
*ret = (int)OK;
int64_t retval = getNumFramesLeft() + 1; int64_t retval = getNumFramesLeft() + 1;
if (retval > -1) { if (retval > -1) {
LOG(logERROR, ("No data and run stopped: %lld frames left\n", LOG(logINFORED, ("%lld frames left\n", (long long int)retval));
(long long int)retval));
} else {
LOG(logINFOGREEN, ("Acquisition successfully finished\n"));
} }
#endif
LOG(logINFOGREEN, ("Blocking Acquisition done\n"));
} }
u_int32_t runBusy() { u_int32_t runBusy() {

View File

@ -2712,7 +2712,7 @@ void *start_timer(void *arg) {
} }
sharedMemory_setStatus(IDLE); sharedMemory_setStatus(IDLE);
LOG(logINFOBLUE, ("Finished Acquiring\n")); LOG(logINFOBLUE, ("Transmitting frames done\n"));
return NULL; return NULL;
} }
#endif #endif
@ -2824,26 +2824,17 @@ enum runStatus getRunStatus() {
return s; return s;
} }
void readFrame(int *ret, char *mess) { void waitForAcquisitionEnd() {
// wait for status to be done
while (runBusy()) { while (runBusy()) {
usleep(500); usleep(500);
} }
#ifdef VIRTUAL #ifndef VIRTUAL
LOG(logINFOGREEN, ("acquisition successfully finished\n"));
return;
#endif
*ret = (int)OK;
// frames left to give status
int64_t retval = getNumFramesLeft() + 1; int64_t retval = getNumFramesLeft() + 1;
if (retval > 0) { if (retval > 0) {
LOG(logERROR, ("No data and run stopped: %lld frames left\n", LOG(logINFORED, ("%lld frames left\n", (long long int)retval));
(long long int)retval));
} else {
LOG(logINFOGREEN, ("Acquisition successfully finished\n"));
} }
#endif
LOG(logINFOGREEN, ("Blocking Acquisition done\n"));
} }
u_int32_t runBusy() { u_int32_t runBusy() {

View File

@ -1755,7 +1755,7 @@ void *start_timer(void *arg) {
closeUDPSocket(0); closeUDPSocket(0);
sharedMemory_setStatus(IDLE); sharedMemory_setStatus(IDLE);
LOG(logINFOBLUE, ("Finished Acquiring\n")); LOG(logINFOBLUE, ("Transmitting frames done\n"));
return NULL; return NULL;
} }
#endif #endif
@ -1877,40 +1877,31 @@ void readandSendUDPFrames(int *ret, char *mess) {
closeUDPSocket(0); closeUDPSocket(0);
} }
void readFrame(int *ret, char *mess) { void waitForAcquisitionEnd() {
#ifdef VIRTUAL
// wait for acquisition to be done
while (runBusy()) { while (runBusy()) {
usleep(500); // random usleep(500);
}
#ifndef VIRTUAL
int64_t retval = getNumFramesLeft() + 1;
if (retval > 0) {
LOG(logINFORED, ("%lld frames left\n", (long long int)retval));
} }
LOG(logINFOGREEN, ("acquisition successfully finished\n"));
return;
#endif #endif
// 1G LOG(logINFOGREEN, ("Blocking Acquisition done\n"));
if (!enableTenGigabitEthernet(-1)) {
readandSendUDPFrames(ret, mess);
}
// 10G
else {
// wait for acquisition to be done
while (runBusy()) {
usleep(500); // random
}
} }
// ret could be fail in 1gudp for not creating udp sockets void readFrames(int *ret, char *mess) {
if (*ret != FAIL) { #ifdef VIRTUAL
// frames left to give status while (runBusy()) {
int64_t retval = getNumFramesLeft() + 2; usleep(500);
if (retval > 1) {
sprintf(mess, "No data and run stopped: %lld frames left\n",
(long long int)retval);
LOG(logERROR, (mess));
} else {
LOG(logINFOGREEN, ("Acquisition successfully finished\n"));
} }
#else
// 1G force reading of frames
if (!enableTenGigabitEthernet(-1)) {
readandSendUDPFrames(ret, mess);
LOG(logINFOBLUE, ("Transmitting frames done\n"));
} }
*ret = (int)OK; #endif
} }
void unsetFifoReadStrobes() { void unsetFifoReadStrobes() {

View File

@ -2564,7 +2564,7 @@ void *start_timer(void *arg) {
closeUDPSocket(0); closeUDPSocket(0);
sharedMemory_setStatus(IDLE); sharedMemory_setStatus(IDLE);
LOG(logINFOBLUE, ("Finished Acquiring\n")); LOG(logINFOBLUE, ("Transmitting frames done\n"));
return NULL; return NULL;
} }
#endif #endif
@ -2689,27 +2689,18 @@ enum runStatus getRunStatus() {
return s; return s;
} }
void readFrame(int *ret, char *mess) { void waitForAcquisitionEnd() {
// wait for status to be done
while (runBusy()) { while (runBusy()) {
usleep(500); usleep(500);
} }
#ifdef VIRTUAL #ifndef VIRTUAL
LOG(logINFOGREEN, ("acquisition successfully finished\n"));
return;
#endif
*ret = (int)OK;
// frames left to give status
int64_t retval = getNumFramesLeft() + 1; int64_t retval = getNumFramesLeft() + 1;
if (retval > 0) { if (retval > 0) {
LOG(logERROR, ("No data and run stopped: %lld frames left\n", LOG(logINFORED, ("%lld frames left\n", (long long int)retval));
(long long int)retval));
} else {
LOG(logINFOGREEN, ("Acquisition successfully finished\n"));
} }
#endif
LOG(logINFOGREEN, ("Blocking Acquisition done\n"));
} }
u_int32_t runBusy() { u_int32_t runBusy() {

View File

@ -666,7 +666,14 @@ int softwareTrigger(int block);
int startReadOut(); int startReadOut();
#endif #endif
enum runStatus getRunStatus(); enum runStatus getRunStatus();
void readFrame(int *ret, char *mess); #if defined(CHIPTESTBOARDD) || defined(MOENCHD)
void readFrames(int *ret, char *mess);
#endif
#ifdef EIGERD
void waitForAcquisitionEnd(int *ret, char *mess);
#else
void waitForAcquisitionEnd();
#endif
#if defined(CHIPTESTBOARDD) || defined(MOENCHD) #if defined(CHIPTESTBOARDD) || defined(MOENCHD)
void readandSendUDPFrames(int *ret, char *mess); void readandSendUDPFrames(int *ret, char *mess);
void unsetFifoReadStrobes(); void unsetFifoReadStrobes();

View File

@ -52,7 +52,6 @@ int start_acquisition(int);
int stop_acquisition(int); int stop_acquisition(int);
int get_run_status(int); int get_run_status(int);
int start_and_read_all(int); int start_and_read_all(int);
int read_all(int);
int get_num_frames(int); int get_num_frames(int);
int set_num_frames(int); int set_num_frames(int);
int get_num_triggers(int); int get_num_triggers(int);

View File

@ -2010,15 +2010,30 @@ void *start_state_machine(void *arg) {
} }
break; break;
} }
// blocking or scan
if (*blocking || times > 1) {
readFrame(&ret, mess); #if defined(CHIPTESTBOARDD) || defined(MOENCHD)
readFrames(&ret, mess);
if (ret == FAIL && scan) { if (ret == FAIL && scan) {
sprintf(scanErrMessage, "Cannot scan at %d. ", scanSteps[i]); sprintf(scanErrMessage, "Cannot scan at %d. ", scanSteps[i]);
strcat(scanErrMessage, mess); strcat(scanErrMessage, mess);
sharedMemory_setScanStatus(ERROR); sharedMemory_setScanStatus(ERROR);
break; break;
} }
#endif
// blocking or scan
if (*blocking || times > 1) {
#ifdef EIGERD
waitForAcquisitionEnd(&ret, mess);
if (ret == FAIL && scan) {
sprintf(scanErrMessage, "Cannot scan at %d. ", scanSteps[i]);
strcat(scanErrMessage, mess);
sharedMemory_setScanStatus(ERROR);
break;
}
#else
waitForAcquisitionEnd();
#endif
} }
} }
// end of scan // end of scan
@ -2061,18 +2076,6 @@ int get_run_status(int file_des) {
int start_and_read_all(int file_des) { return acquire(1, file_des); } int start_and_read_all(int file_des) { return acquire(1, file_des); }
int read_all(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
LOG(logDEBUG1, ("Reading all frames\n"));
// only set
if (Server_VerifyLock() == OK) {
readFrame(&ret, mess);
}
return Server_SendResult(file_des, INT32, NULL, 0);
}
int get_num_frames(int file_des) { int get_num_frames(int file_des) {
ret = OK; ret = OK;
memset(mess, 0, sizeof(mess)); memset(mess, 0, sizeof(mess));

View File

@ -5,10 +5,10 @@
#define APILIB 0x220609 #define APILIB 0x220609
#define APIRECEIVER 0x220609 #define APIRECEIVER 0x220609
#define APIGUI 0x220609 #define APIGUI 0x220609
#define APIEIGER 0x220816 #define APICTB 0x220916
#define APICTB 0x220831 #define APIGOTTHARD 0x220916
#define APIGOTTHARD 0x220831 #define APIGOTTHARD2 0x220916
#define APIJUNGFRAU 0x220831 #define APIJUNGFRAU 0x220916
#define APIMOENCH 0x220831 #define APIMYTHEN3 0x220916
#define APIMYTHEN3 0x220901 #define APIMOENCH 0x220916
#define APIGOTTHARD2 0x220912 #define APIEIGER 0x220916