/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
*     National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
*     Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution. 
\*************************************************************************/
#ifndef TIMERLIB_H
#define TIMERLIB_H

/*
 * Author: Jim Kowalkowski
 * Date: 4/97
 *
 * Based heavily on the HiDEOS ticktimer scheme - but using c instead of c++
 *
 * $Id$
 */

typedef enum {
	timerClear=0,     /* clear the timer value */
	timerDisable=1,   /* disable the timer from counting */
	timerEnable=2,    /* enable counting */
	timerResetMode=3, /* reset counter to zero upon compare (periodic) */
	timerCycleMode=4, /* counter stays at compare value and stops counting */
	timerIntEnable=5, /* enable timer interrupt upon compare */
	timerIntDisable=6,/* disable timer interrupt */
	timerIntClear=7   /* clear the interrupt condition (done automatically) */
} timerCmds;

#define timerTotalCmds 8

typedef void (*INTFUNC)(void*);

/* must be run before the timerLib functions can be used */
int timerSystemInit(void);
void* timerAlloc(void); /* get a timer to use, returns handle to it */
void timerFree(void* handle); /* return a timer back to the timer pool */

/* tell the timer to do something - see above timerCmds */
int timerCmd(void* handle, timerCmds cmd);

/* information about the timer */
unsigned long timerResolution(void* handle);
unsigned long timerCurrentValue(void* handle); /* read the timer value */

/* set the number of microsecond before timer goes off */
int timerCompareValue(void* handle,unsigned long usec);
/* the timer's interrupt level */
int timerIntLevel(void* handle,int level);

/* provide function called when the timer goes off (at interrupt level) */
int timerIntFunction(void* handle,INTFUNC func, void* parm);

/* simple way to set up a periodic interrupt every usec microseconds at
   interrupt level lev. The function func will be called with parameter
   parm */
int timerPeriodic(void* h,unsigned long usec,int lev,INTFUNC func,void* parm);

#endif
