gotthard receiver works so far without cpu file write and tcp generic socket lock

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@337 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
l_maliakal_d
2012-11-12 15:48:28 +00:00
parent 6ee21ba810
commit 8f7872d056
21 changed files with 516 additions and 344 deletions

View File

@ -40,7 +40,10 @@ int err = 0;
pthread_t gui_acquisition_thread;
char buffer[BUFFER_LENGTH];
char buffer[BUFFER_LENGTH*2];
char sendbuffer[BUFFER_LENGTH*2];
char onebuffer[BUFFER_LENGTH];
int sd = -1;
int sockfd, sfilefd;
@ -49,11 +52,24 @@ int sockfd, sfilefd;
char filePath[MAX_STR_LENGTH]="";
char fileName[MAX_STR_LENGTH]="run";
int fileIndex=0;
int frameIndexNeeded=1;
//for each scan
int frameIndex=0;
int startFrameIndex=-1;
int framesInFile=0;
int framesCaught=0;
//for each acquisition
int acquisitionIndex=0;
int startAcquisitionIndex=-1;//to remember progress for scans
int totalFramesCaught=0;
int framesInFile=0;//to know when to start next file
enum runStatus status = IDLE;
@ -124,9 +140,7 @@ int setFileIndex(int index){
int getFramesCaught(){
return framesCaught;
}
int getFrameIndex(){
if(startFrameIndex==-1)
@ -137,6 +151,33 @@ int getFrameIndex(){
}
int getAcquisitionIndex(){
if(startAcquisitionIndex==-1)
acquisitionIndex=0;
else
acquisitionIndex=((int)(*((int*)buffer)) - startAcquisitionIndex)/2;
return acquisitionIndex;
}
int getFramesCaught(){
return framesCaught;
}
int getTotalFramesCaught(){
return totalFramesCaught;
}
int resetTotalFramesCaught(int index){
startAcquisitionIndex=-1;
totalFramesCaught=0;
frameIndexNeeded=index;
return frameIndexNeeded;
}
void* startListening(void *arg){
@ -149,16 +190,17 @@ void* startListening(void *arg){
sd = -1;
int rc1, rc2, rc;
int currframenum, prevframenum;
char buffer2[BUFFER_LENGTH];
// char buffer2[BUFFER_LENGTH];
char savefilename[128];
struct sockaddr_in serveraddr;
struct sockaddr_in clientaddr;
int clientaddrlen = sizeof(clientaddr);
framesInFile=0;
framesCaught=0;
frameIndex = 0;
frameIndex=0;
startFrameIndex=-1;
framesCaught=0;
/***********************************************************************/
/* Catch signal SIGINT to close files properly */
@ -167,7 +209,10 @@ void* startListening(void *arg){
//create file name
sprintf(savefilename, "%s/%s_f%09d_%d.dat", filePath,fileName,frameIndex,fileIndex);
if(!frameIndexNeeded)
sprintf(savefilename, "%s/%s_%d.dat", filePath,fileName,fileIndex);
else
sprintf(savefilename, "%s/%s_f%012d_%d.dat", filePath,fileName,framesCaught,fileIndex);
/***********************************************************************/
/* A do/while(FALSE) loop is used to make error cleanup easier. The */
@ -221,7 +266,11 @@ void* startListening(void *arg){
currframenum=(int)(*((int*)buffer));
getFrameIndex();
sprintf(savefilename, "%s/%s_f%09d_%d.dat", filePath,fileName,frameIndex,fileIndex);
//create file name
if(!frameIndexNeeded)
sprintf(savefilename, "%s/%s_%d.dat", filePath,fileName,fileIndex);
else
sprintf(savefilename, "%s/%s_f%012d_%d.dat", filePath,fileName,framesCaught,fileIndex);
printf("saving to %s\t\tpacket loss %f \%\t\tframenum %d\n", savefilename,((currframenum-prevframenum-(2*framesInFile))/(double)(2*framesInFile))*100.000,currframenum);
sfilefd = fopen((const char *) (savefilename), "w");
@ -230,16 +279,22 @@ void* startListening(void *arg){
}
status = RUNNING;
rc1 = recvfrom(sd, buffer, sizeof(buffer), 0,
rc1 = recvfrom(sd, buffer, sizeof(onebuffer), 0,
(struct sockaddr *) &clientaddr, &clientaddrlen);
//printf("rc1 done\n");
rc2 = recvfrom(sd, buffer2, sizeof(buffer2), 0,
rc2 = recvfrom(sd, buffer+sizeof(onebuffer), sizeof(onebuffer), 0,
(struct sockaddr *) &clientaddr, &clientaddrlen);
//for each scan
if(startFrameIndex==-1){
startFrameIndex=(int)(*((int*)buffer))-2;
prevframenum=startFrameIndex;
}
//start of acquisition
if(startAcquisitionIndex==-1)
startAcquisitionIndex=startFrameIndex;
//printf("rc2 done\n");
if ((rc1 < 0) || (rc2 < 0)) {
perror("recvfrom() failed");
@ -249,9 +304,10 @@ void* startListening(void *arg){
//so that it doesnt write the last frame twice
if(gui_acquisition_thread_running){
fwrite(buffer, 1, rc1, sfilefd);
fwrite(buffer2, 1, rc2, sfilefd);
fwrite(buffer+sizeof(onebuffer), 1, rc2, sfilefd);
framesInFile++;
framesCaught++;
totalFramesCaught++;
//printf("saving\n");
}
}
@ -332,6 +388,22 @@ int stopReceiver(){
}
char* readFrame(){
// volatile char* now_ptr=NULL;
//u_int32_t* ram_values=NULL;
// now_ptr=(char*)ram_values;
//memcpy(now_ptr,buffer ,sizeof(buffer));
// memcpy(sendbuffer,buffer ,sizeof(buffer));
while (((int)*((int*)buffer))%2==0) ;//usleep(20000);
// memcpy(sendbuffer,buffer ,sizeof(buffer));
//printf("freamenum%d\n",*((int*) sendbuffer));
return buffer;
}
#endif

View File

@ -13,13 +13,17 @@ char* getFilePath();
char* setFilePath(char fName[]);
int getFileIndex();
int setFileIndex(int index);
int getFramesCaught();
int getFrameIndex();
int getAcquisitionIndex();
int getFramesCaught();
int getTotalFramesCaught();
int resetTotalFramesCaught(int index);
void* startListening(void *arg);
int startReceiver();
int stopReceiver();
char* readFrame();
#endif

View File

@ -105,6 +105,8 @@ int function_table() {
flist[F_GET_RECEIVER_STATUS]=&get_receiver_status;
flist[F_GET_FRAMES_CAUGHT]=&get_frames_caught;
flist[F_GET_FRAME_INDEX]=&get_frame_index;
flist[F_RESET_FRAMES_CAUGHT]=&reset_frames_caught;
flist[F_READ_FRAME]=&read_frame;
flist[F_LOCK_RECEIVER]=&lock_receiver;
flist[F_SET_PORT]=&set_port;
@ -148,11 +150,11 @@ int set_file_name(int file_des) {
sprintf(mess,"Receiver locked by %s\n", lastClientIP);
ret=FAIL;
}
else if((strlen(fName))&&(getReceiverStatus()==RUNNING)){
/* else if((strlen(fName))&&(getReceiverStatus()==RUNNING)){
strcpy(mess,"Can not set file name while receiver running");
ret = FAIL;
}
else
*/ else
strcpy(retval,setFileName(fName));
}
@ -275,11 +277,11 @@ int set_file_index(int file_des) {
sprintf(mess,"Receiver locked by %s\n", lastClientIP);
ret=FAIL;
}
else if((index>=0)&&(getReceiverStatus()==RUNNING)){
/* else if((index>=0)&&(getReceiverStatus()==RUNNING)){
strcpy(mess,"Can not set file index while receiver running\n");
ret = FAIL;
}
else
*/ else
retval=setFileIndex(index);
}
@ -423,7 +425,7 @@ int get_frames_caught(int file_des) {
/* execute action if the arguments correctly arrived*/
#ifdef SLS_RECEIVER_FUNCTION_LIST
retval=getFramesCaught();
retval=getTotalFramesCaught();
#endif
if(ret==OK && differentClients){
@ -447,14 +449,14 @@ int get_frames_caught(int file_des) {
int get_frame_index(int file_des) {
int get_frame_index(int file_des) {printf("Getting frame Index\n");fflush(stdout);
int ret=OK;
int n=0;
int retval=-1;
/* execute action if the arguments correctly arrived*/
#ifdef SLS_RECEIVER_FUNCTION_LIST
retval=getFrameIndex();
retval=getAcquisitionIndex();
#endif
if(ret==OK && differentClients){
@ -465,6 +467,55 @@ int get_frame_index(int file_des) {
/* send answer */
n = sendDataOnly(file_des,&ret,sizeof(ret));
n = sendDataOnly(file_des,&retval,sizeof(retval));
printf("returnrdf:%d\n",retval);
/*return ok/fail*/
return ret;
}
int reset_frames_caught(int file_des) {
int ret=OK;
int n=0;
int retval=-1;
int index=-1;
strcpy(mess,"Could not reset frames caught\n");
/* receive arguments */
n = receiveDataOnly(file_des,&index,sizeof(index));
if (n < 0) {
sprintf(mess,"Error reading from socket\n");
ret=FAIL;
}
if (ret==OK) {
/* execute action if the arguments correctly arrived*/
#ifdef SLS_RECEIVER_FUNCTION_LIST
if (lockStatus==1 && differentClients==1){//necessary???
sprintf(mess,"Receiver locked by %s\n", lastClientIP);
ret=FAIL;
}
else
retval=resetTotalFramesCaught(index);
#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));
n = sendDataOnly(file_des,&retval,sizeof(retval));
/*return ok/fail*/
return ret;
}
@ -475,6 +526,37 @@ int get_frame_index(int file_des) {
int read_frame(int file_des) {
int ret=OK;
int n=0;
char* retval=NULL;
char buffer[1286*2];
strcpy(mess,"Could not read frame\n");
/* execute action if the arguments correctly arrived*/
#ifdef SLS_RECEIVER_FUNCTION_LIST
retval=readFrame();
#endif
if(ret==OK && differentClients){
printf("Force update\n");
ret=FORCE_UPDATE;
}
if(getReceiverStatus==IDLE){
ret=FAIL;
printf("*************STOPPPED***\n");
}
/* send answer */
n = sendDataOnly(file_des,&ret,sizeof(ret));
if(ret==FAIL)
n = sendDataOnly(file_des,mess,sizeof(mess));
n = sendDataOnly(file_des,retval,sizeof(buffer));
/*return ok/fail*/
return ret;
}

View File

@ -36,6 +36,9 @@ int stop_receiver(int);
int get_receiver_status(int);
int get_frames_caught(int);
int get_frame_index(int);
int reset_frame_index(int);
int reset_frames_caught(int);
int read_frame(int);