144 lines
3.9 KiB
C++
144 lines
3.9 KiB
C++
#include "convolve.h"
|
|
#include "stdlib.h"
|
|
|
|
void convolve(
|
|
std::vector<RgnPix> &InRgnPnt,
|
|
std::vector<RgnPixConvolve> &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;
|
|
}
|