/* casio reader timer stuff */

#include <stdio.h>
#include <exec/types.h>
#include <functions.h>
#include <intuition/intuition.h>
#include <devices/timer.h>
#include <devices/audio.h>

#include "prototypes.h"

struct timerequest *timer_request;

struct Device *TimerBase;

struct timerequest *CreateTimer(int unit)
{
	long error;

	register struct MsgPort *timerport;
	register struct timerequest *timermsg;

	timerport = CreatePort(0L, 0L);

	if (!timerport)
		return 0;

	timermsg =  (struct timerequest *)CreateExtIO(timerport, (long)sizeof(struct timerequest));

	if (!timermsg) 
	{
		DeletePort(timerport);
		return 0;
	}

	error = OpenDevice(TIMERNAME, (long)unit, timermsg, 0L);
	if (error)
	{
		DeleteTimer(timermsg);
		return 0;
	}
	return timermsg;
}

DeleteTimer(register struct timerequest *tr)
{
	register struct MsgPort *tp;

	if (tr) 
	{
		tp = tr->tr_node.io_Message.mn_ReplyPort;
		if(tp)
			DeletePort(tp);
		CloseDevice((struct IORequest *)tr);
		DeleteExtIO((struct IORequest *)tr);
	}
}

void trash_timer(void)
{
	AbortIO((struct IORequest *)timer_request);
	TimerBase = (struct Device *)-1;
	DeleteTimer(timer_request);
}

void init_timer(void)
{
	if (!(timer_request = CreateTimer(UNIT_MICROHZ)))
		panic("Can't create timer.");

	TimerBase = timer_request->tr_node.io_Device;
	add_cleanup(trash_timer);
}

void start_timeout_timer(void)
{
	timer_request->tr_node.io_Command = TR_ADDREQUEST;

	timer_request->tr_time.tv_secs = 3;
	timer_request->tr_time.tv_micro = 0;

	SendIO((struct IORequest *)timer_request);
}

void abort_timeout_timer(void)
{
	AbortIO((struct IORequest *)timer_request);
}
