/* recordTest.c */ /* share/src/util $Id$ */ /* recordTest.c - Record Test Program * * Author: Janet Anderson * Date: 02-05-92 * * Experimental Physics and Industrial Control System (EPICS) * * Copyright 1991, the Regents of the University of California, * and the University of Chicago Board of Governors. * * This software was produced under U.S. Government contracts: * (W-7405-ENG-36) at the Los Alamos National Laboratory, * and (W-31-109-ENG-38) at Argonne National Laboratory. * * Initial development by: * The Controls and Automation Group (AT-8) * Ground Test Accelerator * Accelerator Technology Division * Los Alamos National Laboratory * * Co-developed with * The Controls and Computing Group * Accelerator Systems Division * Advanced Photon Source * Argonne National Laboratory * * Modification Log: * ----------------- * .01 02-10-92 jba initial version * .02 09-14-93 jba modified includes and fixed strcmp * Need to do: 1. Change to DBR_STS_STRING ??? 2. Terminate connections only when test for a new rec type are encountered 3. Add handling of elementCount > 1 5. Add epics release info to output file 6. Add date and IOC info to output file */ #ifdef vxWorks #include #endif #include #include #include #include #ifndef ERROR #define ERROR -1 #endif #ifndef OK #define OK 0 #endif #define PUT 0 #define GET 1 #define FIELDS 4 #define MAXLINE 150 #define MAX_ELEMENTS 150 #define MAX_STRING_SIZE 40 char errmsg[MAXLINE]; void recordTest(); int connectChan(); int disconnectChan(); int doTestLine(); int getPV(); int putPV(); #ifndef vxWorks main(argc,argv) int argc; char *argv[]; { if(argc > 2){ printf("usage: recordTest \n"); printf("the following arguments were received\n"); while(argc>0) { printf("%s\n",argv[0]); argv++; argc--; } return ERROR; } if ( argc == 2 ){ printf("\n\n\n\n\n\nTest of record types:"); while(--argc>0) printf(" %s",*++argv); } else { printf("Test of ALL record types"); } printf("\n"); recordTest(argv); } #endif void recordTest(argv) char *argv[]; { char str[MAXLINE]; char ioType[MAX_STRING_SIZE]; char name[MAX_STRING_SIZE]; char value[MAX_STRING_SIZE]; char verify[MAX_STRING_SIZE]; chid chanId; int count; long status; /* get test line */ while ( gets(str)) { /* print and skip null lines and comment lines */ if ( str[0]==NULL || str[0] == '!' ) { printf("%s\n",str); continue; } /* parse input line for fields */ count=sscanf(str,"%s %s \"%[^\"]\" %s",ioType,name,value,verify); /* check field count */ if ( count != FIELDS ) { printf("\n%s\n",str); printf ("***** ERROR ***** field count %d is not equal to %d\n",count,FIELDS); continue; } /* check 1st char of name */ if (((*name < ' ') || (*name > 'z'))){ printf("\n%s\n",str); printf ("***** ERROR ***** pv name check error "); continue; } /* check for blank string value */ if ( *value == ' ' ) *value = '\0'; /* connect to a channel */ status = connectChan(name,&chanId); if( status ){ printf("\n%s\n",str); printf ("***** ERROR ***** %s \n",errmsg); continue; } /* execute test line */ status=doTestLine(name,ioType,chanId,value,verify); if ( status ){ printf("\n%s\n",str); printf ("***** ERROR ***** status=%d %s\n",status,errmsg); } /* disconnect channel */ status = disconnectChan(&chanId); if( status ){ printf("\n%s\n",str); printf ("***** ERROR ***** %s \n",errmsg); continue; } } printf ("\nrecordTest ALL DONE\n\n\n"); } int connectChan(name,pchanId) char name[]; chid *pchanId; { int status=0; /* connect to a channel */ status = ca_search(name, pchanId); if(status != ECA_NORMAL){ strcpy(errmsg,"ca_search"); return ERROR; } /* wait for connection */ status = ca_pend_io(2.0); if(status != ECA_NORMAL){ strcpy(errmsg,"ca_pend_io"); return ERROR; } return OK; } int disconnectChan(pchanId) chid *pchanId; { /* terminate connection */ /* if(pchanId){ status=ca_clear_channel(*pchanId); if(status != ECA_NORMAL){ strcpy(errmsg,"ca_clear_channel"); return ERROR; } } */ return OK; } int doTestLine(name,ioType,chanId,value,verify) char name[]; char *ioType; chid chanId; char value[]; char verify[]; { int status=0; if ( *ioType == 'P'){ status=putPV(name,chanId,value,verify); } else if ( *ioType == 'G'){ status=getPV(name,chanId,value,verify); } else { status=ERROR; strcpy(errmsg,"doTestLine"); } return status; } /* Read from a channel */ int getPV(name,chanId,value,verify) char name[]; chid chanId; char value[]; char verify[]; { int status; long elementCount; char valueChan[MAX_ELEMENTS] [MAX_STRING_SIZE]; /* fetch element count */ elementCount=ca_element_count(chanId); /* fetch value */ status = ca_array_get( DBR_STRING, elementCount, chanId, valueChan); if(status != ECA_NORMAL){ strcpy(errmsg,"ca_array_get"); return ERROR; } status=ca_pend_io(2.0); if(status != ECA_NORMAL){ strcpy(errmsg,"ca_pend_io"); return ERROR; } /* verify channel value*/ if (*verify == 'V'){ status=strcmp(value,valueChan[0]); if (status) { sprintf(errmsg,"strcmp failed: valueChan=%s",valueChan); return ERROR; } } else printf(" %s=%s\n",name,valueChan); return OK; } /* Write to a process variable */ int putPV(name,chanId,value,verify) char name[]; chid chanId; char value[]; char verify[]; { char valueChan[MAX_ELEMENTS] [MAX_STRING_SIZE]; int status; long elementCount; /* fetch element count */ elementCount=ca_element_count(chanId); /* write value */ status = ca_array_put( DBR_STRING, elementCount, chanId, value); if(status != ECA_NORMAL){ strcpy(errmsg,"ca_array_put"); return ERROR; } status=ca_pend_io(2.0); if(status != ECA_NORMAL){ strcpy(errmsg,"ca_pend_io"); return ERROR; } /* verify write */ if (*verify == 'V'){ status = ca_array_get( DBR_STRING, elementCount, chanId, valueChan); if(status != ECA_NORMAL){ strcpy(errmsg,"ca_put"); return ERROR; } status=ca_pend_io(2.0); if(status != ECA_NORMAL){ strcpy(errmsg,"ca_pend_io failed"); return ERROR; } /* compare channel value with value */ status=strcmp(value,&valueChan[0][0]); if (status) { sprintf(errmsg,"strcmp failed: valueChan=%s",valueChan); return ERROR; } } return OK; }