#include "system.h"
#include "test.h"
// ***** macro definition *****

// Driver instance
XGpioPs gpio;
XScuGic gic;
XAxiDma dma;
XUartPs uart;

u8 uartRecvBuf[70];

volatile bool txDataReqIntr = 0;
volatile bool rxDataRecIntr = 0;

int main(void)
{
    LOG_BLANK_LINE;
    LOG_BLANK_LINE;
    Xil_DCacheDisable();
    xil_printf(INFO_MSG("Program Compile Date: %s"), __DATE__);
    int32_t status;

    // Init system
    status = InitSystem();
    CHECK_STATUS(status, ERROR_MSG("system init fail"));
    sleep(3);
    for(int i = 0;i<10;i++)

    {
    	UdpSendData((uint8_t*)&txMacFrame, 100);
        xemacif_input(netif);
    }
    sleep(3);
    for(int i = 0;i<10;i++)
    {
    	UdpSendData((uint8_t*)&txMacFrame, 100);
        xemacif_input(netif);
    }
    sleep(3);
    for(int i = 0;i<10;i++)
    {
    	UdpSendData((uint8_t*)&txMacFrame, 100);
        xemacif_input(netif);
    }
    sleep(3);
    for(int i = 0;i<10;i++)
    {
    	UdpSendData((uint8_t*)&txMacFrame, 100);
        xemacif_input(netif);
    }
    while (true)
    {
        // push stack !!! this can't be delete, and must be in the while loop
        xemacif_input(netif);

        // handle event
        if (txDataReqIntr)
        {
            // approximately 28us 1400 period of the 50MHz clock
            MakeMacFrame(&txMacFrame, macSendQueue);
//            Xil_DCacheFlush();
            status = XAxiDma_SimpleTransfer(&dma, (UINTPTR)&txMacFrame, MAC_FRAME_LEN, XAXIDMA_DMA_TO_DEVICE);
            CHECK_STATUS(status, "DMA Transfer start fail");
            txDataReqIntr = false;
        }
        if(rxDataRecIntr)
        {
            status = XAxiDma_SimpleTransfer(&dma, (UINTPTR)&rxMacFrame, MAC_FRAME_LEN, XAXIDMA_DEVICE_TO_DMA);
            CHECK_STATUS(status, "DMA Transfer start fail");
            usleep(100);
//            Xil_DCacheFlush();
        	ParseMacFrame(&rxMacFrame);
        	rxDataRecIntr = false;
        }
    }

    return 0;
}



