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

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

} ttc_setup;


XTtcPs_Config *ttc_config;
XTtcPs ttc;

XGpioPs_Config *gpio_config;
XGpioPs gpio;




void gpio_init(){
  gpio_config = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
  u32 status = XGpioPs_CfgInitialize(&gpio, gpio_config, gpio_config->BaseAddr);

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


}

void ttc_init(){
	int status;


	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()
{
	u32 led = 0;

	ttc_setup data = {1,0,0,0};

    init_platform();
    ttc_init();
    gpio_init();
    XGpioPs_SetDirectionPin(&gpio, 7, 1);





    XTtcPs_Stop(&ttc);
    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);


    while(1){

    	 XTtcPs_Start(&ttc);
    	 while(XTtcPs_GetCounterValue(&ttc));
    	 XTtcPs_Stop(&ttc);
    	 xil_printf("Delay of 1 sec achieved\n");
    	 XGpioPs_WritePin(&gpio, 7, led);
    	 led = ~led;
    	 xil_printf("Value Sent onto LED : %0d\n", (0x00000001 & led));
    	 XTtcPs_ResetCounterValue(&ttc);

    }



    cleanup_platform();
    return 0;
}