From b43be57b6ea43e3b2ffcd80e9b558790ebd3cf56 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 2 Nov 2018 13:50:00 +0100 Subject: [PATCH] jungfrau server works --- manual/manual-api/CMakeLists.txt | 5 +- slsDetectorServers/eigerDetectorServer/Beb.c | 9 +- .../eigerDetectorServer/FebControl.c | 7 +- .../eigerDetectorServer/FebControl.h | 2 - .../eigerDetectorServer/FebInterface.c | 2 - .../eigerDetectorServer/FebRegisterDefs.h | 6 - .../eigerDetectorServer/LocalLinkInterface.c | 2 - .../eigerDetectorServer/Makefile | 2 +- .../bin/eigerDetectorServer_virtualMaster | Bin 81144 -> 81104 bytes .../bin/eigerDetectorServer_virtualSlave | Bin 81144 -> 81104 bytes .../slsDetectorFunctionList.c | 81 ++- .../slsDetectorServer_defs.h | 1 - .../jungfrauDetectorServer/gitInfo.txt | 8 +- .../jungfrauDetectorServer/gitInfoJungfrau.h | 6 +- .../jungfrauDetectorServer/logger.h | 1 + .../slsDetectorFunctionList.c | 601 +++++++++--------- .../slsDetectorServer_defs.h | 4 +- slsDetectorServers/slsDetectorServer/AD9257.h | 29 +- .../slsDetectorServer/blackfin.h | 32 +- .../slsDetectorServer/commonServerFunctions.h | 14 +- .../slsDetectorServer/communication_funcs.c | 20 +- .../slsDetectorServer/communication_funcs.h | 12 - slsDetectorServers/slsDetectorServer/logger.h | 3 +- .../slsDetectorServer/programfpga.h | 71 +-- .../slsDetectorFunctionList.h | 2 - .../slsDetectorServer/slsDetectorServer.c | 5 +- .../slsDetectorServer_funcs.c | 152 ++--- .../slsDetectorServer_funcs.h | 1 - .../slsDetector/slsDetector.cpp | 20 +- slsReceiverSoftware/CMakeLists.txt | 6 +- .../src/slsReceiverImplementation.cpp | 96 +-- slsSupportLib/include/genericSocket.h | 6 +- slsSupportLib/include/versionAPI.h | 4 +- 33 files changed, 561 insertions(+), 649 deletions(-) create mode 120000 slsDetectorServers/jungfrauDetectorServer/logger.h diff --git a/manual/manual-api/CMakeLists.txt b/manual/manual-api/CMakeLists.txt index c58af3b0d..23945d636 100644 --- a/manual/manual-api/CMakeLists.txt +++ b/manual/manual-api/CMakeLists.txt @@ -18,13 +18,10 @@ target_link_libraries(slsMultiReceiver pthread zmq rt - ${HDF5_LIBRARIES} ) if (HDF5_FOUND) - target_link_libraries(slsMultiReceiver - ${HDF5_LIBRARIES} - ) + target_link_libraries(slsMultiReceiver ${HDF5_LIBRARIES}) endif () diff --git a/slsDetectorServers/eigerDetectorServer/Beb.c b/slsDetectorServers/eigerDetectorServer/Beb.c index c81fcafcb..6ed288e9a 100644 --- a/slsDetectorServers/eigerDetectorServer/Beb.c +++ b/slsDetectorServers/eigerDetectorServer/Beb.c @@ -1,13 +1,8 @@ -#include "xfs_types.h" -#include "xparameters.h" -#include "FebRegisterDefs.h" #include "logger.h" #include "Beb.h" +#include "FebRegisterDefs.h" +#include "xparameters.h" - -#include -#include -#include #include #include #include diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 538825f90..25d2f6a81 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -1,18 +1,15 @@ -#include "FebRegisterDefs.h" #include "FebControl.h" -#include "Beb.h" +#include "FebRegisterDefs.h" #include "slsDetectorServer_defs.h" #include "logger.h" +#include "Beb.h" -#include -#include #include #include #include #include #include // POSIX terminal control definitions(CS8, CREAD, CLOCAL..) #include -#include #include diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index ba3cc4a55..2e65666fd 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -1,8 +1,6 @@ #pragma once #include "FebInterface.h" - #include -#include struct Module{ diff --git a/slsDetectorServers/eigerDetectorServer/FebInterface.c b/slsDetectorServers/eigerDetectorServer/FebInterface.c index 9ed524a57..9c7d33051 100644 --- a/slsDetectorServers/eigerDetectorServer/FebInterface.c +++ b/slsDetectorServers/eigerDetectorServer/FebInterface.c @@ -3,8 +3,6 @@ #include "xparameters.h" #include "logger.h" -#include -#include #include diff --git a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h index 1885dd08b..a9b2f2459 100644 --- a/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorServers/eigerDetectorServer/FebRegisterDefs.h @@ -1,10 +1,4 @@ -/** - * @author Ian Johnson - * @version 1.0 - */ - - //daq register definitions #define DAQ_REG_CTRL 1 #define DAQ_REG_CHIP_CMDS 2 diff --git a/slsDetectorServers/eigerDetectorServer/LocalLinkInterface.c b/slsDetectorServers/eigerDetectorServer/LocalLinkInterface.c index d180a729c..3e47cd61a 100644 --- a/slsDetectorServers/eigerDetectorServer/LocalLinkInterface.c +++ b/slsDetectorServers/eigerDetectorServer/LocalLinkInterface.c @@ -1,9 +1,7 @@ #include "LocalLinkInterface.h" #include "HardwareMMappingDefs.h" #include "logger.h" -#include "ansi.h" -#include #include #include #include diff --git a/slsDetectorServers/eigerDetectorServer/Makefile b/slsDetectorServers/eigerDetectorServer/Makefile index 6bc0fbebc..b76a695d8 100755 --- a/slsDetectorServers/eigerDetectorServer/Makefile +++ b/slsDetectorServers/eigerDetectorServer/Makefile @@ -8,7 +8,7 @@ DESTDIR ?= bin INSTMODE = 0777 -SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c FebControl.c Beb.c HardwareIO.c LocalLinkInterface.c FebInterface.c +SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c HardwareIO.c LocalLinkInterface.c FebInterface.c FebControl.c Beb.c OBJS = $(SRC_CLNT:.c=.o) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster index 54e5a843f4791de1135b3ce2cc2683bb46a5bae0..358c4c0bf5cef5d817b84077739ca8bcdf671ccf 100755 GIT binary patch literal 81104 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 literal 81144 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

    bkF7mH1&ctrGnD*fkaLO#v*`>Mg7 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 Y)ILq#wWj`_d8Q6O0RKxl4{!Yc0}d@oEdT%j diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave index 4b777d026a625b94ba7816b35074119d452d5537..5aa6e27cc692bdd22e5cf4f2d7f94a84cf8a451b 100755 GIT binary patch literal 81104 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 ZA8MZ_?^;uT&pcCy?}z`ToQF65{{hLdOGE$w diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 8511a024d..538cb0ac9 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -1,14 +1,13 @@ #include "slsDetectorFunctionList.h" #include "gitInfoEiger.h" +#include "versionAPI.h" +#include "logger.h" + #ifndef VIRTUAL #include "FebControl.h" #include "Beb.h" -#include "versionAPI.h" #endif -#include "logger.h" - -#include #include //to gethostname #include #ifdef VIRTUAL @@ -20,6 +19,11 @@ extern int debugflag; extern int isControlServer; +int firmware_compatibility = OK; +int firmware_check_done = 0; +char firmware_message[MAX_STR_LENGTH]; + + const char* dac_names[16] = {"SvP","Vtr","Vrf","Vrs","SvN","Vtgstv","Vcmp_ll","Vcmp_lr","cal","Vcmp_rl","rxb_rb","rxb_lb","Vcmp_rr","Vcp","Vcn","Vis"}; int default_tau_from_file= -1; enum detectorSettings thisSettings; @@ -42,12 +46,6 @@ int normal = 0; uint32_t detid = 0; #endif - -int firmware_compatibility = OK; -int firmware_check_done = 0; -char firmware_message[MAX_STR_LENGTH]; - - int eiger_highvoltage = 0; int eiger_theo_highvoltage = 0; int eiger_iodelay = 0; @@ -60,8 +58,6 @@ int eiger_readoutspeed = 0; int eiger_triggermode = 0; int eiger_extgating = 0; int eiger_extgatingpolarity = 0; - - int eiger_nexposures = 1; int eiger_ncycles = 1; @@ -381,25 +377,25 @@ void allocateDetectorStructureMemory() { FILE_LOG(logINFO, ("This Server is for 1 Eiger half module (250k)\n\n")); //Allocation of memory - detectorModules=malloc(sizeof(sls_detector_module)); - detectorChans=malloc(NCHIP*NCHAN*sizeof(int)); - detectorDacs=malloc(NDAC*sizeof(int)); - detectorAdcs=malloc(NADC*sizeof(int)); + detectorModules = malloc(sizeof(sls_detector_module)); + detectorChans = malloc(NCHIP*NCHAN*sizeof(int)); + detectorDacs = malloc(NDAC*sizeof(int)); + detectorAdcs = malloc(NADC*sizeof(int)); FILE_LOG(logDEBUG1, ("modules from 0x%x to 0x%x\n",detectorModules, detectorModules)); FILE_LOG(logDEBUG1, ("chans from 0x%x to 0x%x\n",detectorChans, detectorChans)); FILE_LOG(logDEBUG1, ("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs)); FILE_LOG(logDEBUG1, ("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs)); - (detectorModules)->dacs=detectorDacs; - (detectorModules)->adcs=detectorAdcs; - (detectorModules)->chanregs=detectorChans; - (detectorModules)->ndac=NDAC; - (detectorModules)->nadc=NADC; - (detectorModules)->nchip=NCHIP; - (detectorModules)->nchan=NCHIP*NCHAN; - (detectorModules)->reg=0; - (detectorModules)->iodelay=0; - (detectorModules)->tau=0; - (detectorModules)->eV=0; + (detectorModules)->dacs = detectorDacs; + (detectorModules)->adcs = detectorAdcs; + (detectorModules)->chanregs = detectorChans; + (detectorModules)->ndac = NDAC; + (detectorModules)->nadc = NADC; + (detectorModules)->nchip = NCHIP; + (detectorModules)->nchan = NCHIP * NCHAN; + (detectorModules)->reg = 0; + (detectorModules)->iodelay = 0; + (detectorModules)->tau = 0; + (detectorModules)->eV = 0; thisSettings = UNINITIALIZED; // if trimval requested, should return -1 to acknowledge unknown @@ -1196,6 +1192,7 @@ enum externalCommunicationMode getTiming() { int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2) { #ifndef VIRTUAL + FILE_LOG(logINFO, ("Configuring MAC\n")); char src_mac[50], src_ip[50],dst_mac[50], dst_ip[50]; int src_port = 0xE185; sprintf(src_ip,"%d.%d.%d.%d",(sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff); @@ -1215,12 +1212,14 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t - FILE_LOG(logINFO, ("src_port:%d\n" - "\tsrc_ip:%s\n" - "\tdst_ip:%s\n" - "\tsrc_mac:%s\n" - "\tdst_mac:%s\n", - src_port, src_ip, dst_ip, src_mac, dst_mac)); + FILE_LOG(logINFO, ( + "\tSource IP : %s\n" + "\tSource MAC : %s\n" + "\tSource Port : %d\n" + "\tDest IP : %s\n" + "\tDest MAC : %s\n", + src_ip, src_mac, src_port, + dst_ip, dst_mac)); int beb_num = detid; @@ -1229,13 +1228,13 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t if (!top) dst_port = udpport2; - FILE_LOG(logINFO, ("\tdst_port:%d\n", dst_port)); + FILE_LOG(logINFO, ("\tDest Port : %d\n", dst_port)); int i=0; /* for(i=0;i<32;i++) { modified for Aldo*/ if (Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) { - FILE_LOG(logINFO, ("set up left ok\n")); + FILE_LOG(logDEBUG1, ("\tset up left ok\n")); } else { return -1; } @@ -1245,12 +1244,12 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t dst_port = udpport2; if (!top) dst_port = udpport; - FILE_LOG(logINFO, ("dst_port:%d\n",dst_port)); + FILE_LOG(logINFO, ("\tDest Port : %d\n",dst_port)); /*for(i=0;i<32;i++) {*//** modified for Aldo*/ if (Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) { - FILE_LOG(logINFO, ("set up right ok\n")); + FILE_LOG(logDEBUG1, (" set up right ok\n")); } else { return -1; } @@ -1654,7 +1653,7 @@ void* start_timer(void* arg) { int stopStateMachine() { - FILE_LOG(logERROR, ("Going to stop acquisition\n")); + FILE_LOG(logINFORED, ("Going to stop acquisition\n")); #ifdef VIRTUAL eiger_virtual_stop = 0; return OK; @@ -1722,13 +1721,13 @@ enum runStatus getRunStatus() { int i = Feb_Control_AcquisitionInProgress(); switch (i) { case STATUS_ERROR: - FILE_LOG(logINFO, ("Status: ERROR reading status register\n")); + FILE_LOG(logERROR, ("Status: ERROR reading status register\n")); return ERROR; case STATUS_IDLE: - FILE_LOG(logINFO, ("Status: IDLE\n")); + FILE_LOG(logINFOBLUE, ("Status: IDLE\n")); return IDLE; default: - FILE_LOG(logINFO, ("Status: RUNNING...\n")); + FILE_LOG(logINFOBLUE, ("Status: RUNNING...\n")); return RUNNING; } diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h index 8788688c5..6200e38c2 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h @@ -9,7 +9,6 @@ #define SLSDETECTORSERVER_DEFS_H_ #include "sls_detector_defs.h" -#include #define GOODBYE (-200) #define REQUIRED_FIRMWARE_VERSION (22) diff --git a/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt b/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt index 3de37899c..116c0f37e 100644 --- a/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt +++ b/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorPackage/slsDetectorServers/jungfrauDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: ee20932392a576a700f48140be02acb94b7eb6de -Revision: 1 +Repsitory UUID: 92123069ce045314a12416a7e8b308875d7f9f21 +Revision: 7 Branch: refactor Last Changed Author: Dhanya_Thattil -Last Changed Rev: 4103 -Last Changed Date: 2018-10-11 13:46:09.000000002 +0200 ./RegisterDefs.h +Last Changed Rev: 4158 +Last Changed Date: 2018-11-02 12:00:46.000000002 +0100 ./Makefile diff --git a/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h b/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h index 99a0a7b3d..90af7896d 100644 --- a/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h +++ b/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "ee20932392a576a700f48140be02acb94b7eb6de" +#define GITREPUUID "92123069ce045314a12416a7e8b308875d7f9f21" #define GITAUTH "Dhanya_Thattil" -#define GITREV 0x4103 -#define GITDATE 0x20181011 +#define GITREV 0x4158 +#define GITDATE 0x20181102 #define GITBRANCH "refactor" diff --git a/slsDetectorServers/jungfrauDetectorServer/logger.h b/slsDetectorServers/jungfrauDetectorServer/logger.h new file mode 120000 index 000000000..ff1930ce3 --- /dev/null +++ b/slsDetectorServers/jungfrauDetectorServer/logger.h @@ -0,0 +1 @@ +../slsDetectorServer/logger.h \ No newline at end of file diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index 76cefd079..18108db22 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -1,26 +1,26 @@ #include "slsDetectorFunctionList.h" #include "gitInfoJungfrau.h" -#ifndef VIRTUAL -#include "AD9257.h" // include "commonServerFunctions.h", which in turn includes "blackfin.h" -#include "programfpga.h" #include "versionAPI.h" +#include "logger.h" -#ifdef VIRTUAL +#ifndef VIRTUAL +#include "AD9257.h" // commonServerFunctions.h, blackfin.h, ansi.h +#include "programfpga.h" +#else #include #include #endif -/* global variables */ -//jungfrau doesnt require chips and chans (save memory) -sls_detector_module *detectorModules=NULL; -int *detectorDacs=NULL; -int *detectorAdcs=NULL; -enum detectorSettings thisSettings; -enum masterFlags masterMode = NO_MASTER; +// Global variable from slsDetectorServer +extern int debugflag; -int highvoltage = 0; -int dacValues[NDAC]; -int32_t clkPhase[2] = {0, 0}; +int firmware_compatibility = OK; +int firmware_check_done = 0; +char firmware_message[MAX_STR_LENGTH]; + +sls_detector_module *detectorModules = NULL; +int *detectorDacs = NULL; +int *detectorAdcs =NULL; #ifdef VIRTUAL pthread_t pthread_virtual_tid; @@ -28,12 +28,11 @@ int virtual_status = 0; int virtual_stop = 0; #endif +enum detectorSettings thisSettings; +int highvoltage = 0; +int dacValues[NDAC] = {0}; +int32_t clkPhase[2] = {0, 0}; -/* basic tests */ - -int firmware_compatibility = OK; -int firmware_check_done = 0; -char firmware_message[MAX_STR_LENGTH]; int isFirmwareCheckDone() { return firmware_check_done; @@ -44,16 +43,16 @@ int getFirmwareCheckResult(char** mess) { return firmware_compatibility; } -void checkFirmwareCompatibility(int flag) { +void checkFirmwareCompatibility() { + firmware_compatibility = OK; + firmware_check_done = 0; + memset(firmware_message, 0, MAX_STR_LENGTH); #ifdef VIRTUAL - cprintf(BLUE,"\n\n" - "********************************************************\n" - "************** Jungfrau Virtual Server *****************\n" - "********************************************************\n\n"); + FILE_LOG(logINFOBLUE, ("******** Jungfrau Virtual Server *****************\n")); if (mapCSP0() == FAIL) { strcpy(firmware_message, - "FATAL ERROR: Could not map to memory. Dangerous to continue.\n"); - cprintf(RED,"%s\n\n", firmware_message); + "Could not map to memory. Dangerous to continue.\n"); + FILE_LOG(logERROR, (firmware_message)); firmware_compatibility = FAIL; firmware_check_done = 1; return; @@ -66,18 +65,18 @@ void checkFirmwareCompatibility(int flag) { resetFPGA(); if (mapCSP0() == FAIL) { strcpy(firmware_message, - "FATAL ERROR: Could not map to memory. Dangerous to continue.\n"); - cprintf(RED,"%s\n\n", firmware_message); + "Could not map to memory. Dangerous to continue.\n"); + FILE_LOG(logERROR, ("%s\n\n", firmware_message)); firmware_compatibility = FAIL; firmware_check_done = 1; return; } // does check only if flag is 0 (by default), set by command line - if ((!flag) && ((checkType() == FAIL) || (testFpga() == FAIL) || (testBus() == FAIL))) { + if ((!debugflag) && ((checkType() == FAIL) || (testFpga() == FAIL) || (testBus() == FAIL))) { strcpy(firmware_message, - "FATAL ERROR: Could not pass basic tests of FPGA and bus. Dangerous to continue.\n"); - cprintf(RED,"%s\n\n", firmware_message); + "Could not pass basic tests of FPGA and bus. Dangerous to continue.\n"); + FILE_LOG(logERROR, ("%s\n\n", firmware_message)); firmware_compatibility = FAIL; firmware_check_done = 1; return; @@ -95,10 +94,7 @@ void checkFirmwareCompatibility(int flag) { if (fwversion >= MIN_REQRD_VRSN_T_RD_API) sw_fw_apiversion = getDetectorId(SOFTWARE_FIRMWARE_API_VERSION); - cprintf(BLUE,"\n\n" - "********************************************************\n" - "****************** Jungfrau Server *********************\n" - "********************************************************\n\n" + FILE_LOG(logINFOBLUE, ("************ Jungfrau Server *********************\n" "Hardware Version:\t\t 0x%x\n" "Hardware Serial Nr:\t\t 0x%x\n" @@ -110,7 +106,6 @@ void checkFirmwareCompatibility(int flag) { "F/w-S/w API Version:\t\t 0x%llx\n" "Required Firmware Version:\t 0x%x\n" "Client-Software API Version:\t 0x%llx\n" - "\n" "********************************************************\n", hversion, hsnumber, ipadd, @@ -120,21 +115,21 @@ void checkFirmwareCompatibility(int flag) { (long long int)sw_fw_apiversion, REQRD_FRMWR_VRSN, (long long int)client_sw_apiversion - ); + )); // return if flag is not zero, debug mode - if (flag) { + if (debugflag) { firmware_check_done = 1; return; } //cant read versions - printf("Testing Firmware-software compatibility ...\n"); + FILE_LOG(logINFO, ("Testing Firmware-software compatibility:\n")); if(!fwversion || !sw_fw_apiversion){ strcpy(firmware_message, - "FATAL ERROR: Cant read versions from FPGA. Please update firmware.\n"); - cprintf(RED,"%s\n\n", firmware_message); + "Cant read versions from FPGA. Please update firmware.\n"); + FILE_LOG(logERROR, (firmware_message)); firmware_compatibility = FAIL; firmware_check_done = 1; return; @@ -143,29 +138,29 @@ void checkFirmwareCompatibility(int flag) { //check for API compatibility - old server if(sw_fw_apiversion > REQRD_FRMWR_VRSN){ sprintf(firmware_message, - "FATAL ERROR: This detector software software version (0x%llx) is incompatible.\n" + "This detector software software version (0x%llx) is incompatible.\n" "Please update detector software (min. 0x%llx) to be compatible with this firmware.\n", (long long int)sw_fw_apiversion, (long long int)REQRD_FRMWR_VRSN); - cprintf(RED,"%s\n\n", firmware_message); + FILE_LOG(logERROR, (firmware_message)); firmware_compatibility = FAIL; firmware_check_done = 1; return; } //check for firmware compatibility - old firmware - if( REQRD_FRMWR_VRSN > fwversion){ + if( REQRD_FRMWR_VRSN > fwversion) { sprintf(firmware_message, - "FATAL ERROR: This firmware version (0x%llx) is incompatible.\n" + "This firmware version (0x%llx) is incompatible.\n" "Please update firmware (min. 0x%llx) to be compatible with this server.\n", (long long int)fwversion, (long long int)REQRD_FRMWR_VRSN); - cprintf(RED,"%s\n\n", firmware_message); + FILE_LOG(logERROR, (firmware_message)); firmware_compatibility = FAIL; firmware_check_done = 1; return; } - printf("Compatibility - success\n"); + FILE_LOG(logINFO, ("Compatibility - success\n")); firmware_check_done = 1; } @@ -175,8 +170,8 @@ int checkType() { return OK; #endif volatile u_int32_t type = ((bus_r(FPGA_VERSION_REG) & DETECTOR_TYPE_MSK) >> DETECTOR_TYPE_OFST); - if (type != JUNGFRAU){ - cprintf(BG_RED,"This is not a Jungfrau Server (read %d, expected %d)\n",type, JUNGFRAU); + if (type != BOARD_JUNGFRAU_TYPE){ + FILE_LOG(logERROR, ("This is not a Jungfrau Server (read %d, expected %d)\n", type, BOARD_JUNGFRAU_TYPE)); return FAIL; } @@ -189,15 +184,15 @@ u_int32_t testFpga(void) { #ifdef VIRTUAL return OK; #endif - printf("\nTesting FPGA...\n"); + FILE_LOG(logINFO, ("Testing FPGA:\n")); //fixed pattern int ret = OK; volatile u_int32_t val = bus_r(FIX_PATT_REG); if (val == FIX_PATT_VAL) { - printf("Fixed pattern: successful match 0x%08x\n",val); + FILE_LOG(logINFO, ("Fixed pattern: successful match 0x%08x\n",val)); } else { - cprintf(RED,"Fixed pattern does not match! Read 0x%08x, expected 0x%08x\n", val, FIX_PATT_VAL); + FILE_LOG(logERROR, ("Fixed pattern does not match! Read 0x%08x, expected 0x%08x\n", val, FIX_PATT_VAL)); ret = FAIL; } return ret; @@ -208,7 +203,7 @@ int testBus() { #ifdef VIRTUAL return OK; #endif - printf("\nTesting Bus...\n"); + FILE_LOG(logINFO, ("Testing Bus:\n")); int ret = OK; u_int32_t addr = SET_TRIGGER_DELAY_LSB_REG; @@ -218,16 +213,17 @@ int testBus() { for (i = 0; i < times; ++i) { bus_w(addr, i * 100); if (i * 100 != bus_r(addr)) { - cprintf(RED,"ERROR: Mismatch! Wrote 0x%x, read 0x%x\n", - i * 100, bus_r(addr)); + FILE_LOG(logERROR, ("Mismatch! Wrote 0x%x, read 0x%x\n", + i * 100, bus_r(addr))); ret = FAIL; } } bus_w(addr, 0); - if (ret == OK) - printf("Successfully tested bus %d times\n", times); + if (ret == OK) { + FILE_LOG(logINFO, ("Successfully tested bus %d times\n", times)); + } return ret; } @@ -243,7 +239,7 @@ int detectorTest( enum digitalTestMode arg){ //DETECTOR_MEMORY_TEST:testRAM //DETECTOR_SOFTWARE_TEST: default: - cprintf(RED,"Warning: Test not implemented for this detector %d\n", (int)arg); + FILE_LOG(logERROR, ("Test not implemented for this detector %d\n", (int)arg)); break; } return OK; @@ -351,7 +347,7 @@ u_int32_t getDetectorIP(){ } strcpy(output,temp); sscanf(output, "%x", &res); - //printf("ip:%x\n",res); + //FILE_LOG(logINFO, ("ip:%x\n",res); return res; } @@ -368,7 +364,6 @@ u_int32_t getDetectorIP(){ void initControlServer(){ clkPhase[0] = 0; clkPhase[1] = 0; setupDetector(); - printf("\n"); } @@ -377,7 +372,7 @@ void initStopServer() { usleep(CTRL_SRVR_INIT_TIME_US); if (mapCSP0() == FAIL) { - cprintf(BG_RED, "Stop Server: Map Fail. Dangerous to continue. Goodbye!\n"); + FILE_LOG(logERROR, ("Stop Server: Map Fail. Dangerous to continue. Goodbye!\n")); exit(EXIT_FAILURE); } } @@ -390,29 +385,28 @@ void initStopServer() { /* set up detector */ void allocateDetectorStructureMemory(){ - printf("This Server is for 1 Jungfrau module (500k)\n"); + FILE_LOG(logINFO, ("This Server is for 1 Jungfrau module (500k)\n")); //Allocation of memory - if (detectorModules!=NULL) free(detectorModules); - if (detectorDacs!=NULL) free(detectorDacs); - if (detectorAdcs!=NULL) free(detectorAdcs); - detectorModules=malloc(sizeof(sls_detector_module)); - detectorDacs=malloc(NDAC*sizeof(int)); - detectorAdcs=malloc(NADC*sizeof(int)); -#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",detectorModules, detectorModules+n); - printf("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs+n*NDAC); - printf("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs+n*NADC); -#endif - (detectorModules)->dacs=detectorDacs; - (detectorModules)->adcs=detectorAdcs; - (detectorModules)->ndac=NDAC; - (detectorModules)->nadc=NADC; - (detectorModules)->nchip=NCHIP; - (detectorModules)->nchan=NCHIP*NCHAN; - (detectorModules)->gain=0; - (detectorModules)->offset=0; - (detectorModules)->reg=0; + if (detectorModules != NULL) free(detectorModules); + if (detectorDacs != NULL) free(detectorDacs); + if (detectorAdcs != NULL) free(detectorAdcs); + detectorModules = malloc(sizeof(sls_detector_module)); + detectorDacs = malloc(NDAC*sizeof(int)); + detectorAdcs = malloc(NADC*sizeof(int)); + FILE_LOG(logDEBUG1, ("modules from 0x%x to 0x%x\n",detectorModules, detectorModules)); + FILE_LOG(logDEBUG1, ("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs)); + FILE_LOG(logDEBUG1, ("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs)); + (detectorModules)->dacs = detectorDacs; + (detectorModules)->adcs = detectorAdcs; + (detectorModules)->ndac = NDAC; + (detectorModules)->nadc = NADC; + (detectorModules)->nchip = NCHIP; + (detectorModules)->nchan = NCHIP * NCHAN; + (detectorModules)->reg = 0; + (detectorModules)->iodelay = 0; + (detectorModules)->tau = 0; + (detectorModules)->eV = 0; thisSettings = UNINITIALIZED; { // initialize to -1 @@ -429,7 +423,6 @@ void setupDetector() { allocateDetectorStructureMemory(); - printf("Resetting PLL\n"); resetPLL(); resetCore(); resetPeripheral(); @@ -446,6 +439,7 @@ void setupDetector() { bus_w(DAQ_REG, 0x0); /* Only once at server startup */ + FILE_LOG(logINFOBLUE, ("Setting Default parameters\n")); setSpeed(HALF_SPEED); cleanFifos(); resetCore(); @@ -479,7 +473,7 @@ void setupDetector() { int setDefaultDacs() { int ret = OK; - printf("Setting Default Dac values\n"); + FILE_LOG(logINFOBLUE, ("Setting Default Dac values\n")); { int i = 0; int retval[2]={-1,-1}; @@ -489,7 +483,7 @@ int setDefaultDacs() { if (dacValues[i] != defaultvals[i]) { setDAC((enum DACINDEX)i,defaultvals[i],0,retval); if (retval[0] != defaultvals[i]) { - cprintf(RED, "Warning: Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval[0]); + FILE_LOG(logERROR, ("Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval[0])); ret = FAIL; } } @@ -506,17 +500,15 @@ int setDefaultDacs() { int powerChip (int on){ if(on != -1){ if(on){ - cprintf(BLUE, "\n*** Powering on the chip ***\n"); + FILE_LOG(logINFO, ("Powering chip: on\n")); bus_w(CHIP_POWER_REG, bus_r(CHIP_POWER_REG) | CHIP_POWER_ENABLE_MSK); } else{ - cprintf(BLUE, "\n*** Powering off the chip*** \n"); + FILE_LOG(logINFO, ("Powering chip: off\n")); bus_w(CHIP_POWER_REG, bus_r(CHIP_POWER_REG) & ~CHIP_POWER_ENABLE_MSK); } } - //return ((bus_r(CHIP_POWER_REG) & CHIP_POWER_ENABLE_MSK) >> CHIP_POWER_ENABLE_OFST); - /**temporary fix until power reg status can be read */ return ((bus_r(CHIP_POWER_REG) & CHIP_POWER_STATUS_MSK) >> CHIP_POWER_STATUS_OFST); } @@ -525,11 +517,11 @@ int powerChip (int on){ int autoCompDisable(int on) { if(on != -1){ if(on){ - cprintf(BLUE, "\n*** Auto comp disable mode: enabling ***\n"); + FILE_LOG(logINFO, ("Auto comp disable mode: on\n")); bus_w(VREF_COMP_MOD_REG, bus_r(VREF_COMP_MOD_REG) | VREF_COMP_MOD_ENABLE_MSK); } else{ - cprintf(BLUE, "\n*** Auto comp disable mode: disabling *** \n"); + FILE_LOG(logINFO, ("Auto comp disable mode: off\n")); bus_w(VREF_COMP_MOD_REG, bus_r(VREF_COMP_MOD_REG) & ~VREF_COMP_MOD_ENABLE_MSK); } } @@ -542,7 +534,7 @@ void cleanFifos() { #ifdef VIRTUAL return; #endif - printf("\nClearing Acquisition Fifos\n"); + FILE_LOG(logINFO, ("Clearing Acquisition Fifos\n")); bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_ACQ_FIFO_CLR_MSK); bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_ACQ_FIFO_CLR_MSK); } @@ -551,7 +543,7 @@ void resetCore() { #ifdef VIRTUAL return; #endif - printf("\nResetting Core\n"); + FILE_LOG(logINFO, ("Resetting Core\n")); bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CORE_RST_MSK); bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_CORE_RST_MSK); } @@ -560,13 +552,13 @@ void resetPeripheral() { #ifdef VIRTUAL return; #endif - printf("\nResetting Peripheral\n"); + FILE_LOG(logINFO, ("Resetting Peripheral\n")); bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PERIPHERAL_RST_MSK); bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_PERIPHERAL_RST_MSK); } int adcPhase(int st){ /**carlos needed clkphase 1 and 2? cehck with Aldo */ - printf("Setting ADC Phase to %d\n",st); + FILE_LOG(logINFO, ("Setting ADC Phase to %d\n", st)); if (st > 65535 || st < -65535) return clkPhase[0]; @@ -584,7 +576,7 @@ int getPhase() { } void configureASICTimer() { - printf("\nConfiguring ASIC Timer\n"); + FILE_LOG(logINFO, ("Configuring ASIC Timer\n")); bus_w(ASIC_CTRL_REG, (bus_r(ASIC_CTRL_REG) & ~ASIC_CTRL_PRCHRG_TMR_MSK) | ASIC_CTRL_PRCHRG_TMR_VAL); bus_w(ASIC_CTRL_REG, (bus_r(ASIC_CTRL_REG) & ~ASIC_CTRL_DS_TMR_MSK) | ASIC_CTRL_DS_TMR_VAL); } @@ -624,58 +616,57 @@ enum speedVariable setSpeed(int val) { // todo in firmware, for now setting half speed case FULL_SPEED://40 - printf("\nSetting Half Speed (20 MHz):\n"); + FILE_LOG(logINFO, ("Setting Half Speed (20 MHz):\n")); - printf("Setting Sample Reg to 0x%x\n", SAMPLE_ADC_HALF_SPEED); + FILE_LOG(logINFO, ("\tSetting Sample Reg to 0x%x\n", SAMPLE_ADC_HALF_SPEED)); bus_w(SAMPLE_REG, SAMPLE_ADC_HALF_SPEED); txndelay_msk = (bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK); // read config tdma timeslot value - printf("Setting Config Reg to 0x%x\n", CONFIG_HALF_SPEED | txndelay_msk); + FILE_LOG(logINFO, ("\tSetting Config Reg to 0x%x\n", CONFIG_HALF_SPEED | txndelay_msk)); bus_w(CONFIG_REG, CONFIG_HALF_SPEED | txndelay_msk); - printf("Setting ADC Ofst Reg to 0x%x\n", ADC_OFST_HALF_SPEED_VAL); + FILE_LOG(logINFO, ("\tSetting ADC Ofst Reg to 0x%x\n", ADC_OFST_HALF_SPEED_VAL)); bus_w(ADC_OFST_REG, ADC_OFST_HALF_SPEED_VAL); - printf("Setting ADC Phase Reg to 0x%x\n", ADC_PHASE_HALF_SPEED); + FILE_LOG(logINFO, ("\tSetting ADC Phase Reg to 0x%x\n", ADC_PHASE_HALF_SPEED)); adcPhase(ADC_PHASE_HALF_SPEED); break; case HALF_SPEED: - printf("\nSetting Half Speed (20 MHz):\n"); + FILE_LOG(logINFO, ("Setting Half Speed (20 MHz):\n")); - printf("Setting Sample Reg to 0x%x\n", SAMPLE_ADC_HALF_SPEED); + FILE_LOG(logINFO, ("\tSetting Sample Reg to 0x%x\n", SAMPLE_ADC_HALF_SPEED)); bus_w(SAMPLE_REG, SAMPLE_ADC_HALF_SPEED); txndelay_msk = (bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK); // read config tdma timeslot value - printf("Setting Config Reg to 0x%x\n", CONFIG_HALF_SPEED | txndelay_msk); + FILE_LOG(logINFO, ("\tSetting Config Reg to 0x%x\n", CONFIG_HALF_SPEED | txndelay_msk)); bus_w(CONFIG_REG, CONFIG_HALF_SPEED | txndelay_msk); - printf("Setting ADC Ofst Reg to 0x%x\n", ADC_OFST_HALF_SPEED_VAL); + FILE_LOG(logINFO, ("\tSetting ADC Ofst Reg to 0x%x\n", ADC_OFST_HALF_SPEED_VAL)); bus_w(ADC_OFST_REG, ADC_OFST_HALF_SPEED_VAL); - printf("Setting ADC Phase Reg to 0x%x\n", ADC_PHASE_HALF_SPEED); + FILE_LOG(logINFO, ("\tSetting ADC Phase Reg to 0x%x\n", ADC_PHASE_HALF_SPEED)); adcPhase(ADC_PHASE_HALF_SPEED); break; case QUARTER_SPEED: - printf("\nSetting Half Speed (10 MHz):\n"); + FILE_LOG(logINFO, ("Setting Half Speed (10 MHz):\n")); - printf("Setting Sample Reg to 0x%x\n", SAMPLE_ADC_QUARTER_SPEED); + FILE_LOG(logINFO, ("\tSetting Sample Reg to 0x%x\n", SAMPLE_ADC_QUARTER_SPEED)); bus_w(SAMPLE_REG, SAMPLE_ADC_QUARTER_SPEED); txndelay_msk = (bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK); // read config tdma timeslot value - printf("Setting Config Reg to 0x%x\n", CONFIG_QUARTER_SPEED | txndelay_msk); + FILE_LOG(logINFO, ("\tSetting Config Reg to 0x%x\n", CONFIG_QUARTER_SPEED | txndelay_msk)); bus_w(CONFIG_REG, CONFIG_QUARTER_SPEED | txndelay_msk); - printf("Setting ADC Ofst Reg to 0x%x\n", ADC_OFST_QUARTER_SPEED_VAL); + FILE_LOG(logINFO, ("\tSetting ADC Ofst Reg to 0x%x\n", ADC_OFST_QUARTER_SPEED_VAL)); bus_w(ADC_OFST_REG, ADC_OFST_QUARTER_SPEED_VAL); - printf("Setting ADC Phase Reg to 0x%x\n", ADC_PHASE_QUARTER_SPEED); + FILE_LOG(logINFO, ("\tSetting ADC Phase Reg to 0x%x\n", ADC_PHASE_QUARTER_SPEED)); adcPhase(ADC_PHASE_QUARTER_SPEED); break; } - printf("\n"); } //getting @@ -700,6 +691,7 @@ enum speedVariable setSpeed(int val) { /* parameters - timer */ int selectStoragecellStart(int pos) { if (pos >= 0) { + FILE_LOG(logINFO, ("Setting storage cell start: %d\n", pos)); bus_w(DAQ_REG, bus_r(DAQ_REG) & ~DAQ_STRG_CELL_SLCT_MSK); bus_w(DAQ_REG, bus_r(DAQ_REG) | ((pos << DAQ_STRG_CELL_SLCT_OFST) & DAQ_STRG_CELL_SLCT_MSK)); } @@ -714,60 +706,62 @@ int64_t setTimer(enum timerIndex ind, int64_t val) { switch(ind){ case FRAME_NUMBER: - if(val >= 0) - printf("\nSetting #frames: %lld\n",(long long int)val); + 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); - printf("Getting #frames: %lld\n",(long long int)retval); + FILE_LOG(logDEBUG1, ("Getting #frames: %lld\n", (long long int)retval)); break; case ACQUISITION_TIME: if(val >= 0){ - printf("\nSetting exptime: %lldns\n", (long long int)val); + FILE_LOG(logINFO, ("Setting exptime: %lldns\n", (long long int)val)); val *= (1E-3 * CLK_RUN); val -= ACQ_TIME_MIN_CLOCK; if(val < 0) val = 0; } retval = (set64BitReg(val, SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) + ACQ_TIME_MIN_CLOCK) / (1E-3 * CLK_RUN); - printf("Getting exptime: %lldns\n", (long long int)retval); + FILE_LOG(logDEBUG1, ("Getting exptime: %lldns\n", (long long int)retval)); break; case FRAME_PERIOD: if(val >= 0){ - printf("\nSetting period to %lldns\n",(long long int)val); + FILE_LOG(logINFO, ("Setting period: %lldns\n",(long long int)val)); val *= (1E-3 * CLK_SYNC); } retval = set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG )/ (1E-3 * CLK_SYNC); - printf("Getting period: %lldns\n", (long long int)retval); + FILE_LOG(logDEBUG1, ("Getting period: %lldns\n", (long long int)retval)); break; case DELAY_AFTER_TRIGGER: if(val >= 0){ - printf("\nSetting delay to %lldns\n", (long long int)val); + FILE_LOG(logINFO, ("Setting delay: %lldns\n", (long long int)val)); val *= (1E-3 * CLK_SYNC); } retval = set64BitReg(val, SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG) / (1E-3 * CLK_SYNC); - printf("Getting delay: %lldns\n", (long long int)retval); + FILE_LOG(logDEBUG1, ("Getting delay: %lldns\n", (long long int)retval)); break; case CYCLES_NUMBER: - if(val >= 0) - printf("\nSetting #cycles to %lld\n", (long long int)val); + 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); - printf("Getting #cycles: %lld\n", (long long int)retval); + FILE_LOG(logDEBUG1, ("Getting #cycles: %lld\n", (long long int)retval)); break; case STORAGE_CELL_NUMBER: if(val >= 0) { - printf("\nSetting #storage cells to %lld\n", (long long int)val); + FILE_LOG(logINFO, ("Setting #storage cells: %lld\n", (long long int)val)); bus_w(CONTROL_REG, (bus_r(CONTROL_REG) & ~CONTROL_STORAGE_CELL_NUM_MSK) | ((val << CONTROL_STORAGE_CELL_NUM_OFST) & CONTROL_STORAGE_CELL_NUM_MSK)); } retval = ((bus_r(CONTROL_REG) & CONTROL_STORAGE_CELL_NUM_MSK) >> CONTROL_STORAGE_CELL_NUM_OFST); - printf("Getting #storage cells: %lld\n", (long long int)retval); + FILE_LOG(logDEBUG1, ("Getting #storage cells: %lld\n", (long long int)retval)); break; default: - cprintf(RED,"Warning: Timer Index not implemented for this detector: %d\n", ind); + FILE_LOG(logERROR, ("Timer Index not implemented for this detector: %d\n", ind)); break; } @@ -786,42 +780,42 @@ int64_t getTimeLeft(enum timerIndex ind){ case FRAME_NUMBER: retval = get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); - printf("Getting number of frames left: %lld\n",(long long int)retval); + FILE_LOG(logINFO, ("Getting number of frames left: %lld\n",(long long int)retval)); break; case FRAME_PERIOD: retval = get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / (1E-3 * CLK_SYNC); - printf("Getting period left: %lldns\n", (long long int)retval); + FILE_LOG(logINFO, ("Getting period left: %lldns\n", (long long int)retval)); break; /* case DELAY_AFTER_TRIGGER: retval = get64BitReg(xxx) / (1E-3 * CLK_SYNC); - printf("Getting delay left: %lldns\n", (long long int)retval); + FILE_LOG(logINFO, ("Getting delay left: %lldns\n", (long long int)retval)); break; */ case CYCLES_NUMBER: retval = get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); - printf("Getting number of cycles left: %lld\n", (long long int)retval); + FILE_LOG(logINFO, ("Getting number of cycles left: %lld\n", (long long int)retval)); break; case ACTUAL_TIME: retval = get64BitReg(TIME_FROM_START_LSB_REG, TIME_FROM_START_MSB_REG) / (1E-9 * CLK_SYNC); - printf("Getting actual time (time from start): %lld\n", (long long int)retval); + FILE_LOG(logINFO, ("Getting actual time (time from start): %lld\n", (long long int)retval)); break; case MEASUREMENT_TIME: retval = get64BitReg(START_FRAME_TIME_LSB_REG, START_FRAME_TIME_MSB_REG) / (1E-9 * CLK_SYNC); - printf("Getting measurement time (timestamp/ start frame time): %lld\n", (long long int)retval); + FILE_LOG(logINFO, ("Getting measurement time (timestamp/ start frame time): %lld\n", (long long int)retval)); break; case FRAMES_FROM_START: case FRAMES_FROM_START_PG: retval = get64BitReg(FRAMES_FROM_START_PG_LSB_REG, FRAMES_FROM_START_PG_MSB_REG); - printf("Getting frames from start run control %lld\n", (long long int)retval); + FILE_LOG(logINFO, ("Getting frames from start run control %lld\n", (long long int)retval)); break; default: - cprintf(RED, "Warning: Remaining Timer index not implemented for this detector: %d\n", ind); + FILE_LOG(logERROR, ("Remaining Timer index not implemented for this detector: %d\n", ind)); break; } @@ -836,25 +830,29 @@ int64_t getTimeLeft(enum timerIndex ind){ /* parameters - channel, chip, module, settings */ -int setModule(sls_detector_module myMod){ - int retval[2]; - int i; +int setModule(sls_detector_module myMod, char* mess){ - //#ifdef VERBOSE - printf("Setting module with settings %d\n",myMod.reg); - //#endif + FILE_LOG(logINFO, ("Setting module with settings %d\n",myMod.reg)); + // settings setSettings( (enum detectorSettings)myMod.reg); //copy module locally - if (detectorModules) - copyModule(detectorModules,&myMod); + if (detectorModules) { + if (copyModule(detectorModules, &myMod) == FAIL) { + sprintf(mess, "Could not copy module\n"); + FILE_LOG(logERROR, (mess)); + return FAIL; + } + } - //set dac values - for(i=0;i vmax)) { - cprintf(RED,"Voltage value (to convert to dac value) is outside bounds: %d\n", value); + FILE_LOG(logERROR, ("Voltage value (to convert to dac value) is outside bounds: %d\n", value)); return -1; } return (int)(((value - vmin) / (vmax - vmin)) * (nsteps - 1) + 0.5); @@ -1022,7 +1021,7 @@ int dacToVoltage(unsigned int digital){ int nsteps = 4096; int v = vmin + (vmax - vmin) * digital / (nsteps - 1); if((v < 0) || (v > nsteps - 1)) { - cprintf(RED,"Voltage value (converted from dac value) is outside bounds: %d\n", v); + FILE_LOG(logERROR, ("Voltage value (converted from dac value) is outside bounds: %d\n", v)); return -1; } return v; @@ -1046,21 +1045,21 @@ void setDAC(enum DACINDEX ind, int val, int mV, int retval[]){ int csdx = ind / NDAC + DAC_SERIAL_CS_OUT_OFST; // old board (16 dacs),so can be DAC_SERIAL_CS_OUT_OFST or +1 int dacchannel = ind % NDAC; // 0-8, dac channel number (also for dacnum 9-15 in old board) - printf("\nSetting of DAC %d : %d dac units (%d mV)\n",ind, dacval, val); + FILE_LOG(logINFO, ("Setting DAC %d: %d dac (%d mV)\n",ind, dacval, val)); // command if (val >= 0) { - printf(" Write to Input Register and Update\n"); + FILE_LOG(logDEBUG1,("\tWrite to Input Register and Update\n")); codata = LTC2620_DAC_CMD_SET; } else if (val == -100) { - printf(" POWER DOWN\n"); + FILE_LOG(logDEBUG1, ("\tPOWER DOWN\n")); codata = LTC2620_DAC_CMD_POWER_DOWN; } // address - printf(" Chip select bit:%d\n" - " Dac Channel:0x%x\n" - " Dac Value:0x%x\n", - csdx, dacchannel, val); + FILE_LOG(logDEBUG1, ("\tChip select bit:%d\n" + "\tDac Channel:0x%x\n" + "\tDac Value:0x%x\n", + csdx, dacchannel, val)); codata += ((dacchannel << LTC2620_DAC_ADDR_OFST) & LTC2620_DAC_ADDR_MSK) + ((val << LTC2620_DAC_DATA_OFST) & LTC2620_DAC_DATA_MSK); // to spi @@ -1076,9 +1075,9 @@ void setDAC(enum DACINDEX ind, int val, int mV, int retval[]){ #endif } - printf("Getting DAC %d : ",ind); - retval[0] = dacValues[ind]; printf("%d dac units ", retval[0]); - retval[1] = dacToVoltage(retval[0]);printf("(%d mV)\n", retval[1]); + retval[0] = dacValues[ind]; + retval[1] = dacToVoltage(retval[0]); + FILE_LOG(logDEBUG1, ("Getting DAC %d : %d dac (%d mV)\n",ind, retval[0], retval[1])); } @@ -1087,7 +1086,7 @@ int getADC(enum ADCINDEX ind){ return 0; #endif char tempnames[2][40]={"VRs/FPGAs Temperature", "ADCs/ASICs Temperature"}; - printf("Getting Temperature for %s\n",tempnames[ind]); + FILE_LOG(logDEBUG1, ("Getting Temperature for %s\n", tempnames[ind])); u_int32_t addr = GET_TEMPERATURE_TMP112_REG; uint32_t regvalue = bus_r(addr); uint32_t value = regvalue & TEMPERATURE_VALUE_MSK; @@ -1104,7 +1103,7 @@ int getADC(enum ADCINDEX ind){ // conversion retval *= 625.0/10.0; - printf("\nReal Temperature %s: %f °C\n",tempnames[ind],retval/1000.00); + FILE_LOG(logINFO, ("Temperature %s: %f °C\n",tempnames[ind],retval/1000.00)); return retval; } @@ -1131,7 +1130,7 @@ int setHighVoltage(int val){ dacvalue = 1. + (200.-val) / alpha; val=200.-(dacvalue-1)*alpha; } - printf ("\nSetting High voltage to %d (dacval %d)\n",val, dacvalue); + FILE_LOG(logINFO, ("Setting High voltage: %d (dacval %d)\n",val, dacvalue)); dacvalue &= MAX1932_HV_DATA_MSK; serializeToSPI(SPI_REG, dacvalue, HV_SERIAL_CS_OUT_MSK, MAX1932_HV_NUMBITS, HV_SERIAL_CLK_OUT_MSK, HV_SERIAL_DIGITAL_OUT_MSK, HV_SERIAL_DIGITAL_OUT_OFST); @@ -1148,23 +1147,31 @@ int setHighVoltage(int val){ /* parameters - timing, extsig */ -enum externalCommunicationMode setTiming( enum externalCommunicationMode arg){ +void setTiming( enum externalCommunicationMode arg){ if(arg != GET_EXTERNAL_COMMUNICATION_MODE){ switch((int)arg){ - case AUTO_TIMING: bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) & ~EXT_SIGNAL_MSK); break; - case TRIGGER_EXPOSURE: bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) | EXT_SIGNAL_MSK); break; + case AUTO_TIMING: + FILE_LOG(logINFO, ("Set Timing: Auto\n")); + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) & ~EXT_SIGNAL_MSK); + break; + case TRIGGER_EXPOSURE: + FILE_LOG(logINFO, ("Set Timing: Trigger\n")); + bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) | EXT_SIGNAL_MSK); + break; default: - cprintf(RED,"Unknown timing mode %d\n", arg); - return GET_EXTERNAL_COMMUNICATION_MODE; + FILE_LOG(logERROR, ("Unknown timing mode %d\n", arg)); + return; } } - if (bus_r(EXT_SIGNAL_REG) == EXT_SIGNAL_MSK) - return TRIGGER_EXPOSURE; - return AUTO_TIMING; } +enum externalCommunicationMode getTiming() { + if (bus_r(EXT_SIGNAL_REG) == EXT_SIGNAL_MSK) + return TRIGGER_EXPOSURE; + return AUTO_TIMING; +} @@ -1192,7 +1199,7 @@ long int calcChecksum(int sourceip, int destip) { ip.ip_destip = destip; count = sizeof(ip); - addr =& (ip); /* warning: assignment from incompatible pointer type */ + addr = (unsigned short*) &(ip); /* warning: assignment from incompatible pointer type */ while( count > 1 ) { sum += *addr++; count -= 2; @@ -1201,90 +1208,73 @@ long int calcChecksum(int sourceip, int destip) { while (sum>>16) sum = (sum & 0xffff) + (sum >> 16);// Fold 32-bit sum to 16 bits checksum = (~sum) & 0xffff; - printf("IP checksum is 0x%lx\n",checksum); + FILE_LOG(logINFO, ("IP checksum is 0x%lx\n",checksum)); return checksum; } -int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2, int ival){ +int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2){ #ifdef VIRTUAL return 0; #endif - cprintf(BLUE, "\n*** Configuring MAC ***\n"); + FILE_LOG(logINFOBLUE, ("Configuring MAC\n")); uint32_t sourceport = DEFAULT_TX_UDP_PORT; - printf("Source IP : %d.%d.%d.%d \t\t(0x%08x)\n",(sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip); - printf("Source MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", + FILE_LOG(logINFO, ("\tSource IP : %d.%d.%d.%d \t\t(0x%08x)\n", + (sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip)); + FILE_LOG(logINFO, ("\tSource MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", (unsigned int)((sourcemac>>40)&0xFF), (unsigned int)((sourcemac>>32)&0xFF), (unsigned int)((sourcemac>>24)&0xFF), (unsigned int)((sourcemac>>16)&0xFF), (unsigned int)((sourcemac>>8)&0xFF), (unsigned int)((sourcemac>>0)&0xFF), - (long long unsigned int)sourcemac); - printf("Source Port : %d \t\t\t(0x%08x)\n",sourceport, sourceport); + (long long unsigned int)sourcemac)); + FILE_LOG(logINFO, ("\tSource Port : %d \t\t\t(0x%08x)\n",sourceport, sourceport)); - printf("Dest. IP : %d.%d.%d.%d \t\t(0x%08x)\n",(destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff, destip); - printf("Dest. MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", + FILE_LOG(logINFO, ("\tDest. IP : %d.%d.%d.%d \t\t(0x%08x)\n", + (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff, destip)); + FILE_LOG(logINFO, ("\tDest. MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", (unsigned int)((destmac>>40)&0xFF), (unsigned int)((destmac>>32)&0xFF), (unsigned int)((destmac>>24)&0xFF), (unsigned int)((destmac>>16)&0xFF), (unsigned int)((destmac>>8)&0xFF), (unsigned int)((destmac>>0)&0xFF), - (long long unsigned int)destmac); - printf("Dest. Port : %d \t\t\t(0x%08x)\n",udpport, udpport); + (long long unsigned int)destmac)); + FILE_LOG(logINFO, ("\tDest. Port : %d \t\t\t(0x%08x)\n",udpport, udpport)); long int checksum=calcChecksum(sourceip, destip); bus_w(TX_IP_REG, sourceip); bus_w(RX_IP_REG, destip); -/* - bus_w(TX_MAC_LSB_REG,(destmac>>32)&0xFFFFFFFF);//rx_udpmacH_AReg_c - bus_w(TX_MAC_MSB_REG,(destmac)&0xFFFFFFFF);//rx_udpmacL_AReg_c - bus_w(RX_MAC_MSB_REG,(sourcemac>>32)&0xFFFFFFFF);//detectormacH_AReg_c - bus_w(RX_MAC_LSB_REG,(sourcemac)&0xFFFFFFFF);//detectormacL_AReg_c - bus_w(UDP_PORT_REG,((sourceport&0xFFFF)<<16)+(udpport&0xFFFF));//udpports_AReg_c -*/ uint32_t val = 0; val = ((sourcemac >> LSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); bus_w(TX_MAC_LSB_REG, val); -#ifdef VERBOSE - printf("Read from TX_MAC_LSB_REG: 0x%08x\n", bus_r(TX_MAC_LSB_REG)); -#endif + FILE_LOG(logDEBUG1, ("Read from TX_MAC_LSB_REG: 0x%08x\n", bus_r(TX_MAC_LSB_REG))); val = ((sourcemac >> MSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); bus_w(TX_MAC_MSB_REG,val); -#ifdef VERBOSE - printf("Read from TX_MAC_MSB_REG: 0x%08x\n", bus_r(TX_MAC_MSB_REG)); -#endif + FILE_LOG(logDEBUG1, ("Read from TX_MAC_MSB_REG: 0x%08x\n", bus_r(TX_MAC_MSB_REG))); val = ((destmac >> LSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); bus_w(RX_MAC_LSB_REG, val); -#ifdef VERBOSE - printf("Read from RX_MAC_LSB_REG: 0x%08x\n", bus_r(RX_MAC_LSB_REG)); -#endif + FILE_LOG(logDEBUG1, ("Read from RX_MAC_LSB_REG: 0x%08x\n", bus_r(RX_MAC_LSB_REG))); val = ((destmac >> MSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); bus_w(RX_MAC_MSB_REG, val); -#ifdef VERBOSE - printf("Read from RX_MAC_MSB_REG: 0x%08x\n", bus_r(RX_MAC_MSB_REG)); -#endif + FILE_LOG(logDEBUG1, ("Read from RX_MAC_MSB_REG: 0x%08x\n", bus_r(RX_MAC_MSB_REG))); val = (((sourceport << UDP_PORT_TX_OFST) & UDP_PORT_TX_MSK) | ((udpport << UDP_PORT_RX_OFST) & UDP_PORT_RX_MSK)); bus_w(UDP_PORT_REG, val); -#ifdef VERBOSE - printf("Read from UDP_PORT_REG: 0x%08x\n", bus_r(UDP_PORT_REG)); -#endif + FILE_LOG(logDEBUG1, ("Read from UDP_PORT_REG: 0x%08x\n", bus_r(UDP_PORT_REG))); bus_w(TX_IP_CHECKSUM_REG,(checksum << TX_IP_CHECKSUM_OFST) & TX_IP_CHECKSUM_MSK); -#ifdef VERBOSE - printf("Read from TX_IP_CHECKSUM_REG: 0x%08x\n", bus_r(TX_IP_CHECKSUM_REG)); -#endif + FILE_LOG(logDEBUG1, ("Read from TX_IP_CHECKSUM_REG: 0x%08x\n", bus_r(TX_IP_CHECKSUM_REG))); cleanFifos(); resetCore(); @@ -1295,7 +1285,7 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t int setDetectorPosition(int pos[]) { int ret = OK; - + FILE_LOG(logDEBUG1, ("Setting detector position: (%d, %d), reserved: %d\n", pos[0], pos[1], pos[2])); bus_w(COORD_0_REG, bus_r(COORD_0_REG) | ((pos[0] << COORD_0_X_OFST) & COORD_0_X_MSK)); if ((bus_r(COORD_0_REG) & COORD_0_X_MSK) != ((pos[0] << COORD_0_X_OFST) & COORD_0_X_MSK)) ret = FAIL; @@ -1308,8 +1298,9 @@ int setDetectorPosition(int pos[]) { if ((bus_r(COORD_1_REG) & COORD_0_Z_MSK) != ((pos[2] << COORD_0_Z_OFST) & COORD_0_Z_MSK)) ret = FAIL; - if (ret == OK) - printf("Position set to [%d, %d, %d]\n", pos[0], pos[1], pos[2]); + if (ret == OK) { + FILE_LOG(logINFO, ("Position set to [%d, %d, %d]\n", pos[0], pos[1], pos[2])); + } return ret; } @@ -1323,6 +1314,7 @@ void resetPLL() { #ifdef VIRTUAL return; #endif + FILE_LOG(logINFO, ("Resetting PLL\n")); // reset PLL Reconfiguration and PLL bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) | PLL_CTRL_RECONFIG_RST_MSK | PLL_CTRL_RST_MSK); usleep(100); @@ -1334,6 +1326,7 @@ u_int32_t setPllReconfigReg(u_int32_t reg, u_int32_t val) { #ifdef VIRTUAL return val; #endif + FILE_LOG(logINFO, ("Setting PLL Reconfig Reg\n")); // set parameter bus_w(PLL_PARAM_REG, val); @@ -1363,7 +1356,7 @@ void configurePll() { return; } - printf("Configuring PLL with phase in %d\n", clkPhase[1]); + FILE_LOG(logINFO, ("\tConfiguring PLL with phase in %d\n", clkPhase[1])); if (clkPhase[1]>0) { inv=0; phase=clkPhase[1]; @@ -1371,18 +1364,18 @@ void configurePll() { inv=1; phase=-1*clkPhase[1]; } - printf(" phase out %d (0x%08x)\n", phase, phase); + FILE_LOG(logDEBUG1, ("\tphase out %d (0x%08x)\n", phase, phase)); if (inv) { val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) + PLL_SHIFT_CNT_SLCT_C1_VAL + PLL_SHIFT_UP_DOWN_NEG_VAL; - printf(" phase word 0x%08x\n", val); + FILE_LOG(logDEBUG1, ("\tphase word 0x%08x\n", val)); setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); } else { val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) + PLL_SHIFT_CNT_SLCT_C0_VAL + PLL_SHIFT_UP_DOWN_NEG_VAL; - printf(" phase word 0x%08x\n", val); + FILE_LOG(logDEBUG1, ("\tphase word 0x%08x\n", val)); setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - printf(" phase word 0x%08x\n", val); + FILE_LOG(logDEBUG1, ("\tphase word 0x%08x\n", val)); val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) + PLL_SHIFT_CNT_SLCT_C2_VAL; setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); } @@ -1394,23 +1387,21 @@ void configurePll() { int setThresholdTemperature(int val) { if (val >= 0) { - printf("\nThreshold Temperature: %d\n", val); - + FILE_LOG(logINFO, ("Setting Threshold Temperature: %f °C\n", val/1000.00)); val *= (10.0/625.0); -#ifdef VERBOSE - printf("Converted Threshold Temperature: %d\n", val); -#endif + FILE_LOG(logDEBUG1, ("Converted Threshold Temperature: %d\n", val)); bus_w(TEMP_CTRL_REG, (bus_r(TEMP_CTRL_REG) &~(TEMP_CTRL_PROTCT_THRSHLD_MSK) &~(TEMP_CTRL_OVR_TMP_EVNT_MSK)) | (((val << TEMP_CTRL_PROTCT_THRSHLD_OFST) & TEMP_CTRL_PROTCT_THRSHLD_MSK))); -#ifdef VERBOSE - printf("Converted Threshold Temperature set to %d\n", ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_THRSHLD_MSK) >> TEMP_CTRL_PROTCT_THRSHLD_OFST)); -#endif + FILE_LOG(logDEBUG1, ("Converted Threshold Temperature set to %d\n", + ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_THRSHLD_MSK) >> TEMP_CTRL_PROTCT_THRSHLD_OFST))); } uint32_t temp = ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_THRSHLD_MSK) >> TEMP_CTRL_PROTCT_THRSHLD_OFST); // conversion - temp *= (625.0/10.0); - printf("Threshold Temperature %f °C\n",(double)temp/1000.00); + temp = (temp * (625.0/10.0)); + + float ftemp = (double)temp/1000.00; + FILE_LOG(logDEBUG1, ("Threshold Temperature read %f °C\n",ftemp)); return temp; @@ -1421,12 +1412,11 @@ int setTemperatureControl(int val) { if (val >= 0) { // binary value if (val > 0 ) val = 1; - printf("\nTemperature control: %d\n", val); + FILE_LOG(logINFO, ("Setting Temperature control: %d\n", val)); bus_w(TEMP_CTRL_REG, (bus_r(TEMP_CTRL_REG) &~(TEMP_CTRL_PROTCT_ENABLE_MSK) &~(TEMP_CTRL_OVR_TMP_EVNT_MSK)) | (((val << TEMP_CTRL_PROTCT_ENABLE_OFST) & TEMP_CTRL_PROTCT_ENABLE_MSK))); -#ifdef VERBOSE - printf("Temperature control set to %d\n", ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_ENABLE_MSK) >> TEMP_CTRL_PROTCT_ENABLE_OFST)); -#endif + FILE_LOG(logDEBUG1, ("Temperature control read: %d\n", + ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_ENABLE_MSK) >> TEMP_CTRL_PROTCT_ENABLE_OFST))); } return ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_ENABLE_MSK) >> TEMP_CTRL_PROTCT_ENABLE_OFST); } @@ -1439,12 +1429,11 @@ int setTemperatureEvent(int val) { if (val >= 0) { // set bit to clear it val = 1; - printf("\nTemperature Event: %d\n", val); + FILE_LOG(logINFO, ("Setting Temperature Event (clearing): %d\n", val)); bus_w(TEMP_CTRL_REG, (bus_r(TEMP_CTRL_REG) &~TEMP_CTRL_OVR_TMP_EVNT_MSK) | (((val << TEMP_CTRL_OVR_TMP_EVNT_OFST) & TEMP_CTRL_OVR_TMP_EVNT_MSK))); -#ifdef VERBOSE - printf("Temperature Event set to %d\n", ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_OVR_TMP_EVNT_MSK) >> TEMP_CTRL_OVR_TMP_EVNT_OFST)); -#endif + FILE_LOG(logDEBUG1, ("Temperature Event read %d\n", + ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_OVR_TMP_EVNT_MSK) >> TEMP_CTRL_OVR_TMP_EVNT_OFST))); } return ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_OVR_TMP_EVNT_MSK) >> TEMP_CTRL_OVR_TMP_EVNT_OFST); } @@ -1456,16 +1445,15 @@ int setNetworkParameter(enum NETWORKINDEX mode, int value) { return -1; if (value >= 0) { - printf("\nSetting transmission delay: %d\n", value); + FILE_LOG(logINFO, ("Setting transmission delay: %d\n", value)); bus_w(CONFIG_REG, (bus_r(CONFIG_REG) &~CONFIG_TDMA_TIMESLOT_MSK) | (((value << CONFIG_TDMA_TIMESLOT_OFST) & CONFIG_TDMA_TIMESLOT_MSK))); if (value == 0) bus_w(CONFIG_REG, bus_r(CONFIG_REG) &~ CONFIG_TDMA_MSK); else bus_w(CONFIG_REG, bus_r(CONFIG_REG) | CONFIG_TDMA_MSK); -#ifdef VERBOSE - printf("Transmission delay set to %d\n", ((bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK) >> CONFIG_TDMA_TIMESLOT_OFST)); -#endif + FILE_LOG(logDEBUG1, ("Transmission delay read %d\n", + ((bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK) >> CONFIG_TDMA_TIMESLOT_OFST))); } return ((bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK) >> CONFIG_TDMA_TIMESLOT_OFST); @@ -1483,13 +1471,13 @@ int startStateMachine(){ virtual_stop = 0; if(pthread_create(&pthread_virtual_tid, NULL, &start_timer, NULL)) { virtual_status = 0; - cprintf(RED,"Could not start Virtual acquisition thread\n"); + FILE_LOG(logERROR, ("Could not start Virtual acquisition thread\n")); return FAIL; } - cprintf(GREEN,"***Virtual Acquisition started\n"); + FILE_LOG(logINFOGREEN, ("Virtual Acquisition started\n")); return OK; #endif - printf("*******Starting State Machine*******\n"); + FILE_LOG(logINFOBLUE, ("Starting State Machine\n")); cleanFifos(); @@ -1497,7 +1485,7 @@ int startStateMachine(){ bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_START_ACQ_MSK); bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_START_ACQ_MSK); - printf("Status Register: %08x\n",bus_r(STATUS_REG)); + FILE_LOG(logINFO, ("Status Register: %08x\n",bus_r(STATUS_REG))); return OK; } @@ -1508,12 +1496,12 @@ void* start_timer(void* arg) { setTimer(CYCLES_NUMBER, -1) * (setTimer(STORAGE_CELL_NUMBER, -1) + 1) * (setTimer(FRAME_PERIOD, -1)/(1E9))); - cprintf(GREEN,"going to wait for %d s\n", wait_in_s); + FILE_LOG(logDEBUG1, ("going to wait for %d s\n", wait_in_s)); while(!virtual_stop && (wait_in_s >= 0)) { usleep(1000 * 1000); wait_in_s--; } - cprintf(GREEN,"Virtual Timer Done***\n"); + FILE_LOG(logINFOGREEN, ("Virtual Timer Done\n")); virtual_status = 0; return NULL; @@ -1521,7 +1509,7 @@ void* start_timer(void* arg) { #endif int stopStateMachine(){ - cprintf(BG_RED,"*******Stopping State Machine*******\n"); + FILE_LOG(logINFORED, ("Stopping State Machine\n")); #ifdef VIRTUAL virtual_stop = 0; return OK; @@ -1531,7 +1519,7 @@ int stopStateMachine(){ usleep(100); bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STOP_ACQ_MSK); - printf("Status Register: %08x\n",bus_r(STATUS_REG)); + FILE_LOG(logINFO, ("Status Register: %08x\n",bus_r(STATUS_REG))); return OK; } @@ -1542,47 +1530,45 @@ int stopStateMachine(){ enum runStatus getRunStatus(){ #ifdef VIRTUAL if(virtual_status == 0){ - printf("Status: IDLE\n"); + FILE_LOG(logINFOBLUE, ("Status: IDLE\n")); return IDLE; }else{ - printf("Status: RUNNING...\n"); + FILE_LOG(logINFOBLUE, ("Status: RUNNING\n")); return RUNNING; } #endif -#ifdef VERBOSE - printf("Getting status\n"); -#endif + FILE_LOG(logDEBUG1, ("Getting status\n")); enum runStatus s; u_int32_t retval = bus_r(STATUS_REG); - printf("Status Register: %08x\n",retval); + FILE_LOG(logINFO, ("Status Register: %08x\n",retval)); //running if(((retval & RUN_BUSY_MSK) >> RUN_BUSY_OFST)) { if ((retval & WAITING_FOR_TRIGGER_MSK) >> WAITING_FOR_TRIGGER_OFST) { - printf("-----------------------------------WAITING-----------------------------------\n"); - s=WAITING; + FILE_LOG(logINFOBLUE, ("Status: WAITING\n")); + s = WAITING; } else{ - printf("-----------------------------------RUNNING-----------------------------------\n"); - s=RUNNING; + FILE_LOG(logINFOBLUE, ("Status: RUNNING\n")); + s = RUNNING; } } //not running else { if ((retval & STOPPED_MSK) >> STOPPED_OFST) { - printf("-----------------------------------STOPPED--------------------------\n"); - s=STOPPED; + FILE_LOG(logINFOBLUE, ("Status: STOPPED\n")); + s = STOPPED; } else if ((retval & RUNMACHINE_BUSY_MSK) >> RUNMACHINE_BUSY_OFST) { - printf("-----------------------------------READ MACHINE BUSY--------------------------\n"); - s=TRANSMITTING; + FILE_LOG(logINFOBLUE, ("Status: READ MACHINE BUSY\n")); + s = TRANSMITTING; } else if (!retval) { - printf("-----------------------------------IDLE--------------------------------------\n"); - s=IDLE; + FILE_LOG(logINFOBLUE, ("Status: IDLE\n")); + s = IDLE; } else { - printf("-----------------------------------Unknown status %08x--------------------------------------\n", retval); - s=ERROR; + FILE_LOG(logERROR, ("Status: Unknown status %08x\n", retval)); + s = ERROR; } } @@ -1594,7 +1580,7 @@ enum runStatus getRunStatus(){ void readFrame(int *ret, char *mess){ #ifdef VIRTUAL while(virtual_status) { - //cprintf(RED,"Waiting for finished flag\n"); + //FILE_LOG(logERROR, ("Waiting for finished flag\n"); usleep(5000); } return; @@ -1608,11 +1594,11 @@ void readFrame(int *ret, char *mess){ int64_t retval = getTimeLeft(FRAME_NUMBER) + 1; if ( retval > 0) { *ret = (int)FAIL; - sprintf(mess,"no data and run stopped: %lld frames left\n",(long long int)retval); - cprintf(RED,"%s\n",mess); + sprintf(mess,"No data and run stopped: %lld frames left\n",(long long int)retval); + FILE_LOG(logERROR, (mess)); } else { *ret = (int)OK; - cprintf(GREEN, "acquisition successfully finished\n"); + FILE_LOG(logINFOGREEN, ("Acquisition successfully finished\n")); } } @@ -1623,9 +1609,7 @@ u_int32_t runBusy(void) { return virtual_status; #endif u_int32_t s = ((bus_r(STATUS_REG) & RUN_BUSY_MSK) >> RUN_BUSY_OFST); -#ifdef VERBOSE - printf("Status Register: %08x\n", s); -#endif + FILE_LOG(logDEBUG1, ("Status Register: %08x\n", s)); return s; } @@ -1644,51 +1628,40 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod){ int idac, iadc; int ret=OK; -#ifdef VERBOSE - printf("Copying module %x to module %x\n",srcMod,destMod); -#endif + FILE_LOG(logDEBUG1, ("Copying module\n")); if (srcMod->serialnumber>=0){ destMod->serialnumber=srcMod->serialnumber; } if ((srcMod->nchip)>(destMod->nchip)) { - printf("Number of chip of source is larger than number of chips of destination\n"); + FILE_LOG(logERROR, ("Number of chip of source is larger than number of chips of destination\n")); return FAIL; } if ((srcMod->nchan)>(destMod->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); + FILE_LOG(logERROR, ("Number of channels of source is larger than number of channels of destination\n")); return FAIL; } if ((srcMod->ndac)>(destMod->ndac)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); + FILE_LOG(logERROR, ("Number of dacs of source is larger than number of dacs of destination\n")); return FAIL; } if ((srcMod->nadc)>(destMod->nadc)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); + FILE_LOG(logERROR, ("Number of dacs of source is larger than number of dacs of destination\n")); return FAIL; } -#ifdef VERBOSE - printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); - printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); - printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); - printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); - -#endif + FILE_LOG(logDEBUG1, ("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac)); + FILE_LOG(logDEBUG1, ("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc)); + FILE_LOG(logDEBUG1, ("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip)); + FILE_LOG(logDEBUG1, ("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan)); destMod->ndac=srcMod->ndac; destMod->nadc=srcMod->nadc; destMod->nchip=srcMod->nchip; destMod->nchan=srcMod->nchan; if (srcMod->reg>=0) destMod->reg=srcMod->reg; -#ifdef VERBOSE - printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); -#endif - if (srcMod->gain>=0) - destMod->gain=srcMod->gain; - if (srcMod->offset>=0) - destMod->offset=srcMod->offset; + FILE_LOG(logDEBUG1, ("Copying register %x (%x)\n",destMod->reg,srcMod->reg )); for (idac=0; idac<(srcMod->ndac); idac++) { if (*((srcMod->dacs)+idac)>=0) diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h index ef382ad5f..7911f0fa1 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorServer_defs.h @@ -3,14 +3,14 @@ #include "sls_detector_defs.h" //default dynamicgain in settings #include "RegisterDefs.h" -#include - #define GOODBYE (-200) #define MIN_REQRD_VRSN_T_RD_API 0x171220 #define REQRD_FRMWR_VRSN 0x180615 +#define PROGRAMMING_MODE (0x2) +#define BOARD_JUNGFRAU_TYPE (8) /* Struct Definitions */ typedef struct ip_header_struct { diff --git a/slsDetectorServers/slsDetectorServer/AD9257.h b/slsDetectorServers/slsDetectorServer/AD9257.h index a716af64c..615fdb3c0 100755 --- a/slsDetectorServers/slsDetectorServer/AD9257.h +++ b/slsDetectorServers/slsDetectorServer/AD9257.h @@ -1,10 +1,7 @@ #ifndef AD9257_H #define AD9257_H -#include "ansi.h" - -#include "commonServerFunctions.h" -#include +#include "commonServerFunctions.h" // blackfin.h, ansi.h /* AD9257 ADC DEFINES */ #define AD9257_ADC_NUMBITS (24) @@ -81,36 +78,36 @@ void setAdc(int addr, int val) { u_int32_t codata; codata = val + (addr << 8); - printf(" Setting ADC SPI Register. Wrote 0x%04x at 0x%04x\n", val, addr); + FILE_LOG(logINFO, ("\tSetting ADC SPI Register. Wrote 0x%04x at 0x%04x\n", val, addr)); serializeToSPI(ADC_SPI_REG, codata, ADC_SERIAL_CS_OUT_MSK, AD9257_ADC_NUMBITS, ADC_SERIAL_CLK_OUT_MSK, ADC_SERIAL_DATA_OUT_MSK, ADC_SERIAL_DATA_OUT_OFST); } void prepareADC(){ - printf("\n\nPreparing ADC ... \n"); + FILE_LOG(logINFOBLUE, ("Preparing ADC:\n")); //power mode reset - printf("power mode reset:\n"); + FILE_LOG(logINFO, ("\tPower mode reset\n")); setAdc(AD9257_POWER_MODE_REG, (AD9257_INT_RESET_VAL << AD9257_POWER_INTERNAL_OFST) & AD9257_POWER_INTERNAL_MSK); //power mode chip run - printf("power mode chip run:\n"); + FILE_LOG(logINFO, ("\tPower mode chip run\n")); setAdc(AD9257_POWER_MODE_REG, (AD9257_INT_CHIP_RUN_VAL << AD9257_POWER_INTERNAL_OFST) & AD9257_POWER_INTERNAL_MSK); //output clock phase - printf("output clock phase:\n"); + FILE_LOG(logINFO, ("\tOutput clock phase\n")); setAdc(AD9257_OUT_PHASE_REG, (AD9257_OUT_CLK_60_VAL << AD9257_OUT_CLK_OFST) & AD9257_OUT_CLK_MSK); // lvds-iee reduced , binary offset - printf("lvds-iee reduced, binary offset:\n"); + FILE_LOG(logINFO, ("\tLvds-iee reduced, binary offset\n")); setAdc(AD9257_OUT_MODE_REG, (AD9257_OUT_LVDS_IEEE_VAL << AD9257_OUT_LVDS_OPT_OFST) & AD9257_OUT_LVDS_OPT_MSK); // all devices on chip to receive next command - printf("all devices on chip to receive next command:\n"); + FILE_LOG(logINFO, ("\tAll devices on chip to receive next command\n")); setAdc(AD9257_DEV_IND_2_REG, AD9257_CHAN_H_MSK | AD9257_CHAN_G_MSK | AD9257_CHAN_F_MSK | AD9257_CHAN_E_MSK); setAdc(AD9257_DEV_IND_1_REG, @@ -118,21 +115,19 @@ void prepareADC(){ AD9257_CLK_CH_DCO_MSK | AD9257_CLK_CH_IFCO_MSK); // vref 1.33 - printf("vref 1.33:\n"); + FILE_LOG(logINFO, ("\tVref 1.33\n")); setAdc(AD9257_VREF_REG, (AD9257_VREF_1_33_VAL << AD9257_VREF_OFST) & AD9257_VREF_MSK); // no test mode - printf("no test mode:\n"); + FILE_LOG(logINFO, ("\tNo test mode\n")); setAdc(AD9257_TEST_MODE_REG, (AD9257_NONE_VAL << AD9257_OUT_TEST_OFST) & AD9257_OUT_TEST_MSK); #ifdef TESTADC - printf("***************************************** *******\n"); - printf("******* PUTTING ADC IN TEST MODE!!!!!!!!! *******\n"); - printf("***************************************** *******\n"); + FILE_LOG(logINFOBLUE, ("Putting ADC in Test Mode!\n"); // mixed bit frequency test mode - printf("mixed bit frequency test mode:\n"); + FILE_LOG(logINFO, ("\tMixed bit frequency test mode\n")); setAdc(AD9257_TEST_MODE_REG, (AD9257_MIXED_BIT_FREQ_VAL << AD9257_OUT_TEST_OFST) & AD9257_OUT_TEST_MSK); #endif diff --git a/slsDetectorServers/slsDetectorServer/blackfin.h b/slsDetectorServers/slsDetectorServer/blackfin.h index f95cd4ffe..e37dbf50f 100755 --- a/slsDetectorServers/slsDetectorServer/blackfin.h +++ b/slsDetectorServers/slsDetectorServer/blackfin.h @@ -1,9 +1,7 @@ -#ifndef BLACKFIN_H -#define BLACKFIN_H +#pragma once #include "ansi.h" -#include #include // open #include // mmap @@ -73,7 +71,7 @@ int64_t get64BitReg(int aLSB, int aMSB){ vMSB=bus_r(aMSB); v64=vMSB; v64=(v64<<32) | vLSB; - printf(" reg64(%x,%x) %x %x %llx\n", aLSB, aMSB, vLSB, vMSB, (long long unsigned int)v64); + FILE_LOG(logDEBUG1, (" reg64(%x,%x) %x %x %llx\n", aLSB, aMSB, vLSB, vMSB, (long long unsigned int)v64)); return v64; } @@ -124,39 +122,33 @@ u_int32_t writeRegister(u_int32_t offset, u_int32_t data) { int mapCSP0(void) { // if not mapped if (CSP0BASE == 0) { - printf("Mapping memory\n"); + FILE_LOG(logINFO, ("Mapping memory\n")); #ifdef VIRTUAL CSP0BASE = malloc(MEM_SIZE); if (CSP0BASE == NULL) { - cprintf(BG_RED, "Error: Could not allocate virtual memory.\n"); + FILE_LOG(logERROR, ("Could not allocate virtual memory.\n")); return FAIL; } - printf("memory allocated\n"); + FILE_LOG(logINFO, (("memory allocated\n")); #else int fd; fd = open("/dev/mem", O_RDWR | O_SYNC, 0); if (fd == -1) { - cprintf(BG_RED, "Error: Can't find /dev/mem\n"); + FILE_LOG(logERROR, ("Can't find /dev/mem\n")); return FAIL; } -#ifdef VERBOSE - printf("/dev/mem opened\n"); -#endif + FILE_LOG(logDEBUG1, ("/dev/mem opened\n")); CSP0BASE = mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); if (CSP0BASE == MAP_FAILED) { - cprintf(BG_RED, "Error: Can't map memmory area\n"); + FILE_LOG(logERROR, ("Can't map memmory area\n")); return FAIL; } #endif - printf("CSPOBASE mapped from 0x%llx to 0x%llx\n", + FILE_LOG(logINFO, ("CSPOBASE mapped from 0x%llx to 0x%llx\n", (long long unsigned int)CSP0BASE, - (long long unsigned int)(CSP0BASE+MEM_SIZE)); - printf("Status Register: %08x\n",bus_r(STATUS_REG)); - + (long long unsigned int)(CSP0BASE+MEM_SIZE))); + FILE_LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG))); }else - printf("Memory already mapped before\n"); + FILE_LOG(logINFO, ("Memory already mapped before\n")); return OK; } - - -#endif //BLACKFIN_H diff --git a/slsDetectorServers/slsDetectorServer/commonServerFunctions.h b/slsDetectorServers/slsDetectorServer/commonServerFunctions.h index 55d30b8c4..67651e487 100755 --- a/slsDetectorServers/slsDetectorServer/commonServerFunctions.h +++ b/slsDetectorServers/slsDetectorServer/commonServerFunctions.h @@ -3,6 +3,8 @@ #ifndef GOTTHARDD //gotthard already had bus_w etc defined in its firmware_funcs.c (not yet made with common files) #include "blackfin.h" +#else +#include "ansi.h" #endif /* global variables */ @@ -54,13 +56,11 @@ void sendDataToSPI (u_int32_t* valw, u_int32_t addr, u_int32_t val, int numbitst void serializeToSPI(u_int32_t addr, u_int32_t val, u_int32_t csmask, int numbitstosend, u_int32_t clkmask, u_int32_t digoutmask, int digofset) { -#ifdef VERBOSE - if (numbitstosend == 16) - printf("Writing to SPI Register: 0x%04x\n",val); - else - printf("Writing to SPI Register: 0x%08x\n", val); -#endif - + if (numbitstosend == 16) { + FILE_LOG(logDEBUG1, ("Writing to SPI Register: 0x%04x\n", val)); + } else { + FILE_LOG(logDEBUG1, ("Writing to SPI Register: 0x%08x\n", val)); + } u_int32_t valw; SPIChipSelect (&valw, addr, csmask); diff --git a/slsDetectorServers/slsDetectorServer/communication_funcs.c b/slsDetectorServers/slsDetectorServer/communication_funcs.c index ea89d2747..1a4e7dcaf 100755 --- a/slsDetectorServers/slsDetectorServer/communication_funcs.c +++ b/slsDetectorServers/slsDetectorServer/communication_funcs.c @@ -1,14 +1,15 @@ - - #include "communication_funcs.h" #include "logger.h" -//#include /* for TCP_NODELAY */ -#include #include -#include #include -#include +#include +#include + +#define SEND_REC_MAX_SIZE 4096 +#define DEFAULT_PORTNO 1952 +#define DEFAULT_BACKLOG 5 + // Global variables from errno.h extern int errno; @@ -25,7 +26,6 @@ char mess[MAX_STR_LENGTH]; // Local variables char dummyClientIP[INET_ADDRSTRLEN] = ""; -const int send_rec_max_size = SEND_REC_MAX_SIZE; int myport = -1; // socket descriptor set fd_set readset, tempset; @@ -36,10 +36,6 @@ int isock = 0; int maxfd = 0; - - -#define DEFAULT_BACKLOG 5 - int bindSocket(unsigned short int port_number) { ret = FAIL; int socketDescriptor = -1; @@ -324,7 +320,7 @@ int receiveDataOnly(int file_des, void* buf,int length) { length, (isControlServer ? "control":"stop"))); while(length > 0) { - nreceiving = (length>send_rec_max_size) ? send_rec_max_size:length; // (condition) ? if_true : if_false + nreceiving = (length>SEND_REC_MAX_SIZE) ? SEND_REC_MAX_SIZE:length; // (condition) ? if_true : if_false nreceived = read(file_des,(char*)buf+total_received,nreceiving); if(!nreceived){ if(!total_received) { diff --git a/slsDetectorServers/slsDetectorServer/communication_funcs.h b/slsDetectorServers/slsDetectorServer/communication_funcs.h index 25cb8ef9a..cfe6806bc 100755 --- a/slsDetectorServers/slsDetectorServer/communication_funcs.h +++ b/slsDetectorServers/slsDetectorServer/communication_funcs.h @@ -1,21 +1,9 @@ #ifndef COMMUNICATION_FUNCS_H #define COMMUNICATION_FUNCS_H -#define SEND_REC_MAX_SIZE 4096 -#define DEFAULT_PORTNO 1952 -#include -#include - - -#include -#include -#include -#include #include "sls_detector_defs.h" - - typedef enum{ INT16, INT32, diff --git a/slsDetectorServers/slsDetectorServer/logger.h b/slsDetectorServers/slsDetectorServer/logger.h index 2bf350b2c..1d6d44a79 100644 --- a/slsDetectorServers/slsDetectorServer/logger.h +++ b/slsDetectorServers/slsDetectorServer/logger.h @@ -20,7 +20,7 @@ #endif typedef enum { -logERROR, logWARNING, logINFOBLUE, logINFOGREEN, logINFO, +logERROR, logWARNING, logINFOBLUE, logINFOGREEN, logINFORED, logINFO, logDEBUG, logDEBUG1, logDEBUG2, logDEBUG3, logDEBUG4, logDEBUG5 }TLogLevel; @@ -36,6 +36,7 @@ static inline void FILELOG_PrintLog(TLogLevel level, char* m) { case logWARNING: cprintf(YELLOW BOLD, "WARNING: %s", m); break; case logINFOBLUE: cprintf(BLUE, "INFO: %s", m); break; case logINFOGREEN: cprintf(GREEN, "INFO: %s", m); break; + case logINFORED: cprintf(RED, "INFO: %s", m); break; case logINFO: cprintf(RESET, "INFO: %s", m); break; case logDEBUG: cprintf(MAGENTA, "DEBUG: %s", m); break; case logDEBUG1: cprintf(MAGENTA, "DEBUG1: %s", m); break; diff --git a/slsDetectorServers/slsDetectorServer/programfpga.h b/slsDetectorServers/slsDetectorServer/programfpga.h index b37f521de..1b23c0b8a 100755 --- a/slsDetectorServers/slsDetectorServer/programfpga.h +++ b/slsDetectorServers/slsDetectorServer/programfpga.h @@ -1,19 +1,17 @@ -#ifndef PROGRAM_FPGA_H -#define PROGRAM_FPGA_H +#pragma once #include "ansi.h" -#include #include // usleep #include /* global variables */ #define CTRL_SRVR_INIT_TIME_US (300 * 1000) -int gpioDefined=0; -#define MTDSIZE 10 -char mtdvalue[MTDSIZE]; +#define MTDSIZE 10 +int gpioDefined = 0; +char mtdvalue[MTDSIZE] = {0}; /** @@ -27,9 +25,9 @@ void defineGPIOpins(){ //define their direction system("echo in > /sys/class/gpio/gpio7/direction"); system("echo out > /sys/class/gpio/gpio9/direction"); - printf("gpio pins defined\n"); + FILE_LOG(logINFO, ("gpio pins defined\n")); gpioDefined = 1; - }else printf("gpio pins already defined earlier\n"); + }else FILE_LOG(logDEBUG1, ("gpio pins already defined earlier\n")); } /** @@ -54,7 +52,7 @@ void FPGATouchFlash(){ * Reset FPGA */ void resetFPGA(){ - cprintf(BLUE,"\n*** Reseting FPGA ***\n"); + FILE_LOG(logINFOBLUE, ("Reseting FPGA\n")); FPGAdontTouchFlash(); FPGATouchFlash(); usleep(CTRL_SRVR_INIT_TIME_US); @@ -64,14 +62,12 @@ void resetFPGA(){ * Erasing flash */ void eraseFlash(){ -#ifdef VERY_VERBOSE - printf("\nErasing Flash\n"); -#endif + FILE_LOG(logDEBUG1, ("Erasing Flash\n")); char command[255]; memset(command, 0, 255); sprintf(command,"flash_eraseall %s",mtdvalue); system(command); - printf("Flash erased\n"); + FILE_LOG(logINFO, ("Flash erased\n")); } /** @@ -81,43 +77,40 @@ void eraseFlash(){ * @return 0 for success, 1 for fail (cannot open file for writing program) */ int startWritingFPGAprogram(FILE** filefp){ -#ifdef VERY_VERBOSE - printf("\nStart Writing of FPGA program\n"); -#endif + FILE_LOG(logDEBUG1, ("Start Writing of FPGA program\n")); //getting the drive char output[255]; memset(output, 0, 255); FILE* fp = popen("awk \'$4== \"\\\"bitfile(spi)\\\"\" {print $1}\' /proc/mtd", "r"); if (fp == NULL) { - cprintf(RED,"popen returned NULL. Need that to get mtd drive.\n"); + FILE_LOG(logERROR, ("popen returned NULL. Need that to get mtd drive.\n")); return 1; } if (fgets(output, sizeof(output), fp) == NULL) { - cprintf(RED,"fgets returned NULL. Need that to get mtd drive.\n"); + FILE_LOG(logERROR, ("fgets returned NULL. Need that to get mtd drive.\n")); return 1; } pclose(fp); - //cprintf(RED,"output: %s\n", output); memset(mtdvalue, 0, MTDSIZE); strcpy(mtdvalue,"/dev/"); char* pch = strtok(output,":"); if(pch == NULL){ - cprintf(RED,"Could not get mtd value\n"); + FILE_LOG(logERROR, ("Could not get mtd value\n")); return 1; } strcat(mtdvalue,pch); - printf ("\nFlash drive found: %s\n",mtdvalue); + FILE_LOG(logINFO, ("Flash drive found: %s\n", mtdvalue)); FPGAdontTouchFlash(); //writing the program to flash *filefp = fopen(mtdvalue, "w"); if(*filefp == NULL){ - cprintf(RED,"Unable to open %s in write mode\n",mtdvalue); + FILE_LOG(logERROR, ("Unable to open %s in write mode\n", mtdvalue)); return 1; } - printf("Flash ready for writing\n"); + FILE_LOG(logINFO, ("Flash ready for writing\n")); return 0; } @@ -128,9 +121,7 @@ int startWritingFPGAprogram(FILE** filefp){ * @param filefp pointer to flash */ void stopWritingFPGAprogram(FILE* filefp){ -#ifdef VERY_VERBOSE - printf("\nStopping of writing FPGA program\n"); -#endif + FILE_LOG(logDEBUG1, ("Stopping of writing FPGA program\n")); int wait = 0; if(filefp!= NULL){ @@ -142,9 +133,7 @@ void stopWritingFPGAprogram(FILE* filefp){ FPGATouchFlash(); if(wait){ -#ifdef VERY_VERBOSE - printf("Waiting for FPGA to program from flash\n"); -#endif + FILE_LOG(logDEBUG1, ("Waiting for FPGA to program from flash\n")); //waiting for success or done char output[255]; int res=0; @@ -153,12 +142,10 @@ void stopWritingFPGAprogram(FILE* filefp){ fgets(output, sizeof(output), sysFile); pclose(sysFile); sscanf(output,"%d",&res); -#ifdef VERY_VERBOSE - printf("gpi07 returned %d\n",res); -#endif + FILE_LOG(logDEBUG1, ("gpi07 returned %d\n", res)); } } - printf("FPGA has picked up the program from flash\n\n"); + FILE_LOG(logINFO, ("FPGA has picked up the program from flash\n")); } @@ -170,21 +157,15 @@ void stopWritingFPGAprogram(FILE* filefp){ * @return 0 for success, 1 for fail (cannot write) */ int writeFPGAProgram(char* fpgasrc, size_t fsize, FILE* filefp){ -#ifdef VERY_VERBOSE - printf("\nWriting of FPGA Program\n"); - cprintf(BLUE,"address of fpgasrc:%p\n",(void *)fpgasrc); - cprintf(BLUE,"fsize:%lu\n",fsize); - cprintf(BLUE,"pointer:%p\n",(void*)filefp); -#endif + FILE_LOG(logDEBUG1, ("Writing of FPGA Program\n" + "\taddress of fpgasrc:%p\n" + "\tfsize:%lu\n\tpointer:%p\n", + (void *)fpgasrc, fsize, (void*)filefp)); if(fwrite((void*)fpgasrc , sizeof(char) , fsize , filefp )!= fsize){ - cprintf(RED,"Could not write FPGA source to flash (size:%lu)\n", fsize); + FILE_LOG(logERROR, ("Could not write FPGA source to flash (size:%lu)\n", fsize)); return 1; } -#ifdef VERY_VERBOSE - cprintf(BLUE, "program written to flash\n"); -#endif + FILE_LOG(logDEBUG1, ("program written to flash\n")); return 0; } - -#endif //PROGRAM_FPGA_H diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h index 592083234..65c931855 100644 --- a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h @@ -37,9 +37,7 @@ u_int64_t getFirmwareAPIVersion(); u_int16_t getHardwareVersionNumber(); u_int16_t getHardwareSerialNumber(); #endif -#ifdef EIGERD u_int32_t getDetectorNumber(); -#endif u_int64_t getDetectorMAC(); u_int32_t getDetectorIP(); diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer.c index 3dd67b651..9758aee4e 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer.c @@ -2,16 +2,15 @@ The port number is passed as an argument */ #include "sls_detector_defs.h" -#include "slsDetectorServer_defs.h" #include "logger.h" #include "communication_funcs.h" #include "slsDetectorServer_funcs.h" +#include "slsDetectorServer_defs.h" -#include -#include #include #include + // Global variables from communication_funcs extern int isControlServer; extern int ret; diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c index c9cb8d366..cdb4a79e1 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c @@ -3,19 +3,19 @@ #include "communication_funcs.h" #include "logger.h" -#include #include #include +#include //defined in the detector specific Makefile #ifdef GOTTHARDD -const enum detectorType myDetectorType=GOTTHARD; +const enum detectorType myDetectorType = GOTTHARD; #elif EIGERD -const enum detectorType myDetectorType=EIGER; +const enum detectorType myDetectorType = EIGER; #elif JUNGFRAUD -const enum detectorType myDetectorType=JUNGFRAU; +const enum detectorType myDetectorType = JUNGFRAU; #else -const enum detectorType myDetectorType=GENERIC; +const enum detectorType myDetectorType = GENERIC; #endif // Global variables from communication_funcs @@ -64,7 +64,7 @@ void init_detector() { if (isControlServer) { basictests(); #ifdef JUNGFRAUD - if (debugflag == PROGRAMMING_MODE) + if (debugflag != PROGRAMMING_MODE) #endif initControlServer(); #ifdef EIGERD @@ -1331,53 +1331,54 @@ int set_timer(int file_des) { int get_time_left(int file_des) { - ret = OK; - memset(mess, 0, sizeof(mess)); - enum timerIndex ind = -1; - int64_t retval = -1; + ret = OK; + memset(mess, 0, sizeof(mess)); + enum timerIndex ind = -1; + int64_t retval = -1; - if (receiveData(file_des, &ind, sizeof(ind), INT32) < 0) - return printSocketReadError(); - FILE_LOG(logDEBUG1, ("Getting timer left index %d\n", ind)); + if (receiveData(file_des, &ind, sizeof(ind), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logDEBUG1, ("Getting timer left index %d\n", ind)); - // only get - // check index - switch(ind) { + // only get + // check index +#ifdef JUNGFRAUD + if (ind == DELAY_AFTER_TRIGGER) { + ret = FAIL; + sprintf(mess,"Timer Left Index (%d) is not implemented for this release.\n", (int)ind); + FILE_LOG(logERROR,(mess)); + } +#endif + if (ret == OK) { + switch(ind) { #ifdef EIGERD - case MEASURED_PERIOD: - case MEASURED_SUBPERIOD: + case MEASURED_PERIOD: + case MEASURED_SUBPERIOD: #elif JUNGFRAUD - case FRAMES_FROM_START: - case FRAMES_FROM_START_PG: + case FRAMES_FROM_START: + case FRAMES_FROM_START_PG: #elif GOTTHARDD - case GATES_NUMBER: + case GATES_NUMBER: #endif #if defined(GOTTHARDD) || defined(JUNGFRAUD) - case FRAME_NUMBER: - case ACQUISITION_TIME: - case FRAME_PERIOD: - case DELAY_AFTER_TRIGGER: - case CYCLES_NUMBER: - case PROGRESS: - case ACTUAL_TIME: - case MEASUREMENT_TIME: + case FRAME_NUMBER: + case ACQUISITION_TIME: + case FRAME_PERIOD: + case DELAY_AFTER_TRIGGER: + case CYCLES_NUMBER: + case PROGRESS: + case ACTUAL_TIME: + case MEASUREMENT_TIME: #endif - retval = getTimeLeft(ind); - FILE_LOG(logDEBUG1, ("Timer left index %d: %lld\n", ind, retval)); - break; -#ifdef JUNGFRAUD - case DELAY_AFTER_TRIGGER: - ret = FAIL; - sprintf(mess,"Timer Left Index (%d) is not implemented for this release.\n", (int)ind); - FILE_LOG(logERROR,(mess)); - break; -#endif - - default: - modeNotImplemented("Timer left index", (int)ind); - break; - } - return Server_SendResult(file_des, INT64, 1, &retval, sizeof(retval)); + retval = getTimeLeft(ind); + FILE_LOG(logDEBUG1, ("Timer left index %d: %lld\n", ind, retval)); + break; + default: + modeNotImplemented("Timer left index", (int)ind); + break; + } + } + return Server_SendResult(file_des, INT64, 1, &retval, sizeof(retval)); } @@ -1692,9 +1693,16 @@ int set_port(int file_des) { int update_client(int file_des) { - ret = OK; + ret = FORCE_UPDATE; memset(mess, 0, sizeof(mess)); +#ifdef JUNGFRAUD + if (debugflag == PROGRAMMING_MODE) { + ret = OK; + } +#endif Server_SendResult(file_des, INT32, 0, NULL, 0); + if (ret == OK) + return ret; return send_update(file_des); } @@ -1702,6 +1710,7 @@ int update_client(int file_des) { int send_update(int file_des) { + ret = OK; int n = 0; int i32 = -1; int64_t i64 = -1; @@ -1769,7 +1778,7 @@ int send_update(int file_des) { strcpy(lastClientIP,thisClientIP); } - return OK; + return ret; } @@ -2369,7 +2378,6 @@ int program_fpga(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); - FILE_LOG(logDEBUG1, ("Programming FPGA\n")); #ifndef JUNGFRAUD //to receive any arguments int n = 1; @@ -2405,7 +2413,7 @@ int program_fpga(int file_des) { if (receiveData(file_des,&filesize,sizeof(filesize),INT32) < 0) return printSocketReadError(); totalsize = filesize; - FILE_LOG(logDEBUG1, ("Total program size is: %d\n", totalsize); + FILE_LOG(logDEBUG1, ("Total program size is: %d\n", totalsize)); // opening file pointer to flash and telling FPGA to not touch flash if (startWritingFPGAprogram(&fp) != OK) { @@ -2430,8 +2438,7 @@ int program_fpga(int file_des) { if (unitprogramsize > filesize) //less than 2mb unitprogramsize = filesize; FILE_LOG(logDEBUG1, ("unit size to receive is:%d\n" - "filesize:%d currentpointer:%d\n", - unitprogramsize, filesize, currentPointer)); + "filesize:%d\n", unitprogramsize, filesize)); //receive part of program @@ -2462,8 +2469,8 @@ int program_fpga(int file_des) { fflush(stdout); } } - - FILE_LOG(logINFO("\nDone copying program\n")); + printf("\n"); + FILE_LOG(logINFO, ("Done copying program\n")); // closing file pointer to flash and informing FPGA stopWritingFPGAprogram(fp); @@ -2712,29 +2719,30 @@ int auto_comp_disable(int file_des) { int storage_cell_start(int file_des) { - ret = OK; - memset(mess, 0, sizeof(mess)); - int arg = -1; - int retval = -1; + ret = OK; + memset(mess, 0, sizeof(mess)); + int arg = -1; + int retval = -1; - if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) - return printSocketReadError(); - FILE_LOG(logDEBUG1, ("Setting Storage cell start to %d\n", arg)); + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logDEBUG1, ("Setting Storage cell start to %d\n", arg)); #ifndef JUNGFRAUD - functionNotImplemented(); + functionNotImplemented(); #else - // set & get - if ((arg == -1) || ((arg != -1) && (Server_VerifyLock() == OK))) { - if (arg > MAX_STORAGE_CELL_VAL) { - ret = FAIL; - strcpy(mess,"Max Storage cell number should not exceed 15\n"); - FILE_LOG(logERROR, (mess)); - } else { - retval = selectStoragecellStart(arg); - FILE_LOG(logDEBUG1, ("Storage cell start: %d\n", retval)); - validate(arg, retval, "set storage cell start", 0); - } + // set & get + if ((arg == -1) || ((arg != -1) && (Server_VerifyLock() == OK))) { + if (arg > MAX_STORAGE_CELL_VAL) { + ret = FAIL; + strcpy(mess,"Max Storage cell number should not exceed 15\n"); + FILE_LOG(logERROR, (mess)); + } else { + retval = selectStoragecellStart(arg); + FILE_LOG(logDEBUG1, ("Storage cell start: %d\n", retval)); + validate(arg, retval, "set storage cell start", 0); + } + } #endif return Server_SendResult(file_des, INT32, 1, &retval, sizeof(retval)); } diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h index 72829ec43..b37bf5aa7 100755 --- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.h @@ -1,6 +1,5 @@ #pragma once #include "sls_detector_defs.h" -#include // initialization functions int printSocketReadError(); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 6f3358e70..e0f5a2744 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -1430,8 +1430,9 @@ int slsDetector::updateDetector() { if (thisDetector->onlineFlag == ONLINE_FLAG && connectControl() == OK) { ret = thisDetectorControl->Client_Send(fnum, NULL, 0, NULL, 0); - // no ret handling as ret never fail - updateDetectorNoWait(); + // if it returns ok (jungfrau in programming mode), dont update + if (ret == FORCE_UPDATE) + ret = updateDetectorNoWait(); disconnectControl(); } return ret; @@ -4122,7 +4123,8 @@ int slsDetector::programFPGA(std::string fname) { //erasing flash if (ret != FAIL) { FILE_LOG(logINFO) << "This can take awhile. Please be patient..."; - printf("Erasing Flash: %d%%\r", 0); + FILE_LOG(logINFO) << "Erasing Flash:"; + printf("%d%%\r", 0); std::cout << std::flush; //erasing takes 65 seconds, printing here (otherwise need threads //in server-unnecessary) @@ -4131,12 +4133,13 @@ int slsDetector::programFPGA(std::string fname) { while(count > 0) { usleep(1 * 1000 * 1000); --count; - printf("Erasing Flash:%d%%\r", + printf("%d%%\r", (int) (((double)(ERASE_TIME - count) / ERASE_TIME) * 100)); std::cout << std::flush; } - std::cout << std::endl; - printf("Writing to Flash:%d%%\r", 0); + printf("\n"); + FILE_LOG(logINFO) << "Writing to Flash:"; + printf("%d%%\r", 0); std::cout << std::flush; } @@ -4160,16 +4163,17 @@ int slsDetector::programFPGA(std::string fname) { currentPointer += unitprogramsize; //print progress - printf("Writing to Flash:%d%%\r", + printf("%d%%\r", (int) (((double)(totalsize - filesize) / totalsize) * 100)); std::cout << std::flush; } else { + printf("\n"); controlSocket->ReceiveDataOnly(mess,sizeof(mess)); FILE_LOG(logERROR) << "Detector returned error: " << mess; setErrorMask((getErrorMask())|(PROGRAMMING_ERROR)); } } - std::cout << std::endl; + printf("\n"); //check ending error if ((ret == FAIL) && diff --git a/slsReceiverSoftware/CMakeLists.txt b/slsReceiverSoftware/CMakeLists.txt index ed85f8a98..f659522ce 100644 --- a/slsReceiverSoftware/CMakeLists.txt +++ b/slsReceiverSoftware/CMakeLists.txt @@ -31,9 +31,9 @@ if (USE_HDF5) endif (USE_HDF5) -add_definitions( - -DDACS_INT -DSLS_RECEIVER_UDP_FUNCTIONS -) +#add_definitions( +# -DVERBOSE +#) include_directories( include diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp index b50b400dd..7d000290b 100644 --- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp +++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp @@ -82,7 +82,7 @@ void slsReceiverImplementation::InitializeMembers() { //***connection parameters*** strcpy(eth,""); - for(int i=0;iGetMeasurementStartedFlag(); sum += it->GetNumTotalFramesCaught(); } @@ -220,7 +220,7 @@ uint64_t slsReceiverImplementation::getFramesCaught() const { uint64_t sum = 0; uint32_t flagsum = 0; - for (const auto& it : dataProcessor){ + for (const auto& it : dataProcessor) { flagsum += it->GetMeasurementStartedFlag(); sum += it->GetNumFramesCaught(); } @@ -235,7 +235,7 @@ int64_t slsReceiverImplementation::getAcquisitionIndex() const { uint64_t sum = 0; uint32_t flagsum = 0; - for (const auto& it : dataProcessor){ + for (const auto& it : dataProcessor) { flagsum += it->GetMeasurementStartedFlag(); sum += it->GetActualProcessedAcquisitionIndex(); } @@ -385,7 +385,7 @@ uint32_t slsReceiverImplementation::getActualUDPSocketBufferSize() const { /**initial parameters***/ -void slsReceiverImplementation::setDetectorHostname(const char *c){ +void slsReceiverImplementation::setDetectorHostname(const char *c) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; if(strlen(c)) @@ -411,7 +411,7 @@ void slsReceiverImplementation::setMultiDetectorSize(const int* size) { } -void slsReceiverImplementation::setFlippedData(int axis, int enable){ +void slsReceiverImplementation::setFlippedData(int axis, int enable) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; if(axis<0 || axis>1) return; @@ -436,8 +436,8 @@ int slsReceiverImplementation::setGapPixelsEnable(const bool b) { } -void slsReceiverImplementation::setFileFormat(const fileFormat f){ - switch(f){ +void slsReceiverImplementation::setFileFormat(const fileFormat f) { + switch(f) { #ifdef HDF5C case HDF5: fileFormatType = HDF5; @@ -455,7 +455,7 @@ void slsReceiverImplementation::setFileFormat(const fileFormat f){ } -void slsReceiverImplementation::setFileName(const char c[]){ +void slsReceiverImplementation::setFileName(const char c[]) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; if(strlen(c)) @@ -464,11 +464,11 @@ void slsReceiverImplementation::setFileName(const char c[]){ } -void slsReceiverImplementation::setFilePath(const char c[]){ +void slsReceiverImplementation::setFilePath(const char c[]) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; - if(strlen(c)){ + if(strlen(c)) { //check if filepath exists struct stat st; if(stat(c,&st) == 0) @@ -480,7 +480,7 @@ void slsReceiverImplementation::setFilePath(const char c[]){ } -void slsReceiverImplementation::setFileIndex(const uint64_t i){ +void slsReceiverImplementation::setFileIndex(const uint64_t i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; fileIndex = i; @@ -488,7 +488,7 @@ void slsReceiverImplementation::setFileIndex(const uint64_t i){ } -void slsReceiverImplementation::setFramesPerFile(const uint32_t i){ +void slsReceiverImplementation::setFramesPerFile(const uint32_t i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; framesPerFile = i; @@ -496,7 +496,7 @@ void slsReceiverImplementation::setFramesPerFile(const uint32_t i){ } -void slsReceiverImplementation::setFrameDiscardPolicy(const frameDiscardPolicy i){ +void slsReceiverImplementation::setFrameDiscardPolicy(const frameDiscardPolicy i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; if (i >= 0 && i < NUM_DISCARD_POLICIES) @@ -506,7 +506,7 @@ void slsReceiverImplementation::setFrameDiscardPolicy(const frameDiscardPolicy i } -void slsReceiverImplementation::setFramePaddingEnable(const bool i){ +void slsReceiverImplementation::setFramePaddingEnable(const bool i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; framePadding = i; @@ -514,8 +514,8 @@ void slsReceiverImplementation::setFramePaddingEnable(const bool i){ } -void slsReceiverImplementation::setFileWriteEnable(const bool b){ - if (fileWriteEnable != b){ +void slsReceiverImplementation::setFileWriteEnable(const bool b) { + if (fileWriteEnable != b) { fileWriteEnable = b; for (unsigned int i = 0; i < dataProcessor.size(); ++i) { dataProcessor[i]->SetupFileWriter(fileWriteEnable, (int*)numDet, @@ -529,7 +529,7 @@ void slsReceiverImplementation::setFileWriteEnable(const bool b){ } -void slsReceiverImplementation::setOverwriteEnable(const bool b){ +void slsReceiverImplementation::setOverwriteEnable(const bool b) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; overwriteEnable = b; @@ -538,21 +538,21 @@ void slsReceiverImplementation::setOverwriteEnable(const bool b){ /***connection parameters***/ -void slsReceiverImplementation::setUDPPortNumber(const uint32_t i){ +void slsReceiverImplementation::setUDPPortNumber(const uint32_t i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; udpPortNum[0] = i; FILE_LOG(logINFO) << "UDP Port Number[0]: " << udpPortNum[0]; } -void slsReceiverImplementation::setUDPPortNumber2(const uint32_t i){ +void slsReceiverImplementation::setUDPPortNumber2(const uint32_t i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; udpPortNum[1] = i; FILE_LOG(logINFO) << "UDP Port Number[1]: " << udpPortNum[1]; } -void slsReceiverImplementation::setEthernetInterface(const char* c){ +void slsReceiverImplementation::setEthernetInterface(const char* c) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; strcpy(eth, c); @@ -635,7 +635,7 @@ int slsReceiverImplementation::setStreamingFrequency(const uint32_t freq) { return OK; } -void slsReceiverImplementation::setStreamingTimer(const uint32_t time_in_ms){ +void slsReceiverImplementation::setStreamingTimer(const uint32_t time_in_ms) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; streamingTimerInMs = time_in_ms; @@ -680,21 +680,21 @@ void slsReceiverImplementation::setStreamingPort(const uint32_t i) { } -void slsReceiverImplementation::setStreamingSourceIP(const char c[]){ +void slsReceiverImplementation::setStreamingSourceIP(const char c[]) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; strcpy(streamingSrcIP, c); FILE_LOG(logINFO) << "Streaming Source IP: " << streamingSrcIP; } -void slsReceiverImplementation::setAdditionalJsonHeader(const char c[]){ +void slsReceiverImplementation::setAdditionalJsonHeader(const char c[]) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; strcpy(additionalJsonHeader, c); FILE_LOG(logINFO) << "Additional JSON Header: " << additionalJsonHeader; } -int slsReceiverImplementation::setAcquisitionPeriod(const uint64_t i){ +int slsReceiverImplementation::setAcquisitionPeriod(const uint64_t i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; acquisitionPeriod = i; @@ -704,7 +704,7 @@ int slsReceiverImplementation::setAcquisitionPeriod(const uint64_t i){ return OK; } -int slsReceiverImplementation::setAcquisitionTime(const uint64_t i){ +int slsReceiverImplementation::setAcquisitionTime(const uint64_t i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; acquisitionTime = i; @@ -714,21 +714,21 @@ int slsReceiverImplementation::setAcquisitionTime(const uint64_t i){ return OK; } -void slsReceiverImplementation::setSubExpTime(const uint64_t i){ +void slsReceiverImplementation::setSubExpTime(const uint64_t i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; subExpTime = i; FILE_LOG(logINFO) << "Sub Exposure Time: " << (double)subExpTime/(1E9) << "s"; } -void slsReceiverImplementation::setSubPeriod(const uint64_t i){ +void slsReceiverImplementation::setSubPeriod(const uint64_t i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; subPeriod = i; FILE_LOG(logINFO) << "Sub Exposure Period: " << (double)subPeriod/(1E9) << "s"; } -int slsReceiverImplementation::setNumberOfFrames(const uint64_t i){ +int slsReceiverImplementation::setNumberOfFrames(const uint64_t i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; numberOfFrames = i; @@ -794,7 +794,7 @@ int slsReceiverImplementation::setFifoDepth(const uint32_t i) { /***receiver parameters***/ -bool slsReceiverImplementation::setActivate(bool enable){ +bool slsReceiverImplementation::setActivate(bool enable) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; activated = enable; FILE_LOG(logINFO) << "Activation: " << stringEnable(activated); @@ -802,14 +802,14 @@ bool slsReceiverImplementation::setActivate(bool enable){ } -bool slsReceiverImplementation::setDeactivatedPadding(bool enable){ +bool slsReceiverImplementation::setDeactivatedPadding(bool enable) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; deactivatedPaddingEnable = enable; FILE_LOG(logINFO) << "Deactivated Padding Enable: " << stringEnable(deactivatedPaddingEnable); return deactivatedPaddingEnable; } -void slsReceiverImplementation::setSilentMode(const bool i){ +void slsReceiverImplementation::setSilentMode(const bool i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; silentMode = i; @@ -902,7 +902,7 @@ int slsReceiverImplementation::setDetectorType(const detectorType d) { -void slsReceiverImplementation::setDetectorPositionId(const int i){ +void slsReceiverImplementation::setDetectorPositionId(const int i) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; detID = i; FILE_LOG(logINFO) << "Detector Position Id:" << detID; @@ -983,7 +983,7 @@ int slsReceiverImplementation::startReceiver(char *c) { -void slsReceiverImplementation::stopReceiver(){ +void slsReceiverImplementation::stopReceiver() { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; FILE_LOG(logINFO) << "Stopping Receiver"; @@ -1061,9 +1061,9 @@ void slsReceiverImplementation::stopReceiver(){ -void slsReceiverImplementation::startReadout(){ +void slsReceiverImplementation::startReadout() { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; - if(status == RUNNING){ + if(status == RUNNING) { // wait for incoming delayed packets int totalPacketsReceived = 0; int previousValue=-1; @@ -1071,9 +1071,9 @@ void slsReceiverImplementation::startReadout(){ totalPacketsReceived += it->GetPacketsCaught(); //wait for all packets - const auto numPacketsToReceive = numberOfFrames * generalData->packetsPerFrame * listener.size(); - if(totalPacketsReceived != numPacketsToReceive){ - while(totalPacketsReceived != previousValue){ + const int numPacketsToReceive = numberOfFrames * generalData->packetsPerFrame * listener.size(); + if(totalPacketsReceived != numPacketsToReceive) { + while(totalPacketsReceived != previousValue) { FILE_LOG(logDEBUG3) << "waiting for all packets, previousValue:" << previousValue << " totalPacketsReceived: " << totalPacketsReceived; usleep(5*1000);/* TODO! Need to find optimal time **/ @@ -1119,7 +1119,7 @@ void slsReceiverImplementation::closeFiles() { int slsReceiverImplementation::restreamStop() { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; bool ret = OK; - for (const auto& it : dataStreamer){ + for (const auto& it : dataStreamer) { if (it->RestreamStop() == FAIL) ret = FAIL; } @@ -1134,24 +1134,24 @@ int slsReceiverImplementation::restreamStop() { /***callback functions***/ -void slsReceiverImplementation::registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg){ +void slsReceiverImplementation::registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg) { startAcquisitionCallBack=func; pStartAcquisition=arg; } -void slsReceiverImplementation::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){ +void slsReceiverImplementation::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg) { acquisitionFinishedCallBack=func; pAcquisitionFinished=arg; } void slsReceiverImplementation::registerCallBackRawDataReady(void (*func)(char* , - char*, uint32_t, void*),void *arg){ + char*, uint32_t, void*),void *arg) { rawDataReadyCallBack=func; pRawDataReady=arg; } void slsReceiverImplementation::registerCallBackRawDataModifyReady(void (*func)(char* , - char*, uint32_t&, void*),void *arg){ + char*, uint32_t&, void*),void *arg) { rawDataModifyReadyCallBack=func; pRawDataReady=arg; } @@ -1187,7 +1187,7 @@ void slsReceiverImplementation::SetLocalNetworkParameters() { void slsReceiverImplementation::SetThreadPriorities() { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; - for (const auto& it : listener){ + for (const auto& it : listener) { if (it->SetThreadPriority(LISTENER_PRIORITY) == FAIL) { FILE_LOG(logWARNING) << "Could not prioritize listener threads. (No Root Privileges?)"; return; @@ -1288,15 +1288,15 @@ int slsReceiverImplementation::SetupWriter() { void slsReceiverImplementation::StartRunning() { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; //set running mask and post semaphore to start the inner loop in execution thread - for (const auto& it : listener){ + for (const auto& it : listener) { it->StartRunning(); it->Continue(); } - for (const auto& it : dataProcessor){ + for (const auto& it : dataProcessor) { it->StartRunning(); it->Continue(); } - for (const auto& it : dataStreamer){ + for (const auto& it : dataStreamer) { it->StartRunning(); it->Continue(); } diff --git a/slsSupportLib/include/genericSocket.h b/slsSupportLib/include/genericSocket.h index e405abb90..32bb9230c 100644 --- a/slsSupportLib/include/genericSocket.h +++ b/slsSupportLib/include/genericSocket.h @@ -689,8 +689,9 @@ public: if(nsent == header_packet_size) continue; if(nsent != nsending){ - if(nsent && (nsent != -1)) + if(nsent && (nsent != -1)) { FILE_LOG(logERROR) << "Incomplete Packet size " << nsent; + } break; } length-=nsent; @@ -707,8 +708,9 @@ public: if(nsent<=0 || nsent == packet_size) break; //incomplete packets or header packets ignored and read buffer again - if(nsent != packet_size && nsent != header_packet_size) + if(nsent != packet_size && nsent != header_packet_size) { FILE_LOG(logERROR) << portno << ": Incomplete Packet size " << nsent; + } } //nsent = 1040; if(nsent > 0)total_sent+=nsent; diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 080d2def9..fd098d0b9 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -1,6 +1,6 @@ /** API versions */ #define APIRECEIVER 0x180927 -#define APIEIGER 0x181008 -#define APIJUNGFRAU 0x181008 +#define APIEIGER 0x181031 +#define APIJUNGFRAU 0x181102 #define APIGOTTHARD 0x181009