2025-08-16 15:25:29 +08:00

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;
}