diff --git a/src/dev/devWfComet.c b/src/dev/devWfComet.c new file mode 100644 index 000000000..f82b1ea90 --- /dev/null +++ b/src/dev/devWfComet.c @@ -0,0 +1,139 @@ +/* devComet.c */ +/* share/src/dev $Id$ */ + +/* + * Original Author: Bob Dalesio + * Current Author: Marty Kraimer + * Date: 08-02-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 08-01-92 mrk Initial version + * ... + */ + + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +long init_record(); +long read_wf(); +long arm_wf(); + + +struct { + long number; + DEVSUPFUN report; + DEVSUPFUN init; + DEVSUPFUN init_record; + DEVSUPFUN get_ioint_info; + DEVSUPFUN read_wf; +} devWfComet={ + 5, + NULL, + NULL, + init_record, + NULL, + read_wf}; + + +static void myCallback(pwf,no_read,pdata) + struct waveformRecord *pwf; + int no_read; + unsigned char *pdata; +{ + struct rset *prset=(struct rset *)(pwf->rset); + short ftvl = pwf->ftvl; + + if(!pwf->busy) return; + dbScanLock((struct dbCommon *)pwf); + pwf->busy = FALSE; + if(ftvl==DBF_SHORT || ftvl==DBF_USHORT) { + memcpy(pwf->bptr,pdata,no_read*2); + pwf->nord = no_read; /* number of values read */ + } else { + recGblRecordError(S_db_badField,(void *)pwf, + "read_wf - illegal ftvl"); + recGblSetSevr(pwf,READ_ALARM,INVALID_ALARM); + } + (*prset->process)(pwf); + dbScanUnlock((struct dbCommon *)pwf); +} + +static long init_record(pwf) + struct waveformRecord *pwf; +{ + + /* wf.inp must be an VME_IO */ + switch (pwf->inp.type) { + case (VME_IO) : + break; + default : + recGblRecordError(S_db_badField,(void *)pwf, + "devWfComet (init_record) Illegal INP field"); + return(S_db_badField); + } + return(0); +} + +static long read_wf(pwf) + struct waveformRecord *pwf; +{ + + /* determine if wave form is to be rearmed*/ + /* If not active then request rearm */ + if(!pwf->pact) arm_wf(pwf); + /* if already active then call is from myCallback. check rarm*/ + else if(pwf->rarm) { + (void)arm_wf(pwf); + pwf->rarm = 0; + } + return(0); +} + +static long arm_wf(pwf) +struct waveformRecord *pwf; +{ + struct vmeio *pvmeio = (struct vmeio *)&(pwf->inp.value); + + pwf->busy = TRUE; + if(comet_driver(pvmeio->card,myCallback,pwf)<0) { + recGblSetSevr(pwf,READ_ALARM,INVALID_ALARM); + pwf->busy = FALSE; + return(0); + } + pwf->pact=TRUE; + return(0); +}