#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <exec/types.h>
#include <graphics/rastport.h>
#include <devices/timer.h>

#include <proto/exec.h>
#include <proto/timer.h>
#include <proto/graphics.h>

#include <exec/memory.h>

#include "SH_timer.h"

#include "/tools.h"

IMPORT LONG FPSFlag;
IMPORT BOOL Cyber;

struct Library *TimerBase = NULL;
TIMER Timer;

BOOL InitTimer(VOID)
{

  if((Timer.TimeIO = AllocVec(sizeof(struct timerequest),MEMF_PUBLIC|MEMF_CLEAR)) == NULL)
  {
    RemoveTimer();
    return FALSE;
  }

  if(OpenDevice(TIMERNAME, UNIT_ECLOCK, (struct IORequest *)Timer.TimeIO, 0))
  {
    RemoveTimer();
    return FALSE;
  }

  TimerBase = (struct Library *)Timer.TimeIO->tr_node.io_Device;

  Timer.EClockFreq = ReadEClock(&Timer.LastFrameTime);

  return TRUE;
}


VOID RemoveTimer(VOID)
{

    if(Timer.TimeIO)
    {
      if(TimerBase)
        CloseDevice((struct IORequest *)Timer.TimeIO);

      FreeVec(Timer.TimeIO);
    }

}


VOID FrameEvent(VOID)
{
struct EClockVal TmpEClock;

  ReadEClock(&TmpEClock);

  DiffEClock(&Timer.LastFrameTime, &TmpEClock);

	Timer.FrameTime = TmpEClock.ev_lo;

	if(TmpEClock.ev_lo)
		Timer.FPS = (DOUBLE)Timer.EClockFreq /
								 (DOUBLE)TmpEClock.ev_lo;
}


VOID XEvent(VOID)
{
struct EClockVal TmpEClock;

  ReadEClock(&TmpEClock);

  DiffEClock(&Timer.LastXTime, &TmpEClock);

	Timer.XTime = TmpEClock.ev_lo;
}

ULONG GetCurrentXTime(VOID)
{
struct EClockVal TmpEClock;
struct EClockVal Tmp2EClock;

  ReadEClock(&TmpEClock);

	Tmp2EClock.ev_hi = Timer.LastXTime.ev_hi;
	Tmp2EClock.ev_lo = Timer.LastXTime.ev_lo;

  DiffEClock(&Tmp2EClock, &TmpEClock);

	return TmpEClock.ev_lo;
}

VOID RenderInfoBar(struct RastPort *RP, ULONG Pen)
{
char InfoText[40];
LONG params[2];

	if(FPSFlag)
	{
		params[0] = (LONG)Timer.FPS;
		params[1] = (LONG)((Timer.FPS - (DOUBLE)params[0])*100.0);

	  Sprintf(InfoText, "%2ld.%-2ld fps", (APTR)params);
	  MemSet(&InfoText[strlen(InfoText)], ' ', 40-strlen(InfoText));
	  SetAPen(RP, Pen);
  	SetDrMd(RP, JAM1);
	  Move(RP, 3, Cyber ? 10 : (10+28));
  	Text(RP, InfoText, 40);
	}
}
