From 386b6601a8cb9c5aac02a4d1362ad136278bad63 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 26 Aug 2019 09:59:27 +0200 Subject: [PATCH] initial version of gotthard2 --- slsDetectorServers/CMakeLists.txt | 3 +- .../gotthard2DetectorServer/CMakeLists.txt | 31 ++ .../gotthard2DetectorServer/Makefile | 37 ++ .../gotthard2DetectorServer/RegisterDefs.h | 33 ++ .../slsDetectorFunctionList.c | 375 ++++++++++++++++++ .../slsDetectorServer_defs.h | 12 + .../slsDetectorFunctionList.h | 18 +- .../slsDetectorServer_funcs.c | 42 +- slsDetectorSoftware/src/slsDetector.cpp | 8 +- slsSupportLib/include/sls_detector_defs.h | 26 +- slsSupportLib/include/versionAPI.h | 2 + 11 files changed, 556 insertions(+), 31 deletions(-) create mode 100644 slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt create mode 100755 slsDetectorServers/gotthard2DetectorServer/Makefile create mode 100644 slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h create mode 100644 slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c create mode 100644 slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h diff --git a/slsDetectorServers/CMakeLists.txt b/slsDetectorServers/CMakeLists.txt index 309e6c7cc..33b0c27da 100644 --- a/slsDetectorServers/CMakeLists.txt +++ b/slsDetectorServers/CMakeLists.txt @@ -3,4 +3,5 @@ add_subdirectory(eigerDetectorServer) add_subdirectory(gotthardDetectorServer) add_subdirectory(jungfrauDetectorServer) #add_subdirectory(moenchDetectorServer) -add_subdirectory(mythen3DetectorServer) \ No newline at end of file +add_subdirectory(mythen3DetectorServer) +add_subdirectory(gotthard2DetectorServer) \ No newline at end of file diff --git a/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt b/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt new file mode 100644 index 000000000..b45e73235 --- /dev/null +++ b/slsDetectorServers/gotthard2DetectorServer/CMakeLists.txt @@ -0,0 +1,31 @@ +add_executable(gotthard2DetectorServer_virtual + slsDetectorFunctionList.c + ../slsDetectorServer/slsDetectorServer.c + ../slsDetectorServer/slsDetectorServer_funcs.c + ../slsDetectorServer/communication_funcs.c +) + +include_directories( + ../slsDetectorServer/ + ../../slsSupportLib/include +) + +target_include_directories(gotthard2DetectorServer_virtual + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} +) + +target_compile_definitions(gotthard2DetectorServer_virtual + PUBLIC GOTTHARD2D VIRTUAL STOP_SERVER +) + +target_link_libraries(gotthard2DetectorServer_virtual + PUBLIC pthread rt +) + +set_target_properties(gotthard2DetectorServer_virtual PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin +) + +install(TARGETS gotthard2DetectorServer_virtual + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/slsDetectorServers/gotthard2DetectorServer/Makefile b/slsDetectorServers/gotthard2DetectorServer/Makefile new file mode 100755 index 000000000..b03d53db8 --- /dev/null +++ b/slsDetectorServers/gotthard2DetectorServer/Makefile @@ -0,0 +1,37 @@ +current_dir = $(shell pwd) +main_server = ../slsDetectorServer/ +support_lib = ../../slsSupportLib/include/ + +CROSS = bfin-uclinux- +CC = $(CROSS)gcc +CFLAGS += -Wall -DGOTTHARD2D -DSTOP_SERVER -I$(main_server) -I$(support_lib) -I$(current_dir)#-DVERBOSEI #-DVERBOSE +LDLIBS += -lm +PROGS = gotthard2DetectorServer +DESTDIR ?= bin +INSTMODE = 0777 + +SRCS = $(main_server)communication_funcs.c $(main_server)slsDetectorServer.c $(main_server)slsDetectorServer_funcs.c slsDetectorFunctionList.c +OBJS = $(SRCS:.c=.o) + +all: clean versioning $(PROGS) + +boot: $(OBJS) + +version_name=APIGOTTHARD2 +version_path=slsDetectorServers/gotthard2DetectorServer +versioning: + cd ../../ && echo $(PWD) && echo `tput setaf 6; ./updateAPIVersion.sh $(version_name) $(version_path); tput sgr0;` + + +$(PROGS): $(OBJS) +# echo $(OBJS) + mkdir -p $(DESTDIR) + $(CC) -o $@ $^ $(CFLAGS) $(LDLIBS) + mv $(PROGS) $(DESTDIR) + rm *.gdb + +clean: + rm -rf $(DESTDIR)/$(PROGS) *.o *.gdb $(main_server)*.o + + + \ No newline at end of file diff --git a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h new file mode 100644 index 000000000..94cdbf86a --- /dev/null +++ b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h @@ -0,0 +1,33 @@ +// stuff from Carlos +#pragma once + +/* Definitions for FPGA*/ +#define MEM_MAP_SHIFT 1 + + +/* Status register */ +#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) diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c new file mode 100644 index 000000000..b292e7f4d --- /dev/null +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -0,0 +1,375 @@ +#include "slsDetectorFunctionList.h" +#include "versionAPI.h" +#include "clogger.h" + +#ifdef VIRTUAL +#include "communication_funcs_UDP.h" +#include +#include +#endif +#include +#include // usleep +#include "blackfin.h" + + +// Global variable from slsDetectorServer_funcs +extern int debugflag; + +int firmware_compatibility = OK; +int firmware_check_done = 0; +char firmware_message[MAX_STR_LENGTH]; + +#ifdef VIRTUAL +pthread_t pthread_virtual_tid; +int virtual_status = 0; +int virtual_stop = 0; +#endif + + + +int isFirmwareCheckDone() { + return firmware_check_done; +} + +int getFirmwareCheckResult(char** mess) { + *mess = firmware_message; + return firmware_compatibility; +} + +void basictests() { + firmware_compatibility = OK; + firmware_check_done = 0; + memset(firmware_message, 0, MAX_STR_LENGTH); +#ifdef VIRTUAL + FILE_LOG(logINFOBLUE, ("******** Gotthard2 Virtual Server *****************\n")); + if (mapCSP0() == FAIL) { + strcpy(firmware_message, + "Could not map to memory. Dangerous to continue.\n"); + FILE_LOG(logERROR, (firmware_message)); + firmware_compatibility = FAIL; + firmware_check_done = 1; + return; + } + firmware_check_done = 1; + return; +#else + + +#endif +} + +/* Ids */ + +int64_t getDetectorId(enum idMode arg){ + int64_t retval = -1; + + switch(arg){ + case DETECTOR_SERIAL_NUMBER: + return getDetectorNumber();// or getDetectorMAC() + case DETECTOR_FIRMWARE_VERSION: + return getFirmwareVersion(); + case SOFTWARE_FIRMWARE_API_VERSION: + return getFirmwareAPIVersion(); + case DETECTOR_SOFTWARE_VERSION: + case CLIENT_SOFTWARE_API_VERSION: + return APIGOTTHARD2; + default: + return retval; + } +} + +u_int64_t getFirmwareVersion() { +#ifdef VIRTUAL + return 0; +#endif + return 0; +} + +u_int64_t getFirmwareAPIVersion() { +#ifdef VIRTUAL + return 0; +#endif + return 0; +} + +u_int32_t getDetectorNumber(){ +#ifdef VIRTUAL + return 0; +#endif + return 0; +} + + +u_int64_t getDetectorMAC() { +#ifdef VIRTUAL + return 0; +#else + char output[255],mac[255]=""; + u_int64_t res=0; + FILE* sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); + fgets(output, sizeof(output), sysFile); + pclose(sysFile); + //getting rid of ":" + char * pch; + pch = strtok (output,":"); + while (pch != NULL){ + strcat(mac,pch); + pch = strtok (NULL, ":"); + } + sscanf(mac,"%llx",&res); + return res; +#endif +} + +u_int32_t getDetectorIP(){ +#ifdef VIRTUAL + return 0; +#endif + char temp[50]=""; + u_int32_t res=0; + //execute and get address + char output[255]; + FILE* sysFile = popen("ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2", "r"); + fgets(output, sizeof(output), sysFile); + pclose(sysFile); + + //converting IPaddress to hex. + char* pcword = strtok (output,"."); + while (pcword != NULL) { + sprintf(output,"%02x",atoi(pcword)); + strcat(temp,output); + pcword = strtok (NULL, "."); + } + strcpy(output,temp); + sscanf(output, "%x", &res); + //FILE_LOG(logINFO, ("ip:%x\n",res); + + return res; +} + + +/* initialization */ + +void initControlServer(){ + setupDetector(); +} + +void initStopServer() { + + usleep(CTRL_SRVR_INIT_TIME_US); + if (mapCSP0() == FAIL) { + FILE_LOG(logERROR, ("Stop Server: Map Fail. Dangerous to continue. Goodbye!\n")); + exit(EXIT_FAILURE); + } +} + + +/* set up detector */ + +void setupDetector() { + FILE_LOG(logINFO, ("This Server is for 1 Gotthard2 module \n")); +} + + +/* set parameters - dr, roi */ + +int setDynamicRange(int dr){ + return -1; +} + + +/* parameters */ + + +int64_t setTimer(enum timerIndex ind, int64_t val) { + + int64_t retval = -1; + switch(ind){ + + 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: + 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: + 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: + 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: + FILE_LOG(logERROR, ("Timer Index not implemented for this detector: %d\n", ind)); + break; + } + + return retval; + +} + +int validateTimer(enum timerIndex ind, int64_t val, int64_t retval) { + if (val < 0) + return OK; + switch(ind) { + case ACQUISITION_TIME: + 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: + break; + } + return OK; +} + + +int64_t getTimeLeft(enum timerIndex ind){ +#ifdef VIRTUAL + return 0; +#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; +} + +int startStateMachine(){ +#ifdef VIRTUAL + // create udp socket + if(createUDPSocket(0) != OK) { + return FAIL; + } + FILE_LOG(logINFOBLUE, ("starting state machine\n")); + // set status to running + virtual_status = 1; + virtual_stop = 0; + if(pthread_create(&pthread_virtual_tid, NULL, &start_timer, NULL)) { + FILE_LOG(logERROR, ("Could not start Virtual acquisition thread\n")); + virtual_status = 0; + return FAIL; + } + FILE_LOG(logINFOGREEN, ("Virtual Acquisition started\n")); + return OK; +#endif + return OK; +} + + +#ifdef VIRTUAL +void* start_timer(void* arg) { + int64_t periodns = setTimer(FRAME_PERIOD, -1); + int numFrames = (setTimer(FRAME_NUMBER, -1) * + setTimer(CYCLES_NUMBER, -1) ); + int64_t exp_ns = setTimer(ACQUISITION_TIME, -1); + + + int frameNr = 0; + // loop over number of frames + for(frameNr=0; frameNr!= numFrames; ++frameNr ) { + + //check if virtual_stop is high, then break + + // sleep for exposure time + struct timespec begin, end; + clock_gettime(CLOCK_REALTIME, &begin); + usleep(exp_ns / 1000); + clock_gettime(CLOCK_REALTIME, &end); + + // calculate time left in period + int64_t time_ns = ((end.tv_sec - begin.tv_sec) * 1E9 + + (end.tv_nsec - begin.tv_nsec)); + + // sleep for (period - exptime) + if (periodns > time_ns) { + usleep((periodns - time_ns)/ 1000); + } + + // set register frames left + } + + // set status to idle + virtual_status = 0; + return NULL; +} +#endif + + +int stopStateMachine(){ + FILE_LOG(logINFORED, ("Stopping State Machine\n")); +#ifdef VIRTUAL + virtual_stop = 0; + return OK; +#endif + return OK; +} + +enum runStatus getRunStatus(){ +#ifdef VIRTUAL + if(virtual_status == 0){ + FILE_LOG(logINFOBLUE, ("Status: IDLE\n")); + return IDLE; + }else{ + FILE_LOG(logINFOBLUE, ("Status: RUNNING\n")); + return RUNNING; + } +#endif + return IDLE; +} + +void readFrame(int *ret, char *mess){ +#ifdef VIRTUAL + FILE_LOG(logINFOGREEN, ("acquisition successfully finished\n")); + return; +#endif +} + +/* common */ + +int calculateDataBytes(){ + return 0; +} + +int getTotalNumberOfChannels(){return ((int)getNumberOfChannelsPerChip() * (int)getNumberOfChips());} +int getNumberOfChips(){return NCHIP;} +int getNumberOfDACs(){return NDAC;} +int getNumberOfChannelsPerChip(){return NCHAN;} \ No newline at end of file diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h new file mode 100644 index 000000000..1746553a2 --- /dev/null +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h @@ -0,0 +1,12 @@ +#pragma once +#include "sls_detector_defs.h" +#include "RegisterDefs.h" + + +#define CTRL_SRVR_INIT_TIME_US (300 * 1000) + +/* Hardware Definitions */ +#define NCHAN (128) +#define NCHIP (10) +#define NDAC (16) +#define TEMP_CLK (20) /* MHz */ \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h index c1360b733..d92aa99f9 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h @@ -132,9 +132,11 @@ int setExternalSampling(int val); void setSpeed(enum speedVariable ind, int val, int mode); int getSpeed(enum speedVariable ind, int mode); #else +#ifndef GOTTHARD2D void setSpeed(enum speedVariable ind, int val); int getSpeed(enum speedVariable ind); #endif +#endif #if defined(EIGERD) || defined(CHIPTESTBOARDD) enum readOutFlags setReadOutFlags(enum readOutFlags val); @@ -150,17 +152,17 @@ int getStartingFrameNumber(uint64_t* value); #endif int64_t setTimer(enum timerIndex ind, int64_t val); int64_t getTimeLeft(enum timerIndex ind); -#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) int validateTimer(enum timerIndex ind, int64_t val, int64_t retval); #endif // parameters - module, settings -#if (!defined(CHIPTESTBOARDD)) && (!defined(MOENCHD)) && (!defined(MYTHEN3D)) +#if (!defined(CHIPTESTBOARDD)) && (!defined(MOENCHD)) && (!defined(MYTHEN3D)) && (!defined(GOTTHARD2D)) int setModule(sls_detector_module myMod, char* mess); int getModule(sls_detector_module *myMod); enum detectorSettings setSettings(enum detectorSettings sett); #endif -#ifndef MYTHEN3D +#if !defined(MYTHEN3D) && !defined(GOTTHARD2D) enum detectorSettings getSettings(); #endif @@ -182,7 +184,7 @@ extern int AD9257_GetVrefVoltage(int mV); // AD9257.h extern int AD9257_SetVrefVoltage(int val, int mV); // AD9257.h #endif -#ifndef MYTHEN3D +#if (!defined(MYTHEN3D)) && (!defined(GOTTHARD2D)) void setDAC(enum DACINDEX ind, int val, int mV); int getDAC(enum DACINDEX ind, int mV); int getMaxDacSteps(); @@ -209,17 +211,17 @@ void powerOff(); #endif #ifndef MOENCHD -#ifndef MYTHEN3D +#if !defined(MYTHEN3D) && !defined(GOTTHARD2D) int getADC(enum ADCINDEX ind); #endif #endif -#ifndef MYTHEN3D +#if !defined(MYTHEN3D) && !defined(GOTTHARD2D) int setHighVoltage(int val); #endif // parameters - timing, extsig -#ifndef MYTHEN3D +#if !defined(MYTHEN3D) && !defined(GOTTHARD2D) void setTiming( enum timingMode arg); enum timingMode getTiming(); #endif @@ -253,7 +255,7 @@ int configureMAC(int numInterfaces, int selInterface, uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t destip2, uint64_t destmac2, uint64_t sourcemac2, uint32_t sourceip2, uint32_t udpport2); #else -#ifndef MYTHEN3D +#if !defined(MYTHEN3D) && !defined(GOTTHARD2D) int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport); #endif #endif diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index 22c34dcdb..4c70ff225 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -20,6 +20,8 @@ const enum detectorType myDetectorType = CHIPTESTBOARD; const enum detectorType myDetectorType = MOENCH; #elif MYTHEN3D const enum detectorType myDetectorType = MYTHEN3; +#elif GOTTHARD2D +const enum detectorType myDetectorType = GOTTHARD2; #else const enum detectorType myDetectorType = GENERIC; #endif @@ -531,7 +533,7 @@ int set_timing_mode(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting external communication mode to %d\n", arg)); -#ifdef MYTHEN3D +#if defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else @@ -611,7 +613,7 @@ int digital_test(int file_des) { FILE_LOG(logDEBUG1, ("Digital test, mode = %d\n", mode)); #endif -#if defined(EIGERD) || defined(MYTHEN3D) +#if defined(EIGERD) || defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else // only set @@ -652,7 +654,7 @@ int set_dac(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); -#ifdef MYTHEN3D +#if defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else @@ -1020,7 +1022,7 @@ int get_adc(int file_des) { if (receiveData(file_des, &ind, sizeof(ind), INT32) < 0) return printSocketReadError(); -#if defined(MOENCHD) || defined(MYTHEN3D) +#if defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else enum ADCINDEX serverAdcIndex = 0; @@ -1199,7 +1201,7 @@ int set_module(int file_des) { memset(mess, 0, sizeof(mess)); enum detectorSettings retval = -1; -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else @@ -1329,7 +1331,7 @@ int get_module(int file_des) { } else module.dacs = myDac; -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #endif @@ -1354,7 +1356,7 @@ int get_module(int file_des) { // only get FILE_LOG(logDEBUG1, ("Getting module\n")); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) getModule(&module); #endif FILE_LOG(logDEBUG1, ("Getting module. Settings:%d\n", module.reg)); @@ -1385,7 +1387,7 @@ int set_settings(int file_des) { if (receiveData(file_des, &isett, sizeof(isett), INT32) < 0) return printSocketReadError(); -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else FILE_LOG(logDEBUG1, ("Setting settings %d\n", isett)); @@ -1798,6 +1800,9 @@ int get_time_left(int file_des) { #elif MYTHEN3D case FRAME_NUMBER: case CYCLES_NUMBER: +#elif GOTTHARD2D + case FRAME_NUMBER: + case CYCLES_NUMBER: #endif retval = getTimeLeft(ind); FILE_LOG(logDEBUG1, ("Timer left index %d: %lld\n", ind, retval)); @@ -1861,7 +1866,7 @@ int set_readout_flags(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting readout flags to %d\n", arg)); -#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else // set & get @@ -1968,6 +1973,10 @@ int set_speed(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); +#ifdef GOTTHARD2D + functionNotImplemented(); +#else + enum speedVariable ind = args[0]; int val = args[1]; int mode = args[2]; @@ -2067,6 +2076,7 @@ int set_speed(int file_des) { #endif #endif } +#endif return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); } @@ -2233,7 +2243,7 @@ int send_update(int file_des) { if (n < 0) return printSocketReadError(); // delay -#if !defined(EIGERD) && !defined(MYTHEN3D) +#if !defined(EIGERD) && !defined(MYTHEN3D) && !defined(GOTTHARD2D) i64 = setTimer(DELAY_AFTER_TRIGGER,GET_FLAG); n = sendData(file_des,&i64,sizeof(i64),INT64); if (n < 0) return printSocketReadError(); @@ -2311,7 +2321,7 @@ int configure_mac(int file_des) { if (receiveData(file_des, args, sizeof(args), OTHER) < 0) return printSocketReadError(); -#if defined(MYTHEN3D) +#if defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else FILE_LOG(logDEBUG1, ("\n Configuring MAC\n")); @@ -2522,7 +2532,7 @@ int enable_ten_giga(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Enable/ Disable 10GbE : %d\n", arg)); -#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(MYTHEN3D) +#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else // set & get @@ -2879,7 +2889,7 @@ int write_adc_register(int file_des) { uint32_t val = args[1]; FILE_LOG(logDEBUG1, ("Writing 0x%x to ADC Register 0x%x\n", val, addr)); -#ifdef EIGERD +#if defined(EIGERD) || defined(GOTTHARD2D) functionNotImplemented(); #else #ifndef VIRTUAL @@ -3094,7 +3104,7 @@ int set_network_parameter(int file_des) { int value = args[1]; FILE_LOG(logDEBUG1, ("Set network parameter index %d to %d\n", mode, value)); -#if defined(GOTTHARDD) || defined (CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) +#if defined(GOTTHARDD) || defined (CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else enum NETWORKINDEX serverIndex = 0; @@ -3151,7 +3161,7 @@ int program_fpga(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#if defined(EIGERD) || defined(GOTTHARDD) || defined(MYTHEN3D) +#if defined(EIGERD) || defined(GOTTHARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) //to receive any arguments int n = 1; while (n > 0) @@ -3254,7 +3264,7 @@ int reset_fpga(int file_des) { memset(mess, 0, sizeof(mess)); FILE_LOG(logDEBUG1, ("Reset FPGA\n")); -#if defined(EIGERD) || defined(GOTTHARDD) +#if defined(EIGERD) || defined(GOTTHARDD) || defined(GOTTHARD2D) functionNotImplemented(); #else // only set diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index 534823093..d21636c59 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -78,6 +78,9 @@ void slsDetector::checkDetectorVersionCompatibility() { case MYTHEN3: arg = APIMYTHEN3; break; + case GOTTHARD2: + arg = APIGOTTHARD2; + break; default: throw NotImplementedError( "Check version compatibility is not implemented for this detector"); @@ -391,6 +394,9 @@ void slsDetector::initializeDetectorStructure(detectorType type) { case MYTHEN3: shm()->rxFramesPerFile = MYTHEN3_MAX_FRAMES_PER_FILE; break; + case GOTTHARD2: + shm()->rxFramesPerFile = GOTTHARD2_MAX_FRAMES_PER_FILE; + break; default: break; } @@ -779,7 +785,7 @@ void slsDetector::updateCachedDetectorVariables() { shm()->timerValue[FRAME_PERIOD] = i64; // delay - if (shm()->myDetectorType != EIGER && shm()->myDetectorType != MYTHEN3 ) { + if (shm()->myDetectorType != EIGER && shm()->myDetectorType != MYTHEN3 && shm()->myDetectorType != GOTTHARD2) { n += client.Receive(&i64, sizeof(i64)); shm()->timerValue[DELAY_AFTER_TRIGGER] = i64; } diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h index e4230bc4b..4edc817f5 100755 --- a/slsSupportLib/include/sls_detector_defs.h +++ b/slsSupportLib/include/sls_detector_defs.h @@ -64,6 +64,7 @@ #define JFRAU_MAX_FRAMES_PER_FILE 10000 #define CTB_MAX_FRAMES_PER_FILE 20000 #define MYTHEN3_MAX_FRAMES_PER_FILE 10000 +#define GOTTHARD2_MAX_FRAMES_PER_FILE 20000 #define DEFAULT_STREAMING_TIMER_IN_MS 200 @@ -88,7 +89,8 @@ class slsDetectorDefs { JUNGFRAU, /**< jungfrau */ CHIPTESTBOARD, /**< CTB */ MOENCH, /**< moench */ - MYTHEN3 /** mythen3 */ + MYTHEN3, /**< mythen3 */ + GOTTHARD2, /** < gotthard2 */ }; /** @@ -578,8 +580,8 @@ format }; /** returns detector type string from detector type index - \param t string can be EIGER, GOTTHARD, JUNGFRAU, CHIPTESTBOARD, MYTHEN3 - \returns Eiger, Gotthard, Jungfrau, JungfrauCTB, Mythen3, Unknown + \param t string can be EIGER, GOTTHARD, JUNGFRAU, CHIPTESTBOARD, MYTHEN3, GOTTHARD2 + \returns Eiger, Gotthard, Jungfrau, JungfrauCTB, Mythen3, Gotthard2, Unknown */ static std::string detectorTypeToString(detectorType t) { switch (t) { @@ -595,14 +597,16 @@ format return std::string("Moench"); case MYTHEN3: return std::string("Mythen3"); + case GOTTHARD2: + return std::string("Gotthard2"); default: return std::string("Unknown"); } }; /** returns detector type index from detector type string - \param type can be Eiger, Gotthard, Jungfrau, JungfrauCTB, Mythen3 - \returns EIGER, GOTTHARD, JUNGFRAU, CHIPTESTBOARD, MYTHEN3, GENERIC + \param type can be Eiger, Gotthard, Jungfrau, JungfrauCTB, Mythen3, Gotthard2 + \returns EIGER, GOTTHARD, JUNGFRAU, CHIPTESTBOARD, MYTHEN3, GOTTHARD2, GENERIC */ static detectorType detectorTypeToEnum(const std::string &type) { if (type == "Eiger") @@ -617,6 +621,8 @@ format return MOENCH; if (type == "Mythen3") return MYTHEN3; + if (type == "Gotthard2") + return GOTTHARD2; return GENERIC; }; @@ -1149,6 +1155,16 @@ struct detParameters { nGappixelsX = 0; nGappixelsY = 0; break; + case slsDetectorDefs::detectorType::GOTTHARD2: + nChanX = 128; + nChanY = 1; + nChipX = 10; + nChipY = 1; + nDacs = 16; + dynamicRange = 16; + nGappixelsX = 0; + nGappixelsY = 0; + break; default: throw sls::RuntimeError( "Unknown detector type! " + diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index b95903c0a..bd0e17cdd 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -9,3 +9,5 @@ #define APIJUNGFRAU 0x190821 #define APIEIGER 0x190821 #define APIMYTHEN3 0x190822 +#define APIGOTTHARD2 0x190826 +