245 lines
5.3 KiB
C
245 lines
5.3 KiB
C
/* drvTime.c */
|
|
/* share/src/drv $Id$ */
|
|
/* Glue between timing_drivers and the GTA database
|
|
* Author: Jeff Hill
|
|
* Date: Feb 89
|
|
*
|
|
* 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 Natjonal 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:
|
|
* -----------------
|
|
* joh 02-20-89 Init Release
|
|
* joh 11-16-89 added vxi timing
|
|
* bg 11-18-91 added time_io_report
|
|
* bg 02-24-91 added levels to time_io_report.
|
|
* bg 06-26-92 Combined time_driver.c and drvTime.c
|
|
* joh 08-05-92 removed report & init routines
|
|
*/
|
|
|
|
static char *sccsID = "$Id$\t$Date$";
|
|
|
|
/* drvTime.c - Driver Support Routines for Time */
|
|
#include <vxWorks.h>
|
|
#include <module_types.h>
|
|
|
|
struct pulse{
|
|
double offset;
|
|
double width;
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
*
|
|
* time_driver_read()
|
|
*
|
|
*
|
|
*/
|
|
time_driver_read
|
|
(
|
|
card, /* 0 through ... */
|
|
channel, /* 0 through chans on card */
|
|
card_type, /* module type as stored in GTA DB */
|
|
int_source, /* (TRUE)External/ (FALSE)Internal source */
|
|
preset, /* TRUE or COMPLEMENT logic */
|
|
pulses, /* ptr to array of structure describing pulses */
|
|
npulses, /* N elements found */
|
|
npulmax /* N elements in the caller's array */
|
|
)
|
|
unsigned int card;
|
|
unsigned int channel;
|
|
unsigned int card_type;
|
|
unsigned int *int_source;
|
|
int *preset;
|
|
struct pulse *pulses;
|
|
unsigned int *npulses;
|
|
unsigned int npulmax;
|
|
{
|
|
int status;
|
|
|
|
*npulses=0;
|
|
|
|
switch(card_type){
|
|
case MZ8310:
|
|
if(npulmax<1)
|
|
return ERROR;
|
|
status = mz8310_one_shot_read (
|
|
preset,
|
|
&pulses->offset,
|
|
&pulses->width,
|
|
card,
|
|
channel,
|
|
int_source
|
|
);
|
|
if(status==OK)
|
|
*npulses=1;
|
|
|
|
return status;
|
|
case VXI_AT5_TIME:
|
|
if(npulmax<1)
|
|
return ERROR;
|
|
status = at5vxi_one_shot_read (
|
|
preset,
|
|
&pulses->offset,
|
|
&pulses->width,
|
|
card,
|
|
channel,
|
|
int_source
|
|
);
|
|
if(status==OK)
|
|
*npulses=1;
|
|
|
|
return status;
|
|
case DG535:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
logMsg("time_driver: No support for that type of timing card\n");
|
|
return ERROR;
|
|
}
|
|
|
|
|
|
time_driver (
|
|
card, /* 0 through ... */
|
|
channel, /* 0 through chans on card */
|
|
card_type, /* module type as stored in GTA DB */
|
|
int_source, /* (TRUE)External/ (FALSE)Internal source */
|
|
preset, /* TRUE or COMPLEMENT logic */
|
|
pulses, /* ptr to array of structure describing pulses */
|
|
npulses, /* N elements in this array */
|
|
eventrtn, /* routine to run on events */
|
|
eventrtnarg /* argument to above rtn */
|
|
)
|
|
unsigned int card;
|
|
unsigned int channel;
|
|
unsigned int card_type;
|
|
unsigned int int_source;
|
|
int preset;
|
|
struct pulse *pulses;
|
|
unsigned int npulses;
|
|
void (*eventrtn)();
|
|
unsigned int eventrtnarg;
|
|
{
|
|
|
|
switch(card_type){
|
|
case MZ8310:
|
|
if(npulses != 1)
|
|
return ERROR;
|
|
return mz8310_one_shot (
|
|
preset,
|
|
pulses->offset,
|
|
pulses->width,
|
|
card,
|
|
channel,
|
|
int_source,
|
|
eventrtn,
|
|
eventrtnarg
|
|
);
|
|
case VXI_AT5_TIME:
|
|
if(npulses != 1)
|
|
return ERROR;
|
|
return at5vxi_one_shot (
|
|
preset,
|
|
pulses->offset,
|
|
pulses->width,
|
|
card,
|
|
channel,
|
|
int_source,
|
|
eventrtn,
|
|
eventrtnarg
|
|
);
|
|
case DG535:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
logMsg("time_driver: No support for that type of timing card\n");
|
|
return ERROR;
|
|
}
|
|
|
|
|
|
|
|
time_test()
|
|
{
|
|
unsigned int card=0;
|
|
unsigned int channel=0;
|
|
unsigned int card_type=MZ8310;
|
|
unsigned int int_source=1;
|
|
int preset=1;
|
|
static struct
|
|
pulse pulses={.00001,.00001};
|
|
unsigned int npulses = 1;
|
|
|
|
unsigned int t_int_source;
|
|
int t_preset;
|
|
struct pulse t_pulses;
|
|
unsigned int t_npulses;
|
|
|
|
int status;
|
|
|
|
status =
|
|
time_driver (
|
|
card, /* 0 through ... */
|
|
channel, /* 0 through chans on card */
|
|
card_type, /* module type as stored in GTA DB */
|
|
int_source, /* (TRUE)External/ (FALSE)Internal source */
|
|
preset, /* TRUE or COMPLEMENT logic */
|
|
&pulses, /* ptr to array of structure describing pulses */
|
|
npulses, /* N elements in this array */
|
|
NULL, /* routine to run on events */
|
|
NULL /* argument to above rtn */
|
|
);
|
|
if(status==ERROR)
|
|
return ERROR;
|
|
|
|
|
|
status =
|
|
time_driver_read(
|
|
card, /* 0 through ... */
|
|
channel, /* 0 through chans on card */
|
|
card_type, /* module type as stored in GTA DB */
|
|
&t_int_source, /* (TRUE)External/ (FALSE)Internal source */
|
|
&t_preset, /* TRUE or COMPLEMENT logic */
|
|
&t_pulses, /* ptr to array of structure describing pulses */
|
|
&t_npulses, /* N elements found */
|
|
1 /* max N elements in this array */
|
|
);
|
|
if(status==ERROR)
|
|
return ERROR;
|
|
|
|
|
|
logMsg( "wrote: preset %x internal-clk %x delay %lf width %lf \n",
|
|
preset,
|
|
int_source,
|
|
pulses.offset,
|
|
pulses.width);
|
|
logMsg( "read: preset %x internal-clk %x delay %lf width %lf count %x\n",
|
|
t_preset,
|
|
t_int_source,
|
|
t_pulses.offset,
|
|
t_pulses.width,
|
|
t_npulses);
|
|
return OK;
|
|
}
|