
#include "xparameters.h"
#include "xaxivdma.h"
#include "xvtc.h"
#include "xil_cache.h"
#include "../pic0.h"

int run_triple_frame_buffer(XAxiVdma* InstancePtr, int DeviceId, int hsize,
                int vsize, int buf_base_addr, int number_frame_count,
                int enable_frm_cnt_intr);

unsigned int srcBuffer = (XPAR_PS7_DDR_0_S_AXI_BASEADDR + 0x1000000);

void Vtc_Init(XVtc *Vtc_Inst)
{
        XVtc_Config *vtcConfig;
        vtcConfig = XVtc_LookupConfig(XPAR_VTC_0_DEVICE_ID);
        XVtc_CfgInitialize(Vtc_Inst, vtcConfig, vtcConfig->BaseAddress);
}

//ʾͼƬ
void Pic_Display(uint8_t *frame,const uint8_t *Pic)
{
        uint16_t width,height;
        uint16_t x_pos, y_pos;
        uint16_t x_max, y_max;
        uint32_t stride_mm = 0;
        uint32_t stride_pic = 8;
        uint16_t Cnt = 0;

        width = (Pic[2]<<8) + Pic[3];//ȡͼƬ
        height = (Pic[4]<<8) + Pic[5];//ȡͼƬ߶

        if(width < 800)
                x_max = width;
        else
                x_max = 800;

        if(height < 480)
                y_max = height;
        else
                y_max = 480;

        for(y_pos=0;y_pos<y_max;y_pos++)
        {
                for(x_pos=0;x_pos<x_max;x_pos++)
                {
                        frame[stride_mm + Cnt] =  Pic[stride_pic + Cnt];
                        frame[stride_mm + Cnt + 1] = Pic[stride_pic + Cnt + 1];
                        frame[stride_mm + Cnt + 2] = Pic[stride_pic + Cnt + 2];
                        Cnt+=3;
                }
                stride_mm += 800*3;
                stride_pic += width*3;
                Cnt = 0;
        }

        //ˢCacheͼ
        Xil_DCacheFlush();
}

int main(void)
{
        XAxiVdma Vdma_Inst;
        XVtc Vtc_Inst;

        //Buffer
        memset((uint8_t*)srcBuffer,0x00,800*480*3);

        run_triple_frame_buffer(&Vdma_Inst, 0, 800, 480,srcBuffer, 0, 0);

        Vtc_Init(&Vtc_Inst);

        XVtc_EnableGenerator(&Vtc_Inst);

        Pic_Display((uint8_t*)srcBuffer,gImage_pic0);

        return 0;
}

