#ifndef __SYSTEM_H__
#define __SYSTEM_H__
// Platform includes
#include "xparameters.h"
#include "xparameters_ps.h"
#include "xplatform_info.h"
#include "xil_exception.h"
#include "xscugic.h"
#include "xgpiops.h"
#include "xuartps.h"
#include "xil_printf.h"
#include "xtime_l.h"
// ADI Drivers
#include "driver/ad9361_driver/app_config.h"
#include "driver/ad9361_driver/dev_profile/dev_profile.h"
#include "driver/ad9361_config.h"
// PL IP includes
#include "xaxidma.h"
#include "log.h"
#include "sleep.h"
#include "phy_control.h"
#include "mac.h"
#include "eth.h"
#include "xil_cache.h"
#include "crc16.h"
#include "queue.h"
#include "xqspips.h"
#include "flash.h"
//******  Definition ******


//#define SIMULATION


#define SCUGIC_DEVICE_ID XPAR_SCUGIC_0_DEVICE_ID
#define UART_DEVICE_ID XPAR_XUARTPS_0_DEVICE_ID
#define AXIDMA_DEVICE_ID XPAR_AXIDMA_0_DEVICE_ID
#define GPIOPS_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
#define QSPI_DEVICE_ID XPAR_XQSPIPS_0_DEVICE_ID

#define UART_INTR_ID XPAR_XUARTPS_0_INTR
#define DMA_MM2S_INTR_ID XPAR_FABRIC_AXI_DMA_0_MM2S_INTROUT_INTR
#define DMA_S2MM_INTR_ID XPAR_FABRIC_AXI_DMA_0_S2MM_INTROUT_INTR
#define PL_TX_INTR_ID 63U
#define PL_RX_INTR_ID 64U
#define MANUAL_TRIGGER_INTR_ID 62

#define PHY_FRAME_BYTE 7168
#define FRAME_LEN_BIT 107520
#define FRAME_LEN_BYTE (13440)

extern XScuGic gic;
extern XAxiDma dma;
extern XGpioPs gpio;
extern XUartPs uart;
extern XQspiPs qspi;
extern u8 uartRecvBuf[70];
extern uint8_t berBuffer[FRAME_LEN_BYTE];


extern volatile bool txDataReqIntr;
extern volatile bool rxDataRecIntr;
extern volatile bool recvDone;
extern volatile bool transDone;


extern XTime curTime, preTime;
extern bool badFrames;

int InitSystem();

int InitGpioPs(XGpioPs* gpioPtr, u16 DeviceID);

int InitUart(XUartPs* uartPtr, XScuGic* gicPtr, u16 deviceID, u32 intrID);

int InitIntrSystem(XScuGic* gicPtr, u16 deviceId);

int InitManualTrigger(XScuGic* gicPtr, u32 intrId, Xil_InterruptHandler handler);

int InitAxiDma(XAxiDma* dmaPtr, u16 deviceId);

int SetupDmaIntr(XScuGic* gicPtr, XAxiDma* dmaPtr, Xil_InterruptHandler mm2s_handler,Xil_InterruptHandler s2mm_handler);

void UartHandler(void* callBack);

void DmaTxHandler(void* callback);

void DmaRxHandler(void* Callback);

void ManualTriggerHandler(void* callback);

void TestReconfiguration();

void InitBerTest();

#endif
