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

XGpio_Config *led_config, *sw_config;
XGpio led, sw;


XScuGic_Config *gic_config;
XScuGic gic;

void sw_intr(){
	XGpio_InterruptDisable(&sw,XGPIO_IR_CH1_MASK);
	u32 data = XGpio_DiscreteRead(&sw,1);
	xil_printf("Data Read : %0d\n",data);
	XGpio_InterruptClear(&sw,XGPIO_IR_CH1_MASK);
	XGpio_InterruptEnable(&sw, XGPIO_IR_CH1_MASK);

}

void gpio_init(){
int statuss = 0, statusl = 0;

led_config = XGpio_LookupConfig(XPAR_LED_DEVICE_ID);
statusl = XGpio_CfgInitialize(&led, led_config, led_config->BaseAddress);

sw_config = XGpio_LookupConfig(XPAR_SWITCH_DEVICE_ID);
statuss = XGpio_CfgInitialize(&sw, sw_config, sw_config->BaseAddress);

if((statuss && statusl) == XST_SUCCESS)
	xil_printf("SW and LED Init Successful\n");
else
	xil_printf("GPIO init Failed\n");

XGpio_SetDataDirection(&sw,1,0xf);

}


void gic_init(){
	int status;

	gic_config = XScuGic_LookupConfig(XPAR_PS7_SCUGIC_0_DEVICE_ID);
	status = XScuGic_CfgInitialize(&gic, gic_config, gic_config->CpuBaseAddress);

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

	////////////////Init and assigned XIl Exception handler

	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler, &gic );
	Xil_ExceptionEnable();

	/////////////////////////GIC
	XScuGic_Connect(&gic, XPAR_FABRIC_SWITCH_IP2INTC_IRPT_INTR, (Xil_InterruptHandler) sw_intr, 0);
	XScuGic_Enable(&gic, XPAR_FABRIC_SWITCH_IP2INTC_IRPT_INTR);
	XGpio_InterruptGlobalEnable(&sw);
	XGpio_InterruptEnable(&sw,XGPIO_IR_CH1_MASK);



}

int main()
{
    init_platform();
    gpio_init();
    gic_init();

   while(1);

    cleanup_platform();
    return 0;
}