mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-24 23:30:03 +02:00
initial functions for mythen3
This commit is contained in:
parent
72362b0334
commit
4b7ab98135
@ -1,4 +1,4 @@
|
|||||||
add_executable(mythen3DetectorServer
|
add_executable(mythen3DetectorServer_virtual
|
||||||
slsDetectorFunctionList.c
|
slsDetectorFunctionList.c
|
||||||
../slsDetectorServer/slsDetectorServer.c
|
../slsDetectorServer/slsDetectorServer.c
|
||||||
../slsDetectorServer/slsDetectorServer_funcs.c
|
../slsDetectorServer/slsDetectorServer_funcs.c
|
||||||
@ -10,22 +10,22 @@ include_directories(
|
|||||||
../../slsSupportLib/include
|
../../slsSupportLib/include
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(mythen3DetectorServer
|
target_include_directories(mythen3DetectorServer_virtual
|
||||||
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
target_compile_definitions(mythen3DetectorServer
|
target_compile_definitions(mythen3DetectorServer_virtual
|
||||||
PUBLIC MYTHEN3D VIRTUAL STOP_SERVER
|
PUBLIC MYTHEN3D VIRTUAL STOP_SERVER
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(mythen3DetectorServer
|
target_link_libraries(mythen3DetectorServer_virtual
|
||||||
PUBLIC pthread rt
|
PUBLIC pthread rt
|
||||||
)
|
)
|
||||||
|
|
||||||
set_target_properties(mythen3DetectorServer PROPERTIES
|
set_target_properties(mythen3DetectorServer_virtual PROPERTIES
|
||||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||||
)
|
)
|
||||||
|
|
||||||
install(TARGETS mythen3DetectorServer
|
install(TARGETS mythen3DetectorServer_virtual
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
)
|
)
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
// stuff from Carlos
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/* Definitions for FPGA*/
|
/* Definitions for FPGA*/
|
||||||
@ -5,5 +6,28 @@
|
|||||||
|
|
||||||
|
|
||||||
/* Status register */
|
/* Status register */
|
||||||
#define STATUS_REG (0x02 << MEM_MAP_SHIFT)
|
#define STATUS_REG (0x01 << MEM_MAP_SHIFT)
|
||||||
|
|
||||||
|
/* Set Cycles 64 bit register */
|
||||||
|
#define SET_CYCLES_LSB_REG (0x02 << MEM_MAP_SHIFT)
|
||||||
|
#define SET_CYCLES_MSB_REG (0x03 << MEM_MAP_SHIFT)
|
||||||
|
|
||||||
|
/* Set Frames 64 bit register */
|
||||||
|
#define SET_FRAMES_LSB_REG (0x04 << MEM_MAP_SHIFT)
|
||||||
|
#define SET_FRAMES_MSB_REG (0x05 << MEM_MAP_SHIFT)
|
||||||
|
|
||||||
|
/* Set Period 64 bit register tT = T x 50 ns */
|
||||||
|
#define SET_PERIOD_LSB_REG (0x06 << MEM_MAP_SHIFT)
|
||||||
|
#define SET_PERIOD_MSB_REG (0x07 << MEM_MAP_SHIFT)
|
||||||
|
|
||||||
|
/* Set Exptime 64 bit register eEXP = Exp x 25 ns */
|
||||||
|
#define SET_EXPTIME_LSB_REG (0x08 << MEM_MAP_SHIFT)
|
||||||
|
#define SET_EXPTIME_MSB_REG (0x09 << MEM_MAP_SHIFT)
|
||||||
|
|
||||||
|
/* Get Cycles 64 bit register */
|
||||||
|
#define GET_CYCLES_LSB_REG (0x0A << MEM_MAP_SHIFT)
|
||||||
|
#define GET_CYCLES_MSB_REG (0x0B << MEM_MAP_SHIFT)
|
||||||
|
|
||||||
|
/* Get Frames 64 bit register */
|
||||||
|
#define GET_FRAMES_LSB_REG (0x0C << MEM_MAP_SHIFT)
|
||||||
|
#define GET_FRAMES_MSB_REG (0x0D << MEM_MAP_SHIFT)
|
||||||
|
@ -190,32 +190,64 @@ int getSpeed(enum speedVariable ind) {
|
|||||||
|
|
||||||
int64_t setTimer(enum timerIndex ind, int64_t val) {
|
int64_t setTimer(enum timerIndex ind, int64_t val) {
|
||||||
|
|
||||||
|
int64_t retval = -1;
|
||||||
switch(ind){
|
switch(ind){
|
||||||
|
|
||||||
case FRAME_NUMBER:
|
case FRAME_NUMBER: // defined in sls_detector_defs.h (general)
|
||||||
|
if(val >= 0) {
|
||||||
|
FILE_LOG(logINFO, ("Setting #frames: %lld\n",(long long int)val));
|
||||||
|
}
|
||||||
|
retval = set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); // defined in my RegisterDefs.h
|
||||||
|
FILE_LOG(logDEBUG1, ("Getting #frames: %lld\n", (long long int)retval));
|
||||||
|
break;
|
||||||
|
|
||||||
case ACQUISITION_TIME:
|
case ACQUISITION_TIME:
|
||||||
|
if(val >= 0){
|
||||||
|
FILE_LOG(logINFO, ("Setting exptime: %lldns\n", (long long int)val));
|
||||||
|
val *= (1E-3 * TEMP_CLK);
|
||||||
|
}
|
||||||
|
retval = set64BitReg(val, SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) / (1E-3 * TEMP_CLK); // CLK defined in slsDetectorServer_defs.h
|
||||||
|
FILE_LOG(logDEBUG1, ("Getting exptime: %lldns\n", (long long int)retval));
|
||||||
|
break;
|
||||||
|
|
||||||
case FRAME_PERIOD:
|
case FRAME_PERIOD:
|
||||||
|
if(val >= 0){
|
||||||
|
FILE_LOG(logINFO, ("Setting period: %lldns\n",(long long int)val));
|
||||||
|
val *= (1E-3 * TEMP_CLK);
|
||||||
|
}
|
||||||
|
retval = set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG )/ (1E-3 * TEMP_CLK);
|
||||||
|
FILE_LOG(logDEBUG1, ("Getting period: %lldns\n", (long long int)retval));
|
||||||
|
break;
|
||||||
case CYCLES_NUMBER:
|
case CYCLES_NUMBER:
|
||||||
return -1;
|
if(val >= 0) {
|
||||||
|
FILE_LOG(logINFO, ("Setting #cycles: %lld\n", (long long int)val));
|
||||||
|
}
|
||||||
|
retval = set64BitReg(val, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG);
|
||||||
|
FILE_LOG(logDEBUG1, ("Getting #cycles: %lld\n", (long long int)retval));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
FILE_LOG(logERROR, ("Timer Index not implemented for this detector: %d\n", ind));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return retval;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int validateTimer(enum timerIndex ind, int64_t val, int64_t retval) {
|
int validateTimer(enum timerIndex ind, int64_t val, int64_t retval) {
|
||||||
|
if (val < 0)
|
||||||
|
return OK;
|
||||||
switch(ind) {
|
switch(ind) {
|
||||||
case ACQUISITION_TIME:
|
case ACQUISITION_TIME:
|
||||||
|
|
||||||
case FRAME_PERIOD:
|
case FRAME_PERIOD:
|
||||||
|
// convert to freq
|
||||||
|
val *= (1E-3 * TEMP_CLK);
|
||||||
|
// convert back to timer
|
||||||
|
val = (val) / (1E-3 * TEMP_CLK);
|
||||||
|
if (val != retval)
|
||||||
|
return FAIL;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -227,6 +259,23 @@ int64_t getTimeLeft(enum timerIndex ind){
|
|||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
int64_t retval = -1;
|
||||||
|
switch(ind){
|
||||||
|
|
||||||
|
case FRAME_NUMBER:
|
||||||
|
retval = get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG);
|
||||||
|
FILE_LOG(logINFO, ("Getting number of frames left: %lld\n",(long long int)retval));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CYCLES_NUMBER:
|
||||||
|
retval = get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG);
|
||||||
|
FILE_LOG(logINFO, ("Getting number of cycles left: %lld\n", (long long int)retval));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FILE_LOG(logERROR, ("Remaining Timer index not implemented for this detector: %d\n", ind));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -238,6 +287,7 @@ int startStateMachine(){
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
FILE_LOG(logINFOBLUE, ("starting state machine\n"));
|
FILE_LOG(logINFOBLUE, ("starting state machine\n"));
|
||||||
|
// set status to running
|
||||||
virtual_status = 1;
|
virtual_status = 1;
|
||||||
virtual_stop = 0;
|
virtual_stop = 0;
|
||||||
if(pthread_create(&pthread_virtual_tid, NULL, &start_timer, NULL)) {
|
if(pthread_create(&pthread_virtual_tid, NULL, &start_timer, NULL)) {
|
||||||
@ -261,23 +311,30 @@ void* start_timer(void* arg) {
|
|||||||
|
|
||||||
|
|
||||||
int frameNr = 0;
|
int frameNr = 0;
|
||||||
|
// loop over number of frames
|
||||||
for(frameNr=0; frameNr!= numFrames; ++frameNr ) {
|
for(frameNr=0; frameNr!= numFrames; ++frameNr ) {
|
||||||
int srcOffset = 0;
|
|
||||||
|
|
||||||
|
//check if virtual_stop is high, then break
|
||||||
|
|
||||||
|
// sleep for exposure time
|
||||||
struct timespec begin, end;
|
struct timespec begin, end;
|
||||||
clock_gettime(CLOCK_REALTIME, &begin);
|
clock_gettime(CLOCK_REALTIME, &begin);
|
||||||
|
|
||||||
usleep(exp_ns / 1000);
|
usleep(exp_ns / 1000);
|
||||||
|
|
||||||
clock_gettime(CLOCK_REALTIME, &end);
|
clock_gettime(CLOCK_REALTIME, &end);
|
||||||
|
|
||||||
|
// calculate time left in period
|
||||||
int64_t time_ns = ((end.tv_sec - begin.tv_sec) * 1E9 +
|
int64_t time_ns = ((end.tv_sec - begin.tv_sec) * 1E9 +
|
||||||
(end.tv_nsec - begin.tv_nsec));
|
(end.tv_nsec - begin.tv_nsec));
|
||||||
|
|
||||||
|
// sleep for (period - exptime)
|
||||||
if (periodns > time_ns) {
|
if (periodns > time_ns) {
|
||||||
usleep((periodns - time_ns)/ 1000);
|
usleep((periodns - time_ns)/ 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set register frames left
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set status to idle
|
||||||
virtual_status = 0;
|
virtual_status = 0;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -9,3 +9,4 @@
|
|||||||
#define NCHAN (128)
|
#define NCHAN (128)
|
||||||
#define NCHIP (10)
|
#define NCHIP (10)
|
||||||
#define NDAC (16)
|
#define NDAC (16)
|
||||||
|
#define TEMP_CLK (20) /* MHz */
|
@ -18,6 +18,8 @@ const enum detectorType myDetectorType = JUNGFRAU;
|
|||||||
const enum detectorType myDetectorType = CHIPTESTBOARD;
|
const enum detectorType myDetectorType = CHIPTESTBOARD;
|
||||||
#elif MOENCHD
|
#elif MOENCHD
|
||||||
const enum detectorType myDetectorType = MOENCH;
|
const enum detectorType myDetectorType = MOENCH;
|
||||||
|
#elif MYTHEN3D
|
||||||
|
const enum detectorType myDetectorType = MYTHEN3;
|
||||||
#else
|
#else
|
||||||
const enum detectorType myDetectorType = GENERIC;
|
const enum detectorType myDetectorType = GENERIC;
|
||||||
#endif
|
#endif
|
||||||
@ -1793,6 +1795,9 @@ int get_time_left(int file_des) {
|
|||||||
case FRAME_PERIOD:
|
case FRAME_PERIOD:
|
||||||
case DELAY_AFTER_TRIGGER:
|
case DELAY_AFTER_TRIGGER:
|
||||||
case CYCLES_NUMBER:
|
case CYCLES_NUMBER:
|
||||||
|
#elif MYTHEN3D
|
||||||
|
case FRAME_NUMBER:
|
||||||
|
case CYCLES_NUMBER:
|
||||||
#endif
|
#endif
|
||||||
retval = getTimeLeft(ind);
|
retval = getTimeLeft(ind);
|
||||||
FILE_LOG(logDEBUG1, ("Timer left index %d: %lld\n", ind, retval));
|
FILE_LOG(logDEBUG1, ("Timer left index %d: %lld\n", ind, retval));
|
||||||
@ -2228,7 +2233,7 @@ int send_update(int file_des) {
|
|||||||
if (n < 0) return printSocketReadError();
|
if (n < 0) return printSocketReadError();
|
||||||
|
|
||||||
// delay
|
// delay
|
||||||
#ifndef EIGERD
|
#if !defined(EIGERD) && !defined(MYTHEN3D)
|
||||||
i64 = setTimer(DELAY_AFTER_TRIGGER,GET_FLAG);
|
i64 = setTimer(DELAY_AFTER_TRIGGER,GET_FLAG);
|
||||||
n = sendData(file_des,&i64,sizeof(i64),INT64);
|
n = sendData(file_des,&i64,sizeof(i64),INT64);
|
||||||
if (n < 0) return printSocketReadError();
|
if (n < 0) return printSocketReadError();
|
||||||
|
@ -75,6 +75,9 @@ void slsDetector::checkDetectorVersionCompatibility() {
|
|||||||
case MOENCH:
|
case MOENCH:
|
||||||
arg = APIMOENCH;
|
arg = APIMOENCH;
|
||||||
break;
|
break;
|
||||||
|
case MYTHEN3:
|
||||||
|
arg = APIMYTHEN3;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw NotImplementedError(
|
throw NotImplementedError(
|
||||||
"Check version compatibility is not implemented for this detector");
|
"Check version compatibility is not implemented for this detector");
|
||||||
@ -385,6 +388,9 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
|
|||||||
case MOENCH:
|
case MOENCH:
|
||||||
shm()->rxFramesPerFile = MOENCH_MAX_FRAMES_PER_FILE;
|
shm()->rxFramesPerFile = MOENCH_MAX_FRAMES_PER_FILE;
|
||||||
break;
|
break;
|
||||||
|
case MYTHEN3:
|
||||||
|
shm()->rxFramesPerFile = MYTHEN3_MAX_FRAMES_PER_FILE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -739,8 +745,8 @@ void slsDetector::updateCachedDetectorVariables() {
|
|||||||
shm()->dynamicRange = i32;
|
shm()->dynamicRange = i32;
|
||||||
|
|
||||||
// settings
|
// settings
|
||||||
if ((shm()->myDetectorType != CHIPTESTBOARD) &&
|
if (shm()->myDetectorType == EIGER ||
|
||||||
(shm()->myDetectorType != MOENCH)) {
|
shm()->myDetectorType == JUNGFRAU || shm()->myDetectorType == GOTTHARD) {
|
||||||
n += client.Receive(&i32, sizeof(i32));
|
n += client.Receive(&i32, sizeof(i32));
|
||||||
shm()->currentSettings = static_cast<detectorSettings>(i32);
|
shm()->currentSettings = static_cast<detectorSettings>(i32);
|
||||||
}
|
}
|
||||||
@ -773,7 +779,7 @@ void slsDetector::updateCachedDetectorVariables() {
|
|||||||
shm()->timerValue[FRAME_PERIOD] = i64;
|
shm()->timerValue[FRAME_PERIOD] = i64;
|
||||||
|
|
||||||
// delay
|
// delay
|
||||||
if (shm()->myDetectorType != EIGER) {
|
if (shm()->myDetectorType != EIGER && shm()->myDetectorType != MYTHEN3 ) {
|
||||||
n += client.Receive(&i64, sizeof(i64));
|
n += client.Receive(&i64, sizeof(i64));
|
||||||
shm()->timerValue[DELAY_AFTER_TRIGGER] = i64;
|
shm()->timerValue[DELAY_AFTER_TRIGGER] = i64;
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,7 @@
|
|||||||
#define EIGER_MAX_FRAMES_PER_FILE 10000
|
#define EIGER_MAX_FRAMES_PER_FILE 10000
|
||||||
#define JFRAU_MAX_FRAMES_PER_FILE 10000
|
#define JFRAU_MAX_FRAMES_PER_FILE 10000
|
||||||
#define CTB_MAX_FRAMES_PER_FILE 20000
|
#define CTB_MAX_FRAMES_PER_FILE 20000
|
||||||
|
#define MYTHEN3_MAX_FRAMES_PER_FILE 10000
|
||||||
|
|
||||||
#define DEFAULT_STREAMING_TIMER_IN_MS 200
|
#define DEFAULT_STREAMING_TIMER_IN_MS 200
|
||||||
|
|
||||||
@ -1138,6 +1139,16 @@ struct detParameters {
|
|||||||
nGappixelsX = 6;
|
nGappixelsX = 6;
|
||||||
nGappixelsY = 1;
|
nGappixelsY = 1;
|
||||||
break;
|
break;
|
||||||
|
case slsDetectorDefs::detectorType::MYTHEN3:
|
||||||
|
nChanX = 128;
|
||||||
|
nChanY = 1;
|
||||||
|
nChipX = 10;
|
||||||
|
nChipY = 1;
|
||||||
|
nDacs = 16;
|
||||||
|
dynamicRange = 16;
|
||||||
|
nGappixelsX = 0;
|
||||||
|
nGappixelsY = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw sls::RuntimeError(
|
throw sls::RuntimeError(
|
||||||
"Unknown detector type! " +
|
"Unknown detector type! " +
|
||||||
|
Loading…
x
Reference in New Issue
Block a user