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

typedef struct {
	u32 outputFreq;
	XInterval interval;
	u8 prescaler;
	u32 option;

} ttc_setup;



///////////TTC Init
XTtcPs_Config *ttc_config;
XTtcPs ttc;

////////////GPIO Init
XGpioPs led;
XGpioPs_Config *led_config;


void init(){
	int status;
	led_config = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
	status = XGpioPs_CfgInitialize(&led, led_config, led_config->BaseAddr);
	if(status == XST_SUCCESS)
		xil_printf("GPIO Init Successful\n");
	else
		xil_printf("GPIO Init Failed\n");


	ttc_config = XTtcPs_LookupConfig(XPAR_PS7_TTC_0_DEVICE_ID);
	status = XTtcPs_CfgInitialize(&ttc,ttc_config, ttc_config->BaseAddress);

	if(status == XST_SUCCESS)
		xil_printf("TTC Init Successful\n");
	else
		xil_printf("TTC Init Failed\n");

	status = XTtcPs_SelfTest(&ttc);

	if(status == XST_SUCCESS)
		xil_printf("Self Test Successful\n");
	else
		xil_printf("Self Test Failed\n");
}


int main()
{       u8 leddata = 0x00;
	    init_platform();
	    init();
	    ////Direction for GPIO
	    XGpioPs_SetDirectionPin(&led, 7, 1);
	    XGpioPs_SetOutputEnablePin(&led, 7, 1);

	    ////////Operation of TTC
		ttc_setup data = {1,0,0,0};

	    data.option = data.option | XTTCPS_OPTION_DECREMENT | XTTCPS_OPTION_INTERVAL_MODE;
	    XTtcPs_SetOptions(&ttc, data.option);
	    XTtcPs_CalcIntervalFromFreq(&ttc, data.outputFreq, &(data.interval), &(data.prescaler));
	    XTtcPs_SetPrescaler(&ttc, data.prescaler);
	    XTtcPs_SetInterval(&ttc, data.interval);
	   // XTtcPs_Stop(&ttc);
	    while(1){
	    XTtcPs_Start(&ttc);
	    while(XTtcPs_GetCounterValue(&ttc));
	    XTtcPs_Stop(&ttc);
	    XTtcPs_ResetCounterValue(&ttc);
	    leddata = ~leddata;
	    XGpioPs_WritePin(&led, 7, leddata);
	    xil_printf("Value Send LED : %0d\n",leddata);
	    }


	    cleanup_platform();
	    return 0;
}