#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xintc.h"
#include "xparameters.h"
#include "xil_exception.h"
#include "xtmrctr.h"



XIntc intc;

XTmrCtr tmr;


void intcHandler(){
	XIntc_Acknowledge(&intc, XPAR_INTC_0_TMRCTR_0_VEC_ID);
    while(!XTmrCtr_IsExpired(&tmr,0));
	xil_printf("Interrupt Occur\n");
	XTmrCtr_Reset(&tmr, 0);
}

void tmr_init(){

	int status = XTmrCtr_Initialize(&tmr, XPAR_AXI_TIMER_0_DEVICE_ID);

	if(status == XST_SUCCESS)
		xil_printf("TMR INIT SUCCESSFUL\n");
	else
		xil_printf("TMR INIT FAILED\n");
}




void intc_init(){

	int status = XIntc_Initialize(&intc, XPAR_AXI_INTC_0_DEVICE_ID);

	if(status == XST_SUCCESS)
		xil_printf("INTC INIT SUCCESSFUL\n");
	else
		xil_printf("INTC INIT FAILED\n");



	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XIntc_InterruptHandler, &intc);
	Xil_ExceptionEnable();


	XIntc_Connect(&intc, XPAR_INTC_0_TMRCTR_0_VEC_ID, (XInterruptHandler)intcHandler, &tmr);

	XIntc_Enable(&intc, XPAR_INTC_0_TMRCTR_0_VEC_ID);



	XIntc_Start(&intc, XIN_REAL_MODE);


}

int main()
{
    init_platform();
    intc_init();
    tmr_init();


        XTmrCtr_Stop(&tmr, 0);

    	u32 option = XTmrCtr_GetOptions(&tmr, 0);
        XTmrCtr_SetOptions(&tmr, 0, option | XTC_DOWN_COUNT_OPTION | XTC_INT_MODE_OPTION);

        XTmrCtr_SetResetValue(&tmr, 0, 200000000);

        XTmrCtr_Reset(&tmr, 0);
        XTmrCtr_Start(&tmr, 0);

      while(1){

      }

    cleanup_platform();
    return 0;
}