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

XGpio_Config *gpio_config;
XGpio gpio;

XIntc intc;

void gpioHandler(){
	XIntc_Acknowledge(&intc,XPAR_INTC_0_GPIO_0_VEC_ID);

	XGpio_InterruptDisable(&gpio,XGPIO_IR_CH1_MASK);

	u32 swRead = XGpio_DiscreteRead(&gpio, 1);
	xil_printf("Interrupt Occur , Value Read : %0d\n",swRead);

	XGpio_InterruptClear(&gpio,XGPIO_IR_CH1_MASK);
	XGpio_InterruptEnable(&gpio,XGPIO_IR_CH1_MASK);


}

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");

	   status = XIntc_SelfTest(&intc);

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

	   ///////////////////////////////////////////
	   /////////////Initialize and Enable Exception Handler(1)
	   Xil_ExceptionInit();
	   Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XIntc_InterruptHandler, &intc);
	   Xil_ExceptionEnable();
	   //////Specify Interrupt type -> Handler

	   XIntc_Connect(&intc, XPAR_INTC_0_GPIO_0_VEC_ID, (XInterruptHandler)gpioHandler,0);

	   ////////Closing Switch 1
	   XIntc_Enable(&intc, XPAR_INTC_0_GPIO_0_VEC_ID);

	   /////////Closing Switch 2
	   XGpio_InterruptGlobalEnable(&gpio);
	   XGpio_InterruptEnable(&gpio,XGPIO_IR_CH1_MASK);

	   ///////////Start Operation in Real Mode
	   XIntc_Start(&intc, XIN_REAL_MODE);

}









void gpio_init(){
   gpio_config = XGpio_LookupConfig(XPAR_AXI_GPIO_0_DEVICE_ID);
   int status = XGpio_CfgInitaialize(&gpio, gpio_config, gpio_config->BaseAddress );

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

   XGpio_SetDataDirection(&gpio, 1, 0xffff);

}

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

    while(1){

    }




    cleanup_platform();
    return 0;
}