#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xttcps.h"
#include "xparameters.h"
#include "xscugic.h"
#include "xil_exception.h"



XTtcPs_Config *tC;
XTtcPs tI;

XScuGic_Config *iC;
XScuGic iI;





void eventHdr(){
	XTtcPs_DisableInterrupts(&tI,XTTCPS_IXR_INTERVAL_MASK);

	if(!XTtcPs_GetInterruptStatus(&tI))
	{
		return;
	}


	while(XTtcPs_GetCounterValue(&tI));
	xil_printf("Interrupt\n");

	XTtcPs_ClearInterruptStatus(&tI,XTTCPS_IXR_INTERVAL_MASK);
	XTtcPs_EnableInterrupts(&tI,XTTCPS_IXR_INTERVAL_MASK);
}


void ttcInit(){
int status = 0;
tC = XTtcPs_LookupConfig(XPAR_PS7_TTC_0_DEVICE_ID);
status = XTtcPs_CfgInitialize(&tI,tC,tC->BaseAddress);
if(status == XST_SUCCESS)
	xil_printf("TTC Init Successful\n");
else
	xil_printf("TTC Init Failed\n");
}


void intrInit(){
	int status = 0;
	iC =XScuGic_LookupConfig(XPAR_PS7_SCUGIC_0_DEVICE_ID);
	status = XScuGic_CfgInitialize(&iI, iC, iC->CpuBaseAddress);
	if(status == XST_SUCCESS)
		xil_printf("GIC Init Successful\n");
	else
		xil_printf("GIC Init Failed\n");


	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler) XScuGic_InterruptHandler, &iI);
	Xil_ExceptionEnable();


	XScuGic_Connect(&iI, XPAR_XTTCPS_0_INTR, (Xil_InterruptHandler)eventHdr, 0);
	XScuGic_Enable(&iI, XPAR_XTTCPS_0_INTR);




	XTtcPs_EnableInterrupts(&tI,XTTCPS_IXR_INTERVAL_MASK);

}



int main()
{	u32 freq = 1;
	XInterval tmI;
	u8 tmP;

    init_platform();
    ttcInit();
    intrInit();

    XTtcPs_Stop(&tI);

    u32 opt = XTtcPs_GetOptions(&tI);
    opt = opt | XTTCPS_OPTION_INTERVAL_MODE;

    XTtcPs_SetOptions(&tI,opt);

    XTtcPs_CalcIntervalFromFreq(&tI,freq,&tmI,&tmP);

    XTtcPs_SetPrescaler(&tI, tmP);
    XTtcPs_SetInterval(&tI,tmI);


    XTtcPs_Start(&tI);

    while(1);

    cleanup_platform();
    return 0;
}