#include "convolve.h" #include "stdlib.h" void convolve( std::vector &InRgnPnt, std::vector &OutConvolvePnt) { //ap_uint<32> frmNo=0; //ap_uint<32> timeStamp=0; //ap_uint<32> encInfo=0; //ap_uint<16> frmW=0, frmH=0, frmX=0, frmY=0; ushort WinNum = 0; RgnPix InData; int readPtr = 0; InData = InRgnPnt[readPtr ++]; uchar VSync = InData.Sync &0x02; if(0 == VSync) //wait for syncFirst return; RgnPixConvolve outData = {0,0,0,0,0,0, 0, 0, 0}; //1st: frameNo outData.Sync = InData.Sync; outData.LazerWinFlag = InData.LazerWinFlag; outData.LazerWinRsv = 0; outData.LazerWinX = InData.LazerWinX; outData.LazerWinY = InData.LazerWinY; outData.LazerWinRid = InData.LazerWinRid; OutConvolvePnt.push_back(outData); //2nd: timeStamp InData = InRgnPnt[readPtr++]; outData.Sync = InData.Sync; outData.LazerWinFlag = InData.LazerWinFlag; outData.LazerWinRsv = 0; outData.LazerWinX = InData.LazerWinX; outData.LazerWinY = InData.LazerWinY; outData.LazerWinRid = InData.LazerWinRid; OutConvolvePnt.push_back(outData); //3rd:encInfo InData = InRgnPnt[readPtr++]; outData.Sync = InData.Sync; outData.LazerWinFlag = InData.LazerWinFlag; outData.LazerWinRsv = 0; outData.LazerWinX = InData.LazerWinX; outData.LazerWinY = InData.LazerWinY; outData.LazerWinRid = InData.LazerWinRid; OutConvolvePnt.push_back(outData); //4th: frmW, frmH InData = InRgnPnt[readPtr++]; outData.Sync = InData.Sync; outData.LazerWinFlag = InData.LazerWinFlag; outData.LazerWinRsv = 0; outData.LazerWinX = InData.LazerWinX; outData.LazerWinY = InData.LazerWinY; outData.LazerWinRid = InData.LazerWinRid; OutConvolvePnt.push_back(outData); //5th: frmX, WinNum InData = InRgnPnt[readPtr++]; outData.Sync = InData.Sync; outData.LazerWinFlag = InData.LazerWinFlag; outData.LazerWinRsv = 0; outData.LazerWinX = InData.LazerWinX; outData.LazerWinY = InData.LazerWinY; outData.LazerWinRid = InData.LazerWinRid; WinNum = InData.LazerWinY; OutConvolvePnt.push_back(outData); //6th: frmY InData = InRgnPnt[readPtr++]; outData.LazerWinFlag = InData.LazerWinFlag; outData.LazerWinRsv = 0; outData.LazerWinX = InData.LazerWinX; outData.LazerWinY = InData.LazerWinY; outData.LazerWinRid = InData.LazerWinRid; OutConvolvePnt.push_back(outData); int nD1 = 0; int nD2 = 0; RgnPix HSyncData_d1 = {0,0,0,0,0,0,0}; uchar peakValue = 0; for(int n = 0; n < WinNum; n ++) { #pragma HLS LOOP_TRIPCOUNT min=3072 max=3072 for(int i = 0; i <= 8; i ++) { #pragma HLS PIPELINE II=1 RgnPix InData = InRgnPnt[readPtr++]; if(0 == i) //HSync { //compute pre-line subpix; output if(n > 0) { RgnPixConvolve a_pnt; if(n == 1) a_pnt.Sync = 0b01; else a_pnt.Sync = 0b00; a_pnt.LazerWinX = HSyncData_d1.LazerWinX; a_pnt.LazerWinY = HSyncData_d1.LazerWinY; a_pnt.LazerWinRid = HSyncData_d1.LazerWinRid; a_pnt.LazerWinFlag = HSyncData_d1.LazerWinFlag; a_pnt.LazerWinRsv = 0; a_pnt.value = peakValue; a_pnt.nD1 = nD1; a_pnt.nD2 = nD2; OutConvolvePnt.push_back(a_pnt); } nD1 = 0; nD2 = 0; HSyncData_d1 = InData; } else//for(int i = 0; i < 8; i ++) { uchar data_0 = InData.LazerWinX; uchar data_1 = InData.LazerWinY; if(i == 5) peakValue = data_0; uchar rdPos_0 = i * 2 - 2; uchar rdPos_1 = i * 2 - 1; int d_0 = (int)data_0; int d_1 = (int)data_1; nD1 += d_0 * mask_1st[rdPos_0] + d_1 * mask_1st[rdPos_1]; nD2 += d_0 * mask_2nd[rdPos_0] + d_1 * mask_2nd[rdPos_1]; } } } //send out last one if(WinNum > 0) { RgnPixConvolve a_pnt; a_pnt.Sync = 0b00; a_pnt.LazerWinX = HSyncData_d1.LazerWinX; a_pnt.LazerWinY = HSyncData_d1.LazerWinY; a_pnt.LazerWinRid = HSyncData_d1.LazerWinRid; a_pnt.LazerWinFlag = HSyncData_d1.LazerWinFlag; a_pnt.LazerWinRsv = 0; a_pnt.value = peakValue; a_pnt.nD1 = nD1; a_pnt.nD2 = nD2; OutConvolvePnt.push_back(a_pnt); } return; }