From 7dccff7e95a1506826c80fe0c9adb4d73a15eacc Mon Sep 17 00:00:00 2001 From: "Janet B. Anderson" Date: Fri, 17 Apr 1992 13:56:14 +0000 Subject: [PATCH] Initial revision --- src/util/recordTest.c | 340 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 340 insertions(+) create mode 100644 src/util/recordTest.c diff --git a/src/util/recordTest.c b/src/util/recordTest.c new file mode 100644 index 000000000..bc5deead3 --- /dev/null +++ b/src/util/recordTest.c @@ -0,0 +1,340 @@ +/* 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 + * +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 +#include +#else +#include +#endif + +#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); + if (status) { + sprintf(errmsg,"strcmp failed: valueChan=%s",valueChan); + return ERROR; + } + } + + return OK; +} +