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


XWdtTb_Config *wdt_config;
XWdtTb wdt;

XIntc intc;


void intcHandler(){
	XIntc_Acknowledge(&intc, XPAR_INTC_0_WDTTB_0_VEC_ID);
	XIntc_Disable(&intc, XPAR_INTC_0_WDTTB_0_VEC_ID);
    while(!XWdtTb_IsWdtExpired(&wdt));
	xil_printf("Interrupt Occur\n");
	(*((void(*)())(0x00)))();


}

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



	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XIntc_InterruptHandler, &intc);
	Xil_ExceptionEnable();


	XIntc_Connect(&intc, XPAR_INTC_0_WDTTB_0_VEC_ID, (XInterruptHandler)intcHandler, &wdt);

	XIntc_Enable(&intc, XPAR_INTC_0_WDTTB_0_VEC_ID);



	XIntc_Start(&intc, XIN_REAL_MODE);


}

void wdt_init(){

wdt_config = XWdtTb_LookupConfig(XPAR_AXI_TIMEBASE_WDT_0_DEVICE_ID);
int status = XWdtTb_CfgInitialize(&wdt, wdt_config, wdt_config->BaseAddr);

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


status = XWdtTb_SelfTest(&wdt);

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

}



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

    XWdtTb_Stop(&wdt);
    XWdtTb_Start(&wdt);

    while(1){
    }

    cleanup_platform();
    return 0;
}