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

XGpio gpios,gpiob;
XGpio_Config *gpio_configs, *gpio_configb;


XScuGic_Config *gic_config;
XScuGic gic;


void btnHandler(){
	XGpio_InterruptDisable(&gpiob,XGPIO_IR_CH1_MASK);

	u32 bData = XGpio_DiscreteRead(&gpiob,1);
	xil_printf("Value on Button : %0d\n",bData);
	XGpio_InterruptClear(&gpiob,XGPIO_IR_CH1_MASK);
	XGpio_InterruptEnable(&gpiob,XGPIO_IR_CH1_MASK);

}

void slideHandler(){
	XGpio_InterruptDisable(&gpios,XGPIO_IR_CH1_MASK);

	u32 sData = XGpio_DiscreteRead(&gpios,1);
	xil_printf("Value on Slide Switch : %0d\n",sData);

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


}


void gpio(){
	int statusb,statuss;

	gpio_configs = XGpio_LookupConfig(XPAR_SLIDE_DEVICE_ID);
	statuss = XGpio_CfgInitialize(&gpios, gpio_configs, gpio_configs->BaseAddress);

	gpio_configb = XGpio_LookupConfig(XPAR_BUTTON_DEVICE_ID);
    statusb = XGpio_CfgInitialize(&gpiob, gpio_configb, gpio_configb->BaseAddress);

    if((statuss && statusb) == XST_SUCCESS)
		xil_printf("BUTTON AND SLIDE INIT SUCCESSFUL\n");
		else
		xil_printf("BUTTTON AND SLIDE INIT FAILED\n");


    XGpio_SetDataDirection(&gpiob, 1, 0xf);
    XGpio_SetDataDirection(&gpios, 1, 0xf);

}

void gicInit(){
	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("GICINIT FAILED\n");

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

    XScuGic_Connect(&gic, XPAR_FABRIC_BUTTON_IP2INTC_IRPT_INTR, (Xil_InterruptHandler)btnHandler , 0);
    XScuGic_Enable(&gic, XPAR_FABRIC_BUTTON_IP2INTC_IRPT_INTR);


    XScuGic_Connect(&gic, XPAR_FABRIC_SLIDE_IP2INTC_IRPT_INTR, (Xil_InterruptHandler)slideHandler , 0);
    XScuGic_Enable(&gic, XPAR_FABRIC_SLIDE_IP2INTC_IRPT_INTR);

    XGpio_InterruptGlobalEnable(&gpiob);
    XGpio_InterruptEnable(&gpiob,XGPIO_IR_CH1_MASK);

    XGpio_InterruptGlobalEnable(&gpios);
    XGpio_InterruptEnable(&gpios,XGPIO_IR_CH1_MASK);

}


int main()
{
    init_platform();
    gpio();
    gicInit();

  while(1);

    cleanup_platform();
    return 0;
}