/*************************************************************************
**   File:  timer.c
**      contains timer routines
**
**   Functions:
**	open_time() - initializes and opens timer device
**	close_time() - clean up and close timer device
**	start_timer() - issue an asynchronous timer request
**	kill_timer() - cancel an outstanding asynch timer request
**	test_timer() - test for a timer pop
**	Delay() - cause task to sleep (synchronous timer request)
**
*************************************************************************/
#include "term.h"

struct timerequest *timer;	/* for timer request */
static long interval;
extern int timeout;

open_time()
{
	struct MsgPort *myport;
	if (!(myport = (struct MsgPort *)CreatePort("term.timer",0))) {
		emits("\nUnable to create time port\n");
		return(FALSE);
	}

	timer = (struct timerequest *)
		AllocMem(sizeof(struct timerequest),MEMF_CLEAR | MEMF_PUBLIC);
	if (!timer) {
		emits("\nUnable to allocate time request\n");
		DeletePort(myport);
		return(FALSE);
	}

	timer->tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
	timer->tr_node.io_Message.mn_Node.ln_Pri = 0;
	timer->tr_node.io_Message.mn_ReplyPort = myport;

	if (OpenDevice(TIMERNAME,UNIT_VBLANK,timer,0)) {
		emits("\nUnable to open Timer Device\n");
		DeletePort(myport);
		FreeMem(timer,sizeof(struct timerequest));
		return(FALSE);
	}
	return(TRUE);
}

close_time()
{
	CloseDevice(timer);
	DeletePort(timer->tr_node.io_Message.mn_ReplyPort);
	timer->tr_node.io_Message.mn_Node.ln_Type = 0xff;
	timer->tr_node.io_Device = (struct Device *) -1;
	timer->tr_node.io_Unit = (struct Unit *) -1;
	FreeMem(timer,sizeof(struct timerequest));
}

start_timer(itvl)
	int itvl;
{
	timeout = FALSE;
	timer->tr_time.tv_secs = itvl;
	timer->tr_time.tv_micro = 0;
	timer->tr_node.io_Command = TR_ADDREQUEST;
	SendIO(timer);
}

kill_timer()
{
	AbortIO(timer);
	GetMsg(timer->tr_node.io_Message.mn_ReplyPort);
}
	
test_timer()
{
	return(CheckIO(timer) && (!timer->tr_node.io_Error));
}

Delay(N)
/**
 * Delay for N seconds
 **/
int N;
{
	start_timer(N);
	Wait(1 << timer->tr_node.io_Message.mn_ReplyPort->mp_SigBit) ;
	GetMsg(timer->tr_node.io_Message.mn_ReplyPort) ;
}


