From c9a314d8291e64f875e0d97588e211d18a8d22ff Mon Sep 17 00:00:00 2001 From: bergamaschi Date: Fri, 9 Dec 2011 15:48:26 +0000 Subject: [PATCH] forces update git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@74 951219d9-93cf-4727-9268-0efd64621fa3 --- .../commonFiles/communication_funcs.c | 72 +- .../commonFiles/communication_funcs.h | 1 + .../commonFiles/sls_detector_defs.h | 7 +- .../mythenDetectorServer/firmware_funcs.c | 9 +- .../mythenDetectorServer/mcb_funcs.c | 12 +- .../mythenDetectorServer/server_funcs.c | 729 ++++++++++++------ .../mythenDetectorServer/server_funcs.h | 3 +- .../slsDetector/slsDetector.cpp | 296 +++++-- slsDetectorSoftware/slsDetector/slsDetector.h | 18 + 9 files changed, 766 insertions(+), 381 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/communication_funcs.c b/slsDetectorSoftware/commonFiles/communication_funcs.c index 2b20fa055..4f6bef997 100755 --- a/slsDetectorSoftware/commonFiles/communication_funcs.c +++ b/slsDetectorSoftware/commonFiles/communication_funcs.c @@ -16,6 +16,7 @@ const int send_rec_max_size=SEND_REC_MAX_SIZE; extern int errno; +char dummyClientIP[INET_ADDRSTRLEN]; //struct sockaddr_in address; //#define VERBOSE @@ -26,9 +27,9 @@ int bindSocket(unsigned short int port_number) { struct sockaddr_in addressS; int socketDescriptor; - int file_des; + //int file_des; - file_des= -1; + //file_des= -1; socketDescriptor = socket(AF_INET, SOCK_STREAM,0); //tcp //socketDescriptor = socket(PF_INET, SOCK_STREAM, 0); @@ -71,9 +72,6 @@ int bindSocket(unsigned short int port_number) { - printf(" %s %s\n",lastClientIP, thisClientIP); - - return socketDescriptor; } @@ -91,12 +89,12 @@ int getServerError(int socketDescriptor) int acceptConnection(int socketDescriptor) { struct sockaddr_in addressC; - int file_des; + int file_des=-1; //socklen_t address_length; size_t address_length=sizeof(struct sockaddr_in); - if(file_des>0) return file_des; + // if(file_des>0) return file_des; #ifndef C_ONLY @@ -162,15 +160,9 @@ int acceptConnection(int socketDescriptor) { socketDescriptor=-1; } - inet_ntop(AF_INET, &(addressC.sin_addr), thisClientIP, INET_ADDRSTRLEN); - -#ifdef VERBOSE - printf("client connected %d\n", file_des); - - printf("addressC %s\n", thisClientIP); - printf("addressC %s\n", lastClientIP); -#endif + inet_ntop(AF_INET, &(addressC.sin_addr), dummyClientIP, INET_ADDRSTRLEN); + // struct sockaddr_in @@ -218,48 +210,7 @@ void exitServer(int socketDescriptor) { -/* client close conenction */ -/* -#ifndef C_ONLY -void MySocketTCP::Disconnect(){ - - if(file_des>=0){ //then was open - if(is_a_server){ - close(file_des); - } - else { - close(socketDescriptor); - socketDescriptor=-1; - } - file_des=-1; - } - -} -#endif -*/ - - int sendDataOnly(int file_des, void* buf,int length) { - /* - int total_sent=0; - int nsending; - int nsent; - - -#ifdef VERY_VERBOSE - printf("want to send %d Bytes\n", length); -#endif - if (file_des<0) return -1; - - while(length>0){ - nsending = (length>send_rec_max_size) ? send_rec_max_size:length; - nsent = write(file_des,(char*)buf+total_sent,nsending); - if(!nsent) break; - length-=nsent; - total_sent+=nsent; - // cout<<"nsent: "<0) + strcpy(thisClientIP,dummyClientIP); + if (strcmp(lastClientIP,thisClientIP)) + differentClients=1; + else + differentClients=0; + return total_received; } diff --git a/slsDetectorSoftware/commonFiles/communication_funcs.h b/slsDetectorSoftware/commonFiles/communication_funcs.h index 959851167..34e5b05b7 100755 --- a/slsDetectorSoftware/commonFiles/communication_funcs.h +++ b/slsDetectorSoftware/commonFiles/communication_funcs.h @@ -17,6 +17,7 @@ char lastClientIP[INET_ADDRSTRLEN]; char thisClientIP[INET_ADDRSTRLEN]; int lockStatus; +int differentClients; int bindSocket(unsigned short int port_number); int acceptConnection(int socketDescriptor); diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index b95ed0f9e..d6819b266 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -159,7 +159,8 @@ enum dimension { enum { OK, /**< function succeeded */ FAIL, /**< function failed */ - FINISHED /**< acquisition finished */ + FINISHED, /**< acquisition finished */ + FORCE_UPDATE }; /** @@ -475,7 +476,9 @@ enum { F_GET_LAST_CLIENT_IP, /**< returns the IP of the client last connected to the detector */ - F_SET_PORT /**< Changes communication port of the server */ + F_SET_PORT, /**< Changes communication port of the server */ + + F_UPDATE_CLIENT /**< Returns all the important parameters to update the shared memory of the client */ /* Always append functions hereafter!!! */ diff --git a/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c b/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c index 2cc0e56a0..874d216d9 100755 --- a/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c @@ -151,8 +151,13 @@ u_int32_t readin(int modnum) { u_int32_t val; //addr=MCB_DOUT_REG_OFF+(modnum<<4); addr=MCB_DOUT_REG_OFF+(modnum<0 && 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++; @@ -1955,7 +1955,7 @@ int testShiftOut(int imod) { val=readin(k); //val=bus_r(MCB_DOUT_REG_OFF+(k<0 && (dum & (1<= nModX) { + ret=FAIL; + sprintf(mess,"Module %d disabled\n",imod); + break; + } if (testShiftIn(imod)) retval|=(1<<(ibit)); ibit++; if (testShiftOut(imod)) retval|=(1<<(ibit)); @@ -657,13 +701,17 @@ int digital_test(int file_des) { } #ifdef VERBOSE - printf("digital test result is 0x%x\n", retval); + printf("digital test result is 0x%x\n", retval); #endif - + //Always returns force update such that the dynamic range is always updated on the client + + // if (differentClients==1 && ret==OK) + ret=FORCE_UPDATE; + /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ n += sendDataOnly(file_des,&retval,sizeof(retval)); } else { @@ -698,16 +746,22 @@ int write_register(int file_des) { printf("writing to register 0x%x data 0x%x\n", addr, val); #endif - retval=bus_w(addr,val); + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else + retval=bus_w(addr,val); #ifdef VERBOSE printf("Data set to 0x%x\n", retval); #endif - if (retval==val) + if (retval==val) { ret=OK; - else { + 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); } @@ -715,7 +769,7 @@ int write_register(int file_des) { /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ n += sendDataOnly(file_des,&retval,sizeof(retval)); } else { @@ -760,13 +814,14 @@ int read_register(int file_des) { if (ret==FAIL) { ret=FAIL; printf("Reading register 0x%x failed\n", addr); - } + } else if (differentClients) + ret=FORCE_UPDATE; /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ n += sendDataOnly(file_des,&retval,sizeof(retval)); } else { @@ -850,6 +905,10 @@ add possible potentiometers like in chiptest board!!!!!!!!!!!!!!! } if (ret==OK) { + if (differentClients==1 && lockStatus==1 && val!=-1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else retval=initDACbyIndexDACU(idac,val,imod); } #endif @@ -857,9 +916,11 @@ add possible potentiometers like in chiptest board!!!!!!!!!!!!!!! #ifdef VERBOSE printf("DAC set to %f V\n", retval); #endif - if (retval==val || val==-1) + if (retval==val || val==-1) { ret=OK; - else { + if (differentClients) + ret=FORCE_UPDATE; + } else { ret=FAIL; printf("Setting dac %d of module %d: wrote %f but read %f\n", ind, imod, val, retval); } @@ -868,7 +929,7 @@ add possible potentiometers like in chiptest board!!!!!!!!!!!!!!! /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ n += sendDataOnly(file_des,&retval,sizeof(retval)); } else { @@ -951,10 +1012,13 @@ int get_adc(int file_des) { } + if (differentClients) + ret=FORCE_UPDATE; + /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ n += sendDataOnly(file_des,&retval,sizeof(retval)); } else { @@ -1000,19 +1064,27 @@ int set_channel(int file_des) { 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); + if (differentClients==1 && ret==OK) + ret=FORCE_UPDATE; + /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ n += sendDataOnly(file_des,&retval,sizeof(retval)); } else { @@ -1072,8 +1144,10 @@ int get_channel(int file_des) { if (ret==OK) { #ifdef MCB_FUNCS - ret=getChannelbyNumber(&retval); + ret=getChannelbyNumber(&retval); #endif + if (differentClients && ret==OK) + ret=FORCE_UPDATE; } #ifdef VERBOSE @@ -1083,7 +1157,7 @@ int get_channel(int file_des) { /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ ret=sendChannel(file_des, &retval); } else { @@ -1137,16 +1211,23 @@ int set_chip(int file_des) { 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==OK) { + if (ret!=FAIL) { /* send return argument */ n += sendDataOnly(file_des,&retval,sizeof(retval)); } else { @@ -1194,6 +1275,8 @@ int get_chip(int file_des) { #ifdef MCB_FUNCS ret=getChipbyNumber(&retval); #endif + if (differentClients && ret==OK) + ret=FORCE_UPDATE; } #ifdef VERBOSE @@ -1204,7 +1287,7 @@ int get_chip(int file_des) { /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ ret=sendChip(file_des, &retval); } else { @@ -1287,18 +1370,26 @@ int set_module(int file_des) { } 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); /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ n += sendDataOnly(file_des,&retval,sizeof(retval)); } else { @@ -1392,10 +1483,14 @@ int get_module(int file_des) { #endif } } + + if (differentClients==1 && ret==OK) + ret=FORCE_UPDATE; + /* send answer */ /* send OK/failed */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { /* send return argument */ ret=sendModule(file_des, &myModule); } else { @@ -1442,15 +1537,18 @@ int get_threshold_energy(int file_des) { retval=getThresholdEnergy(); #endif + #ifdef VERBOSE printf("Threshold is %d eV\n", retval); #endif + if (differentClients==1 && ret==OK) + ret=FORCE_UPDATE; /* send answer */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n += sendDataOnly(file_des,mess,sizeof(mess)); } else n += sendDataOnly(file_des,&retval,sizeof(retval)); @@ -1486,9 +1584,14 @@ int set_threshold_energy(int file_des) { printf("Setting threshold energy of module %d to %d eV with settings %d\n", imod, ethr, isett); #endif + if (differentClients==1 && lockStatus==1) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { #ifdef MCB_FUNCS - retval=setThresholdEnergy(ethr); + retval=setThresholdEnergy(ethr); #endif + } #ifdef VERBOSE printf("Threshold set to %d eV\n", retval); @@ -1500,11 +1603,12 @@ int set_threshold_energy(int file_des) { printf("Setting threshold of module %d: wrote %d but read %d\n", imod, ethr, retval); sprintf(mess,"Setting threshold of module %d: wrote %d but read %d\n", imod, ethr, retval); } - + if (ret==OK && differentClients==1) + ret=FORCE_UPDATE; /* send answer */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n += sendDataOnly(file_des,mess,sizeof(mess)); } else n += sendDataOnly(file_des,&retval,sizeof(retval)); @@ -1540,23 +1644,31 @@ int set_settings(int file_des) { printf("Changing settings of module %d to %d\n", imod, isett); #endif -#ifdef MCB_FUNCS - retval=setSettings(arg[0]); -#endif - -#ifdef VERBOSE - printf("Settings changed to %d\n", isett); -#endif - if (retval==isett || isett<0) - ret=OK; - else { + if (differentClients==1 && lockStatus==1 && arg[0]!=GET_SETTINGS) { ret=FAIL; - printf("Changing settings of module %d: wrote %d but read %d\n", imod, isett, retval); + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { +#ifdef MCB_FUNCS + retval=setSettings(arg[0]); +#endif +#ifdef VERBOSE + printf("Settings changed to %d\n", isett); +#endif + + if (retval==isett || isett<0) { + ret=OK; + } else { + ret=FAIL; + printf("Changing settings of module %d: wrote %d but read %d\n", imod, isett, retval); + } + } + if (ret==OK && differentClients==1) + ret=FORCE_UPDATE; /* send answer */ n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n += sendDataOnly(file_des,mess,sizeof(mess)); } else n += sendDataOnly(file_des,&retval,sizeof(retval)); @@ -1578,14 +1690,21 @@ int start_acquisition(int file_des) { #ifdef VERBOSE printf("Starting acquisition\n"); -#endif - - ret=startStateMachine(); - if (ret!=OK) +#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!=OK) { + if (ret==FAIL) { n += sendDataOnly(file_des,mess,sizeof(mess)); } return ret; @@ -1604,12 +1723,21 @@ int stop_acquisition(int file_des) { printf("Stopping acquisition\n"); #endif - ret=stopStateMachine(); - if (ret!=OK) + + 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!=OK) { + if (ret==FAIL) { n += sendDataOnly(file_des,mess,sizeof(mess)); } return ret; @@ -1628,13 +1756,20 @@ int start_readout(int file_des) { #ifdef VERBOSE printf("Starting readout\n"); -#endif - ret=startReadOut(); - if (ret!=OK) +#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; n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n += sendDataOnly(file_des,mess,sizeof(mess)); } return ret; @@ -1676,10 +1811,11 @@ int get_run_status(int file_des) { if (ret!=OK) { printf("get status failed\n"); - } + } else if (differentClients) + ret=FORCE_UPDATE; n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n += sendDataOnly(file_des,mess,sizeof(mess)); } else { n += sendDataOnly(file_des,&s,sizeof(s)); @@ -1701,6 +1837,17 @@ int read_frame(int file_des) { int 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)); + printf("dataret %d\n",dataret); + return dataret; + + } + + if (storeInRAM==0) { if ((dataretval=(char*)fifo_read_event())) { dataret=OK; @@ -1710,8 +1857,9 @@ int read_frame(int file_des) { sendDataOnly(file_des,&dataret,sizeof(dataret)); sendDataOnly(file_des,dataretval,dataBytes); #ifdef VERBOSE - printf("sent %d bytes\n",n); + printf("sent %d bytes\n",dataBytes); #endif + printf("dataret OK\n"); return OK; } else { //might add delay???? @@ -1732,6 +1880,7 @@ int read_frame(int file_des) { #ifdef VERYVERBOSE printf("message sent\n",mess); #endif + printf("dataret %d\n",dataret); return dataret; } } else { @@ -1760,15 +1909,18 @@ int read_frame(int file_des) { dataret=FINISHED; sprintf(mess,"acquisition successfully finished\n"); printf("%s\n",mess); + if (differentClients) + dataret=FORCE_UPDATE; } #ifdef VERBOSE printf("Frames left %d\n",getFrames()); #endif sendDataOnly(file_des,&dataret,sizeof(dataret)); sendDataOnly(file_des,mess,sizeof(mess)); + printf("dataret %d\n",dataret); return dataret; } - + printf("dataret %d\n",dataret); return dataret; } @@ -1782,7 +1934,7 @@ int read_frame(int file_des) { int read_all(int file_des) { - while(read_frame(0)==OK) { + while(read_frame(file_des)==OK) { #ifdef VERBOSE printf("frame read\n"); #endif @@ -1798,11 +1950,21 @@ int read_all(int file_des) { } int start_and_read_all(int file_des) { - // int ret=OK; + //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) { @@ -1814,7 +1976,7 @@ int start_and_read_all(int file_des) { printf("could not start state machine\n"); #endif } else {*/ - read_all(1); + read_all(file_des); #ifdef VERBOSE printf("Frames finished\n"); #endif @@ -1856,40 +2018,45 @@ int set_timer(int file_des) { printf("setting timer %d to %lld ns\n",ind,tns); #endif if (ret==OK) { - 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: - retval=setProbes(tns); - break; - case CYCLES_NUMBER: - retval=setTrains(tns); - break; - default: + + if (differentClients==1 && lockStatus==1 && tns!=-1) { ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); + 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: + retval=setProbes(tns); + break; + case CYCLES_NUMBER: + retval=setTrains(tns); + break; + default: + ret=FAIL; + sprintf(mess,"timer index unknown %d\n",ind); + } } } if (ret!=OK) { printf(mess); + if (differentClients) + ret=FORCE_UPDATE; } - //if (tns>=0 && retval!=tns && (retval+1)!=tns) { - // printf("wrote %lld, read %lld\n",tns,retval); - // ret=FAIL; - // } + if (ret!=OK) { printf(mess); printf("set timer failed\n"); @@ -1901,11 +2068,7 @@ int set_timer(int file_des) { } n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { -#ifdef VERBOSE - printf("returning error\n"); -#endif - + if (ret==FAIL) { n = sendDataOnly(file_des,mess,sizeof(mess)); } else { #ifdef VERBOSE @@ -1987,7 +2150,8 @@ int get_time_left(int file_des) { if (ret!=OK) { printf("get time left failed\n"); - } + } else if (differentClients) + ret=FORCE_UPDATE; #ifdef VERBOSE @@ -2014,7 +2178,7 @@ int set_dynamic_range(int file_des) { - int dr, ow; + int dr; int n; int retval; int ret=OK; @@ -2029,39 +2193,13 @@ int set_dynamic_range(int file_des) { ret=FAIL; } - if (dr>0) { - /* -#ifdef MCB_FUNCS - setCSregister(ALLMOD); - switch(dr) { - case 1: - ow=5; - break; - case 4: - ow=4; - break; - case 8: - ow=3; - break; - case 16: - ow=2; - break; - default: - // ow=0; - ow=1; - break; - } - - - initChip(0, ow,ALLMOD); -#endif - */ -#ifdef VERBOSE - printf("setting dynamic range to %d\n",dr); -#endif + + if (differentClients==1 && lockStatus==1 && dr>=0) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + retval=setDynamicRange(dr); } - retval=setDynamicRange(dr); - if (dr>=0 && retval!=dr) ret=FAIL; @@ -2071,10 +2209,12 @@ int set_dynamic_range(int file_des) { ret=allocateRAM(); if (ret!=OK) sprintf(mess,"Could not allocate RAM for the dynamic range selected\n"); + else if (differentClients) + ret=FORCE_UPDATE; } n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n = sendDataOnly(file_des,mess,sizeof(mess)); } else { n = sendDataOnly(file_des,&retval,sizeof(retval)); @@ -2119,43 +2259,59 @@ int set_speed(int file_des) { printf("setting speed variable %d to %d\n",arg,val); #endif if (ret==OK) { - switch (arg) { - case CLOCK_DIVIDER: - if (val>=0) - retval=setClockDivider(val); - else + + if (val>=0) { + if (differentClients==1 && lockStatus==1 && val>=0) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + switch (arg) { + case CLOCK_DIVIDER: + retval=setClockDivider(val); + break; + case WAIT_STATES: + retval=setWaitStates(val); + break; + case SET_SIGNAL_LENGTH: + retval=setSetLength(val); + break; + case TOT_CLOCK_DIVIDER: + retval=setTotClockDivider(val); + break; + case TOT_DUTY_CYCLE: + retval=setTotDutyCycle(val); + break; + default: + ret=FAIL; + } + } + } else { + + switch (arg) { + case CLOCK_DIVIDER: retval=getClockDivider(); - break; - case WAIT_STATES: - if (val>=0) - retval=setWaitStates(val); - else + break; + case WAIT_STATES: retval=getWaitStates(); - break; - case SET_SIGNAL_LENGTH: - if (val>=0) - retval=setSetLength(val); - else + break; + case SET_SIGNAL_LENGTH: retval=getSetLength(); - break; - case TOT_CLOCK_DIVIDER: - if (val>=0) - retval=setTotClockDivider(val); - else + break; + case TOT_CLOCK_DIVIDER: retval=getTotClockDivider(); - break; - case TOT_DUTY_CYCLE: - if (val>=0) - retval=setTotDutyCycle(val); - else + break; + case TOT_DUTY_CYCLE: retval=getTotDutyCycle(); - break; - default: - ret=FAIL; + break; + default: + ret=FAIL; + } } } + + n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n = sendDataOnly(file_des,mess,sizeof(mess)); } else { n = sendDataOnly(file_des,&retval,sizeof(retval)); @@ -2188,38 +2344,43 @@ int set_readout_flags(int file_des) { printf("setting readout flags to %d\n",arg); #endif - //ret=setStoreInRAM(0); - // initChipWithProbes(0,0,0, ALLMOD); - switch(arg) { - case GET_READOUT_FLAGS: - break; - case STORE_IN_RAM: - if (setStoreInRAM(1)==OK) - ret=OK; - else - ret=FAIL; - break; - case TOT_MODE: - if(setToT(1)) - ret=OK; - else - ret=FAIL; - break; - case CONTINOUS_RO: - if (setContinousReadOut(1)) - ret=OK; - else - ret=FAIL; - break; - // case PUMP_PROBE_MODE: - //set number of probes - //initChipWithProbes(0,0,2, ALLMOD); - //break; - default: - ret=setStoreInRAM(0); - regret=setConfigurationRegister(0); - ret=OK; - } + 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); + switch(arg) { + case GET_READOUT_FLAGS: + break; + case STORE_IN_RAM: + if (setStoreInRAM(1)==OK) + ret=OK; + else + ret=FAIL; + break; + case TOT_MODE: + if(setToT(1)) + ret=OK; + else + ret=FAIL; + break; + case CONTINOUS_RO: + if (setContinousReadOut(1)) + ret=OK; + else + ret=FAIL; + break; + // case PUMP_PROBE_MODE: + //set number of probes + //initChipWithProbes(0,0,2, ALLMOD); + //break; + default: + ret=setStoreInRAM(0); + regret=setConfigurationRegister(0); + ret=OK; + } + } retval=NORMAL_READOUT; if (storeInRAM) @@ -2234,9 +2395,11 @@ int set_readout_flags(int file_des) { if (ret!=OK) { printf("set readout flags failed\n"); sprintf(mess,"Could not allocate RAM\n"); - } + } else if (differentClients) + ret=FORCE_UPDATE; + n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n = sendDataOnly(file_des,mess,sizeof(mess)); } else { n = sendDataOnly(file_des,&retval,sizeof(retval)); @@ -2285,41 +2448,49 @@ int execute_trimming(int file_des) { #ifdef VERBOSE printf("trimming module %d mode %d, parameters %d %d \n",imod,mode, par1, par2); -#endif - if (ret==OK) { - switch(mode) { - case NOISE_TRIMMING: - // par1 is countlim; par2 is nsigma - ret=trim_with_noise(par1, par2, imod); - break; - case BEAM_TRIMMING: - // par1 is countlim; par2 is nsigma - ret=trim_with_beam(par1,par2,imod); - break; - case IMPROVE_TRIMMING: - // par1 is maxit; if par2!=0 vthresh will be optimized - ret=trim_improve(par1, par2,imod); - break; - case FIXEDSETTINGS_TRIMMING: - // par1 is countlim; if par2<0 then trimwithlevel else trim with median - ret=trim_fixed_settings(par1,par2,imod); - break; - // case OFFLINE_TRIMMING: - - //break; - default: - printf("Unknown trimming mode\n"); - sprintf(mess,"Unknown trimming mode\n"); - ret=FAIL; - } - } +#endif + if (differentClients==1 && lockStatus==1 ) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + + if (ret==OK) { + switch(mode) { + case NOISE_TRIMMING: + // par1 is countlim; par2 is nsigma + ret=trim_with_noise(par1, par2, imod); + break; + case BEAM_TRIMMING: + // par1 is countlim; par2 is nsigma + ret=trim_with_beam(par1,par2,imod); + break; + case IMPROVE_TRIMMING: + // par1 is maxit; if par2!=0 vthresh will be optimized + ret=trim_improve(par1, par2,imod); + break; + case FIXEDSETTINGS_TRIMMING: + // par1 is countlim; if par2<0 then trimwithlevel else trim with median + ret=trim_fixed_settings(par1,par2,imod); + break; + // case OFFLINE_TRIMMING: + + //break; + default: + printf("Unknown trimming mode\n"); + sprintf(mess,"Unknown trimming mode\n"); + ret=FAIL; + } + } + } if (ret!=OK) { printf("trimming failed\n"); - } + } else if (differentClients) + ret=FORCE_UPDATE; + n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n = sendDataOnly(file_des,mess,sizeof(mess)); } @@ -2348,10 +2519,11 @@ int lock_server(int file_des) { 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!=OK) { + if (ret==FAIL) { n = sendDataOnly(file_des,mess,sizeof(mess)); } else n = sendDataOnly(file_des,&lockStatus,sizeof(lockStatus)); @@ -2363,7 +2535,7 @@ int lock_server(int file_des) { int set_port(int file_des) { int n; int ret=OK; - int sd; + int sd=-1; enum portType p_type; /** data? control? stop? Unused! */ int p_number; /** new port number */ @@ -2381,19 +2553,24 @@ int set_port(int file_des) { printf("Error reading from socket (pnum)\n"); ret=FAIL; } - - if (p_number<1024) { - sprintf(mess,"Too low port number %d\n", p_number); - printf("\n"); + if (differentClients==1 && lockStatus==1 ) { ret=FAIL; - } - - printf("set port %d to %d\n",p_type, p_number); - - sd=bindSocket(p_number); + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { + if (p_number<1024) { + sprintf(mess,"Too low port number %d\n", p_number); + printf("\n"); + ret=FAIL; + } + printf("set port %d to %d\n",p_type, p_number); + + sd=bindSocket(p_number); + } if (sd>=0) { ret=OK; + if (differentClients ) + ret=FORCE_UPDATE; } else { ret=FAIL; sprintf(mess,"Could not bind port %d\n", p_number); @@ -2401,7 +2578,7 @@ int set_port(int file_des) { } n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { n = sendDataOnly(file_des,mess,sizeof(mess)); } else { n = sendDataOnly(file_des,&p_number,sizeof(p_number)); @@ -2418,10 +2595,60 @@ 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 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); + 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)); + + return ret; + + +} +int update_client(int file_des) { + + int ret=OK; + + sendDataOnly(file_des,&ret,sizeof(ret)); + return send_update(file_des); + + + +} diff --git a/slsDetectorSoftware/mythenDetectorServer/server_funcs.h b/slsDetectorSoftware/mythenDetectorServer/server_funcs.h index bfc237da4..d4e585d6a 100755 --- a/slsDetectorSoftware/mythenDetectorServer/server_funcs.h +++ b/slsDetectorSoftware/mythenDetectorServer/server_funcs.h @@ -71,6 +71,7 @@ int lock_server(int); int set_port(int); int get_last_client_ip(int); - +int update_client(int); +int send_update(int); #endif diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index bbf5ee043..ee0fc306d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -232,6 +232,7 @@ slsDetector::slsDetector(char *name, int id, int cport) : pthread_mutex_init(&mp, NULL); setTCPSocket(name, cport); + updateDetector(); } @@ -919,36 +920,49 @@ int slsDetector::disconnectControl() { /* generates file name without extension*/ string slsDetector::createFileName() { - createFileName(thisDetector->filePath, thisDetector->fileName, thisDetector->actionMask, currentScanVariable[0], thisDetector->scanPrecision[0], currentScanVariable[1], thisDetector->scanPrecision[1], currentPositionIndex, thisDetector->numberOfPositions, thisDetector->fileIndex); + return createFileName(thisDetector->filePath, thisDetector->fileName, thisDetector->actionMask, currentScanVariable[0], thisDetector->scanPrecision[0], currentScanVariable[1], thisDetector->scanPrecision[1], currentPositionIndex, thisDetector->numberOfPositions, thisDetector->fileIndex); } string slsDetector::createFileName(char *filepath, char *filename, int aMask, float sv0, int prec0, float sv1, int prec1, int pindex, int npos, int findex) { ostringstream osfn; + // string fn; /*directory name +root file name */ osfn << filepath << "/" << filename; - + + // cout << osfn.str() << endl; + // scan level 0 if ( aMask& (1 << (MAX_ACTIONS))) osfn << "_S" << fixed << setprecision(prec0) << sv0; + //cout << osfn.str() << endl; + //scan level 1 if (aMask & (1 << (MAX_ACTIONS+1))) osfn << "_s" << fixed << setprecision(prec1) << sv1; + //cout << osfn.str() << endl; + //position if (pindex>0 && pindex<=npos) osfn << "_p" << pindex; + //cout << osfn.str() << endl; + // file index osfn << "_" << findex; + //cout << osfn.str() << endl; + #ifdef VERBOSE cout << "created file name " << osfn.str() << endl; #endif + //cout << osfn.str() << endl; + //fn=oosfn.str()sfn.str(); return osfn.str(); } @@ -1192,13 +1206,15 @@ int slsDetector::setDetectorType(detectorType const type){ if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); - if (retval==OK) + if (retval!=FAIL) controlSocket->ReceiveDataOnly(&retType,sizeof(retType)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -1296,13 +1312,15 @@ int slsDetector::setNumberOfModules(int n, dimension d){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) + if (ret!=FAIL) { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); - else { + } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Deterctor returned error: " << mess << std::endl; + std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -1368,13 +1386,15 @@ int slsDetector::getMaxNumberOfModules(dimension d){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&d,sizeof(d)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) + if (ret!=FAIL) controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Deterctor returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -1435,13 +1455,15 @@ enum externalSignalFlag { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) + if (ret!=FAIL) controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -1504,13 +1526,15 @@ enum externalSignalFlag { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) + if (ret!=FAIL) controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -1574,13 +1598,15 @@ int64_t slsDetector::getId( idMode mode, int imod){ if (mode==MODULE_SERIAL_NUMBER) controlSocket->SendDataOnly(&imod,sizeof(imod)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) + if (ret!=FAIL) controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } else ret=FAIL; } else { @@ -1641,13 +1667,15 @@ int slsDetector::digitalTest( digitalTestMode mode, int imod){ if (mode==CHIP_TEST) controlSocket->SendDataOnly(&imod,sizeof(imod)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) + if (ret!=FAIL) controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -1732,13 +1760,15 @@ int slsDetector::writeRegister(int addr, int val){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) + if (ret!=FAIL) controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -1778,13 +1808,15 @@ int slsDetector::readRegister(int addr){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) + if (ret!=FAIL) controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -1838,7 +1870,7 @@ float slsDetector::setDAC(float val, dacIndex index, int imod){ controlSocket->SendDataOnly(arg,sizeof(arg)); controlSocket->SendDataOnly(&val,sizeof(val)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); if (index < thisDetector->nDacs){ @@ -1857,6 +1889,8 @@ float slsDetector::setDAC(float val, dacIndex index, int imod){ std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } @@ -1894,7 +1928,7 @@ float slsDetector::getADC(dacIndex index, int imod){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); if (adcs) { *(adcs+index+imod*thisDetector->nAdcs)=retval; @@ -1904,6 +1938,8 @@ float slsDetector::getADC(dacIndex index, int imod){ std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -1987,19 +2023,21 @@ int slsDetector::setChannel(sls_detector_channel chan){ sendChannel(&chan); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } - if (ret==OK) { + if (ret!=FAIL) { if (chanregs) { int mmin=imod, mmax=imod+1, chimin=ichip, chimax=ichip+1, chamin=ichan, chamax=ichan+1; @@ -2061,19 +2099,21 @@ int mmin=imod, mmax=imod+1, chimin=ichip, chimax=ichip+1, chamin=ichan, chamax=i controlSocket->SendDataOnly(arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { receiveChannel(&myChan); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } - if (ret==OK) { + if (ret!=FAIL) { if (chanregs) { *(chanregs+imod*thisDetector->nChans*thisDetector->nChips+ichip*thisDetector->nChips+ichan)=myChan.reg; } @@ -2152,19 +2192,21 @@ int slsDetector::setChip(sls_detector_chip chip){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); sendChip(&chip); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } - if (ret==OK) { + if (ret!=FAIL) { if (chipregs) *(chipregs+ichi+im*thisDetector->nChips)=retval; } @@ -2205,19 +2247,21 @@ int slsDetector::setChip(sls_detector_chip chip){ controlSocket->SendDataOnly(arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { receiveChip(&myChip); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } - if (ret==OK) { + if (ret!=FAIL) { if (chipregs) *(chipregs+ichip+imod*thisDetector->nChips)=myChip.reg; if (chanregs) { @@ -2342,19 +2386,21 @@ int slsDetector::setModule(sls_detector_module module){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); sendModule(&module); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } - if (ret==OK) { + if (ret!=FAIL) { if (detectorModules) { if (imod>=0 && imodnMod[X]*thisDetector->nMod[Y]) { (detectorModules+imod)->nchan=module.nchan; @@ -2446,19 +2492,21 @@ sls_detector_module *slsDetector::getModule(int imod){ controlSocket->SendDataOnly(&imod,sizeof(imod)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret==OK) { + if (ret!=FAIL) { receiveModule(myMod); } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } - if (ret==OK) { + if (ret!=FAIL) { if (detectorModules) { if (imod>=0 && imodnMod[X]*thisDetector->nMod[Y]) { (detectorModules+imod)->nchan=myMod->nchan; @@ -2547,7 +2595,7 @@ int slsDetector::getThresholdEnergy(int imod){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&imod,sizeof(imod)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { std::cout<< "Detector returned error: "<< std::endl; controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< mess << std::endl; @@ -2556,6 +2604,8 @@ int slsDetector::getThresholdEnergy(int imod){ thisDetector->currentThresholdEV=retval; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -2579,7 +2629,7 @@ int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isetti controlSocket->SendDataOnly(&imod,sizeof(imod)); controlSocket->SendDataOnly(&isettings,sizeof(isettings)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { std::cout<< "Detector returned error: "<< std::endl; controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< mess << std::endl; @@ -2591,6 +2641,8 @@ int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isetti thisDetector->currentThresholdEV=retval; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -2621,17 +2673,19 @@ int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isetti controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else{ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); thisDetector->currentSettings=(detectorSettings)retval; -#ifdef VERBOSE + //#ifdef VERBOSE std::cout<< "Settings are "<< retval << std::endl; -#endif + //#endif } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -2766,6 +2820,87 @@ detectorSettings slsDetector::setSettings( detectorSettings isettings, int imod) }; +int slsDetector::updateDetectorNoWait() { + + int ret=OK; + enum detectorSettings t; + int thr, n, nm; + int it; + int64_t retval, tns=-1; + char lastClientIP[INET_ADDRSTRLEN]; + + + n = controlSocket->ReceiveDataOnly(lastClientIP,sizeof(lastClientIP)); + cout << "Updating detector last modified by " << lastClientIP << endl; + + n = controlSocket->ReceiveDataOnly(&nm,sizeof(nm)); + thisDetector->nMod[X]=nm; + n = controlSocket->ReceiveDataOnly( &nm,sizeof(nm)); + thisDetector->nMod[Y]=nm; + thisDetector->nMods=thisDetector->nMod[Y]*thisDetector->nMod[X]; + + n = controlSocket->ReceiveDataOnly( &nm,sizeof(nm)); + thisDetector->dynamicRange=nm; + + n = controlSocket->ReceiveDataOnly( &nm,sizeof(nm)); + thisDetector->dataBytes=nm; + //t=setSettings(GET_SETTINGS); + n = controlSocket->ReceiveDataOnly( &t,sizeof(t)); + thisDetector->currentSettings=t; + //thr=getThresholdEnergy(); + n = controlSocket->ReceiveDataOnly( &thr,sizeof(thr)); + thisDetector->currentThresholdEV=thr; + //retval=setFrames(tns); + n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + thisDetector->timerValue[FRAME_NUMBER]=retval; + // retval=setExposureTime(tns); + n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + thisDetector->timerValue[ACQUISITION_TIME]=retval; + + //retval=setPeriod(tns); + n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + thisDetector->timerValue[FRAME_PERIOD]=retval; + //retval=setDelay(tns); + n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + thisDetector->timerValue[DELAY_AFTER_TRIGGER]=retval; + // retval=setGates(tns); + n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + thisDetector->timerValue[GATES_NUMBER]=retval; + //retval=setProbes(tns); + n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + thisDetector->timerValue[PROBES_NUMBER]=retval; + //retval=setTrains(tns); + n = controlSocket->ReceiveDataOnly( &retval,sizeof(int64_t)); + thisDetector->timerValue[CYCLES_NUMBER]=retval; + + return OK; + +} + + + + +int slsDetector::updateDetector() { + int fnum=F_UPDATE_CLIENT; + int ret=OK; + char mess[100]; + + if (thisDetector->onlineFlag==ONLINE_FLAG) { + if (controlSocket) { + if (controlSocket->Connect()>=0) { + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL) { + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + } else + updateDetectorNoWait(); + controlSocket->Disconnect(); + } + } + } + return ret; +} @@ -2788,11 +2923,13 @@ int slsDetector::startAcquisition(){ if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } - controlSocket->Disconnect(); + controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -2816,7 +2953,7 @@ int slsDetector::stopAcquisition(){ if (stopSocket->Connect()>=0) { stopSocket->SendDataOnly(&fnum,sizeof(fnum)); stopSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { stopSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } @@ -2844,11 +2981,13 @@ int slsDetector::startReadOut(){ if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -2869,13 +3008,15 @@ runStatus slsDetector::getRunStatus(){ if (stopSocket->Connect()>=0) { stopSocket->SendDataOnly(&fnum,sizeof(fnum)); stopSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { stopSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else { stopSocket->ReceiveDataOnly(&retval,sizeof(retval)); } stopSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -2919,10 +3060,11 @@ int* slsDetector::getDataFromDetector(){ int i; #endif -#ifdef VERBOSE - // std::cout<< "getting data "<< std::endl; -#endif + //#ifdef VERBOSE + std::cout<< "getting data "<< thisDetector->dataBytes << " " << nel<< std::endl; + //#endif controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + cout << "ret=" << ret << endl; if (ret!=OK) { n= controlSocket->ReceiveDataOnly(mess,sizeof(mess)); if (ret==FAIL) { @@ -2967,10 +3109,10 @@ int* slsDetector::readAll(){ #endif if (thisDetector->onlineFlag==ONLINE_FLAG) { if (controlSocket) { - if (controlSocket->Connect()>=0) { - controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - while ((retval=getDataFromDetector())){ - i++; + if (controlSocket->Connect()>=0) { + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + while ((retval=getDataFromDetector())){ + i++; #ifdef VERBOSE std::cout<< i << std::endl; #else @@ -3027,6 +3169,9 @@ int* slsDetector::startAndReadAll(){ int* retval; int i=0; startAndReadAllNoWait(); + //#ifdef VERBOSE + // std::cout<< "started" << std::endl; +//#endif while ((retval=getDataFromDetector())){ i++; #ifdef VERBOSE @@ -3066,10 +3211,11 @@ int slsDetector::startAndReadAllNoWait(){ thisDetector->stoppedFlag=0; if (thisDetector->onlineFlag==ONLINE_FLAG) { if (controlSocket) { - if (controlSocket->Connect()>=0) { - controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - return OK; - } + if (controlSocket->Connect()>=0) { + //std::cout<< "connected" << std::endl; + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + return OK; + } } } return FAIL; @@ -3173,7 +3319,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ controlSocket->SendDataOnly(&index,sizeof(index)); n=controlSocket->SendDataOnly(&t,sizeof(t)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else { @@ -3181,6 +3327,8 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ thisDetector->timerValue[index]=retval; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -3221,13 +3369,15 @@ int slsDetector::lockServer(int lock) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&lock,sizeof(lock)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -3250,13 +3400,15 @@ string slsDetector::getLastClientIP() { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else { controlSocket->ReceiveDataOnly(clientName,sizeof(clientName)); } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -3304,7 +3456,7 @@ int slsDetector::setPort(portType index, int num){ s->SendDataOnly(&index,sizeof(index)); n=s->SendDataOnly(&num,sizeof(num)); s->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { s->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else { @@ -3352,7 +3504,7 @@ int slsDetector::setPort(portType index, int num){ - if (ret==OK) { + if (ret!=FAIL) { switch(index) { case CONTROL_PORT: @@ -3487,13 +3639,15 @@ int slsDetector::setSpeed(speedVariable sp, int value) { std::cout<< "Sent "<< n << " bytes " << std::endl; #endif controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -3589,13 +3743,15 @@ int slsDetector::setDynamicRange(int n){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&n,sizeof(n)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else { controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -3604,7 +3760,7 @@ int slsDetector::setDynamicRange(int n){ retval=thisDetector->dynamicRange; } - if (ret==OK && retval>0) { + if (ret!=FAIL && retval>0) { /* checking the number of probes to chose the data size */ if (thisDetector->timerValue[PROBES_NUMBER]==0) { thisDetector->dataBytes=thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*retval/8; @@ -3665,7 +3821,7 @@ int slsDetector::setReadOutFlags(readOutFlags flag){ controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&flag,sizeof(flag)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else { @@ -3673,6 +3829,8 @@ int slsDetector::setReadOutFlags(readOutFlags flag){ thisDetector->roFlags=retval; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } else { @@ -3719,7 +3877,7 @@ int slsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod){ std::cout<< "sending mode bytes= "<< controlSocket->SendDataOnly(&mode,sizeof(mode)) << std::endl; controlSocket->SendDataOnly(arg,sizeof(arg)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { + if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } else { @@ -3733,6 +3891,8 @@ int slsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod){ retval=ret; } controlSocket->Disconnect(); + if (ret==FORCE_UPDATE) + updateDetector(); } } } @@ -5513,6 +5673,7 @@ string slsDetector::executeLine(int narg, char *args[], int action) { switch(thisDetector->myDetectorType) { case MYTHEN: + case PICASSO: case EIGER: if (sval=="standard") sett=STANDARD; @@ -6753,7 +6914,7 @@ void slsDetector::acquire(int delflag){ if (thisDetector->threadedProcessing) { startThread(delflag); } - + //cout << "data thread started " << endl; int np=1; if (thisDetector->numberOfPositions>0) np=thisDetector->numberOfPositions; @@ -6776,7 +6937,7 @@ void slsDetector::acquire(int delflag){ - //action at start + //cout << "action at start" << endl; if (thisDetector->stoppedFlag==0) { if (thisDetector->actionMask & (1 << startScript)) { //"Custom start script. The arguments are passed as nrun=n par=p."); @@ -6788,7 +6949,8 @@ void slsDetector::acquire(int delflag){ } } - for (int is0=0; is0stoppedFlag==0) { @@ -6823,7 +6985,8 @@ void slsDetector::acquire(int delflag){ break; - for (int is1=0; is1stoppedFlag==0) { @@ -6871,6 +7034,7 @@ void slsDetector::acquire(int delflag){ currentPositionIndex=0; for (int ip=0; ipstoppedFlag==0) { if (thisDetector->numberOfPositions>0) { go_to_position (thisDetector->detPositions[ip]); @@ -6886,7 +7050,11 @@ void slsDetector::acquire(int delflag){ //cmd=headerBeforeScript; //Custom script to write the header. \n The arguments will be passed as nrun=n fn=filenam acqtime=t gainmode=g threshold=thr badfile=badf angfile=angf bloffset=blo fineoffset=fo fffile=fffn tau=deadtau par=p") + // cout << "aaaaa" << endl; + //cout << createFileName() << endl; + //cout << "bbbbb" << endl; fn=createFileName(); + //cout << fn << endl; nowindex=thisDetector->fileIndex; if (thisDetector->stoppedFlag==0) { @@ -6894,6 +7062,8 @@ void slsDetector::acquire(int delflag){ if (thisDetector->correctionMask&(1<< I0_NORMALIZATION)) currentI0=get_i0(); + + // cout << "header " << endl; if (thisDetector->actionMask & (1 << headerBefore)) { //Custom script after each frame. The arguments are passed as nrun=n fn=filename par=p sv0=scanvar0 sv1=scanvar1 p0=par0 p1=par1" sprintf(cmd,"%s nrun=%d fn=%s acqtime=%f gainmode=%d threshold=%d badfile=%s angfile=%s bloffset=%f fineoffset=%f fffile=%s/%s tau=%f par=%s",thisDetector->actionScript[headerBefore],nowindex,fn.c_str(),((float)thisDetector->timerValue[ACQUISITION_TIME])*1E-9, thisDetector->currentSettings, thisDetector->currentThresholdEV, getBadChannelCorrectionFile().c_str(), getAngularConversion().c_str(), thisDetector->globalOffset, thisDetector->fineOffset,getFlatFieldCorrectionDir(),getFlatFieldCorrectionFile(), getRateCorrectionTau(), thisDetector->actionParameter[headerBefore]); @@ -6908,6 +7078,8 @@ void slsDetector::acquire(int delflag){ if (thisDetector->stoppedFlag==0) { + + // cout << "starting???? " << endl; startAndReadAll(); if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index f00d5d78b..8502b5cc1 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1010,6 +1010,24 @@ typedef struct sharedSlsDetector { */ virtual detectorSettings setSettings(detectorSettings isettings, int imod=-1); + /** + + updates the shared memory receiving the data from the detector (without asking and closing the connection + /returns OK + + */ + + int updateDetectorNoWait(); + + /** + + updates the shared memory receiving the data from the detector + /returns OK + + */ + + + int updateDetector(); // Acquisition functions