mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-05-10 23:00:03 +02:00
1. allow 1gbe non blocking acquire by creating another thread (#753)
* allow 1gbe non blocking acquire by creating another thread * removed unnnecessary print out in ctb
This commit is contained in:
parent
f0c789dc91
commit
afee45790f
Binary file not shown.
@ -2289,6 +2289,11 @@ enum runStatus getRunStatus() {
|
|||||||
return TRANSMITTING;
|
return TRANSMITTING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 1g might still be transmitting or reading from fifo (not virtual)
|
||||||
|
if (!enableTenGigabitEthernet(-1) && checkDataInFifo()) {
|
||||||
|
return TRANSMITTING;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(retval & STATUS_IDLE_MSK)) {
|
if (!(retval & STATUS_IDLE_MSK)) {
|
||||||
LOG(logINFOBLUE, ("Status: Idle\n"));
|
LOG(logINFOBLUE, ("Status: Idle\n"));
|
||||||
return IDLE;
|
return IDLE;
|
||||||
@ -2299,19 +2304,17 @@ enum runStatus getRunStatus() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void readandSendUDPFrames(int *ret, char *mess) {
|
int validateUDPSocket() {
|
||||||
LOG(logDEBUG1, ("Reading from 1G UDP\n"));
|
|
||||||
|
|
||||||
// validate udp socket
|
|
||||||
if (getUdPSocketDescriptor(0, 0) <= 0) {
|
if (getUdPSocketDescriptor(0, 0) <= 0) {
|
||||||
*ret = FAIL;
|
return FAIL;
|
||||||
sprintf(mess, "UDP Socket not created. sockfd:%d\n",
|
}
|
||||||
getUdPSocketDescriptor(0, 0));
|
return OK;
|
||||||
LOG(logERROR, (mess));
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// every frame read
|
void readandSendUDPFrames() {
|
||||||
|
LOG(logDEBUG1, ("Reading from 1G UDP\n"));
|
||||||
|
|
||||||
|
// read every frame
|
||||||
while (readFrameFromFifo() == OK) {
|
while (readFrameFromFifo() == OK) {
|
||||||
int bytesToSend = 0, n = 0;
|
int bytesToSend = 0, n = 0;
|
||||||
while ((bytesToSend = fillUDPPacket(udpPacketData))) {
|
while ((bytesToSend = fillUDPPacket(udpPacketData))) {
|
||||||
@ -2324,6 +2327,7 @@ void readandSendUDPFrames(int *ret, char *mess) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
closeUDPSocket(0);
|
closeUDPSocket(0);
|
||||||
|
LOG(logINFOBLUE, ("Transmitting frames done\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void waitForAcquisitionEnd() {
|
void waitForAcquisitionEnd() {
|
||||||
@ -2339,20 +2343,6 @@ void waitForAcquisitionEnd() {
|
|||||||
LOG(logINFOGREEN, ("Blocking Acquisition done\n"));
|
LOG(logINFOGREEN, ("Blocking Acquisition done\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void readFrames(int *ret, char *mess) {
|
|
||||||
#ifdef VIRTUAL
|
|
||||||
while (runBusy()) {
|
|
||||||
usleep(500);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// 1G force reading of frames
|
|
||||||
if (!enableTenGigabitEthernet(-1)) {
|
|
||||||
readandSendUDPFrames(ret, mess);
|
|
||||||
LOG(logINFOBLUE, ("Transmitting frames done\n"));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void unsetFifoReadStrobes() {
|
void unsetFifoReadStrobes() {
|
||||||
bus_w(DUMMY_REG, bus_r(DUMMY_REG) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK) &
|
bus_w(DUMMY_REG, bus_r(DUMMY_REG) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK) &
|
||||||
(~DUMMY_DGTL_FIFO_RD_STRBE_MSK));
|
(~DUMMY_DGTL_FIFO_RD_STRBE_MSK));
|
||||||
@ -2444,7 +2434,7 @@ uint32_t checkDataInFifo() {
|
|||||||
uint32_t dataPresent = 0;
|
uint32_t dataPresent = 0;
|
||||||
if (analogEnable) {
|
if (analogEnable) {
|
||||||
uint32_t analogFifoEmpty = bus_r(FIFO_EMPTY_REG);
|
uint32_t analogFifoEmpty = bus_r(FIFO_EMPTY_REG);
|
||||||
LOG(logINFO,
|
LOG(logDEBUG1,
|
||||||
("Analog Fifo Empty (32 channels): 0x%08x\n", analogFifoEmpty));
|
("Analog Fifo Empty (32 channels): 0x%08x\n", analogFifoEmpty));
|
||||||
dataPresent = (~analogFifoEmpty);
|
dataPresent = (~analogFifoEmpty);
|
||||||
}
|
}
|
||||||
|
@ -676,16 +676,14 @@ int softwareTrigger(int block);
|
|||||||
int startReadOut();
|
int startReadOut();
|
||||||
#endif
|
#endif
|
||||||
enum runStatus getRunStatus();
|
enum runStatus getRunStatus();
|
||||||
#if defined(CHIPTESTBOARDD)
|
|
||||||
void readFrames(int *ret, char *mess);
|
|
||||||
#endif
|
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
void waitForAcquisitionEnd(int *ret, char *mess);
|
void waitForAcquisitionEnd(int *ret, char *mess);
|
||||||
#else
|
#else
|
||||||
void waitForAcquisitionEnd();
|
void waitForAcquisitionEnd();
|
||||||
#endif
|
#endif
|
||||||
#if defined(CHIPTESTBOARDD)
|
#if defined(CHIPTESTBOARDD)
|
||||||
void readandSendUDPFrames(int *ret, char *mess);
|
int validateUDPSocket();
|
||||||
|
void readandSendUDPFrames();
|
||||||
void unsetFifoReadStrobes();
|
void unsetFifoReadStrobes();
|
||||||
void readSample(int ns);
|
void readSample(int ns);
|
||||||
uint32_t checkDataInFifo();
|
uint32_t checkDataInFifo();
|
||||||
|
@ -48,6 +48,9 @@ int set_settings(int);
|
|||||||
int get_threshold_energy(int);
|
int get_threshold_energy(int);
|
||||||
int acquire(int blocking, int file_des);
|
int acquire(int blocking, int file_des);
|
||||||
void *start_state_machine(void *arg);
|
void *start_state_machine(void *arg);
|
||||||
|
#if defined(CHIPTESTBOARDD) && !defined(VIRTUAL)
|
||||||
|
void *start_reading_and_sending_udp_frames(void *arg);
|
||||||
|
#endif
|
||||||
int start_acquisition(int);
|
int start_acquisition(int);
|
||||||
int stop_acquisition(int);
|
int stop_acquisition(int);
|
||||||
int get_run_status(int);
|
int get_run_status(int);
|
||||||
|
@ -67,6 +67,7 @@ int moduleIndex = -1;
|
|||||||
// Local variables
|
// Local variables
|
||||||
int (*flist[NUM_DET_FUNCTIONS])(int);
|
int (*flist[NUM_DET_FUNCTIONS])(int);
|
||||||
pthread_t pthread_tid;
|
pthread_t pthread_tid;
|
||||||
|
pthread_t pthread_tid_ctb_1g;
|
||||||
|
|
||||||
// scan variables
|
// scan variables
|
||||||
int scan = 0;
|
int scan = 0;
|
||||||
@ -1917,7 +1918,9 @@ int acquire(int blocking, int file_des) {
|
|||||||
strcpy(mess, "Could not start acquisition thread!\n");
|
strcpy(mess, "Could not start acquisition thread!\n");
|
||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
} else {
|
} else {
|
||||||
// only does not wait for non blocking and scan
|
// wait for blocking always (scan or not)
|
||||||
|
// non blocking-no scan also wait (for error message)
|
||||||
|
// non blcoking-scan dont wait (there is scanErrorMessage)
|
||||||
if (blocking || !scan) {
|
if (blocking || !scan) {
|
||||||
pthread_join(pthread_tid, NULL);
|
pthread_join(pthread_tid, NULL);
|
||||||
}
|
}
|
||||||
@ -1999,18 +2002,43 @@ void *start_state_machine(void *arg) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// only 1g real ctb needs to read from fifo
|
||||||
#if defined(CHIPTESTBOARDD)
|
// to avoid blocking, in another thread
|
||||||
readFrames(&ret, mess);
|
#if defined(CHIPTESTBOARDD) && !defined(VIRTUAL)
|
||||||
if (ret == FAIL && scan) {
|
if (!enableTenGigabitEthernet(-1)) {
|
||||||
sprintf(scanErrMessage, "Cannot scan at %d. ", scanSteps[i]);
|
ret = validateUDPSocket();
|
||||||
|
if (ret == FAIL) {
|
||||||
|
strcpy(mess, "UDP socket not created!\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
} else {
|
||||||
|
if (pthread_create(&pthread_tid_ctb_1g, NULL,
|
||||||
|
&start_reading_and_sending_udp_frames,
|
||||||
|
NULL)) {
|
||||||
|
ret = FAIL;
|
||||||
|
strcpy(mess, "Could not start read frames thread!\n");
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// add scan error message
|
||||||
|
if (ret == FAIL) {
|
||||||
|
if (scan) {
|
||||||
|
sprintf(scanErrMessage, "Cannot scan at %d. ",
|
||||||
|
scanSteps[i]);
|
||||||
strcat(scanErrMessage, mess);
|
strcat(scanErrMessage, mess);
|
||||||
sharedMemory_setScanStatus(ERROR);
|
sharedMemory_setScanStatus(ERROR);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
// blocking or scan
|
// blocking or scan
|
||||||
if (*blocking || times > 1) {
|
if (*blocking || times > 1) {
|
||||||
|
// wait to finish reading from fifo (1g real ctb)
|
||||||
|
#if defined(CHIPTESTBOARDD) && !defined(VIRTUAL)
|
||||||
|
if (!enableTenGigabitEthernet(-1)) {
|
||||||
|
pthread_join(pthread_tid_ctb_1g, NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#ifdef EIGERD
|
#ifdef EIGERD
|
||||||
waitForAcquisitionEnd(&ret, mess);
|
waitForAcquisitionEnd(&ret, mess);
|
||||||
if (ret == FAIL && scan) {
|
if (ret == FAIL && scan) {
|
||||||
@ -2031,6 +2059,13 @@ void *start_state_machine(void *arg) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CHIPTESTBOARDD) && !defined(VIRTUAL)
|
||||||
|
void *start_reading_and_sending_udp_frames(void *arg) {
|
||||||
|
readandSendUDPFrames();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int start_acquisition(int file_des) { return acquire(0, file_des); }
|
int start_acquisition(int file_des) { return acquire(0, file_des); }
|
||||||
|
|
||||||
int stop_acquisition(int file_des) {
|
int stop_acquisition(int file_des) {
|
||||||
|
@ -10,4 +10,4 @@
|
|||||||
#define APIEIGER "developer 0x230224"
|
#define APIEIGER "developer 0x230224"
|
||||||
#define APIJUNGFRAU "developer 0x230508"
|
#define APIJUNGFRAU "developer 0x230508"
|
||||||
#define APIMOENCH "developer 0x230508"
|
#define APIMOENCH "developer 0x230508"
|
||||||
#define APICTB "developer 0x230522"
|
#define APICTB "developer 0x230523"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user