peakCentering bug: if a line is invalid, HSync is disabled, but data still output

This commit is contained in:
zengHQ 2025-11-23 17:40:08 +08:00
parent 1b7c1750f2
commit 8c780c8867
2 changed files with 79 additions and 44 deletions

View File

@ -86,6 +86,7 @@ void peakCentering(
ap_uint<2> SM = 0b00; ap_uint<2> SM = 0b00;
ap_uint<1> evenFlag = 0; ap_uint<1> evenFlag = 0;
ap_uint<5> pkRng_S, pkRng_E; ap_uint<5> pkRng_S, pkRng_E;
ap_uint<1> outFlag = 0;
for(int n = 0; n <= WinNum; n ++) for(int n = 0; n <= WinNum; n ++)
{ {
#pragma HLS LOOP_TRIPCOUNT min=3072 max=3072 #pragma HLS LOOP_TRIPCOUNT min=3072 max=3072
@ -99,6 +100,9 @@ void peakCentering(
else else
InData = zeroData; InData = zeroData;
if(InData.LazerWinY == 0x07ac)
int kkk = 1; //debug point
if(0 == i) //HSync if(0 == i) //HSync
{ {
evenFlag = n%2; evenFlag = n%2;
@ -109,7 +113,13 @@ void peakCentering(
HSyncData_d1.LazerWinX = LazerWinX_d1 + pkCenter; HSyncData_d1.LazerWinX = LazerWinX_d1 + pkCenter;
if ((n > 0) &&( linePk.len>0)) if ((n > 0) &&( linePk.len>0))
{
OutCenteringPnt.write(HSyncData_d1); OutCenteringPnt.write(HSyncData_d1);
outFlag = 1;
}
else
outFlag = 0;
HSyncData_d1 = InData; HSyncData_d1 = InData;
LazerWinX_d1 = InData.LazerWinX - RGN_DATA_WIN_SIZE; LazerWinX_d1 = InData.LazerWinX - RGN_DATA_WIN_SIZE;
@ -280,7 +290,7 @@ void peakCentering(
stmOut.Sync = 0b00; stmOut.Sync = 0b00;
stmOut.LazerWinX(7,0) = out_0; stmOut.LazerWinX(7,0) = out_0;
stmOut.LazerWinY(7,0) = out_1; stmOut.LazerWinY(7,0) = out_1;
if( (n > 0 ) && (pkCenter > 0) ) if( (n > 0 ) && (pkCenter > 0) &&(outFlag == 1))
{ {
OutCenteringPnt.write(stmOut); OutCenteringPnt.write(stmOut);
} }

View File

@ -18,17 +18,17 @@ void save_bmp_2(
fopen_s(&file, filename, "wb"); fopen_s(&file, filename, "wb");
#endif #endif
if (!file) { if (!file) {
printf("无法打开文件 %s\n", filename); printf("<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> %s\n", filename);
return; return;
} }
// 计算每行填充字节数 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
int bytes_per_row = RGN_DATA_WIN_SIZE * 3; // 每个像素3字节BGR int bytes_per_row = RGN_DATA_WIN_SIZE * 3; // ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD>ֽڣ<EFBFBD>BGR<EFBFBD><EFBFBD>
int padding = (4 - (bytes_per_row % 4)) % 4; int padding = (4 - (bytes_per_row % 4)) % 4;
int row_size = bytes_per_row + padding; int row_size = bytes_per_row + padding;
int height = testSamples.size(); int height = testSamples.size();
// 初始化文件头 // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ͷ
BMPFileHeader file_header = { BMPFileHeader file_header = {
.file_type = 0x4D42, // 'BM' .file_type = 0x4D42, // 'BM'
.file_size = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + row_size * height, .file_size = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) + row_size * height,
@ -36,11 +36,11 @@ void save_bmp_2(
.reserved2 = 0, .reserved2 = 0,
.offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) .offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader)
}; };
// 初始化信息头 // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣͷ
BMPInfoHeader info_header = { BMPInfoHeader info_header = {
.size = sizeof(BMPInfoHeader), .size = sizeof(BMPInfoHeader),
.width = RGN_DATA_WIN_SIZE, .width = RGN_DATA_WIN_SIZE,
.height = height, // 正数表示像素数据从下到上排列 .height = height, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.planes = 1, .planes = 1,
.bit_count = 24, .bit_count = 24,
.compression = 0, .compression = 0,
@ -51,21 +51,21 @@ void save_bmp_2(
.colors_important = 0 .colors_important = 0
}; };
// 写入头信息 // д<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>Ϣ
fwrite(&file_header, 1, sizeof(BMPFileHeader), file); fwrite(&file_header, 1, sizeof(BMPFileHeader), file);
fwrite(&info_header, 1, sizeof(BMPInfoHeader), file); fwrite(&info_header, 1, sizeof(BMPInfoHeader), file);
// 写入像素数据(从最后一行开始) // д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>п<EFBFBD>ʼ<EFBFBD><EFBFBD>
uint8_t padding_bytes[3] = { 0, 0, 0 }; uint8_t padding_bytes[3] = { 0, 0, 0 };
for (int y = height - 1; y >= 0; y--) { for (int y = height - 1; y >= 0; y--) {
for (int x = 0; x < RGN_DATA_WIN_SIZE; x++) { for (int x = 0; x < RGN_DATA_WIN_SIZE; x++) {
uint8_t pixel = (uint8_t)testSamples[y].data[x]; uint8_t pixel = (uint8_t)testSamples[y].data[x];
// 将RGB转为BGR顺序 // <EFBFBD><EFBFBD>RGBתΪBGR˳<EFBFBD><EFBFBD>
fputc(pixel, file); // B fputc(pixel, file); // B
fputc(pixel, file); // G fputc(pixel, file); // G
fputc(pixel, file); // R fputc(pixel, file); // R
} }
fwrite(padding_bytes, 1, padding, file); // 填充 fwrite(padding_bytes, 1, padding, file); // <EFBFBD><EFBFBD><EFBFBD>
} }
fclose(file); fclose(file);
@ -263,6 +263,9 @@ void convertStreamToArray(
Luma_rgnData a_line; Luma_rgnData a_line;
a_line.WinRdx = (uint16_t)Hsync.LazerWinX; a_line.WinRdx = (uint16_t)Hsync.LazerWinX;
a_line.y = (uint16_t)Hsync.LazerWinY; a_line.y = (uint16_t)Hsync.LazerWinY;
if(a_line.y >= 1963)
int kkk = 1; //debug point
a_line.Rid = (uint16_t)Hsync.LazerWinRid; a_line.Rid = (uint16_t)Hsync.LazerWinRid;
a_line.Flag = (uint8_t)Hsync.LazerWinFlag; a_line.Flag = (uint8_t)Hsync.LazerWinFlag;
a_line.PeakRltvRdx = (uint8_t)Hsync.RltvRdx; a_line.PeakRltvRdx = (uint8_t)Hsync.RltvRdx;
@ -319,59 +322,81 @@ void writepeakCenteringData(
#define TST_GROUP 1 #define TST_GROUP 3
int main() int main()
{ {
#if defined(__linux__) #if defined(__linux__)
const char* InDataPath[TST_GROUP] = { const char* InDataPath[TST_GROUP] = {
"/home/zengHQ/CamTestData/testSample/RgnPixData/testData.txt" "/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* OutDataPath[TST_GROUP] = { const char* OutDataPath[TST_GROUP] = {
"/home/zengHQ/CamTestData/testSample/PkCentering/testData.txt" "/home/zengHQ/CamTestData/testSample/PkCentering/",
"/home/zengHQ/CamTestData/Grp_0/PkCentering/",
"/home/zengHQ/CamTestData/Grp_1/PkCentering/",
}; };
#else #else
const char* InDataPath[TST_GROUP] = { const char* InDataPath[TST_GROUP] = {
"E:/CamTestData/testSample/RgnPixData/testData.txt" "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* OutDataPath[TST_GROUP] = { const char* OutDataPath[TST_GROUP] = {
"E:/CamTestData/testSample/PkCentering/testData.txt" "E:/CamTestData/testSample/PkCentering/",
"E:/CamTestData/Grp_0/PkCentering/",
"E:/CamTestData/Grp_1/PkCentering/",
}; };
#endif #endif
int testFileSize[TST_GROUP] = {1, 4, 4};
for(int n = 0; n < TST_GROUP; n ++) for(int n = 1; n < TST_GROUP; n ++)
{ {
int winSize = 0; int winSize = 0;
std::vector<Luma_rgnData> testData = readTestFile(InDataPath[n], &winSize); int fileSize = testFileSize[n];
//gen test stream for(int fi = 0; fi < fileSize; fi++)
hls::stream<RgnPix> inStream; {
uint32_t FrmNo = 0x1; char fileName[200];
uint32_t timeStamp = 0x2; char outFileName[200];
uint32_t encInfo = 0x3; #if defined(__linux__)
uint16_t frameROI_w = 0x100; sprintf(fileName, "%s%d_L_verilog.txt", InDataPath[n], fi);
uint16_t frameROI_h = 2048; sprintf(outFileName, "%s%d_L_pkCenter.txt", OutDataPath[n], fi);
uint16_t frameROI_x = 0; #else
uint16_t frameROI_y = 0; sprintf_s(fileName, "%s%d_L_verilog.txt", InDataPath[n], fi);
genTestSream(testData, inStream, FrmNo, timeStamp, encInfo, frameROI_w, frameROI_h, frameROI_x, frameROI_y); sprintf_s(outFileName, "%s%d_L_pkCenter.txt", OutDataPath[n], fi);
#endif
std::vector<Luma_rgnData> testData = readTestFile(fileName, &winSize);
//gen test stream
hls::stream<RgnPix> inStream;
uint32_t FrmNo = 0x1;
uint32_t timeStamp = 0x2;
uint32_t encInfo = 0x3;
uint16_t frameROI_w = 0x100;
uint16_t frameROI_h = 2048;
uint16_t frameROI_x = 0;
uint16_t frameROI_y = 0;
genTestSream(testData, inStream, FrmNo, timeStamp, encInfo, frameROI_w, frameROI_h, frameROI_x, frameROI_y);
hls::stream<RgnPix> outStream; hls::stream<RgnPix> outStream;
peakCentering(inStream,outStream); peakCentering(inStream,outStream);
std::vector<Luma_rgnData> outData; std::vector<Luma_rgnData> outData;
uint32_t outFrmNo, outTimeStamp, outEncInfo; uint32_t outFrmNo, outTimeStamp, outEncInfo;
uint16_t outROI_w,outROI_h, outROI_x,outROI_y; uint16_t outROI_w,outROI_h, outROI_x,outROI_y;
convertStreamToArray( convertStreamToArray(
outStream, outStream,
outData, outData,
&outFrmNo, &outFrmNo,
&outTimeStamp, &outTimeStamp,
&outEncInfo, &outEncInfo,
&outROI_w, &outROI_w,
&outROI_h, &outROI_h,
&outROI_x, &outROI_x,
&outROI_y); &outROI_y);
writepeakCenteringData(OutDataPath[n], outData); writepeakCenteringData(outFileName, outData);
}
} }
printf("done!\n"); printf("done!\n");