341 lines
6.5 KiB
C
341 lines
6.5 KiB
C
/* 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 <vxWorks.h>
|
||
#endif
|
||
|
||
#include <stdlib.h>
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <cadef.h>
|
||
|
||
#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 <record_type>\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;
|
||
}
|
||
|