159 lines
6.1 KiB
C
159 lines
6.1 KiB
C
/* * base/include seqCom.h,v 1.3 1995/10/10 01:25:08 wright Exp
|
||
*
|
||
* DESCRIPTION: Common definitions for state programs and run-time sequencer.
|
||
*
|
||
* Author: Andy Kozubal
|
||
* Date: 01mar94
|
||
*
|
||
* Experimental Physics and Industrial Control System (EPICS)
|
||
*
|
||
* Copyright 1993 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
|
||
* Modification Log:
|
||
* -----------------
|
||
* 11jul96,ajk Changed all int types to long.
|
||
* 22jul96,ajk Changed PFUNC to ACTION_FUNC, EVENT_FUNC, DELAY_FUNC, & EXIT_FUNC.
|
||
*
|
||
*/
|
||
#ifndef INCLseqComh
|
||
#define INCLseqComh
|
||
|
||
#define MAGIC 940501 /* current magic number for SPROG */
|
||
|
||
#include "tsDefs.h" /* time stamp defs */
|
||
#include "stdio.h" /* standard i/o defs */
|
||
|
||
/* Bit encoding for run-time options */
|
||
#define OPT_DEBUG (1<<0) /* turn on debugging */
|
||
#define OPT_ASYNC (1<<1) /* use async. gets */
|
||
#define OPT_CONN (1<<2) /* wait for all connections */
|
||
#define OPT_REENT (1<<3) /* generate reentrant code */
|
||
#define OPT_NEWEF (1<<4) /* new event flag mode */
|
||
#define OPT_TIME (1<<5) /* get time stamps */
|
||
#define OPT_VXWORKS (1<<6) /* include VxWorks files */
|
||
|
||
/* Macros to handle set & clear event bits */
|
||
#define NBITS 32 /* # bits in bitMask word */
|
||
typedef long bitMask;
|
||
|
||
#define bitSet(word, bitnum) (word[(bitnum)/NBITS] |= (1<<((bitnum)%NBITS)))
|
||
#define bitClear(word, bitnum) (word[(bitnum)/NBITS] &= ~(1<<((bitnum)%NBITS)))
|
||
#define bitTest(word, bitnum) ((word[(bitnum)/NBITS] & (1<<((bitnum)%NBITS))) != 0)
|
||
|
||
#ifndef TRUE
|
||
#define TRUE 1
|
||
#define FALSE 0
|
||
#endif /*TRUE*/
|
||
|
||
typedef long SS_ID; /* state set id */
|
||
|
||
/* Prototype for action, event, delay, and exit functions */
|
||
typedef long (*PFUNC)();
|
||
typedef void (*ACTION_FUNC)();
|
||
typedef long (*EVENT_FUNC)();
|
||
typedef void (*DELAY_FUNC)();
|
||
typedef void (*EXIT_FUNC)();
|
||
|
||
#ifdef OFFSET
|
||
#undef OFFSET
|
||
#endif
|
||
/* The OFFSET macro calculates the byte offset of a structure member
|
||
* from the start of a structure */
|
||
#define OFFSET(structure, member) ((long) &(((structure *) 0) -> member))
|
||
|
||
/* Structure to hold information about database channels */
|
||
struct seqChan
|
||
{
|
||
char *dbAsName; /* assigned channel name */
|
||
void *pVar; /* ptr to variable (-r option)
|
||
* or structure offset (+r option) */
|
||
char *pVarName; /* variable name, including subscripts */
|
||
char *pVarType; /* variable type, e.g. "int" */
|
||
long count; /* element count for arrays */
|
||
long eventNum; /* event number for this channel */
|
||
long efId; /* event flag id if synced */
|
||
long monFlag; /* TRUE if channel is to be monitored */
|
||
};
|
||
|
||
/* Structure to hold information about a state */
|
||
struct seqState
|
||
{
|
||
char *pStateName; /* state name */
|
||
ACTION_FUNC actionFunc; /* action routine for this state */
|
||
EVENT_FUNC eventFunc; /* event routine for this state */
|
||
DELAY_FUNC delayFunc; /* delay setup routine for this state */
|
||
bitMask *pEventMask; /* event mask for this state */
|
||
};
|
||
|
||
/* Structure to hold information about a State Set */
|
||
struct seqSS
|
||
{
|
||
char *pSSName; /* state set name */
|
||
struct seqState *pStates; /* array of state blocks */
|
||
long numStates; /* number of states in this state set */
|
||
long errorState; /* error state index (-1 if none defined) */
|
||
};
|
||
|
||
/* All information about a state program */
|
||
struct seqProgram
|
||
{
|
||
long magic; /* magic number */
|
||
char *pProgName; /* program name (for debugging) */
|
||
struct seqChan *pChan; /* table of channels */
|
||
long numChans; /* number of db channels */
|
||
struct seqSS *pSS; /* array of state set info structs */
|
||
long numSS; /* number of state sets */
|
||
long varSize; /* # bytes in user variable area */
|
||
char *pParams; /* program paramters */
|
||
long numEvents; /* number of event flags */
|
||
long options; /* options (bit-encoded) */
|
||
EXIT_FUNC exitFunc; /* exit function */
|
||
};
|
||
|
||
|
||
/*
|
||
* Function declarations for interface between state program & sequencer.
|
||
* Notes:
|
||
* "seq_" is added by SNC to guarantee global uniqueness.
|
||
* These functions appear in the module seq_if.c.
|
||
* The SNC must generate these modules--see gen_ss_code.c.
|
||
*/
|
||
void seq_efSet(SS_ID, long); /* set an event flag */
|
||
long seq_efTest(SS_ID, long); /* test an event flag */
|
||
long seq_efClear(SS_ID, long); /* clear an event flag */
|
||
long seq_efTestAndClear(SS_ID, long);/* test & clear an event flag */
|
||
long seq_pvGet(SS_ID, long); /* get pv value */
|
||
long seq_pvPut(SS_ID, long); /* put pv value */
|
||
TS_STAMP seq_pvTimeStamp(SS_ID, long); /* get time stamp value */
|
||
long seq_pvAssign(SS_ID, long, char *);/* assign/connect to a pv */
|
||
long seq_pvMonitor(SS_ID, long); /* enable monitoring on pv */
|
||
long seq_pvStopMonitor(SS_ID, long); /* disable monitoring on pv */
|
||
long seq_pvStatus(SS_ID, long); /* returns pv alarm status code */
|
||
long seq_pvSeverity(SS_ID, long); /* returns pv alarm severity */
|
||
long seq_pvAssigned(SS_ID, long); /* returns TRUE if assigned */
|
||
long seq_pvConnected(SS_ID, long); /* TRUE if connected */
|
||
long seq_pvGetComplete(SS_ID, long); /* TRUE if last get completed */
|
||
long seq_pvChannelCount(SS_ID); /* returns number of channels */
|
||
long seq_pvConnectCount(SS_ID); /* returns number of channels connected */
|
||
long seq_pvAssignCount(SS_ID); /* returns number of channels assigned */
|
||
long seq_pvCount(SS_ID, long); /* returns number of elements in array */
|
||
void seq_pvFlush(); /* flush put/get requests */
|
||
long seq_pvIndex(SS_ID, long); /* returns index of pv */
|
||
long seq_seqLog(); /* Logging: variable number of parameters */
|
||
void seq_delayInit(SS_ID, long, float);/* initialize a delay entry */
|
||
long seq_delay(SS_ID, long); /* test a delay entry */
|
||
char *seq_macValueGet(SS_ID, char *); /* Given macro name, return ptr to value */
|
||
long seq_optGet (SS_ID ssId, char *opt); /* check an option for TRUE/FALSE */
|
||
|
||
#endif /*INCLseqComh*/
|