diff --git a/slsDetectorServers/CMakeLists.txt b/slsDetectorServers/CMakeLists.txt index 7a05de417..309e6c7cc 100644 --- a/slsDetectorServers/CMakeLists.txt +++ b/slsDetectorServers/CMakeLists.txt @@ -2,4 +2,5 @@ add_subdirectory(ctbDetectorServer) add_subdirectory(eigerDetectorServer) add_subdirectory(gotthardDetectorServer) add_subdirectory(jungfrauDetectorServer) -#add_subdirectory(moenchDetectorServer) \ No newline at end of file +#add_subdirectory(moenchDetectorServer) +add_subdirectory(mythen3DetectorServer) \ No newline at end of file diff --git a/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt new file mode 100644 index 000000000..5ae60dbb4 --- /dev/null +++ b/slsDetectorServers/mythen3DetectorServer/CMakeLists.txt @@ -0,0 +1,31 @@ +add_executable(mythen3DetectorServer + slsDetectorFunctionList.c + ../slsDetectorServer/slsDetectorServer.c + ../slsDetectorServer/slsDetectorServer_funcs.c + ../slsDetectorServer/communication_funcs.c +) + +include_directories( + ../slsDetectorServer/ + ../../slsSupportLib/include +) + +target_include_directories(mythen3DetectorServer + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} +) + +target_compile_definitions(mythen3DetectorServer + PUBLIC MYTHEN3D VIRTUAL STOP_SERVER +) + +target_link_libraries(mythen3DetectorServer + PUBLIC pthread rt +) + +set_target_properties(mythen3DetectorServer PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin +) + +install(TARGETS mythen3DetectorServer + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/slsDetectorServers/mythen3DetectorServer/Makefile b/slsDetectorServers/mythen3DetectorServer/Makefile new file mode 100755 index 000000000..c4eae2be0 --- /dev/null +++ b/slsDetectorServers/mythen3DetectorServer/Makefile @@ -0,0 +1,37 @@ +current_dir = $(shell pwd) +main_server = ../slsDetectorServer/ +support_lib = ../../slsSupportLib/include/ + +CROSS = bfin-uclinux- +CC = $(CROSS)gcc +CFLAGS += -Wall -DMYTHEN3D -DSTOP_SERVER -I$(main_server) -I$(support_lib) -I$(current_dir)#-DVERBOSEI #-DVERBOSE +LDLIBS += -lm +PROGS = mythen3DetectorServer +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=APIMYTHEN3 +version_path=slsDetectorServers/mythen3DetectorServer +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/mythen3DetectorServer/RegisterDefs.h b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h new file mode 100644 index 000000000..ab2d110c8 --- /dev/null +++ b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h @@ -0,0 +1,9 @@ +#pragma once + +/* Definitions for FPGA*/ +#define MEM_MAP_SHIFT 1 + + +/* Status register */ +#define STATUS_REG (0x02 << MEM_MAP_SHIFT) + diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c new file mode 100644 index 000000000..b2d1277cd --- /dev/null +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -0,0 +1,325 @@ +#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, ("******** Mythen3 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 APIMYTHEN3; + 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 Mythen3 module \n")); +} + + +/* set parameters - dr, roi */ + +int setDynamicRange(int dr){ + return -1; +} + + +/* parameters - speed, readout */ + +void setSpeed(enum speedVariable ind, int val) { + +} + +int getSpeed(enum speedVariable ind) { + return -1; +} + +int64_t setTimer(enum timerIndex ind, int64_t val) { + + switch(ind){ + + case FRAME_NUMBER: + + case ACQUISITION_TIME: + + case FRAME_PERIOD: + + case CYCLES_NUMBER: + return -1; + + default: + break; + } + + return -1; + +} + +int validateTimer(enum timerIndex ind, int64_t val, int64_t retval) { + + switch(ind) { + case ACQUISITION_TIME: + + case FRAME_PERIOD: + + default: + break; + } + return OK; +} + + +int64_t getTimeLeft(enum timerIndex ind){ +#ifdef VIRTUAL + return 0; +#endif + + return -1; +} + +int startStateMachine(){ +#ifdef VIRTUAL + // create udp socket + if(createUDPSocket(0) != OK) { + return FAIL; + } + FILE_LOG(logINFOBLUE, ("starting state machine\n")); + 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; + for(frameNr=0; frameNr!= numFrames; ++frameNr ) { + int srcOffset = 0; + + struct timespec begin, end; + clock_gettime(CLOCK_REALTIME, &begin); + + usleep(exp_ns / 1000); + + clock_gettime(CLOCK_REALTIME, &end); + int64_t time_ns = ((end.tv_sec - begin.tv_sec) * 1E9 + + (end.tv_nsec - begin.tv_nsec)); + + if (periodns > time_ns) { + usleep((periodns - time_ns)/ 1000); + } + } + + 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/mythen3DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h new file mode 100644 index 000000000..866af52fd --- /dev/null +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h @@ -0,0 +1,11 @@ +#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) \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h index b6de7aff7..c1360b733 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h @@ -150,17 +150,19 @@ 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) +#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) int validateTimer(enum timerIndex ind, int64_t val, int64_t retval); #endif // parameters - module, settings -#if (!defined(CHIPTESTBOARDD)) && (!defined(MOENCHD)) +#if (!defined(CHIPTESTBOARDD)) && (!defined(MOENCHD)) && (!defined(MYTHEN3D)) int setModule(sls_detector_module myMod, char* mess); int getModule(sls_detector_module *myMod); enum detectorSettings setSettings(enum detectorSettings sett); #endif +#ifndef MYTHEN3D enum detectorSettings getSettings(); +#endif // parameters - threshold #ifdef EIGERD @@ -180,9 +182,11 @@ extern int AD9257_GetVrefVoltage(int mV); // AD9257.h extern int AD9257_SetVrefVoltage(int val, int mV); // AD9257.h #endif +#ifndef MYTHEN3D void setDAC(enum DACINDEX ind, int val, int mV); int getDAC(enum DACINDEX ind, int mV); int getMaxDacSteps(); +#endif #if defined(CHIPTESTBOARDD) || defined(MOENCHD) int dacToVoltage(int dac); int checkVLimitCompliant(int mV); @@ -205,16 +209,20 @@ void powerOff(); #endif #ifndef MOENCHD +#ifndef MYTHEN3D int getADC(enum ADCINDEX ind); #endif - +#endif +#ifndef MYTHEN3D int setHighVoltage(int val); - +#endif // parameters - timing, extsig +#ifndef MYTHEN3D void setTiming( enum timingMode arg); enum timingMode getTiming(); +#endif #ifdef GOTTHARDD void setExtSignal(enum externalSignalFlag mode); int getExtSignal(); @@ -245,8 +253,10 @@ 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 int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport); #endif +#endif #if defined(JUNGFRAUD) || defined(EIGERD) int setDetectorPosition(int pos[]); diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index f6aa66775..373eafa83 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -529,6 +529,10 @@ int set_timing_mode(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Setting external communication mode to %d\n", arg)); +#ifdef MYTHEN3D + functionNotImplemented(); +#else + // set if ((arg != GET_TIMING_MODE) && (Server_VerifyLock() == OK)) { switch (arg) { @@ -549,6 +553,8 @@ int set_timing_mode(int file_des) { retval = getTiming(); validate((int)arg, (int)retval, "set timing mode", DEC); FILE_LOG(logDEBUG1, ("Timing Mode: %d\n",retval)); +#endif + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); } @@ -603,7 +609,7 @@ int digital_test(int file_des) { FILE_LOG(logDEBUG1, ("Digital test, mode = %d\n", mode)); #endif -#ifdef EIGERD +#if defined(EIGERD) || defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -643,6 +649,11 @@ int set_dac(int file_des) { if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); + +#ifdef MYTHEN3D + functionNotImplemented(); +#else + enum dacIndex ind = args[0]; int mV = args[1]; int val = args[2]; @@ -989,6 +1000,7 @@ int set_dac(int file_des) { } } } +#endif return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); } @@ -1006,7 +1018,7 @@ int get_adc(int file_des) { if (receiveData(file_des, &ind, sizeof(ind), INT32) < 0) return printSocketReadError(); -#ifdef MOENCHD +#if defined(MOENCHD) || defined(MYTHEN3D) functionNotImplemented(); #else enum ADCINDEX serverAdcIndex = 0; @@ -1185,7 +1197,7 @@ int set_module(int file_des) { memset(mess, 0, sizeof(mess)); enum detectorSettings retval = -1; -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) functionNotImplemented(); #else @@ -1315,7 +1327,7 @@ int get_module(int file_des) { } else module.dacs = myDac; -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) functionNotImplemented(); #endif @@ -1340,7 +1352,7 @@ int get_module(int file_des) { // only get FILE_LOG(logDEBUG1, ("Getting module\n")); -#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) +#if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) && !defined(MYTHEN3D) getModule(&module); #endif FILE_LOG(logDEBUG1, ("Getting module. Settings:%d\n", module.reg)); @@ -1371,7 +1383,7 @@ int set_settings(int file_des) { if (receiveData(file_des, &isett, sizeof(isett), INT32) < 0) return printSocketReadError(); -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) functionNotImplemented(); #else FILE_LOG(logDEBUG1, ("Setting settings %d\n", isett)); @@ -1844,7 +1856,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) +#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(MOENCHD) || defined(MYTHEN3D) functionNotImplemented(); #else // set & get @@ -2293,8 +2305,11 @@ int configure_mac(int file_des) { if (receiveData(file_des, args, sizeof(args), OTHER) < 0) return printSocketReadError(); - FILE_LOG(logDEBUG1, ("\n Configuring MAC\n")); +#if defined(MYTHEN3D) + functionNotImplemented(); +#else + FILE_LOG(logDEBUG1, ("\n Configuring MAC\n")); // dest port uint32_t dstPort = 0; sscanf(args[0], "%x", &dstPort); @@ -2486,7 +2501,7 @@ int configure_mac(int file_des) { } } } - +#endif return Server_SendResult(file_des, OTHER, UPDATE, retvals, sizeof(retvals)); } @@ -2502,7 +2517,7 @@ int enable_ten_giga(int file_des) { return printSocketReadError(); FILE_LOG(logDEBUG1, ("Enable/ Disable 10GbE : %d\n", arg)); -#if defined(JUNGFRAUD) || defined(GOTTHARDD) +#if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(MYTHEN3D) functionNotImplemented(); #else // set & get @@ -3074,7 +3089,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) +#if defined(GOTTHARDD) || defined (CHIPTESTBOARDD) || defined(MOENCHD) || defined(MYTHEN3D) functionNotImplemented(); #else enum NETWORKINDEX serverIndex = 0; @@ -3131,7 +3146,7 @@ int program_fpga(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); -#if defined(EIGERD) || defined(GOTTHARDD) +#if defined(EIGERD) || defined(GOTTHARDD) || defined(MYTHEN3D) //to receive any arguments int n = 1; while (n > 0) diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index d1e8858e4..6a31604fe 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -8,3 +8,5 @@ #define APIGOTTHARD 0x190821 #define APIJUNGFRAU 0x190821 #define APIEIGER 0x190821 + +#define APIMYTHEN3 0x190822