From 45b00c4e7d2c4d8e75d55406f41f224fca86b72b Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 9 Oct 2018 10:24:17 +0200 Subject: [PATCH] gotthard server updated, yet to run --- .../gotthardDetectorServer/Makefile | 9 +- .../gotthardDetectorServer/Makefile.virtual | 4 +- .../gotthardDetectorServer/firmware_funcs.c | 2502 +++++++------- .../gotthardDetectorServer/firmware_funcs.h | 135 +- .../gotthardDetectorServer/gitInfo.txt | 14 +- .../gotthardDetectorServer/gitInfoGotthard.h | 10 +- .../gotthardDetectorServer_refactor | Bin 0 -> 86112 bytes .../gotthardDetectorServer/mcb_funcs.c | 2340 ------------- .../gotthardDetectorServer/mcb_funcs.h | 183 - .../gotthardDetectorServer/server_defs.h | 67 +- .../gotthardDetectorServer/server_funcs.c | 3040 ++++++----------- .../gotthardDetectorServer/server_funcs.h | 49 +- 12 files changed, 2482 insertions(+), 5871 deletions(-) create mode 100755 slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gotthardDetectorServer_refactor delete mode 100755 slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/mcb_funcs.c delete mode 100755 slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/mcb_funcs.h diff --git a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/Makefile b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/Makefile index fc5720dfd..e343351d2 100755 --- a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/Makefile +++ b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/Makefile @@ -1,12 +1,7 @@ -# $Id: Makefile,v 1.1.1.1 2006/02/04 03:35:01 freza Exp $ -# first compile -# make cris-axis-linux-gnu - - CROSS = bfin-uclinux- CC = $(CROSS)gcc -CFLAGS += -Wall -DGOTTHARDD -DMCB_FUNCS -DDEBUG # -DVERBOSE #-DVERYVERBOSE #-DVIRTUAL #-DDACS_INT_CSERVER +CFLAGS += -Wall -DGOTTHARDD -DDEBUG # -DVERBOSE #-DVERYVERBOSE #-DVIRTUAL PROGS= gotthardDetectorServer @@ -16,7 +11,7 @@ INSTMODE= 0777 BINS = testlib_sharedlibc -SRCS = server.c firmware_funcs.c server_funcs.c communication_funcs.c mcb_funcs.c +SRCS = server.c firmware_funcs.c server_funcs.c communication_funcs.c OBJS = $(SRCS:%.c=%.o) diff --git a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/Makefile.virtual b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/Makefile.virtual index 0a26d5378..8574cbec7 100755 --- a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/Makefile.virtual +++ b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/Makefile.virtual @@ -2,13 +2,13 @@ DESTDIR ?= ./ CC = gcc -CFLAGS += -Wall -DGOTTHARDD -DMCB_FUNCS -DDEBUG -DVIRTUAL +CFLAGS += -Wall -DGOTTHARDD -DVIRTUAL PROGS= $(DESTDIR)/gotthardDetectorServer_virtual -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c +SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c OBJS = $(SRCS:%.c=%.o) gotthardVirtualServer = $(PROGS) diff --git a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/firmware_funcs.c b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/firmware_funcs.c index 3238da0a4..d977b04e4 100755 --- a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/firmware_funcs.c @@ -1,7 +1,6 @@ #include "server_defs.h" #include "firmware_funcs.h" -#include "mcb_funcs.h" #include "registers_g.h" #include @@ -12,41 +11,20 @@ #include -//for memory mapping u_int64_t CSP0BASE; - -FILE *debugfp, *datafp; - -int fr; -int wait_time; -int *fifocntrl; - -//int *statusreg; commented out by dhanya -const int nModY=1; -int nModBoard; -int nModX=NMAXMOD; -int dynamicRange=16;//32; -int dataBytes=NMAXMOD*NCHIP*NCHAN*2; -int storeInRAM=0; -int ROI_flag=0; -int adcConfigured=-1; - -int ram_size=0; - -int64_t totalTime=1; -u_int32_t progressMask=0; - int phase_shift=DEFAULT_PHASE_SHIFT; int ipPacketSize=DEFAULT_IP_PACKETSIZE; int udpPacketSize=DEFAULT_UDP_PACKETSIZE; -int ififostart, ififostop, ififostep, ififo; - -int masterMode=NO_MASTER, syncMode=NO_SYNCHRONIZATION, timingMode=AUTO_TIMING; - -enum externalSignalFlag signalMode=EXT_SIG_OFF; - +int timingMode=AUTO_TIMING; +enum externalSignalFlag signalMode=EXT_SIG_OFF; +int ROI_flag=0; +int adcConfigured=-1; +int detectorFirstServer = 1; +enum detectorSettings thisSettings; +ROI rois[MAX_ROIS]; +int nROI=0; //for the 25um detectors int masterflags = NO_MASTER; @@ -58,185 +36,229 @@ int slaveadcphase = 0; int rsttosw1delay = 2; int startacqdelay = 1; -int detectorFirstServer = 1; - - -#ifdef MCB_FUNCS -extern const int nChans; -extern const int nChips; -//extern const int nDacs; -//extern const int nAdcs; -#endif -#ifndef MCB_FUNCS - -const int nChans=NCHAN; -const int nChips=NCHIP; -const int nDacs=NDAC; -const int nAdcs=NADC; -#endif - +sls_detector_module *detectorModules=NULL; +int *detectorDacs=NULL; +int *detectorAdcs=NULL; /** ENEt conf structs -*/ + */ typedef struct mac_header_struct{ - u_int8_t mac_dest_mac2; - u_int8_t mac_dest_mac1; - u_int8_t mac_dummy1; - u_int8_t mac_dummy2; - u_int8_t mac_dest_mac6; - u_int8_t mac_dest_mac5; - u_int8_t mac_dest_mac4; - u_int8_t mac_dest_mac3; - u_int8_t mac_src_mac4; - u_int8_t mac_src_mac3; - u_int8_t mac_src_mac2; - u_int8_t mac_src_mac1; - u_int16_t mac_ether_type; - u_int8_t mac_src_mac6; - u_int8_t mac_src_mac5; + u_int8_t mac_dest_mac2; + u_int8_t mac_dest_mac1; + u_int8_t mac_dummy1; + u_int8_t mac_dummy2; + u_int8_t mac_dest_mac6; + u_int8_t mac_dest_mac5; + u_int8_t mac_dest_mac4; + u_int8_t mac_dest_mac3; + u_int8_t mac_src_mac4; + u_int8_t mac_src_mac3; + u_int8_t mac_src_mac2; + u_int8_t mac_src_mac1; + u_int16_t mac_ether_type; + u_int8_t mac_src_mac6; + u_int8_t mac_src_mac5; } mac_header; typedef struct ip_header_struct { - u_int16_t ip_len; - u_int8_t ip_tos; - u_int8_t ip_ihl:4 ,ip_ver:4; - u_int16_t ip_offset:13,ip_flag:3; - u_int16_t ip_ident; - u_int16_t ip_chksum; - u_int8_t ip_protocol; - u_int8_t ip_ttl; - u_int32_t ip_sourceip; - u_int32_t ip_destip; + u_int16_t ip_len; + u_int8_t ip_tos; + u_int8_t ip_ihl:4 ,ip_ver:4; + u_int16_t ip_offset:13,ip_flag:3; + u_int16_t ip_ident; + u_int16_t ip_chksum; + u_int8_t ip_protocol; + u_int8_t ip_ttl; + u_int32_t ip_sourceip; + u_int32_t ip_destip; } ip_header; typedef struct udp_header_struct{ - u_int16_t udp_destport; - u_int16_t udp_srcport; - u_int16_t udp_chksum; - u_int16_t udp_len; + u_int16_t udp_destport; + u_int16_t udp_srcport; + u_int16_t udp_chksum; + u_int16_t udp_len; } udp_header; typedef struct mac_conf_struct{ - mac_header mac; - ip_header ip; - udp_header udp; - u_int32_t npack; - u_int32_t lpack; - u_int32_t npad; - u_int32_t cdone; + mac_header mac; + ip_header ip; + udp_header udp; + u_int32_t npack; + u_int32_t lpack; + u_int32_t npad; + u_int32_t cdone; } mac_conf; typedef struct tse_conf_struct{ - u_int32_t rev; //0x0 - u_int32_t scratch; - u_int32_t command_config; - u_int32_t mac_0; //0x3 - u_int32_t mac_1; - u_int32_t frm_length; - u_int32_t pause_quant; - u_int32_t rx_section_empty; //0x7 - u_int32_t rx_section_full; - u_int32_t tx_section_empty; - u_int32_t tx_section_full; - u_int32_t rx_almost_empty; //0xB - u_int32_t rx_almost_full; - u_int32_t tx_almost_empty; - u_int32_t tx_almost_full; - u_int32_t mdio_addr0; //0xF - u_int32_t mdio_addr1; + u_int32_t rev; //0x0 + u_int32_t scratch; + u_int32_t command_config; + u_int32_t mac_0; //0x3 + u_int32_t mac_1; + u_int32_t frm_length; + u_int32_t pause_quant; + u_int32_t rx_section_empty; //0x7 + u_int32_t rx_section_full; + u_int32_t tx_section_empty; + u_int32_t tx_section_full; + u_int32_t rx_almost_empty; //0xB + u_int32_t rx_almost_full; + u_int32_t tx_almost_empty; + u_int32_t tx_almost_full; + u_int32_t mdio_addr0; //0xF + u_int32_t mdio_addr1; }tse_conf; int mapCSP0(void) { - printf("Mapping memory\n"); + printf("Mapping memory\n"); #ifndef VIRTUAL - int fd; - fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) { - printf("\nCan't find /dev/mem!\n"); - return FAIL; - } - printf("/dev/mem opened\n"); + int fd; + fd = open("/dev/mem", O_RDWR | O_SYNC, 0); + if (fd == -1) { + printf("\nCan't find /dev/mem!\n"); + return FAIL; + } + printf("/dev/mem opened\n"); - CSP0BASE = (u_int32_t)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); - if (CSP0BASE == (u_int32_t)MAP_FAILED) { - printf("\nCan't map memmory area!!\n"); - return FAIL; - } - printf("CSP0 mapped\n"); + CSP0BASE = (u_int32_t)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); + if (CSP0BASE == (u_int32_t)MAP_FAILED) { + printf("\nCan't map memmory area!!\n"); + return FAIL; + } + printf("CSP0 mapped\n"); #endif #ifdef VIRTUAL - CSP0BASE = malloc(MEM_SIZE); - printf("memory allocated\n"); + CSP0BASE = malloc(MEM_SIZE); + printf("memory allocated\n"); #endif -#ifdef SHAREDMEMORY - if ( (res=inism(SMSV))<0) { - printf("error attaching shared memory! %i",res); - return FAIL; - } -#endif - printf("CSPObase is 0x%llx \n",CSP0BASE); - printf("CSPOBASE=from %llx to %llx\n",CSP0BASE,CSP0BASE+MEM_SIZE); + printf("CSPObase is 0x%llx \n",CSP0BASE); + printf("CSPOBASE=from %llx to %llx\n",CSP0BASE,CSP0BASE+MEM_SIZE); - printf("statusreg=%08x\n",bus_r(STATUS_REG)); - printf("\n\n"); - return OK; + printf("statusreg=%08x\n",bus_r(STATUS_REG)); + printf("\n\n"); + return OK; } u_int16_t bus_r16(u_int32_t offset){ - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - return *ptr1; + volatile u_int16_t *ptr1; + ptr1=(u_int16_t*)(CSP0BASE+offset*2); + return *ptr1; } u_int16_t bus_w16(u_int32_t offset, u_int16_t data) { - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - *ptr1=data; - return OK; + volatile u_int16_t *ptr1; + ptr1=(u_int16_t*)(CSP0BASE+offset*2); + *ptr1=data; + return OK; } -/** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG */ -u_int16_t ram_w16(u_int32_t ramType, int adc, int adcCh, int Ch, u_int16_t data) { - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - // printf("Writing to addr:%x\n",adr); - return bus_w16(adr,data); -} - -/** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG */ -u_int16_t ram_r16(u_int32_t ramType, int adc, int adcCh, int Ch){ - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - // printf("Reading from addr:%x\n",adr); - return bus_r16(adr); -} u_int32_t bus_w(u_int32_t offset, u_int32_t data) { - volatile u_int32_t *ptr1; + volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - *ptr1=data; + ptr1=(u_int32_t*)(CSP0BASE+offset*2); + *ptr1=data; - return OK; + return OK; } u_int32_t bus_r(u_int32_t offset) { - volatile u_int32_t *ptr1; + volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - return *ptr1; + ptr1=(u_int32_t*)(CSP0BASE+offset*2); + return *ptr1; } +int initDetector() { +#ifdef VERBOSE + printf("Board is for 1 module\n"); +#endif + 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",(unsigned int)(detectorModules), (unsigned int)(detectorModules)); + printf("dacs from 0x%x to 0x%x\n",(unsigned int)(detectorDacs), (unsigned int)(detectorDacs)); + printf("adcs from 0x%x to 0x%x\n",(unsigned int)(detectorAdcs), (unsigned int)(detectorAdcs)); +#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; + + + thisSettings=UNINITIALIZED; + + testFpga(); + + //gotthard specific + setPhaseShiftOnce(); + configureADC(); + setADC(-1); //already does setdaqreg and clean fifo. + + setSettings(DYNAMICGAIN); + setDefaultDacs(); + + + //Initialization + setFrames(1); + setTrains(1); + setExposureTime(1e6); + setPeriod(1e9); + setDelay(0); + setGates(0); + setTiming(GET_EXTERNAL_COMMUNICATION_MODE); + sendviaUDP(1); + setMasterSlaveConfiguration(); + + return OK; +} + + +int setDefaultDacs() { + printf("Setting Default Dac values\n"); + + int ret = OK; + int i = 0; + int retval[2]={-1,-1}; + const int defaultvals[NDAC] = DEFAULT_DAC_VALS; + + for(i = 0; i < NDAC; ++i) { + // if not already default, set it to default + if (setDACRegister(i, -1) != defaultvals[i]) { + setDAC(i, defaultvals[i], 0, retval); + if (abs(retval[0] - defaultvals[i])<=3) { + cprintf(RED, "Warning: Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval[0]); + ret = FAIL; + } + } + } + + return ret; +} + + + + + void setMasterSlaveConfiguration(){ -// global master default delay picked from config file + // global master default delay picked from config file FILE* fd=fopen(CONFIG_FILE,"r"); if(fd==NULL){ cprintf(RED,"\nWarning: Could not open file\n"); @@ -295,8 +317,8 @@ void setMasterSlaveConfiguration(){ slaveadcphase = ival; else if (!strcasecmp(key,"rsttosw1delay")) rsttosw1delay = ival; - else if (!strcasecmp(key,"startacqdelay")) - startacqdelay = ival; + else if (!strcasecmp(key,"startacqdelay")) + startacqdelay = ival; else { cprintf(RED,"could not scan parameter name %s from config file\n",key); fclose(fd); @@ -313,7 +335,7 @@ void setMasterSlaveConfiguration(){ "slavepatternphase:%d\n" "slaveadcphase:%d\n" "rsttosw1delay:%d\n" - "startacqdelay:%d\n", + "startacqdelay:%d\n", masterflags, masterdefaultdelay, patternphase, @@ -349,20 +371,20 @@ void setMasterSlaveConfiguration(){ val = (val & (~(PLL_CLK_SEL_MSK))) | PLL_CLK_SEL_SLAVE_ADC_VAL; bus_w(MULTI_PURPOSE_REG,val); setPhaseShift(slaveadcphase); - /* Set start acq delay */ - val=bus_r(MULTI_PURPOSE_REG); + /* Set start acq delay */ + val=bus_r(MULTI_PURPOSE_REG); #ifdef VERBOSE - printf("Multipurpose reg:0x%x\n",bus_r(MULTI_PURPOSE_REG)); + printf("Multipurpose reg:0x%x\n",bus_r(MULTI_PURPOSE_REG)); #endif - val = (val & (~(START_ACQ_DELAY_MSK))) | ((startacqdelay << START_ACQ_DELAY_OFFSET) & (START_ACQ_DELAY_MSK)); - bus_w(MULTI_PURPOSE_REG,val); - printf("Start acq delay set. Multipurpose reg: 0x%x\n",bus_r(MULTI_PURPOSE_REG)); + val = (val & (~(START_ACQ_DELAY_MSK))) | ((startacqdelay << START_ACQ_DELAY_OFFSET) & (START_ACQ_DELAY_MSK)); + bus_w(MULTI_PURPOSE_REG,val); + printf("Start acq delay set. Multipurpose reg: 0x%x\n",bus_r(MULTI_PURPOSE_REG)); } /* Set RST to SW1 delay */ val=bus_r(MULTI_PURPOSE_REG); #ifdef VERBOSE - printf("Multipurpose reg:0x%x\n",bus_r(MULTI_PURPOSE_REG)); + printf("Multipurpose reg:0x%x\n",bus_r(MULTI_PURPOSE_REG)); #endif val = (val & (~(RST_TO_SW1_DELAY_MSK))) | ((rsttosw1delay << RST_TO_SW1_DELAY_OFFSET) & (RST_TO_SW1_DELAY_MSK)); bus_w(MULTI_PURPOSE_REG,val); @@ -372,6 +394,73 @@ void setMasterSlaveConfiguration(){ } + + +int configureADC(){ + printf("Preparing ADC\n"); + u_int32_t valw,codata,csmask; + int i,j,cdx,ddx; + cdx=0; ddx=1; + csmask=0x7c; // 1111100 + + for(j=0;j<3;j++){ + //command and value; + codata = 0; + if(j==0) + codata=(0x08<<8)+(0x3);//Power modes(global) //reset + else if(j==1) + codata=(0x08<<8)+(0x0);//Power modes(global) //chip run + else + codata = (0x14<<8)+(0x0);//Output mode //offset binary + + + // start point + valw=0xffffffff; + bus_w(ADC_SPI_REG,(valw)); + + //chip sel bar down + valw=((0xffffffff&(~csmask))); + bus_w(ADC_SPI_REG,valw); + + for (i=0;i<24;i++) { + //cldwn + valw=valw&(~(0x1<>(23-i))&0x1)<=0) { - bus_w(CONFIG_REG,d); - } + if (d>=0) { + bus_w(CONFIG_REG,d); + } #ifdef VERBOSE - printf("configuration register is %x", bus_r(CONFIG_REG)); + printf("configuration register is %x", bus_r(CONFIG_REG)); #endif - return bus_r(CONFIG_REG); -} - -int setToT(int d) { - //int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting ToT to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: ToT is %x\n", reg); -#endif - if (d>0) { - bus_w(CONFIG_REG,reg|TOT_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~TOT_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("ToT is %x\n", reg); -#endif - if (reg&TOT_ENABLE_BIT) - return 1; - else - return 0; -} - -int setContinousReadOut(int d) { - //int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting Continous readout to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: Continous readout is %x\n", reg); -#endif - if (d>0) { - bus_w(CONFIG_REG,reg|CONT_RO_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~CONT_RO_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Continous readout is %x\n", reg); -#endif - if (reg&CONT_RO_ENABLE_BIT) - return 1; - else - return 0; + return bus_r(CONFIG_REG); } -int startReceiver(int start) { + + +int sendviaUDP(int start) { u_int32_t addr=CONFIG_REG; #ifdef VERBOSE if(start) @@ -746,9 +631,9 @@ int startReceiver(int start) { bus_w(CONFIG_REG,reg&(~CPU_OR_RECEIVER_BIT)); reg=bus_r(addr); -//#ifdef VERBOSE + //#ifdef VERBOSE printf("Config Reg %x\n", reg); -//#endif + //#endif int d =reg&CPU_OR_RECEIVER_BIT; if(d!=0) d=1; if(d!=start) @@ -758,6 +643,183 @@ int startReceiver(int start) { } + + + + +int setDACRegister(int idac, int val) { + u_int32_t addr, reg, mask; + int off; +#ifdef VERBOSE + if(val==-1) + printf("Getting dac register%d \n",idac); + else + printf("Setting dac register %d to %d\n",idac,val); +#endif + + switch(idac){ + case 0: + case 1: + case 2: + addr=MOD_DACS1_REG; + break; + case 3: + case 4: + case 5: + addr=MOD_DACS2_REG; + break; + case 6: + case 7: + addr=MOD_DACS3_REG; + break; + default: + printf("weird idac value %d\n",idac); + return -1; + break; + } + //saving only the msb + val=val>>2; + + off=(idac%3)*10; + mask=~((0x3ff)<=0 && val>off)&0x3ff; + //since we saved only the msb + val=val<<2; + + //val=(bus_r(addr)>>off)&0x3ff; + + +#ifdef VERBOSE + printf("Dac %d register is %d\n\n",idac,val); +#endif + return val; +} + + + + + + + + + +u_int32_t setExtSignal(enum externalSignalFlag mode) { + + u_int32_t c; + c = bus_r(EXT_SIGNAL_REG); + +#ifdef VERBOSE + printf("settings signal variable number %d to value %04x\n", d, signals[d]); +#endif + + switch (mode) { + case TRIGGER_IN_RISING_EDGE: + case TRIGGER_IN_FALLING_EDGE: + + // set variable + signalMode = mode; + + // set signal only if trigger mode + if (timingMode==TRIGGER_EXPOSURE) + setFPGASignal(mode); + // switch off if not trigger mode, but variable remembers value + else + setFPGASignal(SIGNAL_OFF); + break; + + default: + mode = SIGNAL_OFF; + signalMode = mode; + setFPGASignal(mode); + break; + } + + return getExtSignal(); +} + + +int getExtSignal() { + return signalMode; +} + + +u_int32_t setFPGASignal(enum externalSignalFlag mode) { + + u_int32_t c = bus_r(EXT_SIGNAL_REG); + // offset is 0 as we only deal with the first signal index now. //int off = d * SIGNAL_OFFSET; + + // check and then write + if ((mode == SIGNAL_OFF) || (mode == TRIGGER_IN_RISING_EDGE) || (mode == TRIGGER_IN_FALLING_EDGE)) { +#ifdef VERBOSE + printf("writing signal register number %d mode %04x\n",0, (int) mode); +#endif + bus_w(EXT_SIGNAL_REG,( (c &~ (SIGNAL_MASK)) | ((int)mode) )); + } + return getFPGASignal(); +} + + + + +int getFPGASignal() { + + // offset is 0 as we only deal with the first signal index now. //int off = d * SIGNAL_OFFSET; + int mode = ((bus_r(EXT_SIGNAL_REG)) & SIGNAL_MASK); + + // check and then update variable + if ((mode == SIGNAL_OFF) || (mode == TRIGGER_IN_RISING_EDGE) || (mode == TRIGGER_IN_FALLING_EDGE)) { +#ifdef VERYVERBOSE + printf("gettings signal register number %d value %04x\n", d, (int)mode); +#endif + return (int)mode; + } else + return -1; +} + + + + + +int setTiming(int ti) { + + // set + if (ti != GET_EXTERNAL_COMMUNICATION_MODE) { + + // trigger + if (ti == TRIGGER_EXPOSURE) { + timingMode = ti; + if ((signalMode == TRIGGER_IN_RISING_EDGE) || (signalMode == TRIGGER_IN_FALLING_EDGE)) + setFPGASignal(signalMode); + else + setFPGASignal(SIGNAL_OFF); // only if both (timing & extsig) configured, its set to trigger, else off + } + + // auto + else { + timingMode = AUTO_TIMING; + setFPGASignal(SIGNAL_OFF); + } + } + + // get + int s = getFPGASignal(); + if ((s == TRIGGER_IN_RISING_EDGE) || (s == TRIGGER_IN_FALLING_EDGE)) + return TRIGGER_EXPOSURE; + return AUTO_TIMING; +} + + + + + + u_int64_t getDetectorNumber() { char output[255],mac[255]=""; u_int64_t res=0; @@ -776,436 +838,346 @@ u_int64_t getDetectorNumber() { } u_int32_t getFirmwareVersion() { - return bus_r(FPGA_VERSION_REG); + return bus_r(FPGA_VERSION_REG); } u_int32_t getFirmwareSVNVersion(){ - return bus_r(FPGA_SVN_REG); + return bus_r(FPGA_SVN_REG); } -// for fpga test +// for fpga test u_int32_t testFpga(void) { - printf("Testing FPGA:\n"); - volatile u_int32_t val,addr,val2; - int result=OK,i; - //fixed pattern - val=bus_r(FIX_PATT_REG); - if (val==FIXED_PATT_VAL) { - printf("fixed pattern ok!! %08x\n",val); - } else { - printf("fixed pattern wrong!! %08x\n",val); - result=FAIL; - } - - //dummy register - addr = DUMMY_REG; - for(i=0;i<1000000;i++) - { - val=0x5A5A5A5A-i; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x5A5A5A5A-i) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of %x \n",i,val,0x5A5A5A5A-i); - result=FAIL; - } - val=(i+(i<<10)+(i<<20)); - bus_w(addr, val); - val2=bus_r(addr); - if (val2!=val) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! read %x instead of %x.\n",i,val2,val); - result=FAIL; - } - val=0x0F0F0F0F; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x0F0F0F0F) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0x0F0F0F0F \n",i,val); - result=FAIL; - } - val=0xF0F0F0F0; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0xF0F0F0F0) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0xF0F0F0F0 \n\n",i,val); - result=FAIL; - } - } - if(result==OK) - { - printf("----------------------------------------------------------------------------------------------"); - printf("\nATTEMPT 1000000: FPGA DUMMY REGISTER OK!!!\n"); - printf("----------------------------------------------------------------------------------------------"); - } - printf("\n"); - return result; -} - - -int getNModBoard() { - return nModX; -} - -int setNMod(int n) { - return nModX; -} - - -// fifo test -int testFifos(void) { - printf("Fifo test not implemented!\n"); - bus_w16(CONTROL_REG, START_FIFOTEST_BIT); - bus_w16(CONTROL_REG, 0x0); - return OK; -} - - - -// program dacq settings - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - if (value!=-1) { - vLSB=value&(0xffffffff); - bus_w(aLSB,vLSB); - v64=value>> 32; - vMSB=v64&(0xffffffff); - bus_w(aMSB,vMSB); - } - return get64BitReg(aLSB, aMSB); - -} - -int64_t get64BitReg(int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - vLSB=bus_r(aLSB); - vMSB=bus_r(aMSB); - v64=vMSB; - v64=(v64<<32) | vLSB; - return v64; -} - -int64_t setFrames(int64_t value){ - return set64BitReg(value, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); -} - -int64_t getFrames(){ - return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); -} - -int64_t setExposureTime(int64_t value){ - /* time is in ns */ - if (value!=-1) { - value = (value * 1E-3 * CLK_FREQ ) + 0.5; - } - return (set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t getExposureTime(){ - return (get64BitReg(GET_EXPTIME_LSB_REG, GET_EXPTIME_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t setGates(int64_t value){ - return set64BitReg(value, SET_GATES_LSB_REG, SET_GATES_MSB_REG); -} - -int64_t getGates(){ - return get64BitReg(GET_GATES_LSB_REG, GET_GATES_MSB_REG); -} - -int64_t setPeriod(int64_t value){ - /* time is in ns */ - if (value!=-1) { - value = (value * 1E-3 * CLK_FREQ ) + 0.5; - } - return (set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t getPeriod(){ - return (get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t setDelay(int64_t value){ - /* time is in ns */ - if (value!=-1) { - if (masterflags == IS_MASTER) { - value += masterdefaultdelay; - cprintf(BLUE,"Actual delay for master: %lld\n", (long long int) value); - } - value = (value * 1E-3 * CLK_FREQ ) + 0.5; - } - int64_t retval = (set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; - if (masterflags == IS_MASTER) { - cprintf(BLUE,"Actual delay read from master: %lld\n", (long long int) retval); - retval -= masterdefaultdelay; - } - - return retval; -} - -int64_t getDelay(){ - return (get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t setTrains(int64_t value){ - return set64BitReg(value, SET_TRAINS_LSB_REG, SET_TRAINS_MSB_REG); -} - -int64_t getTrains(){ - return get64BitReg(GET_TRAINS_LSB_REG, GET_TRAINS_MSB_REG); -} - - -int64_t setProbes(int64_t value){ - return 0; -} - - -int64_t setProgress() { - //????? eventually call after setting the registers -return 0; - -} - - -int64_t getProgress() { - //should be done in firmware!!!! - return 0; - -} - -int64_t getActualTime(){ - return (get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t getMeasurementTime(){ - int64_t v=get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG); - return (v / (1E-3 * CLK_FREQ)) + 0.5; -} - - - - -int loadImage(int index, short int ImageVals[]){ - u_int32_t address; - switch (index) { - case DARK_IMAGE : - address = DARK_IMAGE_REG; - break; - case GAIN_IMAGE : - address = GAIN_IMAGE_REG; - break; + printf("Testing FPGA:\n"); + volatile u_int32_t val,addr,val2; + int result=OK,i; + //fixed pattern + val=bus_r(FIX_PATT_REG); + if (val==FIXED_PATT_VAL) { + printf("fixed pattern ok!! %08x\n",val); + } else { + printf("fixed pattern wrong!! %08x\n",val); + result=FAIL; } - volatile u_int16_t *ptr; - ptr=(u_int16_t*)(CSP0BASE+address*2); -#ifdef VERBOSE - int i; - for(i=0;i<6;i++) - printf("%d:%d\t",i,ImageVals[i]); -#endif - memcpy((char*)ptr,(char*)ImageVals ,dataBytes); -#ifdef VERBOSE - printf("\nLoaded x%08x address with image of index %d\n",(unsigned int)(ptr),index); -#endif - return OK; + + //dummy register + addr = DUMMY_REG; + for(i=0;i<1000000;i++) + { + val=0x5A5A5A5A-i; + bus_w(addr, val); + val=bus_r(addr); + if (val!=0x5A5A5A5A-i) { + printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of %x \n",i,val,0x5A5A5A5A-i); + result=FAIL; + } + val=(i+(i<<10)+(i<<20)); + bus_w(addr, val); + val2=bus_r(addr); + if (val2!=val) { + printf("ATTEMPT:%d:\tFPGA dummy register wrong!! read %x instead of %x.\n",i,val2,val); + result=FAIL; + } + val=0x0F0F0F0F; + bus_w(addr, val); + val=bus_r(addr); + if (val!=0x0F0F0F0F) { + printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0x0F0F0F0F \n",i,val); + result=FAIL; + } + val=0xF0F0F0F0; + bus_w(addr, val); + val=bus_r(addr); + if (val!=0xF0F0F0F0) { + printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0xF0F0F0F0 \n\n",i,val); + result=FAIL; + } + } + if(result==OK) + { + printf("----------------------------------------------------------------------------------------------"); + printf("\nATTEMPT 1000000: FPGA DUMMY REGISTER OK!!!\n"); + printf("----------------------------------------------------------------------------------------------"); + } + printf("\n"); + return result; } +int testBus() { + u_int32_t j; + u_int64_t i, n, nt; + // char cmd[100]; + u_int32_t val=0x0; + int ifail=OK; + // printf("%s\n",cmd); + // system(cmd); + i=0; -int64_t getProbes(){ - return 0; + n=1000000; + nt=n/100; + printf("testing bus %d times\n",(int)n); + while (i>2; - - off=(idac%3)*10; - mask=~((0x3ff)<=0 && val>off)&0x3ff; - //since we saved only the msb - val=val<<2; - - //val=(bus_r(addr)>>off)&0x3ff; - - + volatile u_int32_t addr=HV_REG; + int writeVal,writeVal2; + switch(val){ + case -1: break; + case 0: writeVal=0x0; writeVal2=0x0; break; + case 90: writeVal=0x0; writeVal2=0x1; break; + case 110:writeVal=0x2; writeVal2=0x3; break; + case 120:writeVal=0x4; writeVal2=0x5; break; + case 150:writeVal=0x6; writeVal2=0x7; break; + case 180:writeVal=0x8; writeVal2=0x9; break; + case 200:writeVal=0xA; writeVal2=0xB; break; + default :printf("Invalid voltage\n");return -2;break; + } + //to set value + if(val!=-1){ + //set value to converted value + bus_w(addr,writeVal); + bus_w(addr,writeVal2); #ifdef VERBOSE - printf("Dac %d module %d register is %d\n\n",idac,imod,val); -#endif - return val; -} - - -int getTemperature(int tempSensor, int imod){ - int val; - imod=0;//ignoring more than 1 mod for now - int i,j,repeats=6; - u_int32_t tempVal=0; -#ifdef VERBOSE - char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"}; - printf("Getting Temperature of module:%d for the %s for tempsensor:%d\n",imod,cTempSensor[tempSensor],tempSensor); -#endif - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - bus_w(TEMP_IN_REG,((T1_CLK_BIT)&~(T1_CS_BIT))|(T2_CLK_BIT));//high clk low cs - - for(i=0;i<20;i++) { - //repeats is number of register writes for delay - for(j=0;j>1);//fpga - } - } - - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - val=((int)tempVal)/4.0; - -#ifdef VERBOSE - printf("Temperature of module:%d for the %s is %.2fC\n",imod,cTempSensor[tempSensor],val); -#endif - return val; -} - - - -int initHighVoltage(int val, int imod){ -#ifdef VERBOSE - printf("Setting/Getting High Voltage of module:%d with val:%d\n",imod,val); -#endif - volatile u_int32_t addr=HV_REG; - int writeVal,writeVal2; - switch(val){ - case -1: break; - case 0: writeVal=0x0; writeVal2=0x0; break; - case 90: writeVal=0x0; writeVal2=0x1; break; - case 110:writeVal=0x2; writeVal2=0x3; break; - case 120:writeVal=0x4; writeVal2=0x5; break; - case 150:writeVal=0x6; writeVal2=0x7; break; - case 180:writeVal=0x8; writeVal2=0x9; break; - case 200:writeVal=0xA; writeVal2=0xB; break; - default :printf("Invalid voltage\n");return -2;break; - } - //to set value - if(val!=-1){ - //set value to converted value - bus_w(addr,writeVal); - bus_w(addr,writeVal2); -#ifdef VERBOSE - printf("Value sent is %d and then %d\n",writeVal,writeVal2); + printf("Value sent is %d and then %d\n",writeVal,writeVal2); #endif - } - //read value and return the converted value - val=bus_r(addr); + } + //read value and return the converted value + val=bus_r(addr); #ifdef VERBOSE - printf("Value read from reg is %d\n",val); + printf("Value read from reg is %d\n",val); #endif - switch(val){ - case 0x0:val=0;break; - case 0x1:val=90;break; - case 0x3:val=110;break; - case 0x5:val=120;break; - case 0x7:val=150;break; - case 0x9:val=180;break; - case 0xB:val=200;break; - default:printf("Weird value read:%d\n",val);return -3;break; - } + switch(val){ + case 0x0:val=0;break; + case 0x1:val=90;break; + case 0x3:val=110;break; + case 0x5:val=120;break; + case 0x7:val=150;break; + case 0x9:val=180;break; + case 0xB:val=200;break; + default:printf("Weird value read:%d\n",val);return -3;break; + } #ifdef VERBOSE - printf("High voltage of module:%d is %d\n",imod,val); + printf("High voltage is %d\n",val); #endif - return val; + return val; } -int initConfGain(int isettings,int val,int imod){ - int retval; - u_int32_t addr=GAIN_REG; - if(val!=-1){ -#ifdef VERBOSE - printf("Setting Gain of module:%d with val:%d\n",imod,val); -#endif - bus_w(addr,((val<>SETTINGS_OFFSET); -#ifdef VERBOSE - printf("Settings read from reg is %d\n",retval); -#endif - if((isettings!=-1)&&(retval!=isettings)){ - printf("\n\nSettings r\n\n"); - return -1; - } - return retval; +int getTemperature(int tempSensor){ + int val; + int i,j,repeats=6; + u_int32_t tempVal=0; +#ifdef VERBOSE + char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"}; + printf("Getting Temperature for the %s for tempsensor:%d\n",cTempSensor[tempSensor],tempSensor); +#endif + bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby + bus_w(TEMP_IN_REG,((T1_CLK_BIT)&~(T1_CS_BIT))|(T2_CLK_BIT));//high clk low cs + + for(i=0;i<20;i++) { + //repeats is number of register writes for delay + for(j=0;j>1);//fpga + } + } + + bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby + val=((int)tempVal)/4.0; + +#ifdef VERBOSE + printf("Temperature for the %s is %.2fC\n",cTempSensor[tempSensor],val); +#endif + return val; } + +int setSettings(int i) { +#ifdef VERBOSE + if(i==-1) + printf("\nReading settings of detector...\n"); + else + printf("\ninside set settings wit settings=%d...\n",i); +#endif + int confgain[] = CONF_GAIN; + int isett=-2,retval; + + //reading settings + if(i==GET_SETTINGS){ + retval=initConfGain(i,i); + if(retval==i) + isett=UNDEFINED; + } + //writing settings + else{ + retval=initConfGain(i,confgain[i]); + if(retval!=i) + isett=UNDEFINED; + } + //if error while read/writing + if(isett==UNDEFINED) + printf("Error:Weird Value read back from the Gain/Settings Reg\n"); + else{ + //validating the settings read back + if((retval>=HIGHGAIN)&&(retval<=VERYHIGHGAIN)) + isett=retval; + else{ + isett=UNDEFINED; + printf("Error:Wrong Settings Read out:%d\n",retval); + } + } + thisSettings=isett; + //#ifdef VERBOSE + printf("detector settings are %d\n",thisSettings); + //#endif + return thisSettings; +} + + + + + +int initConfGain(int isettings,int val){ + int retval; + u_int32_t addr=GAIN_REG; + + if(val!=-1){ +#ifdef VERBOSE + printf("Setting Gain with val:%d\n",val); +#endif + bus_w(addr,((val<>SETTINGS_OFFSET); +#ifdef VERBOSE + printf("Settings read from reg is %d\n",retval); +#endif + if((isettings!=-1)&&(retval!=isettings)){ + printf("\n\nSettings r\n\n"); + return -1; + } + + return retval; +} + + + +ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret){ + + int i,adc; + ROI temp; + + if(n>=0){ + + //clear rois + for(i=0;i=0) && (adc<=4)); + else { + printf("warning:adc value greater than 5. deleting roi\n"); + adc=-1; + } + } + } + printf("\tGoing to enable adc: %d\n", adc); + + //set rois for just 1 adc - take only 1st roi + if(adc!=-1){ + rois[0].xmin=adc*(NCHAN*NCHIPS_PER_ADC); + rois[0].xmax=(adc+1)*(NCHAN*NCHIPS_PER_ADC)-1; + rois[0].ymin=-1; + rois[0].ymax=-1; + nROI = 1; + printf("\tActual xmin:%d xmax:%d\n",rois[0].xmin,rois[0].xmax); + }else + nROI = 0; + + if((n!=0) && ((arg[0].xmin!=rois[0].xmin)|| + (arg[0].xmax!=rois[0].xmax)|| + (arg[0].ymin!=rois[0].ymin)|| + (arg[0].ymax!=rois[0].ymax))) + *ret=FAIL; + if(n!=nROI) + *ret=FAIL; + + //set adc of interest + setADC(adc); + } + + //#ifdef VERBOSE + if (nROI) { + printf("Rois:\n"); + for( i=0;i> 32; + vMSB=v64&(0xffffffff); + bus_w(aMSB,vMSB); + } + return get64BitReg(aLSB, aMSB); + } -u_int32_t dataPresent(void) { - return bus_r(LOOK_AT_ME_REG); +int64_t get64BitReg(int aLSB, int aMSB){ + int64_t v64; + u_int32_t vLSB,vMSB; + vLSB=bus_r(aLSB); + vMSB=bus_r(aMSB); + v64=vMSB; + v64=(v64<<32) | vLSB; + return v64; +} + +int64_t setFrames(int64_t value){ + return set64BitReg(value, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); +} + +int64_t getFrames(){ + return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); +} + +int64_t setExposureTime(int64_t value){ + /* time is in ns */ + if (value!=-1) { + value = (value * 1E-3 * CLK_FREQ ) + 0.5; + } + return (set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) / + (1E-3 * CLK_FREQ)) + 0.5; +} + +int64_t getExposureTime(){ + return (get64BitReg(GET_EXPTIME_LSB_REG, GET_EXPTIME_MSB_REG) / + (1E-3 * CLK_FREQ)) + 0.5; +} + +int64_t setGates(int64_t value){ + return set64BitReg(value, SET_GATES_LSB_REG, SET_GATES_MSB_REG); +} + +int64_t getGates(){ + return get64BitReg(GET_GATES_LSB_REG, GET_GATES_MSB_REG); +} + +int64_t setPeriod(int64_t value){ + /* time is in ns */ + if (value!=-1) { + value = (value * 1E-3 * CLK_FREQ ) + 0.5; + } + return (set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG) / + (1E-3 * CLK_FREQ)) + 0.5; +} + +int64_t getPeriod(){ + return (get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / + (1E-3 * CLK_FREQ)) + 0.5; +} + +int64_t setDelay(int64_t value){ + /* time is in ns */ + if (value!=-1) { + if (masterflags == IS_MASTER) { + value += masterdefaultdelay; + cprintf(BLUE,"Actual delay for master: %lld\n", (long long int) value); + } + value = (value * 1E-3 * CLK_FREQ ) + 0.5; + } + int64_t retval = (set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG) / + (1E-3 * CLK_FREQ)) + 0.5; + if (masterflags == IS_MASTER) { + cprintf(BLUE,"Actual delay read from master: %lld\n", (long long int) retval); + retval -= masterdefaultdelay; + } + + return retval; +} + +int64_t getDelay(){ + return (get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) / + (1E-3 * CLK_FREQ)) + 0.5; +} + +int64_t setTrains(int64_t value){ + return set64BitReg(value, SET_TRAINS_LSB_REG, SET_TRAINS_MSB_REG); +} + +int64_t getTrains(){ + return get64BitReg(GET_TRAINS_LSB_REG, GET_TRAINS_MSB_REG); +} + + + +int64_t getActualTime(){ + return (get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG) / + (1E-3 * CLK_FREQ)) + 0.5; +} + +int64_t getMeasurementTime(){ + int64_t v=get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG); + return (v / (1E-3 * CLK_FREQ)) + 0.5; +} + + + + + + +u_int32_t fifoReadStatus() { + return bus_r(STATUS_REG)&(SOME_FIFO_FULL_BIT | ALL_FIFO_EMPTY_BIT); +} + +u_int32_t fifo_full(void) { + return bus_r(STATUS_REG)&SOME_FIFO_FULL_BIT; +} + + +u_int32_t runBusy(void) { + u_int32_t s = bus_r(STATUS_REG) & RUN_BUSY_BIT; + return s; } u_int32_t runState(void) { - int s=bus_r(STATUS_REG); -#ifdef SHAREDMEMORY - if (s&RUN_BUSY_BIT) - write_status_sm("Running"); - else - write_status_sm("Stopped"); -#endif + int s=bus_r(STATUS_REG); #ifdef VERBOSE - printf("status %04x\n",s); +printf("status %04x\n",s); #endif -/* if (s==0x62001) - exit(-1);*/ - return s; +return s; } -// State Machine +// State Machine int startStateMachine(){ -//#ifdef VERBOSE - printf("*******Starting State Machine*******\n"); -//#endif + //#ifdef VERBOSE + printf("*******Starting State Machine*******\n"); + //#endif cleanFifo(); - // fifoReset(); + // fifoReset(); - bus_w16(CONTROL_REG, START_ACQ_BIT | START_EXPOSURE_BIT); - bus_w16(CONTROL_REG, 0x0); - printf("statusreg=%08x\n",bus_r(STATUS_REG)); - return OK; + bus_w16(CONTROL_REG, START_ACQ_BIT | START_EXPOSURE_BIT); + bus_w16(CONTROL_REG, 0x0); + printf("statusreg=%08x\n",bus_r(STATUS_REG)); + return OK; } @@ -1494,300 +1584,159 @@ int startStateMachine(){ int stopStateMachine(){ -//#ifdef VERBOSE - cprintf(BG_RED,"*******Stopping State Machine*******\n"); -//#endif - bus_w16(CONTROL_REG, STOP_ACQ_BIT); - bus_w16(CONTROL_REG, 0x0); - usleep(500); - // if (!runBusy()) - if(!(bus_r(STATUS_REG)&RUNMACHINE_BUSY_BIT)) - return OK; - else - return FAIL; + //#ifdef VERBOSE + cprintf(BG_RED,"*******Stopping State Machine*******\n"); + //#endif + bus_w16(CONTROL_REG, STOP_ACQ_BIT); + bus_w16(CONTROL_REG, 0x0); + usleep(500); + // if (!runBusy()) + if(!(bus_r(STATUS_REG)&RUNMACHINE_BUSY_BIT)) + return OK; + else + return FAIL; } int startReadOut(){ - u_int32_t status; + u_int32_t status; #ifdef VERBOSE - printf("Starting State Machine Readout\n"); + printf("Starting State Machine Readout\n"); #endif - status=bus_r(STATUS_REG)&RUN_BUSY_BIT; -#ifdef DEBUG - printf("State machine status is %08x\n",bus_r(STATUS_REG)); -#endif - bus_w16(CONTROL_REG, START_ACQ_BIT |START_READOUT_BIT); // start readout - bus_w16(CONTROL_REG, 0x0); - return OK; -} - - -// fifo routines - -u_int32_t fifoReset(void) { - return -1; -} - - -u_int32_t setNBits(u_int32_t n) { - return -1; -} - -u_int32_t getNBits(){ - return -1; -} - - -u_int32_t fifoReadCounter(int fifonum){ - return -1; -} - -u_int32_t fifoReadStatus() -{ - // reads from the global status register - - return bus_r(STATUS_REG)&(SOME_FIFO_FULL_BIT | ALL_FIFO_EMPTY_BIT); -} - -u_int32_t fifo_full(void) -{ - // checks fifo empty flag returns 1 if fifo is empty - // otherwise 0 - return bus_r(STATUS_REG)&SOME_FIFO_FULL_BIT; -} - - -void waitForAcquisitionFinish(){ - volatile u_int32_t t = bus_r(LOOK_AT_ME_REG); -#ifdef VERBOSE - printf("lookatmereg=x%x\n",t); -#endif - while((t&0x1)==0) { - if (runBusy()==0) { - t = bus_r(LOOK_AT_ME_REG); - if ((t&0x1)==0) { -#ifdef VERBOSE - printf("no frame found - exiting "); - printf("%08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); -#endif - return; - } else { -#ifdef VERBOSE - printf("no frame found %x status %x\n", bus_r(LOOK_AT_ME_REG),runState()); -#endif - break; - } - } - t = bus_r(LOOK_AT_ME_REG); - } -} - - - - -u_int32_t* decode_data(int *datain) -{ - u_int32_t *dataout; - // const char one=1; - const int bytesize=8; - char *ptr=(char*)datain; - //int nbits=dynamicRange; - int ipos=0, ichan=0;; - //int nch, boff=0; - int ibyte;//, ibit; - char iptr; - -#ifdef VERBOSE - printf("Decoding data for DR %d\n",dynamicRange); -#endif - dataout=malloc(nChans*nChips*nModX*4); - ichan=0; - switch (dynamicRange) { - case 1: - for (ibyte=0; ibyte>(ipos))&0x1; - ichan++; - } - } - break; - case 4: - for (ibyte=0; ibyte>(ipos*4))&0xf; - ichan++; - } - } - break; - case 8: - for (ichan=0; ichan>(23-i))&0x1)<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"); + return FAIL; + } + if ((srcMod->nchan)>(destMod->nchan)) { + printf("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"); + return FAIL; + } + if ((srcMod->nadc)>(destMod->nadc)) { + printf("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 + + 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; + + for (idac=0; idac<(srcMod->ndac); idac++) { + if (*((srcMod->dacs)+idac)>=0) + *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); + } + for (iadc=0; iadc<(srcMod->nadc); iadc++) { + if (*((srcMod->adcs)+iadc)>=0) + *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); + } + return ret; +} + + + + + + + +int setDAC(int ind, int val,int mV, int retval[]) { + + if(mV) + val = (val*4096)/2500; + + if (val>=0) + initDAC(ind,val); + clearDACSregister(); + + retval[0] = setDACRegister(ind, -1); + retval[1] = (retval[0]*2500)/4096; + return retval[0]; + +} + + + +int getDAC(int ind) { + return setDACRegister(ind, -1); +} + + + + + + + +int setModule(sls_detector_module myMod) { + + printf("\ninside setmodule..\n"); + + int v[NDAC]; + v[VREF_DS]=(myMod.dacs)[0]; + v[VCASCN_PB]=(myMod.dacs)[1]; + v[VCASCP_PB]=(myMod.dacs)[2]; + v[VOUT_CM]=(myMod.dacs)[3]; + v[VCASC_OUT]=(myMod.dacs)[4]; + v[VIN_CM]=(myMod.dacs)[5]; + v[VREF_COMP]=(myMod.dacs)[6]; + v[IB_TESTC]=(myMod.dacs)[7]; + +#ifdef VERBOSE + printf("vrefds=%d\n",v[VREF_DS]); + printf("vcascn=%d\n",v[VCASCN_PB]); + printf("vcascp=%d\n",v[VCASCP_PB]); + printf("vout=%d\n",v[VOUT_CM]); + printf("vcasc=%d\n",v[VCASC_OUT]); + printf("vin=%d\n",v[VIN_CM]); + printf("vref_comp=%d\n",v[VREF_COMP]); + printf("ib_testc=%d\n",v[IB_TESTC]); +#endif + + initDACs(v); + clearDACSregister(); + + if (detectorModules) { + copyModule(detectorModules,&myMod); + } + + //setting the conf gain and the settings register + setSettings(myMod.reg); + + return myMod.reg; +} + + + +void getModule(sls_detector_module* myMod) { + if (detectorModules) { + copyModule(myMod,detectorModules); + } +} + + + +void initDACs(int* v) { +#ifdef VERBOSE + printf("\n..inside initdacs\n"); +#endif + int iaddr; + for (iaddr=0; iaddr<8; iaddr++) { + initDAC(iaddr, v[iaddr]); + } +} + + + +void initDAC(int dac_addr, int value) { +#ifdef VERBOSE + printf("Programming dac %d with value %d\n", dac_addr, value); +#endif + clearDACSregister(); + if (value >= 0) { + program_one_dac(dac_addr,value); + } + nextDAC(); +} + + + + + +void clearDACSregister() { + putout("1111111111111111");//reset + putout("1111111111111110");//cs down +} + + +void nextDAC() { + putout("1111111111111011");//cs up + putout("1111111111111001");//clk down + putout("1111111111111111");//reset +} + + + +void program_one_dac(int addr, int value) { + +#ifdef VERBOSE + printf("programming dac %d value %d module %d\n",addr, value); +#endif + + + int i,idac,bit, control; + int v=value; + + control=32+addr; + value=(value<<4) | (control<< 16); + + + for (i=0;i<24;i++) { + bit=value & (1<<(23-i)); + if (bit) { + putout("1111111111111100");//clk down + putout("1111111111111100");//write data + putout("1111111111111110");//clk up + } + else + { + putout("1111111111111000");//clk down + putout("1111111111111000");//write data + putout("1111111111111010");//clk up + } + } + + idac=addr; + + + if (detectorDacs) { + detectorDacs[idac]=v; +#ifdef VERBOSE + printf("index=%d, val=%d addr=%x\n", idac, v, (unsigned int)(detectorDacs+idac)); +#endif + setDACRegister(idac,v); + } +} + + + + + + + + + + diff --git a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/firmware_funcs.h b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/firmware_funcs.h index 9d2491c0e..552d2f6ad 100755 --- a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/firmware_funcs.h +++ b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/firmware_funcs.h @@ -12,74 +12,54 @@ #include #include #include -//#include -#include #include #include -#include -#include -#include int mapCSP0(void); - u_int16_t bus_r16(u_int32_t offset); u_int16_t bus_w16(u_int32_t offset, u_int16_t data);//aldos function u_int32_t bus_w(u_int32_t offset, u_int32_t data); u_int32_t bus_r(u_int32_t offset); +int initDetector(); +int setDefaultDacs(); void setMasterSlaveConfiguration(); +int configureADC(); int setPhaseShiftOnce(); int setPhaseShift(int numphaseshift); int cleanFifo(); int setDAQRegister(); +u_int32_t putout(char *s); +int setConfigurationRegister(int d); +int sendviaUDP(int d); +int setDACRegister(int idac, int val); -u_int32_t putout(char *s, int modnum); -u_int32_t readin(int modnum); -u_int32_t setClockDivider(int d); -u_int32_t getClockDivider(); -u_int32_t setSetLength(int d); -u_int32_t getSetLength(); -u_int32_t setWaitStates(int d); -u_int32_t getWaitStates(); -u_int32_t setTotClockDivider(int d); -u_int32_t getTotClockDivider(); -u_int32_t setTotDutyCycle(int d); -u_int32_t getTotDutyCycle(); u_int32_t setExtSignal(enum externalSignalFlag mode); int getExtSignal(); - u_int32_t setFPGASignal(enum externalSignalFlag mode); int getFPGASignal(); int setTiming(int t); +u_int64_t getDetectorNumber(); +u_int32_t getFirmwareVersion(); +u_int32_t getFirmwareSVNVersion(); -int setConfigurationRegister(int d); -int setToT(int d); -int setContinousReadOut(int d); -int startReceiver(int d); - -int setDACRegister(int idac, int val, int imod); - -int getTemperature(int tempSensor,int imod); -int initHighVoltage(int val,int imod); -int initConfGain(int isettings,int val,int imod); +u_int32_t testFpga(void); +int testBus(void); +int initHighVoltage(int val); +int getTemperature(int tempSensor); +int setSettings(int i); +int initConfGain(int isettings,int val); +ROI* setROI(int n, ROI arg[], int *retvalsize, int *ret); int setADC(int adc); int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int ival, int udpport); int getAdcConfigured(); -u_int64_t getDetectorNumber(); -u_int32_t getFirmwareVersion(); -u_int32_t getFirmwareSVNVersion(); -int testFifos(void); -u_int32_t testFpga(void); -int testBus(void); -int setDigitalTestBit(int ival); - int64_t set64BitReg(int64_t value, int aLSB, int aMSB); int64_t get64BitReg(int aLSB, int aMSB); @@ -92,88 +72,49 @@ int64_t getExposureTime(); int64_t setGates(int64_t value); int64_t getGates(); -int64_t setDelay(int64_t value); -int64_t getDelay(); - int64_t setPeriod(int64_t value); int64_t getPeriod(); +int64_t setDelay(int64_t value); +int64_t getDelay(); + int64_t setTrains(int64_t value); int64_t getTrains(); -int64_t setProbes(int64_t value); -int64_t getProbes(); - -int64_t getProgress(); -int64_t setProgress(); - int64_t getActualTime(); int64_t getMeasurementTime(); - -u_int32_t runBusy(void); -u_int32_t runState(void); -u_int32_t dataPresent(void); - - +u_int32_t fifoReadStatus(); +u_int32_t fifo_full(void); +u_int32_t runBusy(void); +u_int32_t runState(void); int startStateMachine(); int stopStateMachine(); int startReadOut(); -u_int32_t fifoReset(void); -u_int32_t fifoReadCounter(int fifonum); -u_int32_t fifoReadStatus(); - - -u_int32_t fifo_full(void); - - void waitForAcquisitionFinish(); - -u_int32_t* decode_data(int* datain); -//u_int32_t move_data(u_int64_t* datain, u_int64_t* dataout); -int setDynamicRange(int dr); -int getDynamicRange(); -int getNModBoard(); -int setNMod(int n); -int setStoreInRAM(int b); - - - - -int setMaster(int f); -int setSynchronization(int s); +int getStatus(); int loadImage(int index, short int ImageVals[]); int readCounterBlock(int startACQ, short int CounterVals[]); int resetCounterBlock(int startACQ); -int calibratePedestal(int frames); +int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod); + +int setDAC(int ind,int val,int mV, int retval[]); +int getDAC(int ind); + +int setModule(sls_detector_module); +void getModule(sls_detector_module*); + +void initDACs(int* v); +void initDAC(int dac_addr, int value); +void clearDACSregister(); +void nextDAC(); +void program_one_dac(int addr, int value); -/* -u_int32_t setNBits(u_int32_t); -u_int32_t getNBits(); -*/ - -/* -//move to mcb_funcs? - -int readOutChan(int *val); -u_int32_t getModuleNumber(int modnum); -int testShiftIn(int imod); -int testShiftOut(int imod); -int testShiftStSel(int imod); -int testDataInOut(int num, int imod); -int testExtPulse(int imod); -int testExtPulseMux(int imod, int ow); -int testDataInOutMux(int imod, int ow, int num); -int testOutMux(int imod); -int testFpgaMux(int imod); -int calibration_sensor(int num, int *values, int *dacs) ; -int calibration_chip(int num, int *values, int *dacs); -*/ #endif diff --git a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gitInfo.txt b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gitInfo.txt index 3d4e263eb..1ab0195ee 100644 --- a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ -Path: slsDetectorsPackage/slsDetectorSoftware/gotthardDetectorServer +Path: slsDetectorPackage/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: c52025dd7c4b44b93e64353a22997d971996ab18 -Revision: 237 -Branch: developer -Last Changed Author: Gemma_Tinti -Last Changed Rev: 3999 -Last Changed Date: 2018-09-28 16:10:41.000000002 +0200 ./server_funcs.c +Repsitory UUID: 923a7e8936cbfe32a8781554de32c66be2f78035 +Revision: 2 +Branch: refactor +Last Changed Author: Dhanya_Thattil +Last Changed Rev: 4068 +Last Changed Date: 2018-10-09 09:15:04.000000002 +0200 ./firmware_funcs.c diff --git a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gitInfoGotthard.h b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gitInfoGotthard.h index 42a1e0ca6..0f82650bd 100644 --- a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gitInfoGotthard.h +++ b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gitInfoGotthard.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "c52025dd7c4b44b93e64353a22997d971996ab18" -#define GITAUTH "Gemma_Tinti" -#define GITREV 0x3999 -#define GITDATE 0x20180928 -#define GITBRANCH "developer" +#define GITREPUUID "923a7e8936cbfe32a8781554de32c66be2f78035" +#define GITAUTH "Dhanya_Thattil" +#define GITREV 0x4068 +#define GITDATE 0x20181009 +#define GITBRANCH "refactor" diff --git a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gotthardDetectorServer_refactor b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/gotthardDetectorServer_refactor new file mode 100755 index 0000000000000000000000000000000000000000..2258a891c2ec21d373c313fed238da49000a809e GIT binary patch literal 86112 zcmbq+3w#vS_5bW6+1bq|nUFv>5XdIHLV#pg0wz3k^8jLmWLZK$)OIjfVzo84wgttX zo8_scn$!pQsNG;&(PFzn+Gbg815%(Ze;c&@)wcd>hCzxJbpg>NJof)RcXoCsA=3VT z|9n0-J9F>3=iYPfx#ymH?qhCWxVVAiI5R>u$9?4E428{{VXlYc1dcs()+fxsO;{}No@hsK%X=nr2o2&Ad0L_1O~rrzo00S>?Hm_f z8?xGj443WhuRi|7m%Qz_b5q(w*1o)2)WC*NX-{^zz;kpHmY?+frA!6md;$kIm!1Wwtqg0nk?NQhrEIQ?#< z-~CagoIBo#z$p#OIJ-@7%Pk*q6qIQ<@e;TH2`4Xg1u1tVd^Xe-XyuQM=?d`n@q$wh zSOVdJJtNwSR!Ag-+*51?+a?3k`4?(HENrj`7k8k0nV0eO) zU<2X4fZ!^)o9e9AX@yw1mQ(Dp`W!=k1m$F{RWj^f?BtM>@b)1dL2=v^3~|aI9Dz`G zC8z9|(G#wfg{d}#o{;c(57HL7Kp9%2@MDgG@|)VeCT{;^C#N*#2u=-JXy=qlS8uo% zIfR^U_PcjxcPL*ji}L(OnR>W4XS(GwU_(%L)^gwz*QK^ha}syj#<}Hcq#`H}*Sh5f zJU4utFB=7;#3^TLBH>7=jPY7R3WDMJ(2K0NO)4qrR6b*Wxx9O`O1DO?BJxKc|-p}iCrDS#Jd&mEqHIidjM@~!25l8zYp&k0VsU%K$GxqC9Crqiy&_K$6n>l3zr}7_K_Vft!F2^Sv1?6uwoYWiUp#S=s zx)FN9&JHvCD%R~7gLn-&%-d>~Abd+=O-{+n~K%N@t%zl)kn0XNz z&Q)8zW0n8wXfwXdk$4}`em1m7^sS8q4Wdn?9&E}w5K5#2-n-kL=NKC2NF7O9H-< z$$ghrKxZEXfCD;q6alw?4elF>pg(!`GoYg)WF$q5mdMe`CY`n z%ivRlMIb8? z6=yAKGPZ{Fv~3YdNcqjR^0e_b1n6-45pcx~XavQ^pgv#tt9;5y^lpzB5Q^kaFM%@A z3rz3SbEz4~(}p~4x)RPTq7wePkV@chMt+qS$lntoUi=N?lT|1?IX_w}izr7pE1zahEyIluY2Dmc7QOi`H z#YlHnrJGvD!}vCz@$K%FhzF-nget{+nKN+8vU<+`+6YZjMzw3a8;K{CJ6U*A=_kDx zqYzIj4HYCSUB7s9pP|8BOV4Wj*-Kh|$S&|3)L63)x<&{6H$cbQ4A6JQpg+2# z;jU@=O*6s;^57t~D3>(d!gt5WI2f``N zo)FL8IJ}u*A#z!;5S!YDfgR;f3XA^P1$vAc>F+d_Op z0>*a9Dn&v$;zqYAmfG47lAw{jfsjMI$(LKns@)D}TGSB(;mk_GR9#_|-BKF<=|^2}|J)`AFVKMQQ*FS=#ZpqSAYGoguQ zj?qI21T`qe0@|ZW0jqfzO6)o(Ltgu;6EyO~=tErZpjwzApEnqKk&>Pl39poz z>!Zr$f$mD)PAQ`h*Ngd=&mRdHJU!tc%K3Pp8^6c#^oId@KZSR<+=Fs^&K*FxuMH|! zo!>b;>m}ZnhgPjdOIBk%tB_Bg!$@+DEC#FOhsAhuu|Cyt-XJ^9??(&#q?+ash3HXa z5%q*eIgew$MzcZB(_GcV81-$!dZ`C8&r93fyolEE^n#j$XE6O08iLUF2;er=#Pj9Dv2$=;Au%Zn;>^#ISL zWc6b8eck}I$_l``W#@Sgfm&sHwG6Gy35Eu$4`(+yNRCN<47}MvH8Wvms?8y&Y%9v{ z$1J%lZGvExx&ovNcA>qxxsH$lHbs`uy?R&3h^G{xOj6_09ZvZUZe@LUILo* z8fPtwNr6O(sE>G_5IGa&1tP|th#`baomj+!EI4b+QS zt+v?hk0tyogq4?13I3Y1!9Lkbmqan>0hLgg)a% zj87&*LthZ3*VF$XBunGD8FZInz7^tJTzDx5CGwy%9cZoG(IqRQX{v4b(@KXQMXgJQahg^P)<7 zG^+eOO0uV~4cY1@r$N%y=JZyMZ0!Gv7Ri@jJr~Fqxk}8>cm=&;eHy~}p`64-j9IB<;R9kiuwK@4Sb>W`o}D@nsR7|ez~>gkvX>@mo`9OCbBcxIjeB!Y5Nr42d=J_WoZC{>lj zKOQ-|!!%m7J1gW>s|*OxnqE!*OZ!Ov>w#IHN`1t@k953^(h_+p9A2A!zyE|D0;a z#pq5?Hz1AYQyg!B&YDlr!k?Z+3%(i48^N3+64CM=VR=t{uJSAb%Rds)@@_}o?JRGQ zTEm^?hL;W+808b1PkOfoJq7pzUoT4!^fGY?N*e5pfpw7 zjuMu>56@1Pev~~;fQC`I zu8zz!ij8*)h;!g+oYRS?LOkU-MLd<^Da+}`Qw^TdogO@`#FGtU(LQhmL6O{Nn+}8* zI!XUo9X)KUe&#dPGI|QXQKj=U(vCO7l9()X1<32`mfuD0cP|)V4S3tVkc6(_c#L$b zz>7TmejUGK@VgGb+4y}5znS>mhu?Jk9>p(>hlhaW&;=R~Z*!l9$Hn9f1rDHR>E+DI zm30y=)Wcy=s5jXmG&Z*K7sez~DbLg) zsokNauvW$iWgVP74I_mAF#jkp^+uJ_&v;n!h6W2fg=x$quBA-=%zwCVqn6ekv)i8r zo-kQGtd^f&fCg3S<~qcDjJO7Kpgs~bN~(-boCUwnTy5NqNz>^x@Wn0LKjRSUUGmrO z412<^<~u`6hw(T?n#dX|Lyfxv#KA^Rvu8%Zf;`IghDV@HRe#ZmuV=K=I9wfvF~d?J zm|jTbQAj2EehN`8g0kXW>6NYAZh70Z`?)vhMnnrqC0scjm zZ(ML=WFr{fA&1I3$X+AQ+*H_3Wp)7;k-NSOwoO#I?E)|MHF0v3Gc+t>7-lmJOE0+V z2nWHZ0Y_iJz?1(zfI1>5?_E#$Ot2zJlalPIeVgi;#_D;0Cs|(?U?=v5X92E4&YfyN zaAG7_;i|mnnXoVXOh{;d1YCF|RB-nrcq_R3ng3NB<%BK0Ms1rWj<+5i(+8{9Ec7)+ z!lHA|D>RF-!(`&PIj?wN4{}Ll*-&aeQkMn@!r*BMw}fC_Ll&Zjdoga^i}#u(G^+bF zd&p`97lPmdf^sXk5JBtq;=Px(?&H_fx8<_u2gCT#53Qem6mrxdh@}=u(mZ(CL#YFUq4wb@04p7Ax#OPic(C~QB zn%S|~_IPX?Vl^HekH_{P*6i5-iaNVh%gbo*3xI#ISn9EBIjt_l>00o}@j3j%pL5FZ z=aU4K4UquBmD!$<3E1yz1jvQp%GSm5h;^{o5xQ8CAHj7yTdQ(@Zjhayp9_keG`eMD ze0zJoDhFC^GLUl{e-JZjjMJzQg3>x)OBLGhe?@rQ4eoLXaVci=Y|<0tPgQ5Z#9`vM z`bNBnDnIRuDouR^mjyT{W{b}8PPrh7di4anO~6|k-e?5rgC@>K{y3Cz5ER}7KxuO( zqeyevvU(aJdqTb?^m{hc2mc6kG-fHsL%W&HD4kb-?>|reqOHc-0nH zpA))-)=uo)y3SDN0BMsz3yl#GAN@bwhB2c%>s%J7qR8F^wfWjtf9hsPVv>zdpe~orl&LK5?IU(i@Qd} z^4_@=hNb@;;db+C?4Qn2u1^p*gXKS_%YTwVaw)#8`u20AWw_zxd6 z_z$O;UJkXLGH_~)kyB%YXZw)u-mmsQ=|XzA_i&UD8&~`@w1ezECsq7Dc!M@ zgDm9;OTj#mqYFEXL2+X6l>c~Wg?#5eNBc2UM!U0S7ULU)OKnF`nxL2 zLi@`h;g>JNa_zzY_V-6}eX;x_k-zQb<|WPbZAfv-EnM5FF^JoS{G;)UKJ}|E)Sw6J zf55RffF2MC`LGI;>ZCQs1C_85Jl)W~0^(r9t|k4>r=H7%6`m?EU8je$IJ-lX$G60Q zT=dJ?KhNxjr?R_}`Vq?b70re2hHN4zug|4gZI(Tts_ccALmozz+H;92&ncpSlRT%g zxc$T-oACI4ma}4 z=aI6G^&JTxMGJJ51=j5P&a#fEl6~kyI?<+qmF-`O;)N~_T0e9OK!)03;FC@M)}f9sv>X5Ae2J6YrhF;xz;B@8ft?Ulj59!8nfx zq_3jhm#(NY6IdqTaUU!BAy#tcf57AM*W~eb*R^>3AWI#}^FrnEJB-rrFiM{X-d|r6@2`f%>jhp%951a!V+EkI zzq1Qch(3k?UU=8k6<_i!j)ol)TL*0y#WFFvWIx8T#NG|c>z21e|84&~)G+`Vo?G74 z(U0GIVznDymfx9iEk6H_r4Hrur$wByzm!UJ%6FPMLj8ev}N$kKY4l zTWN3jEY<}QRFA>ZHzsQ>m-YRki0aQizpU{C>!#Plzh+qc z(J7qrTOEGt=Y`BeRs1n8I;3@2xzy9Dra6%Yi_@o1Gsp6cKpOc8NXy4^LJO<;%pdDw znNGp}CbT|+^2Bvf<(YFeSQ*NfE4Zk#_ak~H57{dpskz_(NWUNIwd)e=PG$~Xgg$r? z`Zy(c9p%eFzVnx?EpFu5P4uv((({$UobJmCaVPB-JHlP`aI^FGIRo(=vgc+Up6Dya`$TSS{@5 zl&;xM;JJapwZ>D|AQeG*iKU82#qL73moA7D1dNA7>3GcTxB*yT14QRrvzdpR&9~rH zW*nljBtRf2{@HA%g*-vTASml+7Xl0H2WSJD6w~}Dnaz*Zb&%bNm2vp^c)P`6gFmMg z{kS)rgr^El!V@ggYwnhdghCw!upK#N7BWy7WHnJ47FGrBT2j30m zomY5B1+BczL@h`rPcMopwxB3HZ&r6GfVqa&8rU!mJCA2}9`$7M2Kmt5sy9VwAJ`*2KIfJ8z`!2(NUS7H)4(AF z<(6604!>kRq=7x~tFYAjkcyxzW~nbC^*HjvlfqIDAr(QH&r)|HHKPM1bPP@{W~mP& zwTJQsQ73}xobyT>)dTMy{CeoOBT-imU_5|%eAl0L(OQD$JKa2;V32p$@miu&dc;&roMxd$d@qYcK?l9lzvB zCaU2ZwDx9FFC{$3JK*!Y3Xc{`c(i9KiGLh@3qC#K4|*r?kj<}3BiXX*8YImz$P3NG zDkuB>5OzI!3uuLwe0Kc-^5OoBgZ;(9?uVcIXA$!Gtm~lt&I955U&&~9BF|Ab_2iiE zFI|T3kJcBZC75464tTbQlyrl(22YqCj%a!}B{tW=2yzJ{$R$pxFP-x<@G4xkOWjx9 z#-1wSwF}eOCdf3xJJYlAUyeIG!2`>^k?8cq}DsI6{>uz`mv3C`I zHXE!z?X6y{SQAx#aHS9Pqi=uO*P+#o_6#JTu(}h^L;mfkvPoy3(>#gfU-jDyes%9c zMmu@<>>M;ye1~KtKIRa9?15L{_0@5l>Y5#2XEtGMb%Ha_OHpOkW;4pduKa?F>ml zw%0-sA9346_^`3&Px?FyJ-7w5L_W$7=qXT=$NiRH*C|`Zep~M0B);q8SULM*^fY`x*%gBH0*~K(&C#w(6=x30Ts^BsE6{f-0QB&U5$8sDf2XJXa{w! zJO>&+0<9hiU*{yuU02~KV7U7b-`W7pEB3F&N~yQ3Be9pOY?r#*%jnV9DVgQ#>KI(p zi>FoTIvZNo(aImuqzm;?+j&msBC&VvoQ@E9a#yrol-CXf)^%Vm-ywGPb+mMr?FzyN zOsN5uI;W!xscOtU+AKeYi`L`Zen~ozBbwg|NlGrIoEuA9{GR=R^FsPfV(8I8g25S$9zjS%2#3^|$HRt@(2P#3s70`e=Zk8*m)SZS$1n&sS zu^F(tX2I^7RUtQDF(7;cc{}G}oxU7By&StI5WDV55n_LW*a%`Hi1i`Xcg2O+XXjzp zWjS`vmXilQZYiS;Ea?AaZ`X?*Yr6skfW0}FbU2r4X137;*o(ANss~m|6e~isdKcxW z|KnWF44liEp{_W1p#^W}nEeH-iu{AyPSvat?<;UVkknI2ZQkTv`j#Vyfq17w0@$5z=CO^Rc&lKCKIB zF{Rf-cU~`aCSo?g8?@mDk1pmUd`>6bZMv9-D){58dUP@ORl`Q97I4x)!^|(_WPYJX z7n8LJ_W7bVT?~ICU~cTu#WdG)a&xWlY66eS3y&^l+G1Esi`#TDeTeB>+@p)>S%MuE zOUT=q!1P=lCqGvwoXXI}Ew0C$rCwmZTCL_ii0eUIrVeh}Qk1z=fbTYe&%F$L(w7PF z>n7s1HK4T{gj1t*aT}I{qsxU;*}AwM#PuM~p^G!GXSDoz$w38%*D<8DLTZNjN>y0}url_D-r7gzmd$j+CAQ%+sn zQHhg}!h@Wzi~G}RPX5zs;Z%VxE+)OF#t#!WVVJmy!^BO}#l3brC%<;PaB8wHPAj8u zn7Ap!#1#z_H+7h}X~V=#A11DNn7EQ*;>2O%W(*VO8YXV$Fma{B#LXHeZuT&7*9{X_ zri<&v%6)H>aH?Dvr}23Xbd_c!(7s`HCzYm+_dvt$xpMz%_&dwp^1IM@?_PmUn+3gy zT^3>qY1UNi4O3$r7!#pmWeg_Dw{u9paae_^7Z1cV?}i)=QiJ+tjuU70wDJcGWLK7* z!ueCo1W1P#$pX$KbOmZf73%{GtIwVeU!GRS2>fcI6UYYU zVPW~^*bvy8pkk)oc@N&e#sm8l#1;1KSXCk0qXvXZaTRcWy*z=1x6c4h4GV8Cisx`3 zha*~vvC4=*SbtqS273Tid?Hds;Hw0_g|Rx?$QoteKeku7MBODm3{Fvbq@&5$!x4n0bPBzqdwcCM#$Q} zvU+hfWQO?VchFeu!(N<3%@ZyD!!r1(Kvx@P>72bn2x1Q^trF4hie&6%hHvb{HtZ`& zv>|8D86*iKuv=MQi@`04vqRHIVNU{=nmz<>4{Ez7dIB?^-%U@#NFP-)P!iR`rjrrc z4ebDa%(`NIU?95(P%7{8V{wsewyzjFAFt-!iFlgohaldOO+))?$eWVj${Ez?Omq(T zmj(W5eeOiIDlNnFFAC3FH#o+{xHaWN+O5O0HgAp9t^*jlV>RxG#qB_?V2MKxuCDRJ z@icV~PBszk_p!lm(%00FddsZlB$0{QXJPMT7WW8R{1?|z>-RBRZR0g-A7Hf)hUgqe zj(wD)E#$yPiuOI2W@yI4)$XU;r0n+T+LG3$20hTw!LF9IP~`qdc(```>PLo!}U(0M#UPsCf5IEepNj;a&&r_ zw~v6;t=B?B`&+@Z9IVgR%Io00Sch|P@h4~|JLA6u{v#-7rxGR_uLkR=8&SWZ+UbTk zN3WLG8S%8Zc0wN$SRW(Z;v2&2P2lw=?tbuBnvH(;6;)3akGhtgx(QtIg(diX)c6bSSWa)DYKv{32$3S#L4$WxqDFV9_}q@uvcfzM*l4w zlzJMer@8MV^+&UCBLMPGa4v&?+Ia1AdDzlpe!sCPdrwhw4Tgx?I@1fyfD5yL4`+5eFoS17p#w#2C_-MHb5!jfo@S5e}kH zlRT1U6eR=CJK95K__csuYJalZ675gxA+<$`c2L{@Eo%QF!W9HJldyXieyk6=@kZ+k zZh0LfaGinjPAeM9pCI_NI>w(?)RyuPe>5HP9q^!+ooc$eKi(Nn3�F<3}pS4?2UG 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 literal 0 HcmV?d00001 diff --git a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/mcb_funcs.c b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/mcb_funcs.c deleted file mode 100755 index 8d73b536f..000000000 --- a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/mcb_funcs.c +++ /dev/null @@ -1,2340 +0,0 @@ -#ifdef MCB_FUNCS - -#include -#include -#include -#include -#include -#include "registers_g.h" - -#ifndef PICASSOD -#include "server_defs.h" -#else -#include "picasso_defs.h" -#endif -#include "firmware_funcs.h" -#include "mcb_funcs.h" - -/* global variables */ -#undef DEBUG -#undef DEBUGOUT - -extern int nModX; -//extern int dataBytes; -extern int dynamicRange; -const int nChans=NCHAN; -const int nChips=NCHIP; -const int nDacs=NDAC; -const int nAdcs=NADC; -enum detectorSettings thisSettings; - -int sChan, sChip, sMod, sDac, sAdc; -const int allSelected=-2; -const int noneSelected=-1; - - -sls_detector_module *detectorModules=NULL; -int *detectorChips=NULL; -int *detectorChans=NULL; -int *detectorDacs=NULL; -int *detectorAdcs=NULL; -//int numberOfProbes; - -ROI rois[MAX_ROIS]; -int nROI=0; - - -int initDetector() { - - int imod; - // sls_detector_module *myModule; - int n=getNModBoard(); - nModX=n; - -#ifdef VERBOSE - printf("Board is for %d modules\n",n); -#endif - detectorModules=malloc(n*sizeof(sls_detector_module)); - detectorChips=malloc(n*NCHIP*sizeof(int)); - detectorChans=malloc(n*NCHIP*NCHAN*sizeof(int)); - detectorDacs=malloc(n*NDAC*sizeof(int)); - detectorAdcs=malloc(n*NADC*sizeof(int)); -#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",(unsigned int)(detectorModules), (unsigned int)(detectorModules+n)); - printf("chips from 0x%x to 0x%x\n",(unsigned int)(detectorChips), (unsigned int)(detectorChips+n*NCHIP)); - printf("chans from 0x%x to 0x%x\n",(unsigned int)(detectorChans), (unsigned int)(detectorChans+n*NCHIP*NCHAN)); - printf("dacs from 0x%x to 0x%x\n",(unsigned int)(detectorDacs), (unsigned int)(detectorDacs+n*NDAC)); - printf("adcs from 0x%x to 0x%x\n",(unsigned int)(detectorAdcs), (unsigned int)(detectorAdcs+n*NADC)); -#endif - for (imod=0; imoddacs=detectorDacs+imod*NDAC; - (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; - (detectorModules+imod)->chipregs=detectorChips+imod*NCHIP; - (detectorModules+imod)->chanregs=detectorChans+imod*NCHIP*NCHAN; - (detectorModules+imod)->ndac=NDAC; - (detectorModules+imod)->nadc=NADC; - (detectorModules+imod)->nchip=NCHIP; - (detectorModules+imod)->nchan=NCHIP*NCHAN; - (detectorModules+imod)->module=imod; - (detectorModules+imod)->gain=0; - (detectorModules+imod)->offset=0; - (detectorModules+imod)->reg=0; - /* initialize registers, dacs, retrieve sn, adc values etc */ - } - thisSettings=UNINITIALIZED; - sChan=noneSelected; - sChip=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - - /* - setCSregister(ALLMOD); //commented out by dhanya - setSSregister(ALLMOD); - counterClear(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - */ - - /* initialize dynamic range etc. */ - /* dynamicRange=getDynamicRange(); //always 16 not required commented out - nModX=setNMod(-1);*/ - - //dataBytes=nModX*NCHIP*NCHAN*4; - // dynamicRange=32; - // initChip(0, 0,ALLMOD); - //nModX=n; - // - - - return OK; -} - - -int setDefaultDacs() { - printf("Setting Default Dac values\n"); - - int ret = OK; - int i = 0; - int retval[2]={-1,-1}; - const int defaultvals[NDAC] = DEFAULT_DAC_VALS; - - for(i = 0; i < NDAC; ++i) { - // if not already default, set it to default - if (setDACRegister(i, -1, -1) != defaultvals[i]) { - initDACbyIndexDACU(i, defaultvals[i], 0, 0, retval); - if (abs(retval[0] - defaultvals[i])<=3) { - cprintf(RED, "Warning: Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval[0]); - ret = FAIL; - } - } - } - - return ret; -} - - - -int copyChannel(sls_detector_channel *destChan, sls_detector_channel *srcChan) { - destChan->chan=srcChan->chan; - destChan->chip=srcChan->chip; - destChan->module=srcChan->module; - destChan->reg=srcChan->reg; - return OK; -} - - -int copyChip(sls_detector_chip *destChip, sls_detector_chip *srcChip) { - - int ichan; - int ret=OK; - if ((srcChip->nchan)>(destChip->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - - destChip->nchan=srcChip->nchan; - destChip->reg=srcChip->reg; - destChip->chip=srcChip->chip; - destChip->module=srcChip->module; - for (ichan=0; ichan<(srcChip->nchan); ichan++) { - *((destChip->chanregs)+ichan)=*((srcChip->chanregs)+ichan); - } - return ret; -} - - -int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { - - int ichip, idac, ichan, iadc; - - int ret=OK; - -#ifdef VERBOSE - printf("Copying module %x to module %x\n",(unsigned int)(srcMod),(unsigned int)(destMod)); -#endif - - if (srcMod->module>=0) { -#ifdef VERBOSE - printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); -#endif - destMod->module=srcMod->module; - } - if (srcMod->serialnumber>=0){ -/* #ifdef VERBOSE */ -/* printf("Copying module serial number %x to module serial number %x\n",srcMod->serialnumber,destMod->serialnumber); */ -/* #endif */ - destMod->serialnumber=srcMod->serialnumber; - } - if ((srcMod->nchip)>(destMod->nchip)) { - printf("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"); - return FAIL; - } - if ((srcMod->ndac)>(destMod->ndac)) { - printf("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"); - 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 - - - - 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; - - // printf("copying gain and offset %f %f to %f %f\n",srcMod->gain,srcMod->offset,destMod->gain,destMod->offset); - - for (ichip=0; ichip<(srcMod->nchip); ichip++) { - if (*((srcMod->chipregs)+ichip)>=0) - *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); - } - for (ichan=0; ichan<(srcMod->nchan); ichan++) { - if (*((srcMod->chanregs)+ichan)>=0) - *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); - } - for (idac=0; idac<(srcMod->ndac); idac++) { - if (*((srcMod->dacs)+idac)>=0) - *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); - } - for (iadc=0; iadc<(srcMod->nadc); iadc++) { - if (*((srcMod->adcs)+iadc)>=0) - *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); - } - return ret; -} - - - -/* Register commands */ - - -int clearDACSregister(int imod) { - - putout("1111111111111111",imod);//reset - putout("1111111111111110",imod);//cs down - - /* commented out by dhanya - putout("0000000001000000",imod); - putout("0000000101000000",imod); - putout("0000000101000000",imod); - putout("0000000001000000",imod); - */ -#ifdef DEBUG - fprintf(stdout, "Clearing DAC shiftregister\n"); -#endif - // sDac=0; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return OK; -} - -int nextDAC(int imod) { - - putout("1111111111111011",imod);//cs up - putout("1111111111111001",imod);//clk down - putout("1111111111111111",imod);//reset - - /*commented out by dhanya - putout("0000000001000000",imod); - putout("0000000001001000",imod); - putout("0000000001000000",imod); - */ -#ifdef DEBUG - fprintf(stdout, "Next DAC\n"); -#endif - // sDac++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return OK; -} - - -int clearCSregister(int imod) { - - putout("0000000001000000",imod); - putout("0000100001000000",imod); - putout("0000100001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Clearing CS shiftregister\n"); -#endif - /* - sChan=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - */ - sChip=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - //putout("0000000000000000",imod); - return 0; -} - -int setCSregister(int imod){ - - putout("0000000001000000",imod); - putout("0001000001000000",imod); - putout("0001000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Setting CS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChip=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextChip(int imod){ - - putout("0000000001000000",imod); - putout("0010000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Next Chip\n"); -#endif - sChip++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int firstChip(int imod){ - - putout("0100000001000000",imod); - putout("0110000001000000",imod); - putout("0100000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "First Chip\n"); -#endif - sChip=0; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int clearSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0000111000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Clearing SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int setSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0001011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Setting SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextStrip(int imod){ - putout("0000011000000000",imod); - putout("0010011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"|-"); -#endif - sChan++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int selChannel(const int strip,int imod) { - int istrip; - clearSSregister(imod); - nextStrip(imod); - for (istrip=0; istrip=0 && imod=0) - initDAC(ind,val, imod); - - if (imod>=0 && imodndac) - return (detectorDacs[ind+imod*NDAC]); - } - return FAIL; - */ - return setDACRegister(ind, -1, imod); -} - - -int initDAC(int dac_addr, int value, int imod) { -// int i; -#ifdef VERBOSE - printf("Programming dac %d with value %d\n", dac_addr, value); -#endif - clearDACSregister(imod); - program_one_dac(dac_addr,value,imod); - nextDAC(imod); - clearDACSregister(imod); - - return 0; -} - -int getTemperatureByModule(int tempSensor, int imod) -{ - int im; - //for the particular module - if (imod>=0 && imod=0 && imod=0 && imod=0) { -#ifdef VERBOSE - fprintf(stdout, "voltage %d\n", *(v+iaddr)); -#endif - program_one_dac(iaddr, *(v+iaddr),imod); - } - nextDAC(imod); - } - - - clearDACSregister(imod); - - return 0; - -} - - - - -int setSettings(int i, int imod) { -#ifdef VERBOSE - if(i==-1) - printf("\nReading settings of detector...\n"); - else - printf("\ninside set settings wit settings=%d...\n",i); -#endif - int confgain[] = CONF_GAIN; - int isett=-2,retval; - - //reading settings - if(i==GET_SETTINGS){ - retval=initConfGainByModule(i,i,imod); - if(retval==i) - isett=UNDEFINED; - } - //writing settings - else{ - retval=initConfGainByModule(i,confgain[i],imod); - if(retval!=i) - isett=UNDEFINED; - } - //if error while read/writing - if(isett==UNDEFINED) - printf("Error:Weird Value read back from the Gain/Settings Reg\n"); - else{ - //validating the settings read back - if((retval>=HIGHGAIN)&&(retval<=VERYHIGHGAIN)) - isett=retval; - else{ - isett=UNDEFINED; - printf("Error:Wrong Settings Read out:%d\n",retval); - } - } - thisSettings=isett; -//#ifdef VERBOSE - printf("detector settings are %d\n",thisSettings); -//#endif - return thisSettings; -} - - - - -/* Initialization*/ - -int initChannelbyNumber(sls_detector_channel myChan) { - int reg=myChan.reg; - int ft=reg & TRIM_DR; - int cae=(reg>>(NTRIMBITS))&1; - int ae=(reg>>(NTRIMBITS+1))&1; - int coe=(reg>>(NTRIMBITS+2))&1; - int ocoe=(reg>>(NTRIMBITS+3))&1; - int counts=(reg>>(NTRIMBITS+4)); -#ifdef VERBOSE - printf("Initializing channel %d chip %d module %d reg %x\n",myChan.chan,myChan.chip,myChan.module, reg); - printf("trim %d, cae %d, ae %d, coe %d, ocoe %d, counts %d\n",ft, cae, ae, coe, ocoe, counts); -#endif - - if (myChan.chip<0) - setCSregister(myChan.module); - else - selChip(myChan.chip,myChan.module); - - if (myChan.chan<0) - setSSregister(myChan.module); - else - selChannel(myChan.chan,myChan.module); - - initChannel(ft,cae,ae, coe, ocoe, counts,myChan.module); - - setDynamicRange(dynamicRange); - - setCSregister(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - - return myChan.reg; - -} - -int getChannelbyNumber(sls_detector_channel* myChan) { - int imod, ichip, ichan; - imod=myChan->module; - ichip=myChan->chip; - ichan=myChan->chan; - - if (detectorChans) { - if (imod=0) { - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - myChan->reg=detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan]; - return OK; - } - } - return FAIL; - -} - -int getTrimbit(int imod, int ichip, int ichan) { - if (detectorChans) { - if (imod=0) - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - return (detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan] & TRIM_DR); - } - - return -1; -} - -int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod){ - - int ibit, bit, i, im, ichip, ichan; - int chanmi, chanma, chipmi, chipma, modmi, modma; - - - - sMod=imod; - // printf("initializing module %d\n",sMod); - if (imod==ALLMOD) { - sMod=allSelected; - - // printf("initializing all modules\n"); - } - - if (sChan==allSelected) { - // printf("initializing all channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=NCHAN; - } else if (sChan==noneSelected || sChan>NCHAN || sChan<0) { - // printf("initializing no channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=-1; - } else { - // printf("initializing channel %d ft=%d coe=%d\n",sChan, ft,coe); - chanmi=sChan; - chanma=sChan+1; - } - - if (sChip==allSelected) { - // printf("initializing all chips\n"); - chipmi=0; - chipma=NCHIP; - } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { - // printf("initializing no chips\n"); - chipmi=0; - chipma=-1; - } else { - // printf("initializing chip %d\n",sChip); - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - return 1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChans) { - for (im=modmi; im63 || ft<0) { - fprintf(stdout,"Fine Threshold is %d while should be between 0 and 63!",ft); - return 1; - } - /*cal_enable*/ - if (cae) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - } - /*n_an_enable*/ - if (ae) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } else { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } - /*trb5*/ - ibit=5; - bit=ft & (1<>1; - int nchan, ichan; - int ft, cae, ae, coe, ocoe, counts, chanreg; - - - - nchan=myChip.nchan; - if (ichip<0) - setCSregister(imod); - else - selChip(ichip,imod); - - clearSSregister(imod); - for (ichan=0; ichan>(NTRIMBITS+1))&1; - ae=(chanreg>>(NTRIMBITS+2))&1; - coe=((chanreg)>>(NTRIMBITS+3))&1; - ocoe=((chanreg)>>(NTRIMBITS+4))&1; - counts=((chanreg)>>(NTRIMBITS+5)); - nextStrip(imod); - initChannel(ft,cae,ae, coe, ocoe, counts,imod); - } - initChip(obe,ow,imod); - return myChip.reg; - -} - -int getChipbyNumber(sls_detector_chip* myChip){ - int imod, ichip; - imod=myChip->module; - ichip=myChip->chip; - - if (detectorChips) { - if (imodnchip) { - myChip->reg=detectorChips[ichip+imod*NCHIP]; - myChip->nchan=NCHAN; - myChip->chanregs=detectorChans+imod*NCHAN*NCHIP+ichip*NCHIP; - return OK; - } - } - return FAIL; - -} - - - -int initChip(int obe, int ow,int imod){ - int i; - int im, ichip; - int chipmi, chipma, modmi, modma; - /* switch (ow) { - case 0:; - case 1: - setDynamicRange(32); - break; - case 2: - setDynamicRange(16); - break; - case 3: - setDynamicRange(8); - break; - case 4: - setDynamicRange(4); - break; - case 5: - setDynamicRange(1); - break; - default: - setDynamicRange(32); - break; - } - */ - -#ifdef DEBUGOUT - printf("Initializing chip\n"); -#endif - putout("0000000000000000",imod); -#ifdef DEBUGOUT - printf("Output mode= %d\n", ow); -#endif - - /* clearing shift in register */ - for (i=0; i<10; i++) - putout("0000100000000000",imod); - putout("0000000000000000",imod); - - if (ow>0) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - for (i=0; i<(OUTMUX_OFFSET-1); i++) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>1) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>2) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>3) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>4) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - } -#ifdef DEBUGOUT - printf("Output buffer enable= %d\n", obe); -#endif - if (obe) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - /*}*/ - putout("0000000000000000",imod); - - - - - - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - - - if (sChip==allSelected) { - chipmi=0; - chipma=NCHIP; - } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChips) { - for (im=modmi; imNCHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChips) { - for (im=modmi; imnModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorModules) { - for (im=modmi; imreg)=cm; -#ifdef VERBOSE - printf("imod=%d reg=%d (%x)\n",im,(detectorModules+im)->reg,(unsigned int)((detectorModules+im))); -#endif - } - } - return 0; -} - -int initModulebyNumber(sls_detector_module myMod) { - - printf("\ninside initmoduleynumber..\n"); - - int nchip,nchan;//int ichip, nchip, ichan, nchan; - int im, modmi,modma; - // int ft, cae, ae, coe, ocoe, counts, chanreg; - int imod; - // int obe; - // int ow; - int v[NDAC]; - - - nchip=myMod.nchip; - nchan=(myMod.nchan)/nchip; - - imod=myMod.module; - sMod=imod; - - if (sMod==ALLMOD) - sMod=allSelected; - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {// (sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - - /* - for (idac=0; idacmodule; -#ifdef VERBOSE - printf("Getting module %d\n",imod); -#endif - if (detectorModules) { - copyModule(myMod,detectorModules+imod); - ; - } else - return FAIL; - - return OK; -} - -/* To chips */ -int clearCounter(int imod){ - int i; -#ifdef DEBUG - printf("Clearing counter with contclear\n"); -#endif - putout("0000000000000000",imod); - for (i=0; i<10; i++) - putout("0000000000010000",imod); - putout("0000000000000000",imod); - - return 0; -} - -int clearOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Clearing output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0000110000000000",imod); - putout("0000010000000000",imod); - return 0; -} -int setOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Setting output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0001010000000000",imod); - putout("0000010000000000",imod); - return 0; -} - - -int extPulse(int ncal, int imod) { - int ical; -#ifdef DEBUG - printf("Giving a clock pulse to the counter\n"); -#endif - for (ical=0; ical0 && i%2==0) { - printf("Shift in: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<0 && (dum & (1<0) { - printf("Shift out: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, (dum &1<0 && i%2==0) { - printf("Shift stsel: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<> 1; - - - putout("0000000000000000",ALLMOD); - putout("0010000000000000",ALLMOD); //change mux setting - putout("0000000000000000",ALLMOD); - } - - printf("Test FpgaMux module %d : %d errors\n", imod,result); - if (result) - return 1; - else - return 0; -} - - - - - - - - - -int calibration_sensor(int num, int *v, int *dacs) { - int ich, ichip, imod; - int val[10]; - - - printf("calibrating sensor..."); - for (imod=0; imod=0){ - - //clear rois - for(i=0;i=0) && (adc<=4)); - else { - printf("warning:adc value greater than 5. deleting roi\n"); - adc=-1; - } - } - } - printf("\tGoing to enable adc: %d\n", adc); - - //set rois for just 1 adc - take only 1st roi - if(adc!=-1){ - rois[0].xmin=adc*(NCHAN*NCHIPS_PER_ADC); - rois[0].xmax=(adc+1)*(NCHAN*NCHIPS_PER_ADC)-1; - rois[0].ymin=-1; - rois[0].ymax=-1; - nROI = 1; - printf("\tActual xmin:%d xmax:%d\n",rois[0].xmin,rois[0].xmax); - }else - nROI = 0; - - if((n!=0) && ((arg[0].xmin!=rois[0].xmin)|| - (arg[0].xmax!=rois[0].xmax)|| - (arg[0].ymin!=rois[0].ymin)|| - (arg[0].ymax!=rois[0].ymax))) - *ret=FAIL; - if(n!=nROI) - *ret=FAIL; - - //set adc of interest - setADC(adc); - } - -//#ifdef VERBOSE - if (nROI) { - printf("Rois:\n"); - for( i=0;i> DETECTOR_TYPE_OFFSET) == MOENCH_MODULE){ - printf("This is a MOENCH detector. Exiting Gotthard Server.\n\n"); - exit(-1); - } + //confirm if it is really gotthard + if (((bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>> DETECTOR_TYPE_OFFSET) == MOENCH_MODULE){ + printf("This is a MOENCH detector. Exiting Gotthard Server.\n\n"); + exit(-1); + } - if (b) { -#ifdef PROPIXD - printf("***This is a PROPIX detector***\n"); -#else - printf("***This is a GOTTHARD detector with %d chips per module***\n", NCHIP); -#endif - printf("\nBoard Revision:0x%x\n",(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)); -#ifdef MCB_FUNCS - initDetector(); - printf("Initializing Detector\n"); -#endif - testFpga(); - - //gotthard specific - setPhaseShiftOnce(); - configureADC(); - - setADC(-1); //already does setdaqreg and clean fifo - setSettings(DYNAMICGAIN,-1); - setDefaultDacs(); - - //Initialization - setFrames(1); - setTrains(1); - setExposureTime(1e6); - setPeriod(1e9); - setDelay(0); - setGates(0); - setTiming(GET_EXTERNAL_COMMUNICATION_MODE); - setMaster(GET_MASTER); - setSynchronization(GET_SYNCHRONIZATION_MODE); - startReceiver(1); - setMasterSlaveConfiguration(); - } - strcpy(mess,"dummy message"); - strcpy(lastClientIP,"none"); - strcpy(thisClientIP,"none1"); - lockStatus=0; - return OK; + if (b) { + printf("***This is a GOTTHARD detector with %d chips per module***\n", NCHIP); + printf("\nBoard Revision:0x%x\n",(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)); + initDetector(); + printf("Initializing Detector\n"); + } + strcpy(mess,"dummy message"); + strcpy(lastClientIP,"none"); + strcpy(thisClientIP,"none1"); + lockStatus=0; + return OK; } int decode_function(int file_des) { - int fnum,n; - int retval=FAIL; + int fnum,n; + int retval=FAIL; #ifdef VERBOSE - printf( "receive data\n"); + printf( "receive data\n"); #endif - n = receiveDataOnly(file_des,&fnum,sizeof(fnum)); - if (n <= 0) { + n = receiveDataOnly(file_des,&fnum,sizeof(fnum)); + if (n <= 0) { #ifdef VERBOSE - printf("ERROR reading from socket %d, %d %d\n", n, fnum, file_des); + printf("ERROR reading from socket %d, %d %d\n", n, fnum, file_des); #endif - return FAIL; - } + return FAIL; + } #ifdef VERBOSE - else - printf("size of data received %d\n",n); + else + printf("size of data received %d\n",n); #endif #ifdef VERBOSE - printf( "calling function fnum = %d %x\n",fnum,(unsigned int)(flist[fnum])); + printf( "calling function fnum = %d %x\n",fnum,(unsigned int)(flist[fnum])); #endif - if (fnum<0 || fnum>255) - fnum=255; - retval=(*flist[fnum])(file_des); - if (retval==FAIL) - printf( "Error executing the function = %d \n",fnum); - return retval; + if (fnum<0 || fnum>255) + fnum=255; + retval=(*flist[fnum])(file_des); + if (retval==FAIL) + printf( "Error executing the function = %d \n",fnum); + return retval; } int function_table() { - int i; - for (i=0;i<256;i++){ - flist[i]=&M_nofunc; - } - flist[F_EXIT_SERVER]=&exit_server; - flist[F_EXEC_COMMAND]=&exec_command; - flist[F_GET_DETECTOR_TYPE]=&get_detector_type; - flist[F_SET_NUMBER_OF_MODULES]=&set_number_of_modules; - flist[F_GET_MAX_NUMBER_OF_MODULES]=&get_max_number_of_modules; - flist[F_SET_EXTERNAL_SIGNAL_FLAG]=&set_external_signal_flag; - flist[F_SET_EXTERNAL_COMMUNICATION_MODE]=&set_external_communication_mode; - flist[F_GET_ID]=&get_id; - flist[F_DIGITAL_TEST]=&digital_test; - flist[F_WRITE_REGISTER]=&write_register; - flist[F_READ_REGISTER]=&read_register; - flist[F_SET_DAC]=&set_dac; - flist[F_GET_ADC]=&get_adc; - flist[F_SET_CHANNEL]=&set_channel; - flist[F_SET_CHIP]=&set_chip; - flist[F_SET_MODULE]=&set_module; - flist[F_GET_CHANNEL]=&get_channel; - flist[F_GET_CHIP]=&get_chip; - flist[F_GET_MODULE]=&get_module; - flist[F_GET_THRESHOLD_ENERGY]=&get_threshold_energy; - flist[F_SET_THRESHOLD_ENERGY]=&set_threshold_energy; - flist[F_SET_SETTINGS]=&set_settings; - flist[F_START_ACQUISITION]=&start_acquisition; - flist[F_STOP_ACQUISITION]=&stop_acquisition; - flist[F_START_READOUT]=&start_readout; - flist[F_GET_RUN_STATUS]=&get_run_status; - flist[F_READ_FRAME]=&read_frame; - flist[F_READ_ALL]=&read_all; - flist[F_START_AND_READ_ALL]=&start_and_read_all; - flist[F_SET_TIMER]=&set_timer; - flist[F_GET_TIME_LEFT]=&get_time_left; - flist[F_SET_DYNAMIC_RANGE]=&set_dynamic_range; - flist[F_SET_ROI]=&set_roi; - flist[F_SET_SPEED]=&set_speed; - flist[F_SET_READOUT_FLAGS]=&set_readout_flags; - flist[F_EXECUTE_TRIMMING]=&execute_trimming; - flist[F_LOCK_SERVER]=&lock_server; - flist[F_SET_PORT]=&set_port; - flist[F_GET_LAST_CLIENT_IP]=&get_last_client_ip; - flist[F_UPDATE_CLIENT]=&update_client; - flist[F_CONFIGURE_MAC]=&configure_mac; - flist[F_LOAD_IMAGE]=&load_image; - flist[F_SET_MASTER]=&set_master; - flist[F_SET_SYNCHRONIZATION_MODE]=&set_synchronization; - flist[F_READ_COUNTER_BLOCK]=&read_counter_block; - flist[F_RESET_COUNTER_BLOCK]=&reset_counter_block; - flist[F_PREPARE_ACQUISITION]=&start_receiver; - flist[F_CLEANUP_ACQUISITION]=&stop_receiver; - flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal; - flist[F_WRITE_ADC_REG]=&write_adc_register; - flist[F_CHECK_VERSION]= &check_version; - return OK; + int i; + for (i=0;i<256;i++){ + flist[i]=&M_nofunc; + } + flist[F_EXEC_COMMAND] = &exec_command; + flist[F_GET_DETECTOR_TYPE] = &get_detector_type; + flist[F_SET_EXTERNAL_SIGNAL_FLAG] = &set_external_signal_flag; + flist[F_SET_EXTERNAL_COMMUNICATION_MODE] = &set_external_communication_mode; + flist[F_GET_ID] = &get_id; + flist[F_DIGITAL_TEST] = &digital_test; + flist[F_SET_DAC] = &set_dac; + flist[F_GET_ADC] = &get_adc; + flist[F_WRITE_REGISTER] = &write_register; + flist[F_READ_REGISTER] = &read_register; + flist[F_SET_MODULE] = &set_module; + flist[F_GET_MODULE] = &get_module; + flist[F_SET_SETTINGS] = &set_settings; + flist[F_GET_THRESHOLD_ENERGY] = &M_nofunc; + flist[F_START_ACQUISITION] = &start_acquisition; + flist[F_STOP_ACQUISITION] = &stop_acquisition; + flist[F_START_READOUT] = &start_readout; + flist[F_GET_RUN_STATUS] = &get_run_status; + flist[F_START_AND_READ_ALL] = &start_and_read_all; + flist[F_READ_ALL] = &read_all; + flist[F_SET_TIMER] = &set_timer; + flist[F_GET_TIME_LEFT] = &get_time_left; + flist[F_SET_DYNAMIC_RANGE] = &set_dynamic_range; + flist[F_SET_READOUT_FLAGS] = &set_readout_flags; + flist[F_SET_ROI] = &set_roi; + flist[F_SET_SPEED] = &set_speed; + flist[F_EXIT_SERVER] = &exit_server; + flist[F_LOCK_SERVER] = &lock_server; + flist[F_GET_LAST_CLIENT_IP] = &get_last_client_ip; + flist[F_SET_PORT] = &set_port; + flist[F_UPDATE_CLIENT] = &update_client; + flist[F_CONFIGURE_MAC] = &configure_mac; + flist[F_LOAD_IMAGE] = &load_image; + flist[F_READ_COUNTER_BLOCK] = &read_counter_block; + flist[F_RESET_COUNTER_BLOCK] = &reset_counter_block; + flist[F_CALIBRATE_PEDESTAL] = &M_nofunc; + flist[F_ENABLE_TEN_GIGA] = &M_nofunc; + flist[F_SET_ALL_TRIMBITS] = &M_nofunc; + flist[F_SET_CTB_PATTERN] = &M_nofunc; + flist[F_WRITE_ADC_REG] = &write_adc_register; + flist[F_SET_COUNTER_BIT] = &M_nofunc; + flist[F_PULSE_PIXEL] = &M_nofunc; + flist[F_PULSE_PIXEL_AND_MOVE] = &M_nofunc; + flist[F_PULSE_CHIP] = &M_nofunc; + flist[F_SET_RATE_CORRECT] = &M_nofunc; + flist[F_GET_RATE_CORRECT] = &M_nofunc; + flist[F_SET_NETWORK_PARAMETER] = &M_nofunc; + flist[F_PROGRAM_FPGA] = &M_nofunc; + flist[F_RESET_FPGA] = &M_nofunc; + flist[F_POWER_CHIP] = &M_nofunc; + flist[F_ACTIVATE] = &M_nofunc; + flist[F_PREPARE_ACQUISITION] = &M_nofunc; + flist[F_THRESHOLD_TEMP] = &M_nofunc; + flist[F_TEMP_CONTROL] = &M_nofunc; + flist[F_TEMP_EVENT] = &M_nofunc; + flist[F_AUTO_COMP_DISABLE] = &M_nofunc; + flist[F_STORAGE_CELL_START] = &M_nofunc; + flist[F_CHECK_VERSION] = &check_version; + flist[F_SOFTWARE_TRIGGER] = &M_nofunc; + return OK; } int M_nofunc(int file_des){ - - int ret=FAIL; - sprintf(mess,"Unrecognized Function\n"); - printf(mess); - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; + int ret=FAIL; + + sprintf(mess,"Unrecognized Function. Please do not proceed.\n"); + cprintf(BG_RED,"Error: %s",mess); + + int n = 1; + while (n > 0) + n = receiveData(file_des,mess,MAX_STR_LENGTH,OTHER); + + sendDataOnly(file_des,&ret,sizeof(ret)); + sendDataOnly(file_des,mess,sizeof(mess)); + return GOODBYE; } -int exit_server(int file_des) { - int retval=FAIL; - sendDataOnly(file_des,&retval,sizeof(retval)); - printf("closing server."); - sprintf(mess,"closing server"); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; -} + + int exec_command(int file_des) { - char cmd[MAX_STR_LENGTH]; - char answer[MAX_STR_LENGTH]; - int retval=OK; - int sysret=0; - int n=0; + char cmd[MAX_STR_LENGTH]; + char answer[MAX_STR_LENGTH]; + int retval=OK; + int sysret=0; + int n=0; - /* receive arguments */ - n = receiveDataOnly(file_des,cmd,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } + /* receive arguments */ + n = receiveDataOnly(file_des,cmd,MAX_STR_LENGTH); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + retval=FAIL; + } - /* execute action if the arguments correctly arrived*/ - if (retval==OK) { + /* execute action if the arguments correctly arrived*/ + if (retval==OK) { #ifdef VERBOSE - printf("executing command %s\n", cmd); + printf("executing command %s\n", cmd); #endif - if (lockStatus==0 || differentClients==0) - sysret=system(cmd); + if (lockStatus==0 || differentClients==0) + sysret=system(cmd); - //should be replaced by popen - if (sysret==0) { - sprintf(answer,"Succeeded\n"); - if (lockStatus==1 && differentClients==1) - sprintf(answer,"Detector locked by %s\n", lastClientIP); - } else { - sprintf(answer,"Failed\n"); - retval=FAIL; - } - } else { - sprintf(answer,"Could not receive the command\n"); - } - - /* send answer */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - n = sendDataOnly(file_des,answer,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error writing to socket"); - retval=FAIL; - } + //should be replaced by popen + if (sysret==0) { + sprintf(answer,"Succeeded\n"); + if (lockStatus==1 && differentClients==1) + sprintf(answer,"Detector locked by %s\n", lastClientIP); + } else { + sprintf(answer,"Failed\n"); + retval=FAIL; + } + } else { + sprintf(answer,"Could not receive the command\n"); + } + + /* send answer */ + n = sendDataOnly(file_des,&retval,sizeof(retval)); + n = sendDataOnly(file_des,answer,MAX_STR_LENGTH); + if (n < 0) { + sprintf(mess,"Error writing to socket"); + retval=FAIL; + } - /*return ok/fail*/ - return retval; - + /*return ok/fail*/ + return retval; + } int get_detector_type(int file_des) { - int n=0; - enum detectorType ret; - int retval=OK; - - sprintf(mess,"Can't return detector type\n"); + int n=0; + enum detectorType ret; + int retval=OK; + + sprintf(mess,"Can't return detector type\n"); - /* receive arguments */ - /* execute action */ - ret=myDetectorType; + /* receive arguments */ + /* execute action */ + ret=myDetectorType; #ifdef VERBOSE - printf("Returning detector type %d\n",ret); + printf("Returning detector type %d\n",ret); #endif - /* send answer */ - /* send OK/failed */ - if (differentClients==1) - retval=FORCE_UPDATE; + /* send answer */ + /* send OK/failed */ + if (differentClients==1) + retval=FORCE_UPDATE; - n += sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - - -} - - -int set_number_of_modules(int file_des) { - int n; - int arg[2], ret=0; - int retval=OK; - int dim, nm; - - sprintf(mess,"Can't set number of modules\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket %d", n); - retval=GOODBYE; - } - if (retval==OK) { - dim=arg[0]; - nm=arg[1]; - - /* execute action */ -#ifdef VERBOSE - printf("Setting the number of modules in dimension %d to %d\n",dim,nm ); -#endif - - //if (nm!=GET_FLAG) { - if (dim!=X && nm!=GET_FLAG) { - retval=FAIL; - sprintf(mess,"Can't change module number in dimension %d\n",dim); - } else { - if (lockStatus==1 && differentClients==1 && nm!=GET_FLAG) { - sprintf(mess,"Detector locked by %s\n", lastClientIP); - retval=FAIL; + n += sendDataOnly(file_des,&retval,sizeof(retval)); + if (retval!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&ret,sizeof(ret)); } else { - ret=setNMod(nm); - if (nModX==nm || nm==GET_FLAG) { - retval=OK; - if (differentClients==1) - retval=FORCE_UPDATE; - } else - retval=FAIL; + n += sendDataOnly(file_des,mess,sizeof(mess)); } - } - } - /*} else { - if (dim==Y) { - ret=nModY; - } else if (dim==X) { - ret=setNMod(-1); - } - } - */ - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - + /*return ok/fail*/ + return retval; + + } -int get_max_number_of_modules(int file_des) { - int n; - int ret; - int retval=OK; - enum dimension arg; - - sprintf(mess,"Can't get max number of modules\n"); - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* execute action */ -#ifdef VERBOSE - printf("Getting the max number of modules in dimension %d \n",arg); -#endif - - - switch (arg) { - case X: - ret=getNModBoard(); - break; - case Y: - ret=NMAXMODY; - break; - default: - ret=FAIL; - retval=FAIL; - break; - } -#ifdef VERBOSE - printf("Max number of module in dimension %d is %d\n",arg,ret ); -#endif - - - - if (differentClients==1 && retval==OK) { - retval=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - - /*return ok/fail*/ - return retval; -} - - -//index 0 is in gate -//index 1 is in trigger -//index 2 is out gate -//index 3 is out trigger int set_external_signal_flag(int file_des) { int n; @@ -463,15 +292,15 @@ int set_external_signal_flag(int file_des) { break; default: - if (lockStatus && differentClients) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n", lastClientIP); - } else if (signalindex > 0) { - ret=FAIL; - sprintf(mess,"Signal index %d is reserved. Only index 0 can be configured.\n", signalindex); - } else { - retval=setExtSignal(flag); - } + if (lockStatus && differentClients) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n", lastClientIP); + } else if (signalindex > 0) { + ret=FAIL; + sprintf(mess,"Signal index %d is reserved. Only index 0 can be configured.\n", signalindex); + } else { + retval=setExtSignal(flag); + } } #ifdef VERBOSE printf("Setting external signal %d to flag %d\n",signalindex,flag ); @@ -515,31 +344,12 @@ int set_external_communication_mode(int file_des) { sprintf(mess,"Error reading from socket\n"); retval=FAIL; } - /* - enum externalCommunicationMode{ - GET_EXTERNAL_COMMUNICATION_MODE, - AUTO, - TRIGGER_EXPOSURE_SERIES, - TRIGGER_EXPOSURE_BURST, - TRIGGER_READOUT, - TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, - GATE_FIX_NUMBER, - GATE_FIX_DURATION, - GATE_WITH_START_TRIGGER, - GATE_COINCIDENCE_WITH_INTERNAL_ENABLE - }; - */ + if (retval==OK) { /* execute action */ ret=setTiming(arg); - /* switch(arg) { */ - /* default: */ - /* sprintf(mess,"The meaning of single signals should be set\n"); */ - /* retval=FAIL; */ - /* } */ - #ifdef VERBOSE printf("Setting external communication mode to %d\n", arg); @@ -564,344 +374,150 @@ int set_external_communication_mode(int file_des) { int get_id(int file_des) { - // sends back 64 bits! - int64_t retval=-1; - int ret=OK; - int n=0; - enum idMode arg; - - sprintf(mess,"Can't return id\n"); + // sends back 64 bits! + int64_t retval=-1; + int ret=OK; + int n=0; + enum idMode arg; - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } + sprintf(mess,"Can't return id\n"); + + /* receive arguments */ + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } #ifdef VERBOSE - printf("Getting id %d\n", arg); + printf("Getting id %d\n", arg); #endif - switch (arg) { - case DETECTOR_SERIAL_NUMBER: - retval=getDetectorNumber(); - break; - case DETECTOR_FIRMWARE_VERSION: - retval = (getFirmwareVersion() & 0xFFFFFF); - break; - case DETECTOR_SOFTWARE_VERSION: - retval = (GITDATE & 0xFFFFFF); - break; + switch (arg) { + case DETECTOR_SERIAL_NUMBER: + retval=getDetectorNumber(); + break; + case DETECTOR_FIRMWARE_VERSION: + retval = (getFirmwareVersion() & 0xFFFFFF); + break; + case DETECTOR_SOFTWARE_VERSION: + retval = (GITDATE & 0xFFFFFF); + break; case CLIENT_SOFTWARE_API_VERSION: return APIGOTTHARD; - default: - printf("Required unknown id %d \n", arg); - ret=FAIL; - retval=FAIL; - break; - } - + default: + printf("Required unknown id %d \n", arg); + ret=FAIL; + retval=FAIL; + break; + } + #ifdef VERBOSE - printf("Id is %llx\n", retval); + printf("Id is %llx\n", retval); #endif - - if (differentClients==1) - ret=FORCE_UPDATE; - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } + if (differentClients==1) + ret=FORCE_UPDATE; - /*return ok/fail*/ - return ret; + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&retval,sizeof(retval)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } + + /*return ok/fail*/ + return ret; } int digital_test(int file_des) { - int retval; - int ret=OK; - int imod=-1; - int n=0; - int ibit=0; - int ow; - int ival; - enum digitalTestMode arg; - - sprintf(mess,"Can't send digital test\n"); + int retval; + int ret=OK; + int n=0; + int ival; + enum digitalTestMode arg; - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } + sprintf(mess,"Can't send digital test\n"); + + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } #ifdef VERBOSE - printf("Digital test mode %d\n",arg ); + printf("Digital test mode %d\n",arg ); #endif - switch (arg) { - case CHIP_TEST: - n = receiveDataOnly(file_des,&imod,sizeof(imod)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } + switch (arg) { + case DETECTOR_FIRMWARE_TEST: + retval=testFpga(); + break; + case DETECTOR_BUS_TEST: + retval=testBus(); + break; + case DIGITAL_BIT_TEST: + n = receiveDataOnly(file_des,&ival,sizeof(ival)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + retval=FAIL; + } #ifdef VERBOSE - printf("of module %d\n", imod); -#endif - retval=0; -#ifdef MCB_FUNCS - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - break; - } - if (imod >= nModX) { - ret=FAIL; - sprintf(mess,"Module %d disabled\n",imod); - break; - } - if (testShiftIn(imod)) retval|=(1<<(ibit)); - ibit++; - if (testShiftOut(imod)) retval|=(1<<(ibit)); - ibit++; - if (testShiftStSel(imod)) retval|=(1<<(ibit)); - ibit++; - //if ( testDataInOut(0x123456, imod)) retval|=(1<<(ibit++)); - //if ( testExtPulse(imod)) retval|=(1<<(ibit++)); - // for (ow=0; ow<6; ow++) - // ow=1; - //#ifndef PICASSOD - for (ow=0; ow<5; ow++) { - //#endif - if (testDataInOutMux(imod, ow, 0x789abc)) retval|=(1<=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - -#ifdef MCB_FUNCS switch (ind) { case G_VREF_DS : idac=VREF_DS; @@ -967,7 +576,7 @@ int set_dac(int file_des) { printf("Unknown DAC index %d\n",ind); sprintf(mess,"Unknown DAC index %d\n",ind); ret=FAIL; - break; + break; } if (ret==OK) { @@ -976,7 +585,7 @@ int set_dac(int file_des) { sprintf(mess,"Detector locked by %s\n",lastClientIP); } else{ if(idac==HIGH_VOLTAGE){ - retval[0]=initHighVoltageByModule(val,imod); + retval[0]=initHighVoltage(val); ret=FAIL; if(retval[0]==-2) strcpy(mess,"Invalid Voltage.Valid values are 0,90,110,120,150,180,200"); @@ -985,7 +594,7 @@ int set_dac(int file_des) { else ret=OK; }else{ - initDACbyIndexDACU(idac,val,imod,mV,retval); + setDAC(idac,val,mV,retval); ret=FAIL; if(mV) temp = retval[1]; @@ -994,18 +603,16 @@ int set_dac(int file_des) { if ((abs(temp-val)<=3) || val==-1) { ret=OK; #ifdef VERBOSE - printf("DAC set to %d in dac units and %d mV\n", retval[0],retval[1]); + printf("DAC set to %d in dac units and %d mV\n", retval[0],retval[1]); #endif } } } } -#endif - if(ret==FAIL) - printf("Setting dac %d of module %d: wrote %d but read %d\n", ind, imod, val, temp); + printf("Setting dac %d: wrote %d but read %d\n", ind, val, temp); else{ if (differentClients) ret=FORCE_UPDATE; @@ -1034,31 +641,25 @@ int get_adc(int file_des) { //default: mod 0 int retval; int ret=OK; - int arg[2]; + int arg; enum dacIndex ind; - int imod; int n; int idac=0; sprintf(mess,"Can't read ADC\n"); - n = receiveDataOnly(file_des,arg,sizeof(arg)); + n = receiveDataOnly(file_des,&arg,sizeof(arg)); if (n < 0) { sprintf(mess,"Error reading from socket\n"); ret=FAIL; } - ind=arg[0]; - imod=0;//arg[1]; + ind=arg; #ifdef VERBOSE - printf("Getting ADC %d of module %d\n", ind, imod); + printf("Getting ADC %d\n", ind); #endif - if (imod>=getNModBoard() || imod<0) - ret=FAIL; - -#ifdef MCB_FUNCS switch (ind) { case TEMPERATURE_FPGA: idac=TEMP_FPGA; @@ -1070,18 +671,17 @@ int get_adc(int file_des) { printf("Unknown DAC index %d\n",ind); sprintf(mess,"Unknown DAC index %d\n",ind); ret=FAIL; - break; + break; } if (ret==OK) - retval=getTemperatureByModule(idac,imod); -#endif + retval=getTemperature(idac); #ifdef VERBOSE printf("ADC is %d V\n", retval); #endif if (ret==FAIL) { - printf("Getting adc %d of module %d failed\n", ind, imod); + printf("Getting adc %d failed\n", ind); } if (differentClients) @@ -1102,379 +702,232 @@ int get_adc(int file_des) { } -int set_channel(int file_des) { - int ret=OK; - sls_detector_channel myChan; - int retval; - int n; - - sprintf(mess,"Can't set channel\n"); + + +int write_register(int file_des) { + + int retval; + int ret=OK; + int arg[2]; + int addr, val; + int n; + u_int32_t address; + + sprintf(mess,"Can't write to register\n"); + + n = receiveDataOnly(file_des,arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + addr=arg[0]; + val=arg[1]; #ifdef VERBOSE - printf("Setting channel\n"); + printf("writing to register 0x%x data 0x%x\n", addr, val); #endif - ret=receiveChannel(file_des, &myChan); - if (ret>=0) - ret=OK; - else - ret=FAIL; + + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } + + + if(ret!=FAIL){ + address=(addr<<11); + if((address==FIFO_DATA_REG_OFF)||(address==CONTROL_REG)) + ret = bus_w16(address,val); + else + ret=bus_w(address,val); + if(ret==OK){ + if((address==FIFO_DATA_REG_OFF)||(address==CONTROL_REG)) + retval=bus_r16(address); + else + retval=bus_r(address); + } + } + + #ifdef VERBOSE - printf("channel number is %d, chip number is %d, module number is %d, register is %lld\n", myChan.chan,myChan.chip, myChan.module, myChan.reg); + printf("Data set to 0x%x\n", retval); #endif - - if (ret==OK) { - if (myChan.module>=getNModBoard()) - ret=FAIL; - if (myChan.chip>=NCHIP) - ret=FAIL; - if (myChan.chan>=NCHAN) - ret=FAIL; - if (myChan.module<0) - myChan.module=ALLMOD; - } + if (retval==val) { + ret=OK; + if (differentClients) + ret=FORCE_UPDATE; + } else { + ret=FAIL; + sprintf(mess,"Writing to register 0x%x failed: wrote 0x%x but read 0x%x\n", addr, val, retval); + } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initChannelbyNumber(myChan); -#endif - } - } - /* Maybe this is done inside the initialization funcs */ - //copyChannel(detectorChans[myChan.module][myChan.chip]+(myChan.chan), &myChan); - + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&retval,sizeof(retval)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } + /*return ok/fail*/ + return ret; - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - } +int read_register(int file_des) { + + int retval; + int ret=OK; + int arg; + int addr; + int n; + u_int32_t address; + + sprintf(mess,"Can't read register\n"); + + n = receiveDataOnly(file_des,&arg,sizeof(arg)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + addr=arg; -int get_channel(int file_des) { + //#ifdef VERBOSE + printf("reading register 0x%x\n", addr); + //#endif - int ret=OK; - sls_detector_channel retval; - - int arg[3]; - int ichan, ichip, imod; - int n; - - sprintf(mess,"Can't get channel\n"); + if(ret!=FAIL){ + address=(addr<<11); + if((address==FIFO_DATA_REG_OFF)||(address==CONTROL_REG)) + retval=bus_r16(address); + else + retval=bus_r(address); + } - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichan=arg[0]; - ichip=arg[1]; - imod=arg[2]; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0 && ichan=0) - ret=OK; - else - ret=FAIL; -#ifdef VERBOSE - printf("chip number is %d, module number is %d, register is %d, nchan %d\n",myChip.chip, myChip.module, myChip.reg, myChip.nchan); -#endif - - if (ret==OK) { - if (myChip.module>=getNModBoard()) - ret=FAIL; - if (myChip.module<0) - myChip.module=ALLMOD; - if (myChip.chip>=NCHIP) - ret=FAIL; - } - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initChipbyNumber(myChip); -#endif - } - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - return ret; -} - -int get_chip(int file_des) { - - - int ret=OK; - sls_detector_chip retval; - int arg[2]; - int ichip, imod; - int n; - - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichip=arg[0]; - imod=arg[1]; - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0) - ret=OK; - else - ret=FAIL; + if (ret>=0) + ret=OK; + else + ret=FAIL; #ifdef VERBOSE - printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n",myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); + printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n",myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); #endif - - if (ret==OK) { - if (myModule.module>=getNModBoard()) { - ret=FAIL; - printf("Module number is too large %d\n",myModule.module); - } - if (myModule.module<0) - myModule.module=ALLMOD; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initModulebyNumber(myModule); -#endif - } - } - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); + if (ret==OK) { + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + retval=setModule(myModule); + } + } - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - free(myChip); - free(myChan); - free(myDac); - free(myAdc); + if (differentClients==1 && ret==OK) + ret=FORCE_UPDATE; - // setDynamicRange(dr); always 16 commented out + /* Maybe this is done inside the initialization funcs */ + //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - return ret; + /* send answer */ + /* send OK/failed */ + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret!=FAIL) { + /* send return argument */ + n += sendDataOnly(file_des,&retval,sizeof(retval)); + } else { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } + free(myChip); + free(myChan); + free(myDac); + free(myAdc); + + // setDynamicRange(dr); always 16 commented out + + + return ret; } @@ -1482,213 +935,136 @@ int set_module(int file_des) { int get_module(int file_des) { - - int ret=OK; - - int arg; - int imod; - int n; - - - - sls_detector_module myModule; - int *myChip=malloc(NCHIP*sizeof(int)); - int *myChan=malloc(NCHIP*NCHAN*sizeof(int)); - int *myDac=malloc(NDAC*sizeof(int));/**dhanya*/ - int *myAdc=malloc(NADC*sizeof(int));/**dhanya*/ - - - if (myDac) - myModule.dacs=myDac; - else { - sprintf(mess,"could not allocate dacs\n"); - ret=FAIL; - } - if (myAdc) - myModule.adcs=myAdc; - else { - sprintf(mess,"could not allocate adcs\n"); - ret=FAIL; - } - if (myChip) - myModule.chipregs=myChip; - else { - sprintf(mess,"could not allocate chips\n"); - ret=FAIL; - } - if (myChan) - myModule.chanregs=myChan; - else { - sprintf(mess,"could not allocate chans\n"); - ret=FAIL; - } - - myModule.ndac=NDAC; - myModule.nchip=NCHIP; - myModule.nchan=NCHAN*NCHIP; - myModule.nadc=NADC; - + int ret=OK; + int n; + sls_detector_module myModule; + int *myChip=malloc(NCHIP*sizeof(int)); + int *myChan=malloc(NCHIP*NCHAN*sizeof(int)); + int *myDac=malloc(NDAC*sizeof(int)); + int *myAdc=malloc(NADC*sizeof(int)); - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - imod=arg; - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod= 0) { ret=FAIL; - sprintf(mess, "Changing settings of module %d: wrote %d but read %d\n", imod, isett, retval); + sprintf(mess, "Changing settings: wrote %d but read %d\n", isett, retval); printf("Warning: %s",mess); } @@ -1700,84 +1076,86 @@ int set_settings(int file_des) { } } } -#endif - } - if (ret==OK && differentClients==1) - ret=FORCE_UPDATE; + } + if (ret==OK && differentClients==1) + ret=FORCE_UPDATE; - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - - - return ret; + /* send answer */ + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } else + n += sendDataOnly(file_des,&retval,sizeof(retval)); + + + + return ret; } + + + int start_acquisition(int file_des) { - int ret=OK; - int n; - + int ret=OK; + int n; - sprintf(mess,"can't start acquisition\n"); + + sprintf(mess,"can't start acquisition\n"); #ifdef VERBOSE - printf("Starting acquisition\n"); + printf("Starting acquisition\n"); #endif - - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - ret=startStateMachine(); - } - if (ret==FAIL) - sprintf(mess,"Start acquisition failed\n"); - else if (differentClients) - ret=FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - return ret; + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + ret=startStateMachine(); + } + if (ret==FAIL) + sprintf(mess,"Start acquisition failed\n"); + else if (differentClients) + ret=FORCE_UPDATE; + + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } + return ret; } int stop_acquisition(int file_des) { - int ret=OK; - int n; - - sprintf(mess,"can't stop acquisition\n"); + int ret=OK; + int n; - cprintf(BG_RED,"Client command received to stop acquisition\n"); + sprintf(mess,"can't stop acquisition\n"); + + cprintf(BG_RED,"Client command received to stop acquisition\n"); - - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - ret=stopStateMachine(); - } - - if (ret==FAIL) - sprintf(mess,"Stop acquisition failed\n"); - else if (differentClients) - ret=FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - return ret; + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + ret=stopStateMachine(); + } + + if (ret==FAIL) + sprintf(mess,"Stop acquisition failed\n"); + else if (differentClients) + ret=FORCE_UPDATE; + + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } + return ret; } @@ -1785,31 +1163,31 @@ int stop_acquisition(int file_des) { int start_readout(int file_des) { - int ret=OK; - int n; - + int ret=OK; + int n; - sprintf(mess,"can't start readout\n"); + + sprintf(mess,"can't start readout\n"); #ifdef VERBOSE - printf("Starting readout\n"); + printf("Starting readout\n"); #endif - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - ret=startReadOut(); - } - if (ret==FAIL) - sprintf(mess,"Start readout failed\n"); - else if (differentClients) - ret=FORCE_UPDATE; + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + ret=startReadOut(); + } + if (ret==FAIL) + sprintf(mess,"Start readout failed\n"); + else if (differentClients) + ret=FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - return ret; + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } + return ret; @@ -1817,107 +1195,71 @@ int start_readout(int file_des) { int get_run_status(int file_des) { - int ret=OK; - int n; - - int retval; - enum runStatus s; - sprintf(mess,"getting run status\n"); + int ret=OK; + int n; + + + enum runStatus s; + sprintf(mess,"getting run status\n"); #ifdef VERBOSE - printf("Getting status\n"); + printf("Getting status\n"); #endif - retval= runState(); - printf("\n\nSTATUS=%08x\n",retval); + int retval = getStatus(); + if (ret!=OK) { + printf("get status failed %04x\n",retval); + sprintf(mess, "get status failed %08x\n", retval); - //stopped (external stop, also maybe fifo full) - if (runState() & STOPPED_BIT){ - printf("-----------------------------------STOPPED--------------------------------------x%0x\n",retval); - s=STOPPED; + } else if (differentClients) + ret=FORCE_UPDATE; - retval= runState(); - printf("reading again STATUS=%08x\n",retval); - if (runState() & STOPPED_BIT){ - printf("-----------------------------------ERROR--------------------------------------x%0x\n",retval); - s=ERROR; - } - } - - - - //error - else if(retval&SOME_FIFO_FULL_BIT){ - printf("-----------------------------------ERROR--------------------------------------x%0x\n",retval); - s=ERROR; - } - - - //runbusy=0 - // else if(!(retval&RUNMACHINE_BUSY_BIT)){ //commented by Anna 24.10.2012 - else if(!(retval&RUN_BUSY_BIT)){ // by Anna 24.10.2012 - - - - //and readbusy=1, its last frame read - if((retval&READMACHINE_BUSY_BIT) ){ // - - - printf("-----------------------------------READ MACHINE BUSY--------------------------\n"); - s=TRANSMITTING; - } else if (retval&ALL_FIFO_EMPTY_BIT) { - printf("-----------------------------------DATA IN FIFO--------------------------\n"); - s=TRANSMITTING; - - } - //and readbusy=0,idle - else if(!(retval&0xffff)){ - //if(!(retval&0x00000001)){ - printf("-----------------------------------IDLE--------------------------------------\n"); - s=IDLE; - } else { - printf("-----------------------------------Unknown status %08x--------------------------------------\n", retval); - s=ERROR; - ret=FAIL; - } - } - //if runbusy=1 - else { - if (retval&WAITING_FOR_TRIGGER_BIT){ - printf("-----------------------------------WAITING-----------------------------------\n"); - s=WAITING; - } - else{ - printf("-----------------------------------RUNNING-----------------------------------\n"); - s=RUNNING; - } - } - - - - - if (ret!=OK) { - printf("get status failed %04x\n",retval); - sprintf(mess, "get status failed %08x\n", retval); - - } else if (differentClients) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n += sendDataOnly(file_des,&s,sizeof(s)); - } - return ret; + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } else { + n += sendDataOnly(file_des,&s,sizeof(s)); + } + return ret; } -int read_frame(int file_des) { - dataret = FAIL; + + + + +int start_and_read_all(int file_des) { +#ifdef VERBOSE + printf("Starting and reading all frames\n"); +#endif + int dataret = FAIL; + if (differentClients==1 && lockStatus==1) { + dataret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + sendDataOnly(file_des,&dataret,sizeof(dataret)); + sendDataOnly(file_des,mess,sizeof(mess)); + return dataret; + + } + + startStateMachine(); + dataret = read_all(file_des); +#ifdef VERBOSE + printf("Frames finished\n"); +#endif + + return dataret; + + +} + + + +int read_all(int file_des) { + int dataret = FAIL; strcpy(mess,"wait for read frame failed\n"); if (differentClients==1 && lockStatus==1) { @@ -1961,158 +1303,90 @@ int read_frame(int file_des) { - - - -int read_all(int file_des) { - -while(read_frame(file_des)==OK) { - -#ifdef VERBOSE - printf("frame read\n"); -#endif - ; - } -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - return OK; - - -} - -int start_and_read_all(int file_des) { - //int dataret=OK; -#ifdef VERBOSE - printf("Starting and reading all frames\n"); -#endif - - if (differentClients==1 && lockStatus==1) { - dataret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return dataret; - - } - - startStateMachine(); - - /* ret=startStateMachine(); - if (ret!=OK) { - sprintf(mess,"could not start state machine\n"); - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - #ifdef VERBOSE - printf("could not start state machine\n"); -#endif -} else {*/ - read_all(file_des); -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - //} - - - return OK; - - -} - int set_timer(int file_des) { - enum timerIndex ind; - int64_t tns; - int n; - int64_t retval; - int ret=OK; - + enum timerIndex ind; + int64_t tns; + int n; + int64_t retval; + int ret=OK; - sprintf(mess,"can't set timer\n"); - - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&tns,sizeof(tns)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret!=OK) { - printf(mess); - } -//#ifdef VERBOSE - printf("setting timer %d to %lld ns\n",ind,tns); -//#endif - if (ret==OK) { + sprintf(mess,"can't set timer\n"); - if (differentClients==1 && lockStatus==1 && tns!=-1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - switch(ind) { - case FRAME_NUMBER: - retval=setFrames(tns); - break; - case ACQUISITION_TIME: - retval=setExposureTime(tns); - break; - case FRAME_PERIOD: - retval=setPeriod(tns); - break; - case DELAY_AFTER_TRIGGER: - retval=setDelay(tns); - break; - case GATES_NUMBER: - retval=setGates(tns); - break; - case PROBES_NUMBER: -#ifdef PROPIXD - sprintf(mess,"can't set/get number of probes for propix\n"); -#else - sprintf(mess,"can't set/get number of probes for gotthard\n"); -#endif + n = receiveDataOnly(file_des,&ind,sizeof(ind)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } - ret=FAIL; - break; - case CYCLES_NUMBER: - retval=setTrains(tns); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - } - if (ret!=OK) { - printf(mess); - if (differentClients) - ret=FORCE_UPDATE; - } + n = receiveDataOnly(file_des,&tns,sizeof(tns)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } - if (ret!=OK) { - printf(mess); - printf("set timer failed\n"); - } + if (ret!=OK) { + printf(mess); + } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { + //#ifdef VERBOSE + printf("setting timer %d to %lld ns\n",ind,tns); + //#endif + if (ret==OK) { + + if (differentClients==1 && lockStatus==1 && tns!=-1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + switch(ind) { + case FRAME_NUMBER: + retval=setFrames(tns); + break; + case ACQUISITION_TIME: + retval=setExposureTime(tns); + break; + case FRAME_PERIOD: + retval=setPeriod(tns); + break; + case DELAY_AFTER_TRIGGER: + retval=setDelay(tns); + break; + case GATES_NUMBER: + retval=setGates(tns); + break; + case CYCLES_NUMBER: + retval=setTrains(tns); + break; + default: + ret=FAIL; + sprintf(mess,"timer index unknown %d\n",ind); + break; + } + } + } + if (ret!=OK) { + printf(mess); + if (differentClients) + ret=FORCE_UPDATE; + } + + if (ret!=OK) { + printf(mess); + printf("set timer failed\n"); + } + + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n = sendDataOnly(file_des,mess,sizeof(mess)); + } else { #ifdef VERBOSE - printf("returning ok %d\n",(int)(sizeof(retval))); + printf("returning ok %d\n",(int)(sizeof(retval))); #endif - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } + n = sendDataOnly(file_des,&retval,sizeof(retval)); + } - return ret; + return ret; } @@ -2125,86 +1399,80 @@ int set_timer(int file_des) { int get_time_left(int file_des) { - enum timerIndex ind; - int n; - int64_t retval; - int ret=OK; - - sprintf(mess,"can't get timer\n"); - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - + enum timerIndex ind; + int n; + int64_t retval; + int ret=OK; + + sprintf(mess,"can't get timer\n"); + n = receiveDataOnly(file_des,&ind,sizeof(ind)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + #ifdef VERBOSE - printf("getting time left on timer %d \n",ind); + printf("getting time left on timer %d \n",ind); #endif - if (ret==OK) { - switch(ind) { - case FRAME_NUMBER: - retval=getFrames(); - break; - case ACQUISITION_TIME: - retval=getExposureTime(); - break; - case FRAME_PERIOD: - retval=getPeriod(); - break; - case DELAY_AFTER_TRIGGER: - retval=getDelay(); - break; - case GATES_NUMBER: - retval=getGates(); - break; - case PROBES_NUMBER: - retval=getProbes(); - break; - case CYCLES_NUMBER: - retval=getTrains(); - break; - case PROGRESS: - retval=getProgress(); - break; - case ACTUAL_TIME: - retval=getActualTime(); - break; - case MEASUREMENT_TIME: - retval=getMeasurementTime(); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } + if (ret==OK) { + switch(ind) { + case FRAME_NUMBER: + retval=getFrames(); + break; + case ACQUISITION_TIME: + retval=getExposureTime(); + break; + case FRAME_PERIOD: + retval=getPeriod(); + break; + case DELAY_AFTER_TRIGGER: + retval=getDelay(); + break; + case GATES_NUMBER: + retval=getGates(); + break; + case CYCLES_NUMBER: + retval=getTrains(); + break; + case ACTUAL_TIME: + retval=getActualTime(); + break; + case MEASUREMENT_TIME: + retval=getMeasurementTime(); + break; + default: + ret=FAIL; + sprintf(mess,"timer index unknown %d\n",ind); + break; + } + } - if (ret!=OK) { - printf("get time left failed\n"); - } else if (differentClients) - ret=FORCE_UPDATE; + if (ret!=OK) { + printf("get time left failed\n"); + } else if (differentClients) + ret=FORCE_UPDATE; #ifdef VERBOSE - printf("time left on timer %d is %lld\n",ind, retval); + printf("time left on timer %d is %lld\n",ind, retval); #endif - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret!=OK) { + n += sendDataOnly(file_des,mess,sizeof(mess)); + } else { + n = sendDataOnly(file_des,&retval,sizeof(retval)); + } #ifdef VERBOSE - printf("data sent\n"); + printf("data sent\n"); #endif - return ret; + return ret; } @@ -2212,44 +1480,71 @@ int get_time_left(int file_des) { int set_dynamic_range(int file_des) { - - int dr; - int n; - int retval; - int ret=OK; - - sprintf(mess,"can't set dynamic range\n"); - + int dr; + int n; + int retval; + int ret=OK; - n = receiveDataOnly(file_des,&dr,sizeof(dr)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - if (differentClients==1 && lockStatus==1 && dr>=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setDynamicRange(dr); - } - //if (dr>=0 && retval!=dr) ret=FAIL; - if (ret!=OK) { - sprintf(mess,"set dynamic range failed\n"); - } + sprintf(mess,"can't set dynamic range\n"); - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; + + n = receiveDataOnly(file_des,&dr,sizeof(dr)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + + + if (differentClients==1 && lockStatus==1 && dr>=0) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + retval=DYNAMIC_RANGE; + } + + //if (dr>=0 && retval!=dr) ret=FAIL; + if (ret!=OK) { + sprintf(mess,"set dynamic range failed\n"); + } + + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n = sendDataOnly(file_des,mess,sizeof(mess)); + } else { + n = sendDataOnly(file_des,&retval,sizeof(retval)); + } + return ret; } + + + + +int set_readout_flags(int file_des) { + + enum readOutFlags arg; + int ret=FAIL; + + + receiveDataOnly(file_des,&arg,sizeof(arg)); + +#ifdef PROPIXD + sprintf(mess,"can't set readout flags for propix\n"); +#else + sprintf(mess,"can't set readout flags for gotthard\n"); +#endif + + sendDataOnly(file_des,&ret,sizeof(ret)); + sendDataOnly(file_des,mess,sizeof(mess)); + + return ret; +} + + + + int set_roi(int file_des) { int i; @@ -2270,40 +1565,38 @@ int set_roi(int file_des) { } #ifdef PROPIXD - sprintf(mess,"can't set roi for propix\n"); - ret = FAIL; + sprintf(mess,"can't set roi for propix\n"); + ret = FAIL; #endif - if(ret != FAIL){ - if(nroi!=-1){ - n = receiveDataOnly(file_des,arg,nroi*sizeof(ROI)); - if (n != (nroi*sizeof(ROI))) { - sprintf(mess,"Received wrong number of bytes for ROI\n"); - ret=FAIL; - } - //#ifdef VERBOSE - printf("\n\nSetting ROI: nroi=%d\n",nroi); - for( i=0;i=0) { - if (lockStatus==0 || strcmp(lastClientIP,thisClientIP)==0 || strcmp(lastClientIP,"none")==0) - lockStatus=lock; - else { - ret=FAIL; - sprintf(mess,"Server already locked by %s\n", lastClientIP); - } - } - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&lockStatus,sizeof(lockStatus)); - - return ret; + int n; + int ret=OK; + + int lock; + n = receiveDataOnly(file_des,&lock,sizeof(lock)); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + printf("Error reading from socket (lock)\n"); + ret=FAIL; + } + if (lock>=0) { + if (lockStatus==0 || strcmp(lastClientIP,thisClientIP)==0 || strcmp(lastClientIP,"none")==0) + lockStatus=lock; + else { + ret=FAIL; + sprintf(mess,"Server already locked by %s\n", lastClientIP); + } + } + if (differentClients && ret==OK) + ret=FORCE_UPDATE; + + n = sendDataOnly(file_des,&ret,sizeof(ret)); + if (ret==FAIL) { + n = sendDataOnly(file_des,mess,sizeof(mess)); + } else + n = sendDataOnly(file_des,&lockStatus,sizeof(lockStatus)); + + return ret; } + +int get_last_client_ip(int file_des) { + int ret=OK; + int n; + if (differentClients ) + ret=FORCE_UPDATE; + n = sendDataOnly(file_des,&ret,sizeof(ret)); + n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); + + return ret; + +} + + int set_port(int file_des) { int n; int ret=OK; @@ -2500,66 +1769,51 @@ int set_port(int file_des) { } -int get_last_client_ip(int file_des) { - int ret=OK; - int n; - if (differentClients ) - ret=FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - - return ret; - -} int send_update(int file_des) { - int ret=OK; - enum detectorSettings t; - int n;//int thr, n; - //int it; - int64_t retval, tns=-1; - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - n = sendDataOnly(file_des,&nModX,sizeof(nModX)); - n = sendDataOnly(file_des,&nModY,sizeof(nModY)); - n = sendDataOnly(file_des,&dynamicRange,sizeof(dynamicRange)); - n = sendDataOnly(file_des,&dataBytes,sizeof(dataBytes)); - t=setSettings(GET_SETTINGS,-1); - n = sendDataOnly(file_des,&t,sizeof(t)); -/* thr=getThresholdEnergy(); - n = sendDataOnly(file_des,&thr,sizeof(thr));*/ - retval=setFrames(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setExposureTime(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setPeriod(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setDelay(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setGates(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); -/* retval=setProbes(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t));*/ - retval=setTrains(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + int ret=OK; + enum detectorSettings t; + int n;//int thr, n; + //int it; + int64_t retval, tns=-1; + n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); + int k = DYNAMIC_RANGE; + n = sendDataOnly(file_des,&k,sizeof(k)); + k = DATA_BYTES; + n = sendDataOnly(file_des,&k,sizeof(k)); + t=setSettings(GET_SETTINGS); + n = sendDataOnly(file_des,&t,sizeof(t)); + retval=setFrames(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setExposureTime(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setPeriod(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setDelay(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setGates(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); + retval=setTrains(tns); + n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - if (lockStatus==0) { - strcpy(lastClientIP,thisClientIP); - } + if (lockStatus==0) { + strcpy(lastClientIP,thisClientIP); + } + + return ret; - return ret; - } int update_client(int file_des) { - int ret=OK; + int ret=OK; + + sendDataOnly(file_des,&ret,sizeof(ret)); + return send_update(file_des); + - sendDataOnly(file_des,&ret,sizeof(ret)); - return send_update(file_des); - - } @@ -2570,7 +1824,6 @@ int configure_mac(int file_des) { char arg[6][50]; int n; - int imod=0;//should be in future sent from client as -1, arg[2] int ipad; long long int imacadd; long long int idetectormacadd; @@ -2610,16 +1863,9 @@ int configure_mac(int file_des) { #endif - - if (imod>=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - //#ifdef VERBOSE - printf("Configuring MAC of module %d at port %x\n", imod, udpport); + printf("Configuring MAC at port %x\n", udpport); //#endif -#ifdef MCB_FUNCS if (ret==OK){ if(runBusy()){ ret=stopStateMachine(); @@ -2631,11 +1877,10 @@ int configure_mac(int file_des) { configureMAC(ipad,imacadd,idetectormacadd,detipad,digitalTestBit,udpport); retval=getAdcConfigured(); } -#endif if (ret==FAIL) - printf("configuring MAC of mod %d failed\n", imod); + printf("configuring MAC failed\n"); else - printf("Configuremac successful of mod %d and adc %d\n",imod,retval); + printf("Configuremac successful and adc %d\n",retval); if (differentClients) ret=FORCE_UPDATE; @@ -2669,15 +1914,15 @@ int load_image(int file_des) { ret=FAIL; } - n = receiveDataOnly(file_des,ImageVals,dataBytes); + n = receiveDataOnly(file_des,ImageVals,DATA_BYTES); if (n < 0) { sprintf(mess,"Error reading from socket\n"); ret=FAIL; } #ifdef PROPIXD - sprintf(mess,"can't load image for propix\n"); - ret = FAIL; + sprintf(mess,"can't load image for propix\n"); + ret = FAIL; #endif switch (index) { @@ -2695,7 +1940,7 @@ int load_image(int file_des) { printf("Unknown index %d\n",index); sprintf(mess,"Unknown index %d\n",index); ret=FAIL; - break; + break; } if (ret==OK) { @@ -2730,97 +1975,6 @@ int load_image(int file_des) { -int set_master(int file_des) { - - enum masterFlags retval=GET_MASTER; - enum masterFlags arg; - int n; - int ret=OK; - // int regret=OK; - - - sprintf(mess,"can't set master flags\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setMaster(arg); - - } - if (retval==GET_MASTER) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - - - -int set_synchronization(int file_des) { - - enum synchronizationMode retval=GET_MASTER; - enum synchronizationMode arg; - int n; - int ret=OK; - //int regret=OK; - - - sprintf(mess,"can't set synchronization mode\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - //ret=setStoreInRAM(0); - // initChipWithProbes(0,0,0, ALLMOD); - retval=setSynchronization(arg); - } - if (retval==GET_SYNCHRONIZATION_MODE) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - int read_counter_block(int file_des) { @@ -2841,8 +1995,8 @@ int read_counter_block(int file_des) { #ifdef PROPIXD - sprintf(mess,"can't read counter block for propix\n"); - ret = FAIL; + sprintf(mess,"can't read counter block for propix\n"); + ret = FAIL; #endif if (ret==OK) { @@ -2869,7 +2023,7 @@ int read_counter_block(int file_des) { n = sendDataOnly(file_des,&ret,sizeof(ret)); if (ret!=FAIL) { /* send return argument */ - n += sendDataOnly(file_des,CounterVals,dataBytes);//1280*2 + n += sendDataOnly(file_des,CounterVals,DATA_BYTES);//1280*2 } else { n += sendDataOnly(file_des,mess,sizeof(mess)); } @@ -2924,118 +2078,6 @@ int reset_counter_block(int file_des) { -int start_receiver(int file_des) { - int ret=OK; - int n=0; - strcpy(mess,"Could not start receiver\n"); - - /* execute action if the arguments correctly arrived*/ -#ifdef MCB_FUNCS - if (lockStatus==1 && differentClients==1){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - ret=FAIL; - } - else - ret = startReceiver(1); - -#endif - - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if(ret==FAIL) - n = sendDataOnly(file_des,mess,sizeof(mess)); - /*return ok/fail*/ - return ret; -} - - - - - - -int stop_receiver(int file_des) { - int ret=OK; - int n=0; - - strcpy(mess,"Could not stop receiver\n"); - - /* execute action if the arguments correctly arrived*/ -#ifdef MCB_FUNCS - if (lockStatus==1 && differentClients==1){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - ret=FAIL; - } - else - ret=startReceiver(0); - -#endif - - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if(ret==FAIL) - n = sendDataOnly(file_des,mess,sizeof(mess)); - /*return ok/fail*/ - return ret; -} - - - - - -int calibrate_pedestal(int file_des){ - - int ret=OK; - int retval=-1; - int n; - int frames; - - sprintf(mess,"Could not calibrate pedestal\n"); - - n = receiveDataOnly(file_des,&frames,sizeof(frames)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else - ret=calibratePedestal(frames); - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - /*return ok/fail*/ - return ret; -} - - - int write_adc_register(int file_des) { int ret=OK; diff --git a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/server_funcs.h b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/server_funcs.h index 832ab3602..5c1571241 100755 --- a/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/server_funcs.h +++ b/slsDetectorSoftware/slsDetectorServers/gotthardDetectorServer/server_funcs.h @@ -21,79 +21,50 @@ int sockfd; int function_table(); - int decode_function(int); int init_detector(int); - int M_nofunc(int); -int exit_server(int); + // General purpose functions -int get_detector_type(int); -int set_number_of_modules(int); -int get_max_number_of_modules(int); - - int exec_command(int); +int get_detector_type(int); int set_external_signal_flag(int); int set_external_communication_mode(int); int get_id(int); int digital_test(int); -int write_register(int); -int read_register(int); int set_dac(int); int get_adc(int); -int set_channel(int); -int set_chip(int); +int write_register(int); +int read_register(int); int set_module(int); -int get_channel(int); -int get_chip(int); int get_module(int); - -int get_threshold_energy(int); -int set_threshold_energy(int); int set_settings(int); int start_acquisition(int); int stop_acquisition(int); int start_readout(int); int get_run_status(int); -int read_frame(int); -int read_all(int); int start_and_read_all(int); +int read_all(int); int set_timer(int); int get_time_left(int); int set_dynamic_range(int); -int set_roi(int); -int get_roi(int); -int set_speed(int); -void configureADC(); int set_readout_flags(int); -int execute_trimming(int); +int set_roi(int); +int set_speed(int); +int exit_server(int); int lock_server(int); -int set_port(int); int get_last_client_ip(int); -int set_master(int); -int set_synchronization(int); - -int update_client(int); +int set_port(int); int send_update(int); +int update_client(int); int configure_mac(int); - int load_image(int); int read_counter_block(int); int reset_counter_block(int); - -int start_receiver(int); -int stop_receiver(int); - - -int calibrate_pedestal(int); - -int set_roi(int); - int write_adc_register(int); int check_version(int); #endif