338 lines
8.9 KiB
C++
338 lines
8.9 KiB
C++
|
|
#include <fstream>
|
|
#include <cstring>
|
|
#include <stdio.h>
|
|
#include "ap_utils.h"
|
|
#include <iostream>
|
|
#include "subPix.h"
|
|
#include "../../globals/tbGlobals.h"
|
|
|
|
Luma_frameInfo readParaFile(const char* file)
|
|
{
|
|
std::ifstream inputFile(file);
|
|
Luma_frameInfo frameInfo;
|
|
std::string strLineTxt;
|
|
|
|
int data;
|
|
getline(inputFile, strLineTxt); //XL
|
|
sscanf(strLineTxt.c_str(), "XL:%d", &data);
|
|
frameInfo.L = (uint16_t)data;
|
|
|
|
getline(inputFile, strLineTxt); //XR
|
|
|
|
getline(inputFile, strLineTxt); //TL
|
|
sscanf(strLineTxt.c_str(), "TL:%d", &data);
|
|
frameInfo.T = (uint16_t)data;
|
|
|
|
getline(inputFile, strLineTxt); //TR
|
|
|
|
getline(inputFile, strLineTxt); //W
|
|
sscanf(strLineTxt.c_str(), "W:%d", &data);
|
|
frameInfo.W = (uint16_t)data;
|
|
|
|
getline(inputFile, strLineTxt); //H
|
|
sscanf(strLineTxt.c_str(), "H:%d", &data);
|
|
frameInfo.H = (uint16_t)data;
|
|
|
|
getline(inputFile, strLineTxt); //FrmNO
|
|
sscanf(strLineTxt.c_str(), "FrmNO:%x", &data);
|
|
frameInfo.FrmNo = (uint32_t)data;
|
|
|
|
getline(inputFile, strLineTxt); //TimStp
|
|
sscanf(strLineTxt.c_str(), "TimStp:%x", &data);
|
|
frameInfo.TimeStamp = (uint32_t)data;
|
|
|
|
getline(inputFile, strLineTxt); //EncInfo
|
|
sscanf(strLineTxt.c_str(), "EncInfo:%x", &data);
|
|
frameInfo.encInfo = (uint32_t)data;
|
|
|
|
inputFile.close();
|
|
return frameInfo;
|
|
}
|
|
|
|
std::vector<Luma_convolveData> readConvolveDataFile(
|
|
const char* file){
|
|
std::ifstream inputFile(file);
|
|
|
|
std::string strLineTxt;
|
|
int size = 0;
|
|
std::vector<Luma_convolveData> testData;
|
|
Luma_convolveData a_line;
|
|
while(getline(inputFile, strLineTxt))
|
|
{
|
|
if (strLineTxt.empty())
|
|
continue;
|
|
|
|
if(0 == size)
|
|
{
|
|
int winRdx, y, Rid, Flag, pkValue;
|
|
sscanf(strLineTxt.c_str(), "%04x %04x %04x %01x %02x", &winRdx, &y, &Rid, &Flag, &pkValue);
|
|
a_line.WinRdx = (uint16_t)winRdx;
|
|
a_line.y = (uint16_t)y;
|
|
a_line.Rid = (uint16_t)Rid;
|
|
a_line.Flag = (uint8_t)Flag;
|
|
a_line.pkValue = (uint8_t)pkValue;
|
|
a_line.nD1 = 0;
|
|
a_line.nD2 = 0;
|
|
size = 1 ;
|
|
}
|
|
else //receive Data
|
|
{
|
|
int data;
|
|
sscanf(strLineTxt.c_str(), "%d", &data);
|
|
if(1 == size)
|
|
a_line.nD1 = data;
|
|
else if(2 == size)
|
|
a_line.nD2 = data;
|
|
|
|
if(size >= 2)
|
|
{
|
|
testData.push_back(a_line);
|
|
size = 0;
|
|
}
|
|
else
|
|
size ++;
|
|
}
|
|
|
|
}
|
|
inputFile.close();
|
|
return testData;
|
|
}
|
|
|
|
void genTestSream(
|
|
std::vector<Luma_convolveData>& convolveData,
|
|
hls::stream<RgnPixConvolve>& convolveStream,
|
|
const Luma_frameInfo framwInfo)
|
|
{
|
|
RgnPixConvolve VSync = {0,0,0,0,0,0,0, 0, 0};
|
|
ap_uint<32> data_32;
|
|
//1st:FrmNo
|
|
data_32 = framwInfo.FrmNo;
|
|
VSync.Sync = 0b10;
|
|
VSync.LazerWinX(11,0) = data_32.range(11,0);
|
|
VSync.LazerWinY(11,0) = data_32.range(23,12);
|
|
VSync.LazerWinRid(7,0) = data_32.range(31,24);
|
|
convolveStream.write(VSync);
|
|
//2nd:FrmNo
|
|
data_32 = framwInfo.TimeStamp;
|
|
VSync.Sync = 0b00;
|
|
VSync.LazerWinX(11,0) = data_32.range(11,0);
|
|
VSync.LazerWinY(11,0) = data_32.range(23,12);
|
|
VSync.LazerWinRid(7,0) = data_32.range(31,24);
|
|
convolveStream.write(VSync);
|
|
//3rd:encInfo
|
|
data_32 = framwInfo.encInfo;
|
|
VSync.Sync = 0b00;
|
|
VSync.LazerWinX(11,0) = data_32.range(11,0);
|
|
VSync.LazerWinY(11,0) = data_32.range(23,12);
|
|
VSync.LazerWinRid(7,0) = data_32.range(31,24);
|
|
convolveStream.write(VSync);
|
|
//4th:frmW(12bit), frmH(12bit)
|
|
ap_uint<16> data16_1, data16_2;
|
|
data16_1 = framwInfo.W;
|
|
data16_2 = framwInfo.H;
|
|
VSync.Sync = 0b00;
|
|
VSync.LazerWinX(11,0) = data16_1.range(11,0);
|
|
VSync.LazerWinY(11,0) = data16_2.range(11,0);
|
|
convolveStream.write(VSync);
|
|
//5th: frmX, WinNum
|
|
int winNum = (int)convolveData.size()+12;
|
|
data16_1 = framwInfo.L;
|
|
data16_2 = (uint16_t)winNum;
|
|
VSync.Sync = 0b00;
|
|
VSync.LazerWinX(11,0) = data16_1.range(11,0);
|
|
VSync.LazerWinY(11,0) = data16_2.range(11,0);
|
|
convolveStream.write(VSync);
|
|
//6th: frmY
|
|
data16_1 = framwInfo.T;
|
|
VSync.Sync = 0b00;
|
|
VSync.LazerWinX(11,0) = data16_1.range(11,0);
|
|
VSync.LazerWinY(11,0) = 0;
|
|
convolveStream.write(VSync);
|
|
//output data
|
|
for(int i = 0, i_max=(int)convolveData.size(); i < i_max; i ++)
|
|
{
|
|
Luma_convolveData* a_line = &convolveData[i];
|
|
RgnPixConvolve conData;
|
|
conData.LazerWinX = (ap_uint<12>)a_line->WinRdx;
|
|
conData.LazerWinY = (ap_uint<12>)a_line->y;
|
|
conData.LazerWinRid = (ap_uint<11>)a_line->Rid;
|
|
conData.LazerWinFlag = (ap_uint<4>)a_line->Flag;
|
|
conData.LazerWinRsv = 0;
|
|
conData.value = (ap_uint<8>)a_line->pkValue;
|
|
if(i == 0)
|
|
conData.Sync = 0b01;
|
|
else if(i == (i_max-1))
|
|
conData.Sync = 0b11;
|
|
else
|
|
conData.Sync = 0b00;
|
|
conData.nD1 = a_line->nD1;
|
|
conData.nD2 = a_line->nD2;
|
|
convolveStream.write(conData);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void convertSubpixStreamToArray(
|
|
hls::stream<RgnSubPix>& streamData,
|
|
std::vector<Luma_rgnSubpix>& arrayData,
|
|
uint32_t* FrmNo,
|
|
uint32_t* timeStamp,
|
|
uint32_t* encInfo,
|
|
uint16_t* frameROI_w,
|
|
uint16_t* frameROI_h,
|
|
uint16_t* frameROI_x,
|
|
uint16_t* frameROI_y)
|
|
{
|
|
//1st:FrmNo
|
|
RgnSubPix VSync = streamData.read();
|
|
UintFloat tmp;
|
|
tmp.fdata = VSync.x;
|
|
*FrmNo = (uint32_t)tmp.unData;
|
|
//2nd:timeStamp
|
|
VSync = streamData.read();
|
|
tmp.fdata = VSync.x;
|
|
*timeStamp = (uint32_t)tmp.unData;
|
|
//3rd:encInfo
|
|
VSync = streamData.read();
|
|
tmp.fdata = VSync.x;
|
|
*encInfo = (uint32_t)tmp.unData;
|
|
//4th:frmW(12bit), frmH(12bit)
|
|
VSync = streamData.read();
|
|
tmp.fdata = VSync.x;
|
|
*frameROI_w = tmp.unData & 0xfff;
|
|
*frameROI_h = (tmp.unData >> 12) & 0xfff;
|
|
//5th: frmX, WinNum
|
|
VSync = streamData.read();
|
|
tmp.fdata = VSync.x;
|
|
*frameROI_x = tmp.unData & 0xfff;
|
|
uint16_t winNum = (tmp.unData >> 12) & 0xfff;
|
|
//6th: frmY
|
|
VSync = streamData.read();
|
|
tmp.fdata = VSync.x;
|
|
*frameROI_y = tmp.unData & 0xfff;
|
|
//output data
|
|
for(int i = 0; i < winNum*2; i ++)
|
|
{
|
|
RgnSubPix data_in = streamData.read();
|
|
Luma_rgnSubpix a_pnt;
|
|
a_pnt.x = data_in.x;
|
|
a_pnt.y = (uint16_t)data_in.y;
|
|
a_pnt.Rid = (uint16_t)data_in.rid;
|
|
a_pnt.Flag = (uint8_t)data_in.flag;
|
|
a_pnt.pkValue = (uint8_t)data_in.value;
|
|
a_pnt.Sync = (uint8_t)data_in.Sync;
|
|
arrayData.push_back(a_pnt);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void writeSubpixData(
|
|
const char* fileName,
|
|
std::vector<Luma_rgnSubpix>& outData)
|
|
{
|
|
std::ofstream sw(fileName);
|
|
int i_max = outData.size();
|
|
for (int i = 0; i < i_max; i++)
|
|
{
|
|
char data[250];
|
|
#if defined(__linux__)
|
|
sprintf(data, "%.2f %04d %04d %01x %02d %01x",
|
|
outData[i].x, outData[i].y, outData[i].Rid, outData[i].Flag, outData[i].pkValue, outData[i].Sync);
|
|
#else
|
|
sprintf_s(data, "%.2f %04d %04d %01x %02d %01x",
|
|
outData[i].x, outData[i].y, outData[i].Rid, outData[i].Flag, outData[i].pkValue, outData[i].Sync);
|
|
#endif
|
|
sw << data << std::endl;
|
|
}
|
|
sw.close();
|
|
}
|
|
|
|
#define TST_GROUP 3
|
|
|
|
int main()
|
|
{
|
|
#if defined(__linux__)
|
|
const char* SrcDataPath[TST_GROUP] = {
|
|
"/home/zengHQ/CamTestData/testSample/PickRgn_C/PickRgn_Rslt/Txt/",
|
|
"/home/zengHQ/CamTestData/Grp_0/PickRgn_C/PickRgn_Rslt/Txt/",
|
|
"/home/zengHQ/CamTestData/Grp_1/PickRgn_C/PickRgn_Rslt/Txt/"
|
|
};
|
|
const char* InDataPath[TST_GROUP] = {
|
|
"/home/zengHQ/CamTestData/testSample/Convolve/",
|
|
"/home/zengHQ/CamTestData/Grp_0/Convolve/",
|
|
"/home/zengHQ/CamTestData/Grp_1/Convolve/",
|
|
};
|
|
const char* OutDataPath[TST_GROUP] = {
|
|
"/home/zengHQ/CamTestData/testSample/Subpix/",
|
|
"/home/zengHQ/CamTestData/Grp_0/Subpix/",
|
|
"/home/zengHQ/CamTestData/Grp_1/Subpix/",
|
|
};
|
|
#else
|
|
const char* SrcDataPath[TST_GROUP] = {
|
|
"E:/CamTestData/testSample/PickRgn_C/PickRgn_Rslt/Txt/",
|
|
"E:/CamTestData/Grp_0/PickRgn_C/PickRgn_Rslt/Txt/",
|
|
"E:/CamTestData/Grp_1/PickRgn_C/PickRgn_Rslt/Txt/"
|
|
};
|
|
const char* InDataPath[TST_GROUP] = {
|
|
"E:/CamTestData/testSample/Convolve/",
|
|
"E:/CamTestData/Grp_0/Convolve/",
|
|
"E:/CamTestData/Grp_1/Convolve/",
|
|
};
|
|
const char* OutDataPath[TST_GROUP] = {
|
|
"E:/CamTestData/testSample/Subpix/",
|
|
"E:/CamTestData/Grp_0/Subpix/",
|
|
"E:/CamTestData/Grp_1/Subpix/",
|
|
};
|
|
#endif
|
|
int testFileSize[TST_GROUP] = {1, 4, 4};
|
|
|
|
for(int n = 1; n < TST_GROUP; n ++)
|
|
{
|
|
|
|
int winSize = 0;
|
|
int fileSize = testFileSize[n];
|
|
for(int fi = 0; fi < fileSize; fi++)
|
|
{
|
|
char fileName[200];
|
|
char paraFileName[200];
|
|
char outFileName[200];
|
|
#if defined(__linux__)
|
|
sprintf(fileName, "%s%d_L_convolve.txt", InDataPath[n], fi);
|
|
sprintf(paraFileName, "%s%d_para_verilog.txt", SrcDataPath[n], fi);
|
|
sprintf(outFileName, "%s%d_L_subpix.txt", OutDataPath[n], fi);
|
|
#else
|
|
sprintf_s(fileName, "%s%d_L_convolve.txt", InDataPath[n], fi);
|
|
sprintf_s(paraFileName, "%s%d_para_verilog.txt", SrcDataPath[n], fi);
|
|
sprintf_s(outFileName, "%s%d_L_subpix.txt", OutDataPath[n], fi);
|
|
#endif
|
|
Luma_frameInfo framwInfo = readParaFile(paraFileName);
|
|
std::vector<Luma_convolveData> testData = readConvolveDataFile(fileName);
|
|
//gen test stream
|
|
hls::stream<RgnPixConvolve> inStream;
|
|
genTestSream(testData, inStream, framwInfo);
|
|
|
|
hls::stream<RgnSubPix> outStream;
|
|
subpix(inStream,outStream);
|
|
|
|
std::vector<Luma_rgnSubpix> outData;
|
|
uint32_t outFrmNo, outTimeStamp, outEncInfo;
|
|
uint16_t outROI_w,outROI_h, outROI_x,outROI_y;
|
|
convertSubpixStreamToArray(
|
|
outStream,
|
|
outData,
|
|
&outFrmNo,
|
|
&outTimeStamp,
|
|
&outEncInfo,
|
|
&outROI_w,
|
|
&outROI_h,
|
|
&outROI_x,
|
|
&outROI_y);
|
|
|
|
writeSubpixData(outFileName, outData);
|
|
}
|
|
}
|
|
printf("done!\n");
|
|
|
|
}
|